Home Assistant Unofficial Reference 2024.12.1
remote.py
Go to the documentation of this file.
1 """Support for iTach IR devices."""
2 
3 from __future__ import annotations
4 
5 from collections.abc import Iterable
6 import logging
7 from typing import Any
8 
9 import pyitachip2ir
10 import voluptuous as vol
11 
12 from homeassistant.components import remote
14  ATTR_NUM_REPEATS,
15  DEFAULT_NUM_REPEATS,
16  PLATFORM_SCHEMA as REMOTE_PLATFORM_SCHEMA,
17 )
18 from homeassistant.const import (
19  CONF_DEVICES,
20  CONF_HOST,
21  CONF_MAC,
22  CONF_NAME,
23  CONF_PORT,
24  DEVICE_DEFAULT_NAME,
25 )
26 from homeassistant.core import HomeAssistant
28 from homeassistant.helpers.entity_platform import AddEntitiesCallback
29 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
30 
31 _LOGGER = logging.getLogger(__name__)
32 
33 DEFAULT_PORT = 4998
34 CONNECT_TIMEOUT = 5000
35 DEFAULT_MODADDR = 1
36 DEFAULT_CONNADDR = 1
37 DEFAULT_IR_COUNT = 1
38 
39 CONF_MODADDR = "modaddr"
40 CONF_CONNADDR = "connaddr"
41 CONF_COMMANDS = "commands"
42 CONF_DATA = "data"
43 CONF_IR_COUNT = "ir_count"
44 
45 PLATFORM_SCHEMA = REMOTE_PLATFORM_SCHEMA.extend(
46  {
47  vol.Optional(CONF_MAC): cv.string,
48  vol.Required(CONF_HOST): cv.string,
49  vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
50  vol.Required(CONF_DEVICES): vol.All(
51  cv.ensure_list,
52  [
53  {
54  vol.Optional(CONF_NAME): cv.string,
55  vol.Optional(CONF_MODADDR): cv.positive_int,
56  vol.Required(CONF_CONNADDR): cv.positive_int,
57  vol.Optional(CONF_IR_COUNT): cv.positive_int,
58  vol.Required(CONF_COMMANDS): vol.All(
59  cv.ensure_list,
60  [
61  {
62  vol.Required(CONF_NAME): cv.string,
63  vol.Required(CONF_DATA): cv.string,
64  }
65  ],
66  ),
67  }
68  ],
69  ),
70  }
71 )
72 
73 
75  hass: HomeAssistant,
76  config: ConfigType,
77  add_entities: AddEntitiesCallback,
78  discovery_info: DiscoveryInfoType | None = None,
79 ) -> None:
80  """Set up the ITach connection and devices."""
81  itachip2ir = pyitachip2ir.ITachIP2IR(
82  config.get(CONF_MAC), config[CONF_HOST], int(config[CONF_PORT])
83  )
84 
85  if not itachip2ir.ready(CONNECT_TIMEOUT):
86  _LOGGER.error("Unable to find iTach")
87  return
88 
89  devices = []
90  for data in config[CONF_DEVICES]:
91  name = data.get(CONF_NAME)
92  modaddr = int(data.get(CONF_MODADDR, DEFAULT_MODADDR))
93  connaddr = int(data.get(CONF_CONNADDR, DEFAULT_CONNADDR))
94  ir_count = int(data.get(CONF_IR_COUNT, DEFAULT_IR_COUNT))
95  cmddatas = ""
96  for cmd in data.get(CONF_COMMANDS):
97  cmdname = cmd[CONF_NAME].strip()
98  if not cmdname:
99  cmdname = '""'
100  cmddata = cmd[CONF_DATA].strip()
101  if not cmddata:
102  cmddata = '""'
103  cmddatas += f"{cmdname}\n{cmddata}\n"
104  itachip2ir.addDevice(name, modaddr, connaddr, cmddatas)
105  devices.append(ITachIP2IRRemote(itachip2ir, name, ir_count))
106  add_entities(devices, True)
107 
108 
110  """Device that sends commands to an ITachIP2IR device."""
111 
112  def __init__(self, itachip2ir, name, ir_count):
113  """Initialize device."""
114  self.itachip2iritachip2ir = itachip2ir
115  self._power_power = False
116  self._name_name = name or DEVICE_DEFAULT_NAME
117  self._ir_count_ir_count = ir_count or DEFAULT_IR_COUNT
118 
119  @property
120  def name(self):
121  """Return the name of the device."""
122  return self._name_name
123 
124  @property
125  def is_on(self):
126  """Return true if device is on."""
127  return self._power_power
128 
129  def turn_on(self, **kwargs: Any) -> None:
130  """Turn the device on."""
131  self._power_power = True
132  self.itachip2iritachip2ir.send(self._name_name, "ON", self._ir_count_ir_count)
133  self.schedule_update_ha_stateschedule_update_ha_state()
134 
135  def turn_off(self, **kwargs: Any) -> None:
136  """Turn the device off."""
137  self._power_power = False
138  self.itachip2iritachip2ir.send(self._name_name, "OFF", self._ir_count_ir_count)
139  self.schedule_update_ha_stateschedule_update_ha_state()
140 
141  def send_command(self, command: Iterable[str], **kwargs: Any) -> None:
142  """Send a command to one device."""
143  num_repeats = kwargs.get(ATTR_NUM_REPEATS, DEFAULT_NUM_REPEATS)
144  for single_command in command:
145  self.itachip2iritachip2ir.send(
146  self._name_name, single_command, self._ir_count_ir_count * num_repeats
147  )
148 
149  def update(self) -> None:
150  """Update the device."""
151  self.itachip2iritachip2ir.update()
None send_command(self, Iterable[str] command, **Any kwargs)
Definition: remote.py:141
def __init__(self, itachip2ir, name, ir_count)
Definition: remote.py:112
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: remote.py:79