From 7b202b42970ed84c068a48c8854a88b17bd42ff5 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 28 Apr 2026 05:42:02 +0000 Subject: [PATCH 1/2] Refactor timezone handling in mqtt datetime Co-authored-by: Copilot --- homeassistant/components/mqtt/datetime.py | 28 +++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/mqtt/datetime.py b/homeassistant/components/mqtt/datetime.py index 271fcb07a13f5d..b1e63ce825e3c0 100644 --- a/homeassistant/components/mqtt/datetime.py +++ b/homeassistant/components/mqtt/datetime.py @@ -88,6 +88,7 @@ class MqttDateTime(MqttEntity, DateTimeEntity): _attributes_extra_blocked = MQTT_DATETIME_ATTRIBUTES_BLOCKED _default_name = DEFAULT_NAME _entity_id_format = datetime.ENTITY_ID_FORMAT + _timezone_config: str | None = None _zone_info: ZoneInfo | None = None _time_zone_delta: datetime_library.timedelta | None @@ -104,20 +105,7 @@ def config_schema() -> VolSchemaType: def _setup_from_config(self, config: ConfigType) -> None: """(Re)Setup the entity.""" - self._zone_info = None - - async def async_set_zone_info(timezone: str) -> None: - self._zone_info = await async_get_time_zone(timezone) - if self._zone_info: - return - _LOGGER.warning( - "Ignoring invalid timezone identifier for entity %s, got '%s'", - self.entity_id, - timezone, - ) - - if timezone := config.get(CONF_TIMEZONE): - self.hass.async_create_task(async_set_zone_info(timezone)) + self._timezone_config = config.get(CONF_TIMEZONE) self._command_template = MqttCommandTemplate( config.get(CONF_COMMAND_TEMPLATE), @@ -131,6 +119,18 @@ async def async_set_zone_info(timezone: str) -> None: self._optimistic = optimistic or config.get(CONF_STATE_TOPIC) is None self._attr_assumed_state = bool(self._optimistic) + async def mqtt_async_added_to_hass(self) -> None: + """Finish configuration.""" + self._zone_info = None + if timezone := self._timezone_config: + self._zone_info = await async_get_time_zone(timezone) + if not self._zone_info: + _LOGGER.warning( + "Ignoring invalid timezone identifier for entity %s, got '%s'", + self.entity_id, + timezone, + ) + @callback def _handle_state_message_received(self, msg: ReceiveMessage) -> None: """Handle receiving state message via MQTT.""" From 12bd1dfdb177ce9dcdd18d621b75ed505df2b522 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Tue, 28 Apr 2026 06:00:32 +0000 Subject: [PATCH 2/2] Improve Co-authored-by: Copilot --- homeassistant/components/mqtt/datetime.py | 7 +++---- homeassistant/components/mqtt/entity.py | 8 ++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/mqtt/datetime.py b/homeassistant/components/mqtt/datetime.py index b1e63ce825e3c0..2e6cb9f04b55cd 100644 --- a/homeassistant/components/mqtt/datetime.py +++ b/homeassistant/components/mqtt/datetime.py @@ -88,7 +88,6 @@ class MqttDateTime(MqttEntity, DateTimeEntity): _attributes_extra_blocked = MQTT_DATETIME_ATTRIBUTES_BLOCKED _default_name = DEFAULT_NAME _entity_id_format = datetime.ENTITY_ID_FORMAT - _timezone_config: str | None = None _zone_info: ZoneInfo | None = None _time_zone_delta: datetime_library.timedelta | None @@ -119,10 +118,10 @@ def _setup_from_config(self, config: ConfigType) -> None: self._optimistic = optimistic or config.get(CONF_STATE_TOPIC) is None self._attr_assumed_state = bool(self._optimistic) - async def mqtt_async_added_to_hass(self) -> None: - """Finish configuration.""" + async def _async_finish_update_config(self) -> None: + """Called after added to hass and after discovery update.""" self._zone_info = None - if timezone := self._timezone_config: + if timezone := self._config.get(CONF_TIMEZONE): self._zone_info = await async_get_time_zone(timezone) if not self._zone_info: _LOGGER.warning( diff --git a/homeassistant/components/mqtt/entity.py b/homeassistant/components/mqtt/entity.py index 0b1b80fc4507a6..8a26e454e9f836 100644 --- a/homeassistant/components/mqtt/entity.py +++ b/homeassistant/components/mqtt/entity.py @@ -1476,6 +1476,7 @@ async def async_added_to_hass(self) -> None: self._update_registry_entity_id = None await super().async_added_to_hass() + await self._async_finish_update_config() self._subscriptions = {} self._prepare_subscribe_topics() if self._subscriptions: @@ -1493,6 +1494,12 @@ async def mqtt_async_added_to_hass(self) -> None: To be extended by subclasses. """ + async def _async_finish_update_config(self) -> None: + """Called after added to hass and after discovery update. + + To be extended by subclasses. + """ + async def discovery_update(self, discovery_payload: MQTTDiscoveryPayload) -> None: """Handle updated discovery message.""" try: @@ -1503,6 +1510,7 @@ async def discovery_update(self, discovery_payload: MQTTDiscoveryPayload) -> Non self._config = config self._setup_from_config(self._config) self._setup_common_attributes_from_config(self._config) + await self._async_finish_update_config() # Prepare MQTT subscriptions self.attributes_prepare_discovery_update(config)