diff --git a/homeassistant/components/mqtt/device_tracker/__init__.py b/homeassistant/components/mqtt/device_tracker/__init__.py index 99e0c87044b..342817e38cc 100644 --- a/homeassistant/components/mqtt/device_tracker/__init__.py +++ b/homeassistant/components/mqtt/device_tracker/__init__.py @@ -10,7 +10,11 @@ from ..const import MQTT_DATA_DEVICE_TRACKER_LEGACY from ..mixins import warn_for_legacy_schema from .schema_discovery import PLATFORM_SCHEMA_MODERN # noqa: F401 from .schema_discovery import async_setup_entry_from_discovery -from .schema_yaml import PLATFORM_SCHEMA_YAML, async_setup_scanner_from_yaml +from .schema_yaml import ( + PLATFORM_SCHEMA_YAML, + MQTTLegacyDeviceTrackerData, + async_setup_scanner_from_yaml, +) # Configuring MQTT Device Trackers under the device_tracker platform key is deprecated in HA Core 2022.6 PLATFORM_SCHEMA = vol.All( @@ -30,6 +34,11 @@ async def async_setup_entry( await async_setup_entry_from_discovery(hass, config_entry, async_add_entities) # (re)load legacy service if MQTT_DATA_DEVICE_TRACKER_LEGACY in hass.data: + yaml_device_tracker_data: MQTTLegacyDeviceTrackerData = hass.data[ + MQTT_DATA_DEVICE_TRACKER_LEGACY + ] await async_setup_scanner_from_yaml( - hass, **hass.data[MQTT_DATA_DEVICE_TRACKER_LEGACY] + hass, + config=yaml_device_tracker_data.config, + async_see=yaml_device_tracker_data.async_see, ) diff --git a/homeassistant/components/mqtt/device_tracker/schema_yaml.py b/homeassistant/components/mqtt/device_tracker/schema_yaml.py index 1990b380dcb..c005a82dbeb 100644 --- a/homeassistant/components/mqtt/device_tracker/schema_yaml.py +++ b/homeassistant/components/mqtt/device_tracker/schema_yaml.py @@ -1,6 +1,8 @@ """Support for tracking MQTT enabled devices defined in YAML.""" +from __future__ import annotations -from collections.abc import Callable +from collections.abc import Awaitable, Callable +import dataclasses import logging from typing import Any @@ -10,6 +12,7 @@ from homeassistant.components.device_tracker import PLATFORM_SCHEMA, SOURCE_TYPE from homeassistant.const import CONF_DEVICES, STATE_HOME, STATE_NOT_HOME from homeassistant.core import HomeAssistant, callback from homeassistant.helpers import config_validation as cv +from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from ... import mqtt from ..client import async_subscribe @@ -33,9 +36,20 @@ PLATFORM_SCHEMA_YAML = PLATFORM_SCHEMA.extend(SCHEMA_BASE).extend( ) +@dataclasses.dataclass +class MQTTLegacyDeviceTrackerData: + """Class to hold device tracker data.""" + + async_see: Callable[..., Awaitable[None]] + config: ConfigType + + async def async_setup_scanner_from_yaml( - hass: HomeAssistant, config, async_see, discovery_info=None -): + hass: HomeAssistant, + config: ConfigType, + async_see: Callable[..., Awaitable[None]], + discovery_info: DiscoveryInfoType | None = None, +) -> bool: """Set up the MQTT tracker.""" devices = config[CONF_DEVICES] qos = config[CONF_QOS] @@ -45,15 +59,14 @@ async def async_setup_scanner_from_yaml( config_entry = hass.config_entries.async_entries(mqtt.DOMAIN)[0] subscriptions: list[Callable] = [] - hass.data[MQTT_DATA_DEVICE_TRACKER_LEGACY] = { - "async_see": async_see, - "config": config, - } + hass.data[MQTT_DATA_DEVICE_TRACKER_LEGACY] = MQTTLegacyDeviceTrackerData( + async_see, config + ) if not mqtt_config_entry_enabled(hass): _LOGGER.info( "MQTT device trackers will be not available until the config entry is enabled", ) - return + return False @callback def _entry_unload(*_: Any) -> None: diff --git a/homeassistant/components/mqtt/mixins.py b/homeassistant/components/mqtt/mixins.py index af0660b4c93..f0cc0c4ad44 100644 --- a/homeassistant/components/mqtt/mixins.py +++ b/homeassistant/components/mqtt/mixins.py @@ -674,7 +674,7 @@ class MqttDiscoveryDeviceUpdate: stop_discovery_updates( self.hass, self._discovery_data, self._remove_discovery_updated ) - self.hass.async_add_job(self.async_tear_down()) + self._config_entry.async_create_task(self.hass, self.async_tear_down()) async def async_discovery_update( self,