mirror of
https://github.com/home-assistant/core.git
synced 2025-07-16 09:47:13 +00:00
Fix Ecovacs mower area sensors (#145071)
This commit is contained in:
parent
8c4eec231f
commit
34455f9743
@ -6,7 +6,8 @@ from collections.abc import Callable
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Any, Generic
|
from typing import Any, Generic
|
||||||
|
|
||||||
from deebot_client.capabilities import CapabilityEvent, CapabilityLifeSpan
|
from deebot_client.capabilities import CapabilityEvent, CapabilityLifeSpan, DeviceType
|
||||||
|
from deebot_client.device import Device
|
||||||
from deebot_client.events import (
|
from deebot_client.events import (
|
||||||
BatteryEvent,
|
BatteryEvent,
|
||||||
ErrorEvent,
|
ErrorEvent,
|
||||||
@ -34,7 +35,7 @@ from homeassistant.const import (
|
|||||||
UnitOfArea,
|
UnitOfArea,
|
||||||
UnitOfTime,
|
UnitOfTime,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant, callback
|
||||||
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
|
||||||
from homeassistant.helpers.typing import StateType
|
from homeassistant.helpers.typing import StateType
|
||||||
|
|
||||||
@ -59,6 +60,15 @@ class EcovacsSensorEntityDescription(
|
|||||||
"""Ecovacs sensor entity description."""
|
"""Ecovacs sensor entity description."""
|
||||||
|
|
||||||
value_fn: Callable[[EventT], StateType]
|
value_fn: Callable[[EventT], StateType]
|
||||||
|
native_unit_of_measurement_fn: Callable[[DeviceType], str | None] | None = None
|
||||||
|
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def get_area_native_unit_of_measurement(device_type: DeviceType) -> str | None:
|
||||||
|
"""Get the area native unit of measurement based on device type."""
|
||||||
|
if device_type is DeviceType.MOWER:
|
||||||
|
return UnitOfArea.SQUARE_CENTIMETERS
|
||||||
|
return UnitOfArea.SQUARE_METERS
|
||||||
|
|
||||||
|
|
||||||
ENTITY_DESCRIPTIONS: tuple[EcovacsSensorEntityDescription, ...] = (
|
ENTITY_DESCRIPTIONS: tuple[EcovacsSensorEntityDescription, ...] = (
|
||||||
@ -68,7 +78,7 @@ ENTITY_DESCRIPTIONS: tuple[EcovacsSensorEntityDescription, ...] = (
|
|||||||
capability_fn=lambda caps: caps.stats.clean,
|
capability_fn=lambda caps: caps.stats.clean,
|
||||||
value_fn=lambda e: e.area,
|
value_fn=lambda e: e.area,
|
||||||
translation_key="stats_area",
|
translation_key="stats_area",
|
||||||
native_unit_of_measurement=UnitOfArea.SQUARE_METERS,
|
native_unit_of_measurement_fn=get_area_native_unit_of_measurement,
|
||||||
),
|
),
|
||||||
EcovacsSensorEntityDescription[StatsEvent](
|
EcovacsSensorEntityDescription[StatsEvent](
|
||||||
key="stats_time",
|
key="stats_time",
|
||||||
@ -85,7 +95,7 @@ ENTITY_DESCRIPTIONS: tuple[EcovacsSensorEntityDescription, ...] = (
|
|||||||
value_fn=lambda e: e.area,
|
value_fn=lambda e: e.area,
|
||||||
key="total_stats_area",
|
key="total_stats_area",
|
||||||
translation_key="total_stats_area",
|
translation_key="total_stats_area",
|
||||||
native_unit_of_measurement=UnitOfArea.SQUARE_METERS,
|
native_unit_of_measurement_fn=get_area_native_unit_of_measurement,
|
||||||
state_class=SensorStateClass.TOTAL_INCREASING,
|
state_class=SensorStateClass.TOTAL_INCREASING,
|
||||||
),
|
),
|
||||||
EcovacsSensorEntityDescription[TotalStatsEvent](
|
EcovacsSensorEntityDescription[TotalStatsEvent](
|
||||||
@ -249,6 +259,27 @@ class EcovacsSensor(
|
|||||||
|
|
||||||
entity_description: EcovacsSensorEntityDescription
|
entity_description: EcovacsSensorEntityDescription
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
device: Device,
|
||||||
|
capability: CapabilityEvent,
|
||||||
|
entity_description: EcovacsSensorEntityDescription,
|
||||||
|
**kwargs: Any,
|
||||||
|
) -> None:
|
||||||
|
"""Initialize entity."""
|
||||||
|
super().__init__(device, capability, entity_description, **kwargs)
|
||||||
|
if (
|
||||||
|
entity_description.native_unit_of_measurement_fn
|
||||||
|
and (
|
||||||
|
native_unit_of_measurement
|
||||||
|
:= entity_description.native_unit_of_measurement_fn(
|
||||||
|
device.capabilities.device_type
|
||||||
|
)
|
||||||
|
)
|
||||||
|
is not None
|
||||||
|
):
|
||||||
|
self._attr_native_unit_of_measurement = native_unit_of_measurement
|
||||||
|
|
||||||
async def async_added_to_hass(self) -> None:
|
async def async_added_to_hass(self) -> None:
|
||||||
"""Set up the event listeners now that hass is ready."""
|
"""Set up the event listeners now that hass is ready."""
|
||||||
await super().async_added_to_hass()
|
await super().async_added_to_hass()
|
||||||
|
@ -181,14 +181,14 @@
|
|||||||
'supported_features': 0,
|
'supported_features': 0,
|
||||||
'translation_key': 'stats_area',
|
'translation_key': 'stats_area',
|
||||||
'unique_id': '8516fbb1-17f1-4194-0000000_stats_area',
|
'unique_id': '8516fbb1-17f1-4194-0000000_stats_area',
|
||||||
'unit_of_measurement': <UnitOfArea.SQUARE_METERS: 'm²'>,
|
'unit_of_measurement': <UnitOfArea.SQUARE_CENTIMETERS: 'cm²'>,
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
# name: test_sensors[5xu9h3][sensor.goat_g1_area_cleaned:state]
|
# name: test_sensors[5xu9h3][sensor.goat_g1_area_cleaned:state]
|
||||||
StateSnapshot({
|
StateSnapshot({
|
||||||
'attributes': ReadOnlyDict({
|
'attributes': ReadOnlyDict({
|
||||||
'friendly_name': 'Goat G1 Area cleaned',
|
'friendly_name': 'Goat G1 Area cleaned',
|
||||||
'unit_of_measurement': <UnitOfArea.SQUARE_METERS: 'm²'>,
|
'unit_of_measurement': <UnitOfArea.SQUARE_CENTIMETERS: 'cm²'>,
|
||||||
}),
|
}),
|
||||||
'context': <ANY>,
|
'context': <ANY>,
|
||||||
'entity_id': 'sensor.goat_g1_area_cleaned',
|
'entity_id': 'sensor.goat_g1_area_cleaned',
|
||||||
@ -523,7 +523,7 @@
|
|||||||
'supported_features': 0,
|
'supported_features': 0,
|
||||||
'translation_key': 'total_stats_area',
|
'translation_key': 'total_stats_area',
|
||||||
'unique_id': '8516fbb1-17f1-4194-0000000_total_stats_area',
|
'unique_id': '8516fbb1-17f1-4194-0000000_total_stats_area',
|
||||||
'unit_of_measurement': <UnitOfArea.SQUARE_METERS: 'm²'>,
|
'unit_of_measurement': <UnitOfArea.SQUARE_CENTIMETERS: 'cm²'>,
|
||||||
})
|
})
|
||||||
# ---
|
# ---
|
||||||
# name: test_sensors[5xu9h3][sensor.goat_g1_total_area_cleaned:state]
|
# name: test_sensors[5xu9h3][sensor.goat_g1_total_area_cleaned:state]
|
||||||
@ -531,7 +531,7 @@
|
|||||||
'attributes': ReadOnlyDict({
|
'attributes': ReadOnlyDict({
|
||||||
'friendly_name': 'Goat G1 Total area cleaned',
|
'friendly_name': 'Goat G1 Total area cleaned',
|
||||||
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
|
'state_class': <SensorStateClass.TOTAL_INCREASING: 'total_increasing'>,
|
||||||
'unit_of_measurement': <UnitOfArea.SQUARE_METERS: 'm²'>,
|
'unit_of_measurement': <UnitOfArea.SQUARE_CENTIMETERS: 'cm²'>,
|
||||||
}),
|
}),
|
||||||
'context': <ANY>,
|
'context': <ANY>,
|
||||||
'entity_id': 'sensor.goat_g1_total_area_cleaned',
|
'entity_id': 'sensor.goat_g1_total_area_cleaned',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user