diff --git a/homeassistant/components/knx/services.py b/homeassistant/components/knx/services.py index 6def16df68a66..3341abd209abf 100644 --- a/homeassistant/components/knx/services.py +++ b/homeassistant/components/knx/services.py @@ -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) if group_address in knx_module.group_address_transcoder: 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))) + }, + ) if (dpt := call.data.get(CONF_TYPE)) and ( transcoder := DPTBase.parse_transcoder(dpt) diff --git a/homeassistant/components/knx/strings.json b/homeassistant/components/knx/strings.json index 3abb766c958e6..1e041a87fe7b2 100644 --- a/homeassistant/components/knx/strings.json +++ b/homeassistant/components/knx/strings.json @@ -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." }, diff --git a/tests/components/knx/test_services.py b/tests/components/knx/test_services.py index 617d2f31bc073..c0961512b0eff 100644 --- a/tests/components/knx/test_services.py +++ b/tests/components/knx/test_services.py @@ -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."""