1 """KIRA interface to receive UDP packets from an IR-IP bridge."""
7 import voluptuous
as vol
8 from voluptuous.error
import Error
as VoluptuousError
20 EVENT_HOMEASSISTANT_STOP,
30 _LOGGER = logging.getLogger(__name__)
32 DEFAULT_HOST =
"0.0.0.0"
35 CONF_REMOTES =
"remotes"
36 CONF_SENSOR =
"sensor"
37 CONF_REMOTE =
"remote"
39 CODES_YAML = f
"{DOMAIN}_codes.yaml"
41 CODE_SCHEMA = vol.Schema(
43 vol.Required(CONF_NAME): cv.string,
44 vol.Required(CONF_CODE): cv.string,
45 vol.Optional(CONF_TYPE): cv.string,
46 vol.Optional(CONF_DEVICE): cv.string,
47 vol.Optional(CONF_REPEAT): cv.positive_int,
51 SENSOR_SCHEMA = vol.Schema(
53 vol.Optional(CONF_NAME, default=DOMAIN): vol.Exclusive(cv.string,
"sensors"),
54 vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string,
55 vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
59 REMOTE_SCHEMA = vol.Schema(
61 vol.Optional(CONF_NAME, default=DOMAIN): vol.Exclusive(cv.string,
"remotes"),
62 vol.Required(CONF_HOST): cv.string,
63 vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
67 CONFIG_SCHEMA = vol.Schema(
71 vol.Optional(CONF_SENSORS): [SENSOR_SCHEMA],
72 vol.Optional(CONF_REMOTES): [REMOTE_SCHEMA],
76 extra=vol.ALLOW_EXTRA,
81 """Load KIRA codes from specified file."""
83 if os.path.exists(path):
84 with open(path, encoding=
"utf8")
as code_file:
85 data = yaml.safe_load(code_file)
or []
89 except VoluptuousError
as exception:
91 _LOGGER.warning(
"KIRA code invalid data: %s", exception)
93 with open(path,
"w", encoding=
"utf8")
as code_file:
98 def setup(hass: HomeAssistant, config: ConfigType) -> bool:
99 """Set up the KIRA component."""
100 sensors = config.get(DOMAIN, {}).
get(CONF_SENSORS, [])
101 remotes = config.get(DOMAIN, {}).
get(CONF_REMOTES, [])
103 if not (sensors
or remotes):
106 codes =
load_codes(hass.config.path(CODES_YAML))
108 hass.data[DOMAIN] = {CONF_SENSOR: {}, CONF_REMOTE: {}}
110 def load_module(platform, idx, module_conf):
111 """Set up the KIRA module and load platform."""
114 module_name = f
"{DOMAIN}_{idx}" if idx
else DOMAIN
115 device_name = module_conf.get(CONF_NAME, DOMAIN)
116 port = module_conf.get(CONF_PORT, DEFAULT_PORT)
117 host = module_conf.get(CONF_HOST, DEFAULT_HOST)
119 if platform == CONF_SENSOR:
120 module = pykira.KiraReceiver(host, port)
123 module = pykira.KiraModule(host, port)
125 hass.data[DOMAIN][platform][module_name] = module
127 code_tuple = (code.get(CONF_NAME), code.get(CONF_DEVICE, STATE_UNKNOWN))
128 module.registerCode(code_tuple, code.get(CONF_CODE))
130 discovery.load_platform(
131 hass, platform, DOMAIN, {
"name": module_name,
"device": device_name}, config
134 for idx, module_conf
in enumerate(sensors):
135 load_module(CONF_SENSOR, idx, module_conf)
137 for idx, module_conf
in enumerate(remotes):
138 load_module(CONF_REMOTE, idx, module_conf)
140 def _stop_kira(_event):
141 """Stop the KIRA receiver."""
142 for receiver
in hass.data[DOMAIN][CONF_SENSOR].values():
144 _LOGGER.debug(
"Terminated receivers")
146 hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, _stop_kira)
web.Response get(self, web.Request request, str config_key)
bool setup(HomeAssistant hass, ConfigType config)
None open(self, **Any kwargs)