Add MCF (1000 Cubic Feet) as an alternate unit of measure for volume (#150015)

pull/151660/head
Mike Kelly 2025-09-04 02:29:37 -04:00 committed by GitHub
parent ed134e22f9
commit 1cca65b5c5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 61 additions and 16 deletions

View File

@ -48,6 +48,7 @@ VALID_ENERGY_UNITS_GAS = {
UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_FEET,
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
UnitOfVolume.LITERS, UnitOfVolume.LITERS,
UnitOfVolume.MILLE_CUBIC_FEET,
*VALID_ENERGY_UNITS, *VALID_ENERGY_UNITS,
} }
VALID_VOLUME_UNITS_WATER: set[str] = { VALID_VOLUME_UNITS_WATER: set[str] = {
@ -56,6 +57,7 @@ VALID_VOLUME_UNITS_WATER: set[str] = {
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
UnitOfVolume.GALLONS, UnitOfVolume.GALLONS,
UnitOfVolume.LITERS, UnitOfVolume.LITERS,
UnitOfVolume.MILLE_CUBIC_FEET,
} }
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)

View File

@ -42,6 +42,7 @@ GAS_USAGE_UNITS: dict[str, tuple[UnitOfEnergy | UnitOfVolume, ...]] = {
UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_FEET,
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
UnitOfVolume.LITERS, UnitOfVolume.LITERS,
UnitOfVolume.MILLE_CUBIC_FEET,
), ),
} }
GAS_PRICE_UNITS = tuple( GAS_PRICE_UNITS = tuple(
@ -57,6 +58,7 @@ WATER_USAGE_UNITS: dict[str, tuple[UnitOfVolume, ...]] = {
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
UnitOfVolume.GALLONS, UnitOfVolume.GALLONS,
UnitOfVolume.LITERS, UnitOfVolume.LITERS,
UnitOfVolume.MILLE_CUBIC_FEET,
), ),
} }
WATER_PRICE_UNITS = tuple( WATER_PRICE_UNITS = tuple(

View File

@ -207,7 +207,7 @@ class NumberDeviceClass(StrEnum):
Unit of measurement: Unit of measurement:
- SI / metric: `L`, `` - SI / metric: `L`, ``
- USCS / imperial: `ft³`, `CCF` - USCS / imperial: `ft³`, `CCF`, `MCF`
""" """
HUMIDITY = "humidity" HUMIDITY = "humidity"
@ -398,7 +398,7 @@ class NumberDeviceClass(StrEnum):
Unit of measurement: `VOLUME_*` units Unit of measurement: `VOLUME_*` units
- SI / metric: `mL`, `L`, `` - SI / metric: `mL`, `L`, ``
- USCS / imperial: `ft³`, `CCF`, `fl. oz.`, `gal` (warning: volumes expressed in - USCS / imperial: `ft³`, `CCF`, `MCF`, `fl. oz.`, `gal` (warning: volumes expressed in
USCS/imperial units are currently assumed to be US volumes) USCS/imperial units are currently assumed to be US volumes)
""" """
@ -410,7 +410,7 @@ class NumberDeviceClass(StrEnum):
Unit of measurement: `VOLUME_*` units Unit of measurement: `VOLUME_*` units
- SI / metric: `mL`, `L`, `` - SI / metric: `mL`, `L`, ``
- USCS / imperial: `ft³`, `CCF`, `fl. oz.`, `gal` (warning: volumes expressed in - USCS / imperial: `ft³`, `CCF`, `MCF`, `fl. oz.`, `gal` (warning: volumes expressed in
USCS/imperial units are currently assumed to be US volumes) USCS/imperial units are currently assumed to be US volumes)
""" """
@ -427,7 +427,7 @@ class NumberDeviceClass(StrEnum):
Unit of measurement: Unit of measurement:
- SI / metric: ``, `L` - SI / metric: ``, `L`
- USCS / imperial: `ft³`, `CCF`, `gal` (warning: volumes expressed in - USCS / imperial: `ft³`, `CCF`, `MCF`, `gal` (warning: volumes expressed in
USCS/imperial units are currently assumed to be US volumes) USCS/imperial units are currently assumed to be US volumes)
""" """
@ -493,6 +493,7 @@ DEVICE_CLASS_UNITS: dict[NumberDeviceClass, set[type[StrEnum] | str | None]] = {
UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_FEET,
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
UnitOfVolume.LITERS, UnitOfVolume.LITERS,
UnitOfVolume.MILLE_CUBIC_FEET,
}, },
NumberDeviceClass.HUMIDITY: {PERCENTAGE}, NumberDeviceClass.HUMIDITY: {PERCENTAGE},
NumberDeviceClass.ILLUMINANCE: {LIGHT_LUX}, NumberDeviceClass.ILLUMINANCE: {LIGHT_LUX},
@ -546,6 +547,7 @@ DEVICE_CLASS_UNITS: dict[NumberDeviceClass, set[type[StrEnum] | str | None]] = {
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
UnitOfVolume.GALLONS, UnitOfVolume.GALLONS,
UnitOfVolume.LITERS, UnitOfVolume.LITERS,
UnitOfVolume.MILLE_CUBIC_FEET,
}, },
NumberDeviceClass.WEIGHT: set(UnitOfMass), NumberDeviceClass.WEIGHT: set(UnitOfMass),
NumberDeviceClass.WIND_DIRECTION: {DEGREE}, NumberDeviceClass.WIND_DIRECTION: {DEGREE},

