2023-01-10 07:56:31 +00:00
|
|
|
from types import new_class
|
2022-12-10 18:47:34 +00:00
|
|
|
from typing import (
|
|
|
|
Any,
|
|
|
|
Literal,
|
|
|
|
Optional,
|
|
|
|
Type,
|
|
|
|
ClassVar,
|
2023-01-04 09:17:06 +00:00
|
|
|
TypeVar,
|
2022-12-10 18:47:34 +00:00
|
|
|
)
|
2023-01-04 09:17:06 +00:00
|
|
|
from uuid import UUID as _UUID, uuid4
|
2023-01-10 07:56:31 +00:00
|
|
|
from typing import TypeVar, Generic
|
2022-11-30 12:08:35 +00:00
|
|
|
from enum import Enum, auto
|
2023-01-10 07:56:31 +00:00
|
|
|
from httpx import AsyncClient
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
from pydantic import BaseConfig, BaseModel, Field
|
2023-01-10 07:56:31 +00:00
|
|
|
from pydantic.main import ModelMetaclass, BaseModel
|
|
|
|
from pydantic.generics import GenericModel
|
2022-12-11 21:09:27 +00:00
|
|
|
from pydantic.dataclasses import dataclass
|
2023-01-10 07:56:31 +00:00
|
|
|
from requests import delete
|
2022-11-30 12:08:35 +00:00
|
|
|
|
|
|
|
try:
|
2023-01-04 09:17:06 +00:00
|
|
|
from ujson import dumps, loads
|
2022-11-30 12:08:35 +00:00
|
|
|
except ImportError:
|
2022-12-11 21:09:27 +00:00
|
|
|
try:
|
2023-01-04 09:17:06 +00:00
|
|
|
from orjson import dumps, loads
|
2022-12-11 21:09:27 +00:00
|
|
|
except ImportError:
|
2023-01-04 09:17:06 +00:00
|
|
|
from json import dumps, loads
|
2022-12-11 21:09:27 +00:00
|
|
|
|
|
|
|
_type = type
|
2023-01-10 07:56:31 +00:00
|
|
|
_T = TypeVar("_T")
|
|
|
|
_D = TypeVar("_D", bound=dict)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
|
|
|
__all__ = (
|
|
|
|
"Entity",
|
|
|
|
"Archetype",
|
|
|
|
"RoomType",
|
2023-01-04 09:17:06 +00:00
|
|
|
"Attributes",
|
2022-12-11 21:09:27 +00:00
|
|
|
"HueEntsV2",
|
|
|
|
"HueEntsV1",
|
2023-01-04 09:17:06 +00:00
|
|
|
"_XY",
|
2022-12-11 21:09:27 +00:00
|
|
|
)
|
2022-11-28 08:54:10 +00:00
|
|
|
|
2022-12-10 18:47:34 +00:00
|
|
|
# mypy: enable-incomplete-feature=TypeVarTuple
|
2023-01-04 09:17:06 +00:00
|
|
|
Ent = TypeVar("Ent", bound="Entity")
|
|
|
|
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
def default_uuid():
|
|
|
|
return UUID(str(uuid4()))
|
|
|
|
|
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
def config_dumps(obj: Any) -> str:
|
|
|
|
return ret if isinstance(ret := dumps(obj), str) else ret.decode()
|
|
|
|
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Config(BaseConfig):
|
|
|
|
json_loads = loads
|
|
|
|
json_dumps = lambda *args, **kwargs: (
|
|
|
|
d if isinstance(d := dumps(*args, **kwargs), str) else d.decode()
|
|
|
|
)
|
|
|
|
smart_union = True
|
|
|
|
allow_mutations = True
|
|
|
|
|
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
class HueConfig(BaseConfig):
|
|
|
|
allow_population_by_field_name = True
|
|
|
|
json_loads = loads
|
2023-01-10 07:56:31 +00:00
|
|
|
json_dumps = lambda *args, **kwargs: (
|
|
|
|
d if isinstance(d := dumps(*args, **kwargs), str) else d.decode()
|
|
|
|
)
|
2023-01-04 09:17:06 +00:00
|
|
|
smart_union = True
|
2023-01-10 07:56:31 +00:00
|
|
|
allow_mutation = True
|
2023-01-04 09:17:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
class UUID(_UUID):
|
|
|
|
def __json__(self):
|
|
|
|
return self.__str__()
|
2022-11-30 12:08:35 +00:00
|
|
|
|
2022-11-28 10:48:43 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
def validate(*args, **kwargs):
|
|
|
|
return kwargs
|
|
|
|
|
|
|
|
|
2022-11-30 12:08:35 +00:00
|
|
|
class Entity(BaseModel):
|
|
|
|
__module__ = "phlyght"
|
2022-12-11 21:09:27 +00:00
|
|
|
__cache__: ClassVar[dict[str, Type]] = {}
|
2023-01-04 09:17:06 +00:00
|
|
|
id: Optional[UUID] = Field(
|
2022-12-11 21:09:27 +00:00
|
|
|
default_factory=lambda: UUID("00000000-0000-0000-0000-000000000000")
|
|
|
|
)
|
|
|
|
type: ClassVar[str] = "unknown"
|
2023-01-10 07:56:31 +00:00
|
|
|
Config = HueConfig
|
|
|
|
__config__ = HueConfig
|
2022-11-28 10:48:43 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
@classmethod
|
|
|
|
def cache_client(cls, client):
|
|
|
|
Entity.client = client
|
2022-11-28 08:13:44 +00:00
|
|
|
|
2022-11-30 12:08:35 +00:00
|
|
|
@classmethod
|
2022-12-11 21:09:27 +00:00
|
|
|
def get_entities(cls) -> dict[str, Type]:
|
2022-11-30 12:08:35 +00:00
|
|
|
return cls.__cache__
|
2022-11-28 08:13:44 +00:00
|
|
|
|
2022-11-30 12:08:35 +00:00
|
|
|
@classmethod
|
2023-01-10 07:56:31 +00:00
|
|
|
def get_plural(cls, name):
|
|
|
|
if name.endswith("y"):
|
|
|
|
return name[:-1] + "ies"
|
|
|
|
return name + "s"
|
|
|
|
|
|
|
|
def __new__(cls, client=None, **kwargs):
|
|
|
|
clz = type(cls.__name__, (BaseModel,), {}).__new__(cls)
|
|
|
|
return clz
|
|
|
|
|
|
|
|
async def get(self):
|
|
|
|
return await getattr(self.client, f"get_{self.type}")(self.id)
|
|
|
|
|
|
|
|
async def create(self, **kwargs):
|
|
|
|
if not hasattr(self.client, f"create_{self.type}"):
|
|
|
|
return
|
|
|
|
|
|
|
|
for k, v in kwargs.items():
|
|
|
|
if hasattr(self, k) and getattr(self, k) != v:
|
|
|
|
setattr(self, k, v)
|
|
|
|
|
|
|
|
await getattr(self.client, f"create_{self.type}")(self)
|
|
|
|
|
|
|
|
async def update(self, **kwargs):
|
|
|
|
for k, v in kwargs.items():
|
|
|
|
if hasattr(self, k) and getattr(self, k) != v:
|
|
|
|
setattr(self, k, v)
|
|
|
|
await getattr(self.client, f"set_{self.type}")(self.id, self)
|
|
|
|
|
|
|
|
async def delete(self):
|
|
|
|
if _fn := getattr(self.client, f"delete_{self.type}", None):
|
|
|
|
await _fn(self.id, self)
|
2022-11-30 12:08:35 +00:00
|
|
|
|
2022-12-11 21:09:27 +00:00
|
|
|
def __init_subclass__(cls, **_):
|
2022-11-30 12:08:35 +00:00
|
|
|
super().__init_subclass__()
|
|
|
|
Entity.__cache__[
|
|
|
|
_.get_default() if (_ := cls.__fields__.get("type")) else "unknown"
|
|
|
|
] = cls
|
|
|
|
|
|
|
|
def __hash__(self) -> int:
|
|
|
|
return hash(self.id)
|
|
|
|
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class BaseAttribute(BaseModel):
|
|
|
|
Config = HueConfig
|
|
|
|
__config__ = HueConfig
|
|
|
|
|
|
|
|
def __init_subclass__(cls, *args, **kwargs):
|
|
|
|
cls.Config = HueConfig
|
|
|
|
|
|
|
|
|
2022-11-30 12:08:35 +00:00
|
|
|
class RoomType(Enum):
|
2022-11-28 10:48:43 +00:00
|
|
|
@staticmethod
|
2022-12-11 21:09:27 +00:00
|
|
|
def _generate_next_value_(name, *_):
|
2022-11-28 10:48:43 +00:00
|
|
|
return name.lower()
|
|
|
|
|
2022-11-30 12:08:35 +00:00
|
|
|
LIVING_ROOM = auto()
|
|
|
|
KITCHEN = auto()
|
|
|
|
DINING = auto()
|
|
|
|
BEDROOM = auto()
|
|
|
|
KIDS_BEDROOM = auto()
|
|
|
|
BATHROOM = auto()
|
|
|
|
NURSERY = auto()
|
|
|
|
RECREATION = auto()
|
|
|
|
OFFICE = auto()
|
|
|
|
GYM = auto()
|
|
|
|
HALLWAY = auto()
|
|
|
|
TOILET = auto()
|
|
|
|
FRONT_DOOR = auto()
|
|
|
|
GARAGE = auto()
|
|
|
|
TERRACE = auto()
|
|
|
|
GARDEN = auto()
|
|
|
|
DRIVEWAY = auto()
|
|
|
|
CARPORT = auto()
|
|
|
|
HOME = auto()
|
|
|
|
DOWNSTAIRS = auto()
|
|
|
|
UPSTAIRS = auto()
|
|
|
|
TOP_FLOOR = auto()
|
|
|
|
ATTIC = auto()
|
|
|
|
GUEST_ROOM = auto()
|
|
|
|
STAIRCASE = auto()
|
|
|
|
LOUNGE = auto()
|
|
|
|
MAN_CAVE = auto()
|
|
|
|
COMPUTER = auto()
|
|
|
|
STUDIO = auto()
|
|
|
|
MUSIC = auto()
|
|
|
|
TV = auto()
|
|
|
|
READING = auto()
|
|
|
|
CLOSET = auto()
|
|
|
|
STORAGE = auto()
|
|
|
|
LAUNDRY_ROOM = auto()
|
|
|
|
BALCONY = auto()
|
|
|
|
PORCH = auto()
|
|
|
|
BARBECUE = auto()
|
|
|
|
POOL = auto()
|
|
|
|
OTHER = auto()
|
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
def __json__(self):
|
|
|
|
return self.value
|
|
|
|
|
2022-11-30 12:08:35 +00:00
|
|
|
|
|
|
|
class Archetype(Enum):
|
2022-11-28 08:13:44 +00:00
|
|
|
@staticmethod
|
2022-12-11 21:09:27 +00:00
|
|
|
def _generate_next_value_(name, *_):
|
2022-11-28 08:13:44 +00:00
|
|
|
return name.lower()
|
|
|
|
|
2022-11-30 12:08:35 +00:00
|
|
|
BRIDGE_V2 = auto()
|
|
|
|
UNKNOWN_ARCHETYPE = auto()
|
|
|
|
CLASSIC_BULB = auto()
|
|
|
|
SULTAN_BULB = auto()
|
|
|
|
FLOOD_BULB = auto()
|
|
|
|
SPOT_BULB = auto()
|
|
|
|
CANDLE_BULB = auto()
|
|
|
|
LUSTER_BULB = auto()
|
|
|
|
PENDANT_ROUND = auto()
|
|
|
|
PENDANT_LONG = auto()
|
|
|
|
CEILING_ROUND = auto()
|
|
|
|
CEILING_SQUARE = auto()
|
|
|
|
FLOOR_SHADE = auto()
|
|
|
|
FLOOR_LANTERN = auto()
|
|
|
|
TABLE_SHADE = auto()
|
|
|
|
RECESSED_CEILING = auto()
|
|
|
|
RECESSED_FLOOR = auto()
|
|
|
|
SINGLE_SPOT = auto()
|
|
|
|
DOUBLE_SPOT = auto()
|
|
|
|
TABLE_WASH = auto()
|
|
|
|
WALL_LANTERN = auto()
|
|
|
|
WALL_SHADE = auto()
|
|
|
|
FLEXIBLE_LAMP = auto()
|
|
|
|
GROUND_SPOT = auto()
|
|
|
|
WALL_SPOT = auto()
|
|
|
|
PLUG = auto()
|
|
|
|
HUE_GO = auto()
|
|
|
|
HUE_LIGHTSTRIP = auto()
|
|
|
|
HUE_IRIS = auto()
|
|
|
|
HUE_BLOOM = auto()
|
|
|
|
BOLLARD = auto()
|
|
|
|
WALL_WASHER = auto()
|
|
|
|
HUE_PLAY = auto()
|
|
|
|
VINTAGE_BULB = auto()
|
|
|
|
CHRISTMAS_TREE = auto()
|
|
|
|
HUE_CENTRIS = auto()
|
|
|
|
HUE_LIGHTSTRIP_TV = auto()
|
|
|
|
HUE_TUBE = auto()
|
|
|
|
HUE_SIGNE = auto()
|
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
def __json__(self):
|
|
|
|
return f'"{self.value}"'
|
2022-11-30 12:08:35 +00:00
|
|
|
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
_T = TypeVar("_T")
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
|
|
|
|
@dataclass
|
2022-12-11 21:09:27 +00:00
|
|
|
class _XY:
|
2023-01-04 09:17:06 +00:00
|
|
|
x: float
|
|
|
|
y: float
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
def __post_init__(self):
|
|
|
|
if self.x < 0.01:
|
|
|
|
self.x = 0.01
|
|
|
|
if self.y < 0.01:
|
|
|
|
self.y = 0.01
|
|
|
|
if self.x > 0.99:
|
|
|
|
self.x = 0.99
|
|
|
|
if self.y > 0.99:
|
|
|
|
self.y = 0.99
|
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
def __json__(self):
|
2023-01-10 07:56:31 +00:00
|
|
|
return (
|
|
|
|
'{"y":' + f'{int(10000*self.x)/10000}, "x": {int(10000*self.y)/10000}' + "}"
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
@dataclass
|
2022-12-11 21:09:27 +00:00
|
|
|
class On:
|
|
|
|
on: bool = True
|
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
def __json__(self):
|
|
|
|
return '{"on": ' + f"{self.on}" + "}"
|
2022-12-11 21:09:27 +00:00
|
|
|
|
|
|
|
|
|
|
|
XY = _XY | tuple[float, float]
|
|
|
|
|
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
class Attributes:
|
2023-01-10 07:56:31 +00:00
|
|
|
class Action(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
on: "Attributes.On" = Field(default_factory=lambda: Attributes.On(on=True))
|
|
|
|
dimming: "Attributes.Dimming" = Field(
|
|
|
|
default_factory=lambda: Attributes.Dimming(
|
|
|
|
brightness=100.0, min_dim_level=100.0
|
|
|
|
)
|
|
|
|
)
|
|
|
|
color: "Attributes.ColorPoint" = Field(
|
|
|
|
default_factory=lambda: Attributes.ColorPoint()
|
|
|
|
)
|
|
|
|
color_temperature: "Attributes.ScenePaletteColorTemp" = Field(
|
|
|
|
default_factory=lambda: Attributes.ScenePaletteColorTemp(mirek=500)
|
|
|
|
)
|
|
|
|
gradient: "Attributes.Gradient" = Field(
|
|
|
|
default_factory=lambda: Attributes.Gradient(points_capable=2, points=[])
|
|
|
|
)
|
|
|
|
effects: "Attributes.Effects" = Field(
|
|
|
|
default_factory=lambda: Attributes.Effects()
|
|
|
|
)
|
|
|
|
dynamics: "Attributes.SceneDynamics" = Field(
|
|
|
|
default_factory=lambda: Attributes.SceneDynamics(duration=1)
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Actions(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
target: "Attributes.Identifier" = Field(...)
|
|
|
|
action: "Attributes.Action" = Field(default_factory=lambda: Attributes.Action())
|
|
|
|
dimming: "Attributes.Dimming" = Field(
|
|
|
|
default_factory=lambda: Attributes.Dimming(
|
|
|
|
brightness=100.0, min_dim_level=100.0
|
|
|
|
)
|
|
|
|
)
|
|
|
|
color: "Attributes.ColorPoint" = Field(
|
|
|
|
default_factory=lambda: Attributes.ColorPoint()
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Alert(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
action: Literal["breathe", "unknown"] = "unknown"
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Button(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
last_event: Literal[
|
|
|
|
"initial_press",
|
|
|
|
"repeat",
|
|
|
|
"short_release",
|
|
|
|
"long_release",
|
|
|
|
"double_short_release",
|
|
|
|
"long_press",
|
|
|
|
] = "initial_press"
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Color(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
xy: "Attributes.XY" = Field(default_factory=lambda: Attributes.XY(x=0.0, y=0.0))
|
|
|
|
gamut: "Attributes.Gamut" = Field(default_factory=lambda: Attributes.Gamut())
|
|
|
|
gamut_type: Literal["A", "B", "C"] = "A"
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class ColorPointColor(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
color: "Attributes.ColorPoint" = Field(
|
|
|
|
default_factory=lambda: Attributes.ColorPoint()
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class ColorPoint(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
xy: "Attributes.XY" = Field(default_factory=lambda: Attributes.XY(x=0.0, y=0.0))
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class ColorMirekSchema(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
mirek_minimum: int = Field(default=153, ge=153, le=500)
|
|
|
|
mirek_maximum: int = Field(default=500, ge=153, le=500)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class ColorTemp(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
mirek: Optional[int] = Field(default=0, ge=153, le=500)
|
|
|
|
mirek_valid: Optional[bool] = True
|
|
|
|
mirek_schema: Optional["Attributes.ColorMirekSchema"] = Field(
|
|
|
|
default_factory=lambda: Attributes.ColorMirekSchema()
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Dependee(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: str = "unknown"
|
|
|
|
target: "Attributes.Identifier" = Field(...)
|
|
|
|
level: str = "unknown"
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Dimming(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
brightness: Optional[float] = Field(default=100, gt=0, le=100)
|
|
|
|
min_dim_level: Optional[float] = Field(default=0, ge=0, le=100)
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class DimmingDelta(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
action: Optional[Literal["up", "down", "stop"]] = "stop"
|
|
|
|
brightness_delta: Optional[float] = Field(default=0, ge=0, le=100)
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Dynamics(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
status: str = "unknown"
|
|
|
|
status_values: Optional[list[str]] = Field(default_factory=list)
|
|
|
|
speed: Optional[float] = Field(default=0.0, ge=0, le=100)
|
|
|
|
speed_valid: Optional[bool] = True
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Effects(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
effect: Optional[list[str]] = Field(default_factory=list)
|
|
|
|
status_values: Optional[list[str]] = Field(default_factory=list)
|
|
|
|
status: str = "unknown"
|
|
|
|
effect_values: Optional[list[str]] = Field(default_factory=list)
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class EntChannel(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
channel_id: int = Field(ge=0, le=255)
|
|
|
|
position: Optional["Attributes.XYZ"] = Field(
|
|
|
|
default_factory=lambda: Attributes.XYZ(x=0.0, y=0.0, z=0.0)
|
|
|
|
)
|
|
|
|
members: list["Attributes.SegmentRef"] = Field(default_factory=list)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class EntLocation(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
service_location: list["Attributes.ServiceLocation"] = Field(
|
|
|
|
default_factory=list
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Gamut(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
red: XY = Field(default_factory=lambda: Attributes.XY(x=0.0, y=0.0))
|
|
|
|
green: XY = Field(default_factory=lambda: Attributes.XY(x=0.0, y=0.0))
|
|
|
|
blue: XY = Field(default_factory=lambda: Attributes.XY(x=0.0, y=0.0))
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Gradient(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
points: Optional[list["Attributes.ColorPointColor"]] = Field(
|
|
|
|
default_factory=list
|
|
|
|
)
|
|
|
|
points_capable: Optional[int] = Field(default=1, ge=0, le=255)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Identifier(BaseAttribute):
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
rid: UUID = Field(default_factory=default_uuid)
|
2023-01-04 09:17:06 +00:00
|
|
|
rtype: str = "unknown"
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class LightColor(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
xy: Optional[XY] = Field(default_factory=lambda: _XY(x=0.0, y=0.0))
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class LightLevelValue(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
light_level: Optional[int] = Field(default=0, ge=0, le=100000)
|
|
|
|
light_level_valid: Optional[bool] = True
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class LightEffect(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
effect: Optional[Literal["fire", "candle", "no_effect"]] = "no_effect"
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Metadata(BaseAttribute):
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
name: str = "unknown"
|
|
|
|
archetype: Archetype | RoomType = Archetype.UNKNOWN_ARCHETYPE
|
|
|
|
image: "Attributes.Identifier" = Field(
|
|
|
|
default_factory=lambda: Attributes.Identifier(), repr=False
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Motion(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
motion: Optional[bool] = False
|
|
|
|
motion_valid: Optional[bool] = True
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class On(BaseAttribute):
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
on: Optional[bool] = Field(default=True, alias="on")
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Palette(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
color: Optional[list["Attributes.PaletteColor"]] = Field(default_factory=list)
|
|
|
|
dimming: Optional[list["Attributes.Dimming"]] = Field(default_factory=list)
|
|
|
|
color_temperature: list["Attributes.PaletteTemperature"] = Field(
|
|
|
|
default_factory=list
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class PaletteColor(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
color: Optional["Attributes.ColorPoint"] = Field(
|
|
|
|
default_factory=lambda: Attributes.ColorPoint()
|
|
|
|
)
|
|
|
|
dimming: Optional["Attributes.Dimming"] = Field(
|
2023-01-10 07:56:31 +00:00
|
|
|
default_factory=lambda: Attributes.Dimming(brightness=100.0)
|
2023-01-04 09:17:06 +00:00
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class PaletteTemperature(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
color_temperature: Optional["Attributes.ScenePaletteColorTemp"] = Field(
|
|
|
|
default_factory=lambda: Attributes.ScenePaletteColorTemp(mirek=500)
|
|
|
|
)
|
|
|
|
dimming: Optional["Attributes.Dimming"] = Field(
|
|
|
|
default_factory=lambda: Attributes.Dimming(
|
|
|
|
brightness=100.0, min_dim_level=100.0
|
|
|
|
)
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class PowerState(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
battery_state: Optional[Literal["normal", "low", "critical"]] = "normal"
|
|
|
|
battery_level: Optional[float] = Field(default=100.0, le=100.0, ge=0.0)
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class ProductData(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
model_id: Optional[str] = "unknown"
|
|
|
|
manufacturer_name: Optional[str] = "unknown"
|
|
|
|
product_name: Optional[str] = "unknown"
|
|
|
|
product_archetype: Optional[Archetype] = Archetype.UNKNOWN_ARCHETYPE
|
|
|
|
certified: Optional[bool] = False
|
2023-01-10 07:56:31 +00:00
|
|
|
software_version: Optional[str] = Field(
|
|
|
|
default="0.0.0", regex=r"\d+\.(?:\d+\.)*\d+"
|
|
|
|
)
|
2023-01-04 09:17:06 +00:00
|
|
|
hardware_platform_type: Optional[str] = "unknown"
|
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class RelativeRotary(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
last_event: Optional["Attributes.RotaryEvent"] = Field(
|
|
|
|
default_factory=lambda: Attributes.RotaryEvent()
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class RotaryEvent(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
action: Optional[Literal["start", "repeat", "unknown"]] = "unknown"
|
|
|
|
rotation: Optional["Attributes.RotaryRotation"] = Field(
|
|
|
|
default_factory=lambda: Attributes.RotaryRotation(
|
|
|
|
direction="clock_wise", duration=0.0, steps=0
|
|
|
|
)
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class RotaryRotation(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
direction: Literal["clock_wise", "counter_clock_wise"] = "clock_wise"
|
|
|
|
duration: Optional[float] = Field(0.0, ge=0.0)
|
|
|
|
steps: Optional[int] = Field(0, ge=0)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class SceneDynamics(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
duration: Optional[int] = Field(0, ge=0)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class SceneEffects(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
effect: Optional[Literal["fire", "candle", "no_effect"]] = "no_effect"
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class ScenePaletteColorTemp(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
mirek: int = Field(153, ge=153, le=500)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Segment(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
start: int = Field(0, ge=0)
|
|
|
|
length: int = Field(1, ge=1)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class SegmentManager(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
configurable: Optional[bool] = True
|
|
|
|
max_segments: Optional[int] = Field(default=1, ge=1)
|
|
|
|
segments: Optional[list["Attributes.Segment"]] = Field(default_factory=list)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class SegmentRef(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
service: "Attributes.Identifier" = Field(
|
|
|
|
default_factory=lambda: Attributes.Identifier()
|
|
|
|
)
|
|
|
|
index: int = 0
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class ServiceLocation(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
service: "Attributes.Identifier" = Field(
|
|
|
|
default_factory=lambda: Attributes.Identifier()
|
|
|
|
)
|
|
|
|
position: "Attributes.XYZ" = Field(
|
|
|
|
default_factory=lambda: Attributes.XYZ(x=0.0, y=0.0, z=0.0)
|
|
|
|
)
|
|
|
|
positions: list[Type["Attributes.XYZ"]] = Field(max_items=2, min_items=1)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class StreamProxy(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
mode: Literal["auto", "manual"] = "manual"
|
|
|
|
node: "Attributes.Identifier" = Field(
|
|
|
|
default_factory=lambda: Attributes.Identifier()
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class Temp(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
temperature: float = Field(default=0.0, lt=100.0, gt=-100.0)
|
|
|
|
temperature_valid: bool = True
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class TimedEffects(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
effect: Optional[str] = "none"
|
|
|
|
duration: Optional[float] = Field(default=0.0, ge=0.0)
|
|
|
|
status_values: Optional[list[str]] = Field(default_factory=list)
|
|
|
|
status: Optional[str] = "unknown"
|
|
|
|
effect_values: Optional[list[str]] = Field(default_factory=list)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class XY(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
x: float = Field(0.0, ge=0.0, le=1.0)
|
|
|
|
y: float = Field(0.0, ge=0.0, le=1.0)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-10 07:56:31 +00:00
|
|
|
class XYZ(BaseAttribute):
|
2023-01-04 09:17:06 +00:00
|
|
|
x: float = Field(ge=-1.0, le=1.0)
|
|
|
|
y: float = Field(ge=-1.0, le=1.0)
|
|
|
|
z: float = Field(ge=-1.0, le=1.0)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
class HueEntsV1:
|
|
|
|
class UserConfiguration(Entity):
|
|
|
|
name: str
|
|
|
|
swupdate: dict
|
|
|
|
swupdate2: dict
|
|
|
|
whitelist: list[str]
|
|
|
|
portalstate: dict
|
|
|
|
apiversion: str
|
|
|
|
swversion: str
|
|
|
|
proxyaddress: str
|
|
|
|
|
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
v: BaseModel
|
|
|
|
|
|
|
|
for k, v in Attributes.__dict__.items():
|
|
|
|
if k.startswith("__"):
|
|
|
|
continue
|
|
|
|
|
|
|
|
if isinstance(v, type) and issubclass(v, BaseModel):
|
|
|
|
v.update_forward_refs()
|
|
|
|
|
|
|
|
|
2022-12-10 18:47:34 +00:00
|
|
|
class HueEntsV2:
|
|
|
|
class BehaviorInstance(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "beheavior_instance"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
|
|
|
script_id: str = Field("", regex=r"^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$")
|
|
|
|
enabled: bool = True
|
|
|
|
state: dict[str, Any] = Field(default_factory=dict)
|
|
|
|
configuration: dict[str, Any] = Field(default_factory=dict)
|
2023-01-04 09:17:06 +00:00
|
|
|
dependees: list[Attributes.Dependee] = Field(default_factory=list)
|
2022-12-11 21:09:27 +00:00
|
|
|
status: Literal[
|
|
|
|
"initializing", "running", "disabled", "errored"
|
|
|
|
] = "initializing"
|
|
|
|
last_error: str = "none"
|
|
|
|
metadata: dict[Literal["name"], str] = Field(default_factory=dict)
|
|
|
|
migrated_from: str = "unknown"
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class BehaviorScript(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "behavior_script"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
|
|
|
description: str = ""
|
2023-01-10 07:56:31 +00:00
|
|
|
configuration_schema: dict[Any, Any] = Field(default_factory=dict)
|
|
|
|
trigger_schema: dict[Any, Any] = Field(default_factory=dict)
|
|
|
|
state_schema: dict[Any, Any] = Field(default_factory=dict)
|
2022-12-11 21:09:27 +00:00
|
|
|
version: str = Field("0.0.1", regex=r"^[0-9]+\.[0-9]+\.[0-9]+$")
|
2023-01-10 07:56:31 +00:00
|
|
|
metadata: dict[Any, Any] = Field(default_factory=dict)
|
|
|
|
supported_features: list[str] = Field(default_factory=list)
|
|
|
|
max_number_of_instances: int = Field(default=0, ge=0, le=255)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Bridge(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "bridge"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
|
|
|
bridge_id: str = ""
|
|
|
|
time_zone: dict[str, str] = Field(default_factory=dict)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class BridgeHome(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "bridge_home"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
services: list[Attributes.Identifier] = Field(default_factory=list)
|
|
|
|
children: list[Attributes.Identifier] = Field(default_factory=list)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Button(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "button"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
owner: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
2022-12-11 21:09:27 +00:00
|
|
|
metadata: dict[Literal["control_id"], int] = Field(default_factory=dict)
|
2023-01-04 09:17:06 +00:00
|
|
|
button: Attributes.Button = Field(default_factory=Attributes.Button)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Device(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "device"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
services: list[Attributes.Identifier] = Field(default_factory=list)
|
|
|
|
metadata: Attributes.Metadata = Field(default_factory=Attributes.Metadata)
|
|
|
|
product_data: Attributes.ProductData = Field(
|
|
|
|
default_factory=lambda: Attributes.ProductData()
|
|
|
|
)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class DevicePower(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "device_power"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
owner: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
|
|
|
power_state: Attributes.PowerState = Field(
|
|
|
|
default_factory=Attributes.PowerState
|
|
|
|
)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Entertainment(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "entertainment"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
owner: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
2022-12-11 21:09:27 +00:00
|
|
|
renderer: bool = False
|
|
|
|
proxy: bool = False
|
|
|
|
max_streams: int = Field(1, ge=1)
|
2023-01-04 09:17:06 +00:00
|
|
|
segments: Attributes.SegmentManager = Field(
|
|
|
|
default_factory=Attributes.SegmentManager
|
|
|
|
)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class EntertainmentConfiguration(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "entertainment_configuration"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
|
|
|
metadata: dict[Literal["name"], str] = Field(default_factory=dict)
|
|
|
|
name: str = ""
|
2022-12-10 18:47:34 +00:00
|
|
|
configuration_type: Optional[
|
|
|
|
Literal["screen", "monitor", "music", "3dspace", "other"]
|
2022-12-11 21:09:27 +00:00
|
|
|
] = "screen"
|
|
|
|
status: Literal["active", "inactive"] = "inactive"
|
2023-01-04 09:17:06 +00:00
|
|
|
active_streamer: Attributes.Identifier = Field(
|
|
|
|
default_factory=Attributes.Identifier
|
|
|
|
)
|
|
|
|
stream_proxy: Attributes.StreamProxy = Field(
|
|
|
|
default_factory=Attributes.StreamProxy
|
|
|
|
)
|
|
|
|
channels: list[Attributes.EntChannel] = Field(default_factory=list)
|
|
|
|
locations: Attributes.EntLocation = Field(
|
|
|
|
default_factory=Attributes.EntLocation
|
|
|
|
)
|
|
|
|
light_services: list[Attributes.Identifier] = Field(default_factory=list)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class GeofenceClient(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "geofence_client"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
|
|
|
name: str = ""
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Geolocation(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "geolocation"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
|
|
|
is_configured: bool = False
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class GroupedLight(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "grouped_light"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
on: Attributes.On = Field(default_factory=Attributes.On)
|
|
|
|
alert: Attributes.Alert = Field(default_factory=Attributes.Alert)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Homekit(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
id: UUID
|
|
|
|
type: ClassVar[str] = "resource"
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
|
|
|
status: Literal["paired", "pairing", "unpaired"] = "unpaired"
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Light(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
# id: UUID
|
|
|
|
id_v1: Optional[str] = Field(
|
|
|
|
default="", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$", exclude=True
|
2022-12-10 18:47:34 +00:00
|
|
|
)
|
2023-01-04 09:17:06 +00:00
|
|
|
owner: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
|
|
|
metadata: Attributes.Metadata = Field(default_factory=Attributes.Metadata)
|
2022-12-11 21:09:27 +00:00
|
|
|
|
2023-01-04 09:17:06 +00:00
|
|
|
on: Attributes.On = Field(default_factory=Attributes.On)
|
|
|
|
dimming: Attributes.Dimming = Field(default_factory=Attributes.Dimming)
|
|
|
|
dimming_delta: Attributes.DimmingDelta = Field(
|
|
|
|
default_factory=Attributes.DimmingDelta
|
|
|
|
)
|
|
|
|
color_temperature: Attributes.ColorTemp = Field(
|
|
|
|
default_factory=Attributes.ColorTemp
|
|
|
|
)
|
2022-12-11 21:09:27 +00:00
|
|
|
color_temperature_delta: dict = Field(default_factory=dict)
|
2023-01-04 09:17:06 +00:00
|
|
|
color: Attributes.LightColor = Field(default_factory=Attributes.LightColor)
|
|
|
|
gradient: Attributes.Gradient = Field(default_factory=Attributes.Gradient)
|
|
|
|
dynamics: Attributes.Dynamics = Field(default_factory=Attributes.Dynamics)
|
|
|
|
alert: Attributes.Alert = Field(default_factory=Attributes.Alert)
|
2022-12-11 21:09:27 +00:00
|
|
|
signaling: dict = Field(default_factory=dict)
|
|
|
|
mode: Literal["normal", "streaming"] = "normal"
|
2023-01-04 09:17:06 +00:00
|
|
|
effects: Attributes.LightEffect = Field(
|
|
|
|
default_factory=lambda: Attributes.LightEffect(effect="fire")
|
|
|
|
)
|
|
|
|
timed_effects: Attributes.TimedEffects = Field(
|
|
|
|
default_factory=Attributes.TimedEffects
|
|
|
|
)
|
|
|
|
type: ClassVar[str] = "light"
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class LightLevel(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "light_level"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
owner: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
2022-12-11 21:09:27 +00:00
|
|
|
enabled: bool = True
|
2023-01-04 09:17:06 +00:00
|
|
|
light: Attributes.LightLevelValue = Field(
|
|
|
|
default_factory=Attributes.LightLevelValue
|
|
|
|
)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Motion(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "motion"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
owner: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
2022-12-11 21:09:27 +00:00
|
|
|
enabled: bool = True
|
2023-01-04 09:17:06 +00:00
|
|
|
motion: Attributes.Motion = Field(default_factory=Attributes.Motion)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class RelativeRotary(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
id: UUID
|
|
|
|
type: ClassVar[str] = "relative_rotary"
|
|
|
|
owner: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
relative_rotary: Attributes.RelativeRotary = Field(
|
|
|
|
default_factory=Attributes.RelativeRotary
|
|
|
|
)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Resource(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
id: UUID
|
|
|
|
type: ClassVar[str] = "device"
|
2022-12-10 18:47:34 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
|
|
|
|
|
|
|
class Room(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "room"
|
2023-01-10 07:56:31 +00:00
|
|
|
id: Optional[UUID]
|
|
|
|
id_v1: Optional[str] = Field(
|
|
|
|
"", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$"
|
|
|
|
)
|
|
|
|
services: Optional[list[Attributes.Identifier]] = Field(
|
2023-01-04 09:17:06 +00:00
|
|
|
default_factory=list, alias="service"
|
|
|
|
)
|
2023-01-10 07:56:31 +00:00
|
|
|
metadata: Optional[Attributes.Metadata] = Field(
|
|
|
|
default_factory=Attributes.Metadata
|
|
|
|
)
|
|
|
|
children: Optional[list[Attributes.Identifier]] = Field(default_factory=list)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Scene(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
metadata: Attributes.Metadata = Field(default_factory=Attributes.Metadata)
|
|
|
|
group: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
|
|
|
actions: list[Attributes.Actions] = Field(default_factory=list)
|
|
|
|
palette: Attributes.Palette = Field(default_factory=Attributes.Palette)
|
2022-12-11 21:09:27 +00:00
|
|
|
speed: float = 0.0
|
|
|
|
auto_dynamic: bool = False
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "scene"
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Temperature(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "temperature"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
owner: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
2022-12-11 21:09:27 +00:00
|
|
|
enabled: bool = True
|
2023-01-04 09:17:06 +00:00
|
|
|
temperature: Attributes.Temp = Field(default_factory=Attributes.Temp)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class ZGPConnectivity(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "zgp_connectivity"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
owner: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
2022-12-10 18:47:34 +00:00
|
|
|
status: Optional[
|
|
|
|
Literal[
|
|
|
|
"connected",
|
|
|
|
"disconnected",
|
|
|
|
"connectivity_issue",
|
|
|
|
"unidirectional_incoming",
|
|
|
|
]
|
2022-12-11 21:09:27 +00:00
|
|
|
] = "connected"
|
|
|
|
source_id: str = ""
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class ZigbeeConnectivity(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "zigbee_connectivity"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
owner: Attributes.Identifier = Field(default_factory=Attributes.Identifier)
|
2022-12-10 18:47:34 +00:00
|
|
|
status: Optional[
|
|
|
|
Literal[
|
|
|
|
"connected",
|
|
|
|
"disconnected",
|
|
|
|
"connectivity_issue",
|
|
|
|
"unidirectional_incoming",
|
|
|
|
]
|
2022-12-11 21:09:27 +00:00
|
|
|
] = "connected"
|
|
|
|
mac_address: str = Field("", regex=r"^(?:[0-9a-fA-F]{2}(?:-|:)?){6}$")
|
2022-12-10 18:47:34 +00:00
|
|
|
|
|
|
|
class Zone(Entity):
|
2023-01-04 09:17:06 +00:00
|
|
|
type: ClassVar[str] = "zone"
|
|
|
|
id: UUID
|
2022-12-11 21:09:27 +00:00
|
|
|
id_v1: str = Field("", regex=r"^(\/[a-z]{4,32}\/[0-9a-zA-Z-]{1,32})?$")
|
2023-01-04 09:17:06 +00:00
|
|
|
services: list[Attributes.Identifier] = Field(
|
|
|
|
default_factory=list, alias="service"
|
|
|
|
)
|
|
|
|
metadata: Attributes.Metadata = Field(default_factory=Attributes.Metadata)
|
|
|
|
children: list[Attributes.Identifier] = Field(default_factory=list)
|
2022-12-10 18:47:34 +00:00
|
|
|
|
2022-11-28 04:03:57 +00:00
|
|
|
|
2022-12-10 18:47:34 +00:00
|
|
|
for k, v in HueEntsV2.__dict__.items():
|
|
|
|
if k.startswith("__"):
|
|
|
|
continue
|
2022-12-11 21:09:27 +00:00
|
|
|
if isinstance(v, type) and issubclass(v, BaseModel):
|
|
|
|
v.update_forward_refs()
|