1 """Support for tracking MQTT enabled devices identified."""
3 from __future__
import annotations
5 from collections.abc
import Callable
7 from typing
import TYPE_CHECKING
9 import voluptuous
as vol
29 from .
import subscription
30 from .config
import MQTT_BASE_SCHEMA
31 from .const
import CONF_PAYLOAD_RESET, CONF_STATE_TOPIC
32 from .entity
import CONF_JSON_ATTRS_TOPIC, MqttEntity, async_setup_entity_entry_helper
33 from .models
import MqttValueTemplate, ReceiveMessage
34 from .schemas
import MQTT_ENTITY_COMMON_SCHEMA
35 from .util
import valid_subscribe_topic
37 _LOGGER = logging.getLogger(__name__)
41 CONF_PAYLOAD_HOME =
"payload_home"
42 CONF_PAYLOAD_NOT_HOME =
"payload_not_home"
43 CONF_SOURCE_TYPE =
"source_type"
45 DEFAULT_PAYLOAD_RESET =
"None"
46 DEFAULT_SOURCE_TYPE = SourceType.GPS
50 """Check if there is a state topic or json_attributes_topic."""
51 if CONF_STATE_TOPIC
not in config
and CONF_JSON_ATTRS_TOPIC
not in config:
53 f
"Invalid device tracker config, missing {CONF_STATE_TOPIC} or {CONF_JSON_ATTRS_TOPIC}, got: {config}"
58 PLATFORM_SCHEMA_MODERN_BASE = MQTT_BASE_SCHEMA.extend(
60 vol.Optional(CONF_STATE_TOPIC): valid_subscribe_topic,
61 vol.Optional(CONF_VALUE_TEMPLATE): cv.template,
62 vol.Optional(CONF_NAME): vol.Any(cv.string,
None),
63 vol.Optional(CONF_PAYLOAD_HOME, default=STATE_HOME): cv.string,
64 vol.Optional(CONF_PAYLOAD_NOT_HOME, default=STATE_NOT_HOME): cv.string,
65 vol.Optional(CONF_PAYLOAD_RESET, default=DEFAULT_PAYLOAD_RESET): cv.string,
66 vol.Optional(CONF_SOURCE_TYPE, default=DEFAULT_SOURCE_TYPE): vol.Coerce(
70 ).extend(MQTT_ENTITY_COMMON_SCHEMA.schema)
71 PLATFORM_SCHEMA_MODERN = vol.All(PLATFORM_SCHEMA_MODERN_BASE, valid_config)
74 DISCOVERY_SCHEMA = vol.All(
75 PLATFORM_SCHEMA_MODERN_BASE.extend({}, extra=vol.REMOVE_EXTRA), valid_config
81 config_entry: ConfigEntry,
82 async_add_entities: AddEntitiesCallback,
84 """Set up MQTT event through YAML and through MQTT discovery."""
89 device_tracker.DOMAIN,
92 PLATFORM_SCHEMA_MODERN,
97 """Representation of a device tracker using MQTT."""
100 _entity_id_format = device_tracker.ENTITY_ID_FORMAT
101 _location_name: str |
None =
None
102 _value_template: Callable[[ReceivePayloadType], ReceivePayloadType]
106 """Return the config schema."""
107 return DISCOVERY_SCHEMA
110 """(Re)Setup the entity."""
112 config.get(CONF_VALUE_TEMPLATE), entity=self
113 ).async_render_with_possible_json_value
117 """Handle new MQTT messages."""
119 if not payload.strip():
121 "Ignoring empty payload '%s' after rendering for topic %s",
126 if payload == self.
_config_config[CONF_PAYLOAD_HOME]:
128 elif payload == self.
_config_config[CONF_PAYLOAD_NOT_HOME]:
130 elif payload == self.
_config_config[CONF_PAYLOAD_RESET]:
134 assert isinstance(msg.payload, str)
139 """(Re)Subscribe to topics."""
146 """Do not force updates if the state is the same."""
150 """(Re)Subscribe to topics."""
151 subscription.async_subscribe_topics_internal(self.
hasshasshass, self.
_sub_state_sub_state)
155 """Return latitude if provided in extra_state_attributes or None."""
166 """Return location accuracy if provided in extra_state_attributes or None."""
177 """Return longitude if provided in extra_state_attributes or None."""
188 """Return a location name for the current location of the device."""
193 """Return the source type, eg gps or router, of the device."""
194 source_type: SourceType = self.
_config_config[CONF_SOURCE_TYPE]
float|None latitude(self)
SourceType source_type(self)
VolSchemaType config_schema()
None _prepare_subscribe_topics(self)
None _tracker_message_received(self, ReceiveMessage msg)
int location_accuracy(self)
None _subscribe_topics(self)
float|None longitude(self)
str|None location_name(self)
None _setup_from_config(self, ConfigType config)
bool add_subscription(self, str state_topic_config_key, Callable[[ReceiveMessage], None] msg_callback, set[str]|None tracked_attributes, bool disable_encoding=False)
Mapping[str, Any]|None extra_state_attributes(self)
ConfigType valid_config(ConfigType config)
None async_setup_entry(HomeAssistant hass, ConfigEntry config_entry, AddEntitiesCallback async_add_entities)
None async_setup_entity_entry_helper(HomeAssistant hass, ConfigEntry entry, type[MqttEntity]|None entity_class, str domain, AddEntitiesCallback async_add_entities, VolSchemaType discovery_schema, VolSchemaType platform_schema_modern, dict[str, type[MqttEntity]]|None schema_class_mapping=None)