forked from platypush/platypush
Implemented Philips Hue plugin
This commit is contained in:
parent
9183599664
commit
1e75d2bda1
3 changed files with 118 additions and 10 deletions
|
@ -1,9 +1,11 @@
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import logging
|
||||||
|
|
||||||
class Plugin(object):
|
class Plugin(object):
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
self.config = config
|
self.config = config
|
||||||
|
self._set_logging()
|
||||||
|
|
||||||
for cls in reversed(self.__class__.mro()):
|
for cls in reversed(self.__class__.mro()):
|
||||||
if cls is not object:
|
if cls is not object:
|
||||||
|
@ -12,6 +14,11 @@ class Plugin(object):
|
||||||
except AttributeError as e:
|
except AttributeError as e:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def _set_logging(self):
|
||||||
|
if 'logging' in self.config:
|
||||||
|
logging.basicConfig(level=getattr(logging, self.config['logging']))
|
||||||
|
else:
|
||||||
|
logging.basicConfig(level=logging.INFO)
|
||||||
|
|
||||||
def run(self, method, *args, **kwargs):
|
def run(self, method, *args, **kwargs):
|
||||||
res = getattr(self, method)(*args, **kwargs)
|
res = getattr(self, method)(*args, **kwargs)
|
||||||
|
|
|
@ -1,16 +1,6 @@
|
||||||
from .. import Plugin
|
from .. import Plugin
|
||||||
|
|
||||||
class LightPlugin(Plugin):
|
class LightPlugin(Plugin):
|
||||||
def run(self, args):
|
|
||||||
if 'on' in args and args['on']:
|
|
||||||
self.on()
|
|
||||||
elif 'off' in args and args['off']:
|
|
||||||
self.off()
|
|
||||||
elif 'toggle' in args and args['toggle']:
|
|
||||||
self.toggle()
|
|
||||||
|
|
||||||
return self.status()
|
|
||||||
|
|
||||||
def on(self):
|
def on(self):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
|
111
runbullet/plugins/light/hue/__init__.py
Normal file
111
runbullet/plugins/light/hue/__init__.py
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from phue import Bridge
|
||||||
|
|
||||||
|
from .. import LightPlugin
|
||||||
|
|
||||||
|
class LightHuePlugin(LightPlugin):
|
||||||
|
""" Python dependencies """
|
||||||
|
_requires = [
|
||||||
|
'phue'
|
||||||
|
]
|
||||||
|
|
||||||
|
MAX_BRI = 255
|
||||||
|
MAX_SAT = 255
|
||||||
|
MAX_HUE = 65535
|
||||||
|
|
||||||
|
def _init(self):
|
||||||
|
self.bridge_address = self.config['bridge']
|
||||||
|
self.bridge = None
|
||||||
|
logging.info('Initializing Hue lights plugin - bridge: "{}"'.
|
||||||
|
format(self.bridge_address))
|
||||||
|
|
||||||
|
self.connect()
|
||||||
|
self.lights = []; self.groups = []
|
||||||
|
|
||||||
|
if 'lights' in self.config:
|
||||||
|
self.lights = self.config['lights']
|
||||||
|
elif 'groups' in self.config:
|
||||||
|
self.groups = self.config['groups']
|
||||||
|
self._expand_groups(self.groups)
|
||||||
|
else:
|
||||||
|
self.lights = [l.name for l in self.bridge.lights]
|
||||||
|
|
||||||
|
logging.info('Configured lights: "{}"'. format(self.lights))
|
||||||
|
|
||||||
|
def _expand_groups(self, group_names):
|
||||||
|
groups = [g for g in self.bridge.groups
|
||||||
|
if g.name in group_names]
|
||||||
|
|
||||||
|
for g in groups:
|
||||||
|
self.lights.extend([l.name for l in g.lights])
|
||||||
|
|
||||||
|
def connect(self):
|
||||||
|
# Lazy init
|
||||||
|
if not self.bridge:
|
||||||
|
self.bridge = Bridge(self.bridge_address)
|
||||||
|
logging.info('Bridge connected')
|
||||||
|
|
||||||
|
# uncomment these lines if you're running huectrl for
|
||||||
|
# the first time and you need to pair it to the switch
|
||||||
|
|
||||||
|
# self.bridge.connect()
|
||||||
|
# self.bridge.get_api()
|
||||||
|
else:
|
||||||
|
logging.info('Bridge already connected')
|
||||||
|
|
||||||
|
|
||||||
|
def _execute(self, setting, *args, **kwargs):
|
||||||
|
try:
|
||||||
|
self.connect()
|
||||||
|
except Exception as e:
|
||||||
|
logging.exception(e)
|
||||||
|
# Reset bridge connection
|
||||||
|
self.bridge = None
|
||||||
|
return
|
||||||
|
|
||||||
|
lights = []; groups = []
|
||||||
|
if 'lights' in kwargs and kwargs['lights']:
|
||||||
|
lights = kwargs['lights'].split(',') \
|
||||||
|
if isinstance(lights, str) else kwargs['lights']
|
||||||
|
elif 'groups' in kwargs and kwargs['lights']:
|
||||||
|
groups = kwargs['groups'].split(',') \
|
||||||
|
if isinstance(groups, str) else kwargs['groups']
|
||||||
|
else:
|
||||||
|
lights = self.lights
|
||||||
|
groups = self.groups
|
||||||
|
|
||||||
|
logging.info('[Setting: {}] [Values: {}] [Lights: {}] [Groups: {}]'.
|
||||||
|
format(setting, args, lights, groups))
|
||||||
|
|
||||||
|
try:
|
||||||
|
if groups:
|
||||||
|
self.bridge.set_group(groups, setting, *args)
|
||||||
|
elif lights:
|
||||||
|
self.bridge.set_light(lights, setting, *args)
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
logging.exception(e)
|
||||||
|
# Reset bridge connection
|
||||||
|
self.bridge = None
|
||||||
|
|
||||||
|
def on(self, lights=[], groups=[]):
|
||||||
|
self._execute('on', True, lights=lights, groups=groups)
|
||||||
|
|
||||||
|
def off(self, lights=[], groups=[]):
|
||||||
|
self._execute('on', False, lights=lights, groups=groups)
|
||||||
|
|
||||||
|
def bri(self, value, lights=[], groups=[]):
|
||||||
|
self._execute('bri', int(value) % (MAX_BRI+1), lights=lights, groups=groups)
|
||||||
|
|
||||||
|
def sat(self, value, lights=[], groups=[]):
|
||||||
|
self._execute('sat', int(value) % (MAX_SAT+1), lights=lights, groups=groups)
|
||||||
|
|
||||||
|
def hue(self, value, lights=[], groups=[]):
|
||||||
|
self._execute('hue', int(value) % (MAX_HUE+1), lights=lights, groups=groups)
|
||||||
|
|
||||||
|
def status(self):
|
||||||
|
return ['']
|
||||||
|
|
||||||
|
# vim:sw=4:ts=4:et:
|
||||||
|
|
Loading…
Reference in a new issue