from phue import Bridge from time import sleep from pathlib import Path import logging import socket class PhilipsHue: def __init__(self, config): self.config = config self.connect() def connect(self): registered = Path(self.config["registered_file"]).is_file() success = False while success == False: try: logging.info("Connecting to hue bridge") self.bridge = Bridge(self.config["bridge_ip"]) self.bridge.connect() success = True except Exception as e: logging.info("Failed to connect to bridge") success = False if registered == False: logging.info("Trying again in 5 seconds..") sleep(5) else: raise e logging.info("Connected to hue bridge") if registered == False: # register logging.info("Saving registration") Path(self.config["registered_file"]).touch() def get_state(self): return self.__execute__(lambda: self.bridge.get_api()) def get_scenes(self): return self.__execute__(lambda: self.bridge.get_scene()) def get_scene_by_name(self, name): for key, scene in self.get_scenes().items(): if scene["name"] == name: scene["id"] = key return scene return None def set_light(self, lights, command): return self.__execute__(lambda: self.bridge.set_light(lights, command)) def get_light(self, id, command=None): return self.__execute__(lambda: self.bridge.get_light(id, command)) def set_group(self, groups, command): return self.__execute__(lambda: self.bridge.set_group(groups, command)) def get_group(self, id, command=None): return self.__execute__(lambda: self.bridge.get_group(id, command)) def set_group_scene(self, group_name, scene_name): scene_id = self.get_scene_by_name(scene_name)["id"] return self.__execute__( lambda: self.set_group(group_name, self.create_conf({"scene": scene_id})) ) def create_conf(self, conf): if "transitiontime" not in conf.keys(): conf["transitiontime"] = self.config["transition_time"] return conf def __execute__(self, function): try: return function() except socket.timeout as e: # Try to reconnect logging.exception( "Could not execute function. Trying to reconnect to bridge" ) logging.exception(str(e)) try: self.connect() except Exception as e: logging.exception("Reconnect did not succeed, skipping execution") logging.exception(str(e)) return # Now try again return function()