Esempio n. 1
0
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
Esempio n. 2
0
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)
Esempio n. 4
0
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))
Esempio n. 5
0
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()
Esempio n. 7
0
# 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 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)
Esempio n. 9
0
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 """