forked from Leggin/dirigera
-
Notifications
You must be signed in to change notification settings - Fork 0
/
scene.py
112 lines (91 loc) · 3.29 KB
/
scene.py
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
from __future__ import annotations
import datetime
from enum import Enum
from typing import Dict, Any, List, Optional
from .base_ikea_model import BaseIkeaModel
from .device import Attributes
from ..hub.abstract_smart_home_hub import AbstractSmartHomeHub
class SceneAttributes(Attributes):
scene_id: str
name: str
icon: str
last_completed: Optional[str] = None
last_triggered: Optional[str] = None
last_undo: Optional[str] = None
class Icon(Enum):
SCENES_ARRIVE_HOME = "scenes_arrive_home"
SCENES_BOOK = "scenes_book"
SCENES_BRIEFCASE = "scenes_briefcase"
SCENES_BRIGHTNESS_UP = "scenes_brightness_up"
SCENES_BROOM = "scenes_broom"
SCENES_CAKE = "scenes_cake"
SCENES_CLAPPER = "scenes_clapper"
SCENES_CLEAN_SPARKLES = "scenes_clean_sparkles"
SCENES_CUTLERY = "scenes_cutlery"
SCENES_DISCO_BALL = "scenes_disco_ball"
SCENES_GAME_PAD = "scenes_game_pad"
SCENES_GIFT_BAG = "scenes_gift_bag"
SCENES_GIFT_BOX = "scenes_gift_box"
SCENES_HEADPHONES = "scenes_headphones"
SCENES_HEART = "scenes_heart"
SCENES_HOME_FILLED = "scenes_home_filled"
SCENES_HOT_DRINK = "scenes_hot_drink"
SCENES_LADLE = "scenes_ladle"
SCENES_LEAF = "scenes_leaf"
SCENES_LEAVE_HOME = "scenes_leave_home"
SCENES_MOON = "scenes_moon"
SCENES_MUSIC_NOTE = "scenes_music_note"
SCENES_PAINTING = "scenes_painting"
SCENES_POPCORN = "scenes_popcorn"
SCENES_POT_WITH_LID = "scenes_pot_with_lid"
SCENES_SPEAKER_GENERIC = "scenes_speaker_generic"
SCENES_SPRAY_BOTTLE = "scenes_spray_bottle"
SCENES_SUITCASE = "scenes_suitcase"
SCENES_SUITCASE_2 = "scenes_suitcase_2"
SCENES_SUN_HORIZON = "scenes_sun_horizon"
SCENES_TREE = "scenes_tree"
SCENES_TROPHY = "scenes_trophy"
SCENES_WAKE_UP = "scenes_wake_up"
SCENES_WEIGHTS = "scenes_weights"
SCENES_YOGA = "scenes_yoga"
class Info(BaseIkeaModel):
name: str
icon: Icon
class Trigger(BaseIkeaModel):
id: str
type: str
triggered_at: Optional[datetime.datetime] = None
disabled: bool
class ActionAttributes(BaseIkeaModel, extra="allow"):
is_on: Optional[bool] = None
class Action(BaseIkeaModel):
id: str
type: str
enabled: Optional[bool] = None
attributes: Optional[ActionAttributes] = None
class SceneType(Enum):
USER_SCENE = "userScene"
CUSTOM_SCENE = "customScene"
PLAYLIST_SCENE = "playlistScene"
class Scene(BaseIkeaModel):
dirigera_client: AbstractSmartHomeHub
id: str
type: SceneType
info: Info
triggers: List[Trigger]
actions: List[Action]
created_at: datetime.datetime
last_completed: Optional[datetime.datetime] = None
last_triggered: Optional[datetime.datetime] = None
last_undo: Optional[datetime.datetime] = None
commands: List[str]
undo_allowed_duration: int
def reload(self) -> Scene:
data = self.dirigera_client.get(route=f"/scenes/{self.id}")
return Scene(dirigeraClient=self.dirigera_client, **data)
def trigger(self) -> None:
self.dirigera_client.post(route=f"/scenes/{self.id}/trigger")
def undo(self) -> None:
self.dirigera_client.post(route=f"/scenes/{self.id}/undo")
def dict_to_scene(data: Dict[str, Any], dirigera_client: AbstractSmartHomeHub) -> Scene:
return Scene(dirigeraClient=dirigera_client, **data)