Add entity translations to Tado (#96226)

This commit is contained in:
Joost Lekkerkerker 2023-07-23 14:32:25 +02:00 committed by GitHub
parent 995c4d8ac1
commit 26152adb23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 60 additions and 36 deletions

View File

@ -50,31 +50,28 @@ class TadoBinarySensorEntityDescription(
BATTERY_STATE_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription( BATTERY_STATE_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription(
key="battery state", key="battery state",
name="Battery state",
state_fn=lambda data: data["batteryState"] == "LOW", state_fn=lambda data: data["batteryState"] == "LOW",
device_class=BinarySensorDeviceClass.BATTERY, device_class=BinarySensorDeviceClass.BATTERY,
) )
CONNECTION_STATE_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription( CONNECTION_STATE_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription(
key="connection state", key="connection state",
name="Connection state", translation_key="connection_state",
state_fn=lambda data: data.get("connectionState", {}).get("value", False), state_fn=lambda data: data.get("connectionState", {}).get("value", False),
device_class=BinarySensorDeviceClass.CONNECTIVITY, device_class=BinarySensorDeviceClass.CONNECTIVITY,
) )
POWER_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription( POWER_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription(
key="power", key="power",
name="Power",
state_fn=lambda data: data.power == "ON", state_fn=lambda data: data.power == "ON",
device_class=BinarySensorDeviceClass.POWER, device_class=BinarySensorDeviceClass.POWER,
) )
LINK_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription( LINK_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription(
key="link", key="link",
name="Link",
state_fn=lambda data: data.link == "ONLINE", state_fn=lambda data: data.link == "ONLINE",
device_class=BinarySensorDeviceClass.CONNECTIVITY, device_class=BinarySensorDeviceClass.CONNECTIVITY,
) )
OVERLAY_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription( OVERLAY_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription(
key="overlay", key="overlay",
name="Overlay", translation_key="overlay",
state_fn=lambda data: data.overlay_active, state_fn=lambda data: data.overlay_active,
attributes_fn=lambda data: {"termination": data.overlay_termination_type} attributes_fn=lambda data: {"termination": data.overlay_termination_type}
if data.overlay_active if data.overlay_active
@ -83,14 +80,13 @@ OVERLAY_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription(
) )
OPEN_WINDOW_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription( OPEN_WINDOW_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription(
key="open window", key="open window",
name="Open window",
state_fn=lambda data: bool(data.open_window or data.open_window_detected), state_fn=lambda data: bool(data.open_window or data.open_window_detected),
attributes_fn=lambda data: data.open_window_attr, attributes_fn=lambda data: data.open_window_attr,
device_class=BinarySensorDeviceClass.WINDOW, device_class=BinarySensorDeviceClass.WINDOW,
) )
EARLY_START_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription( EARLY_START_ENTITY_DESCRIPTION = TadoBinarySensorEntityDescription(
key="early start", key="early start",
name="Early start", translation_key="early_start",
state_fn=lambda data: data.preparation, state_fn=lambda data: data.preparation,
device_class=BinarySensorDeviceClass.POWER, device_class=BinarySensorDeviceClass.POWER,
) )
@ -173,8 +169,6 @@ class TadoDeviceBinarySensor(TadoDeviceEntity, BinarySensorEntity):
entity_description: TadoBinarySensorEntityDescription entity_description: TadoBinarySensorEntityDescription
_attr_has_entity_name = True
def __init__( def __init__(
self, tado, device_info, entity_description: TadoBinarySensorEntityDescription self, tado, device_info, entity_description: TadoBinarySensorEntityDescription
) -> None: ) -> None:
@ -227,8 +221,6 @@ class TadoZoneBinarySensor(TadoZoneEntity, BinarySensorEntity):
entity_description: TadoBinarySensorEntityDescription entity_description: TadoBinarySensorEntityDescription
_attr_has_entity_name = True
def __init__( def __init__(
self, self,
tado, tado,

View File

@ -218,6 +218,7 @@ class TadoClimate(TadoZoneEntity, ClimateEntity):
"""Representation of a Tado climate entity.""" """Representation of a Tado climate entity."""
_attr_temperature_unit = UnitOfTemperature.CELSIUS _attr_temperature_unit = UnitOfTemperature.CELSIUS
_attr_name = None
def __init__( def __init__(
self, self,
@ -244,7 +245,6 @@ class TadoClimate(TadoZoneEntity, ClimateEntity):
self.zone_type = zone_type self.zone_type = zone_type
self._attr_unique_id = f"{zone_type} {zone_id} {tado.home_id}" self._attr_unique_id = f"{zone_type} {zone_id} {tado.home_id}"
self._attr_name = zone_name
self._attr_temperature_unit = UnitOfTemperature.CELSIUS self._attr_temperature_unit = UnitOfTemperature.CELSIUS
self._attr_translation_key = DOMAIN self._attr_translation_key = DOMAIN

View File

@ -8,6 +8,7 @@ class TadoDeviceEntity(Entity):
"""Base implementation for Tado device.""" """Base implementation for Tado device."""
_attr_should_poll = False _attr_should_poll = False
_attr_has_entity_name = True
def __init__(self, device_info): def __init__(self, device_info):
"""Initialize a Tado device.""" """Initialize a Tado device."""
@ -34,6 +35,7 @@ class TadoHomeEntity(Entity):
"""Base implementation for Tado home.""" """Base implementation for Tado home."""
_attr_should_poll = False _attr_should_poll = False
_attr_has_entity_name = True
def __init__(self, tado): def __init__(self, tado):
"""Initialize a Tado home.""" """Initialize a Tado home."""
@ -56,6 +58,7 @@ class TadoHomeEntity(Entity):
class TadoZoneEntity(Entity): class TadoZoneEntity(Entity):
"""Base implementation for Tado zone.""" """Base implementation for Tado zone."""
_attr_has_entity_name = True
_attr_should_poll = False _attr_should_poll = False
def __init__(self, zone_name, home_id, zone_id): def __init__(self, zone_name, home_id, zone_id):

View File

@ -55,7 +55,7 @@ class TadoSensorEntityDescription(
HOME_SENSORS = [ HOME_SENSORS = [
TadoSensorEntityDescription( TadoSensorEntityDescription(
key="outdoor temperature", key="outdoor temperature",
name="Outdoor temperature", translation_key="outdoor_temperature",
state_fn=lambda data: data["outsideTemperature"]["celsius"], state_fn=lambda data: data["outsideTemperature"]["celsius"],
attributes_fn=lambda data: { attributes_fn=lambda data: {
"time": data["outsideTemperature"]["timestamp"], "time": data["outsideTemperature"]["timestamp"],
@ -67,7 +67,7 @@ HOME_SENSORS = [
), ),
TadoSensorEntityDescription( TadoSensorEntityDescription(
key="solar percentage", key="solar percentage",
name="Solar percentage", translation_key="solar_percentage",
state_fn=lambda data: data["solarIntensity"]["percentage"], state_fn=lambda data: data["solarIntensity"]["percentage"],
attributes_fn=lambda data: { attributes_fn=lambda data: {
"time": data["solarIntensity"]["timestamp"], "time": data["solarIntensity"]["timestamp"],
@ -78,28 +78,28 @@ HOME_SENSORS = [
), ),
TadoSensorEntityDescription( TadoSensorEntityDescription(
key="weather condition", key="weather condition",
name="Weather condition", translation_key="weather_condition",
state_fn=lambda data: format_condition(data["weatherState"]["value"]), state_fn=lambda data: format_condition(data["weatherState"]["value"]),
attributes_fn=lambda data: {"time": data["weatherState"]["timestamp"]}, attributes_fn=lambda data: {"time": data["weatherState"]["timestamp"]},
data_category=SENSOR_DATA_CATEGORY_WEATHER, data_category=SENSOR_DATA_CATEGORY_WEATHER,
), ),
TadoSensorEntityDescription( TadoSensorEntityDescription(
key="tado mode", key="tado mode",
name="Tado mode", translation_key="tado_mode",
# pylint: disable=unnecessary-lambda # pylint: disable=unnecessary-lambda
state_fn=lambda data: get_tado_mode(data), state_fn=lambda data: get_tado_mode(data),
data_category=SENSOR_DATA_CATEGORY_GEOFENCE, data_category=SENSOR_DATA_CATEGORY_GEOFENCE,
), ),
TadoSensorEntityDescription( TadoSensorEntityDescription(
key="geofencing mode", key="geofencing mode",
name="Geofencing mode", translation_key="geofencing_mode",
# pylint: disable=unnecessary-lambda # pylint: disable=unnecessary-lambda
state_fn=lambda data: get_geofencing_mode(data), state_fn=lambda data: get_geofencing_mode(data),
data_category=SENSOR_DATA_CATEGORY_GEOFENCE, data_category=SENSOR_DATA_CATEGORY_GEOFENCE,
), ),
TadoSensorEntityDescription( TadoSensorEntityDescription(
key="automatic geofencing", key="automatic geofencing",
name="Automatic geofencing", translation_key="automatic_geofencing",
# pylint: disable=unnecessary-lambda # pylint: disable=unnecessary-lambda
state_fn=lambda data: get_automatic_geofencing(data), state_fn=lambda data: get_automatic_geofencing(data),
data_category=SENSOR_DATA_CATEGORY_GEOFENCE, data_category=SENSOR_DATA_CATEGORY_GEOFENCE,
@ -108,7 +108,6 @@ HOME_SENSORS = [
TEMPERATURE_ENTITY_DESCRIPTION = TadoSensorEntityDescription( TEMPERATURE_ENTITY_DESCRIPTION = TadoSensorEntityDescription(
key="temperature", key="temperature",
name="Temperature",
state_fn=lambda data: data.current_temp, state_fn=lambda data: data.current_temp,
attributes_fn=lambda data: { attributes_fn=lambda data: {
"time": data.current_temp_timestamp, "time": data.current_temp_timestamp,
@ -120,7 +119,6 @@ TEMPERATURE_ENTITY_DESCRIPTION = TadoSensorEntityDescription(
) )
HUMIDITY_ENTITY_DESCRIPTION = TadoSensorEntityDescription( HUMIDITY_ENTITY_DESCRIPTION = TadoSensorEntityDescription(
key="humidity", key="humidity",
name="Humidity",
state_fn=lambda data: data.current_humidity, state_fn=lambda data: data.current_humidity,
attributes_fn=lambda data: {"time": data.current_humidity_timestamp}, attributes_fn=lambda data: {"time": data.current_humidity_timestamp},
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
@ -129,12 +127,12 @@ HUMIDITY_ENTITY_DESCRIPTION = TadoSensorEntityDescription(
) )
TADO_MODE_ENTITY_DESCRIPTION = TadoSensorEntityDescription( TADO_MODE_ENTITY_DESCRIPTION = TadoSensorEntityDescription(
key="tado mode", key="tado mode",
name="Tado mode", translation_key="tado_mode",
state_fn=lambda data: data.tado_mode, state_fn=lambda data: data.tado_mode,
) )
HEATING_ENTITY_DESCRIPTION = TadoSensorEntityDescription( HEATING_ENTITY_DESCRIPTION = TadoSensorEntityDescription(
key="heating", key="heating",
name="Heating", translation_key="heating",
state_fn=lambda data: data.heating_power_percentage, state_fn=lambda data: data.heating_power_percentage,
attributes_fn=lambda data: {"time": data.heating_power_timestamp}, attributes_fn=lambda data: {"time": data.heating_power_timestamp},
native_unit_of_measurement=PERCENTAGE, native_unit_of_measurement=PERCENTAGE,
@ -142,6 +140,7 @@ HEATING_ENTITY_DESCRIPTION = TadoSensorEntityDescription(
) )
AC_ENTITY_DESCRIPTION = TadoSensorEntityDescription( AC_ENTITY_DESCRIPTION = TadoSensorEntityDescription(
key="ac", key="ac",
translation_key="ac",
name="AC", name="AC",
state_fn=lambda data: data.ac_power, state_fn=lambda data: data.ac_power,
attributes_fn=lambda data: {"time": data.ac_power_timestamp}, attributes_fn=lambda data: {"time": data.ac_power_timestamp},
@ -244,8 +243,6 @@ class TadoHomeSensor(TadoHomeEntity, SensorEntity):
entity_description: TadoSensorEntityDescription entity_description: TadoSensorEntityDescription
_attr_has_entity_name = True
def __init__(self, tado, entity_description: TadoSensorEntityDescription) -> None: def __init__(self, tado, entity_description: TadoSensorEntityDescription) -> None:
"""Initialize of the Tado Sensor.""" """Initialize of the Tado Sensor."""
self.entity_description = entity_description self.entity_description = entity_description
@ -298,8 +295,6 @@ class TadoZoneSensor(TadoZoneEntity, SensorEntity):
entity_description: TadoSensorEntityDescription entity_description: TadoSensorEntityDescription
_attr_has_entity_name = True
def __init__( def __init__(
self, self,
tado, tado,

View File

@ -31,6 +31,17 @@
} }
}, },
"entity": { "entity": {
"binary_sensor": {
"connection_state": {
"name": "Connection state"
},
"overlay": {
"name": "Overlay"
},
"early_start": {
"name": "Early start"
}
},
"climate": { "climate": {
"tado": { "tado": {
"state_attributes": { "state_attributes": {
@ -41,6 +52,32 @@
} }
} }
} }
},
"sensor": {
"outdoor_temperature": {
"name": "Outdoor temperature"
},
"solar_percentage": {
"name": "Solar percentage"
},
"weather_condition": {
"name": "Weather condition"
},
"tado_mode": {
"name": "Tado mode"
},
"geofencing_mode": {
"name": "Geofencing mode"
},
"automatic_geofencing": {
"name": "Automatic geofencing"
},
"heating": {
"name": "Heating"
},
"ac": {
"name": "AC"
}
} }
}, },
"services": { "services": {

View File

@ -119,6 +119,8 @@ def create_water_heater_entity(tado, name: str, zone_id: int, zone: str):
class TadoWaterHeater(TadoZoneEntity, WaterHeaterEntity): class TadoWaterHeater(TadoZoneEntity, WaterHeaterEntity):
"""Representation of a Tado water heater.""" """Representation of a Tado water heater."""
_attr_name = None
def __init__( def __init__(
self, self,
tado, tado,
@ -166,11 +168,6 @@ class TadoWaterHeater(TadoZoneEntity, WaterHeaterEntity):
) )
self._async_update_data() self._async_update_data()
@property
def name(self):
"""Return the name of the entity."""
return self.zone_name
@property @property
def unique_id(self): def unique_id(self):
"""Return the unique id.""" """Return the unique id."""

View File

@ -13,13 +13,13 @@ async def test_air_con_create_binary_sensors(hass: HomeAssistant) -> None:
state = hass.states.get("binary_sensor.air_conditioning_power") state = hass.states.get("binary_sensor.air_conditioning_power")
assert state.state == STATE_ON assert state.state == STATE_ON
state = hass.states.get("binary_sensor.air_conditioning_link") state = hass.states.get("binary_sensor.air_conditioning_connectivity")
assert state.state == STATE_ON assert state.state == STATE_ON
state = hass.states.get("binary_sensor.air_conditioning_overlay") state = hass.states.get("binary_sensor.air_conditioning_overlay")
assert state.state == STATE_ON assert state.state == STATE_ON
state = hass.states.get("binary_sensor.air_conditioning_open_window") state = hass.states.get("binary_sensor.air_conditioning_window")
assert state.state == STATE_OFF assert state.state == STATE_OFF
@ -31,7 +31,7 @@ async def test_heater_create_binary_sensors(hass: HomeAssistant) -> None:
state = hass.states.get("binary_sensor.baseboard_heater_power") state = hass.states.get("binary_sensor.baseboard_heater_power")
assert state.state == STATE_ON assert state.state == STATE_ON
state = hass.states.get("binary_sensor.baseboard_heater_link") state = hass.states.get("binary_sensor.baseboard_heater_connectivity")
assert state.state == STATE_ON assert state.state == STATE_ON
state = hass.states.get("binary_sensor.baseboard_heater_early_start") state = hass.states.get("binary_sensor.baseboard_heater_early_start")
@ -40,7 +40,7 @@ async def test_heater_create_binary_sensors(hass: HomeAssistant) -> None:
state = hass.states.get("binary_sensor.baseboard_heater_overlay") state = hass.states.get("binary_sensor.baseboard_heater_overlay")
assert state.state == STATE_ON assert state.state == STATE_ON
state = hass.states.get("binary_sensor.baseboard_heater_open_window") state = hass.states.get("binary_sensor.baseboard_heater_window")
assert state.state == STATE_OFF assert state.state == STATE_OFF
@ -49,7 +49,7 @@ async def test_water_heater_create_binary_sensors(hass: HomeAssistant) -> None:
await async_init_integration(hass) await async_init_integration(hass)
state = hass.states.get("binary_sensor.water_heater_link") state = hass.states.get("binary_sensor.water_heater_connectivity")
assert state.state == STATE_ON assert state.state == STATE_ON
state = hass.states.get("binary_sensor.water_heater_overlay") state = hass.states.get("binary_sensor.water_heater_overlay")