mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 11:17:21 +00:00
Add entity translations to Switcher kis (#99223)
* Add entity translations to switcher_kis * Add entity translations * Fix tests
This commit is contained in:
parent
fc6f48e076
commit
821d74e904
@ -48,7 +48,7 @@ class SwitcherThermostatButtonEntityDescription(
|
|||||||
THERMOSTAT_BUTTONS = [
|
THERMOSTAT_BUTTONS = [
|
||||||
SwitcherThermostatButtonEntityDescription(
|
SwitcherThermostatButtonEntityDescription(
|
||||||
key="assume_on",
|
key="assume_on",
|
||||||
name="Assume on",
|
translation_key="assume_on",
|
||||||
icon="mdi:fan",
|
icon="mdi:fan",
|
||||||
entity_category=EntityCategory.CONFIG,
|
entity_category=EntityCategory.CONFIG,
|
||||||
press_fn=lambda api, remote: api.control_breeze_device(
|
press_fn=lambda api, remote: api.control_breeze_device(
|
||||||
@ -58,7 +58,7 @@ THERMOSTAT_BUTTONS = [
|
|||||||
),
|
),
|
||||||
SwitcherThermostatButtonEntityDescription(
|
SwitcherThermostatButtonEntityDescription(
|
||||||
key="assume_off",
|
key="assume_off",
|
||||||
name="Assume off",
|
translation_key="assume_off",
|
||||||
icon="mdi:fan-off",
|
icon="mdi:fan-off",
|
||||||
entity_category=EntityCategory.CONFIG,
|
entity_category=EntityCategory.CONFIG,
|
||||||
press_fn=lambda api, remote: api.control_breeze_device(
|
press_fn=lambda api, remote: api.control_breeze_device(
|
||||||
@ -68,7 +68,7 @@ THERMOSTAT_BUTTONS = [
|
|||||||
),
|
),
|
||||||
SwitcherThermostatButtonEntityDescription(
|
SwitcherThermostatButtonEntityDescription(
|
||||||
key="vertical_swing_on",
|
key="vertical_swing_on",
|
||||||
name="Vertical swing on",
|
translation_key="vertical_swing_on",
|
||||||
icon="mdi:autorenew",
|
icon="mdi:autorenew",
|
||||||
press_fn=lambda api, remote: api.control_breeze_device(
|
press_fn=lambda api, remote: api.control_breeze_device(
|
||||||
remote, swing=ThermostatSwing.ON
|
remote, swing=ThermostatSwing.ON
|
||||||
@ -77,7 +77,7 @@ THERMOSTAT_BUTTONS = [
|
|||||||
),
|
),
|
||||||
SwitcherThermostatButtonEntityDescription(
|
SwitcherThermostatButtonEntityDescription(
|
||||||
key="vertical_swing_off",
|
key="vertical_swing_off",
|
||||||
name="Vertical swing off",
|
translation_key="vertical_swing_off",
|
||||||
icon="mdi:autorenew-off",
|
icon="mdi:autorenew-off",
|
||||||
press_fn=lambda api, remote: api.control_breeze_device(
|
press_fn=lambda api, remote: api.control_breeze_device(
|
||||||
remote, swing=ThermostatSwing.OFF
|
remote, swing=ThermostatSwing.OFF
|
||||||
@ -117,6 +117,7 @@ class SwitcherThermostatButtonEntity(
|
|||||||
"""Representation of a Switcher climate entity."""
|
"""Representation of a Switcher climate entity."""
|
||||||
|
|
||||||
entity_description: SwitcherThermostatButtonEntityDescription
|
entity_description: SwitcherThermostatButtonEntityDescription
|
||||||
|
_attr_has_entity_name = True
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@ -129,7 +130,6 @@ class SwitcherThermostatButtonEntity(
|
|||||||
self.entity_description = description
|
self.entity_description = description
|
||||||
self._remote = remote
|
self._remote = remote
|
||||||
|
|
||||||
self._attr_name = f"{coordinator.name} {description.name}"
|
|
||||||
self._attr_unique_id = f"{coordinator.mac_address}-{description.key}"
|
self._attr_unique_id = f"{coordinator.mac_address}-{description.key}"
|
||||||
self._attr_device_info = DeviceInfo(
|
self._attr_device_info = DeviceInfo(
|
||||||
connections={(dr.CONNECTION_NETWORK_MAC, coordinator.mac_address)}
|
connections={(dr.CONNECTION_NETWORK_MAC, coordinator.mac_address)}
|
||||||
|
@ -84,6 +84,9 @@ class SwitcherClimateEntity(
|
|||||||
):
|
):
|
||||||
"""Representation of a Switcher climate entity."""
|
"""Representation of a Switcher climate entity."""
|
||||||
|
|
||||||
|
_attr_has_entity_name = True
|
||||||
|
_attr_name = None
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, coordinator: SwitcherDataUpdateCoordinator, remote: SwitcherBreezeRemote
|
self, coordinator: SwitcherDataUpdateCoordinator, remote: SwitcherBreezeRemote
|
||||||
) -> None:
|
) -> None:
|
||||||
@ -91,7 +94,6 @@ class SwitcherClimateEntity(
|
|||||||
super().__init__(coordinator)
|
super().__init__(coordinator)
|
||||||
self._remote = remote
|
self._remote = remote
|
||||||
|
|
||||||
self._attr_name = coordinator.name
|
|
||||||
self._attr_unique_id = f"{coordinator.device_id}-{coordinator.mac_address}"
|
self._attr_unique_id = f"{coordinator.device_id}-{coordinator.mac_address}"
|
||||||
self._attr_device_info = DeviceInfo(
|
self._attr_device_info = DeviceInfo(
|
||||||
connections={(dr.CONNECTION_NETWORK_MAC, coordinator.mac_address)}
|
connections={(dr.CONNECTION_NETWORK_MAC, coordinator.mac_address)}
|
||||||
|
@ -55,6 +55,8 @@ class SwitcherCoverEntity(
|
|||||||
):
|
):
|
||||||
"""Representation of a Switcher cover entity."""
|
"""Representation of a Switcher cover entity."""
|
||||||
|
|
||||||
|
_attr_has_entity_name = True
|
||||||
|
_attr_name = None
|
||||||
_attr_device_class = CoverDeviceClass.SHUTTER
|
_attr_device_class = CoverDeviceClass.SHUTTER
|
||||||
_attr_supported_features = (
|
_attr_supported_features = (
|
||||||
CoverEntityFeature.OPEN
|
CoverEntityFeature.OPEN
|
||||||
@ -67,7 +69,6 @@ class SwitcherCoverEntity(
|
|||||||
"""Initialize the entity."""
|
"""Initialize the entity."""
|
||||||
super().__init__(coordinator)
|
super().__init__(coordinator)
|
||||||
|
|
||||||
self._attr_name = coordinator.name
|
|
||||||
self._attr_unique_id = f"{coordinator.device_id}-{coordinator.mac_address}"
|
self._attr_unique_id = f"{coordinator.device_id}-{coordinator.mac_address}"
|
||||||
self._attr_device_info = DeviceInfo(
|
self._attr_device_info = DeviceInfo(
|
||||||
connections={(dr.CONNECTION_NETWORK_MAC, coordinator.mac_address)}
|
connections={(dr.CONNECTION_NETWORK_MAC, coordinator.mac_address)}
|
||||||
|
@ -25,14 +25,12 @@ from .const import SIGNAL_DEVICE_ADD
|
|||||||
POWER_SENSORS: list[SensorEntityDescription] = [
|
POWER_SENSORS: list[SensorEntityDescription] = [
|
||||||
SensorEntityDescription(
|
SensorEntityDescription(
|
||||||
key="power_consumption",
|
key="power_consumption",
|
||||||
name="Power Consumption",
|
|
||||||
native_unit_of_measurement=UnitOfPower.WATT,
|
native_unit_of_measurement=UnitOfPower.WATT,
|
||||||
device_class=SensorDeviceClass.POWER,
|
device_class=SensorDeviceClass.POWER,
|
||||||
state_class=SensorStateClass.MEASUREMENT,
|
state_class=SensorStateClass.MEASUREMENT,
|
||||||
),
|
),
|
||||||
SensorEntityDescription(
|
SensorEntityDescription(
|
||||||
key="electric_current",
|
key="electric_current",
|
||||||
name="Electric Current",
|
|
||||||
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
|
native_unit_of_measurement=UnitOfElectricCurrent.AMPERE,
|
||||||
device_class=SensorDeviceClass.CURRENT,
|
device_class=SensorDeviceClass.CURRENT,
|
||||||
state_class=SensorStateClass.MEASUREMENT,
|
state_class=SensorStateClass.MEASUREMENT,
|
||||||
@ -40,11 +38,13 @@ POWER_SENSORS: list[SensorEntityDescription] = [
|
|||||||
]
|
]
|
||||||
TIME_SENSORS: list[SensorEntityDescription] = [
|
TIME_SENSORS: list[SensorEntityDescription] = [
|
||||||
SensorEntityDescription(
|
SensorEntityDescription(
|
||||||
key="remaining_time", name="Remaining Time", icon="mdi:av-timer"
|
key="remaining_time",
|
||||||
|
translation_key="remaining_time",
|
||||||
|
icon="mdi:av-timer",
|
||||||
),
|
),
|
||||||
SensorEntityDescription(
|
SensorEntityDescription(
|
||||||
key="auto_off_set",
|
key="auto_off_set",
|
||||||
name="Auto Shutdown",
|
translation_key="auto_shutdown",
|
||||||
icon="mdi:progress-clock",
|
icon="mdi:progress-clock",
|
||||||
entity_registry_enabled_default=False,
|
entity_registry_enabled_default=False,
|
||||||
),
|
),
|
||||||
@ -85,6 +85,8 @@ class SwitcherSensorEntity(
|
|||||||
):
|
):
|
||||||
"""Representation of a Switcher sensor entity."""
|
"""Representation of a Switcher sensor entity."""
|
||||||
|
|
||||||
|
_attr_has_entity_name = True
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
coordinator: SwitcherDataUpdateCoordinator,
|
coordinator: SwitcherDataUpdateCoordinator,
|
||||||
@ -94,9 +96,6 @@ class SwitcherSensorEntity(
|
|||||||
super().__init__(coordinator)
|
super().__init__(coordinator)
|
||||||
self.entity_description = description
|
self.entity_description = description
|
||||||
|
|
||||||
# Entity class attributes
|
|
||||||
self._attr_name = f"{coordinator.name} {description.name}"
|
|
||||||
|
|
||||||
self._attr_unique_id = (
|
self._attr_unique_id = (
|
||||||
f"{coordinator.device_id}-{coordinator.mac_address}-{description.key}"
|
f"{coordinator.device_id}-{coordinator.mac_address}-{description.key}"
|
||||||
)
|
)
|
||||||
|
@ -10,6 +10,30 @@
|
|||||||
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]"
|
"no_devices_found": "[%key:common::config_flow::abort::no_devices_found%]"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"entity": {
|
||||||
|
"button": {
|
||||||
|
"assume_on": {
|
||||||
|
"name": "Assume on"
|
||||||
|
},
|
||||||
|
"assume_off": {
|
||||||
|
"name": "Assume off"
|
||||||
|
},
|
||||||
|
"vertical_swing_on": {
|
||||||
|
"name": "Vertical swing on"
|
||||||
|
},
|
||||||
|
"vertical_swing_off": {
|
||||||
|
"name": "Vertical swing off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sensor": {
|
||||||
|
"remaining_time": {
|
||||||
|
"name": "Remaining time"
|
||||||
|
},
|
||||||
|
"auto_shutdown": {
|
||||||
|
"name": "Auto shutdown"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"services": {
|
"services": {
|
||||||
"set_auto_off": {
|
"set_auto_off": {
|
||||||
"name": "Set auto off",
|
"name": "Set auto off",
|
||||||
|
@ -83,13 +83,15 @@ class SwitcherBaseSwitchEntity(
|
|||||||
):
|
):
|
||||||
"""Representation of a Switcher switch entity."""
|
"""Representation of a Switcher switch entity."""
|
||||||
|
|
||||||
|
_attr_has_entity_name = True
|
||||||
|
_attr_name = None
|
||||||
|
|
||||||
def __init__(self, coordinator: SwitcherDataUpdateCoordinator) -> None:
|
def __init__(self, coordinator: SwitcherDataUpdateCoordinator) -> None:
|
||||||
"""Initialize the entity."""
|
"""Initialize the entity."""
|
||||||
super().__init__(coordinator)
|
super().__init__(coordinator)
|
||||||
self.control_result: bool | None = None
|
self.control_result: bool | None = None
|
||||||
|
|
||||||
# Entity class attributes
|
# Entity class attributes
|
||||||
self._attr_name = coordinator.name
|
|
||||||
self._attr_unique_id = f"{coordinator.device_id}-{coordinator.mac_address}"
|
self._attr_unique_id = f"{coordinator.device_id}-{coordinator.mac_address}"
|
||||||
self._attr_device_info = DeviceInfo(
|
self._attr_device_info = DeviceInfo(
|
||||||
connections={(dr.CONNECTION_NETWORK_MAC, coordinator.mac_address)}
|
connections={(dr.CONNECTION_NETWORK_MAC, coordinator.mac_address)}
|
||||||
@ -118,7 +120,7 @@ class SwitcherBaseSwitchEntity(
|
|||||||
if error or not response or not response.successful:
|
if error or not response or not response.successful:
|
||||||
_LOGGER.error(
|
_LOGGER.error(
|
||||||
"Call api for %s failed, api: '%s', args: %s, response/error: %s",
|
"Call api for %s failed, api: '%s', args: %s, response/error: %s",
|
||||||
self.name,
|
self.coordinator.name,
|
||||||
api,
|
api,
|
||||||
args,
|
args,
|
||||||
response or error,
|
response or error,
|
||||||
@ -150,7 +152,7 @@ class SwitcherBaseSwitchEntity(
|
|||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Service '%s' is not supported by %s",
|
"Service '%s' is not supported by %s",
|
||||||
SERVICE_SET_AUTO_OFF_NAME,
|
SERVICE_SET_AUTO_OFF_NAME,
|
||||||
self.name,
|
self.coordinator.name,
|
||||||
)
|
)
|
||||||
|
|
||||||
async def async_turn_on_with_timer_service(self, timer_minutes: int) -> None:
|
async def async_turn_on_with_timer_service(self, timer_minutes: int) -> None:
|
||||||
@ -158,7 +160,7 @@ class SwitcherBaseSwitchEntity(
|
|||||||
_LOGGER.warning(
|
_LOGGER.warning(
|
||||||
"Service '%s' is not supported by %s",
|
"Service '%s' is not supported by %s",
|
||||||
SERVICE_TURN_ON_WITH_TIMER_NAME,
|
SERVICE_TURN_ON_WITH_TIMER_NAME,
|
||||||
self.name,
|
self.coordinator.name,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ async def test_update_fail(
|
|||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state == STATE_UNAVAILABLE
|
assert state.state == STATE_UNAVAILABLE
|
||||||
|
|
||||||
entity_id = f"sensor.{slugify(device.name)}_power_consumption"
|
entity_id = f"sensor.{slugify(device.name)}_power"
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state == STATE_UNAVAILABLE
|
assert state.state == STATE_UNAVAILABLE
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ async def test_update_fail(
|
|||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state != STATE_UNAVAILABLE
|
assert state.state != STATE_UNAVAILABLE
|
||||||
|
|
||||||
entity_id = f"sensor.{slugify(device.name)}_power_consumption"
|
entity_id = f"sensor.{slugify(device.name)}_power"
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state != STATE_UNAVAILABLE
|
assert state.state != STATE_UNAVAILABLE
|
||||||
|
|
||||||
|
@ -13,16 +13,16 @@ DEVICE_SENSORS_TUPLE = (
|
|||||||
(
|
(
|
||||||
DUMMY_PLUG_DEVICE,
|
DUMMY_PLUG_DEVICE,
|
||||||
[
|
[
|
||||||
"power_consumption",
|
("power", "power_consumption"),
|
||||||
"electric_current",
|
("current", "electric_current"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
DUMMY_WATER_HEATER_DEVICE,
|
DUMMY_WATER_HEATER_DEVICE,
|
||||||
[
|
[
|
||||||
"power_consumption",
|
("power", "power_consumption"),
|
||||||
"electric_current",
|
("current", "electric_current"),
|
||||||
"remaining_time",
|
("remaining_time", "remaining_time"),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@ -39,10 +39,10 @@ async def test_sensor_platform(hass: HomeAssistant, mock_bridge) -> None:
|
|||||||
assert len(hass.data[DOMAIN][DATA_DEVICE]) == 2
|
assert len(hass.data[DOMAIN][DATA_DEVICE]) == 2
|
||||||
|
|
||||||
for device, sensors in DEVICE_SENSORS_TUPLE:
|
for device, sensors in DEVICE_SENSORS_TUPLE:
|
||||||
for sensor in sensors:
|
for sensor, field in sensors:
|
||||||
entity_id = f"sensor.{slugify(device.name)}_{sensor}"
|
entity_id = f"sensor.{slugify(device.name)}_{sensor}"
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state == str(getattr(device, sensor))
|
assert state.state == str(getattr(device, field))
|
||||||
|
|
||||||
|
|
||||||
async def test_sensor_disabled(hass: HomeAssistant, mock_bridge) -> None:
|
async def test_sensor_disabled(hass: HomeAssistant, mock_bridge) -> None:
|
||||||
@ -80,13 +80,13 @@ async def test_sensor_update(hass: HomeAssistant, mock_bridge, monkeypatch) -> N
|
|||||||
assert mock_bridge
|
assert mock_bridge
|
||||||
|
|
||||||
device = DUMMY_WATER_HEATER_DEVICE
|
device = DUMMY_WATER_HEATER_DEVICE
|
||||||
sensor = "power_consumption"
|
field = "power_consumption"
|
||||||
entity_id = f"sensor.{slugify(device.name)}_{sensor}"
|
entity_id = f"sensor.{slugify(device.name)}_power"
|
||||||
|
|
||||||
state = hass.states.get(entity_id)
|
state = hass.states.get(entity_id)
|
||||||
assert state.state == str(getattr(device, sensor))
|
assert state.state == str(getattr(device, field))
|
||||||
|
|
||||||
monkeypatch.setattr(device, sensor, 1431)
|
monkeypatch.setattr(device, field, 1431)
|
||||||
mock_bridge.mock_callbacks([DUMMY_WATER_HEATER_DEVICE])
|
mock_bridge.mock_callbacks([DUMMY_WATER_HEATER_DEVICE])
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user