Home Assistant Unofficial Reference 2024.12.1
switch.py
Go to the documentation of this file.
1 """Pencom relay control."""
2 
3 from __future__ import annotations
4 
5 import logging
6 from typing import Any
7 
8 from pencompy.pencompy import Pencompy
9 import voluptuous as vol
10 
12  PLATFORM_SCHEMA as SWITCH_PLATFORM_SCHEMA,
13  SwitchEntity,
14 )
15 from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PORT
16 from homeassistant.core import HomeAssistant
17 from homeassistant.exceptions import PlatformNotReady
19 from homeassistant.helpers.entity_platform import AddEntitiesCallback
20 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
21 
22 _LOGGER = logging.getLogger(__name__)
23 
24 CONF_BOARDS = "boards"
25 CONF_BOARD = "board"
26 CONF_ADDR = "addr"
27 CONF_RELAYS = "relays"
28 
29 RELAY_SCHEMA = vol.Schema(
30  {
31  vol.Required(CONF_NAME): cv.string,
32  vol.Required(CONF_ADDR): cv.positive_int,
33  vol.Optional(CONF_BOARD, default=0): cv.positive_int,
34  }
35 )
36 
37 PLATFORM_SCHEMA = SWITCH_PLATFORM_SCHEMA.extend(
38  {
39  vol.Required(CONF_HOST): cv.string,
40  vol.Required(CONF_PORT): cv.port,
41  vol.Optional(CONF_BOARDS, default=1): cv.positive_int,
42  vol.Required(CONF_RELAYS): vol.All(cv.ensure_list, [RELAY_SCHEMA]),
43  }
44 )
45 
46 
48  hass: HomeAssistant,
49  config: ConfigType,
50  add_entities: AddEntitiesCallback,
51  discovery_info: DiscoveryInfoType | None = None,
52 ) -> None:
53  """Pencom relay platform (pencompy)."""
54 
55  # Assign configuration variables.
56  host = config[CONF_HOST]
57  port = config[CONF_PORT]
58  boards = config[CONF_BOARDS]
59 
60  # Setup connection
61  try:
62  hub = Pencompy(host, port, boards=boards)
63  except OSError as error:
64  _LOGGER.error("Could not connect to pencompy: %s", error)
65  raise PlatformNotReady from error
66 
67  # Add devices.
68  devs = []
69  for relay in config[CONF_RELAYS]:
70  name = relay[CONF_NAME]
71  board = relay[CONF_BOARD]
72  addr = relay[CONF_ADDR]
73  devs.append(PencomRelay(hub, board, addr, name))
74  add_entities(devs, True)
75 
76 
78  """Representation of a pencom relay."""
79 
80  def __init__(self, hub, board, addr, name):
81  """Create a relay."""
82  self._hub_hub = hub
83  self._board_board = board
84  self._addr_addr = addr
85  self._name_name = name
86  self._state_state = None
87 
88  @property
89  def name(self):
90  """Relay name."""
91  return self._name_name
92 
93  @property
94  def is_on(self):
95  """Return a relay's state."""
96  return self._state_state
97 
98  def turn_on(self, **kwargs: Any) -> None:
99  """Turn a relay on."""
100  self._hub_hub.set(self._board_board, self._addr_addr, True)
101 
102  def turn_off(self, **kwargs: Any) -> None:
103  """Turn a relay off."""
104  self._hub_hub.set(self._board_board, self._addr_addr, False)
105 
106  def update(self) -> None:
107  """Refresh a relay's state."""
108  self._state_state = self._hub_hub.get(self._board_board, self._addr_addr)
109 
110  @property
112  """Return supported attributes."""
113  return {"board": self._board_board, "addr": self._addr_addr}
def __init__(self, hub, board, addr, name)
Definition: switch.py:80
None add_entities(AsusWrtRouter router, AddEntitiesCallback async_add_entities, set[str] tracked)
web.Response get(self, web.Request request, str config_key)
Definition: view.py:88
None setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: switch.py:52