Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions homeassistant/components/elkm1/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
ATTR_KEY,
ATTR_KEY_NAME,
ATTR_KEYPAD_ID,
ATTR_KEYPAD_NAME,
CONF_AREA,
CONF_AUTO_CONFIGURE,
CONF_COUNTER,
Expand Down Expand Up @@ -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):
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/elkm1/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
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"
Expand Down
39 changes: 39 additions & 0 deletions homeassistant/components/elkm1/logbook.py
Original file line number Diff line number Diff line change
@@ -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
)
63 changes: 63 additions & 0 deletions tests/components/elkm1/test_logbook.py
Original file line number Diff line number Diff line change
@@ -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)"