mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Replace two RainMachine binary sensors with config switches (#76478)
This commit is contained in:
parent
a495df9759
commit
55b214c911
@ -2,6 +2,7 @@
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
from homeassistant.components.binary_sensor import (
|
from homeassistant.components.binary_sensor import (
|
||||||
|
DOMAIN as BINARY_SENSOR_DOMAIN,
|
||||||
BinarySensorEntity,
|
BinarySensorEntity,
|
||||||
BinarySensorEntityDescription,
|
BinarySensorEntityDescription,
|
||||||
)
|
)
|
||||||
@ -21,7 +22,11 @@ from .model import (
|
|||||||
RainMachineEntityDescription,
|
RainMachineEntityDescription,
|
||||||
RainMachineEntityDescriptionMixinDataKey,
|
RainMachineEntityDescriptionMixinDataKey,
|
||||||
)
|
)
|
||||||
from .util import key_exists
|
from .util import (
|
||||||
|
EntityDomainReplacementStrategy,
|
||||||
|
async_finish_entity_domain_replacements,
|
||||||
|
key_exists,
|
||||||
|
)
|
||||||
|
|
||||||
TYPE_FLOW_SENSOR = "flow_sensor"
|
TYPE_FLOW_SENSOR = "flow_sensor"
|
||||||
TYPE_FREEZE = "freeze"
|
TYPE_FREEZE = "freeze"
|
||||||
@ -125,6 +130,27 @@ async def async_setup_entry(
|
|||||||
"""Set up RainMachine binary sensors based on a config entry."""
|
"""Set up RainMachine binary sensors based on a config entry."""
|
||||||
data: RainMachineData = hass.data[DOMAIN][entry.entry_id]
|
data: RainMachineData = hass.data[DOMAIN][entry.entry_id]
|
||||||
|
|
||||||
|
async_finish_entity_domain_replacements(
|
||||||
|
hass,
|
||||||
|
entry,
|
||||||
|
(
|
||||||
|
EntityDomainReplacementStrategy(
|
||||||
|
BINARY_SENSOR_DOMAIN,
|
||||||
|
f"{data.controller.mac}_freeze_protection",
|
||||||
|
f"switch.{data.controller.name.lower()}_freeze_protect_enabled",
|
||||||
|
breaks_in_ha_version="2022.12.0",
|
||||||
|
remove_old_entity=False,
|
||||||
|
),
|
||||||
|
EntityDomainReplacementStrategy(
|
||||||
|
BINARY_SENSOR_DOMAIN,
|
||||||
|
f"{data.controller.mac}_extra_water_on_hot_days",
|
||||||
|
f"switch.{data.controller.name.lower()}_hot_days_extra_watering",
|
||||||
|
breaks_in_ha_version="2022.12.0",
|
||||||
|
remove_old_entity=False,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
api_category_sensor_map = {
|
api_category_sensor_map = {
|
||||||
DATA_PROVISION_SETTINGS: ProvisionSettingsBinarySensor,
|
DATA_PROVISION_SETTINGS: ProvisionSettingsBinarySensor,
|
||||||
DATA_RESTRICTIONS_CURRENT: CurrentRestrictionsBinarySensor,
|
DATA_RESTRICTIONS_CURRENT: CurrentRestrictionsBinarySensor,
|
||||||
|
@ -24,11 +24,16 @@ from . import RainMachineData, RainMachineEntity, async_update_programs_and_zone
|
|||||||
from .const import (
|
from .const import (
|
||||||
CONF_ZONE_RUN_TIME,
|
CONF_ZONE_RUN_TIME,
|
||||||
DATA_PROGRAMS,
|
DATA_PROGRAMS,
|
||||||
|
DATA_RESTRICTIONS_UNIVERSAL,
|
||||||
DATA_ZONES,
|
DATA_ZONES,
|
||||||
DEFAULT_ZONE_RUN,
|
DEFAULT_ZONE_RUN,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
)
|
)
|
||||||
from .model import RainMachineEntityDescription, RainMachineEntityDescriptionMixinUid
|
from .model import (
|
||||||
|
RainMachineEntityDescription,
|
||||||
|
RainMachineEntityDescriptionMixinDataKey,
|
||||||
|
RainMachineEntityDescriptionMixinUid,
|
||||||
|
)
|
||||||
from .util import RUN_STATE_MAP
|
from .util import RUN_STATE_MAP
|
||||||
|
|
||||||
ATTR_AREA = "area"
|
ATTR_AREA = "area"
|
||||||
@ -130,11 +135,45 @@ def raise_on_request_error(
|
|||||||
class RainMachineSwitchDescription(
|
class RainMachineSwitchDescription(
|
||||||
SwitchEntityDescription,
|
SwitchEntityDescription,
|
||||||
RainMachineEntityDescription,
|
RainMachineEntityDescription,
|
||||||
RainMachineEntityDescriptionMixinUid,
|
|
||||||
):
|
):
|
||||||
"""Describe a RainMachine switch."""
|
"""Describe a RainMachine switch."""
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RainMachineActivitySwitchDescription(
|
||||||
|
RainMachineSwitchDescription, RainMachineEntityDescriptionMixinUid
|
||||||
|
):
|
||||||
|
"""Describe a RainMachine activity (program/zone) switch."""
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RainMachineRestrictionSwitchDescription(
|
||||||
|
RainMachineSwitchDescription, RainMachineEntityDescriptionMixinDataKey
|
||||||
|
):
|
||||||
|
"""Describe a RainMachine restriction switch."""
|
||||||
|
|
||||||
|
|
||||||
|
TYPE_RESTRICTIONS_FREEZE_PROTECT_ENABLED = "freeze_protect_enabled"
|
||||||
|
TYPE_RESTRICTIONS_HOT_DAYS_EXTRA_WATERING = "hot_days_extra_watering"
|
||||||
|
|
||||||
|
RESTRICTIONS_SWITCH_DESCRIPTIONS = (
|
||||||
|
RainMachineRestrictionSwitchDescription(
|
||||||
|
key=TYPE_RESTRICTIONS_FREEZE_PROTECT_ENABLED,
|
||||||
|
name="Freeze protection",
|
||||||
|
icon="mdi:snowflake-alert",
|
||||||
|
api_category=DATA_RESTRICTIONS_UNIVERSAL,
|
||||||
|
data_key="freezeProtectEnabled",
|
||||||
|
),
|
||||||
|
RainMachineRestrictionSwitchDescription(
|
||||||
|
key=TYPE_RESTRICTIONS_HOT_DAYS_EXTRA_WATERING,
|
||||||
|
name="Extra water on hot days",
|
||||||
|
icon="mdi:heat-wave",
|
||||||
|
api_category=DATA_RESTRICTIONS_UNIVERSAL,
|
||||||
|
data_key="hotDaysExtraWatering",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def async_setup_entry(
|
async def async_setup_entry(
|
||||||
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
||||||
) -> None:
|
) -> None:
|
||||||
@ -158,8 +197,8 @@ async def async_setup_entry(
|
|||||||
platform.async_register_entity_service(service_name, schema, method)
|
platform.async_register_entity_service(service_name, schema, method)
|
||||||
|
|
||||||
data: RainMachineData = hass.data[DOMAIN][entry.entry_id]
|
data: RainMachineData = hass.data[DOMAIN][entry.entry_id]
|
||||||
|
entities: list[RainMachineBaseSwitch] = []
|
||||||
|
|
||||||
entities: list[RainMachineActivitySwitch | RainMachineEnabledSwitch] = []
|
|
||||||
for kind, api_category, switch_class, switch_enabled_class in (
|
for kind, api_category, switch_class, switch_enabled_class in (
|
||||||
("program", DATA_PROGRAMS, RainMachineProgram, RainMachineProgramEnabled),
|
("program", DATA_PROGRAMS, RainMachineProgram, RainMachineProgramEnabled),
|
||||||
("zone", DATA_ZONES, RainMachineZone, RainMachineZoneEnabled),
|
("zone", DATA_ZONES, RainMachineZone, RainMachineZoneEnabled),
|
||||||
@ -173,10 +212,9 @@ async def async_setup_entry(
|
|||||||
switch_class(
|
switch_class(
|
||||||
entry,
|
entry,
|
||||||
data,
|
data,
|
||||||
RainMachineSwitchDescription(
|
RainMachineActivitySwitchDescription(
|
||||||
key=f"{kind}_{uid}",
|
key=f"{kind}_{uid}",
|
||||||
name=name,
|
name=name,
|
||||||
icon="mdi:water",
|
|
||||||
api_category=api_category,
|
api_category=api_category,
|
||||||
uid=uid,
|
uid=uid,
|
||||||
),
|
),
|
||||||
@ -188,17 +226,19 @@ async def async_setup_entry(
|
|||||||
switch_enabled_class(
|
switch_enabled_class(
|
||||||
entry,
|
entry,
|
||||||
data,
|
data,
|
||||||
RainMachineSwitchDescription(
|
RainMachineActivitySwitchDescription(
|
||||||
key=f"{kind}_{uid}_enabled",
|
key=f"{kind}_{uid}_enabled",
|
||||||
name=f"{name} enabled",
|
name=f"{name} enabled",
|
||||||
entity_category=EntityCategory.CONFIG,
|
|
||||||
icon="mdi:cog",
|
|
||||||
api_category=api_category,
|
api_category=api_category,
|
||||||
uid=uid,
|
uid=uid,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Add switches to control restrictions:
|
||||||
|
for description in RESTRICTIONS_SWITCH_DESCRIPTIONS:
|
||||||
|
entities.append(RainMachineRestrictionSwitch(entry, data, description))
|
||||||
|
|
||||||
async_add_entities(entities)
|
async_add_entities(entities)
|
||||||
|
|
||||||
|
|
||||||
@ -246,6 +286,9 @@ class RainMachineBaseSwitch(RainMachineEntity, SwitchEntity):
|
|||||||
class RainMachineActivitySwitch(RainMachineBaseSwitch):
|
class RainMachineActivitySwitch(RainMachineBaseSwitch):
|
||||||
"""Define a RainMachine switch to start/stop an activity (program or zone)."""
|
"""Define a RainMachine switch to start/stop an activity (program or zone)."""
|
||||||
|
|
||||||
|
_attr_icon = "mdi:water"
|
||||||
|
entity_description: RainMachineActivitySwitchDescription
|
||||||
|
|
||||||
async def async_turn_off(self, **kwargs: Any) -> None:
|
async def async_turn_off(self, **kwargs: Any) -> None:
|
||||||
"""Turn the switch off.
|
"""Turn the switch off.
|
||||||
|
|
||||||
@ -284,6 +327,10 @@ class RainMachineActivitySwitch(RainMachineBaseSwitch):
|
|||||||
class RainMachineEnabledSwitch(RainMachineBaseSwitch):
|
class RainMachineEnabledSwitch(RainMachineBaseSwitch):
|
||||||
"""Define a RainMachine switch to enable/disable an activity (program or zone)."""
|
"""Define a RainMachine switch to enable/disable an activity (program or zone)."""
|
||||||
|
|
||||||
|
_attr_entity_category = EntityCategory.CONFIG
|
||||||
|
_attr_icon = "mdi:cog"
|
||||||
|
entity_description: RainMachineActivitySwitchDescription
|
||||||
|
|
||||||
@callback
|
@callback
|
||||||
def update_from_latest_data(self) -> None:
|
def update_from_latest_data(self) -> None:
|
||||||
"""Update the entity when new data is received."""
|
"""Update the entity when new data is received."""
|
||||||
@ -360,6 +407,36 @@ class RainMachineProgramEnabled(RainMachineEnabledSwitch):
|
|||||||
self._update_activities()
|
self._update_activities()
|
||||||
|
|
||||||
|
|
||||||
|
class RainMachineRestrictionSwitch(RainMachineBaseSwitch):
|
||||||
|
"""Define a RainMachine restriction setting."""
|
||||||
|
|
||||||
|
_attr_entity_category = EntityCategory.CONFIG
|
||||||
|
entity_description: RainMachineRestrictionSwitchDescription
|
||||||
|
|
||||||
|
@raise_on_request_error
|
||||||
|
async def async_turn_off(self, **kwargs: Any) -> None:
|
||||||
|
"""Disable the restriction."""
|
||||||
|
await self._data.controller.restrictions.set_universal(
|
||||||
|
{self.entity_description.data_key: False}
|
||||||
|
)
|
||||||
|
self._attr_is_on = False
|
||||||
|
self.async_write_ha_state()
|
||||||
|
|
||||||
|
@raise_on_request_error
|
||||||
|
async def async_turn_on(self, **kwargs: Any) -> None:
|
||||||
|
"""Enable the restriction."""
|
||||||
|
await self._data.controller.restrictions.set_universal(
|
||||||
|
{self.entity_description.data_key: True}
|
||||||
|
)
|
||||||
|
self._attr_is_on = True
|
||||||
|
self.async_write_ha_state()
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def update_from_latest_data(self) -> None:
|
||||||
|
"""Update the entity when new data is received."""
|
||||||
|
self._attr_is_on = self.coordinator.data[self.entity_description.data_key]
|
||||||
|
|
||||||
|
|
||||||
class RainMachineZone(RainMachineActivitySwitch):
|
class RainMachineZone(RainMachineActivitySwitch):
|
||||||
"""Define a RainMachine zone."""
|
"""Define a RainMachine zone."""
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user