Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Support for interacting with Smappee Comport Plugs, Switches and Output Modules."""
2 
3 from typing import Any
4 
5 from homeassistant.components.switch import SwitchEntity
6 from homeassistant.core import HomeAssistant
7 from homeassistant.helpers.device_registry import DeviceInfo
8 from homeassistant.helpers.entity_platform import AddEntitiesCallback
9 
10 from . import SmappeeConfigEntry
11 from .const import DOMAIN
12 
13 SWITCH_PREFIX = "Switch"
14 
15 
17  hass: HomeAssistant,
18  config_entry: SmappeeConfigEntry,
19  async_add_entities: AddEntitiesCallback,
20 ) -> None:
21  """Set up the Smappee Comfort Plugs."""
22  smappee_base = config_entry.runtime_data
23 
24  entities = []
25  for service_location in smappee_base.smappee.service_locations.values():
26  for actuator_id, actuator in service_location.actuators.items():
27  if actuator.type in ("SWITCH", "COMFORT_PLUG"):
28  entities.append(
30  smappee_base,
31  service_location,
32  actuator.name,
33  actuator_id,
34  actuator.type,
35  actuator.serialnumber,
36  )
37  )
38  elif actuator.type == "INFINITY_OUTPUT_MODULE":
39  entities.extend(
41  smappee_base,
42  service_location,
43  actuator.name,
44  actuator_id,
45  actuator.type,
46  actuator.serialnumber,
47  actuator_state_option=option,
48  )
49  for option in actuator.state_options
50  )
51 
52  async_add_entities(entities, True)
53 
54 
56  """Representation of a Smappee Comport Plug."""
57 
58  _attr_icon = "mdi:toggle-switch"
59 
60  def __init__(
61  self,
62  smappee_base,
63  service_location,
64  name,
65  actuator_id,
66  actuator_type,
67  actuator_serialnumber,
68  actuator_state_option=None,
69  ):
70  """Initialize a new Smappee Comfort Plug."""
71  self._smappee_base_smappee_base = smappee_base
72  self._service_location_service_location = service_location
73  self._actuator_name_actuator_name = name
74  self._actuator_id_actuator_id = actuator_id
75  self._actuator_type_actuator_type = actuator_type
76  self._actuator_serialnumber_actuator_serialnumber = actuator_serialnumber
77  self._actuator_state_option_actuator_state_option = actuator_state_option
78  self._state_state = service_location.actuators.get(actuator_id).state
79  self._connection_state_connection_state = service_location.actuators.get(
80  actuator_id
81  ).connection_state
82  self._attr_device_info_attr_device_info = DeviceInfo(
83  identifiers={(DOMAIN, service_location.device_serial_number)},
84  manufacturer="Smappee",
85  model=service_location.device_model,
86  name=service_location.service_location_name,
87  sw_version=service_location.firmware_version,
88  )
89 
90  @property
91  def name(self):
92  """Return the name of the switch."""
93  if self._actuator_type_actuator_type == "INFINITY_OUTPUT_MODULE":
94  return (
95  f"{self._service_location.service_location_name} - "
96  f"Output module - {self._actuator_name} - {self._actuator_state_option}"
97  )
98 
99  # Switch or comfort plug
100  return (
101  f"{self._service_location.service_location_name} - "
102  f"{self._actuator_type.title()} - {self._actuator_name}"
103  )
104 
105  @property
106  def is_on(self):
107  """Return true if switch is on."""
108  if self._actuator_type_actuator_type == "INFINITY_OUTPUT_MODULE":
109  return (
110  self._service_location_service_location.actuators.get(self._actuator_id_actuator_id).state
111  == self._actuator_state_option_actuator_state_option
112  )
113 
114  # Switch or comfort plug
115  return self._state_state == "ON_ON"
116 
117  def turn_on(self, **kwargs: Any) -> None:
118  """Turn on Comport Plug."""
119  if self._actuator_type_actuator_type in ("SWITCH", "COMFORT_PLUG"):
120  self._service_location_service_location.set_actuator_state(self._actuator_id_actuator_id, state="ON_ON")
121  elif self._actuator_type_actuator_type == "INFINITY_OUTPUT_MODULE":
122  self._service_location_service_location.set_actuator_state(
123  self._actuator_id_actuator_id, state=self._actuator_state_option_actuator_state_option
124  )
125 
126  def turn_off(self, **kwargs: Any) -> None:
127  """Turn off Comport Plug."""
128  if self._actuator_type_actuator_type in ("SWITCH", "COMFORT_PLUG"):
129  self._service_location_service_location.set_actuator_state(
130  self._actuator_id_actuator_id, state="OFF_OFF"
131  )
132  elif self._actuator_type_actuator_type == "INFINITY_OUTPUT_MODULE":
133  self._service_location_service_location.set_actuator_state(
134  self._actuator_id_actuator_id, state="PLACEHOLDER", api=False
135  )
136 
137  @property
138  def available(self) -> bool:
139  """Return True if entity is available. Unavailable for COMFORT_PLUGS."""
140  return (
141  self._connection_state_connection_state == "CONNECTED"
142  or self._actuator_type_actuator_type == "COMFORT_PLUG"
143  )
144 
145  @property
147  self,
148  ):
149  """Return the unique ID for this switch."""
150  if self._actuator_type_actuator_type == "INFINITY_OUTPUT_MODULE":
151  return (
152  f"{self._service_location.device_serial_number}-"
153  f"{self._service_location.service_location_id}-actuator-"
154  f"{self._actuator_id}-{self._actuator_state_option}"
155  )
156 
157  # Switch or comfort plug
158  return (
159  f"{self._service_location.device_serial_number}-"
160  f"{self._service_location.service_location_id}-actuator-"
161  f"{self._actuator_id}"
162  )
163 
164  async def async_update(self) -> None:
165  """Get the latest data from Smappee and update the state."""
166  await self._smappee_base_smappee_base.async_update()
167 
168  new_state = self._service_location_service_location.actuators.get(self._actuator_id_actuator_id).state
169  if new_state != self._state_state:
170  self._state_state = new_state
171  self.async_write_ha_stateasync_write_ha_state()
172 
173  self._connection_state_connection_state = self._service_location_service_location.actuators.get(
174  self._actuator_id_actuator_id
175  ).connection_state
def __init__(self, smappee_base, service_location, name, actuator_id, actuator_type, actuator_serialnumber, actuator_state_option=None)
Definition: switch.py:69
None async_setup_entry(HomeAssistant hass, SmappeeConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:20