1 """Support for Risco alarms."""
3 from __future__
import annotations
5 from collections.abc
import Callable
9 from pyrisco.common
import Partition
10 from pyrisco.local.partition
import Partition
as LocalPartition
13 AlarmControlPanelEntity,
14 AlarmControlPanelEntityFeature,
15 AlarmControlPanelState,
24 from .
import LocalData, is_local
26 CONF_CODE_ARM_REQUIRED,
27 CONF_CODE_DISARM_REQUIRED,
28 CONF_HA_STATES_TO_RISCO,
29 CONF_RISCO_STATES_TO_HA,
37 from .coordinator
import RiscoDataUpdateCoordinator
38 from .entity
import RiscoCloudEntity
40 _LOGGER = logging.getLogger(__name__)
42 STATES_TO_SUPPORTED_FEATURES = {
43 AlarmControlPanelState.ARMED_AWAY: AlarmControlPanelEntityFeature.ARM_AWAY,
44 AlarmControlPanelState.ARMED_CUSTOM_BYPASS: AlarmControlPanelEntityFeature.ARM_CUSTOM_BYPASS,
45 AlarmControlPanelState.ARMED_HOME: AlarmControlPanelEntityFeature.ARM_HOME,
46 AlarmControlPanelState.ARMED_NIGHT: AlarmControlPanelEntityFeature.ARM_NIGHT,
52 config_entry: ConfigEntry,
53 async_add_entities: AddEntitiesCallback,
55 """Set up the Risco alarm control panel."""
56 options = {**DEFAULT_OPTIONS, **config_entry.options}
58 local_data: LocalData = hass.data[DOMAIN][config_entry.entry_id]
64 local_data.partition_updates,
65 config_entry.data[CONF_PIN],
68 for partition_id, partition
in local_data.system.partitions.items()
71 coordinator: RiscoDataUpdateCoordinator = hass.data[DOMAIN][
76 coordinator, partition_id, config_entry.data[CONF_PIN], options
78 for partition_id
in coordinator.data.partitions
83 """Representation of a Risco cloud partition."""
85 _attr_code_format = CodeFormat.NUMBER
86 _attr_has_entity_name =
True
95 options: dict[str, Any],
98 """Init the partition."""
108 self._attr_supported_features |= STATES_TO_SUPPORTED_FEATURES[state]
112 """Return the state of the device."""
114 return AlarmControlPanelState.TRIGGERED
116 return AlarmControlPanelState.ARMING
118 return AlarmControlPanelState.DISARMED
122 for group, armed
in self.
_partition_partition.groups.items():
131 """Validate given code."""
132 return code == self.
_code_code
135 """Send disarm command."""
137 _LOGGER.warning(
"Wrong code entered for disarming")
142 """Send arm home command."""
143 await self.
_arm_arm(AlarmControlPanelState.ARMED_HOME, code)
146 """Send arm away command."""
147 await self.
_arm_arm(AlarmControlPanelState.ARMED_AWAY, code)
150 """Send arm night command."""
151 await self.
_arm_arm(AlarmControlPanelState.ARMED_NIGHT, code)
154 """Send arm custom bypass command."""
155 await self.
_arm_arm(AlarmControlPanelState.ARMED_CUSTOM_BYPASS, code)
157 async
def _arm(self, mode: AlarmControlPanelState, code: str |
None) ->
None:
159 _LOGGER.warning(
"Wrong code entered for %s", mode)
162 if not (risco_state := self.
_ha_to_risco_ha_to_risco[mode]):
163 _LOGGER.warning(
"No mapping for mode %s", mode)
166 if risco_state
in RISCO_GROUPS:
172 raise NotImplementedError
176 """Representation of a Risco partition."""
180 coordinator: RiscoDataUpdateCoordinator,
183 options: dict[str, Any],
185 """Init the partition."""
187 partition_id=partition_id,
188 partition=coordinator.data.partitions[partition_id],
189 coordinator=coordinator,
196 name=f
"Risco {self._risco.site_name} Partition {partition_id}",
197 manufacturer=
"Risco",
210 """Representation of a Risco local, partition."""
212 _attr_should_poll =
False
218 partition: LocalPartition,
219 partition_updates: dict[int, Callable[[], Any]],
221 options: dict[str, Any],
223 """Init the partition."""
225 partition_id=partition_id, partition=partition, code=code, options=options
233 manufacturer=
"Risco",
237 """Subscribe to updates."""
241 await getattr(self.
_partition_partition, method)(*args)
bool code_arm_required(self)
None _arm(self, AlarmControlPanelState mode, str|None code)
None async_alarm_disarm(self, str|None code=None)
None async_alarm_arm_night(self, str|None code=None)
None async_alarm_arm_custom_bypass(self, str|None code=None)
AlarmControlPanelState|None alarm_state(self)
None __init__(self, *int partition_id, Partition partition, str code, dict[str, Any] options, **Any kwargs)
None async_alarm_arm_home(self, str|None code=None)
bool _validate_code(self, str|None code)
None async_alarm_arm_away(self, str|None code=None)
None _call_alarm_method(self, str method, *Any args)
None _get_data_from_coordinator(self)
None _call_alarm_method(self, str method, *Any args)
None __init__(self, RiscoDataUpdateCoordinator coordinator, int partition_id, str code, dict[str, Any] options)
None async_added_to_hass(self)
None _call_alarm_method(self, str method, *Any args)
None __init__(self, str system_id, int partition_id, LocalPartition partition, dict[int, Callable[[], Any]] partition_updates, str code, dict[str, Any] options)
None async_write_ha_state(self)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
bool is_local(ConfigEntry entry)