1 """Elmax sensor platform."""
3 from __future__
import annotations
5 from elmax_api.exceptions
import ElmaxApiError
6 from elmax_api.model.alarm_status
import AlarmArmStatus, AlarmStatus
7 from elmax_api.model.command
import AreaCommand
8 from elmax_api.model.panel
import PanelStatus
11 AlarmControlPanelEntity,
12 AlarmControlPanelEntityFeature,
13 AlarmControlPanelState,
21 from .const
import DOMAIN
22 from .coordinator
import ElmaxCoordinator
23 from .entity
import ElmaxEntity
28 config_entry: ConfigEntry,
29 async_add_entities: AddEntitiesCallback,
31 """Set up the Elmax area platform."""
32 coordinator: ElmaxCoordinator = hass.data[DOMAIN][config_entry.entry_id]
35 def _discover_new_devices():
36 panel_status: PanelStatus = coordinator.data
38 if panel_status
is None:
45 panel_version=panel_status.release,
46 coordinator=coordinator,
48 for area
in panel_status.areas
49 if area.endpoint_id
not in known_devices
54 known_devices.update([e.unique_id
for e
in entities])
57 config_entry.async_on_unload(coordinator.async_add_listener(_discover_new_devices))
60 _discover_new_devices()
64 """Elmax Area entity implementation."""
66 _attr_code_format = CodeFormat.NUMBER
67 _attr_code_arm_required =
False
68 _attr_has_entity_name =
True
69 _attr_supported_features = AlarmControlPanelEntityFeature.ARM_AWAY
70 _pending_state: AlarmControlPanelState |
None =
None
73 """Send arm away command."""
76 f
"Cannot arm {self.name}: please check for open windows/doors first"
83 await self.coordinator.http_client.execute_command(
84 endpoint_id=self.
_device_device.endpoint_id,
85 command=AreaCommand.ARM_TOTALLY,
86 extra_payload={
"code": code},
88 except ElmaxApiError
as err:
90 translation_domain=DOMAIN,
91 translation_key=
"alarm_operation_failed_generic",
92 translation_placeholders={
"operation":
"arm"},
98 """Send disarm command."""
100 if code
is None or code ==
"":
101 raise ValueError(
"Please input the disarm code.")
103 self.
_pending_state_pending_state = AlarmControlPanelState.DISARMING
107 await self.coordinator.http_client.execute_command(
108 endpoint_id=self.
_device_device.endpoint_id,
109 command=AreaCommand.DISARM,
110 extra_payload={
"code": code},
112 except ElmaxApiError
as err:
113 if err.status_code == 403:
115 translation_domain=DOMAIN, translation_key=
"invalid_disarm_code"
118 translation_domain=DOMAIN,
119 translation_key=
"alarm_operation_failed_generic",
120 translation_placeholders={
"operation":
"disarm"},
126 def alarm_state(self) -> AlarmControlPanelState | None:
127 """Return the state of the entity."""
133 if state.status == AlarmStatus.TRIGGERED:
134 return ALARM_STATE_TO_HA.get(AlarmStatus.TRIGGERED)
135 return ALARM_STATE_TO_HA.get(state.armed_status)
140 """Handle updated data from the coordinator."""
146 ALARM_STATE_TO_HA = {
147 AlarmArmStatus.ARMED_TOTALLY: AlarmControlPanelState.ARMED_AWAY,
148 AlarmArmStatus.ARMED_P1_P2: AlarmControlPanelState.ARMED_AWAY,
149 AlarmArmStatus.ARMED_P2: AlarmControlPanelState.ARMED_AWAY,
150 AlarmArmStatus.ARMED_P1: AlarmControlPanelState.ARMED_AWAY,
151 AlarmArmStatus.NOT_ARMED: AlarmControlPanelState.DISARMED,
152 AlarmStatus.TRIGGERED: AlarmControlPanelState.TRIGGERED,
AlarmControlPanelState|None alarm_state(self)
None async_alarm_disarm(self, str|None code=None)
None async_alarm_arm_away(self, str|None code=None)
Area get_area_state(self, str area_id)
None async_write_ha_state(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
None _handle_coordinator_update(self)