Co-authored-by: Robert Svensson <Kane610@users.noreply.github.com>
This commit is contained in:
parent
1b17c83095
commit
81abeac83e
37 changed files with 2915 additions and 1279 deletions
|
@ -3,29 +3,20 @@ from __future__ import annotations
|
|||
|
||||
import logging
|
||||
|
||||
import pyatmo
|
||||
|
||||
from homeassistant.components.select import SelectEntity
|
||||
from homeassistant.config_entries import ConfigEntry
|
||||
from homeassistant.core import HomeAssistant, callback
|
||||
from homeassistant.exceptions import PlatformNotReady
|
||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect
|
||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||
|
||||
from .const import (
|
||||
DATA_HANDLER,
|
||||
CONF_URL_ENERGY,
|
||||
DATA_SCHEDULES,
|
||||
DOMAIN,
|
||||
EVENT_TYPE_SCHEDULE,
|
||||
MANUFACTURER,
|
||||
SIGNAL_NAME,
|
||||
TYPE_ENERGY,
|
||||
)
|
||||
from .data_handler import (
|
||||
CLIMATE_STATE_CLASS_NAME,
|
||||
CLIMATE_TOPOLOGY_CLASS_NAME,
|
||||
NetatmoDataHandler,
|
||||
NETATMO_CREATE_SELECT,
|
||||
)
|
||||
from .data_handler import HOME, SIGNAL_NAME, NetatmoHome
|
||||
from .netatmo_entity_base import NetatmoBase
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
@ -35,100 +26,66 @@ async def async_setup_entry(
|
|||
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
|
||||
) -> None:
|
||||
"""Set up the Netatmo energy platform schedule selector."""
|
||||
data_handler = hass.data[DOMAIN][entry.entry_id][DATA_HANDLER]
|
||||
|
||||
climate_topology = data_handler.data.get(CLIMATE_TOPOLOGY_CLASS_NAME)
|
||||
@callback
|
||||
def _create_entity(netatmo_home: NetatmoHome) -> None:
|
||||
entity = NetatmoScheduleSelect(netatmo_home)
|
||||
async_add_entities([entity])
|
||||
|
||||
if not climate_topology or climate_topology.raw_data == {}:
|
||||
raise PlatformNotReady
|
||||
|
||||
entities = []
|
||||
for home_id in climate_topology.home_ids:
|
||||
signal_name = f"{CLIMATE_STATE_CLASS_NAME}-{home_id}"
|
||||
|
||||
await data_handler.subscribe(
|
||||
CLIMATE_STATE_CLASS_NAME, signal_name, None, home_id=home_id
|
||||
)
|
||||
|
||||
if (climate_state := data_handler.data[signal_name]) is None:
|
||||
continue
|
||||
|
||||
climate_topology.register_handler(home_id, climate_state.process_topology)
|
||||
|
||||
hass.data[DOMAIN][DATA_SCHEDULES][home_id] = climate_state.homes[
|
||||
home_id
|
||||
].schedules
|
||||
|
||||
entities = [
|
||||
NetatmoScheduleSelect(
|
||||
data_handler,
|
||||
home_id,
|
||||
[schedule.name for schedule in schedules.values()],
|
||||
)
|
||||
for home_id, schedules in hass.data[DOMAIN][DATA_SCHEDULES].items()
|
||||
if schedules
|
||||
]
|
||||
|
||||
_LOGGER.debug("Adding climate schedule select entities %s", entities)
|
||||
async_add_entities(entities, True)
|
||||
entry.async_on_unload(
|
||||
async_dispatcher_connect(hass, NETATMO_CREATE_SELECT, _create_entity)
|
||||
)
|
||||
|
||||
|
||||
class NetatmoScheduleSelect(NetatmoBase, SelectEntity):
|
||||
"""Representation a Netatmo thermostat schedule selector."""
|
||||
|
||||
def __init__(
|
||||
self, data_handler: NetatmoDataHandler, home_id: str, options: list
|
||||
self,
|
||||
netatmo_home: NetatmoHome,
|
||||
) -> None:
|
||||
"""Initialize the select entity."""
|
||||
SelectEntity.__init__(self)
|
||||
super().__init__(data_handler)
|
||||
super().__init__(netatmo_home.data_handler)
|
||||
|
||||
self._home_id = home_id
|
||||
|
||||
self._climate_state_class = f"{CLIMATE_STATE_CLASS_NAME}-{self._home_id}"
|
||||
self._climate_state: pyatmo.AsyncClimate = data_handler.data[
|
||||
self._climate_state_class
|
||||
]
|
||||
|
||||
self._home = self._climate_state.homes[self._home_id]
|
||||
self._home = netatmo_home.home
|
||||
self._home_id = self._home.entity_id
|
||||
|
||||
self._signal_name = netatmo_home.signal_name
|
||||
self._publishers.extend(
|
||||
[
|
||||
{
|
||||
"name": CLIMATE_TOPOLOGY_CLASS_NAME,
|
||||
SIGNAL_NAME: CLIMATE_TOPOLOGY_CLASS_NAME,
|
||||
},
|
||||
{
|
||||
"name": CLIMATE_STATE_CLASS_NAME,
|
||||
"home_id": self._home_id,
|
||||
SIGNAL_NAME: self._climate_state_class,
|
||||
"name": HOME,
|
||||
"home_id": self._home.entity_id,
|
||||
SIGNAL_NAME: self._signal_name,
|
||||
},
|
||||
]
|
||||
)
|
||||
|
||||
self._device_name = self._home.name
|
||||
self._attr_name = f"{MANUFACTURER} {self._device_name}"
|
||||
self._attr_name = f"{self._device_name}"
|
||||
|
||||
self._model: str = "NATherm1"
|
||||
self._netatmo_type = TYPE_ENERGY
|
||||
self._config_url = CONF_URL_ENERGY
|
||||
|
||||
self._attr_unique_id = f"{self._home_id}-schedule-select"
|
||||
|
||||
self._attr_current_option = getattr(self._home.get_selected_schedule(), "name")
|
||||
self._attr_options = options
|
||||
self._attr_options = [
|
||||
schedule.name for schedule in self._home.schedules.values()
|
||||
]
|
||||
|
||||
async def async_added_to_hass(self) -> None:
|
||||
"""Entity created."""
|
||||
await super().async_added_to_hass()
|
||||
|
||||
for event_type in (EVENT_TYPE_SCHEDULE,):
|
||||
self.data_handler.config_entry.async_on_unload(
|
||||
async_dispatcher_connect(
|
||||
self.hass,
|
||||
f"signal-{DOMAIN}-webhook-{event_type}",
|
||||
self.handle_event,
|
||||
)
|
||||
self.async_on_remove(
|
||||
async_dispatcher_connect(
|
||||
self.hass,
|
||||
f"signal-{DOMAIN}-webhook-{EVENT_TYPE_SCHEDULE}",
|
||||
self.handle_event,
|
||||
)
|
||||
)
|
||||
|
||||
@callback
|
||||
def handle_event(self, event: dict) -> None:
|
||||
|
@ -160,7 +117,7 @@ class NetatmoScheduleSelect(NetatmoBase, SelectEntity):
|
|||
option,
|
||||
sid,
|
||||
)
|
||||
await self._climate_state.async_switch_home_schedule(schedule_id=sid)
|
||||
await self._home.async_switch_schedule(schedule_id=sid)
|
||||
break
|
||||
|
||||
@callback
|
||||
|
@ -169,8 +126,5 @@ class NetatmoScheduleSelect(NetatmoBase, SelectEntity):
|
|||
self._attr_current_option = getattr(self._home.get_selected_schedule(), "name")
|
||||
self.hass.data[DOMAIN][DATA_SCHEDULES][self._home_id] = self._home.schedules
|
||||
self._attr_options = [
|
||||
schedule.name
|
||||
for schedule in self.hass.data[DOMAIN][DATA_SCHEDULES][
|
||||
self._home_id
|
||||
].values()
|
||||
schedule.name for schedule in self._home.schedules.values()
|
||||
]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue