From 0dc12c70e38a2262f7c263eacdc56a91304c9bdb Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 18 May 2022 01:47:02 -0500 Subject: [PATCH] Add logbook descriptions for elkm1 keypad press events (#72017) * Add logbook descriptions for elkm1 keypad press events * drop extra block --- homeassistant/components/elkm1/__init__.py | 8 +-- homeassistant/components/elkm1/const.py | 1 + homeassistant/components/elkm1/logbook.py | 39 ++++++++++++++ tests/components/elkm1/test_logbook.py | 63 ++++++++++++++++++++++ 4 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 homeassistant/components/elkm1/logbook.py create mode 100644 tests/components/elkm1/test_logbook.py diff --git a/homeassistant/components/elkm1/__init__.py b/homeassistant/components/elkm1/__init__.py index 22dd50499d6..9a7c7dbc43a 100644 --- a/homeassistant/components/elkm1/__init__.py +++ b/homeassistant/components/elkm1/__init__.py @@ -42,6 +42,7 @@ from .const import ( ATTR_KEY, ATTR_KEY_NAME, ATTR_KEYPAD_ID, + ATTR_KEYPAD_NAME, CONF_AREA, CONF_AUTO_CONFIGURE, CONF_COUNTER, @@ -266,21 +267,22 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: ) elk.connect() - def _element_changed(element: Element, changeset: dict[str, Any]) -> None: + def _keypad_changed(keypad: Element, changeset: dict[str, Any]) -> None: if (keypress := changeset.get("last_keypress")) is None: return hass.bus.async_fire( EVENT_ELKM1_KEYPAD_KEY_PRESSED, { - ATTR_KEYPAD_ID: element.index + 1, + ATTR_KEYPAD_NAME: keypad.name, + ATTR_KEYPAD_ID: keypad.index + 1, ATTR_KEY_NAME: keypress[0], ATTR_KEY: keypress[1], }, ) for keypad in elk.keypads: - keypad.add_callback(_element_changed) + keypad.add_callback(_keypad_changed) try: if not await async_wait_for_elk_to_sync(elk, LOGIN_TIMEOUT, SYNC_TIMEOUT): diff --git a/homeassistant/components/elkm1/const.py b/homeassistant/components/elkm1/const.py index fd4856bd5d5..a2bb5744c11 100644 --- a/homeassistant/components/elkm1/const.py +++ b/homeassistant/components/elkm1/const.py @@ -43,6 +43,7 @@ EVENT_ELKM1_KEYPAD_KEY_PRESSED = "elkm1.keypad_key_pressed" ATTR_KEYPAD_ID = "keypad_id" ATTR_KEY = "key" ATTR_KEY_NAME = "key_name" +ATTR_KEYPAD_NAME = "keypad_name" ATTR_CHANGED_BY_KEYPAD = "changed_by_keypad" ATTR_CHANGED_BY_ID = "changed_by_id" ATTR_CHANGED_BY_TIME = "changed_by_time" diff --git a/homeassistant/components/elkm1/logbook.py b/homeassistant/components/elkm1/logbook.py new file mode 100644 index 00000000000..01019ce77e0 --- /dev/null +++ b/homeassistant/components/elkm1/logbook.py @@ -0,0 +1,39 @@ +"""Describe elkm1 logbook events.""" +from __future__ import annotations + +from collections.abc import Callable + +from homeassistant.core import Event, HomeAssistant, callback + +from .const import ( + ATTR_KEY, + ATTR_KEY_NAME, + ATTR_KEYPAD_ID, + ATTR_KEYPAD_NAME, + DOMAIN, + EVENT_ELKM1_KEYPAD_KEY_PRESSED, +) + + +@callback +def async_describe_events( + hass: HomeAssistant, + async_describe_event: Callable[[str, str, Callable[[Event], dict[str, str]]], None], +) -> None: + """Describe logbook events.""" + + @callback + def async_describe_button_event(event: Event) -> dict[str, str]: + """Describe elkm1 logbook event.""" + data = event.data + keypad_name = data.get( + ATTR_KEYPAD_NAME, data[ATTR_KEYPAD_ID] + ) # added in 2022.6 + return { + "name": f"Elk Keypad {keypad_name}", + "message": f"pressed {data[ATTR_KEY_NAME]} ({data[ATTR_KEY]})", + } + + async_describe_event( + DOMAIN, EVENT_ELKM1_KEYPAD_KEY_PRESSED, async_describe_button_event + ) diff --git a/tests/components/elkm1/test_logbook.py b/tests/components/elkm1/test_logbook.py new file mode 100644 index 00000000000..d6ff9f75d5d --- /dev/null +++ b/tests/components/elkm1/test_logbook.py @@ -0,0 +1,63 @@ +"""The tests for elkm1 logbook.""" +from homeassistant.components.elkm1.const import ( + ATTR_KEY, + ATTR_KEY_NAME, + ATTR_KEYPAD_ID, + ATTR_KEYPAD_NAME, + DOMAIN, + EVENT_ELKM1_KEYPAD_KEY_PRESSED, +) +from homeassistant.const import CONF_HOST +from homeassistant.setup import async_setup_component + +from . import _patch_discovery, _patch_elk + +from tests.common import MockConfigEntry +from tests.components.logbook.common import MockRow, mock_humanify + + +async def test_humanify_elkm1_keypad_event(hass): + """Test humanifying elkm1 keypad presses.""" + hass.config.components.add("recorder") + assert await async_setup_component(hass, "logbook", {}) + config_entry = MockConfigEntry( + domain=DOMAIN, + data={CONF_HOST: "elks://1.2.3.4"}, + unique_id="aa:bb:cc:dd:ee:ff", + ) + config_entry.add_to_hass(hass) + + with _patch_discovery(), _patch_elk(): + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + (event1, event2) = mock_humanify( + hass, + [ + MockRow( + EVENT_ELKM1_KEYPAD_KEY_PRESSED, + { + ATTR_KEYPAD_ID: 1, + ATTR_KEY_NAME: "four", + ATTR_KEY: "4", + ATTR_KEYPAD_NAME: "Main Bedroom", + }, + ), + MockRow( + EVENT_ELKM1_KEYPAD_KEY_PRESSED, + { + ATTR_KEYPAD_ID: 1, + ATTR_KEY_NAME: "five", + ATTR_KEY: "5", + }, + ), + ], + ) + + assert event1["name"] == "Elk Keypad Main Bedroom" + assert event1["domain"] == DOMAIN + assert event1["message"] == "pressed four (4)" + + assert event2["name"] == "Elk Keypad 1" + assert event2["domain"] == DOMAIN + assert event2["message"] == "pressed five (5)"