Skip to content

Commit fc8d56f

Browse files
authored
Merge pull request #13 from OleksandrBerchenko/master
Fix crash when float is passed instead of int
2 parents 428544e + 30b35ac commit fc8d56f

1 file changed

Lines changed: 35 additions & 24 deletions

File tree

lightify/__init__.py

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
#
2323

2424
#
25-
# TODO: Support for sensors
25+
# TODO: Support for motion and contact sensors
2626
#
2727

2828
import 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

Comments
 (0)