diff --git a/README.md b/README.md index 5eb5ad4937a..1648b526332 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ It offers the following functionality through built-in components: * Track and control [Google Chromecasts](http://www.google.com/intl/en/chrome/devices/chromecast) * Track running services by monitoring `ps` output * Track and control [Tellstick devices and sensors](http://www.telldus.se/products/tellstick) + * Control low-cost 433 MHz remote control wall-socket devices (https://github.com/r10r/rcswitch-pi) and other switches that can be turned on/off with shell commands * Turn on the lights when people get home after sun set * Turn on lights slowly during sun set to compensate for light loss * Turn off all lights and devices when everybody leaves the house diff --git a/homeassistant/components/switch/command_switch.py b/homeassistant/components/switch/command_switch.py new file mode 100644 index 00000000000..163881bbf19 --- /dev/null +++ b/homeassistant/components/switch/command_switch.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +import logging +from homeassistant.helpers.entity import ToggleEntity +from homeassistant.const import STATE_ON, STATE_OFF, DEVICE_DEFAULT_NAME +import subprocess + +_LOGGER = logging.getLogger(__name__) + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices_callback, discovery_info=None): + """ Find and return switches controlled by shell commands. """ + + switches = config.get('switches', {}) + devices = [] + + for k, v in switches.items(): + devices.append( + CommandSwitch( + k, + v.get('oncmd', 'true'), + v.get('offcmd', 'true'))) + + add_devices_callback(devices) + + +class CommandSwitch(ToggleEntity): + def __init__(self, name, command_on, command_off): + self._name = name or DEVICE_DEFAULT_NAME + self._state = STATE_OFF + self._command_on = command_on + self._command_off = command_off + + @staticmethod + def _switch(command): + _LOGGER.info('Running command: {}'.format(command)) + + success = (subprocess.call(command, shell=True) == 0) + + if not success: + _LOGGER.error('Command failed: {}'.format(command)) + + return success + + @property + def should_poll(self): + return False + + @property + def name(self): + return self._name + + @property + def state(self): + return self._state + + @property + def is_on(self): + return self._state == STATE_ON + + def turn_on(self, **kwargs): + if CommandSwitch._switch(self._command_on): + self._state = STATE_ON + + def turn_off(self, **kwargs): + if CommandSwitch._switch(self._command_off): + self._state = STATE_OFF +