diff --git a/homeassistant/components/deconz/logbook.py b/homeassistant/components/deconz/logbook.py index 016dae8d8a3..73c157ac8f6 100644 --- a/homeassistant/components/deconz/logbook.py +++ b/homeassistant/components/deconz/logbook.py @@ -8,7 +8,107 @@ from homeassistant.helpers.event import Event from .const import DOMAIN as DECONZ_DOMAIN from .deconz_event import CONF_DECONZ_EVENT, DeconzEvent -from .device_trigger import _get_deconz_event_from_device_id +from .device_trigger import ( + CONF_BOTH_BUTTONS, + CONF_BOTTOM_BUTTONS, + CONF_BUTTON_1, + CONF_BUTTON_2, + CONF_BUTTON_3, + CONF_BUTTON_4, + CONF_CLOSE, + CONF_DIM_DOWN, + CONF_DIM_UP, + CONF_DOUBLE_PRESS, + CONF_DOUBLE_TAP, + CONF_LEFT, + CONF_LONG_PRESS, + CONF_LONG_RELEASE, + CONF_MOVE, + CONF_OPEN, + CONF_QUADRUPLE_PRESS, + CONF_QUINTUPLE_PRESS, + CONF_RIGHT, + CONF_ROTATE_FROM_SIDE_1, + CONF_ROTATE_FROM_SIDE_2, + CONF_ROTATE_FROM_SIDE_3, + CONF_ROTATE_FROM_SIDE_4, + CONF_ROTATE_FROM_SIDE_5, + CONF_ROTATE_FROM_SIDE_6, + CONF_ROTATED, + CONF_ROTATED_FAST, + CONF_ROTATION_STOPPED, + CONF_SHAKE, + CONF_SHORT_PRESS, + CONF_SHORT_RELEASE, + CONF_SIDE_1, + CONF_SIDE_2, + CONF_SIDE_3, + CONF_SIDE_4, + CONF_SIDE_5, + CONF_SIDE_6, + CONF_TOP_BUTTONS, + CONF_TRIPLE_PRESS, + CONF_TURN_OFF, + CONF_TURN_ON, + REMOTES, + _get_deconz_event_from_device_id, +) + +ACTIONS = { + CONF_SHORT_PRESS: "Short press", + CONF_SHORT_RELEASE: "Short release", + CONF_LONG_PRESS: "Long press", + CONF_LONG_RELEASE: "Long release", + CONF_DOUBLE_PRESS: "Double press", + CONF_TRIPLE_PRESS: "Triple press", + CONF_QUADRUPLE_PRESS: "Quadruple press", + CONF_QUINTUPLE_PRESS: "Quintuple press", + CONF_ROTATED: "Rotated", + CONF_ROTATED_FAST: "Rotated fast", + CONF_ROTATION_STOPPED: "Rotated stopped", + CONF_MOVE: "Move", + CONF_DOUBLE_TAP: "Double tap", + CONF_SHAKE: "Shake", + CONF_ROTATE_FROM_SIDE_1: "Rotate from side 1", + CONF_ROTATE_FROM_SIDE_2: "Rotate from side 2", + CONF_ROTATE_FROM_SIDE_3: "Rotate from side 3", + CONF_ROTATE_FROM_SIDE_4: "Rotate from side 4", + CONF_ROTATE_FROM_SIDE_5: "Rotate from side 5", + CONF_ROTATE_FROM_SIDE_6: "Rotate from side 6", +} + +INTERFACES = { + CONF_TURN_ON: "Turn on", + CONF_TURN_OFF: "Turn off", + CONF_DIM_UP: "Dim up", + CONF_DIM_DOWN: "Dim down", + CONF_LEFT: "Left", + CONF_RIGHT: "Right", + CONF_OPEN: "Open", + CONF_CLOSE: "Close", + CONF_BOTH_BUTTONS: "Both buttons", + CONF_TOP_BUTTONS: "Top buttons", + CONF_BOTTOM_BUTTONS: "Bottom buttons", + CONF_BUTTON_1: "Button 1", + CONF_BUTTON_2: "Button 2", + CONF_BUTTON_3: "Button 3", + CONF_BUTTON_4: "Button 4", + CONF_SIDE_1: "Side 1", + CONF_SIDE_2: "Side 2", + CONF_SIDE_3: "Side 3", + CONF_SIDE_4: "Side 4", + CONF_SIDE_5: "Side 5", + CONF_SIDE_6: "Side 6", +} + + +def _get_device_event_description(modelid: str, event: str) -> tuple: + """Get device event description.""" + device_event_descriptions: dict = REMOTES[modelid] + + for event_type_tuple, event_dict in device_event_descriptions.items(): + if event == event_dict[CONF_EVENT]: + return event_type_tuple @callback @@ -25,9 +125,19 @@ def async_describe_events( hass, event.data[ATTR_DEVICE_ID] ) + if deconz_event.device.modelid not in REMOTES: + return { + "name": f"{deconz_event.device.name}", + "message": f"fired event '{event.data[CONF_EVENT]}'.", + } + + action, interface = _get_device_event_description( + deconz_event.device.modelid, event.data[CONF_EVENT] + ) + return { "name": f"{deconz_event.device.name}", - "message": f"fired event '{event.data[CONF_EVENT]}'.", + "message": f"'{ACTIONS[action]}' event for '{INTERFACES[interface]}' was fired.", } async_describe_event(DECONZ_DOMAIN, CONF_DECONZ_EVENT, async_describe_deconz_event) diff --git a/tests/components/deconz/test_logbook.py b/tests/components/deconz/test_logbook.py index ff314ab88f1..7315a766d5c 100644 --- a/tests/components/deconz/test_logbook.py +++ b/tests/components/deconz/test_logbook.py @@ -24,35 +24,56 @@ async def test_humanifying_deconz_event(hass): "state": {"buttonevent": 1000}, "config": {}, "uniqueid": "00:00:00:00:00:00:00:01-00", - } + }, + "1": { + "id": "Hue remote id", + "name": "Hue remote", + "type": "ZHASwitch", + "modelid": "RWL021", + "state": {"buttonevent": 1000}, + "config": {}, + "uniqueid": "00:00:00:00:00:00:00:02-00", + }, } config_entry = await setup_deconz_integration(hass, get_state_response=data) gateway = get_gateway_from_config_entry(hass, config_entry) - event = gateway.events[0] hass.config.components.add("recorder") assert await async_setup_component(hass, "logbook", {}) entity_attr_cache = logbook.EntityAttributeCache(hass) - event1 = list( + events = list( logbook.humanify( hass, [ MockLazyEventPartialState( CONF_DECONZ_EVENT, { - CONF_DEVICE_ID: event.device_id, + CONF_DEVICE_ID: gateway.events[0].device_id, CONF_EVENT: 2000, - CONF_ID: event.event_id, - CONF_UNIQUE_ID: event.serial, + CONF_ID: gateway.events[0].event_id, + CONF_UNIQUE_ID: gateway.events[0].serial, + }, + ), + MockLazyEventPartialState( + CONF_DECONZ_EVENT, + { + CONF_DEVICE_ID: gateway.events[1].device_id, + CONF_EVENT: 2001, + CONF_ID: gateway.events[1].event_id, + CONF_UNIQUE_ID: gateway.events[1].serial, }, ), ], entity_attr_cache, {}, ) - )[0] + ) - assert event1["name"] == "Switch 1" - assert event1["domain"] == "deconz" - assert event1["message"] == "fired event '2000'." + assert events[0]["name"] == "Switch 1" + assert events[0]["domain"] == "deconz" + assert events[0]["message"] == "fired event '2000'." + + assert events[1]["name"] == "Hue remote" + assert events[1]["domain"] == "deconz" + assert events[1]["message"] == "'Long press' event for 'Dim up' was fired."