1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
from __future__ import annotations
from collections import namedtuple
from collections.abc import Coroutine
from logging import Logger
from typing import Any
from .api import APIItems
# Represents a CIE 1931 XY coordinate pair.
XYPoint = namedtuple("XYPoint", ["x", "y"])
# Represents the Gamut of a light.
GamutType = namedtuple("GamutType", ["red", "green", "blue"])
class Lights(APIItems):
"""
Represents Hue Lights.
https://developers.meethue.com/documentation/lights-api
"""
def __init__(self, logger: Logger, raw: dict[str, Any], request: Coroutine) -> None:
"""Initialize instance."""
super().__init__(logger, raw, request, "lights", Light)
class Light:
"""Represents a Hue light."""
ITEM_TYPE = "lights"
def __init__(self, id: str, raw: dict[str, Any], request: Coroutine) -> None:
"""Initialize instance."""
self.id = id
self.raw = raw
self._request = request
@property
def uniqueid(self):
return self.raw["uniqueid"]
@property
def manufacturername(self):
return self.raw["manufacturername"]
@property
def modelid(self):
return self.raw["modelid"]
@property
def productname(self):
# productname added in Bridge API 1.24 (published 03/05/2018)
return self.raw.get("productname")
@property
def name(self):
return self.raw["name"]
@property
def state(self):
return self.raw["state"]
@property
def type(self):
return self.raw["type"]
@property
def swversion(self):
"""Software version of the light."""
return self.raw["swversion"]
@property
def swupdatestate(self):
"""Software update state of the light."""
return self.raw.get("swupdate", {}).get("state")
@property
def controlcapabilities(self):
"""Capabilities that the light has to control it."""
return self.raw.get("capabilities", {}).get("control", {})
@property
def colorgamuttype(self):
"""The color gamut type of the light."""
light_spec = self.controlcapabilities
return light_spec.get("colorgamuttype", "None")
@property
def colorgamut(self):
"""The color gamut information of the light."""
try:
light_spec = self.controlcapabilities
gtup = tuple([XYPoint(*x) for x in light_spec["colorgamut"]])
color_gamut = GamutType(*gtup)
except KeyError:
color_gamut = None
return color_gamut
async def set_state(
self,
on=None,
bri=None,
hue=None,
sat=None,
xy=None,
ct=None,
alert=None,
effect=None,
transitiontime=None,
bri_inc=None,
sat_inc=None,
hue_inc=None,
ct_inc=None,
xy_inc=None,
):
"""Change state of a light."""
data = {
key: value
for key, value in {
"on": on,
"bri": bri,
"hue": hue,
"sat": sat,
"xy": xy,
"ct": ct,
"alert": alert,
"effect": effect,
"transitiontime": transitiontime,
"bri_inc": bri_inc,
"sat_inc": sat_inc,
"hue_inc": hue_inc,
"ct_inc": ct_inc,
"xy_inc": xy_inc,
}.items()
if value is not None
}
await self._request("put", f"lights/{self.id}/state", json=data)
|