View File

@ -240,7 +240,7 @@ class SensorDeviceClass(StrEnum):
Unit of measurement: Unit of measurement:
- SI / metric: `L`, `` - SI / metric: `L`, ``
- USCS / imperial: `ft³`, `CCF` - USCS / imperial: `ft³`, `CCF`, `MCF`
""" """
HUMIDITY = "humidity" HUMIDITY = "humidity"
@ -432,7 +432,7 @@ class SensorDeviceClass(StrEnum):
Unit of measurement: `VOLUME_*` units Unit of measurement: `VOLUME_*` units
- SI / metric: `mL`, `L`, `` - SI / metric: `mL`, `L`, ``
- USCS / imperial: `ft³`, `CCF`, `fl. oz.`, `gal` (warning: volumes expressed in - USCS / imperial: `ft³`, `CCF`, `MCF`, `fl. oz.`, `gal` (warning: volumes expressed in
USCS/imperial units are currently assumed to be US volumes) USCS/imperial units are currently assumed to be US volumes)
""" """
@ -444,7 +444,7 @@ class SensorDeviceClass(StrEnum):
Unit of measurement: `VOLUME_*` units Unit of measurement: `VOLUME_*` units
- SI / metric: `mL`, `L`, `` - SI / metric: `mL`, `L`, ``
- USCS / imperial: `ft³`, `CCF`, `fl. oz.`, `gal` (warning: volumes expressed in - USCS / imperial: `ft³`, `CCF`, `MCF`, `fl. oz.`, `gal` (warning: volumes expressed in
USCS/imperial units are currently assumed to be US volumes) USCS/imperial units are currently assumed to be US volumes)
""" """
@ -461,7 +461,7 @@ class SensorDeviceClass(StrEnum):
Unit of measurement: Unit of measurement:
- SI / metric: ``, `L` - SI / metric: ``, `L`
- USCS / imperial: `ft³`, `CCF`, `gal` (warning: volumes expressed in - USCS / imperial: `ft³`, `CCF`, `MCF`, `gal` (warning: volumes expressed in
USCS/imperial units are currently assumed to be US volumes) USCS/imperial units are currently assumed to be US volumes)
""" """
@ -601,6 +601,7 @@ DEVICE_CLASS_UNITS: dict[SensorDeviceClass, set[type[StrEnum] | str | None]] = {
UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_FEET,
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
UnitOfVolume.LITERS, UnitOfVolume.LITERS,
UnitOfVolume.MILLE_CUBIC_FEET,
}, },
SensorDeviceClass.HUMIDITY: {PERCENTAGE}, SensorDeviceClass.HUMIDITY: {PERCENTAGE},
SensorDeviceClass.ILLUMINANCE: {LIGHT_LUX}, SensorDeviceClass.ILLUMINANCE: {LIGHT_LUX},
@ -654,6 +655,7 @@ DEVICE_CLASS_UNITS: dict[SensorDeviceClass, set[type[StrEnum] | str | None]] = {
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
UnitOfVolume.GALLONS, UnitOfVolume.GALLONS,
UnitOfVolume.LITERS, UnitOfVolume.LITERS,
UnitOfVolume.MILLE_CUBIC_FEET,
}, },
SensorDeviceClass.WEIGHT: set(UnitOfMass), SensorDeviceClass.WEIGHT: set(UnitOfMass),
SensorDeviceClass.WIND_DIRECTION: {DEGREE}, SensorDeviceClass.WIND_DIRECTION: {DEGREE},

