platypush/platypush/plugins/switch/wemo/__init__.py

123 lines
3.2 KiB
Python
Raw Normal View History

from platypush.plugins import action
from platypush.plugins.switch import SwitchPlugin
2017-11-04 00:13:22 +01:00
class SwitchWemoPlugin(SwitchPlugin):
2018-06-25 19:57:43 +02:00
"""
2019-07-02 12:02:28 +02:00
Plugin to control a Belkin WeMo smart switches
2018-06-25 19:57:43 +02:00
(https://www.belkin.com/us/Products/home-automation/c/wemo-home-automation/)
Requires:
* **ouimeaux** (``pip install ouimeaux``)
"""
2019-07-02 12:02:28 +02:00
def __init__(self, discovery_seconds=3, **kwargs):
2018-06-25 19:57:43 +02:00
"""
:param discovery_seconds: Discovery time when scanning for devices (default: 3)
:type discovery_seconds: int
"""
2017-12-18 01:10:51 +01:00
2019-07-02 12:02:28 +02:00
super().__init__(**kwargs)
self.discovery_seconds = discovery_seconds
self.env = None
def _refresh_devices(self):
2018-06-25 19:57:43 +02:00
""" Update the list of available devices """
2018-06-06 20:09:18 +02:00
self.logger.info('Starting WeMo discovery')
self._get_environment()
self.env.discover(seconds=self.discovery_seconds)
2019-07-02 12:02:28 +02:00
self._devices = self.env.devices
def _get_environment(self):
if not self.env:
from ouimeaux.environment import Environment
self.env = Environment()
self.env.start()
self._refresh_devices()
2019-07-02 12:02:28 +02:00
@property
def devices(self):
2018-06-25 19:57:43 +02:00
"""
Get the list of available devices
:returns: The list of devices.
Example output::
2019-07-02 12:02:28 +02:00
output = [
2018-06-25 19:57:43 +02:00
{
2019-07-02 12:02:28 +02:00
"ip": "192.168.1.123",
2018-06-25 19:57:43 +02:00
"name": "Switch 1",
"state": 1,
"model": "Belkin Plugin Socket 1.0",
"serialnumber": "123456ABCDEF"
},
{
# ...
}
]
"""
self._refresh_devices()
2019-07-02 12:02:28 +02:00
return [
{
'id': dev.name,
'ip': dev.host,
'name': dev.name,
'model': dev.model,
'on': True if dev.get_state() else False,
'serialnumber': dev.serialnumber,
}
for (name, dev) in self._devices.items()
]
def _exec(self, method, device, *args, **kwargs):
self._get_environment()
2019-07-02 12:02:28 +02:00
if device not in self._devices:
self._refresh_devices()
2019-07-02 12:02:28 +02:00
if device not in self._devices:
raise RuntimeError('Device {} not found'.format(device))
self.logger.info('Executing {} on WeMo device {}'.
format(method, device))
2019-07-02 12:02:28 +02:00
dev = self._devices[device]
getattr(dev, method)(*args, **kwargs)
2019-07-02 12:02:28 +02:00
return self.status(device)
2017-11-04 00:13:22 +01:00
@action
2019-07-02 12:02:28 +02:00
def on(self, device, **kwargs):
2018-06-25 19:57:43 +02:00
"""
Turn a switch on
:param device: Device name
:type device: str
"""
return self._exec('on', device)
2017-11-04 00:13:22 +01:00
@action
2019-07-02 12:02:28 +02:00
def off(self, device, **kwargs):
2018-06-25 19:57:43 +02:00
"""
Turn a switch off
:param device: Device name
:type device: str
"""
return self._exec('off', device)
2017-11-04 00:13:22 +01:00
@action
2019-07-02 12:02:28 +02:00
def toggle(self, device, **kwargs):
2018-06-25 19:57:43 +02:00
"""
Toggle the state of a switch (on/off)
:param device: Device name
:type device: str
"""
return self._exec('toggle', device)
2017-11-04 00:13:22 +01:00
# vim:sw=4:ts=4:et: