Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Representation of Z-Wave switches."""
2 
3 from __future__ import annotations
4 
5 from typing import Any
6 
7 from zwave_js_server.client import Client as ZwaveClient
8 from zwave_js_server.const import TARGET_VALUE_PROPERTY
9 from zwave_js_server.const.command_class.barrier_operator import (
10  BarrierEventSignalingSubsystemState,
11 )
12 from zwave_js_server.model.driver import Driver
13 
14 from homeassistant.components.switch import DOMAIN as SWITCH_DOMAIN, SwitchEntity
15 from homeassistant.config_entries import ConfigEntry
16 from homeassistant.const import EntityCategory
17 from homeassistant.core import HomeAssistant, callback
18 from homeassistant.helpers.dispatcher import async_dispatcher_connect
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 
21 from .const import DATA_CLIENT, DOMAIN
22 from .discovery import ZwaveDiscoveryInfo
23 from .entity import ZWaveBaseEntity
24 
25 PARALLEL_UPDATES = 0
26 
27 
29  hass: HomeAssistant,
30  config_entry: ConfigEntry,
31  async_add_entities: AddEntitiesCallback,
32 ) -> None:
33  """Set up Z-Wave sensor from config entry."""
34  client: ZwaveClient = config_entry.runtime_data[DATA_CLIENT]
35 
36  @callback
37  def async_add_switch(info: ZwaveDiscoveryInfo) -> None:
38  """Add Z-Wave Switch."""
39  driver = client.driver
40  assert driver is not None # Driver is ready before platforms are loaded.
41  entities: list[ZWaveBaseEntity] = []
42  if info.platform_hint == "barrier_event_signaling_state":
43  entities.append(
44  ZWaveBarrierEventSignalingSwitch(config_entry, driver, info)
45  )
46  elif info.platform_hint == "config_parameter":
47  entities.append(ZWaveConfigParameterSwitch(config_entry, driver, info))
48  elif info.platform_hint == "indicator":
49  entities.append(ZWaveIndicatorSwitch(config_entry, driver, info))
50  else:
51  entities.append(ZWaveSwitch(config_entry, driver, info))
52 
53  async_add_entities(entities)
54 
55  config_entry.async_on_unload(
57  hass,
58  f"{DOMAIN}_{config_entry.entry_id}_add_{SWITCH_DOMAIN}",
59  async_add_switch,
60  )
61  )
62 
63 
64 class ZWaveSwitch(ZWaveBaseEntity, SwitchEntity):
65  """Representation of a Z-Wave switch."""
66 
67  def __init__(
68  self, config_entry: ConfigEntry, driver: Driver, info: ZwaveDiscoveryInfo
69  ) -> None:
70  """Initialize the switch."""
71  super().__init__(config_entry, driver, info)
72 
73  self._target_value_target_value = self.get_zwave_valueget_zwave_value(TARGET_VALUE_PROPERTY)
74 
75  @property
76  def is_on(self) -> bool | None:
77  """Return a boolean for the state of the switch."""
78  if self.infoinfo.primary_value.value is None:
79  # guard missing value
80  return None
81  return bool(self.infoinfo.primary_value.value)
82 
83  async def async_turn_on(self, **kwargs: Any) -> None:
84  """Turn the switch on."""
85  if self._target_value_target_value is not None:
86  await self._async_set_value_async_set_value(self._target_value_target_value, True)
87 
88  async def async_turn_off(self, **kwargs: Any) -> None:
89  """Turn the switch off."""
90  if self._target_value_target_value is not None:
91  await self._async_set_value_async_set_value(self._target_value_target_value, False)
92 
93 
95  """Representation of a Z-Wave Indicator CC switch."""
96 
97  def __init__(
98  self, config_entry: ConfigEntry, driver: Driver, info: ZwaveDiscoveryInfo
99  ) -> None:
100  """Initialize the switch."""
101  super().__init__(config_entry, driver, info)
102  self._target_value_target_value_target_value = self.infoinfo.primary_value
103  self._attr_name_attr_name_attr_name = self.generate_namegenerate_name(include_value_name=True)
104 
105 
107  """Switch is used to turn on/off a barrier device's event signaling subsystem."""
108 
109  def __init__(
110  self,
111  config_entry: ConfigEntry,
112  driver: Driver,
113  info: ZwaveDiscoveryInfo,
114  ) -> None:
115  """Initialize a ZWaveBarrierEventSignalingSwitch entity."""
116  super().__init__(config_entry, driver, info)
117  self._state_state: bool | None = None
118 
119  self._update_state_update_state()
120 
121  # Entity class attributes
122  self._attr_name_attr_name_attr_name = self.generate_namegenerate_name(include_value_name=True)
123 
124  @callback
125  def on_value_update(self) -> None:
126  """Call when a watched value is added or updated."""
127  self._update_state_update_state()
128 
129  @property
130  def is_on(self) -> bool | None:
131  """Return a boolean for the state of the switch."""
132  return self._state_state
133 
134  async def async_turn_on(self, **kwargs: Any) -> None:
135  """Turn the switch on."""
136  await self._async_set_value_async_set_value(
137  self.infoinfo.primary_value, BarrierEventSignalingSubsystemState.ON
138  )
139  # this value is not refreshed, so assume success
140  self._state_state = True
141  self.async_write_ha_stateasync_write_ha_state()
142 
143  async def async_turn_off(self, **kwargs: Any) -> None:
144  """Turn the switch off."""
145  await self._async_set_value_async_set_value(
146  self.infoinfo.primary_value, BarrierEventSignalingSubsystemState.OFF
147  )
148  # this value is not refreshed, so assume success
149  self._state_state = False
150  self.async_write_ha_stateasync_write_ha_state()
151 
152  @callback
153  def _update_state(self) -> None:
154  self._state_state = None
155  if self.infoinfo.primary_value.value is not None:
156  self._state_state = (
157  self.infoinfo.primary_value.value == BarrierEventSignalingSubsystemState.ON
158  )
159 
160 
162  """Representation of a Z-Wave config parameter switch."""
163 
164  _attr_entity_category = EntityCategory.CONFIG
165 
166  def __init__(
167  self, config_entry: ConfigEntry, driver: Driver, info: ZwaveDiscoveryInfo
168  ) -> None:
169  """Initialize a ZWaveConfigParameterSwitch entity."""
170  super().__init__(config_entry, driver, info)
171 
172  property_key_name = self.infoinfo.primary_value.property_key_name
173  # Entity class attributes
174  self._attr_name_attr_name_attr_name = self.generate_namegenerate_name(
175  alternate_value_name=self.infoinfo.primary_value.property_name,
176  additional_info=[property_key_name] if property_key_name else None,
177  )
178 
179  async def async_turn_on(self, **kwargs: Any) -> None:
180  """Turn the switch on."""
181  await self._async_set_value_async_set_value(self.infoinfo.primary_value, 1)
182 
183  async def async_turn_off(self, **kwargs: Any) -> None:
184  """Turn the switch off."""
185  await self._async_set_value_async_set_value(self.infoinfo.primary_value, 0)
str generate_name(self, bool include_value_name=False, str|None alternate_value_name=None, Sequence[str|None]|None additional_info=None, str|None name_prefix=None)
Definition: entity.py:163
SetValueResult|None _async_set_value(self, ZwaveValue value, Any new_value, dict|None options=None, bool|None wait_for_result=None)
Definition: entity.py:330
ZwaveValue|None get_zwave_value(self, str|int value_property, int|None command_class=None, int|None endpoint=None, int|str|None value_property_key=None, bool add_to_watched_value_ids=True, bool check_all_endpoints=False)
Definition: entity.py:280
None __init__(self, ConfigEntry config_entry, Driver driver, ZwaveDiscoveryInfo info)
Definition: switch.py:114
None __init__(self, ConfigEntry config_entry, Driver driver, ZwaveDiscoveryInfo info)
Definition: switch.py:168
None __init__(self, ConfigEntry config_entry, Driver driver, ZwaveDiscoveryInfo info)
Definition: switch.py:99
None __init__(self, ConfigEntry config_entry, Driver driver, ZwaveDiscoveryInfo info)
Definition: switch.py:69
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
Definition: switch.py:32
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)
Definition: dispatcher.py:103