Source code for bibliopixel.drivers.hue

from . driver_base import DriverBase
from .. util import log

try:
    from phue import Bridge
except:
    error = "Unable to import phue. Please install. pip install phue"
    log.error(error)
    raise ImportError(error)

import colorsys


[docs]class Hue(DriverBase): """ Driver for interacting with Philips Hue lights. Provides the same parameters of :py:class:`.driver_base.DriverBase` as well as those below: :param str ip: Network hostname or IP address of the Hue base. :param list nameMap: List of names to map to each pixel index """ def __init__(self, num, ip, nameMap=None, **kwds): super().__init__(num, **kwds) if nameMap and len(nameMap) != self.numLEDs: raise ValueError( "nameMap must have the same number of entries as the number " "of LEDs.") self._bridge = Bridge(ip) self._bridge.connect() self._transitionTime = 0 if nameMap: self._lights = self._bridge.get_light_objects('name') self._ids = nameMap else: self._lights = self._bridge.get_light_objects('id') self._ids = [l for l in self._lights] if len(self._lights) < self.numLEDs: raise ValueError( "More LEDs were specified than there are available Hue lights.") self.setTransitionTime(0) # start with no transition time
[docs] def setTransitionTime(self, time): if time < 0.0 or time > 30.0: raise ValueError( "Transition time must be between 0.0 and 30.0 seconds.") self._transitionTime = int(time * 10)
def _mapRange(self, value, minFrom, maxFrom, minTo, maxTo): return minTo + (maxTo - minTo) * (value - minFrom) / (maxFrom - minFrom) def _rgb2hs(self, rgb): r = rgb[0] / 255.0 g = rgb[1] / 255.0 b = rgb[2] / 255.0 h, s, v = colorsys.rgb_to_hsv(r, g, b) h = int(self._mapRange(h, 0.0, 1.0, 0, 65535)) s = int(self._mapRange(s, 0.0, 1.0, 0, 254)) return (h, s) def _send_packet(self): for i in range(len(self._ids)): h, s = self._rgb2hs(self._colors[i + self._pos]) bri = min(254, self._brightness) if s == 0: bri = 0 cmd = {'on': s != 0, 'bri': bri, 'hue': h, 'saturation': s, 'transitiontime': self._transitionTime} self._bridge.set_light(self._ids[i], cmd)
from .. util import deprecated if deprecated.allowed(): # pragma: no cover DriverHue = Hue