@@ -15,20 +15,29 @@ class ArmingState(Enum):
1515 TRIGGERED = "TRIGGERED"
1616
1717
18+ class ArmingMode (Enum ):
19+ ARMED_AWAY = "ARMED_AWAY"
20+ ARMED_HOME = "ARMED_HOME"
21+ ARMED_DAY = "ARMED_DAY"
22+ ARMED_NIGHT = "ARMED_NIGHT"
23+ ARMED_VACATION = "ARMED_VACATION"
24+ ARMED_HIGHEST = "ARMED_HIGHEST"
25+
26+
1827class Alarm :
1928 """
2029 In-memory representation of the state of the alarm the client is connected
2130 to.
2231 """
2332
24- ARM_EVENTS = [
25- SystemStatusEvent .EventType .ARMED_AWAY ,
26- SystemStatusEvent .EventType .ARMED_HOME ,
27- SystemStatusEvent .EventType .ARMED_DAY ,
28- SystemStatusEvent .EventType .ARMED_NIGHT ,
29- SystemStatusEvent .EventType .ARMED_VACATION ,
30- SystemStatusEvent .EventType .ARMED_HIGHEST ,
31- ]
33+ ARM_EVENTS_MAP = {
34+ SystemStatusEvent .EventType .ARMED_AWAY : ArmingMode . ARMED_AWAY ,
35+ SystemStatusEvent .EventType .ARMED_HOME : ArmingMode . ARMED_HOME ,
36+ SystemStatusEvent .EventType .ARMED_DAY : ArmingMode . ARMED_DAY ,
37+ SystemStatusEvent .EventType .ARMED_NIGHT : ArmingMode . ARMED_NIGHT ,
38+ SystemStatusEvent .EventType .ARMED_VACATION : ArmingMode . ARMED_VACATION ,
39+ SystemStatusEvent .EventType .ARMED_HIGHEST : ArmingMode . ARMED_HIGHEST ,
40+ }
3241
3342 @dataclass
3443 class Zone :
@@ -39,7 +48,11 @@ def __init__(self, infer_arming_state: bool = False) -> None:
3948 self .arming_state : ArmingState = ArmingState .UNKNOWN
4049 self .zones : List [Alarm .Zone ] = [Alarm .Zone (triggered = None ) for _ in range (16 )]
4150
42- self ._on_state_change : Optional [Callable [["ArmingState" ], None ]] = None
51+ self ._arming_mode : ArmingMode | None = None
52+
53+ self ._on_state_change : Optional [
54+ Callable [[ArmingState , ArmingMode | None ], None ]
55+ ] = None
4356 self ._on_zone_change : Optional [Callable [[int , bool ], None ]] = None
4457
4558 def handle_event (self , event : BaseEvent ) -> None :
@@ -121,18 +134,20 @@ def _handle_system_status_event(self, event: SystemStatusEvent) -> None:
121134 # state to armed
122135 if self .arming_state == ArmingState .EXIT_DELAY :
123136 return self ._update_arming_state (ArmingState .ARMED )
124- elif event .type in Alarm .ARM_EVENTS :
137+ elif event .type in Alarm .ARM_EVENTS_MAP .keys ():
138+ self ._arming_mode = Alarm .ARM_EVENTS_MAP [event .type ]
125139 return self ._update_arming_state (ArmingState .ARMING )
126140 elif event .type == SystemStatusEvent .EventType .DISARMED :
141+ self ._arming_mode = None # Restore arming mode on disarmed.
127142 return self ._update_arming_state (ArmingState .DISARMED )
128143 elif event .type == SystemStatusEvent .EventType .ARMING_DELAYED :
129144 pass
130145
131- def _update_arming_state (self , state : " ArmingState" ) -> None :
146+ def _update_arming_state (self , state : ArmingState ) -> None :
132147 if self .arming_state != state :
133148 self .arming_state = state
134149 if self ._on_state_change is not None :
135- self ._on_state_change (state )
150+ self ._on_state_change (state , self . _arming_mode )
136151
137152 def _update_zone (self , zone_id : int , state : bool ) -> None :
138153 zone = self .zones [zone_id - 1 ]
@@ -141,7 +156,9 @@ def _update_zone(self, zone_id: int, state: bool) -> None:
141156 if self ._on_zone_change is not None :
142157 self ._on_zone_change (zone_id , state )
143158
144- def on_state_change (self , f : Callable [[ArmingState ], None ]) -> None :
159+ def on_state_change (
160+ self , f : Callable [[ArmingState , ArmingMode | None ], None ]
161+ ) -> None :
145162 self ._on_state_change = f
146163
147164 def on_zone_change (self , f : Callable [[int , bool ], None ]) -> None :
0 commit comments