from datetime import datetime from typing import Any from pydantic import BaseModel from pydantic import PrivateAttr from pydantic import field_serializer class EntityState(BaseModel, extra='allow'): state: bool = True color_temp_kelvin: int | None = None rgb_color: list[int] | None = None brightness: int | None = None @field_serializer('state') def convert_state(self, val: Any): if val: return 'on' else: return 'off' class Stage(BaseModel): # start: Annotated[time, BeforeValidator(lambda v: parser(v).time())] start: str _start: datetime = PrivateAttr() scene: dict[str, EntityState] def assign_start(self, dt: datetime): self._start = dt def formatted_start(self, fmt: str) -> str: return self._start.strftime(fmt) def scene_json(self): return self.model_dump(mode='json')['scene']