View File

@ -766,6 +766,7 @@ class UnitOfVolume(StrEnum):
CUBIC_FEET = "ft³" CUBIC_FEET = "ft³"
CENTUM_CUBIC_FEET = "CCF" CENTUM_CUBIC_FEET = "CCF"
MILLE_CUBIC_FEET = "MCF"
CUBIC_METERS = "" CUBIC_METERS = ""
LITERS = "L" LITERS = "L"
MILLILITERS = "mL" MILLILITERS = "mL"

View File

@ -752,6 +752,7 @@ class VolumeConverter(BaseUnitConverter):
UnitOfVolume.CUBIC_METERS: 1, UnitOfVolume.CUBIC_METERS: 1,
UnitOfVolume.CUBIC_FEET: 1 / _CUBIC_FOOT_TO_CUBIC_METER, UnitOfVolume.CUBIC_FEET: 1 / _CUBIC_FOOT_TO_CUBIC_METER,
UnitOfVolume.CENTUM_CUBIC_FEET: 1 / (100 * _CUBIC_FOOT_TO_CUBIC_METER), UnitOfVolume.CENTUM_CUBIC_FEET: 1 / (100 * _CUBIC_FOOT_TO_CUBIC_METER),
UnitOfVolume.MILLE_CUBIC_FEET: 1 / (1000 * _CUBIC_FOOT_TO_CUBIC_METER),
} }
VALID_UNITS = { VALID_UNITS = {
UnitOfVolume.LITERS, UnitOfVolume.LITERS,
@ -761,6 +762,7 @@ class VolumeConverter(BaseUnitConverter):
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_FEET,
UnitOfVolume.CENTUM_CUBIC_FEET, UnitOfVolume.CENTUM_CUBIC_FEET,
UnitOfVolume.MILLE_CUBIC_FEET,
} }

View File

