Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Switch platform integration for Numato USB GPIO expanders."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any
7 
8 from numato_gpio import NumatoGpioError
9 
10 from homeassistant.components.switch import SwitchEntity
11 from homeassistant.const import (
12  CONF_DEVICES,
13  CONF_ID,
14  CONF_SWITCHES,
15  DEVICE_DEFAULT_NAME,
16 )
17 from homeassistant.core import HomeAssistant
18 from homeassistant.helpers.entity_platform import AddEntitiesCallback
19 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
20 
21 from . import CONF_INVERT_LOGIC, CONF_PORTS, DATA_API, DOMAIN
22 
23 _LOGGER = logging.getLogger(__name__)
24 
25 
27  hass: HomeAssistant,
28  config: ConfigType,
29  add_entities: AddEntitiesCallback,
30  discovery_info: DiscoveryInfoType | None = None,
31 ) -> None:
32  """Set up the configured Numato USB GPIO switch ports."""
33  if discovery_info is None:
34  return
35 
36  api = hass.data[DOMAIN][DATA_API]
37  switches = []
38  devices = hass.data[DOMAIN][CONF_DEVICES]
39  for device in [d for d in devices if CONF_SWITCHES in d]:
40  device_id = device[CONF_ID]
41  platform = device[CONF_SWITCHES]
42  invert_logic = platform[CONF_INVERT_LOGIC]
43  ports = platform[CONF_PORTS]
44  for port, port_name in ports.items():
45  try:
46  api.setup_output(device_id, port)
47  api.write_output(device_id, port, 1 if invert_logic else 0)
48  except NumatoGpioError as err:
49  _LOGGER.error(
50  "Failed to initialize switch '%s' on Numato device %s port %s: %s",
51  port_name,
52  device_id,
53  port,
54  err,
55  )
56  continue
57  switches.append(
59  port_name,
60  device_id,
61  port,
62  invert_logic,
63  api,
64  )
65  )
66  add_entities(switches, True)
67 
68 
70  """Representation of a Numato USB GPIO switch port."""
71 
72  _attr_should_poll = False
73 
74  def __init__(self, name, device_id, port, invert_logic, api):
75  """Initialize the port."""
76  self._attr_name_attr_name = name or DEVICE_DEFAULT_NAME
77  self._device_id_device_id = device_id
78  self._port_port = port
79  self._invert_logic_invert_logic = invert_logic
80  self._attr_is_on_attr_is_on = False
81  self._api_api = api
82 
83  def turn_on(self, **kwargs: Any) -> None:
84  """Turn the port on."""
85  try:
86  self._api_api.write_output(
87  self._device_id_device_id, self._port_port, 0 if self._invert_logic_invert_logic else 1
88  )
89  self._attr_is_on_attr_is_on = True
90  self.schedule_update_ha_stateschedule_update_ha_state()
91  except NumatoGpioError as err:
92  _LOGGER.error(
93  "Failed to turn on Numato device %s port %s: %s",
94  self._device_id_device_id,
95  self._port_port,
96  err,
97  )
98 
99  def turn_off(self, **kwargs: Any) -> None:
100  """Turn the port off."""
101  try:
102  self._api_api.write_output(
103  self._device_id_device_id, self._port_port, 1 if self._invert_logic_invert_logic else 0
104  )
105  self._attr_is_on_attr_is_on = False
106  self.schedule_update_ha_stateschedule_update_ha_state()
107  except NumatoGpioError as err:
108  _LOGGER.error(
109  "Failed to turn off Numato device %s port %s: %s",
110  self._device_id_device_id,
111  self._port_port,
112  err,
113  )
def __init__(self, name, device_id, port, invert_logic, api)
Definition: switch.py:74
None schedule_update_ha_state(self, bool force_refresh=False)
Definition: entity.py:1244
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: switch.py:31