1 """Support for SimpliSafe alarm systems."""
3 from __future__
import annotations
5 from collections.abc
import Iterable
7 from simplipy.device
import Device, DeviceTypes
8 from simplipy.system.v3
import SystemV3
9 from simplipy.websocket
import (
10 EVENT_CONNECTION_LOST,
11 EVENT_CONNECTION_RESTORED,
24 DataUpdateCoordinator,
27 from .
import SimpliSafe
30 ATTR_LAST_EVENT_SENSOR_NAME,
31 ATTR_LAST_EVENT_SENSOR_TYPE,
32 ATTR_LAST_EVENT_TIMESTAMP,
34 DISPATCHER_TOPIC_WEBSOCKET_EVENT,
38 from .typing
import SystemType
40 DEFAULT_CONFIG_URL =
"https://webapp.simplisafe.com/new/#/dashboard"
41 DEFAULT_ENTITY_MODEL =
"Alarm control panel"
42 DEFAULT_ERROR_THRESHOLD = 2
44 WEBSOCKET_EVENTS_REQUIRING_SERIAL = [EVENT_LOCK_LOCKED, EVENT_LOCK_UNLOCKED]
48 """Define a base SimpliSafe entity."""
50 _attr_has_entity_name =
True
54 simplisafe: SimpliSafe,
57 device: Device |
None =
None,
58 additional_websocket_events: Iterable[str] |
None =
None,
61 assert simplisafe.coordinator
62 super().
__init__(simplisafe.coordinator)
71 model = device.type.name.capitalize().replace(
"_",
" ")
72 device_name = f
"{device.name.capitalize()} {model}"
73 serial = device.serial
75 model = device_name = DEFAULT_ENTITY_MODEL
76 serial = system.serial
78 event = simplisafe.initial_event_to_use[system.system_id]
80 if raw_type := event.get(
"sensorType"):
82 device_type = DeviceTypes(raw_type)
84 device_type = DeviceTypes.UNKNOWN
86 device_type = DeviceTypes.UNKNOWN
89 ATTR_LAST_EVENT_INFO: event.get(
"info"),
90 ATTR_LAST_EVENT_SENSOR_NAME: event.get(
"sensorName"),
91 ATTR_LAST_EVENT_SENSOR_TYPE: device_type.name.lower(),
92 ATTR_LAST_EVENT_TIMESTAMP: event.get(
"eventTimestamp"),
93 ATTR_SYSTEM_ID: system.system_id,
97 configuration_url=DEFAULT_CONFIG_URL,
98 identifiers={(DOMAIN, serial)},
99 manufacturer=
"SimpliSafe",
102 via_device=(DOMAIN,
str(system.system_id)),
111 EVENT_CONNECTION_LOST,
112 EVENT_CONNECTION_RESTORED,
114 EVENT_POWER_RESTORED,
116 if additional_websocket_events:
121 """Return whether the entity is available."""
127 if isinstance(self.
_system_system, SystemV3):
128 system_offline = self.
_system_system.offline
130 system_offline =
False
135 and not system_offline
140 """Update the entity with new REST API data."""
141 if self.coordinator.last_update_success:
147 self.async_write_ha_state()
151 """Update the entity with new websocket data."""
153 if event.system_id != self.
_system_system.system_id:
164 and event.event_type
in WEBSOCKET_EVENTS_REQUIRING_SERIAL
165 and event.sensor_serial != self.
_device_device.serial
169 sensor_type: str |
None
170 if event.sensor_type:
171 sensor_type = event.sensor_type.name
177 ATTR_LAST_EVENT_INFO: event.info,
178 ATTR_LAST_EVENT_SENSOR_NAME: event.sensor_name,
179 ATTR_LAST_EVENT_SENSOR_TYPE: sensor_type,
180 ATTR_LAST_EVENT_TIMESTAMP: event.timestamp,
186 if event.event_type
in (EVENT_CONNECTION_LOST, EVENT_POWER_OUTAGE):
193 if event.event_type
in (EVENT_CONNECTION_RESTORED, EVENT_POWER_RESTORED):
198 self.async_write_ha_state()
201 """Register callbacks."""
204 self.async_on_remove(
207 DISPATCHER_TOPIC_WEBSOCKET_EVENT.format(self.
_system_system.system_id),
216 """Increment this entity's error count."""
217 LOGGER.debug(
'Error for entity "%s" (total: %s)', self.
namename, self.
_error_count_error_count)
222 """Reset this entity's error count."""
226 LOGGER.debug(
'Resetting error count for "%s"', self.
namename)
231 """Update the entity when new data comes from the REST API."""
235 """Update the entity when new data comes from the websocket."""
None _handle_coordinator_update(self)
None async_added_to_hass(self)
_websocket_events_to_listen_for
None async_update_from_rest_api(self)
None _handle_websocket_update(self, WebsocketEvent event)
None async_reset_error_count(self)
_attr_extra_state_attributes
None async_increment_error_count(self)
None __init__(self, SimpliSafe simplisafe, SystemType system, *Device|None device=None, Iterable[str]|None additional_websocket_events=None)
None async_update_from_websocket_event(self, WebsocketEvent event)
Callable[[], None] async_dispatcher_connect(HomeAssistant hass, str signal, Callable[..., Any] target)