From 2bbf4ebc9e3c9e8a74394020541e540195134843 Mon Sep 17 00:00:00 2001 From: Jan-Philipp Benecke Date: Fri, 7 Nov 2025 19:48:18 +0100 Subject: [PATCH] Make BTHome sensor entities translatable (#156060) --- homeassistant/components/bthome/sensor.py | 17 +++-- homeassistant/components/bthome/strings.json | 38 +++++++++++ tests/components/bthome/test_sensor.py | 68 ++++++++++---------- 3 files changed, 85 insertions(+), 38 deletions(-) diff --git a/homeassistant/components/bthome/sensor.py b/homeassistant/components/bthome/sensor.py index 08d52efda09..dd3ce4c560e 100644 --- a/homeassistant/components/bthome/sensor.py +++ b/homeassistant/components/bthome/sensor.py @@ -59,6 +59,7 @@ SENSOR_DESCRIPTIONS = { key=f"{BTHomeSensorDeviceClass.ACCELERATION}_{Units.ACCELERATION_METERS_PER_SQUARE_SECOND}", native_unit_of_measurement=Units.ACCELERATION_METERS_PER_SQUARE_SECOND, state_class=SensorStateClass.MEASUREMENT, + translation_key="acceleration", ), # Battery (percent) (BTHomeSensorDeviceClass.BATTERY, Units.PERCENTAGE): SensorEntityDescription( @@ -72,6 +73,7 @@ SENSOR_DESCRIPTIONS = { (BTHomeExtendedSensorDeviceClass.CHANNEL, None): SensorEntityDescription( key=str(BTHomeExtendedSensorDeviceClass.CHANNEL), state_class=SensorStateClass.MEASUREMENT, + translation_key="channel", ), # Conductivity (μS/cm) ( @@ -87,6 +89,7 @@ SENSOR_DESCRIPTIONS = { (BTHomeSensorDeviceClass.COUNT, None): SensorEntityDescription( key=str(BTHomeSensorDeviceClass.COUNT), state_class=SensorStateClass.MEASUREMENT, + translation_key="count", ), # CO2 (parts per million) ( @@ -114,12 +117,14 @@ SENSOR_DESCRIPTIONS = { device_class=SensorDeviceClass.TEMPERATURE, native_unit_of_measurement=UnitOfTemperature.CELSIUS, state_class=SensorStateClass.MEASUREMENT, + translation_key="dew_point", ), # Directions (°) (BTHomeExtendedSensorDeviceClass.DIRECTION, Units.DEGREE): SensorEntityDescription( key=f"{BTHomeExtendedSensorDeviceClass.DIRECTION}_{Units.DEGREE}", native_unit_of_measurement=DEGREE, state_class=SensorStateClass.MEASUREMENT, + translation_key="direction", ), # Distance (mm) ( @@ -173,6 +178,7 @@ SENSOR_DESCRIPTIONS = { key=f"{BTHomeSensorDeviceClass.GYROSCOPE}_{Units.GYROSCOPE_DEGREES_PER_SECOND}", native_unit_of_measurement=Units.GYROSCOPE_DEGREES_PER_SECOND, state_class=SensorStateClass.MEASUREMENT, + translation_key="gyroscope", ), # Humidity in (percent) (BTHomeSensorDeviceClass.HUMIDITY, Units.PERCENTAGE): SensorEntityDescription( @@ -215,6 +221,7 @@ SENSOR_DESCRIPTIONS = { state_class=SensorStateClass.MEASUREMENT, entity_category=EntityCategory.DIAGNOSTIC, entity_registry_enabled_default=False, + translation_key="packet_id", ), # PM10 (μg/m3) ( @@ -263,12 +270,14 @@ SENSOR_DESCRIPTIONS = { # Raw (-) (BTHomeExtendedSensorDeviceClass.RAW, None): SensorEntityDescription( key=str(BTHomeExtendedSensorDeviceClass.RAW), + translation_key="raw", ), # Rotation (°) (BTHomeSensorDeviceClass.ROTATION, Units.DEGREE): SensorEntityDescription( key=f"{BTHomeSensorDeviceClass.ROTATION}_{Units.DEGREE}", native_unit_of_measurement=DEGREE, state_class=SensorStateClass.MEASUREMENT, + translation_key="rotation", ), # Rotational speed (rpm) ( @@ -278,6 +287,7 @@ SENSOR_DESCRIPTIONS = { key=f"{BTHomeExtendedSensorDeviceClass.ROTATIONAL_SPEED}_{Units.REVOLUTIONS_PER_MINUTE}", native_unit_of_measurement=REVOLUTIONS_PER_MINUTE, state_class=SensorStateClass.MEASUREMENT, + translation_key="rotational_speed", ), # Signal Strength (RSSI) (dB) ( @@ -311,6 +321,7 @@ SENSOR_DESCRIPTIONS = { # Text (-) (BTHomeExtendedSensorDeviceClass.TEXT, None): SensorEntityDescription( key=str(BTHomeExtendedSensorDeviceClass.TEXT), + translation_key="text", ), # Timestamp (datetime object) ( @@ -327,6 +338,7 @@ SENSOR_DESCRIPTIONS = { ): SensorEntityDescription( key=str(BTHomeSensorDeviceClass.UV_INDEX), state_class=SensorStateClass.MEASUREMENT, + translation_key="uv_index", ), # Volatile organic Compounds (VOC) (μg/m3) ( @@ -423,10 +435,7 @@ def sensor_update_to_bluetooth_data_update( ) for device_key, sensor_values in sensor_update.entity_values.items() }, - entity_names={ - device_key_to_bluetooth_entity_key(device_key): sensor_values.name - for device_key, sensor_values in sensor_update.entity_values.items() - }, + entity_names={}, ) diff --git a/homeassistant/components/bthome/strings.json b/homeassistant/components/bthome/strings.json index 94d22fb9d6b..35937341d84 100644 --- a/homeassistant/components/bthome/strings.json +++ b/homeassistant/components/bthome/strings.json @@ -78,6 +78,44 @@ } } } + }, + "sensor": { + "acceleration": { + "name": "Acceleration" + }, + "channel": { + "name": "Channel" + }, + "count": { + "name": "Count" + }, + "dew_point": { + "name": "Dew point" + }, + "direction": { + "name": "Direction" + }, + "gyroscope": { + "name": "Gyroscope" + }, + "packet_id": { + "name": "Packet ID" + }, + "raw": { + "name": "Raw" + }, + "rotation": { + "name": "Rotation" + }, + "rotational_speed": { + "name": "Rotational speed" + }, + "text": { + "name": "Text" + }, + "uv_index": { + "name": "UV Index" + } } } } diff --git a/tests/components/bthome/test_sensor.py b/tests/components/bthome/test_sensor.py index 63fdece9c98..06333821df2 100644 --- a/tests/components/bthome/test_sensor.py +++ b/tests/components/bthome/test_sensor.py @@ -133,8 +133,8 @@ _LOGGER = logging.getLogger(__name__) None, [ { - "sensor_entity": "sensor.test_device_18b2_mass", - "friendly_name": "Test Device 18B2 Mass", + "sensor_entity": "sensor.test_device_18b2_weight", + "friendly_name": "Test Device 18B2 Weight", "unit_of_measurement": "kg", "state_class": "measurement", "expected_state": "80.3", @@ -150,8 +150,8 @@ _LOGGER = logging.getLogger(__name__) None, [ { - "sensor_entity": "sensor.test_device_18b2_mass", - "friendly_name": "Test Device 18B2 Mass", + "sensor_entity": "sensor.test_device_18b2_weight", + "friendly_name": "Test Device 18B2 Weight", "unit_of_measurement": "lb", "state_class": "measurement", "expected_state": "74.86", @@ -168,7 +168,7 @@ _LOGGER = logging.getLogger(__name__) [ { "sensor_entity": "sensor.test_device_18b2_dew_point", - "friendly_name": "Test Device 18B2 Dew Point", + "friendly_name": "Test Device 18B2 Dew point", "unit_of_measurement": "°C", "state_class": "measurement", "expected_state": "17.38", @@ -252,14 +252,14 @@ _LOGGER = logging.getLogger(__name__) [ { "sensor_entity": "sensor.test_device_18b2_pm10", - "friendly_name": "Test Device 18B2 Pm10", + "friendly_name": "Test Device 18B2 PM10", "unit_of_measurement": "μg/m³", "state_class": "measurement", "expected_state": "7170", }, { - "sensor_entity": "sensor.test_device_18b2_pm25", - "friendly_name": "Test Device 18B2 Pm25", + "sensor_entity": "sensor.test_device_18b2_pm2_5", + "friendly_name": "Test Device 18B2 PM2.5", "unit_of_measurement": "μg/m³", "state_class": "measurement", "expected_state": "3090", @@ -276,7 +276,7 @@ _LOGGER = logging.getLogger(__name__) [ { "sensor_entity": "sensor.test_device_18b2_carbon_dioxide", - "friendly_name": "Test Device 18B2 Carbon Dioxide", + "friendly_name": "Test Device 18B2 Carbon dioxide", "unit_of_measurement": "ppm", "state_class": "measurement", "expected_state": "1250", @@ -295,7 +295,7 @@ _LOGGER = logging.getLogger(__name__) "sensor_entity": ( "sensor.test_device_18b2_volatile_organic_compounds" ), - "friendly_name": "Test Device 18B2 Volatile Organic Compounds", + "friendly_name": "Test Device 18B2 Volatile organic compounds", "unit_of_measurement": "μg/m³", "state_class": "measurement", "expected_state": "307", @@ -487,8 +487,8 @@ async def test_v1_sensors( None, [ { - "sensor_entity": "sensor.test_device_18b2_mass", - "friendly_name": "Test Device 18B2 Mass", + "sensor_entity": "sensor.test_device_18b2_weight", + "friendly_name": "Test Device 18B2 Weight", "unit_of_measurement": "kg", "state_class": "measurement", "expected_state": "80.3", @@ -504,8 +504,8 @@ async def test_v1_sensors( None, [ { - "sensor_entity": "sensor.test_device_18b2_mass", - "friendly_name": "Test Device 18B2 Mass", + "sensor_entity": "sensor.test_device_18b2_weight", + "friendly_name": "Test Device 18B2 Weight", "unit_of_measurement": "lb", "state_class": "measurement", "expected_state": "74.86", @@ -522,7 +522,7 @@ async def test_v1_sensors( [ { "sensor_entity": "sensor.test_device_18b2_dew_point", - "friendly_name": "Test Device 18B2 Dew Point", + "friendly_name": "Test Device 18B2 Dew point", "unit_of_measurement": "°C", "state_class": "measurement", "expected_state": "17.38", @@ -606,14 +606,14 @@ async def test_v1_sensors( [ { "sensor_entity": "sensor.test_device_18b2_pm10", - "friendly_name": "Test Device 18B2 Pm10", + "friendly_name": "Test Device 18B2 PM10", "unit_of_measurement": "μg/m³", "state_class": "measurement", "expected_state": "7170", }, { - "sensor_entity": "sensor.test_device_18b2_pm25", - "friendly_name": "Test Device 18B2 Pm25", + "sensor_entity": "sensor.test_device_18b2_pm2_5", + "friendly_name": "Test Device 18B2 PM2.5", "unit_of_measurement": "μg/m³", "state_class": "measurement", "expected_state": "3090", @@ -630,7 +630,7 @@ async def test_v1_sensors( [ { "sensor_entity": "sensor.test_device_18b2_carbon_dioxide", - "friendly_name": "Test Device 18B2 Carbon Dioxide", + "friendly_name": "Test Device 18B2 Carbon dioxide", "unit_of_measurement": "ppm", "state_class": "measurement", "expected_state": "1250", @@ -649,7 +649,7 @@ async def test_v1_sensors( "sensor_entity": ( "sensor.test_device_18b2_volatile_organic_compounds" ), - "friendly_name": "Test Device 18B2 Volatile Organic Compounds", + "friendly_name": "Test Device 18B2 Volatile organic compounds", "unit_of_measurement": "μg/m³", "state_class": "measurement", "expected_state": "307", @@ -802,7 +802,7 @@ async def test_v1_sensors( [ { "sensor_entity": "sensor.test_device_18b2_uv_index", - "friendly_name": "Test Device 18B2 Uv Index", + "friendly_name": "Test Device 18B2 UV Index", "state_class": "measurement", "expected_state": "5.0", }, @@ -852,7 +852,7 @@ async def test_v1_sensors( [ { "sensor_entity": "sensor.test_device_18b2_volume_flow_rate", - "friendly_name": "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", @@ -982,8 +982,8 @@ async def test_v1_sensors( None, [ { - "sensor_entity": "sensor.test_device_18b2_volume_storage", - "friendly_name": "Test Device 18B2 Volume Storage", + "sensor_entity": "sensor.test_device_18b2_stored_volume", + "friendly_name": "Test Device 18B2 Stored volume", "unit_of_measurement": "L", "state_class": "measurement", "expected_state": "19551.879", @@ -999,15 +999,15 @@ async def test_v1_sensors( None, [ { - "sensor_entity": "sensor.test_device_18b2_temperature_1", - "friendly_name": "Test Device 18B2 Temperature 1", + "sensor_entity": "sensor.test_device_18b2_temperature", + "friendly_name": "Test Device 18B2 Temperature", "unit_of_measurement": "°C", "state_class": "measurement", "expected_state": "25.06", }, { "sensor_entity": "sensor.test_device_18b2_temperature_2", - "friendly_name": "Test Device 18B2 Temperature 2", + "friendly_name": "Test Device 18B2 Temperature", "unit_of_measurement": "°C", "state_class": "measurement", "expected_state": "25.11", @@ -1023,36 +1023,36 @@ async def test_v1_sensors( None, [ { - "sensor_entity": "sensor.test_device_18b2_temperature_1", - "friendly_name": "Test Device 18B2 Temperature 1", + "sensor_entity": "sensor.test_device_18b2_temperature", + "friendly_name": "Test Device 18B2 Temperature", "unit_of_measurement": "°C", "state_class": "measurement", "expected_state": "25.06", }, { "sensor_entity": "sensor.test_device_18b2_temperature_2", - "friendly_name": "Test Device 18B2 Temperature 2", + "friendly_name": "Test Device 18B2 Temperature", "unit_of_measurement": "°C", "state_class": "measurement", "expected_state": "25.11", }, { "sensor_entity": "sensor.test_device_18b2_temperature_3", - "friendly_name": "Test Device 18B2 Temperature 3", + "friendly_name": "Test Device 18B2 Temperature", "unit_of_measurement": "°C", "state_class": "measurement", "expected_state": "22.55", }, { - "sensor_entity": "sensor.test_device_18b2_humidity_1", - "friendly_name": "Test Device 18B2 Humidity 1", + "sensor_entity": "sensor.test_device_18b2_humidity", + "friendly_name": "Test Device 18B2 Humidity", "unit_of_measurement": "%", "state_class": "measurement", "expected_state": "63.27", }, { "sensor_entity": "sensor.test_device_18b2_humidity_2", - "friendly_name": "Test Device 18B2 Humidity 2", + "friendly_name": "Test Device 18B2 Humidity", "unit_of_measurement": "%", "state_class": "measurement", "expected_state": "60.71",