Fire HASS events on SimpliSafe events (#31811)

* Fire HASS events on SimpliSafe events

* Bump simplisafe-ptyhon to 7.3.0

* Update reqirements

* Updates

* Revert "Updates"

This reverts commit 55818894176fe27938c79685ab87100d1bc120ff.

* Restrict which events get fired

* Code review comments
This commit is contained in:
Aaron Bach 2020-02-14 11:24:35 -07:00 committed by GitHub
parent e019280d94
commit d6f0c26e7f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 18 deletions

View File

@ -1,6 +1,6 @@
"""Support for SimpliSafe alarm systems.""" """Support for SimpliSafe alarm systems."""
import asyncio import asyncio
from dataclasses import dataclass, field from dataclasses import InitVar, asdict, dataclass, field
from datetime import datetime from datetime import datetime
import logging import logging
from typing import Optional from typing import Optional
@ -9,8 +9,12 @@ from simplipy import API
from simplipy.entity import EntityTypes from simplipy.entity import EntityTypes
from simplipy.errors import InvalidCredentialsError, SimplipyError, WebsocketError from simplipy.errors import InvalidCredentialsError, SimplipyError, WebsocketError
from simplipy.websocket import ( from simplipy.websocket import (
EVENT_CAMERA_MOTION_DETECTED,
EVENT_DOORBELL_DETECTED,
EVENT_ENTRY_DETECTED,
EVENT_LOCK_LOCKED, EVENT_LOCK_LOCKED,
EVENT_LOCK_UNLOCKED, EVENT_LOCK_UNLOCKED,
EVENT_MOTION_DETECTED,
get_event_type_from_payload, get_event_type_from_payload,
) )
import voluptuous as vol import voluptuous as vol
@ -60,10 +64,18 @@ CONF_ACCOUNTS = "accounts"
DATA_LISTENER = "listener" DATA_LISTENER = "listener"
TOPIC_UPDATE = "simplisafe_update_data_{0}" TOPIC_UPDATE = "simplisafe_update_data_{0}"
EVENT_SIMPLISAFE_EVENT = "SIMPLISAFE_EVENT"
DEFAULT_SOCKET_MIN_RETRY = 15 DEFAULT_SOCKET_MIN_RETRY = 15
DEFAULT_WATCHDOG_SECONDS = 5 * 60 DEFAULT_WATCHDOG_SECONDS = 5 * 60
WEBSOCKET_EVENTS_REQUIRING_SERIAL = [EVENT_LOCK_LOCKED, EVENT_LOCK_UNLOCKED] 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_INFO = "last_event_info"
ATTR_LAST_EVENT_SENSOR_NAME = "last_event_sensor_name" ATTR_LAST_EVENT_SENSOR_NAME = "last_event_sensor_name"
@ -309,7 +321,7 @@ async def async_unload_entry(hass, entry):
class SimpliSafeWebsocketEvent: class SimpliSafeWebsocketEvent:
"""Define a representation of a parsed websocket event.""" """Define a representation of a parsed websocket event."""
event_data: dict event_data: InitVar[dict]
changed_by: Optional[str] = field(init=False) changed_by: Optional[str] = field(init=False)
event_type: Optional[str] = field(init=False) event_type: Optional[str] = field(init=False)
@ -320,30 +332,28 @@ class SimpliSafeWebsocketEvent:
system_id: int = field(init=False) system_id: int = field(init=False)
timestamp: datetime = field(init=False) timestamp: datetime = field(init=False)
def __post_init__(self): def __post_init__(self, event_data):
"""Initialize.""" """Initialize."""
object.__setattr__(self, "changed_by", self.event_data["pinName"]) object.__setattr__(self, "changed_by", event_data["pinName"])
object.__setattr__( object.__setattr__(self, "event_type", get_event_type_from_payload(event_data))
self, "event_type", get_event_type_from_payload(self.event_data) object.__setattr__(self, "info", event_data["info"])
) object.__setattr__(self, "sensor_name", event_data["sensorName"])
object.__setattr__(self, "info", self.event_data["info"]) object.__setattr__(self, "sensor_serial", event_data["sensorSerial"])
object.__setattr__(self, "sensor_name", self.event_data["sensorName"])
object.__setattr__(self, "sensor_serial", self.event_data["sensorSerial"])
try: try:
object.__setattr__( object.__setattr__(
self, "sensor_type", EntityTypes(self.event_data["sensorType"]).name self, "sensor_type", EntityTypes(event_data["sensorType"]).name
) )
except ValueError: except ValueError:
_LOGGER.warning( _LOGGER.warning(
'Encountered unknown entity type: %s ("%s"). Please report it at' 'Encountered unknown entity type: %s ("%s"). Please report it at'
"https://github.com/home-assistant/home-assistant/issues.", "https://github.com/home-assistant/home-assistant/issues.",
self.event_data["sensorType"], event_data["sensorType"],
self.event_data["sensorName"], event_data["sensorName"],
) )
object.__setattr__(self, "sensor_type", None) 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__( 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 self.last_events[data["sid"]] = event
async_dispatcher_send(self._hass, TOPIC_UPDATE.format(data["sid"])) 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") _LOGGER.debug("Resetting websocket watchdog")
self._websocket_watchdog_listener() self._websocket_watchdog_listener()
self._websocket_watchdog_listener = async_call_later( self._websocket_watchdog_listener = async_call_later(

View File

@ -3,7 +3,7 @@
"name": "SimpliSafe", "name": "SimpliSafe",
"config_flow": true, "config_flow": true,
"documentation": "https://www.home-assistant.io/integrations/simplisafe", "documentation": "https://www.home-assistant.io/integrations/simplisafe",
"requirements": ["simplisafe-python==7.1.0"], "requirements": ["simplisafe-python==7.3.0"],
"dependencies": [], "dependencies": [],
"codeowners": ["@bachya"] "codeowners": ["@bachya"]
} }

View File

@ -1829,7 +1829,7 @@ simplehound==0.3
simplepush==1.1.4 simplepush==1.1.4
# homeassistant.components.simplisafe # homeassistant.components.simplisafe
simplisafe-python==7.1.0 simplisafe-python==7.3.0
# homeassistant.components.sisyphus # homeassistant.components.sisyphus
sisyphus-control==2.2.1 sisyphus-control==2.2.1

View File

@ -622,7 +622,7 @@ sentry-sdk==0.13.5
simplehound==0.3 simplehound==0.3
# homeassistant.components.simplisafe # homeassistant.components.simplisafe
simplisafe-python==7.1.0 simplisafe-python==7.3.0
# homeassistant.components.sleepiq # homeassistant.components.sleepiq
sleepyq==0.7 sleepyq==0.7