diff --git a/BridgeEmulator/HueObjects/Group.py b/BridgeEmulator/HueObjects/Group.py index f8693927..59ff6dab 100644 --- a/BridgeEmulator/HueObjects/Group.py +++ b/BridgeEmulator/HueObjects/Group.py @@ -25,7 +25,7 @@ def __init__(self, data): self.dxState = {"all_on": None, "any_on": None} streamMessage = {"creationtime": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), - "data": [self.getV2Room() if self.type == "Room" else self.getV2Zone()], + "data": [self.getV2Room() if self.type == "Room" else self.getV2Zone() if self.type == "Zone" else self.getV2lightgroup()], "id": str(uuid.uuid4()), "type": "add" } @@ -55,8 +55,7 @@ def __del__(self): streamMessage["id_v1"] = "/groups/" + self.id_v1 StreamEvent(streamMessage) ### room / zone #### - elementId = self.getV2Room( - )["id"] if self.type == "Room" else self.getV2Zone()["id"] + elementId = self.getV2Room()["id"] if self.type == "Room" else self.getV2Zone()["id"] if self.type == "Zone" else self.getV2lightgroup()["id"], elementType = "room" if self.type == "Room" else "zone" streamMessage = {"creationtime": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), "data": [{"id": elementId, "id_v1": "/groups/" + self.id_v1, "type": elementType}], @@ -68,8 +67,7 @@ def __del__(self): def add_light(self, light): self.lights.append(weakref.ref(light)) - elementId = self.getV2Room( - )["id"] if self.type == "Room" else self.getV2Zone()["id"] + elementId = self.getV2Room()["id"] if self.type == "Room" else self.getV2Zone()["id"] if self.type == "Zone" else self.getV2lightgroup()["id"] elementType = "room" if self.type == "Room" else "zone" streamMessage = {"creationtime": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), "data": [{"alert": {"action_values": ["breathe"]}, "id": self.id_v2, "id_v1": "/groups/" + self.id_v1, "on":{"on": self.action["on"]}, "type": "grouped_light", }], @@ -116,7 +114,7 @@ def update_attr(self, newdata): setattr(self, key, value) streamMessage = {"creationtime": datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ"), - "data": [self.getV2Room() if self.type == "Room" else self.getV2Zone()], + "data": [self.getV2Room() if self.type == "Room" else self.getV2Zone() if self.type == "Zone" else self.getV2lightgroup()], "id": str(uuid.uuid4()), "type": "update" } @@ -180,7 +178,7 @@ def genStreamEvent(self, v2State): streamMessage = {"creationtime": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"), "data": [{"id": self.id_v2,"id_v1": "/groups/" + self.id_v1, "type": "grouped_light", "owner": { - "rid": self.getV2Room()["id"] if self.type == "Room" else self.getV2Zone()["id"], + "rid": self.getV2Room()["id"] if self.type == "Room" else self.getV2Zone()["id"] if self.type == "Zone" else self.getV2lightgroup()["id"], "rtype": "room" if self.type == "Room" else "zone" } }], @@ -287,6 +285,41 @@ def getV2Zone(self): result["type"] = "zone" return result + def getV2lightgroup(self): + result = {"children": [], "services": []} + for light in self.lights: + if light(): + result["children"].append({ + "rid": str(uuid.uuid5( + uuid.NAMESPACE_URL, light().id_v2 + 'device')), + "rtype": "device" + }) + + #result["grouped_services"].append({ + # "rid": self.id_v2, + # "rtype": "grouped_light" + #}) + result["id"] = str(uuid.uuid5(uuid.NAMESPACE_URL, self.id_v2 + 'lightgroup')) + result["id_v1"] = "/groups/" + self.id_v1 + result["metadata"] = { + "archetype": self.icon_class.replace(" ", "_").replace("'", "").lower(), + "name": self.name + } + for light in self.lights: + if light(): + result["services"].append({ + "rid": light().id_v2, + "rtype": "light" + }) + + result["services"].append({ + "rid": self.id_v2, + "rtype": "grouped_light" + }) + + result["type"] = "lightgroup" + return result + def getV2GroupedLight(self): result = {} result["alert"] = { diff --git a/BridgeEmulator/flaskUI/restful.py b/BridgeEmulator/flaskUI/restful.py index 9276fa31..a984c187 100644 --- a/BridgeEmulator/flaskUI/restful.py +++ b/BridgeEmulator/flaskUI/restful.py @@ -89,7 +89,7 @@ def post(self): response[0]["success"]["clientkey"] = client_key bridgeConfig["apiUsers"][username] = ApiUser.ApiUser(username, postDict["devicetype"], client_key) - logging.debug(response) + logging.info(response) configManager.bridgeConfig.save_config() return response else: @@ -173,6 +173,9 @@ def post(self, username, resource): elif postDict["type"] == "Room": v2Resource = "room" bridgeConfig[resource][new_object_id] = Group.Group(postDict) + elif postDict["type"] == "LightGroup": + v2Resource = "lightgroup" + bridgeConfig[resource][new_object_id] = Group.Group(postDict) elif postDict["type"] == "Entertainment": v2Resource = "entertainment_configuration" bridgeConfig[resource][new_object_id] = EntertainmentConfiguration.EntertainmentConfiguration(postDict) @@ -248,6 +251,8 @@ def post(self, username, resource): streamMessage["data"].append(newObject.getV2Room()) elif v2Resource == "zone": streamMessage["data"].append(newObject.getV2Zone()) + elif v2Resource == "lightgroup": + streamMessage["data"].append(newObject.getV2lightgroup()) elif v2Resource == "entertainment_configuration": streamMessage["data"].append(newObject.getV2Api()) else: diff --git a/BridgeEmulator/flaskUI/v2restapi.py b/BridgeEmulator/flaskUI/v2restapi.py index 85c7dcb6..133ce366 100644 --- a/BridgeEmulator/flaskUI/v2restapi.py +++ b/BridgeEmulator/flaskUI/v2restapi.py @@ -278,6 +278,8 @@ def get(self): data.append(group.getV2Room()) elif group.type == "Zone": data.append(group.getV2Zone()) + elif group.type == "LightGroup": + data.append(group.getV2lightgroup()) # behavior_instance for key, instance in bridgeConfig["behavior_instance"].items(): data.append(instance.getV2Api()) @@ -343,6 +345,10 @@ def get(self, resource): for key, group in bridgeConfig["groups"].items(): if group.type == "Zone": response["data"].append(group.getV2Zone()) + elif resource == "lightgroup": + for key, group in bridgeConfig["groups"].items(): + if group.type == "LightGroup": + response["data"].append(group.getV2lightgroup()) elif resource == "grouped_light": for key, group in bridgeConfig["groups"].items(): response["data"].append(group.getV2GroupedLight()) @@ -576,6 +582,10 @@ def get(self, resource, resourceid): return {"errors": [], "data": [object.getV2Api()]} elif resource == "room": return {"errors": [], "data": [object.getV2Room()]} + elif resource == "zone": + return {"errors": [], "data": [object.getV2Zone()]} + elif resource == "lightgroup": + return {"errors": [], "data": [object.getV2lightgroup()]} elif resource == "grouped_light": return {"errors": [], "data": [object.getV2GroupedLight()]} elif resource == "device": diff --git a/BridgeEmulator/functions/scripts.py b/BridgeEmulator/functions/scripts.py index dbcd7cbc..f6043888 100644 --- a/BridgeEmulator/functions/scripts.py +++ b/BridgeEmulator/functions/scripts.py @@ -14,6 +14,9 @@ def findScene(element): elif element["group"]["rtype"] == "zone": if obj.id_v2 == element["recall"]["rid"] and obj.group().getV2Zone()["id"] == element["group"]["rid"]: return obj + elif element["group"]["rtype"] == "lightgroup": + if obj.id_v2 == element["recall"]["rid"] and obj.group().getV2lightgroup()["id"] == element["group"]["rid"]: + return obj return False def findGroup(id_v2): @@ -23,6 +26,8 @@ def findGroup(id_v2): return obj elif obj.getV2Zone()["id"] == id_v2: return obj + elif obj.getV2lightgroup()["id"] == id_v2: + return obj return False def triggerScript(behavior_instance):