Create base class for Rachio smart hose timer entities (#115475)

This commit is contained in:
Brian Rogers 2024-04-15 15:22:44 -04:00 committed by GitHub
parent 2c6ec506ad
commit c7e6f3696f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 67 additions and 44 deletions

View File

@ -350,11 +350,9 @@ class RachioBaseStation:
def __init__( def __init__(
self, rachio: Rachio, data: dict[str, Any], coordinator: RachioUpdateCoordinator self, rachio: Rachio, data: dict[str, Any], coordinator: RachioUpdateCoordinator
) -> None: ) -> None:
"""Initialize a hose time base station.""" """Initialize a smart hose timer base station."""
self.rachio = rachio self.rachio = rachio
self._id = data[KEY_ID] self._id = data[KEY_ID]
self.serial_number = data[KEY_SERIAL_NUMBER]
self.mac_address = data[KEY_MAC_ADDRESS]
self.coordinator = coordinator self.coordinator = coordinator
def start_watering(self, valve_id: str, duration: int) -> None: def start_watering(self, valve_id: str, duration: int) -> None:

View File

@ -1,10 +1,24 @@
"""Adapter to wrap the rachiopy api for home assistant.""" """Adapter to wrap the rachiopy api for home assistant."""
from abc import abstractmethod
from typing import Any
from homeassistant.core import callback
from homeassistant.helpers import device_registry as dr from homeassistant.helpers import device_registry as dr
from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import DEFAULT_NAME, DOMAIN from .const import (
DEFAULT_NAME,
DOMAIN,
KEY_CONNECTED,
KEY_ID,
KEY_NAME,
KEY_REPORTED_STATE,
KEY_STATE,
)
from .coordinator import RachioUpdateCoordinator
from .device import RachioIro from .device import RachioIro
@ -35,3 +49,44 @@ class RachioDevice(Entity):
manufacturer=DEFAULT_NAME, manufacturer=DEFAULT_NAME,
configuration_url="https://app.rach.io", configuration_url="https://app.rach.io",
) )
class RachioHoseTimerEntity(CoordinatorEntity[RachioUpdateCoordinator]):
"""Base class for smart hose timer entities."""
_attr_has_entity_name = True
def __init__(
self, data: dict[str, Any], coordinator: RachioUpdateCoordinator
) -> None:
"""Initialize a Rachio smart hose timer entity."""
super().__init__(coordinator)
self.id = data[KEY_ID]
self._name = data[KEY_NAME]
self._attr_device_info = DeviceInfo(
identifiers={(DOMAIN, self.id)},
model="Smart Hose Timer",
name=self._name,
manufacturer=DEFAULT_NAME,
configuration_url="https://app.rach.io",
)
@property
def available(self) -> bool:
"""Return if the entity is available."""
return (
super().available
and self.coordinator.data[self.id][KEY_STATE][KEY_REPORTED_STATE][
KEY_CONNECTED
]
)
@abstractmethod
def _update_attr(self) -> None:
"""Update the state and attributes."""
@callback
def _handle_coordinator_update(self) -> None:
"""Handle updated data from the coordinator."""
self._update_attr()
super()._handle_coordinator_update()

View File

