forked from platypush/platypush
Added plugin to control a TP-Link HS100 and similar smart plugs/switches
This commit is contained in:
parent
a4d74fdeb8
commit
0f3895ad41
1 changed files with 95 additions and 0 deletions
95
platypush/plugins/switch/tplink.py
Normal file
95
platypush/plugins/switch/tplink.py
Normal file
|
@ -0,0 +1,95 @@
|
|||
from pyHS100 import Discover
|
||||
|
||||
from platypush.message.response import Response
|
||||
from platypush.plugins.switch import SwitchPlugin
|
||||
|
||||
|
||||
class SwitchTplinkPlugin(SwitchPlugin):
|
||||
"""
|
||||
Plugin to interact with TP-Link smart switches/plugs like the HS100
|
||||
(https://www.tp-link.com/us/products/details/cat-5516_HS100.html).
|
||||
|
||||
Requires:
|
||||
|
||||
* **pyHS100** (``pip install pyHS100``)
|
||||
"""
|
||||
|
||||
def _scan(self):
|
||||
return Discover.discover()
|
||||
|
||||
def status(self):
|
||||
"""
|
||||
:returns: The available device over the network as a
|
||||
"""
|
||||
|
||||
devices = dict(
|
||||
(ip, {
|
||||
'alias': dev.alias,
|
||||
'current_consumption': dev.current_consumption,
|
||||
'host': dev.host,
|
||||
'hw_info': dev.hw_info,
|
||||
'on': dev.is_on,
|
||||
})
|
||||
|
||||
for (ip, dev) in self._scan()
|
||||
)
|
||||
|
||||
return Response(output=devices)
|
||||
|
||||
def on(self, device):
|
||||
"""
|
||||
Turn on a device
|
||||
|
||||
:param device: Device IP or hostname
|
||||
:type device: str
|
||||
"""
|
||||
|
||||
devices = self._scan()
|
||||
if device not in devices:
|
||||
raise RuntimeError('Device {} not found'.format(device))
|
||||
|
||||
devices[device].turn_on()
|
||||
return Response(output={'status':'on'})
|
||||
|
||||
|
||||
def off(self, device):
|
||||
"""
|
||||
Turn off a device
|
||||
|
||||
:param device: Device IP or hostname
|
||||
:type device: str
|
||||
"""
|
||||
|
||||
devices = self._scan()
|
||||
if device not in devices:
|
||||
raise RuntimeError('Device {} not found'.format(device))
|
||||
|
||||
devices[device].turn_off()
|
||||
return Response(output={'status':'off'})
|
||||
|
||||
|
||||
def toggle(self, device):
|
||||
"""
|
||||
Toggle the state of a device (on/off)
|
||||
|
||||
:param device: Device IP or hostname
|
||||
:type device: str
|
||||
"""
|
||||
|
||||
devices = self._scan()
|
||||
if device not in devices:
|
||||
raise RuntimeError('Device {} not found'.format(device))
|
||||
|
||||
dev = devices[device]
|
||||
is_on = dev.is_on
|
||||
|
||||
if is_on:
|
||||
dev.turn_off()
|
||||
else:
|
||||
dev.turn_on()
|
||||
|
||||
return Response(output={'status': 'off' if is_on else 'on'})
|
||||
|
||||
|
||||
# vim:sw=4:ts=4:et:
|
||||
|
Loading…
Reference in a new issue