def find_a_light(hue, group_name): """Finds an appropriate light and returns it.""" hue = Bridge("192.168.1.11", "newdeveloper") # hue(devicetype="test user", username="******", http_method="post") groups = hue.groups() for item in groups: item_name = hue.groups(item)["name"] if item_name == group_name: lights = hue.groups(item)["lights"] break return lights
class HueController: def __init__(self): try: with open('.hueusername') as f: bridge_data = json.loads(f.read()) except: logger.warn("Bridge not authorised, need to press the button!") bridge_data = json.loads( requests.get('https://www.meethue.com/api/nupnp').text)[0] bridge_data['username'] = create_new_username( bridge_data['internalipaddress']) with open('.hueusername', 'w') as f: f.write(json.dumps(bridge_data)) self.bridge = Bridge(bridge_data['internalipaddress'], bridge_data['username']) logger.info("Successfully connected to Hue Bridge {}".format( bridge_data['internalipaddress'])) def print_all_lights(self): rooms = self.bridge.groups() for id, light in self.bridge.lights().items(): room = [r for r in rooms.values() if id in r['lights']] logger.info("[{}]: {} ({}){}".format( id, light['name'], light['type'], " in {}".format(room[0]['name']) if room else "")) def set_light(self, id, *args, **kwargs): self.bridge.lights[id].state(**kwargs) def perform(self, action): self.set_light(action['id'], bri=action['brightness'], hue=action['hue'])
class PhilipsHueAutomation(Automation): """ Class provides an abstract instance of Automation to interface with the Philips Hue service. """ def __init__(self, hub_ip): self.username = Data.Load("hue_username") self.hub_ip = hub_ip self.p_light_groups = None self.bridge = None self.authenticate() self.p_name = "Philips Hue" # This cannot change. There are quite a few things keying off this name @property def name(self): return self.p_name def has_username(self): if self.username: return True return False def is_authenticated(self): try: self.bridge() return True except: return False def authenticate(self): # Data.Save("hue_username", None) if not self.username: try: self.username = create_new_username(self.hub_ip) except: pass Data.Save("hue_username", self.username) self.bridge = Bridge(self.hub_ip, self.username) def light_groups(self): self.p_light_groups = list() groups = self.bridge.groups() for group_id in groups: g = dict() if groups[group_id]['lights']: g['name'] = groups[group_id]['name'] g['id'] = group_id self.p_light_groups.append(g) return self.p_light_groups def change_group_state(self, lights, powered=False, dim=False): if dim: brightness = 0 else: brightness = 255 for light in lights: Log(self.bridge.groups[light]()) self.bridge.groups[light].action(on=powered, bri=brightness)
class HueServiceImpl(RoutineInterface): CONFIG_FILE_PATH = 'alarm_clock.ini' SECTION_NAME = 'hue' IP_OPTION_NAME = 'ip' USERNAME_OPTION_NAME = 'username' __instance = None @staticmethod def getInstance(): if HueServiceImpl.__instance == None: HueServiceImpl() return HueServiceImpl.__instance def __init__(self): if HueServiceImpl.__instance != None: raise Exception("This class is a singleton!") else: self.__config() HueServiceImpl.__instance = self def __config(self): config = ConfigServiceImpl() ip = config.getOption(ConfigServiceImpl.HUE_SECTION, ConfigServiceImpl.IP_OPTION) username = config.getOption(ConfigServiceImpl.HUE_SECTION, ConfigServiceImpl.USERNAME_OPTION) if(username is None): username = self.getUsername(ip) config.setOption(ConfigServiceImpl.HUE_SECTION, ConfigServiceImpl.USERNAME_OPTION, username) self.bridge = Bridge(ip, username) def getUsername(self, ip): while True: try: username = create_new_username(ip) break except QhueException as err: print("Error occurred while creating a new username: {}".format(err)) return username def doRoutine(self, args): transitionTime = args['transitionMins'] * 600 self.bridge.groups(1, 'action', on=True, bri=1, sat=254) self.bridge.groups(1, 'action', bri=254, sat=0, transitiontime=int(transitionTime))
class Status: def __init__(self): self.username = os.environ['HUE_USER'] def set_bridge(self, ip=None): self.bridge = Bridge(ip, self.username) def rooms(self): print(yaml.safe_dump(self.bridge.groups(), indent=2))
class HuePhillipsBridge: def __init__(self, ip, username): self.ipAddress = ip self.username = username self.bridge = Bridge(self.ipAddress, self.username) # Key is the qhue object, value is the HuePhillipsType object self.lights, self.groups, self.zones, self.rooms = {}, {}, {}, {} self.createLights() self.createGroups() def createLights(self): for light in self.bridge.lights().keys(): print(light) self.lights[light] = HuePhillipsLight(self.bridge.lights[light]) def createGroups(self): for group in self.bridge.groups().keys(): realGroup = self.bridge.groups[group] if realGroup()['type'] == 'Zone': self.groups[group] = HuePhillipsZone( realGroup, self.getLightsFromGroup(realGroup)) self.zones[group] = self.groups[group] elif realGroup()['type'] == 'Room': self.groups[group] = HuePhillipsRoom( realGroup, self.getLightsFromGroup(realGroup)) self.rooms[group] = self.groups[group] def getAllLights(self): return list(self.lights.values()) def getLightsFromGroup(self, group): groupLights = [] for light in group()['lights']: groupLights.append(self.lights[light]) return groupLights def getRooms(self): return self.rooms.values() def getZones(self): return self.zones.values() def getGroups(self): return self.groups.values()
# This should give you something familiar from the API docs: print(b.url) lights = b.lights # Creates a new Resource with its own URL print(lights.url) # Should have '/lights' on the end # Let's actually call the API and print the results print(lights()) # Get information about light 1 print(b.lights[1]) b.lights[1].state(bri=128, hue=30000, sat=200, alert="select") #i = 0 #while i <=256: # b.lights[1].state(bri=i, hue=9000, sat=200) # time.sleep(.1) # print(i) # i+=10 #i = 0 #while i <=65260: # b.lights[1].state(bri=128, hue=i) # time.sleep(.1) # print(i) # i+=1000 #b.lights[1].state(on=True) print(yaml.safe_dump(b.groups(), indent=4))
class HueController(BaseController): def init(self, *args, **kwargs): try: with open('.hueusername') as f: bridge_data = json.loads(f.read()) except: self.log("Bridge not authorised, need to press the button!", logging.WARN) bridge_data = json.loads( requests.get('https://www.meethue.com/api/nupnp').text)[0] bridge_data['username'] = create_new_username( bridge_data['internalipaddress']) with open('.hueusername', 'w') as f: f.write(json.dumps(bridge_data)) self.bridge = Bridge(bridge_data['internalipaddress'], bridge_data['username']) self.log("Successfully connected to Hue Bridge {}".format( bridge_data['internalipaddress'])) def print_all(self): self.log("Lights:") for room_id, room in self.bridge.groups().items(): self.log("{} [ID: {}] - {}:".format(room['type'], room_id, room['name'])) for light_id in room['lights']: light = self.bridge.lights()[light_id] self.log(" - [ID: {}]: {} ({})".format(light_id, light['name'], light['type'])) self.log(" ") self.log("Scenes:") for scene in self.bridge.scenes().values(): self.log(" - {}".format(scene['name'])) def set_light(self, id, *args, **kwargs): self.log("Setting light {}: {}".format(id, kwargs)) self.bridge.lights[id].state(**kwargs) def set_room(self, id, *args, **kwargs): self.log("Setting room {}: {}".format(id, kwargs)) self.bridge.groups[id].state(**kwargs) def adjust_light_brightness(self, id, *args, **kwargs): current_amount = self.bridge.lights[id]['brightness'] if kwargs['direction'] == 'up': new_amount = current_amount + kwargs.get('amount', 16) else: new_amount = current_amount - kwargs.get('amount', 16) self.set_light(id, **{'brightness': new_amount}) def set_scene(self, id, *args, **kwargs): scene_id = [ k for k, v in self.bridge.scenes().items() if v['name'] == kwargs['scene'] ] self.bridge.groups[id].state({'scene': scene_id}) def perform(self, action): kwargs = { k: v for k, v in action.items() if k not in ['action', 'id', 'type'] } id, act = action['id'], action['action'] if act == 'set_light': self.set_light(id, **kwargs) elif act == 'set_room': self.set_room(id, **kwargs) elif act == 'adjust_brightness': pass elif act == 'set_scene': self.set_scene(id, **kwargs) @classmethod def help(cls): return """