@ -13,25 +13,17 @@ from homeassistant.config_entries import ConfigEntry
from homeassistant.const import ATTR_ENTITY_ID, ATTR_ID from homeassistant.const import ATTR_ENTITY_ID, ATTR_ID
from homeassistant.core import CALLBACK_TYPE, HomeAssistant, ServiceCall, callback from homeassistant.core import CALLBACK_TYPE, HomeAssistant, ServiceCall, callback
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers import ( from homeassistant.helpers import config_validation as cv, entity_platform
config_validation as cv,
device_registry as dr,
entity_platform,
)
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.event import async_track_point_in_utc_time from homeassistant.helpers.event import async_track_point_in_utc_time
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from homeassistant.util.dt import as_timestamp, now, parse_datetime, utc_from_timestamp from homeassistant.util.dt import as_timestamp, now, parse_datetime, utc_from_timestamp
from .const import ( from .const import (
CONF_MANUAL_RUN_MINS, CONF_MANUAL_RUN_MINS,
DEFAULT_MANUAL_RUN_MINS, DEFAULT_MANUAL_RUN_MINS,
DEFAULT_NAME,
DOMAIN as DOMAIN_RACHIO, DOMAIN as DOMAIN_RACHIO,
KEY_CONNECTED,
KEY_CURRENT_STATUS, KEY_CURRENT_STATUS,
KEY_CUSTOM_CROP, KEY_CUSTOM_CROP,
KEY_CUSTOM_SHADE, KEY_CUSTOM_SHADE,
@ -67,9 +59,8 @@ from .const import (
SLOPE_SLIGHT, SLOPE_SLIGHT,
SLOPE_STEEP, SLOPE_STEEP,
) )
from .coordinator import RachioUpdateCoordinator
from .device import RachioPerson from .device import RachioPerson
from .entity import RachioDevice from .entity import RachioDevice, RachioHoseTimerEntity
from .webhooks import ( from .webhooks import (
SUBTYPE_RAIN_DELAY_OFF, SUBTYPE_RAIN_DELAY_OFF,
SUBTYPE_RAIN_DELAY_ON, SUBTYPE_RAIN_DELAY_ON,
@ -546,39 +537,19 @@ class RachioSchedule(RachioSwitch):
) )
class RachioValve(CoordinatorEntity[RachioUpdateCoordinator], SwitchEntity): class RachioValve(RachioHoseTimerEntity, SwitchEntity):
"""Representation of one smart hose timer valve.""" """Representation of one smart hose timer valve."""
def __init__( _attr_name = None
self, person, base, data, coordinator: RachioUpdateCoordinator
) -> None: def __init__(self, person, base, data, coordinator) -> None:
"""Initialize a new smart hose valve.""" """Initialize a new smart hose valve."""
super().__init__(coordinator) super().__init__(data, coordinator)
self._person = person self._person = person
self._base = base self._base = base
self.id = data[KEY_ID]
self._attr_name = data[KEY_NAME]
self._attr_unique_id = f"{self.id}-valve" self._attr_unique_id = f"{self.id}-valve"
self._static_attrs = data[KEY_STATE][KEY_REPORTED_STATE] self._static_attrs = data[KEY_STATE][KEY_REPORTED_STATE]
self._attr_is_on = KEY_CURRENT_STATUS in self._static_attrs self._attr_is_on = KEY_CURRENT_STATUS in self._static_attrs
self._attr_device_info = DeviceInfo(
identifiers={
(
DOMAIN_RACHIO,
self.id,
)
},
connections={(dr.CONNECTION_NETWORK_MAC, self._base.mac_address)},
manufacturer=DEFAULT_NAME,
model="Smart Hose Timer",
name=self._attr_name,
configuration_url="https://app.rach.io",
)
@property
def available(self) -> bool:
"""Return if the valve is available."""
return super().available and self._static_attrs[KEY_CONNECTED]
def turn_on(self, **kwargs: Any) -> None: def turn_on(self, **kwargs: Any) -> None:
"""Turn on this valve.""" """Turn on this valve."""
@ -594,20 +565,19 @@ class RachioValve(CoordinatorEntity[RachioUpdateCoordinator], SwitchEntity):
self._base.start_watering(self.id, manual_run_time.seconds) self._base.start_watering(self.id, manual_run_time.seconds)
self._attr_is_on = True self._attr_is_on = True
self.schedule_update_ha_state(force_refresh=True) self.schedule_update_ha_state(force_refresh=True)
_LOGGER.debug("Starting valve %s for %s", self.name, str(manual_run_time)) _LOGGER.debug("Starting valve %s for %s", self._name, str(manual_run_time))
def turn_off(self, **kwargs: Any) -> None: def turn_off(self, **kwargs: Any) -> None:
"""Turn off this valve.""" """Turn off this valve."""
self._base.stop_watering(self.id) self._base.stop_watering(self.id)
self._attr_is_on = False self._attr_is_on = False
self.schedule_update_ha_state(force_refresh=True) self.schedule_update_ha_state(force_refresh=True)
_LOGGER.debug("Stopping watering on valve %s", self.name) _LOGGER.debug("Stopping watering on valve %s", self._name)
@callback @callback
def _handle_coordinator_update(self) -> None: def _update_attr(self) -> None:
"""Handle updated coordinator data.""" """Handle updated coordinator data."""
data = self.coordinator.data[self.id] data = self.coordinator.data[self.id]
self._static_attrs = data[KEY_STATE][KEY_REPORTED_STATE] self._static_attrs = data[KEY_STATE][KEY_REPORTED_STATE]
self._attr_is_on = KEY_CURRENT_STATUS in self._static_attrs self._attr_is_on = KEY_CURRENT_STATUS in self._static_attrs
super()._handle_coordinator_update()