File: groups.py

package info (click to toggle)
python-aiohue 4.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 612 kB
  • sloc: python: 4,444; sh: 30; makefile: 5
file content (141 lines) | stat: -rw-r--r-- 3,589 bytes parent folder | download | duplicates (2)
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
"""Controller/model for Hue resource of type Group."""

from __future__ import annotations

from collections.abc import Coroutine
from logging import Logger
from typing import Any, TypedDict

from .api import APIItems


class Groups(APIItems):
    """
    Represents Hue Groups (zone/room).

    https://developers.meethue.com/documentation/groups-api
    """

    def __init__(self, logger: Logger, raw: dict[str, Any], request: Coroutine) -> None:
        """Initialize instance."""
        super().__init__(logger, raw, request, "groups", Group)

    async def get_all_lights_group(self) -> Group:
        """Return special all lights group."""
        return Group("0", await self._request("get", "groups/0"), self._request)


class GroupState(TypedDict):
    """Represents state dict for a group."""

    all_on: bool
    any_on: bool


class GroupAction(TypedDict, total=False):
    """Represents action dict for a group."""

    on: bool
    bri: int  # optional
    hue: int  # optional
    sat: int  # optional
    effect: str  # optional
    xy: list[float]  # optional
    ct: int  # optional
    alert: str
    colormode: str  # optional


class Group:
    """Represents a Hue Group."""

    ITEM_TYPE = "groups"

    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 type(self) -> str:
        """Return type of the group (Zone or Room)."""
        return self.raw["type"]

    @property
    def name(self) -> str:
        """Return name."""
        return self.raw["name"]

    @property
    def uniqueid(self) -> str:
        """
        Return Unique ID for the group.

        Requires API version 1.9+ and only for groups that are the type
        Luminaire or Lightsource.
        """
        return self.raw.get("uniqueid")

    @property
    def action(self) -> GroupAction:
        """Return current group action."""
        return GroupAction(self.raw["action"])

    @property
    def state(self) -> GroupState:
        """Return current group state."""
        return GroupState(self.raw["state"])

    @property
    def lights(self) -> list[str]:
        """Return id's of lights that are members of this group."""
        return self.raw["lights"]

    @property
    def sensors(self) -> list[str]:
        """Return id's of sensors that are members of this group."""
        return self.raw["sensors"]

    async def set_action(
        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,
        scene=None,
    ) -> None:
        """Change action of a group."""
        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,
                "scene": scene,
            }.items()
            if value is not None
        }

        await self._request("put", f"groups/{self.id}/action", json=data)