diff --git a/src/bridges/bedscale/old_bett.py b/src/bridges/bedscale/old_bett.py index f369ccd..a5d336b 100644 --- a/src/bridges/bedscale/old_bett.py +++ b/src/bridges/bedscale/old_bett.py @@ -5,7 +5,7 @@ import os from statistics import median from typing import Optional import requests as r -from ...endpoints.hue import hue +from ...endpoints.hue import hue_bridge import logging file_path: str = "bettwaage.csv" @@ -126,9 +126,9 @@ def check_for_change(): # Make room sexy if sexy_mode_detection: if number_of_people >= 2 and weight_increased: - hue.in_room_activate_scene("Max Zimmer", "Sexy") + hue_bridge.in_room_activate_scene("Max Zimmer", "Sexy") elif number_of_people == 1 and not weight_increased: - hue.in_room_activate_scene("Max Zimmer", "Tageslicht") + hue_bridge.in_room_activate_scene("Max Zimmer", "Tageslicht") def add_line_to_bed_history(line: str) -> None: diff --git a/src/bridges/hue/hue_bridge.py b/src/bridges/hue/hue_bridge.py index dfe3d07..b74e551 100644 --- a/src/bridges/hue/hue_bridge.py +++ b/src/bridges/hue/hue_bridge.py @@ -1,5 +1,6 @@ +import json import logging -from core import Bridge +from core import Bridge, Group from phue import Bridge as phueBridge from time import sleep @@ -9,15 +10,15 @@ class HueBridge(Bridge): def __init__( self, *, + ip_address: str, id: str, - ip: str, retry_limit: int = 10, retry_timeout_seconds: int = 5, ) -> None: super().__init__(id=id, type="hue") self._retry_limit = retry_limit self._retry_timeout_seconds = retry_timeout_seconds - self._hue: phueBridge = phueBridge(ip) + self._hue: phueBridge = phueBridge(ip_address) def disconnect(self) -> None: self._hue = None @@ -47,6 +48,10 @@ class HueBridge(Bridge): def list_api(self) -> dict: return self._hue.get_api() + def get_all_lights(self) -> Group: + light_states = await self.list_api() + # TODO + def list_scenes(self) -> dict: return self._hue.get_scene() diff --git a/src/bridges/hue/hue_light.py b/src/bridges/hue/hue_light.py index 989e284..8080209 100644 --- a/src/bridges/hue/hue_light.py +++ b/src/bridges/hue/hue_light.py @@ -1,4 +1,4 @@ -from core import Entity +from core import Entity, Color from bridges.hue import HueBridge @@ -8,6 +8,7 @@ class HueLight(Entity): self, *, bridge: HueBridge, + initial_state: dict, id: str, name: str, room: str, @@ -15,8 +16,24 @@ class HueLight(Entity): ) -> None: super().__init__(id=id, name=name, room=room, groups=groups) self._bridge: HueBridge = bridge + self._color: Color = Color() + self._on: bool = False + self._transition_duration_sec = 0 - def poll_state(self): + self.__parse_state__(initial_state) + + def __parse_state__(self, state: dict): + max_int_value = 255 + self._on = state["state"]["on"] + + h = state["state"]["hue"] / max_int_value + s = state["state"]["sat"] / max_int_value + v = state["state"]["bri"] / max_int_value + + # TODO: Update color instead of overwriting it, to better keep track of change? + self._color = Color(hue=h, saturation=s, brightness=v) + + def update(self): # TODO pass diff --git a/src/core/color.py b/src/core/color.py index 8861178..dc8c7e6 100644 --- a/src/core/color.py +++ b/src/core/color.py @@ -1,5 +1,5 @@ class Color: def __init__(self, *, hue: float, saturation: float, brightness: float): - self.hue = hue - self.saturation = saturation - self.brightness = brightness + self.hue: float = hue + self.saturation: float = saturation + self.brightness: float = brightness diff --git a/src/core/entity.py b/src/core/entity.py index 1281551..469da09 100644 --- a/src/core/entity.py +++ b/src/core/entity.py @@ -1,4 +1,4 @@ -from core import Color +from .color import Color class EntityOpNotSupportedError(Exception): @@ -48,9 +48,9 @@ class Entity: def __str__(self) -> str: return f"{self.name} [{self.id}, type {self.device_type}, room {self.room}, in {len(self.groups)} groups]" - async def poll_state(self): - """Implements an entity specific poll operation to get the latest state.""" - raise EntityOpNotSupportedError("poll_state") + async def update(self): + """Implements an entity specific update operation to get the latest state.""" + raise EntityOpNotSupportedError("update") async def toggle_state(self): """Turns entity on, if off, and vice versa, if supported.""" diff --git a/src/core/group.py b/src/core/group.py index 2b0098a..7d60029 100644 --- a/src/core/group.py +++ b/src/core/group.py @@ -1,6 +1,43 @@ -from core import Entity +from .entity import Entity, EntityOpNotSupportedError class Group(Entity): - def __init__(self, *, id: str, name: str): + + def __init__( + self, + *, + entities: list[Entity] = ..., + id: str = "group", + name: str = "Empty Group" + ): super().__init__(id=id, name=name, room=None, device_type="group") + self._entities: list[Entity] = entities + + # List of method names to dynamically create + methods_to_create = [ + "set_brightness", + "set_hue", + "set_saturation", + "set_color", + "set_transition_duration", + "turn_on", + "turn_off", + ] + + for method_name in methods_to_create: + setattr(self, method_name, self._create_group_method(method_name)) + + async def __call_method__(self, method_name: str, *args, **kwargs): + for entity in self._entities: + try: + func = getattr(entity, method_name) + await func(*args, **kwargs) + except EntityOpNotSupportedError: + pass + + def _create_group_method(self, method_name: str): + # Create a method that calls __call_method__ for the given method name + async def group_method(*args, **kwargs): + await self.__call_method__(method_name, *args, **kwargs) + + return group_method diff --git a/src/core/room.py b/src/core/room.py index 4e5c6cb..df59f87 100644 --- a/src/core/room.py +++ b/src/core/room.py @@ -1,4 +1,4 @@ -from core import Group +from .group import Group class Room(Group): diff --git a/src/endpoints/hue.py b/src/endpoints/hue.py index 1c353f9..3cb9404 100644 --- a/src/endpoints/hue.py +++ b/src/endpoints/hue.py @@ -5,22 +5,23 @@ from bridges.hue import HueBridge, HueLight from fastapi import APIRouter from fastapi.responses import HTMLResponse +from core import Group + router = APIRouter(tags=["hue"]) -hue = HueBridge("192.168.178.85") -lights: dict[int, HueLight] = {} +hue_bridge = HueBridge(ip_address="192.168.178.85", id="hue-bridge") +hue_lights: Group = Group() poll_delay_sec = 5 async def hue_service(): - global lights + global hue_lights + + hue_lights = await hue_bridge.get_all_lights() while True: try: - for light in lights: - light.poll_state() - - # TODO: Get all new lights + await hue_lights.update() await asyncio.sleep(poll_delay_sec) except: @@ -29,7 +30,7 @@ async def hue_service(): @router.get("/scenes", tags=["scene"]) async def get_scenes(): - return hue.list_scenes() + return hue_bridge.list_scenes() @router.post( @@ -38,7 +39,7 @@ async def get_scenes(): ) async def activate_scene(room_name: str, scene_name: str): try: - hue.in_room_activate_scene(room_name, scene_name) + hue_bridge.in_room_activate_scene(room_name, scene_name) except Exception as e: return HTMLResponse(status_code=400, content=str(e)) @@ -49,7 +50,7 @@ async def activate_scene(room_name: str, scene_name: str): ) async def deactivate_room(room_name: str): try: - hue.in_room_deactivate_lights(room_name) + hue_bridge.in_room_deactivate_lights(room_name) except Exception as e: return HTMLResponse(status_code=400, content=str(e)) @@ -60,6 +61,6 @@ async def deactivate_room(room_name: str): ) async def activate_room(room_name: str): try: - hue.in_room_activate_lights(room_name) + hue_bridge.in_room_activate_lights(room_name) except Exception as e: return HTMLResponse(status_code=400, content=str(e)) diff --git a/src/hue_api.json b/src/hue_api.json new file mode 100644 index 0000000..1251390 --- /dev/null +++ b/src/hue_api.json @@ -0,0 +1,1333 @@ +{ + "lights": { + "1": { + "state": { + "on": false, + "bri": 18, + "hue": 8401, + "sat": 142, + "effect": "none", + "xy": [ + 0.459, + 0.4103 + ], + "ct": 369, + "alert": "select", + "colormode": "ct", + "mode": "homeautomation", + "reachable": true + }, + "swupdate": { + "state": "noupdates", + "lastinstall": "2024-10-09T02:26:58" + }, + "type": "Extended color light", + "name": "Stehlampe", + "modelid": "LCA006", + "manufacturername": "Signify Netherlands B.V.", + "productname": "Hue color lamp", + "capabilities": { + "certified": true, + "control": { + "mindimlevel": 200, + "maxlumen": 1055, + "colorgamuttype": "C", + "colorgamut": [ + [ + 0.6915, + 0.3083 + ], + [ + 0.17, + 0.7 + ], + [ + 0.1532, + 0.0475 + ] + ], + "ct": { + "min": 153, + "max": 500 + } + }, + "streaming": { + "renderer": true, + "proxy": true + } + }, + "config": { + "archetype": "floorshade", + "function": "mixed", + "direction": "omnidirectional", + "startup": { + "mode": "powerfail", + "configured": true + } + }, + "uniqueid": "00:17:88:01:0d:b2:89:a4-0b", + "swversion": "1.122.2", + "swconfigid": "ECCBCB84", + "productid": "Philips-LCA006-1-A60HECLv1" + }, + "4": { + "state": { + "on": false, + "bri": 180, + "hue": 8401, + "sat": 142, + "effect": "none", + "xy": [ + 0.459, + 0.4103 + ], + "ct": 369, + "alert": "select", + "colormode": "ct", + "mode": "homeautomation", + "reachable": true + }, + "swupdate": { + "state": "noupdates", + "lastinstall": "2024-10-09T02:27:04" + }, + "type": "Extended color light", + "name": "Schreibtisch Ambiente", + "modelid": "LCL001", + "manufacturername": "Signify Netherlands B.V.", + "productname": "Hue lightstrip plus", + "capabilities": { + "certified": true, + "control": { + "mindimlevel": 40, + "maxlumen": 1600, + "colorgamuttype": "C", + "colorgamut": [ + [ + 0.6915, + 0.3083 + ], + [ + 0.17, + 0.7 + ], + [ + 0.1532, + 0.0475 + ] + ], + "ct": { + "min": 153, + "max": 500 + } + }, + "streaming": { + "renderer": true, + "proxy": true + } + }, + "config": { + "archetype": "huelightstrip", + "function": "decorative", + "direction": "omnidirectional", + "startup": { + "mode": "powerfail", + "configured": true + } + }, + "uniqueid": "00:17:88:01:09:11:1a:e7-0b", + "swversion": "1.122.2", + "swconfigid": "49730BB6", + "productid": "Philips-LCL001-1-LedStripsv4" + }, + "5": { + "state": { + "on": false, + "bri": 192, + "hue": 3388, + "sat": 244, + "effect": "none", + "xy": [ + 0.4657, + 0.4157 + ], + "ct": 376, + "alert": "select", + "colormode": "xy", + "mode": "homeautomation", + "reachable": true + }, + "swupdate": { + "state": "notupdatable", + "lastinstall": "2023-11-01T17:02:58" + }, + "type": "Extended color light", + "name": "Bett Ambiente", + "modelid": "FL 120 C", + "manufacturername": "innr", + "productname": "Extended color light", + "capabilities": { + "certified": false, + "control": { + "colorgamuttype": "other", + "ct": { + "min": 100, + "max": 1000 + } + }, + "streaming": { + "renderer": false, + "proxy": false + } + }, + "config": { + "archetype": "huelightstrip", + "function": "decorative", + "direction": "omnidirectional" + }, + "uniqueid": "00:15:8d:00:05:02:f1:08-01", + "swversion": "0x27202162" + }, + "6": { + "state": { + "on": false, + "bri": 1, + "ct": 369, + "alert": "select", + "colormode": "ct", + "mode": "homeautomation", + "reachable": true + }, + "swupdate": { + "state": "noupdates", + "lastinstall": "2024-10-09T02:27:22" + }, + "type": "Color temperature light", + "name": "Schreibtisch Fenster", + "modelid": "LTG002", + "manufacturername": "Signify Netherlands B.V.", + "productname": "Hue ambiance spot", + "capabilities": { + "certified": true, + "control": { + "mindimlevel": 200, + "maxlumen": 350, + "ct": { + "min": 153, + "max": 454 + } + }, + "streaming": { + "renderer": false, + "proxy": false + } + }, + "config": { + "archetype": "singlespot", + "function": "mixed", + "direction": "downwards", + "startup": { + "mode": "powerfail", + "configured": true + } + }, + "uniqueid": "00:17:88:01:0b:cb:23:7c-0b", + "swversion": "1.122.2", + "swconfigid": "2300777B", + "productid": "Philips-LTG002-3-GU10CTv2" + }, + "7": { + "state": { + "on": false, + "bri": 18, + "ct": 369, + "alert": "select", + "colormode": "ct", + "mode": "homeautomation", + "reachable": true + }, + "swupdate": { + "state": "noupdates", + "lastinstall": "2024-10-09T02:27:12" + }, + "type": "Color temperature light", + "name": "Kleiderschrank", + "modelid": "LTG002", + "manufacturername": "Signify Netherlands B.V.", + "productname": "Hue ambiance spot", + "capabilities": { + "certified": true, + "control": { + "mindimlevel": 200, + "maxlumen": 350, + "ct": { + "min": 153, + "max": 454 + } + }, + "streaming": { + "renderer": false, + "proxy": false + } + }, + "config": { + "archetype": "singlespot", + "function": "mixed", + "direction": "downwards", + "startup": { + "mode": "powerfail", + "configured": true + } + }, + "uniqueid": "00:17:88:01:0b:c9:99:a3-0b", + "swversion": "1.122.2", + "swconfigid": "2300777B", + "productid": "Philips-LTG002-3-GU10CTv2" + }, + "8": { + "state": { + "on": false, + "bri": 73, + "ct": 369, + "alert": "select", + "colormode": "ct", + "mode": "homeautomation", + "reachable": true + }, + "swupdate": { + "state": "noupdates", + "lastinstall": "2024-10-09T02:27:01" + }, + "type": "Color temperature light", + "name": "Schreibtisch Wand", + "modelid": "LTG002", + "manufacturername": "Signify Netherlands B.V.", + "productname": "Hue ambiance spot", + "capabilities": { + "certified": true, + "control": { + "mindimlevel": 200, + "maxlumen": 350, + "ct": { + "min": 153, + "max": 454 + } + }, + "streaming": { + "renderer": false, + "proxy": false + } + }, + "config": { + "archetype": "singlespot", + "function": "mixed", + "direction": "downwards", + "startup": { + "mode": "powerfail", + "configured": true + } + }, + "uniqueid": "00:17:88:01:0b:ca:f8:7c-0b", + "swversion": "1.122.2", + "swconfigid": "2300777B", + "productid": "Philips-LTG002-3-GU10CTv2" + }, + "9": { + "state": { + "on": true, + "bri": 100, + "ct": 454, + "alert": "select", + "colormode": "ct", + "mode": "homeautomation", + "reachable": true + }, + "swupdate": { + "state": "noupdates", + "lastinstall": "2024-10-09T02:27:07" + }, + "type": "Color temperature light", + "name": " Stehlampe ", + "modelid": "LTG002", + "manufacturername": "Signify Netherlands B.V.", + "productname": "Hue ambiance spot", + "capabilities": { + "certified": true, + "control": { + "mindimlevel": 200, + "maxlumen": 350, + "ct": { + "min": 153, + "max": 454 + } + }, + "streaming": { + "renderer": false, + "proxy": false + } + }, + "config": { + "archetype": "floorshade", + "function": "mixed", + "direction": "downwards", + "startup": { + "mode": "safety", + "configured": true + } + }, + "uniqueid": "00:17:88:01:0b:ca:fa:3e-0b", + "swversion": "1.122.2", + "swconfigid": "2300777B", + "productid": "Philips-LTG002-3-GU10CTv2" + }, + "14": { + "state": { + "on": true, + "bri": 145, + "hue": 7613, + "sat": 203, + "effect": "none", + "xy": [ + 0.5053, + 0.4152 + ], + "ct": 454, + "alert": "select", + "colormode": "ct", + "mode": "homeautomation", + "reachable": true + }, + "swupdate": { + "state": "noupdates", + "lastinstall": "2024-12-31T17:40:34" + }, + "type": "Extended color light", + "name": "TV Ambiente ", + "modelid": "LCA006", + "manufacturername": "Signify Netherlands B.V.", + "productname": "Hue color lamp", + "capabilities": { + "certified": true, + "control": { + "mindimlevel": 200, + "maxlumen": 1055, + "colorgamuttype": "C", + "colorgamut": [ + [ + 0.6915, + 0.3083 + ], + [ + 0.17, + 0.7 + ], + [ + 0.1532, + 0.0475 + ] + ], + "ct": { + "min": 153, + "max": 500 + } + }, + "streaming": { + "renderer": true, + "proxy": true + } + }, + "config": { + "archetype": "huefloodlightcamera", + "function": "decorative", + "direction": "omnidirectional", + "startup": { + "mode": "powerfail", + "configured": true + } + }, + "uniqueid": "00:17:88:01:0d:b2:ce:96-0b", + "swversion": "1.122.2", + "swconfigid": "ECCBCB84", + "productid": "Philips-LCA006-1-A60HECLv1" + } + }, + "groups": { + "81": { + "name": "Max Zimmer", + "lights": [ + "5", + "1", + "4", + "6", + "7", + "8" + ], + "sensors": [], + "type": "Room", + "state": { + "all_on": false, + "any_on": false + }, + "recycle": false, + "class": "Other", + "action": { + "on": false, + "bri": 73, + "hue": 8401, + "sat": 142, + "effect": "none", + "xy": [ + 0.459, + 0.4103 + ], + "ct": 369, + "alert": "select", + "colormode": "ct" + } + }, + "83": { + "name": "Schreibtisch", + "lights": [ + "4", + "8" + ], + "sensors": [], + "type": "Zone", + "state": { + "all_on": false, + "any_on": false + }, + "recycle": false, + "class": "Office", + "action": { + "on": false, + "bri": 73, + "hue": 8401, + "sat": 142, + "effect": "none", + "xy": [ + 0.459, + 0.4103 + ], + "ct": 369, + "alert": "select", + "colormode": "ct" + } + }, + "84": { + "name": "Deckenlicht", + "lights": [ + "7", + "8", + "6" + ], + "sensors": [], + "type": "Zone", + "state": { + "all_on": false, + "any_on": false + }, + "recycle": false, + "class": "Garage", + "action": { + "on": false, + "bri": 1, + "ct": 369, + "alert": "select", + "colormode": "ct" + } + }, + "85": { + "name": "Wohnzimmer", + "lights": [ + "14", + "9" + ], + "sensors": [], + "type": "Room", + "state": { + "all_on": true, + "any_on": true + }, + "recycle": false, + "class": "Living room", + "action": { + "on": true, + "bri": 100, + "hue": 7613, + "sat": 203, + "effect": "none", + "xy": [ + 0.5053, + 0.4152 + ], + "ct": 454, + "alert": "select", + "colormode": "ct" + } + }, + "200": { + "name": "Desk", + "lights": [ + "4" + ], + "sensors": [], + "type": "Entertainment", + "state": { + "all_on": false, + "any_on": false + }, + "recycle": false, + "class": "Other", + "stream": { + "proxymode": "auto", + "proxynode": "/bridge", + "active": false, + "owner": null + }, + "locations": { + "4": [ + -0.15, + 1.0, + -0.95 + ] + }, + "action": { + "on": false, + "bri": 180, + "hue": 8401, + "sat": 142, + "effect": "none", + "xy": [ + 0.459, + 0.4103 + ], + "ct": 369, + "alert": "select", + "colormode": "ct" + } + }, + "201": { + "name": "Wohnzimmer", + "lights": [ + "14" + ], + "sensors": [], + "type": "Entertainment", + "state": { + "all_on": true, + "any_on": true + }, + "recycle": false, + "class": "Free", + "stream": { + "proxymode": "auto", + "proxynode": "/bridge", + "active": false, + "owner": null + }, + "locations": { + "14": [ + -0.23, + 1.0, + 0.0 + ] + }, + "action": { + "on": true, + "bri": 145, + "hue": 7613, + "sat": 203, + "effect": "none", + "xy": [ + 0.5053, + 0.4152 + ], + "ct": 454, + "alert": "select", + "colormode": "ct" + } + } + }, + "config": { + "name": "Hue Bridge", + "zigbeechannel": 11, + "bridgeid": "ECB5FAFFFE8FD4BB", + "mac": "ec:b5:fa:8f:d4:bb", + "dhcp": true, + "ipaddress": "192.168.178.85", + "netmask": "255.255.255.0", + "gateway": "192.168.178.1", + "proxyaddress": "none", + "proxyport": 0, + "UTC": "2025-01-19T17:56:27", + "localtime": "2025-01-19T18:56:27", + "timezone": "Europe/Berlin", + "modelid": "BSB002", + "datastoreversion": "172", + "swversion": "1968096020", + "apiversion": "1.68.0", + "swupdate2": { + "checkforupdate": false, + "lastchange": "2024-12-31T17:40:37", + "bridge": { + "state": "noupdates", + "lastinstall": "2024-12-10T03:07:49" + }, + "state": "noupdates", + "autoinstall": { + "updatetime": "T18:00:00", + "on": true + } + }, + "linkbutton": false, + "portalservices": true, + "analyticsconsent": false, + "portalconnection": "disconnected", + "portalstate": { + "signedon": false, + "incoming": false, + "outgoing": false, + "communication": "disconnected" + }, + "internetservices": { + "internet": "connected", + "remoteaccess": "connected", + "time": "connected", + "swupdate": "connected" + }, + "factorynew": false, + "replacesbridgeid": null, + "starterkitid": "", + "backup": { + "status": "idle", + "errorcode": 0 + }, + "whitelist": { + "851d4d9e-f809-4b36-a974-e85debcc5718": { + "last use date": "1980-01-01T00:02:42", + "create date": "1980-01-01T00:02:42", + "name": "starterkit-setup#factory" + }, + "ccfe0ab5-76c6-469b-b900-58ffe05c6f3e": { + "last use date": "2023-12-03T13:04:11", + "create date": "2023-11-01T16:31:30", + "name": "Hue#iPhone" + }, + "1ffe268a-9ed3-4b58-89e3-5bbcd28a3acc": { + "last use date": "2024-02-15T20:48:39", + "create date": "2023-11-25T16:17:50", + "name": "python_hue" + }, + "925a8422-a81c-4a37-b906-7c48bb5a4904": { + "last use date": "2025-01-19T17:33:49", + "create date": "2023-11-25T23:26:15", + "name": "python_hue" + }, + "fd33a3c2-5fbd-4e7c-a6d5-59b378a8f4fe": { + "last use date": "2023-12-03T13:06:17", + "create date": "2023-12-03T13:05:36", + "name": "Hue#iPhone" + }, + "91fa9068-1a5d-47b9-a608-fcdcbce44ccf": { + "last use date": "2023-12-03T13:08:25", + "create date": "2023-12-03T13:06:40", + "name": "Hue#iPhone" + }, + "817db65d-925a-421a-b57e-95858f6dd9e7": { + "last use date": "2025-01-19T17:34:36", + "create date": "2023-12-03T13:10:23", + "name": "Hue#iPhone" + }, + "74d19538-4bda-4210-ae91-54f4b04c1ec9": { + "last use date": "2025-01-12T16:16:55", + "create date": "2023-12-10T23:13:49", + "name": "python_hue" + }, + "a186427f-0d34-469c-8b62-dd8a5bb1c4a4": { + "last use date": "2025-01-19T17:33:34", + "create date": "2023-12-11T00:05:50", + "name": "python_hue" + }, + "e9beb08d-c496-42cb-81a1-c719c91b949a": { + "last use date": "2024-05-09T00:46:09", + "create date": "2024-05-02T15:36:01", + "name": "python_hue" + }, + "6dc294fe-cb3f-42e3-8008-f45041515829": { + "last use date": "2024-05-25T19:30:38", + "create date": "2024-05-25T19:30:23", + "name": "ewelink#cloud" + }, + "b0bebade-65dc-452f-a284-aa25baf544db": { + "last use date": "2024-05-25T20:08:14", + "create date": "2024-05-25T19:30:36", + "name": "my_hue_app#iphone peter" + }, + "ed8b28b6-3fe0-4621-ae39-f5580b2ee94f": { + "last use date": "2025-01-01T03:18:49", + "create date": "2024-12-31T23:56:16", + "name": "HueSyncMusic" + }, + "BxpZbCn0tEN0UR-v2sBuXV5ykxfT2uv39o5vEiTu": { + "last use date": "2025-01-19T17:56:27", + "create date": "2025-01-09T15:59:59", + "name": "python_hue" + } + } + }, + "schedules": {}, + "scenes": { + "b1lPuFpeopW2Bv2X": { + "name": "Chill Licht", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "MsF6W_r81" + }, + "picture": "", + "lastupdated": "2024-05-25T19:08:16", + "version": 2 + }, + "pN1k3YVBunT5h2Rh": { + "name": "Arbeitslicht", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "o62CD_r81" + }, + "picture": "", + "lastupdated": "2024-06-06T23:14:59", + "version": 2 + }, + "MNyuOl7VfmQMGgF-": { + "name": "Tageslicht", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "2X7xz_r81" + }, + "picture": "", + "lastupdated": "2024-06-06T23:14:36", + "version": 2 + }, + "QnCPkuWzyHMy98y4": { + "name": "Nachtlicht", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "B2sEO_r81" + }, + "picture": "", + "lastupdated": "2024-06-06T23:15:26", + "version": 2 + }, + "pcZVyzWzBqfieEvc": { + "name": "Hell", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "nq5X1_r81" + }, + "picture": "", + "lastupdated": "2024-05-25T19:08:16", + "version": 2 + }, + "ZPnMb6dGWf1HcdOr": { + "name": "Vorschlaf", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "znx9n_r81" + }, + "picture": "", + "lastupdated": "2024-05-25T19:08:16", + "version": 2 + }, + "0NHW6zbVKA502TAE": { + "name": "Helles Tageslicht", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "zs619_r81" + }, + "picture": "", + "lastupdated": "2024-06-06T23:16:07", + "version": 2 + }, + "K8JL4zzzYuoE2xqQ": { + "name": "Leselicht", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "gN29T_r81" + }, + "picture": "", + "lastupdated": "2024-10-19T21:45:17", + "version": 2 + }, + "EF0dquNzhPt1vLmq": { + "name": "Videospiele", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "LLGUi_r81" + }, + "picture": "", + "lastupdated": "2024-05-25T19:08:16", + "version": 2 + }, + "gP3BviF2T4ybbyTy": { + "name": "Bett", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "hON9u_r81" + }, + "picture": "", + "lastupdated": "2024-06-23T21:28:12", + "version": 2 + }, + "dNzo2uP0Arq8s05p": { + "name": "Schokobr\u00f6tchen", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "NF4vD_r81" + }, + "picture": "", + "lastupdated": "2024-08-09T22:06:06", + "version": 2 + }, + "DLLExWCOb7D8l87n": { + "name": "Gem\u00fctlich", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "Oks8n_r81" + }, + "picture": "", + "lastupdated": "2024-05-25T19:08:16", + "version": 2 + }, + "6FNHyoS825Lgg9K9": { + "name": "Daily evening", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "6z6a5_r81" + }, + "picture": "", + "lastupdated": "2024-06-06T23:17:58", + "version": 2 + }, + "ygCL16tNEqy6qpZX": { + "name": "Go to bed", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "jff31_r81" + }, + "picture": "", + "lastupdated": "2024-06-06T23:18:30", + "version": 2 + }, + "s2tk7z8oL9LdiNvG": { + "name": "Nachtarbeit", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "K1W4G_r81" + }, + "picture": "", + "lastupdated": "2024-05-25T19:08:16", + "version": 2 + }, + "-W7zb2zeiqrqpite": { + "name": "Abends Arbeiten", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "BUb2I_r81" + }, + "picture": "", + "lastupdated": "2024-07-27T20:46:46", + "version": 2 + }, + "OKmtW8QM0DmNjurx": { + "name": "Sexy", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "uKe9o_r81" + }, + "picture": "", + "lastupdated": "2024-10-30T23:03:49", + "version": 2 + }, + "5SbOYF4LnIftOmHu": { + "name": "Sommertag", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "Xb3gg_r81" + }, + "picture": "", + "lastupdated": "2024-05-25T19:08:16", + "version": 2 + }, + "DwE3MeDEUCVtFNOV": { + "name": "Garderobe", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "1CtLp_r81" + }, + "picture": "", + "lastupdated": "2024-06-06T23:21:50", + "version": 2 + }, + "AOBgpenDXwahNtSU": { + "name": "Satisfactory", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "zdfnb_r81" + }, + "picture": "", + "lastupdated": "2024-09-25T18:55:51", + "version": 2 + }, + "yiqEvvIOjI6hayLF": { + "name": "Night Window + Light", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "W1dAa_r81" + }, + "picture": "", + "lastupdated": "2024-11-02T22:31:50", + "version": 2 + }, + "XItFycuCIaQmMoDv": { + "name": "Disturbia", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "sOdYy_r81" + }, + "picture": "", + "image": "703662f8-cfdc-4486-bf96-dfba46f22583", + "lastupdated": "2025-01-03T16:48:10", + "version": 2 + }, + "SM0sj3qjgJX0sgV5": { + "name": "Severance", + "type": "GroupScene", + "group": "81", + "lights": [ + "1", + "4", + "5", + "6", + "7", + "8" + ], + "owner": "", + "recycle": false, + "locked": false, + "appdata": { + "version": 1, + "data": "xBPat_r81" + }, + "picture": "", + "lastupdated": "2025-01-07T20:03:08", + "version": 2 + } + }, + "rules": {}, + "sensors": { + "1": { + "state": { + "daylight": null, + "lastupdated": "none" + }, + "config": { + "on": true, + "configured": false, + "sunriseoffset": 30, + "sunsetoffset": -30 + }, + "name": "Daylight", + "type": "Daylight", + "modelid": "PHDL00", + "manufacturername": "Signify Netherlands B.V.", + "swversion": "1.0" + } + }, + "resourcelinks": {} +} \ No newline at end of file