From a1ab388e0e50ae3321b57efdc7df5079869aee39 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 11 May 2022 18:21:09 -0500 Subject: [PATCH 1/5] Add device_id and logbook descriptions to lutron_caseta --- .../components/lutron_caseta/__init__.py | 5 ++- .../components/lutron_caseta/logbook.py | 42 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 homeassistant/components/lutron_caseta/logbook.py diff --git a/homeassistant/components/lutron_caseta/__init__.py b/homeassistant/components/lutron_caseta/__init__.py index 3d9e07519a8a9e..e9ada82bb54e48 100644 --- a/homeassistant/components/lutron_caseta/__init__.py +++ b/homeassistant/components/lutron_caseta/__init__.py @@ -12,7 +12,7 @@ import voluptuous as vol from homeassistant import config_entries -from homeassistant.const import ATTR_SUGGESTED_AREA, CONF_HOST, Platform +from homeassistant.const import ATTR_DEVICE_ID, ATTR_SUGGESTED_AREA, CONF_HOST, Platform from homeassistant.core import HomeAssistant, callback from homeassistant.exceptions import ConfigEntryNotReady from homeassistant.helpers import device_registry as dr @@ -229,6 +229,7 @@ def _async_subscribe_pico_remote_events( button_devices_by_id: dict[int, dict], ): """Subscribe to lutron events.""" + dev_reg = dr.async_get(hass) @callback def _async_button_event(button_id, event_type): @@ -257,6 +258,7 @@ def _async_button_event(button_id, event_type): ) return lip_button_number = sub_type_to_lip_button[sub_type] + hass_device = dev_reg.async_get_device({(DOMAIN, device["serial"])}) hass.bus.async_fire( LUTRON_CASETA_BUTTON_EVENT, @@ -266,6 +268,7 @@ def _async_button_event(button_id, event_type): ATTR_BUTTON_NUMBER: lip_button_number, ATTR_LEAP_BUTTON_NUMBER: button_number, ATTR_DEVICE_NAME: name, + ATTR_DEVICE_ID: hass_device.id, ATTR_AREA_NAME: area, ATTR_ACTION: action, }, diff --git a/homeassistant/components/lutron_caseta/logbook.py b/homeassistant/components/lutron_caseta/logbook.py new file mode 100644 index 00000000000000..a712837ac85b2f --- /dev/null +++ b/homeassistant/components/lutron_caseta/logbook.py @@ -0,0 +1,42 @@ +"""Describe lutron_caseta logbook events.""" +from __future__ import annotations + +from collections.abc import Callable + +from homeassistant.core import Event, HomeAssistant, callback + +from .const import ( + ATTR_ACTION, + ATTR_DEVICE_NAME, + ATTR_LEAP_BUTTON_NUMBER, + ATTR_TYPE, + DOMAIN, + LUTRON_CASETA_BUTTON_EVENT, +) +from .device_trigger import LEAP_TO_DEVICE_TYPE_SUBTYPE_MAP + + +@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 lutron_caseta_button_event logbook event.""" + data = event.data + device_type = data[ATTR_TYPE] + leap_button_number = data[ATTR_LEAP_BUTTON_NUMBER] + action = data[ATTR_ACTION] + button_map = LEAP_TO_DEVICE_TYPE_SUBTYPE_MAP[device_type] + button_description = button_map[leap_button_number] + return { + "name": data[ATTR_DEVICE_NAME], + "message": f"{action} {button_description}.", + } + + async_describe_event( + DOMAIN, LUTRON_CASETA_BUTTON_EVENT, async_describe_button_event + ) From 705d3f5796a81f697aa1d57c19e5018035e3d3cd Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 11 May 2022 18:25:54 -0500 Subject: [PATCH 2/5] include area name as its super confusing since they are all called pico --- homeassistant/components/lutron_caseta/logbook.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/lutron_caseta/logbook.py b/homeassistant/components/lutron_caseta/logbook.py index a712837ac85b2f..d2026989be6202 100644 --- a/homeassistant/components/lutron_caseta/logbook.py +++ b/homeassistant/components/lutron_caseta/logbook.py @@ -7,6 +7,7 @@ from .const import ( ATTR_ACTION, + ATTR_AREA_NAME, ATTR_DEVICE_NAME, ATTR_LEAP_BUTTON_NUMBER, ATTR_TYPE, @@ -33,7 +34,7 @@ def async_describe_button_event(event: Event) -> dict[str, str]: button_map = LEAP_TO_DEVICE_TYPE_SUBTYPE_MAP[device_type] button_description = button_map[leap_button_number] return { - "name": data[ATTR_DEVICE_NAME], + "name": f"{data[ATTR_AREA_NAME]} {data[ATTR_DEVICE_NAME]}", "message": f"{action} {button_description}.", } From c620116baf4fde019cfa1130fe3a25cbc800037a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 11 May 2022 18:27:37 -0500 Subject: [PATCH 3/5] tweak --- homeassistant/components/lutron_caseta/logbook.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/lutron_caseta/logbook.py b/homeassistant/components/lutron_caseta/logbook.py index d2026989be6202..5dcc4da5ca8bc7 100644 --- a/homeassistant/components/lutron_caseta/logbook.py +++ b/homeassistant/components/lutron_caseta/logbook.py @@ -35,7 +35,7 @@ def async_describe_button_event(event: Event) -> dict[str, str]: button_description = button_map[leap_button_number] return { "name": f"{data[ATTR_AREA_NAME]} {data[ATTR_DEVICE_NAME]}", - "message": f"{action} {button_description}.", + "message": f"{action} {button_description}", } async_describe_event( From 419ed3eadf8e7fbdd58dea909abae95c249bdefa Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 11 May 2022 18:28:39 -0500 Subject: [PATCH 4/5] preen --- homeassistant/components/lutron_caseta/logbook.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/homeassistant/components/lutron_caseta/logbook.py b/homeassistant/components/lutron_caseta/logbook.py index 5dcc4da5ca8bc7..28342090a21372 100644 --- a/homeassistant/components/lutron_caseta/logbook.py +++ b/homeassistant/components/lutron_caseta/logbook.py @@ -30,12 +30,11 @@ def async_describe_button_event(event: Event) -> dict[str, str]: data = event.data device_type = data[ATTR_TYPE] leap_button_number = data[ATTR_LEAP_BUTTON_NUMBER] - action = data[ATTR_ACTION] button_map = LEAP_TO_DEVICE_TYPE_SUBTYPE_MAP[device_type] button_description = button_map[leap_button_number] return { "name": f"{data[ATTR_AREA_NAME]} {data[ATTR_DEVICE_NAME]}", - "message": f"{action} {button_description}", + "message": f"{data[ATTR_ACTION]} {button_description}", } async_describe_event( From 69e0f28acc0af533a799d76d8e228360543d901e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 11 May 2022 19:49:49 -0500 Subject: [PATCH 5/5] cover --- .../components/lutron_caseta/test_logbook.py | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 tests/components/lutron_caseta/test_logbook.py diff --git a/tests/components/lutron_caseta/test_logbook.py b/tests/components/lutron_caseta/test_logbook.py new file mode 100644 index 00000000000000..3a202eadf58cce --- /dev/null +++ b/tests/components/lutron_caseta/test_logbook.py @@ -0,0 +1,73 @@ +"""The tests for lutron caseta logbook.""" +from unittest.mock import patch + +from homeassistant.components.lutron_caseta.const import ( + ATTR_ACTION, + ATTR_AREA_NAME, + ATTR_BUTTON_NUMBER, + ATTR_DEVICE_NAME, + ATTR_LEAP_BUTTON_NUMBER, + ATTR_SERIAL, + ATTR_TYPE, + CONF_CA_CERTS, + CONF_CERTFILE, + CONF_KEYFILE, + DOMAIN, + LUTRON_CASETA_BUTTON_EVENT, +) +from homeassistant.const import ATTR_DEVICE_ID, CONF_HOST +from homeassistant.setup import async_setup_component + +from . import MockBridge + +from tests.common import MockConfigEntry +from tests.components.logbook.common import MockRow, mock_humanify + + +async def test_humanify_lutron_caseta_button_event(hass): + """Test humanifying lutron_caseta_button_events.""" + hass.config.components.add("recorder") + assert await async_setup_component(hass, "logbook", {}) + config_entry = MockConfigEntry( + domain=DOMAIN, + data={ + CONF_HOST: "1.1.1.1", + CONF_KEYFILE: "", + CONF_CERTFILE: "", + CONF_CA_CERTS: "", + }, + unique_id="abc", + ) + config_entry.add_to_hass(hass) + + with patch( + "homeassistant.components.lutron_caseta.Smartbridge.create_tls", + return_value=MockBridge(can_connect=True), + ): + await hass.config_entries.async_setup(config_entry.entry_id) + await hass.async_block_till_done() + + await hass.async_block_till_done() + + (event1,) = mock_humanify( + hass, + [ + MockRow( + LUTRON_CASETA_BUTTON_EVENT, + { + ATTR_SERIAL: "123", + ATTR_DEVICE_ID: "1234", + ATTR_TYPE: "Pico3ButtonRaiseLower", + ATTR_LEAP_BUTTON_NUMBER: 3, + ATTR_BUTTON_NUMBER: 3, + ATTR_DEVICE_NAME: "Pico", + ATTR_AREA_NAME: "Living Room", + ATTR_ACTION: "press", + }, + ), + ], + ) + + assert event1["name"] == "Living Room Pico" + assert event1["domain"] == DOMAIN + assert event1["message"] == "press raise"