diff --git a/homeassistant/components/simplisafe/__init__.py b/homeassistant/components/simplisafe/__init__.py index 74c7c3fd079..d655e149469 100644 --- a/homeassistant/components/simplisafe/__init__.py +++ b/homeassistant/components/simplisafe/__init__.py @@ -1,6 +1,6 @@ """Support for SimpliSafe alarm systems.""" import asyncio -from dataclasses import dataclass, field +from dataclasses import InitVar, asdict, dataclass, field from datetime import datetime import logging from typing import Optional @@ -9,8 +9,12 @@ from simplipy import API from simplipy.entity import EntityTypes from simplipy.errors import InvalidCredentialsError, SimplipyError, WebsocketError from simplipy.websocket import ( + EVENT_CAMERA_MOTION_DETECTED, + EVENT_DOORBELL_DETECTED, + EVENT_ENTRY_DETECTED, EVENT_LOCK_LOCKED, EVENT_LOCK_UNLOCKED, + EVENT_MOTION_DETECTED, get_event_type_from_payload, ) import voluptuous as vol @@ -60,10 +64,18 @@ CONF_ACCOUNTS = "accounts" DATA_LISTENER = "listener" TOPIC_UPDATE = "simplisafe_update_data_{0}" +EVENT_SIMPLISAFE_EVENT = "SIMPLISAFE_EVENT" + DEFAULT_SOCKET_MIN_RETRY = 15 DEFAULT_WATCHDOG_SECONDS = 5 * 60 WEBSOCKET_EVENTS_REQUIRING_SERIAL = [EVENT_LOCK_LOCKED, EVENT_LOCK_UNLOCKED] +WEBSOCKET_EVENTS_TO_TRIGGER_HASS_EVENT = [ + EVENT_CAMERA_MOTION_DETECTED, + EVENT_DOORBELL_DETECTED, + EVENT_ENTRY_DETECTED, + EVENT_MOTION_DETECTED, +] ATTR_LAST_EVENT_INFO = "last_event_info" ATTR_LAST_EVENT_SENSOR_NAME = "last_event_sensor_name" @@ -309,7 +321,7 @@ async def async_unload_entry(hass, entry): class SimpliSafeWebsocketEvent: """Define a representation of a parsed websocket event.""" - event_data: dict + event_data: InitVar[dict] changed_by: Optional[str] = field(init=False) event_type: Optional[str] = field(init=False) @@ -320,30 +332,28 @@ class SimpliSafeWebsocketEvent: system_id: int = field(init=False) timestamp: datetime = field(init=False) - def __post_init__(self): + def __post_init__(self, event_data): """Initialize.""" - object.__setattr__(self, "changed_by", self.event_data["pinName"]) - object.__setattr__( - self, "event_type", get_event_type_from_payload(self.event_data) - ) - object.__setattr__(self, "info", self.event_data["info"]) - object.__setattr__(self, "sensor_name", self.event_data["sensorName"]) - object.__setattr__(self, "sensor_serial", self.event_data["sensorSerial"]) + object.__setattr__(self, "changed_by", event_data["pinName"]) + object.__setattr__(self, "event_type", get_event_type_from_payload(event_data)) + object.__setattr__(self, "info", event_data["info"]) + object.__setattr__(self, "sensor_name", event_data["sensorName"]) + object.__setattr__(self, "sensor_serial", event_data["sensorSerial"]) try: object.__setattr__( - self, "sensor_type", EntityTypes(self.event_data["sensorType"]).name + self, "sensor_type", EntityTypes(event_data["sensorType"]).name ) except ValueError: _LOGGER.warning( 'Encountered unknown entity type: %s ("%s"). Please report it at' "https://github.com/home-assistant/home-assistant/issues.", - self.event_data["sensorType"], - self.event_data["sensorName"], + event_data["sensorType"], + event_data["sensorName"], ) object.__setattr__(self, "sensor_type", None) - object.__setattr__(self, "system_id", self.event_data["sid"]) + object.__setattr__(self, "system_id", event_data["sid"]) object.__setattr__( - self, "timestamp", utc_from_timestamp(self.event_data["eventTimestamp"]) + self, "timestamp", utc_from_timestamp(event_data["eventTimestamp"]) ) @@ -407,6 +417,9 @@ class SimpliSafeWebsocket: self.last_events[data["sid"]] = event async_dispatcher_send(self._hass, TOPIC_UPDATE.format(data["sid"])) + if event.event_type in WEBSOCKET_EVENTS_TO_TRIGGER_HASS_EVENT: + self._hass.bus.async_fire(EVENT_SIMPLISAFE_EVENT, event_data=asdict(event)) + _LOGGER.debug("Resetting websocket watchdog") self._websocket_watchdog_listener() self._websocket_watchdog_listener = async_call_later( diff --git a/homeassistant/components/simplisafe/manifest.json b/homeassistant/components/simplisafe/manifest.json index 3b04d26732c..b150fd40392 100644 --- a/homeassistant/components/simplisafe/manifest.json +++ b/homeassistant/components/simplisafe/manifest.json @@ -3,7 +3,7 @@ "name": "SimpliSafe", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/simplisafe", - "requirements": ["simplisafe-python==7.1.0"], + "requirements": ["simplisafe-python==7.3.0"], "dependencies": [], "codeowners": ["@bachya"] } diff --git a/requirements_all.txt b/requirements_all.txt index 39b1194cce0..cb9d5f7f1a0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1829,7 +1829,7 @@ simplehound==0.3 simplepush==1.1.4 # homeassistant.components.simplisafe -simplisafe-python==7.1.0 +simplisafe-python==7.3.0 # homeassistant.components.sisyphus sisyphus-control==2.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 0056721f04e..3f2d4736d19 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -622,7 +622,7 @@ sentry-sdk==0.13.5 simplehound==0.3 # homeassistant.components.simplisafe -simplisafe-python==7.1.0 +simplisafe-python==7.3.0 # homeassistant.components.sleepiq sleepyq==0.7