diff --git a/homeassistant/components/simplisafe/__init__.py b/homeassistant/components/simplisafe/__init__.py index d655e149469..8ae0b99f447 100644 --- a/homeassistant/components/simplisafe/__init__.py +++ b/homeassistant/components/simplisafe/__init__.py @@ -1,12 +1,8 @@ """Support for SimpliSafe alarm systems.""" import asyncio -from dataclasses import InitVar, asdict, dataclass, field -from datetime import datetime import logging -from typing import Optional from simplipy import API -from simplipy.entity import EntityTypes from simplipy.errors import InvalidCredentialsError, SimplipyError, WebsocketError from simplipy.websocket import ( EVENT_CAMERA_MOTION_DETECTED, @@ -15,7 +11,6 @@ from simplipy.websocket import ( EVENT_LOCK_LOCKED, EVENT_LOCK_UNLOCKED, EVENT_MOTION_DETECTED, - get_event_type_from_payload, ) import voluptuous as vol @@ -38,7 +33,6 @@ from homeassistant.helpers.service import ( async_register_admin_service, verify_domain_control, ) -from homeassistant.util.dt import utc_from_timestamp from .config_flow import configured_instances from .const import ( @@ -77,10 +71,14 @@ WEBSOCKET_EVENTS_TO_TRIGGER_HASS_EVENT = [ EVENT_MOTION_DETECTED, ] +ATTR_LAST_EVENT_CHANGED_BY = "last_event_changed_by" ATTR_LAST_EVENT_INFO = "last_event_info" ATTR_LAST_EVENT_SENSOR_NAME = "last_event_sensor_name" +ATTR_LAST_EVENT_SENSOR_SERIAL = "last_event_sensor_serial" ATTR_LAST_EVENT_SENSOR_TYPE = "last_event_sensor_type" ATTR_LAST_EVENT_TIMESTAMP = "last_event_timestamp" +ATTR_LAST_EVENT_TYPE = "last_event_type" +ATTR_LAST_EVENT_TYPE = "last_event_type" ATTR_PIN_LABEL = "label" ATTR_PIN_LABEL_OR_VALUE = "label_or_pin" ATTR_PIN_VALUE = "pin" @@ -317,46 +315,6 @@ async def async_unload_entry(hass, entry): return True -@dataclass(frozen=True) -class SimpliSafeWebsocketEvent: - """Define a representation of a parsed websocket event.""" - - event_data: InitVar[dict] - - changed_by: Optional[str] = field(init=False) - event_type: Optional[str] = field(init=False) - info: str = field(init=False) - sensor_name: str = field(init=False) - sensor_serial: str = field(init=False) - sensor_type: EntityTypes = field(init=False) - system_id: int = field(init=False) - timestamp: datetime = field(init=False) - - def __post_init__(self, event_data): - """Initialize.""" - 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(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.", - event_data["sensorType"], - event_data["sensorName"], - ) - object.__setattr__(self, "sensor_type", None) - object.__setattr__(self, "system_id", event_data["sid"]) - object.__setattr__( - self, "timestamp", utc_from_timestamp(event_data["eventTimestamp"]) - ) - - class SimpliSafeWebsocket: """Define a SimpliSafe websocket "manager" object.""" @@ -410,15 +368,11 @@ class SimpliSafeWebsocket: """Define a handler to fire when the websocket is disconnected.""" _LOGGER.info("Disconnected from websocket") - def _on_event(self, data): + def _on_event(self, event): """Define a handler to fire when a new SimpliSafe event arrives.""" - event = SimpliSafeWebsocketEvent(data) _LOGGER.debug("New websocket event: %s", event) - 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)) + self.last_events[event.system_id] = event + async_dispatcher_send(self._hass, TOPIC_UPDATE.format(event.system_id)) _LOGGER.debug("Resetting websocket watchdog") self._websocket_watchdog_listener() @@ -427,6 +381,28 @@ class SimpliSafeWebsocket: ) self._websocket_reconnect_delay = DEFAULT_SOCKET_MIN_RETRY + if event.event_type not in WEBSOCKET_EVENTS_TO_TRIGGER_HASS_EVENT: + return + + if event.sensor_type: + sensor_type = event.sensor_type.name + else: + sensor_type = None + + self._hass.bus.async_fire( + EVENT_SIMPLISAFE_EVENT, + event_data={ + ATTR_LAST_EVENT_CHANGED_BY: event.changed_by, + ATTR_LAST_EVENT_TYPE: event.event_type, + ATTR_LAST_EVENT_INFO: event.info, + ATTR_LAST_EVENT_SENSOR_NAME: event.sensor_name, + ATTR_LAST_EVENT_SENSOR_SERIAL: event.sensor_serial, + ATTR_LAST_EVENT_SENSOR_TYPE: sensor_type, + ATTR_SYSTEM_ID: event.system_id, + ATTR_LAST_EVENT_TIMESTAMP: event.timestamp, + }, + ) + async def async_websocket_connect(self): """Register handlers and connect to the websocket.""" if self._websocket_reconnect_underway: @@ -669,11 +645,17 @@ class SimpliSafeEntity(Entity): return self._last_processed_websocket_event = last_websocket_event + + if last_websocket_event.sensor_type: + sensor_type = last_websocket_event.sensor_type.name + else: + sensor_type = None + self._attrs.update( { ATTR_LAST_EVENT_INFO: last_websocket_event.info, ATTR_LAST_EVENT_SENSOR_NAME: last_websocket_event.sensor_name, - ATTR_LAST_EVENT_SENSOR_TYPE: last_websocket_event.sensor_type, + ATTR_LAST_EVENT_SENSOR_TYPE: sensor_type, ATTR_LAST_EVENT_TIMESTAMP: last_websocket_event.timestamp, } ) diff --git a/homeassistant/components/simplisafe/manifest.json b/homeassistant/components/simplisafe/manifest.json index b150fd40392..e44f39265cb 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.3.0"], + "requirements": ["simplisafe-python==8.1.1"], "dependencies": [], "codeowners": ["@bachya"] } diff --git a/requirements_all.txt b/requirements_all.txt index abb413a874b..5b3ba017896 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1830,7 +1830,7 @@ simplehound==0.3 simplepush==1.1.4 # homeassistant.components.simplisafe -simplisafe-python==7.3.0 +simplisafe-python==8.1.1 # homeassistant.components.sisyphus sisyphus-control==2.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 04e603409f0..6cb1753e8cc 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -623,7 +623,7 @@ sentry-sdk==0.13.5 simplehound==0.3 # homeassistant.components.simplisafe -simplisafe-python==7.3.0 +simplisafe-python==8.1.1 # homeassistant.components.sleepiq sleepyq==0.7