Skip to content
Snippets Groups Projects
Commit c45d897e authored by jkerdreu's avatar jkerdreu
Browse files

- Linting !


git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/Python/branches/0.7@3027 b32b6428-25c9-4566-ad07-03861ab6144f
parent 2b4eb553
No related branches found
No related tags found
No related merge requests found
import colorsys import colorsys
from xaal.schemas import devices
from xaal.lib import tools,Device
import logging import logging
import copy import copy
import functools import functools
import gevent import gevent
from decorator import decorator from decorator import decorator
from xaal.schemas import devices
from xaal.lib import tools
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def run(func, *args, **kwargs): def run(func, *args, **kwargs):
self = args[0] self = args[0]
if not self.lock.ready(): if not self.lock.ready():
logger.warning("LOCKED waiting.. %s" % func) logger.warning(f"LOCKED waiting.. {func}")
self.lock.wait() self.lock.wait()
self.lock.acquire() self.lock.acquire()
try: try:
#logger.debug("Calling %s " % func) # logger.debug("Calling %s " % func)
func(*args, **kwargs) func(*args, **kwargs)
except Exception as e: except Exception as e:
logger.warning(f"{self.bulb} {e} calling {func}") logger.warning(f"{self.bulb} {e} calling {func}")
...@@ -27,40 +27,40 @@ def run(func, *args, **kwargs): ...@@ -27,40 +27,40 @@ def run(func, *args, **kwargs):
@decorator @decorator
def spawn(func, *args, **kwargs): def spawn(func, *args, **kwargs):
ptr = functools.partial(run,func,*args,**kwargs) ptr = functools.partial(run, func, *args, **kwargs)
gevent.spawn(ptr) gevent.spawn(ptr)
def properties_compare(orig, new): def properties_compare(orig, new):
r = {} res = {}
for k in new.keys(): for k in new.keys():
if k in orig.keys(): if k in orig.keys():
if new[k] != orig[k]: if new[k] != orig[k]:
r.update({k:new[k]}) res.update({k: new[k]})
return r return res
class YeelightDev(object): class YeelightDev(object):
def __init__(self,bulb,cfg): def __init__(self, bulb, cfg):
self.bulb = bulb self.bulb = bulb
self.cfg = cfg self.cfg = cfg
self.addr = tools.get_uuid(cfg.get('addr')) self.addr = tools.get_uuid(cfg.get('addr'))
self.dev = None self.dev = None
self.setup() self.setup()
self.set_xaal() self.set_xaal()
logger.info('New device at %s : %s' % (bulb._ip,self.addr)) logger.info(f"New device at {bulb._ip} : {self.addr}")
# It's safer to use a lock to avoid the socket to be used w/ 2 greenlets at the same time. # It's safer to use a lock to avoid the socket to be used w/ 2 greenlets at the same time.
# This can occurs on the device refresh # This can occurs on the device refresh
self.lock = gevent.lock.BoundedSemaphore(1) self.lock = gevent.lock.BoundedSemaphore(1)
#self.bulb.start_music() # self.bulb.start_music()
def debug_properties(self,properties): def debug_properties(self, properties):
if not hasattr(self,'last_properties'): if not hasattr(self, 'last_properties'):
self.last_properties = properties self.last_properties = properties
logger.debug(properties) logger.debug(properties)
return return
# for debugging only display changes # for debugging only display changes
changes = properties_compare(self.last_properties,properties) changes = properties_compare(self.last_properties, properties)
if changes: if changes:
logger.debug(changes) logger.debug(changes)
self.last_properties = copy.copy(properties) self.last_properties = copy.copy(properties)
...@@ -113,7 +113,7 @@ class RGBW(YeelightDev): ...@@ -113,7 +113,7 @@ class RGBW(YeelightDev):
dev.methods['set_hsv'] = self.set_hsv dev.methods['set_hsv'] = self.set_hsv
dev.methods['set_white_temperature'] = self.set_white_temperature dev.methods['set_white_temperature'] = self.set_white_temperature
dev.methods['set_mode'] = self.set_mode dev.methods['set_mode'] = self.set_mode
dev.info = 'RGBW / %s' % self.addr dev.info = f"RGBW / {self.addr}"
dev.attributes['hsv'] = [0, 0, 0] dev.attributes['hsv'] = [0, 0, 0]
dev.unsupported_attributes = ['scene'] dev.unsupported_attributes = ['scene']
dev.unsupported_methods = ['get_scene', 'set_scene'] dev.unsupported_methods = ['get_scene', 'set_scene']
...@@ -146,8 +146,7 @@ class RGBW(YeelightDev): ...@@ -146,8 +146,7 @@ class RGBW(YeelightDev):
duration = int(_smooth) duration = int(_smooth)
else: else:
duration = int(self.cfg.get('smooth_default', 500)) duration = int(self.cfg.get('smooth_default', 500))
if duration < 50: duration = max(duration, 50)
duration = 50
self.bulb.turn_on() self.bulb.turn_on()
self.bulb.duration = duration self.bulb.duration = duration
self.bulb.set_hsv(h, s, v) self.bulb.set_hsv(h, s, v)
...@@ -159,7 +158,6 @@ class RGBW(YeelightDev): ...@@ -159,7 +158,6 @@ class RGBW(YeelightDev):
self.dev.engine.add_timer(self.get_properties, target, 1) self.dev.engine.add_timer(self.get_properties, target, 1)
self.dev.engine.add_timer(self.get_properties, target+0.5, 1) self.dev.engine.add_timer(self.get_properties, target+0.5, 1)
@spawn @spawn
def set_hsv(self, _hsv, _smooth=None): def set_hsv(self, _hsv, _smooth=None):
# FIXME # FIXME
...@@ -173,8 +171,7 @@ class RGBW(YeelightDev): ...@@ -173,8 +171,7 @@ class RGBW(YeelightDev):
duration = int(_smooth) duration = int(_smooth)
else: else:
duration = int(self.cfg.get('smooth_default', 500)) duration = int(self.cfg.get('smooth_default', 500))
if duration < 50: duration = max(duration, 50)
duration = 50
self.bulb.turn_on() self.bulb.turn_on()
self.bulb.duration = duration self.bulb.duration = duration
...@@ -210,12 +207,12 @@ class RGBW(YeelightDev): ...@@ -210,12 +207,12 @@ class RGBW(YeelightDev):
self.debug_properties(props) self.debug_properties(props)
attrs = self.dev.attributes attrs = self.dev.attributes
# light state # light state
power = props.get('power',None) power = props.get('power', None)
if power: if power:
if power == 'on' : attrs['light'] = True if power == 'on' : attrs['light'] = True
if power == 'off': attrs['light'] = False if power == 'off': attrs['light'] = False
# color mode ? # color mode ?
mode = props.get('color_mode',None) mode = props.get('color_mode', None)
if mode: if mode:
if mode == '2' : attrs['mode'] = 'white' if mode == '2' : attrs['mode'] = 'white'
if mode == '1' : attrs['mode'] = 'color' if mode == '1' : attrs['mode'] = 'color'
...@@ -229,14 +226,14 @@ class RGBW(YeelightDev): ...@@ -229,14 +226,14 @@ class RGBW(YeelightDev):
if bright: if bright:
attrs['brightness'] = int(bright) attrs['brightness'] = int(bright)
#hsv = list(attrs['hsv']) # hsv = list(attrs['hsv'])
#hsv[2] = round(int(bright)/100.0, 2) # hsv[2] = round(int(bright)/100.0, 2)
#attrs['hsv'] = hsv # attrs['hsv'] = hsv
# Yeelight Python API provide both rgb and hsv values # Yeelight Python API provide both rgb and hsv values
# we parse both, even if we don't' issue set_hsv # we parse both, even if we don't' issue set_hsv
# sat ? # sat ?
# sat = props.get('sat',None) # sat = props.get('sat',None)
# if sat: # if sat:
# hsv = attrs['hsv'] # hsv = attrs['hsv']
# hsv[1] = (int(sat) / 100.0) # hsv[1] = (int(sat) / 100.0)
# attrs['hsv']=list(hsv) # attrs['hsv']=list(hsv)
...@@ -247,7 +244,6 @@ class RGBW(YeelightDev): ...@@ -247,7 +244,6 @@ class RGBW(YeelightDev):
# hsv[0] = int(hue) # hsv[0] = int(hue)
# attrs['hsv']=hsv # attrs['hsv']=hsv
if rgb: if rgb:
rgb = int(rgb) rgb = int(rgb)
r = (rgb >> 16) / 255 r = (rgb >> 16) / 255
...@@ -259,4 +255,4 @@ class RGBW(YeelightDev): ...@@ -259,4 +255,4 @@ class RGBW(YeelightDev):
s = hsv[1] s = hsv[1]
v = hsv[2] v = hsv[2]
attrs['hsv'] = [h, s, v] attrs['hsv'] = [h, s, v]
#attrs['brightness'] = int(hsv[2] * 100) # attrs['brightness'] = int(hsv[2] * 100)
...@@ -14,63 +14,62 @@ logger = logging.getLogger(PACKAGE_NAME) ...@@ -14,63 +14,62 @@ logger = logging.getLogger(PACKAGE_NAME)
# disable internal logging # disable internal logging
logging.getLogger("yeelight").setLevel(logging.WARNING) logging.getLogger("yeelight").setLevel(logging.WARNING)
class GW(object): class GW(object):
def __init__(self,engine): def __init__(self, engine):
self.engine = engine self.engine = engine
self.devices = [] self.devices = []
atexit.register(self._exit) atexit.register(self._exit)
self.config() self.config()
self.setup() self.setup()
self.refresh() self.refresh()
self.engine.add_timer(self.refresh,60) self.engine.add_timer(self.refresh, 60)
def config(self): def config(self):
cfg = tools.load_cfg(PACKAGE_NAME) cfg = tools.load_cfg(PACKAGE_NAME)
if not cfg: if not cfg:
cfg= tools.new_cfg(PACKAGE_NAME) cfg = tools.new_cfg(PACKAGE_NAME)
cfg['devices'] = {} cfg['devices'] = {}
logger.warn("Created an empty config file") logger.warn("Created an empty config file")
cfg.write() cfg.write()
self.cfg = cfg self.cfg = cfg
def setup_(self): def setup_(self):
logger.info("Searching for bulbs") logger.info("Searching for bulbs")
bulbs = yeelight.discover_bulbs() bulbs = yeelight.discover_bulbs()
cfg = self.cfg['devices'] cfg = self.cfg['devices']
for k in bulbs: for k in bulbs:
tmp = cfg.get(k['ip'],None) tmp = cfg.get(k['ip'], None)
addr = None addr = None
if tmp: if tmp:
addr = tools.get_uuid( tmp.get('addr',None) ) addr = tools.get_uuid(tmp.get('addr', None))
if not addr: if not addr:
addr = tools.get_random_uuid() addr = tools.get_random_uuid()
cfg[k['ip']] = {'addr':str(addr)} cfg[k['ip']] = {'addr': str(addr)}
bulb = yeelight.Bulb(k['ip'],k['port']) bulb = yeelight.Bulb(k['ip'], k['port'])
dev = devices.RGBW(bulb,cfg[k]) dev = devices.RGBW(bulb, cfg[k])
self.engine.add_device(dev.dev) self.engine.add_device(dev.dev)
def setup(self): def setup(self):
logger.info("Loading bulbs") logger.info("Loading bulbs")
cfg = self.cfg['devices'] cfg = self.cfg['devices']
for k in cfg: for k in cfg:
tmp = cfg.get(k,None) tmp = cfg.get(k, None)
addr = None addr = None
if tmp: if tmp:
addr = tools.get_uuid( tmp.get('addr',None) ) addr = tools.get_uuid(tmp.get('addr', None))
if not addr: if not addr:
addr = tools.get_random_uuid() addr = tools.get_random_uuid()
cfg[k['ip']] = {'addr':str(addr)} cfg[k['ip']] = {'addr': str(addr)}
bulb = yeelight.Bulb(k) bulb = yeelight.Bulb(k)
dev = devices.RGBW(bulb,cfg[k]) dev = devices.RGBW(bulb, cfg[k])
self.devices.append(dev) self.devices.append(dev)
self.engine.add_device(dev.dev) self.engine.add_device(dev.dev)
def refresh(self): def refresh(self):
for d in self.devices: for dev in self.devices:
d.get_properties() dev.get_properties()
d.set_xaal() dev.set_xaal()
def _exit(self): def _exit(self):
cfg = tools.load_cfg(PACKAGE_NAME) cfg = tools.load_cfg(PACKAGE_NAME)
...@@ -78,6 +77,7 @@ class GW(object): ...@@ -78,6 +77,7 @@ class GW(object):
logger.info('Saving configuration file') logger.info('Saving configuration file')
self.cfg.write() self.cfg.write()
def setup(eng): def setup(eng):
GW(eng) GW(eng)
return True return True
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment