2222#
2323
2424#
25- # TODO: Support for sensors
25+ # TODO: Support for motion and contact sensors
2626#
2727
2828import binascii
@@ -228,14 +228,13 @@ def __init__(self, conn, addr, type_id, type_id_assumed):
228228 self .__deleted = False
229229 self .__type_id = type_id
230230 self .__idx = 0
231+ self .__raw_values = ()
231232
232233 device_info = conn .device_types ()[type_id_assumed ]
233234 self .__devicesubtype = device_info ['subtype' ]
234235 self .__devicetype = device_info ['type' ]
235- if type_id == type_id_assumed :
236- self .__devicename = device_info ['name' ]
237- else :
238- self .__devicename = UNKNOWN_DEVICENAME
236+ self .__devicename = (device_info ['name' ] if type_id == type_id_assumed
237+ else UNKNOWN_DEVICENAME )
239238
240239 if self .__devicesubtype in (DeviceSubType .CONTACT_SENSOR ,
241240 DeviceSubType .MOTION_SENSOR ,
@@ -366,6 +365,13 @@ def rgb(self):
366365 """
367366 return self .__red , self .__green , self .__blue
368367
368+ def raw_values (self ):
369+ """
370+ :return: tuple containing raw values as obtained from gateway:
371+ (onoff, lum, temp, red, green, blue, alpha)
372+ """
373+ return self .__raw_values
374+
369375 def type_id (self ):
370376 """
371377 :return: original device type id as returned by gateway
@@ -420,7 +426,7 @@ def mark_deleted(self):
420426 self .__deleted = True
421427
422428 def update_status (self , reachable , last_seen , onoff , lum , temp , red , green ,
423- blue , name , groups , version , idx ):
429+ blue , alpha , name , groups , version , idx ):
424430 """ update internal representation
425431 does not send out a command to the light source!
426432
@@ -432,6 +438,7 @@ def update_status(self, reachable, last_seen, onoff, lum, temp, red, green,
432438 :param red: amount of red
433439 :param green: amount of green
434440 :param blue: amount of blue
441+ :param alpha: alpha value (not used)
435442 :param name: name of the light
436443 :param groups: list of associated group indices
437444 :param version: firmware version
@@ -444,6 +451,7 @@ def update_status(self, reachable, last_seen, onoff, lum, temp, red, green,
444451 self .__groups = groups
445452 self .__version = version
446453 self .__idx = idx
454+ self .__raw_values = (onoff , lum , temp , red , green , blue , alpha )
447455
448456 if 'on' in self .__supported_features :
449457 self .__onoff = bool (onoff )
@@ -496,7 +504,7 @@ def set_luminance(self, lum, transition, send=True):
496504 if 'lum' not in self .__supported_features :
497505 return
498506
499- lum = min (MAX_LUMINANCE , lum )
507+ lum = min (int ( lum ), MAX_LUMINANCE )
500508 self .__lum = lum
501509 if lum > 0 :
502510 self .__lum = lum
@@ -524,8 +532,8 @@ def set_temperature(self, temp, transition, send=True):
524532 if 'temp' not in self .__supported_features :
525533 return
526534
527- temp = max (self .min_temp (), temp )
528- temp = min (self .max_temp (), temp )
535+ temp = max (self .min_temp (), int ( temp ) )
536+ temp = min (temp , self .max_temp ())
529537 self .__temp = temp
530538
531539 if send :
@@ -549,9 +557,9 @@ def set_rgb(self, red, green, blue, transition, send=True):
549557 if 'rgb' not in self .__supported_features :
550558 return
551559
552- red = min (red , MAX_COLOUR )
553- green = min (green , MAX_COLOUR )
554- blue = min (blue , MAX_COLOUR )
560+ red = min (int ( red ) , MAX_COLOUR )
561+ green = min (int ( green ) , MAX_COLOUR )
562+ blue = min (int ( blue ) , MAX_COLOUR )
555563 self .__red = red
556564 self .__green = green
557565 self .__blue = blue
@@ -785,7 +793,7 @@ def set_luminance(self, lum, transition):
785793 if self .__deleted :
786794 return
787795
788- lum = min (MAX_LUMINANCE , lum )
796+ lum = min (int ( lum ), MAX_LUMINANCE )
789797 command = self .__conn .build_luminance (self , lum , transition )
790798 self .__conn .send (command )
791799
@@ -806,8 +814,8 @@ def set_temperature(self, temp, transition):
806814 if self .__deleted :
807815 return
808816
809- temp = max (self .min_temp (), temp )
810- temp = min (self .max_temp (), temp )
817+ temp = max (self .min_temp (), int ( temp ) )
818+ temp = min (temp , self .max_temp ())
811819 command = self .__conn .build_temp (self , temp , transition )
812820 self .__conn .send (command )
813821
@@ -830,9 +838,9 @@ def set_rgb(self, red, green, blue, transition):
830838 if self .__deleted :
831839 return
832840
833- red = min (red , MAX_COLOUR )
834- green = min (green , MAX_COLOUR )
835- blue = min (blue , MAX_COLOUR )
841+ red = min (int ( red ) , MAX_COLOUR )
842+ green = min (int ( green ) , MAX_COLOUR )
843+ blue = min (int ( blue ) , MAX_COLOUR )
836844 command = self .__conn .build_colour (self , red , green , blue , transition )
837845 self .__conn .send (command )
838846
@@ -1374,8 +1382,9 @@ def update_scene_list(self, throttling_interval=None):
13741382 name = name .decode ('utf-8' ).replace ('\0 ' , '' )
13751383 group = 16 - format (group , '016b' ).index ('1' )
13761384
1377- if (name in self .__scenes and self .__scenes [name ].idx () == idx
1378- and self .__scenes [name ].group () == group ):
1385+ if (name in self .__scenes and
1386+ self .__scenes [name ].idx () == idx and
1387+ self .__scenes [name ].group () == group ):
13791388 scene = self .__scenes [name ]
13801389 self .__logger .debug ('Old scene %d: %s, group: %d' , idx ,
13811390 name , group )
@@ -1527,13 +1536,13 @@ def update_all_light_status(self, throttling_interval=None):
15271536 return {}
15281537
15291538 (type_id , version , reachable , groups , onoff , lum , temp , red ,
1530- green , blue ) = struct .unpack ('<B4sBH2BH3Bx ' , stat )
1539+ green , blue , alpha ) = struct .unpack ('<B4sBH2BH4B ' , stat )
15311540 name = name .decode ('utf-8' ).replace ('\0 ' , '' )
15321541 groups = [16 - j for j , val
15331542 in enumerate (format (groups , '016b' )) if val == '1' ]
15341543 version = format (struct .unpack ('>I' , version )[0 ], '032b' )
1535- version = '' .join ('{0:01X}' .format (int ( version [ i * 4 :( i + 1 ) * 4 ], 2 ))
1536- for i in range (8 ))
1544+ version = '' .join ('{0:01X}' .format (
1545+ int ( version [ i * 4 :( i + 1 ) * 4 ], 2 )) for i in range (8 ))
15371546
15381547 if addr in self .__lights :
15391548 light = self .__lights [addr ]
@@ -1563,13 +1572,15 @@ def update_all_light_status(self, throttling_interval=None):
15631572 self .__logger .debug ('red: %d' , red )
15641573 self .__logger .debug ('green: %d' , green )
15651574 self .__logger .debug ('blue: %d' , blue )
1575+ self .__logger .debug ('alpha: %d' , alpha )
15661576 self .__logger .debug ('type id: %d' , type_id )
15671577 self .__logger .debug ('groups: %s' , groups )
15681578 self .__logger .debug ('version: %s' , version )
15691579 self .__logger .debug ('idx: %s' , i )
15701580
15711581 light .update_status (reachable , last_seen , onoff , lum , temp ,
1572- red , green , blue , name , groups , version , i )
1582+ red , green , blue , alpha , name , groups ,
1583+ version , i )
15731584 new_lights [addr ] = light
15741585
15751586 for addr in self .__lights :
0 commit comments