111 lines
3.9 KiB
Python
111 lines
3.9 KiB
Python
"""
|
|
Support for switching devices via pilight to on and off.
|
|
|
|
For more details about this platform, please refer to the documentation at
|
|
https://home-assistant.io/components/switch.pilight/
|
|
"""
|
|
import logging
|
|
|
|
from homeassistant.helpers.config_validation import ensure_list
|
|
import homeassistant.components.pilight as pilight
|
|
from homeassistant.components.switch import SwitchDevice
|
|
|
|
DEPENDENCIES = ['pilight']
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
|
"""Setup the pilight platform."""
|
|
# Find and return switches controlled by pilight
|
|
switches = config.get('switches', {})
|
|
devices = []
|
|
|
|
for dev_name, properties in switches.items():
|
|
devices.append(
|
|
PilightSwitch(
|
|
hass,
|
|
properties.get('name', dev_name),
|
|
properties.get('on_code'),
|
|
properties.get('off_code'),
|
|
ensure_list(properties.get('on_code_receive', False)),
|
|
ensure_list(properties.get('off_code_receive', False))))
|
|
|
|
add_devices_callback(devices)
|
|
|
|
|
|
class PilightSwitch(SwitchDevice):
|
|
"""Representation of a pilight switch."""
|
|
|
|
# pylint: disable=too-many-arguments, too-many-instance-attributes
|
|
def __init__(self, hass, name, code_on, code_off,
|
|
code_on_receive, code_off_receive):
|
|
"""Initialize the switch."""
|
|
self._hass = hass
|
|
self._name = name
|
|
self._state = False
|
|
self._code_on = code_on
|
|
self._code_off = code_off
|
|
self._code_on_receive = code_on_receive
|
|
self._code_off_receive = code_off_receive
|
|
|
|
if any(self._code_on_receive) or any(self._code_off_receive):
|
|
hass.bus.listen(pilight.EVENT, self._handle_code)
|
|
|
|
@property
|
|
def name(self):
|
|
"""Get the name of the switch."""
|
|
return self._name
|
|
|
|
@property
|
|
def should_poll(self):
|
|
"""No polling needed, state set when correct code is received."""
|
|
return False
|
|
|
|
@property
|
|
def is_on(self):
|
|
"""Return true if switch is on."""
|
|
return self._state
|
|
|
|
def _handle_code(self, call):
|
|
"""Check if received code by the pilight-daemon.
|
|
|
|
If the code matches the receive on / off codes of this switch
|
|
the switch state is changed accordingly.
|
|
"""
|
|
# Check if a on code is defined to turn this switch on
|
|
if any(self._code_on_receive):
|
|
for on_code in self._code_on_receive: # Loop through codes
|
|
# True if on_code is contained in received code dict, not
|
|
# all items have to match
|
|
if on_code.items() <= call.data.items():
|
|
self.turn_on()
|
|
# Call turn on only once, even when more than one on
|
|
# code is received
|
|
break
|
|
|
|
# Check if a off code is defined to turn this switch off
|
|
if any(self._code_off_receive):
|
|
for off_code in self._code_off_receive: # Loop through codes
|
|
# True if off_code is contained in received code dict, not
|
|
# all items have to match
|
|
if off_code.items() <= call.data.items():
|
|
self.turn_off()
|
|
# Call turn off only once, even when more than one off
|
|
# code is received
|
|
break
|
|
|
|
def turn_on(self):
|
|
"""Turn the switch on by calling pilight.send service with on code."""
|
|
self._hass.services.call(pilight.DOMAIN, pilight.SERVICE_NAME,
|
|
self._code_on, blocking=True)
|
|
self._state = True
|
|
self.update_ha_state()
|
|
|
|
def turn_off(self):
|
|
"""Turn the switch on by calling pilight.send service with off code."""
|
|
self._hass.services.call(pilight.DOMAIN, pilight.SERVICE_NAME,
|
|
self._code_off, blocking=True)
|
|
self._state = False
|
|
self.update_ha_state()
|