@ -281,6 +281,7 @@ METRIC_SYSTEM = UnitSystem(
# Convert non-metric volumes of gas meters # Convert non-metric volumes of gas meters
("gas", UnitOfVolume.CENTUM_CUBIC_FEET): UnitOfVolume.CUBIC_METERS, ("gas", UnitOfVolume.CENTUM_CUBIC_FEET): UnitOfVolume.CUBIC_METERS,
("gas", UnitOfVolume.CUBIC_FEET): UnitOfVolume.CUBIC_METERS, ("gas", UnitOfVolume.CUBIC_FEET): UnitOfVolume.CUBIC_METERS,
("gas", UnitOfVolume.MILLE_CUBIC_FEET): UnitOfVolume.CUBIC_METERS,
# Convert non-metric precipitation # Convert non-metric precipitation
("precipitation", UnitOfLength.INCHES): UnitOfLength.MILLIMETERS, ("precipitation", UnitOfLength.INCHES): UnitOfLength.MILLIMETERS,
# Convert non-metric precipitation intensity # Convert non-metric precipitation intensity
@ -312,10 +313,12 @@ METRIC_SYSTEM = UnitSystem(
("volume", UnitOfVolume.CUBIC_FEET): UnitOfVolume.CUBIC_METERS, ("volume", UnitOfVolume.CUBIC_FEET): UnitOfVolume.CUBIC_METERS,
("volume", UnitOfVolume.FLUID_OUNCES): UnitOfVolume.MILLILITERS, ("volume", UnitOfVolume.FLUID_OUNCES): UnitOfVolume.MILLILITERS,
("volume", UnitOfVolume.GALLONS): UnitOfVolume.LITERS, ("volume", UnitOfVolume.GALLONS): UnitOfVolume.LITERS,
("volume", UnitOfVolume.MILLE_CUBIC_FEET): UnitOfVolume.CUBIC_METERS,
# Convert non-metric volumes of water meters # Convert non-metric volumes of water meters
("water", UnitOfVolume.CENTUM_CUBIC_FEET): UnitOfVolume.CUBIC_METERS, ("water", UnitOfVolume.CENTUM_CUBIC_FEET): UnitOfVolume.CUBIC_METERS,
("water", UnitOfVolume.CUBIC_FEET): UnitOfVolume.CUBIC_METERS, ("water", UnitOfVolume.CUBIC_FEET): UnitOfVolume.CUBIC_METERS,
("water", UnitOfVolume.GALLONS): UnitOfVolume.LITERS, ("water", UnitOfVolume.GALLONS): UnitOfVolume.LITERS,
("water", UnitOfVolume.MILLE_CUBIC_FEET): UnitOfVolume.CUBIC_METERS,
# Convert wind speeds except knots to km/h # Convert wind speeds except knots to km/h
**{ **{
("wind_speed", unit): UnitOfSpeed.KILOMETERS_PER_HOUR ("wind_speed", unit): UnitOfSpeed.KILOMETERS_PER_HOUR

View File

@ -850,7 +850,7 @@ async def test_validation_gas(
"affected_entities": {("sensor.gas_consumption_1", "beers")}, "affected_entities": {("sensor.gas_consumption_1", "beers")},
"translation_placeholders": { "translation_placeholders": {
"energy_units": ENERGY_UNITS_STRING, "energy_units": ENERGY_UNITS_STRING,
"gas_units": "CCF, ft³, m³, L", "gas_units": "CCF, ft³, m³, L, MCF",
}, },
}, },
{ {
@ -879,7 +879,7 @@ async def test_validation_gas(
"affected_entities": {("sensor.gas_price_2", "EUR/invalid")}, "affected_entities": {("sensor.gas_price_2", "EUR/invalid")},
"translation_placeholders": { "translation_placeholders": {
"price_units": ( "price_units": (
f"{ENERGY_PRICE_UNITS_STRING}, EUR/CCF, EUR/ft³, EUR/m³, EUR/L" f"{ENERGY_PRICE_UNITS_STRING}, EUR/CCF, EUR/ft³, EUR/m³, EUR/L, EUR/MCF"
) )
}, },
}, },
@ -1060,7 +1060,9 @@ async def test_validation_water(
{ {
"type": "entity_unexpected_unit_water", "type": "entity_unexpected_unit_water",
"affected_entities": {("sensor.water_consumption_1", "beers")}, "affected_entities": {("sensor.water_consumption_1", "beers")},
"translation_placeholders": {"water_units": "CCF, ft³, m³, gal, L"}, "translation_placeholders": {
"water_units": "CCF, ft³, m³, gal, L, MCF"
},
}, },
{ {
"type": "recorder_untracked", "type": "recorder_untracked",
@ -1087,7 +1089,7 @@ async def test_validation_water(
"type": "entity_unexpected_unit_water_price", "type": "entity_unexpected_unit_water_price",
"affected_entities": {("sensor.water_price_2", "EUR/invalid")}, "affected_entities": {("sensor.water_price_2", "EUR/invalid")},
"translation_placeholders": { "translation_placeholders": {
"price_units": "EUR/CCF, EUR/ft³, EUR/m³, EUR/gal, EUR/L" "price_units": "EUR/CCF, EUR/ft³, EUR/m³, EUR/gal, EUR/L, EUR/MCF"
}, },
}, },
], ],

View File

@ -7,7 +7,7 @@
'metadata_unit': 'm³', 'metadata_unit': 'm³',
'state_unit': 'W', 'state_unit': 'W',
'statistic_id': 'sensor.statistics_issues_issue_1', 'statistic_id': 'sensor.statistics_issues_issue_1',
'supported_unit': 'CCF, L, fl. oz., ft³, gal, mL, m³', 'supported_unit': 'CCF, L, MCF, fl. oz., ft³, gal, mL, m³',
}), }),
'type': 'units_changed', 'type': 'units_changed',
}), }),
@ -35,7 +35,7 @@
'metadata_unit': 'm³', 'metadata_unit': 'm³',
'state_unit': 'W', 'state_unit': 'W',
'statistic_id': 'sensor.statistics_issues_issue_3', 'statistic_id': 'sensor.statistics_issues_issue_3',
'supported_unit': 'CCF, L, fl. oz., ft³, gal, mL, m³', 'supported_unit': 'CCF, L, MCF, fl. oz., ft³, gal, mL, m³',
}), }),
'type': 'units_changed', 'type': 'units_changed',
}), }),

