Home Assistant Unofficial Reference 2024.12.1
select.py
Go to the documentation of this file.
1 """Support for the Netatmo climate schedule selector."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from homeassistant.components.select import SelectEntity
8 from homeassistant.config_entries import ConfigEntry
9 from homeassistant.core import HomeAssistant, callback
10 from homeassistant.helpers.device_registry import DeviceInfo
11 from homeassistant.helpers.dispatcher import async_dispatcher_connect
12 from homeassistant.helpers.entity_platform import AddEntitiesCallback
13 
14 from .const import (
15  CONF_URL_ENERGY,
16  DATA_SCHEDULES,
17  DOMAIN,
18  EVENT_TYPE_SCHEDULE,
19  MANUFACTURER,
20  NETATMO_CREATE_SELECT,
21 )
22 from .data_handler import HOME, SIGNAL_NAME, NetatmoHome
23 from .entity import NetatmoBaseEntity
24 
25 _LOGGER = logging.getLogger(__name__)
26 
27 
29  hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
30 ) -> None:
31  """Set up the Netatmo energy platform schedule selector."""
32 
33  @callback
34  def _create_entity(netatmo_home: NetatmoHome) -> None:
35  entity = NetatmoScheduleSelect(netatmo_home)
36  async_add_entities([entity])
37 
38  entry.async_on_unload(
39  async_dispatcher_connect(hass, NETATMO_CREATE_SELECT, _create_entity)
40  )
41 
42 
44  """Representation a Netatmo thermostat schedule selector."""
45 
46  _attr_name = None
47 
48  def __init__(self, netatmo_home: NetatmoHome) -> None:
49  """Initialize the select entity."""
50  super().__init__(netatmo_home.data_handler)
51 
52  self.homehome = netatmo_home.home
53 
54  self._publishers.extend(
55  [
56  {
57  "name": HOME,
58  "home_id": self.homehome.entity_id,
59  SIGNAL_NAME: netatmo_home.signal_name,
60  },
61  ]
62  )
63  self._attr_device_info_attr_device_info = DeviceInfo(
64  identifiers={(DOMAIN, self.homehome.entity_id)},
65  name=self.homehome.name,
66  manufacturer=MANUFACTURER,
67  model="Climate",
68  configuration_url=CONF_URL_ENERGY,
69  )
70 
71  self._attr_unique_id_attr_unique_id = f"{self.home.entity_id}-schedule-select"
72 
73  self._attr_current_option_attr_current_option = getattr(self.homehome.get_selected_schedule(), "name")
74  self._attr_options_attr_options = [
75  schedule.name for schedule in self.homehome.schedules.values() if schedule.name
76  ]
77 
78  async def async_added_to_hass(self) -> None:
79  """Entity created."""
80  await super().async_added_to_hass()
81 
82  self.async_on_removeasync_on_remove(
84  self.hasshass,
85  f"signal-{DOMAIN}-webhook-{EVENT_TYPE_SCHEDULE}",
86  self.handle_eventhandle_event,
87  )
88  )
89 
90  @callback
91  def handle_event(self, event: dict) -> None:
92  """Handle webhook events."""
93  data = event["data"]
94 
95  if self.homehome.entity_id != data["home_id"]:
96  return
97 
98  if data["event_type"] == EVENT_TYPE_SCHEDULE and "schedule_id" in data:
99  self._attr_current_option_attr_current_option = getattr(
100  self.hasshass.data[DOMAIN][DATA_SCHEDULES][self.homehome.entity_id].get(
101  data["schedule_id"]
102  ),
103  "name",
104  )
105  self.async_write_ha_stateasync_write_ha_state()
106 
107  async def async_select_option(self, option: str) -> None:
108  """Change the selected option."""
109  for sid, schedule in self.hasshass.data[DOMAIN][DATA_SCHEDULES][
110  self.homehome.entity_id
111  ].items():
112  if schedule.name != option:
113  continue
114  _LOGGER.debug(
115  "Setting %s schedule to %s (%s)",
116  self.homehome.entity_id,
117  option,
118  sid,
119  )
120  await self.homehome.async_switch_schedule(schedule_id=sid)
121  break
122 
123  @callback
124  def async_update_callback(self) -> None:
125  """Update the entity's state."""
126  self._attr_current_option_attr_current_option = getattr(self.homehome.get_selected_schedule(), "name")
127  self.hasshass.data[DOMAIN][DATA_SCHEDULES][self.homehome.entity_id] = (
128  self.homehome.schedules
129  )
130  self._attr_options_attr_options = [
131  schedule.name for schedule in self.homehome.schedules.values() if schedule.name
132  ]
None __init__(self, NetatmoHome netatmo_home)
Definition: select.py:48
None async_on_remove(self, CALLBACK_TYPE func)
Definition: entity.py:1331
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None async_setup_entry(HomeAssistant hass, ConfigEntry entry, AddEntitiesCallback async_add_entities)
Definition: select.py:30
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103