Deprecate firing events to event bus in HTML5 integration (#168725)

This commit is contained in:
Manu
2026-07-08 22:37:27 +02:00
committed by GitHub
parent 739c4af8c6
commit c33f0bce4c
4 changed files with 123 additions and 2 deletions
+30
View File
@@ -52,3 +52,33 @@ def deprecated_dismiss_action_call(hass: HomeAssistant) -> None:
"new_action": "html5.dismiss_message",
},
)
@callback
def deprecated_event_bus(hass: HomeAssistant, event: str) -> None:
"""Raise a deprecation issue for listeners on the event bus."""
if listeners := hass.bus.async_listeners().get(event):
async_create_issue(
hass,
DOMAIN,
f"deprecated_event_bus_{event}",
breaks_in_ha_version="2027.2.0",
is_fixable=False,
severity=IssueSeverity.WARNING,
translation_key="deprecated_event_bus",
translation_placeholders={
"event": event,
"listeners": str(listeners),
"example_yaml": """```yaml
triggers:
- trigger: event.received
target:
entity_id: event.my_device
options:
event_type:
- received
```
""",
},
)
+8 -1
View File
@@ -60,7 +60,11 @@ from .const import (
SERVICE_DISMISS,
)
from .entity import HTML5Entity, Registration
from .issue import deprecated_dismiss_action_call, deprecated_notify_action_call
from .issue import (
deprecated_dismiss_action_call,
deprecated_event_bus,
deprecated_notify_action_call,
)
_LOGGER = logging.getLogger(__name__)
@@ -409,6 +413,9 @@ class HTML5PushCallbackView(HomeAssistantView):
event_payload[ATTR_TYPE],
event_payload,
)
deprecated_event_bus(hass, event_name)
return self.json({"status": "ok", "event": event_payload[ATTR_TYPE]})
@@ -55,6 +55,10 @@
"description": "The action `{action}` is deprecated and will be removed in a future release.\n\nPlease update your automations and scripts to use the notify entities with the `{new_action}` action instead.",
"title": "[%key:component::html5::issues::deprecated_notify_action::title%]"
},
"deprecated_event_bus": {
"description": "Detected **{listeners}** listener(s) for the event `{event}`.\n\nThe HTML5 Push Notifications integration firing events on the event bus is deprecated and this functionality will be removed in a future release.\n\nPlease update your automations and scripts to use the event entities instead.\n\n## Example automation:\n\n{example_yaml}",
"title": "Detected use of deprecated event {event}"
},
"deprecated_notify_action": {
"description": "The action `{action}` is deprecated and will be removed in a future release.\n\nPlease update your automations and scripts to use the notify entities with the `{new_action_1}` or `{new_action_2}` actions instead.",
"title": "Detected use of deprecated action {action}"
+81 -1
View File
@@ -9,12 +9,13 @@ from aiohttp.hdrs import AUTHORIZATION
import pytest
from syrupy.assertion import SnapshotAssertion
from homeassistant.components.html5.const import DOMAIN
from homeassistant.components.html5.notify import ATTR_ACTION, ATTR_TAG, ATTR_TYPE
from homeassistant.components.notify import ATTR_DATA, ATTR_TARGET
from homeassistant.config_entries import ConfigEntryState
from homeassistant.const import STATE_UNKNOWN, Platform
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from homeassistant.helpers import entity_registry as er, issue_registry as ir
from homeassistant.setup import async_setup_component
from .test_notify import SUBSCRIPTION_1
@@ -118,3 +119,82 @@ async def test_events(
assert state.attributes.get("action") == event_payload.get(ATTR_ACTION)
assert state.attributes.get("tag") == event_payload[ATTR_TAG]
assert state.attributes.get("customKey") == event_payload[ATTR_DATA]["customKey"]
@pytest.mark.parametrize("event_type", ["clicked", "received", "closed"])
@pytest.mark.usefixtures("mock_wp", "mock_jwt", "mock_vapid", "mock_uuid")
async def test_deprecation_event_bus(
hass: HomeAssistant,
config_entry: MockConfigEntry,
load_config: MagicMock,
issue_registry: ir.IssueRegistry,
hass_client: ClientSessionGenerator,
event_type: str,
) -> None:
"""Test deprecation of events on the event bus."""
load_config.return_value = {"device": SUBSCRIPTION_1}
await async_setup_component(hass, "http", {})
config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
assert config_entry.state is ConfigEntryState.LOADED
config_entry.async_on_unload(
hass.bus.async_listen(f"html5_notification.{event_type}", lambda _: None)
)
client = await hass_client()
resp = await client.post(
"/api/notify.html5/callback",
json={"type": event_type, "tag": "12345", "target": "device"},
headers={AUTHORIZATION: "Bearer JWT"},
)
assert resp.status == HTTPStatus.OK
body = await resp.json()
assert body == {"event": event_type, "status": "ok"}
assert issue_registry.async_get_issue(
domain=DOMAIN,
issue_id=f"deprecated_event_bus_html5_notification.{event_type}",
)
@pytest.mark.parametrize("event_type", ["clicked", "received", "closed"])
@pytest.mark.usefixtures("mock_wp", "mock_jwt", "mock_vapid", "mock_uuid")
async def test_deprecation_event_bus_no_listeners(
hass: HomeAssistant,
config_entry: MockConfigEntry,
load_config: MagicMock,
issue_registry: ir.IssueRegistry,
hass_client: ClientSessionGenerator,
event_type: str,
) -> None:
"""Test no issue is created when there are no listeners."""
load_config.return_value = {"device": SUBSCRIPTION_1}
await async_setup_component(hass, "http", {})
config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(config_entry.entry_id)
await hass.async_block_till_done()
assert config_entry.state is ConfigEntryState.LOADED
client = await hass_client()
resp = await client.post(
"/api/notify.html5/callback",
json={"type": event_type, "tag": "12345", "target": "device"},
headers={AUTHORIZATION: "Bearer JWT"},
)
assert resp.status == HTTPStatus.OK
body = await resp.json()
assert body == {"event": event_type, "status": "ok"}
assert not issue_registry.async_get_issue(
domain=DOMAIN,
issue_id=f"deprecated_event_bus_html5_notification.{event_type}",
)