101 lines
2.7 KiB
Python
101 lines
2.7 KiB
Python
|
|
from platypush.plugins import Plugin, action
|
|
|
|
|
|
class HomeseerPlugin(Plugin):
|
|
"""
|
|
This plugin allows you interact with an existing HomeSeer setup,
|
|
query and control connected devices.
|
|
|
|
Requires:
|
|
|
|
* **pyhomeseer** (``pip install git+https://github.com/legrego/PyHomeSeer``)
|
|
"""
|
|
|
|
def __init__(self, host, username=None, password=None, *args, **kwargs):
|
|
"""
|
|
:param host: IP or hostname of your HomeSeer hub
|
|
:type host: str
|
|
|
|
:param username: HomeSeer username
|
|
:type username: str
|
|
|
|
:param password: HomeSeer password
|
|
:type password: str
|
|
"""
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self.host = host
|
|
self.username = username
|
|
self.password = password
|
|
self._client = None
|
|
|
|
def _get_client(self):
|
|
from pyhomeseer.homeseer_client import HomeSeerClient
|
|
|
|
if not self._client:
|
|
self._client = HomeSeerClient(host=self.host,
|
|
username=self.username,
|
|
password=self.password)
|
|
|
|
return self._client
|
|
|
|
|
|
@action
|
|
def query_devices(self, ref=None, location=None):
|
|
"""
|
|
Get a list of devices connected to HomeSeer with their status
|
|
|
|
:param ref: Device reference. If not set, all the devices will be queried
|
|
:type ref: int
|
|
|
|
:param location: Device location. If not set, all the devices will be queried
|
|
:type location: str
|
|
"""
|
|
|
|
client = self._get_client()
|
|
|
|
if ref is not None:
|
|
devices = client.get_devices(ref=ref)
|
|
elif location is not None:
|
|
devices = client.get_devices(location=location)
|
|
else:
|
|
devices = client.get_devices()
|
|
|
|
return [
|
|
{
|
|
attr: getattr(dev, attr)
|
|
for attr in ['ref','name','location','value','status']
|
|
}
|
|
for dev in devices
|
|
]
|
|
|
|
|
|
@action
|
|
def control(self, ref, value=None, label=None):
|
|
"""
|
|
Control a HomeSeer connected device.
|
|
|
|
:param ref: Device reference
|
|
:type ref: int
|
|
|
|
:param value: If set, then control the device with this specific int value
|
|
:type value: int
|
|
|
|
:param label: If set, then control the device with this specific label
|
|
(e.g. 'On' or 'Off')
|
|
:type label: str
|
|
"""
|
|
|
|
if value is None and label is None:
|
|
raise RuntimeError('Please specify either value or label')
|
|
|
|
client = self._get_client()
|
|
|
|
if value is not None:
|
|
return client.control(ref=ref, value=value)
|
|
return client.control(ref=ref, label=label)
|
|
|
|
|
|
# vim:sw=4:ts=4:et:
|