Skip to content

Commit

Permalink
yet another attempt
Browse files Browse the repository at this point in the history
  • Loading branch information
kdeyev committed Jun 25, 2024
1 parent ab08733 commit b6eb958
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 14 deletions.
4 changes: 2 additions & 2 deletions custom_components/eyeonwater/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from pyonwater import Meter

from .const import DATA_COORDINATOR, DATA_SMART_METER, DOMAIN, WATER_METER_NAME
from .statistic_helper import normalize_id


@dataclass
Expand Down Expand Up @@ -98,8 +99,7 @@ def __init__(
translation_key=description.translation_key,
)
self.meter = meter
chars = [c if c.isalnum() or c == "_" else "_" for c in meter.meter_uuid]
self._uuid = "".join(chars)
self._uuid = normalize_id(meter.meter_uuid)
self._state = False
self._available = False
self._attr_unique_id = f"{description.key}_{self._uuid}"
Expand Down
21 changes: 13 additions & 8 deletions custom_components/eyeonwater/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
get_ha_native_unit_of_measurement,
get_last_imported_time,
get_statistic_metadata,
normalize_id,
)

if TYPE_CHECKING:
Expand Down Expand Up @@ -58,7 +59,8 @@ async def async_setup_entry(
),
)
sensors.append(EyeOnWaterSensor(meter, coordinator))
sensors.append(EyeOnWaterTempSensor(meter, coordinator))
if meter.meter_info.sensors and meter.meter_info.sensors.endpoint_temperature:
sensors.append(EyeOnWaterTempSensor(meter, coordinator))

async_add_entities(sensors, update_before_add=False)

Expand All @@ -79,8 +81,7 @@ def __init__(
"""Initialize the sensor."""
super().__init__(coordinator)
self.meter = meter
chars = [c if c.isalnum() or c == "_" else "_" for c in meter.meter_uuid]
self._uuid = "".join(chars)
self._uuid = normalize_id(meter.meter_uuid)

self._state: pyonwater.DataPoint | None = None
self._available = False
Expand Down Expand Up @@ -175,8 +176,7 @@ def __init__(
"""Initialize the sensor."""
super().__init__(coordinator)
self.meter = meter
chars = [c if c.isalnum() or c == "_" else "_" for c in meter.meter_uuid]
self._uuid = "".join(chars)
self._uuid = normalize_id(meter.meter_uuid)

self._attr_unique_id = f"{self._uuid}_temperature"
self._attr_device_info = DeviceInfo(
Expand All @@ -191,7 +191,13 @@ def __init__(
@property
def native_value(self) -> float | None:
"""Get native value."""
return self.meter.meter_info.sensors.endpoint_temperature.seven_day_min
if (
self.meter.meter_info.sensors
and self.meter.meter_info.sensors.endpoint_temperature
):
return self.meter.meter_info.sensors.endpoint_temperature.seven_day_min

return None


class EyeOnWaterSensor(CoordinatorEntity, SensorEntity):
Expand All @@ -210,8 +216,7 @@ def __init__(
"""Initialize the sensor."""
super().__init__(coordinator)
self.meter = meter
chars = [c if c.isalnum() or c == "_" else "_" for c in meter.meter_uuid]
self._uuid = "".join(chars)
self._uuid = normalize_id(meter.meter_uuid)

self._state: pyonwater.DataPoint | None = None
self._available = False
Expand Down
21 changes: 17 additions & 4 deletions custom_components/eyeonwater/statistic_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from homeassistant.components.recorder.models import StatisticData, StatisticMetaData
from homeassistant.components.recorder.statistics import get_last_statistics
from homeassistant.const import UnitOfVolume
from homeassistant.core import valid_entity_id
from homeassistant.util import dt as dtutil
from pyonwater import DataPoint, Meter

Expand Down Expand Up @@ -43,15 +44,27 @@ def get_statistic_name(meter_id: str) -> str:
return f"{WATER_METER_NAME} {meter_id} Statistic"


def get_statistics_id(meter_id: str) -> str:
def normalize_id(uuid: str) -> str:
"""Normalize ID."""
chars = [c if c.isalnum() or c == "_" else "_" for c in uuid]
uuid = "".join(chars)
return uuid.lower()


def get_statistics_id(meter_uuid: str) -> str:
"""Generate statistic ID for a meter."""
return f"sensor.water_meter_{meter_id.lower()}_statistic"
meter_uuid = normalize_id(meter_uuid)
return f"sensor.water_meter_{meter_uuid}_statistic"


def get_statistic_metadata(meter: Meter) -> StatisticMetaData:
"""Build statistic metadata for a given meter."""
name = get_statistic_name(meter_id=meter.meter_id)
statistic_id = get_statistics_id(meter.meter_id)
statistic_id = get_statistics_id(meter.meter_uuid) # should it be meter id or uuid?

if not valid_entity_id(statistic_id):
msg = "Invalid statistic_id {statistic_id} for meter {meter.meter_id}"
raise Exception(msg) # noqa: TRY002

return StatisticMetaData(
has_mean=False,
Expand Down Expand Up @@ -84,7 +97,7 @@ async def get_last_imported_time(
"""Return last imported data datetime."""
# https://github.com/home-assistant/core/blob/74e2d5c5c312cf3ba154b5206ceb19ba884c6fb4/homeassistant/components/tibber/sensor.py#L11

statistic_id = get_statistics_id(meter.meter_id)
statistic_id = get_statistics_id(meter.meter_uuid) # should it be meter id or uuid?
last_stats = await get_instance(hass).async_add_executor_job(
get_last_statistics,
hass,
Expand Down

0 comments on commit b6eb958

Please sign in to comment.