From f9aff4fc415a936f4ea3485a61ae642925a9e4a7 Mon Sep 17 00:00:00 2001 From: gjbadros Date: Thu, 28 May 2020 16:26:03 -0700 Subject: [PATCH] Use new elkm1-lib module's LD log data support to correctly identify user_ids (#36211) * Requires 0.7.18 of elkm1 library to decode LD messages, and uses those messages to reliably set the arming/disarming user when there are more than one area. See https://github.com/home-assistant/core/issues/35310. * Fixed typo * Fixed off by one error -- LD command reports 1-based user-numbers which is the changed_by_id we want, but we need 0-based indices as argument to username. * Bump required version of elkm1, remove logging message I was using for testing; prepping for PR. * Black formatted * Fixed bug whereby I needed to ref elements when running against released build of elkm1-lib --- .../components/elkm1/alarm_control_panel.py | 21 +++++++++++++++++-- homeassistant/components/elkm1/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/elkm1/alarm_control_panel.py b/homeassistant/components/elkm1/alarm_control_panel.py index 3e9ab114837..1c299e68803 100644 --- a/homeassistant/components/elkm1/alarm_control_panel.py +++ b/homeassistant/components/elkm1/alarm_control_panel.py @@ -125,8 +125,10 @@ class ElkArea(ElkAttachedEntity, AlarmControlPanelEntity, RestoreEntity): async def async_added_to_hass(self): """Register callback for ElkM1 changes.""" await super().async_added_to_hass() - for keypad in self._elk.keypads: - keypad.add_callback(self._watch_keypad) + if len(self._elk.areas.elements) == 1: + for keypad in self._elk.keypads: + keypad.add_callback(self._watch_keypad) + self._element.add_callback(self._watch_area) # We do not get changed_by back from resync. last_state = await self.async_get_last_state() @@ -152,6 +154,21 @@ class ElkArea(ElkAttachedEntity, AlarmControlPanelEntity, RestoreEntity): self._changed_by = username(self._elk, keypad.last_user) self.async_write_ha_state() + def _watch_area(self, area, changeset): + if not changeset.get("log_event"): + return + self._changed_by_keypad = None + self._changed_by_id = area.log_number + self._changed_by = username(self._elk, area.log_number - 1) + self._changed_by_time = "%04d-%02d-%02dT%02d:%02d" % ( + area.log_year, + area.log_month, + area.log_day, + area.log_hour, + area.log_minute, + ) + self.async_write_ha_state() + @property def code_format(self): """Return the alarm code format.""" diff --git a/homeassistant/components/elkm1/manifest.json b/homeassistant/components/elkm1/manifest.json index 5a88792208a..20b8195d5b8 100644 --- a/homeassistant/components/elkm1/manifest.json +++ b/homeassistant/components/elkm1/manifest.json @@ -2,7 +2,7 @@ "domain": "elkm1", "name": "Elk-M1 Control", "documentation": "https://www.home-assistant.io/integrations/elkm1", - "requirements": ["elkm1-lib==0.7.17"], + "requirements": ["elkm1-lib==0.7.18"], "codeowners": ["@bdraco"], "config_flow": true } diff --git a/requirements_all.txt b/requirements_all.txt index a60ad79707f..11f5d9a79e1 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -526,7 +526,7 @@ elgato==0.2.0 eliqonline==1.2.2 # homeassistant.components.elkm1 -elkm1-lib==0.7.17 +elkm1-lib==0.7.18 # homeassistant.components.emulated_roku emulated_roku==0.2.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index bc1ca515e55..4c62ea89b63 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -233,7 +233,7 @@ eebrightbox==0.0.4 elgato==0.2.0 # homeassistant.components.elkm1 -elkm1-lib==0.7.17 +elkm1-lib==0.7.18 # homeassistant.components.emulated_roku emulated_roku==0.2.1