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

Another try to manager color flowing. This looks ok now.

git-svn-id: https://redmine.imt-atlantique.fr/svn/xaal/code/Python/branches/0.7@2520 b32b6428-25c9-4566-ad07-03861ab6144f
parent 39db9b44
No related branches found
No related tags found
No related merge requests found
......@@ -15,14 +15,14 @@ from gevent.util import wrap_errors
from decorator import decorator
def retry(func,*args,**kwargs):
def run(func,*args,**kwargs):
lock = args[0].lock
if not lock.ready():
logger.warning("LOCKED waiting.. %s" % func)
lock.wait()
lock.acquire()
try:
logger.debug("Calling %s " % func)
#logger.debug("Calling %s " % func)
func(*args,**kwargs)
except Exception as e:
logger.warning(e)
......@@ -31,7 +31,7 @@ def retry(func,*args,**kwargs):
@decorator
def spawn(func,*args,**kwargs):
ptr = functools.partial(retry,func,*args,**kwargs)
ptr = functools.partial(run,func,*args,**kwargs)
gevent.spawn(ptr)
......@@ -59,12 +59,12 @@ class YeelightDev(object):
def debug_properties(self,properties):
if not hasattr(self,'last_properties'):
self.last_properties = properties
logger.warning(properties)
logger.debug(properties)
return
# for debugging only display changes
changes = properties_compare(self.last_properties,properties)
if changes:
logger.warning(changes)
logger.debug(changes)
self.last_properties = copy.copy(properties)
def set_xaal(self):
......@@ -113,12 +113,14 @@ class RGBW(YeelightDev):
dev.methods['set_brightness'] = self.set_brightness
dev.methods['set_hsv'] = self.set_hsv
dev.methods['set_white_temperature'] = self.set_white_temperature
dev.methods['set_mode'] = self.set_mode
dev.methods['debug'] = self.debug
dev.info = 'RGBW / %s' % self.addr
dev.schema = 'https://redmine.telecom-bretagne.eu/svn/xaal/schemas/branches/schemas-0.7/lamp.color'
dev.attributes['hsv'] = [0,0,0]
dev.unsupported_attributes = ['scene']
dev.unsupported_methods = ['get_scene','set_scene']
self.dev = dev
self.flowing_timer = False
def debug(self):
import pdb;pdb.set_trace()
......@@ -132,8 +134,11 @@ class RGBW(YeelightDev):
@spawn
def set_hsv(self,_hsv,_smooth=200):
# TBD
# FIXME
if isinstance(_hsv,str):
hsv = [float(k) for k in list(_hsv.split(','))]
else:
hsv = _hsv
h,s,v = hsv
v = int(v * 100)
s = int(s * 100)
......@@ -146,15 +151,27 @@ class RGBW(YeelightDev):
self.bulb.set_hsv(h,s,v)
gevent.sleep(0.2)
self._update_properties()
#gevent.sleep(10)
target = round((duration / 1000.0),1)
# we schedule some get_properties at the end of the flow to update the current color
# As time drift, don't expect to have it working for a 1 hour flow.
self.dev.engine.add_timer(self.get_properties,target,1)
self.dev.engine.add_timer(self.get_properties,target+0.5,1)
@spawn
def set_white_temperature(self,_white_temperature):
val = int(_white_temperature)
self.bulb.turn_on()
self.bulb.duration = 5000
self.bulb.set_color_temp(val)
self._update_properties()
def set_mode(self,_mode):
# no need to spwan here, because it's a simple switch
# bulb has to be 'on'. If not, we don't receive the bulb properties updates
if _mode == 'color':
self.set_hsv(self.dev.attributes['hsv'])
if _mode == 'white':
self.set_white_temperature(self.dev.attributes['white_temperature'])
def on_properties(self,props):
self.debug_properties(props)
......@@ -187,23 +204,9 @@ class RGBW(YeelightDev):
hsv = attrs['hsv']
hsv[1] = (int(sat) / 100.0)
attrs['hsv']=list(hsv)
# hue
hue = props.get('hue',None)
if hue:
hsv = list(attrs['hsv'])
hsv[0] = int(hue)
attrs['hsv']=hsv
# flowing ?
flowing = props.get('flowing',None)
if flowing:
# On color change, the bulb enter in flowing mode. hsv is in proprerties only at the end of the flow
# so we schedule a periodic get_propverties. We
if flowing == '1' and self.flowing_timer == False:
eng = self.dev.engine
target = round((self.bulb.duration / 1000.0),1)
print(target)
eng.add_timer(self.get_properties,target,1)
eng.add_timer(self.get_properties,target+0.5,1)
eng.add_timer(self.get_properties,target+1,1)
self.flowing_timer = True
if flowing == '0' and self.flowing_timer == True:
self.flowing_timer = False
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment