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
20 changes: 13 additions & 7 deletions homeassistant/components/knx/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,21 +114,27 @@ async def service_event_register_modify(call: ServiceCall) -> None:
knx_module = get_knx_module(call.hass)

attr_address = call.data[KNX_ADDRESS]
group_addresses = list(map(parse_device_group_address, attr_address))
group_addresses = set(map(parse_device_group_address, attr_address))

if call.data.get(SERVICE_KNX_ATTR_REMOVE):
_error_gas = set()
for group_address in group_addresses:
try:
knx_module.knx_event_callback.group_addresses.remove(group_address)
# pylint: disable-next=home-assistant-action-swallowed-exception
except ValueError:
_LOGGER.warning(
"Service event_register could not remove event for '%s'",
str(group_address),
)
_error_gas.add(group_address)
Comment thread
farmio marked this conversation as resolved.
Comment on lines 119 to +125
if group_address in knx_module.group_address_transcoder:
Comment thread
farmio marked this conversation as resolved.
del knx_module.group_address_transcoder[group_address]
return

if not _error_gas:
return
raise HomeAssistantError(
translation_domain=DOMAIN,
translation_key="service_event_register_ga_not_found",
translation_placeholders={
"group_addresses": ", ".join(map(str, sorted(_error_gas)))
},
Comment thread
farmio marked this conversation as resolved.
)
Comment thread
farmio marked this conversation as resolved.
Comment thread
farmio marked this conversation as resolved.
Comment on lines 119 to +137

if (dpt := call.data.get(CONF_TYPE)) and (
transcoder := DPTBase.parse_transcoder(dpt)
Expand Down
3 changes: 3 additions & 0 deletions homeassistant/components/knx/strings.json
Original file line number Diff line number Diff line change
Expand Up @@ -1094,6 +1094,9 @@
"integration_not_loaded": {
"message": "KNX integration is not loaded."
},
"service_event_register_ga_not_found": {
"message": "Could not find registered event for `{group_addresses}` to remove."
},
"service_exposure_remove_not_found": {
"message": "Could not find exposure for `{group_address}` to remove."
},
Expand Down
12 changes: 12 additions & 0 deletions tests/components/knx/test_services.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,18 @@ async def test_event_register(hass: HomeAssistant, knx: KNXTestKit) -> None:
assert untyped_event_1.data["data"] is True
assert untyped_event_1.data["value"] is None

# remove event for non-registered address - raise error
with pytest.raises(HomeAssistantError) as exc_info:
await hass.services.async_call(
"knx",
"event_register",
{"address": "4/4/4", "remove": True},
blocking=True,
)
assert exc_info.value.translation_domain == DOMAIN
assert exc_info.value.translation_key == "service_event_register_ga_not_found"
assert exc_info.value.translation_placeholders == {"group_addresses": "4/4/4"}


async def test_exposure_register(hass: HomeAssistant, knx: KNXTestKit) -> None:
"""Test `knx.exposure_register` service."""
Expand Down