diff --git a/homeassistant/components/bthome/manifest.json b/homeassistant/components/bthome/manifest.json index bf447e6a485..7a879608fc4 100644 --- a/homeassistant/components/bthome/manifest.json +++ b/homeassistant/components/bthome/manifest.json @@ -17,7 +17,7 @@ "service_data_uuid": "0000fcd2-0000-1000-8000-00805f9b34fb" } ], - "requirements": ["bthome-ble==2.3.1"], + "requirements": ["bthome-ble==2.4.0"], "dependencies": ["bluetooth"], "codeowners": ["@Ernst79"], "iot_class": "local_push" diff --git a/homeassistant/components/bthome/sensor.py b/homeassistant/components/bthome/sensor.py index a0a24243f19..b58eb514020 100644 --- a/homeassistant/components/bthome/sensor.py +++ b/homeassistant/components/bthome/sensor.py @@ -25,6 +25,7 @@ from homeassistant.const import ( LIGHT_LUX, PERCENTAGE, SIGNAL_STRENGTH_DECIBELS_MILLIWATT, + VOLUME_FLOW_RATE_CUBIC_METERS_PER_HOUR, UnitOfElectricCurrent, UnitOfElectricPotential, UnitOfEnergy, @@ -35,6 +36,7 @@ from homeassistant.const import ( UnitOfSpeed, UnitOfTemperature, UnitOfTime, + UnitOfVolume, ) from homeassistant.core import HomeAssistant from homeassistant.helpers.entity import EntityCategory @@ -45,30 +47,7 @@ from .const import DOMAIN from .device import device_key_to_bluetooth_entity_key SENSOR_DESCRIPTIONS = { - (BTHomeSensorDeviceClass.TEMPERATURE, Units.TEMP_CELSIUS): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.TEMPERATURE}_{Units.TEMP_CELSIUS}", - device_class=SensorDeviceClass.TEMPERATURE, - native_unit_of_measurement=UnitOfTemperature.CELSIUS, - state_class=SensorStateClass.MEASUREMENT, - ), - (BTHomeSensorDeviceClass.HUMIDITY, Units.PERCENTAGE): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.HUMIDITY}_{Units.PERCENTAGE}", - device_class=SensorDeviceClass.HUMIDITY, - native_unit_of_measurement=PERCENTAGE, - state_class=SensorStateClass.MEASUREMENT, - ), - (BTHomeSensorDeviceClass.ILLUMINANCE, Units.LIGHT_LUX): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.ILLUMINANCE}_{Units.LIGHT_LUX}", - device_class=SensorDeviceClass.ILLUMINANCE, - native_unit_of_measurement=LIGHT_LUX, - state_class=SensorStateClass.MEASUREMENT, - ), - (BTHomeSensorDeviceClass.PRESSURE, Units.PRESSURE_MBAR): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.PRESSURE}_{Units.PRESSURE_MBAR}", - device_class=SensorDeviceClass.PRESSURE, - native_unit_of_measurement=UnitOfPressure.MBAR, - state_class=SensorStateClass.MEASUREMENT, - ), + # Battery (percent) (BTHomeSensorDeviceClass.BATTERY, Units.PERCENTAGE): SensorEntityDescription( key=f"{BTHomeSensorDeviceClass.BATTERY}_{Units.PERCENTAGE}", device_class=SensorDeviceClass.BATTERY, @@ -76,48 +55,12 @@ SENSOR_DESCRIPTIONS = { state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, ), - ( - BTHomeSensorDeviceClass.VOLTAGE, - Units.ELECTRIC_POTENTIAL_VOLT, - ): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.VOLTAGE}_{Units.ELECTRIC_POTENTIAL_VOLT}", - device_class=SensorDeviceClass.VOLTAGE, - native_unit_of_measurement=UnitOfElectricPotential.VOLT, - state_class=SensorStateClass.MEASUREMENT, - ), - ( - BTHomeSensorDeviceClass.ENERGY, - Units.ENERGY_KILO_WATT_HOUR, - ): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.ENERGY}_{Units.ENERGY_KILO_WATT_HOUR}", - device_class=SensorDeviceClass.ENERGY, - native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR, - state_class=SensorStateClass.TOTAL_INCREASING, - ), - (BTHomeSensorDeviceClass.POWER, Units.POWER_WATT): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.POWER}_{Units.POWER_WATT}", - device_class=SensorDeviceClass.POWER, - native_unit_of_measurement=UnitOfPower.WATT, - state_class=SensorStateClass.MEASUREMENT, - ), - ( - BTHomeSensorDeviceClass.PM10, - Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - ): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.PM10}_{Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER}", - device_class=SensorDeviceClass.PM10, - native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - state_class=SensorStateClass.MEASUREMENT, - ), - ( - BTHomeSensorDeviceClass.PM25, - Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, - ): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.PM25}_{Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER}", - device_class=SensorDeviceClass.PM25, - native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, + # Count (-) + (BTHomeSensorDeviceClass.COUNT, None): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.COUNT}", state_class=SensorStateClass.MEASUREMENT, ), + # CO2 (parts per million) ( BTHomeSensorDeviceClass.CO2, Units.CONCENTRATION_PARTS_PER_MILLION, @@ -127,15 +70,140 @@ SENSOR_DESCRIPTIONS = { native_unit_of_measurement=CONCENTRATION_PARTS_PER_MILLION, state_class=SensorStateClass.MEASUREMENT, ), + # Current (Ampere) ( - BTHomeSensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS, + BTHomeSensorDeviceClass.CURRENT, + Units.ELECTRIC_CURRENT_AMPERE, + ): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.CURRENT}_{Units.ELECTRIC_CURRENT_AMPERE}", + device_class=SensorDeviceClass.CURRENT, + native_unit_of_measurement=UnitOfElectricCurrent.AMPERE, + state_class=SensorStateClass.MEASUREMENT, + ), + # Dew Point (°C) + (BTHomeSensorDeviceClass.DEW_POINT, Units.TEMP_CELSIUS): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.DEW_POINT}_{Units.TEMP_CELSIUS}", + device_class=SensorDeviceClass.TEMPERATURE, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + state_class=SensorStateClass.MEASUREMENT, + ), + # Distance (mm) + ( + BTHomeSensorDeviceClass.DISTANCE, + Units.LENGTH_MILLIMETERS, + ): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.DISTANCE}_{Units.LENGTH_MILLIMETERS}", + device_class=SensorDeviceClass.DISTANCE, + native_unit_of_measurement=UnitOfLength.MILLIMETERS, + state_class=SensorStateClass.MEASUREMENT, + ), + # Distance (m) + (BTHomeSensorDeviceClass.DISTANCE, Units.LENGTH_METERS): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.DISTANCE}_{Units.LENGTH_METERS}", + device_class=SensorDeviceClass.DISTANCE, + native_unit_of_measurement=UnitOfLength.METERS, + state_class=SensorStateClass.MEASUREMENT, + ), + # Duration (seconds) + (BTHomeSensorDeviceClass.DURATION, Units.TIME_SECONDS): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.DURATION}_{Units.TIME_SECONDS}", + device_class=SensorDeviceClass.DURATION, + native_unit_of_measurement=UnitOfTime.SECONDS, + state_class=SensorStateClass.MEASUREMENT, + ), + # Energy (kWh) + ( + BTHomeSensorDeviceClass.ENERGY, + Units.ENERGY_KILO_WATT_HOUR, + ): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.ENERGY}_{Units.ENERGY_KILO_WATT_HOUR}", + device_class=SensorDeviceClass.ENERGY, + native_unit_of_measurement=UnitOfEnergy.KILO_WATT_HOUR, + state_class=SensorStateClass.TOTAL_INCREASING, + ), + # Humidity in (percent) + (BTHomeSensorDeviceClass.HUMIDITY, Units.PERCENTAGE): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.HUMIDITY}_{Units.PERCENTAGE}", + device_class=SensorDeviceClass.HUMIDITY, + native_unit_of_measurement=PERCENTAGE, + state_class=SensorStateClass.MEASUREMENT, + ), + # Illuminance (lux) + (BTHomeSensorDeviceClass.ILLUMINANCE, Units.LIGHT_LUX): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.ILLUMINANCE}_{Units.LIGHT_LUX}", + device_class=SensorDeviceClass.ILLUMINANCE, + native_unit_of_measurement=LIGHT_LUX, + state_class=SensorStateClass.MEASUREMENT, + ), + # Mass sensor (kg) + (BTHomeSensorDeviceClass.MASS, Units.MASS_KILOGRAMS): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.MASS}_{Units.MASS_KILOGRAMS}", + device_class=SensorDeviceClass.WEIGHT, + native_unit_of_measurement=UnitOfMass.KILOGRAMS, + state_class=SensorStateClass.MEASUREMENT, + ), + # Mass sensor (lb) + (BTHomeSensorDeviceClass.MASS, Units.MASS_POUNDS): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.MASS}_{Units.MASS_POUNDS}", + device_class=SensorDeviceClass.WEIGHT, + native_unit_of_measurement=UnitOfMass.POUNDS, + state_class=SensorStateClass.MEASUREMENT, + ), + # Moisture (percent) + (BTHomeSensorDeviceClass.MOISTURE, Units.PERCENTAGE): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.MOISTURE}_{Units.PERCENTAGE}", + device_class=SensorDeviceClass.MOISTURE, + native_unit_of_measurement=PERCENTAGE, + state_class=SensorStateClass.MEASUREMENT, + ), + # Packet Id (-) + (BTHomeSensorDeviceClass.PACKET_ID, None): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.PACKET_ID}", + state_class=SensorStateClass.MEASUREMENT, + entity_category=EntityCategory.DIAGNOSTIC, + entity_registry_enabled_default=False, + ), + # PM10 (µg/m3) + ( + BTHomeSensorDeviceClass.PM10, Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, ): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS}_{Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER}", - device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS, + key=f"{BTHomeSensorDeviceClass.PM10}_{Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER}", + device_class=SensorDeviceClass.PM10, native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, state_class=SensorStateClass.MEASUREMENT, ), + # PM2.5 (µg/m3) + ( + BTHomeSensorDeviceClass.PM25, + Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, + ): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.PM25}_{Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER}", + device_class=SensorDeviceClass.PM25, + native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, + state_class=SensorStateClass.MEASUREMENT, + ), + # Power (Watt) + (BTHomeSensorDeviceClass.POWER, Units.POWER_WATT): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.POWER}_{Units.POWER_WATT}", + device_class=SensorDeviceClass.POWER, + native_unit_of_measurement=UnitOfPower.WATT, + state_class=SensorStateClass.MEASUREMENT, + ), + # Pressure (mbar) + (BTHomeSensorDeviceClass.PRESSURE, Units.PRESSURE_MBAR): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.PRESSURE}_{Units.PRESSURE_MBAR}", + device_class=SensorDeviceClass.PRESSURE, + native_unit_of_measurement=UnitOfPressure.MBAR, + state_class=SensorStateClass.MEASUREMENT, + ), + # Rotation (°) + (BTHomeSensorDeviceClass.ROTATION, Units.DEGREE): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.ROTATION}_{Units.DEGREE}", + native_unit_of_measurement=DEGREE, + state_class=SensorStateClass.MEASUREMENT, + ), + # Signal Strength (RSSI) (dB) ( BTHomeSensorDeviceClass.SIGNAL_STRENGTH, Units.SIGNAL_STRENGTH_DECIBELS_MILLIWATT, @@ -147,80 +215,7 @@ SENSOR_DESCRIPTIONS = { entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=False, ), - # Used for mass sensor with kg unit - (BTHomeSensorDeviceClass.MASS, Units.MASS_KILOGRAMS): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.MASS}_{Units.MASS_KILOGRAMS}", - device_class=SensorDeviceClass.WEIGHT, - native_unit_of_measurement=UnitOfMass.KILOGRAMS, - state_class=SensorStateClass.MEASUREMENT, - ), - # Used for mass sensor with lb unit - (BTHomeSensorDeviceClass.MASS, Units.MASS_POUNDS): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.MASS}_{Units.MASS_POUNDS}", - device_class=SensorDeviceClass.WEIGHT, - native_unit_of_measurement=UnitOfMass.POUNDS, - state_class=SensorStateClass.MEASUREMENT, - ), - # Used for moisture sensor - (BTHomeSensorDeviceClass.MOISTURE, Units.PERCENTAGE): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.MOISTURE}_{Units.PERCENTAGE}", - device_class=SensorDeviceClass.MOISTURE, - native_unit_of_measurement=PERCENTAGE, - state_class=SensorStateClass.MEASUREMENT, - ), - # Used for dew point sensor - (BTHomeSensorDeviceClass.DEW_POINT, Units.TEMP_CELSIUS): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.DEW_POINT}_{Units.TEMP_CELSIUS}", - device_class=SensorDeviceClass.TEMPERATURE, - native_unit_of_measurement=UnitOfTemperature.CELSIUS, - state_class=SensorStateClass.MEASUREMENT, - ), - # Used for count sensor - (BTHomeSensorDeviceClass.COUNT, None): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.COUNT}", - state_class=SensorStateClass.MEASUREMENT, - ), - # Used for rotation sensor - (BTHomeSensorDeviceClass.ROTATION, Units.DEGREE): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.ROTATION}_{Units.DEGREE}", - native_unit_of_measurement=DEGREE, - state_class=SensorStateClass.MEASUREMENT, - ), - # Used for distance sensor in mm - ( - BTHomeSensorDeviceClass.DISTANCE, - Units.LENGTH_MILLIMETERS, - ): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.DISTANCE}_{Units.LENGTH_MILLIMETERS}", - device_class=SensorDeviceClass.DISTANCE, - native_unit_of_measurement=UnitOfLength.MILLIMETERS, - state_class=SensorStateClass.MEASUREMENT, - ), - # Used for distance sensor in m - (BTHomeSensorDeviceClass.DISTANCE, Units.LENGTH_METERS): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.DISTANCE}_{Units.LENGTH_METERS}", - device_class=SensorDeviceClass.DISTANCE, - native_unit_of_measurement=UnitOfLength.METERS, - state_class=SensorStateClass.MEASUREMENT, - ), - # Used for duration sensor - (BTHomeSensorDeviceClass.DURATION, Units.TIME_SECONDS): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.DURATION}_{Units.TIME_SECONDS}", - device_class=SensorDeviceClass.DURATION, - native_unit_of_measurement=UnitOfTime.SECONDS, - state_class=SensorStateClass.MEASUREMENT, - ), - # Used for current sensor - ( - BTHomeSensorDeviceClass.CURRENT, - Units.ELECTRIC_CURRENT_AMPERE, - ): SensorEntityDescription( - key=f"{BTHomeSensorDeviceClass.CURRENT}_{Units.ELECTRIC_CURRENT_AMPERE}", - device_class=SensorDeviceClass.CURRENT, - native_unit_of_measurement=UnitOfElectricCurrent.AMPERE, - state_class=SensorStateClass.MEASUREMENT, - ), - # Used for speed sensor + # Speed (m/s) ( BTHomeSensorDeviceClass.SPEED, Units.SPEED_METERS_PER_SECOND, @@ -230,11 +225,64 @@ SENSOR_DESCRIPTIONS = { native_unit_of_measurement=UnitOfSpeed.METERS_PER_SECOND, state_class=SensorStateClass.MEASUREMENT, ), - # Used for UV index sensor + # Temperature (°C) + (BTHomeSensorDeviceClass.TEMPERATURE, Units.TEMP_CELSIUS): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.TEMPERATURE}_{Units.TEMP_CELSIUS}", + device_class=SensorDeviceClass.TEMPERATURE, + native_unit_of_measurement=UnitOfTemperature.CELSIUS, + state_class=SensorStateClass.MEASUREMENT, + ), + # UV index (-) (BTHomeSensorDeviceClass.UV_INDEX, None,): SensorEntityDescription( key=f"{BTHomeSensorDeviceClass.UV_INDEX}", state_class=SensorStateClass.MEASUREMENT, ), + # Volatile organic Compounds (VOC) (µg/m3) + ( + BTHomeSensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS, + Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, + ): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS}_{Units.CONCENTRATION_MICROGRAMS_PER_CUBIC_METER}", + device_class=SensorDeviceClass.VOLATILE_ORGANIC_COMPOUNDS, + native_unit_of_measurement=CONCENTRATION_MICROGRAMS_PER_CUBIC_METER, + state_class=SensorStateClass.MEASUREMENT, + ), + # Voltage (volt) + ( + BTHomeSensorDeviceClass.VOLTAGE, + Units.ELECTRIC_POTENTIAL_VOLT, + ): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.VOLTAGE}_{Units.ELECTRIC_POTENTIAL_VOLT}", + device_class=SensorDeviceClass.VOLTAGE, + native_unit_of_measurement=UnitOfElectricPotential.VOLT, + state_class=SensorStateClass.MEASUREMENT, + ), + # Volume (L) + (BTHomeSensorDeviceClass.VOLUME, Units.VOLUME_LITERS,): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.VOLUME}_{Units.VOLUME_LITERS}", + device_class=SensorDeviceClass.VOLUME, + native_unit_of_measurement=UnitOfVolume.LITERS, + state_class=SensorStateClass.MEASUREMENT, + ), + # Volume (mL) + ( + BTHomeSensorDeviceClass.VOLUME, + Units.VOLUME_MILLILITERS, + ): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.VOLUME}_{Units.VOLUME_MILLILITERS}", + device_class=SensorDeviceClass.VOLUME, + native_unit_of_measurement=UnitOfVolume.MILLILITERS, + state_class=SensorStateClass.MEASUREMENT, + ), + # Volume Flow Rate (m3/hour) + ( + BTHomeSensorDeviceClass.VOLUME_FLOW_RATE, + Units.VOLUME_FLOW_RATE_CUBIC_METERS_PER_HOUR, + ): SensorEntityDescription( + key=f"{BTHomeSensorDeviceClass.VOLUME_FLOW_RATE}_{Units.VOLUME_FLOW_RATE_CUBIC_METERS_PER_HOUR}", + native_unit_of_measurement=VOLUME_FLOW_RATE_CUBIC_METERS_PER_HOUR, + state_class=SensorStateClass.MEASUREMENT, + ), } diff --git a/requirements_all.txt b/requirements_all.txt index 9ec50716e1c..c0a80179d10 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -488,7 +488,7 @@ brunt==1.2.0 bt_proximity==0.2.1 # homeassistant.components.bthome -bthome-ble==2.3.1 +bthome-ble==2.4.0 # homeassistant.components.bt_home_hub_5 bthomehub5-devicelist==0.1.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 7234bcdcdf9..21afcc0ca2f 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -392,7 +392,7 @@ brother==2.1.1 brunt==1.2.0 # homeassistant.components.bthome -bthome-ble==2.3.1 +bthome-ble==2.4.0 # homeassistant.components.buienradar buienradar==1.0.5 diff --git a/tests/components/bthome/test_sensor.py b/tests/components/bthome/test_sensor.py index dce82ab454f..5744642e3dd 100644 --- a/tests/components/bthome/test_sensor.py +++ b/tests/components/bthome/test_sensor.py @@ -790,6 +790,57 @@ async def test_v1_sensors( }, ], ), + ( + "A4:C1:38:8D:18:B2", + make_bthome_v2_adv( + "A4:C1:38:8D:18:B2", + b"\x40\x47\x87\x56", + ), + None, + [ + { + "sensor_entity": "sensor.test_device_18b2_volume", + "friendly_name": "Test Device 18B2 Volume", + "unit_of_measurement": "L", + "state_class": "measurement", + "expected_state": "2215.1", + }, + ], + ), + ( + "A4:C1:38:8D:18:B2", + make_bthome_v2_adv( + "A4:C1:38:8D:18:B2", + b"\x40\x48\xDC\x87", + ), + None, + [ + { + "sensor_entity": "sensor.test_device_18b2_volume", + "friendly_name": "Test Device 18B2 Volume", + "unit_of_measurement": "mL", + "state_class": "measurement", + "expected_state": "34780", + }, + ], + ), + ( + "A4:C1:38:8D:18:B2", + make_bthome_v2_adv( + "A4:C1:38:8D:18:B2", + b"\x40\x49\xDC\x87", + ), + None, + [ + { + "sensor_entity": "sensor.test_device_18b2_volume_flow_rate", + "friendly_name": "Test Device 18B2 Volume Flow Rate", + "unit_of_measurement": "m³/h", + "state_class": "measurement", + "expected_state": "34.78", + }, + ], + ), ( "A4:C1:38:8D:18:B2", make_bthome_v2_adv(