From 18f38229b228e76b7a8e50c0a52aa30d653b863f Mon Sep 17 00:00:00 2001 From: Alan Fischer Date: Mon, 13 Feb 2017 03:10:34 -0700 Subject: [PATCH] iTach Remote Platform (#5660) * Added itach remote device * Added coverage & requirements * Updated requirements * Added schema, inline commands, and platform_setup failure if itach not found * Removed unnecessary optional parameter * Removed filename option for itach remote --- .coveragerc | 1 + homeassistant/components/remote/itach.py | 111 +++++++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 115 insertions(+) create mode 100644 homeassistant/components/remote/itach.py diff --git a/.coveragerc b/.coveragerc index 8d7d58f7f65..0d141ec42f1 100644 --- a/.coveragerc +++ b/.coveragerc @@ -282,6 +282,7 @@ omit = homeassistant/components/notify/xmpp.py homeassistant/components/nuimo_controller.py homeassistant/components/remote/harmony.py + homeassistant/components/remote/itach.py homeassistant/components/scene/hunterdouglas_powerview.py homeassistant/components/sensor/amcrest.py homeassistant/components/sensor/arest.py diff --git a/homeassistant/components/remote/itach.py b/homeassistant/components/remote/itach.py new file mode 100644 index 00000000000..d76c39bf36a --- /dev/null +++ b/homeassistant/components/remote/itach.py @@ -0,0 +1,111 @@ +""" +Support for iTach IR Devices. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/remote.itach/ +""" + +import logging + +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +import homeassistant.components.remote as remote +from homeassistant.const import ( + DEVICE_DEFAULT_NAME, CONF_NAME, CONF_MAC, CONF_HOST, CONF_PORT, + CONF_DEVICES) +from homeassistant.components.remote import ( + PLATFORM_SCHEMA, ATTR_COMMAND) + +REQUIREMENTS = ['pyitachip2ir==0.0.5'] + +_LOGGER = logging.getLogger(__name__) + +DEFAULT_PORT = 4998 +CONNECT_TIMEOUT = 5000 + +CONF_MODADDR = 'modaddr' +CONF_CONNADDR = 'connaddr' +CONF_COMMANDS = 'commands' +CONF_DATA = 'data' + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_MAC): cv.string, + vol.Required(CONF_HOST): cv.string, + vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + vol.Required(CONF_DEVICES): vol.All(cv.ensure_list, [{ + vol.Optional(CONF_NAME): cv.string, + vol.Optional(CONF_MODADDR): vol.Coerce(int), + vol.Required(CONF_CONNADDR): vol.Coerce(int), + vol.Required(CONF_COMMANDS): vol.All(cv.ensure_list, [{ + vol.Required(CONF_NAME): cv.string, + vol.Required(CONF_DATA): cv.string + }]) + }]) +}) + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up the ITach connection and devices.""" + import pyitachip2ir + itachip2ir = pyitachip2ir.ITachIP2IR( + config.get(CONF_MAC), config.get(CONF_HOST), + int(config.get(CONF_PORT))) + + if not itachip2ir.ready(CONNECT_TIMEOUT): + _LOGGER.error("Unable to find iTach") + return False + + devices = [] + for data in config.get(CONF_DEVICES): + name = data.get(CONF_NAME) + modaddr = int(data.get(CONF_MODADDR, 1)) + connaddr = int(data.get(CONF_CONNADDR, 1)) + cmddata = "" + for cmd in data.get(CONF_COMMANDS): + cmddata += cmd[CONF_NAME] + "\n" + cmd[CONF_DATA] + "\n" + itachip2ir.addDevice(name, modaddr, connaddr, cmddata) + devices.append(ITachIP2IRRemote(itachip2ir, name)) + add_devices(devices, True) + return True + + +class ITachIP2IRRemote(remote.RemoteDevice): + """Device that sends commands to an ITachIP2IR device.""" + + def __init__(self, itachip2ir, name): + """Initialize device.""" + self.itachip2ir = itachip2ir + self._power = False + self._name = name or DEVICE_DEFAULT_NAME + + @property + def name(self): + """Return the name of the device.""" + return self._name + + @property + def is_on(self): + """Return true if device is on.""" + return self._power + + def turn_on(self, **kwargs): + """Turn the device on.""" + self._power = True + self.itachip2ir.send(self._name, "ON", 1) + self.schedule_update_ha_state() + + def turn_off(self): + """Turn the device off.""" + self._power = False + self.itachip2ir.send(self._name, "OFF", 1) + self.schedule_update_ha_state() + + def send_command(self, **kwargs): + """Send a command to one device.""" + self.itachip2ir.send(self._name, kwargs[ATTR_COMMAND], 1) + + def update(self): + """Update the device.""" + self.itachip2ir.update() diff --git a/requirements_all.txt b/requirements_all.txt index 0a26e1bbf72..d7ebf40dd6a 100755 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -474,6 +474,9 @@ pyicloud==0.9.1 # homeassistant.components.binary_sensor.iss pyiss==1.0.1 +# homeassistant.components.remote.itach +pyitachip2ir==0.0.5 + # homeassistant.components.sensor.lastfm pylast==1.7.0