View File

@ -5824,7 +5824,7 @@ async def test_validate_statistics_unit_change_equivalent_units(
@pytest.mark.parametrize( @pytest.mark.parametrize(
("attributes", "unit1", "unit2", "supported_unit"), ("attributes", "unit1", "unit2", "supported_unit"),
[ [
(NONE_SENSOR_ATTRIBUTES, "", "m3", "CCF, L, fl. oz., ft³, gal, mL, m³"), (NONE_SENSOR_ATTRIBUTES, "", "m3", "CCF, L, MCF, fl. oz., ft³, gal, mL, m³"),
(NONE_SENSOR_ATTRIBUTES, "\u03bcV", "\u00b5V", "MV, V, kV, mV, \u03bcV"), (NONE_SENSOR_ATTRIBUTES, "\u03bcV", "\u00b5V", "MV, V, kV, mV, \u03bcV"),
(NONE_SENSOR_ATTRIBUTES, "\u03bcS/cm", "\u00b5S/cm", "S/cm, mS/cm, \u03bcS/cm"), (NONE_SENSOR_ATTRIBUTES, "\u03bcS/cm", "\u00b5S/cm", "S/cm, mS/cm, \u03bcS/cm"),
( (

View File

@ -879,6 +879,11 @@ _CONVERTED_VALUE: dict[
(5, UnitOfVolume.CENTUM_CUBIC_FEET, 478753.24, UnitOfVolume.FLUID_OUNCES), (5, UnitOfVolume.CENTUM_CUBIC_FEET, 478753.24, UnitOfVolume.FLUID_OUNCES),
(5, UnitOfVolume.CENTUM_CUBIC_FEET, 3740.26, UnitOfVolume.GALLONS), (5, UnitOfVolume.CENTUM_CUBIC_FEET, 3740.26, UnitOfVolume.GALLONS),
(5, UnitOfVolume.CENTUM_CUBIC_FEET, 14158.42, UnitOfVolume.LITERS), (5, UnitOfVolume.CENTUM_CUBIC_FEET, 14158.42, UnitOfVolume.LITERS),
(5, UnitOfVolume.MILLE_CUBIC_FEET, 5000, UnitOfVolume.CUBIC_FEET),
(5, UnitOfVolume.MILLE_CUBIC_FEET, 141.5842, UnitOfVolume.CUBIC_METERS),
(5, UnitOfVolume.MILLE_CUBIC_FEET, 4787532.4, UnitOfVolume.FLUID_OUNCES),
(5, UnitOfVolume.MILLE_CUBIC_FEET, 37402.6, UnitOfVolume.GALLONS),
(5, UnitOfVolume.MILLE_CUBIC_FEET, 141584.2, UnitOfVolume.LITERS),
], ],
VolumeFlowRateConverter: [ VolumeFlowRateConverter: [
( (

View File

@ -433,6 +433,11 @@ def test_get_unit_system_invalid(key: str) -> None:
UnitOfVolume.CENTUM_CUBIC_FEET, UnitOfVolume.CENTUM_CUBIC_FEET,
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
), ),
(
SensorDeviceClass.GAS,
UnitOfVolume.MILLE_CUBIC_FEET,
UnitOfVolume.CUBIC_METERS,
),
(SensorDeviceClass.GAS, UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_METERS), (SensorDeviceClass.GAS, UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_METERS),
(SensorDeviceClass.GAS, UnitOfVolume.LITERS, None), (SensorDeviceClass.GAS, UnitOfVolume.LITERS, None),
(SensorDeviceClass.GAS, UnitOfVolume.CUBIC_METERS, None), (SensorDeviceClass.GAS, UnitOfVolume.CUBIC_METERS, None),
@ -510,6 +515,11 @@ def test_get_unit_system_invalid(key: str) -> None:
UnitOfVolume.CENTUM_CUBIC_FEET, UnitOfVolume.CENTUM_CUBIC_FEET,
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
), ),
(
SensorDeviceClass.VOLUME,
UnitOfVolume.MILLE_CUBIC_FEET,
UnitOfVolume.CUBIC_METERS,
),
(SensorDeviceClass.VOLUME, UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_METERS), (SensorDeviceClass.VOLUME, UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_METERS),
(SensorDeviceClass.VOLUME, UnitOfVolume.FLUID_OUNCES, UnitOfVolume.MILLILITERS), (SensorDeviceClass.VOLUME, UnitOfVolume.FLUID_OUNCES, UnitOfVolume.MILLILITERS),
(SensorDeviceClass.VOLUME, UnitOfVolume.GALLONS, UnitOfVolume.LITERS), (SensorDeviceClass.VOLUME, UnitOfVolume.GALLONS, UnitOfVolume.LITERS),
@ -523,6 +533,11 @@ def test_get_unit_system_invalid(key: str) -> None:
UnitOfVolume.CENTUM_CUBIC_FEET, UnitOfVolume.CENTUM_CUBIC_FEET,
UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_METERS,
), ),
(
SensorDeviceClass.WATER,
UnitOfVolume.MILLE_CUBIC_FEET,
UnitOfVolume.CUBIC_METERS,
),
(SensorDeviceClass.WATER, UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_METERS), (SensorDeviceClass.WATER, UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_METERS),
(SensorDeviceClass.WATER, UnitOfVolume.GALLONS, UnitOfVolume.LITERS), (SensorDeviceClass.WATER, UnitOfVolume.GALLONS, UnitOfVolume.LITERS),
(SensorDeviceClass.WATER, UnitOfVolume.CUBIC_METERS, None), (SensorDeviceClass.WATER, UnitOfVolume.CUBIC_METERS, None),
@ -690,6 +705,7 @@ def test_metric_converted_units(device_class: SensorDeviceClass) -> None:
(SensorDeviceClass.DISTANCE, "very_long", None), (SensorDeviceClass.DISTANCE, "very_long", None),
# Test gas meter conversion # Test gas meter conversion
(SensorDeviceClass.GAS, UnitOfVolume.CENTUM_CUBIC_FEET, None), (SensorDeviceClass.GAS, UnitOfVolume.CENTUM_CUBIC_FEET, None),
(SensorDeviceClass.GAS, UnitOfVolume.MILLE_CUBIC_FEET, None),
(SensorDeviceClass.GAS, UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_FEET), (SensorDeviceClass.GAS, UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_FEET),
(SensorDeviceClass.GAS, UnitOfVolume.LITERS, UnitOfVolume.CUBIC_FEET), (SensorDeviceClass.GAS, UnitOfVolume.LITERS, UnitOfVolume.CUBIC_FEET),
(SensorDeviceClass.GAS, UnitOfVolume.CUBIC_FEET, None), (SensorDeviceClass.GAS, UnitOfVolume.CUBIC_FEET, None),
@ -770,6 +786,7 @@ def test_metric_converted_units(device_class: SensorDeviceClass) -> None:
(SensorDeviceClass.VOLUME, UnitOfVolume.LITERS, UnitOfVolume.GALLONS), (SensorDeviceClass.VOLUME, UnitOfVolume.LITERS, UnitOfVolume.GALLONS),
(SensorDeviceClass.VOLUME, UnitOfVolume.MILLILITERS, UnitOfVolume.FLUID_OUNCES), (SensorDeviceClass.VOLUME, UnitOfVolume.MILLILITERS, UnitOfVolume.FLUID_OUNCES),
(SensorDeviceClass.VOLUME, UnitOfVolume.CENTUM_CUBIC_FEET, None), (SensorDeviceClass.VOLUME, UnitOfVolume.CENTUM_CUBIC_FEET, None),
(SensorDeviceClass.VOLUME, UnitOfVolume.MILLE_CUBIC_FEET, None),
(SensorDeviceClass.VOLUME, UnitOfVolume.CUBIC_FEET, None), (SensorDeviceClass.VOLUME, UnitOfVolume.CUBIC_FEET, None),
(SensorDeviceClass.VOLUME, UnitOfVolume.FLUID_OUNCES, None), (SensorDeviceClass.VOLUME, UnitOfVolume.FLUID_OUNCES, None),
(SensorDeviceClass.VOLUME, UnitOfVolume.GALLONS, None), (SensorDeviceClass.VOLUME, UnitOfVolume.GALLONS, None),
@ -778,6 +795,7 @@ def test_metric_converted_units(device_class: SensorDeviceClass) -> None:
(SensorDeviceClass.WATER, UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_FEET), (SensorDeviceClass.WATER, UnitOfVolume.CUBIC_METERS, UnitOfVolume.CUBIC_FEET),
(SensorDeviceClass.WATER, UnitOfVolume.LITERS, UnitOfVolume.GALLONS), (SensorDeviceClass.WATER, UnitOfVolume.LITERS, UnitOfVolume.GALLONS),
(SensorDeviceClass.WATER, UnitOfVolume.CENTUM_CUBIC_FEET, None), (SensorDeviceClass.WATER, UnitOfVolume.CENTUM_CUBIC_FEET, None),
(SensorDeviceClass.WATER, UnitOfVolume.MILLE_CUBIC_FEET, None),
(SensorDeviceClass.WATER, UnitOfVolume.CUBIC_FEET, None), (SensorDeviceClass.WATER, UnitOfVolume.CUBIC_FEET, None),
(SensorDeviceClass.WATER, UnitOfVolume.GALLONS, None), (SensorDeviceClass.WATER, UnitOfVolume.GALLONS, None),
(SensorDeviceClass.WATER, "very_much", None), (SensorDeviceClass.WATER, "very_much", None),
@ -828,7 +846,11 @@ UNCONVERTED_UNITS_US_SYSTEM = {
UnitOfLength.MILES, UnitOfLength.MILES,
UnitOfLength.YARDS, UnitOfLength.YARDS,
), ),
SensorDeviceClass.GAS: (UnitOfVolume.CENTUM_CUBIC_FEET, UnitOfVolume.CUBIC_FEET), SensorDeviceClass.GAS: (
UnitOfVolume.CENTUM_CUBIC_FEET,
UnitOfVolume.MILLE_CUBIC_FEET,
UnitOfVolume.CUBIC_FEET,
),
SensorDeviceClass.PRECIPITATION: (UnitOfLength.INCHES,), SensorDeviceClass.PRECIPITATION: (UnitOfLength.INCHES,),
SensorDeviceClass.PRECIPITATION_INTENSITY: ( SensorDeviceClass.PRECIPITATION_INTENSITY: (
UnitOfVolumetricFlux.INCHES_PER_DAY, UnitOfVolumetricFlux.INCHES_PER_DAY,
@ -846,12 +868,14 @@ UNCONVERTED_UNITS_US_SYSTEM = {
), ),
SensorDeviceClass.VOLUME: ( SensorDeviceClass.VOLUME: (
UnitOfVolume.CENTUM_CUBIC_FEET, UnitOfVolume.CENTUM_CUBIC_FEET,
UnitOfVolume.MILLE_CUBIC_FEET,
UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_FEET,
UnitOfVolume.FLUID_OUNCES, UnitOfVolume.FLUID_OUNCES,
UnitOfVolume.GALLONS, UnitOfVolume.GALLONS,
), ),
SensorDeviceClass.WATER: ( SensorDeviceClass.WATER: (
UnitOfVolume.CENTUM_CUBIC_FEET, UnitOfVolume.CENTUM_CUBIC_FEET,
UnitOfVolume.MILLE_CUBIC_FEET,
UnitOfVolume.CUBIC_FEET, UnitOfVolume.CUBIC_FEET,
UnitOfVolume.GALLONS, UnitOfVolume.GALLONS,
), ),