Complete partly implemented type hints for dict on MQTT platforms (#87839)

This commit is contained in:
Jan Bouwhuis 2023-02-12 21:47:38 +01:00 committed by GitHub
parent 168d307762
commit 666aace8a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 20 deletions

View File

@ -3,7 +3,7 @@ from __future__ import annotations
from collections.abc import Callable from collections.abc import Callable
import logging import logging
from typing import Any, cast from typing import Any
import attr import attr
import voluptuous as vol import voluptuous as vol
@ -285,7 +285,8 @@ async def async_removed_from_device(hass: HomeAssistant, device_id: str) -> None
device_trigger: Trigger = mqtt_data.device_triggers.pop(trig[CONF_DISCOVERY_ID]) device_trigger: Trigger = mqtt_data.device_triggers.pop(trig[CONF_DISCOVERY_ID])
if device_trigger: if device_trigger:
device_trigger.detach_trigger() device_trigger.detach_trigger()
discovery_data = cast(dict, device_trigger.discovery_data) discovery_data = device_trigger.discovery_data
assert discovery_data is not None
discovery_hash = discovery_data[ATTR_DISCOVERY_HASH] discovery_hash = discovery_data[ATTR_DISCOVERY_HASH]
debug_info.remove_trigger_discovery_data(hass, discovery_hash) debug_info.remove_trigger_discovery_data(hass, discovery_hash)

View File

@ -10,7 +10,7 @@ from homeassistant.components import light
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
from ..mixins import async_setup_entry_helper, warn_for_legacy_schema from ..mixins import async_setup_entry_helper, warn_for_legacy_schema
from .schema import CONF_SCHEMA, MQTT_LIGHT_SCHEMA_SCHEMA from .schema import CONF_SCHEMA, MQTT_LIGHT_SCHEMA_SCHEMA
@ -87,7 +87,7 @@ async def _async_setup_entity(
async_add_entities: AddEntitiesCallback, async_add_entities: AddEntitiesCallback,
config: ConfigType, config: ConfigType,
config_entry: ConfigEntry, config_entry: ConfigEntry,
discovery_data: dict | None = None, discovery_data: DiscoveryInfoType | None = None,
) -> None: ) -> None:
"""Set up a MQTT Light.""" """Set up a MQTT Light."""
setup_entity = { setup_entity = {

View File

@ -54,7 +54,7 @@ async def _async_setup_tag(
hass: HomeAssistant, hass: HomeAssistant,
config: ConfigType, config: ConfigType,
config_entry: ConfigEntry, config_entry: ConfigEntry,
discovery_data: dict, discovery_data: DiscoveryInfoType,
) -> None: ) -> None:
"""Set up the MQTT tag scanner.""" """Set up the MQTT tag scanner."""
discovery_hash = discovery_data[ATTR_DISCOVERY_HASH] discovery_hash = discovery_data[ATTR_DISCOVERY_HASH]

View File

@ -3,7 +3,7 @@ from __future__ import annotations
import functools import functools
import logging import logging
from typing import Any from typing import Any, TypedDict, cast
import voluptuous as vol import voluptuous as vol
@ -70,6 +70,17 @@ PLATFORM_SCHEMA_MODERN = MQTT_RO_SCHEMA.extend(
DISCOVERY_SCHEMA = vol.All(PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA)) DISCOVERY_SCHEMA = vol.All(PLATFORM_SCHEMA_MODERN.extend({}, extra=vol.REMOVE_EXTRA))
class _MqttUpdatePayloadType(TypedDict, total=False):
"""Presentation of supported JSON payload to process state updates."""
installed_version: str
latest_version: str
title: str
release_summary: str
release_url: str
entity_picture: str
async def async_setup_entry( async def async_setup_entry(
hass: HomeAssistant, hass: HomeAssistant,
config_entry: ConfigEntry, config_entry: ConfigEntry,
@ -171,18 +182,19 @@ class MqttUpdate(MqttEntity, UpdateEntity, RestoreEntity):
) )
return return
json_payload: Any | dict = {} json_payload: _MqttUpdatePayloadType = {}
try: try:
json_payload = json_loads(payload) rendered_json_payload = json_loads(payload)
if isinstance(json_payload, dict): if isinstance(rendered_json_payload, dict):
_LOGGER.debug( _LOGGER.debug(
( (
"JSON payload detected after processing payload '%s' on" "JSON payload detected after processing payload '%s' on"
" topic %s" " topic %s"
), ),
json_payload, rendered_json_payload,
msg.topic, msg.topic,
) )
json_payload = cast(_MqttUpdatePayloadType, rendered_json_payload)
else: else:
_LOGGER.debug( _LOGGER.debug(
( (
@ -192,7 +204,7 @@ class MqttUpdate(MqttEntity, UpdateEntity, RestoreEntity):
payload, payload,
msg.topic, msg.topic,
) )
json_payload = {"installed_version": payload} json_payload = {"installed_version": str(payload)}
except JSON_DECODE_EXCEPTIONS: except JSON_DECODE_EXCEPTIONS:
_LOGGER.debug( _LOGGER.debug(
( (
@ -202,7 +214,7 @@ class MqttUpdate(MqttEntity, UpdateEntity, RestoreEntity):
payload, payload,
msg.topic, msg.topic,
) )
json_payload["installed_version"] = payload json_payload["installed_version"] = str(payload)
if "installed_version" in json_payload: if "installed_version" in json_payload:
self._attr_installed_version = json_payload["installed_version"] self._attr_installed_version = json_payload["installed_version"]
@ -212,20 +224,20 @@ class MqttUpdate(MqttEntity, UpdateEntity, RestoreEntity):
self._attr_latest_version = json_payload["latest_version"] self._attr_latest_version = json_payload["latest_version"]
get_mqtt_data(self.hass).state_write_requests.write_state_request(self) get_mqtt_data(self.hass).state_write_requests.write_state_request(self)
if CONF_TITLE in json_payload: if "title" in json_payload:
self._attr_title = json_payload[CONF_TITLE] self._attr_title = json_payload["title"]
get_mqtt_data(self.hass).state_write_requests.write_state_request(self) get_mqtt_data(self.hass).state_write_requests.write_state_request(self)
if CONF_RELEASE_SUMMARY in json_payload: if "release_summary" in json_payload:
self._attr_release_summary = json_payload[CONF_RELEASE_SUMMARY] self._attr_release_summary = json_payload["release_summary"]
get_mqtt_data(self.hass).state_write_requests.write_state_request(self) get_mqtt_data(self.hass).state_write_requests.write_state_request(self)
if CONF_RELEASE_URL in json_payload: if "release_url" in json_payload:
self._attr_release_url = json_payload[CONF_RELEASE_URL] self._attr_release_url = json_payload["release_url"]
get_mqtt_data(self.hass).state_write_requests.write_state_request(self) get_mqtt_data(self.hass).state_write_requests.write_state_request(self)
if CONF_ENTITY_PICTURE in json_payload: if "entity_picture" in json_payload:
self._entity_picture = json_payload[CONF_ENTITY_PICTURE] self._entity_picture = json_payload["entity_picture"]
get_mqtt_data(self.hass).state_write_requests.write_state_request(self) get_mqtt_data(self.hass).state_write_requests.write_state_request(self)
add_subscription(topics, CONF_STATE_TOPIC, handle_state_message_received) add_subscription(topics, CONF_STATE_TOPIC, handle_state_message_received)