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 5581889417.

* 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
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