diff --git a/homeassistant/components/mqtt_room/sensor.py b/homeassistant/components/mqtt_room/sensor.py index 1b4cdb1c583..4eb3a3f5171 100644 --- a/homeassistant/components/mqtt_room/sensor.py +++ b/homeassistant/components/mqtt_room/sensor.py @@ -2,8 +2,9 @@ from __future__ import annotations from datetime import timedelta -import json +from functools import lru_cache import logging +from typing import Any import voluptuous as vol @@ -24,6 +25,7 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType from homeassistant.util import dt as dt_util, slugify +from homeassistant.util.json import json_loads _LOGGER = logging.getLogger(__name__) @@ -47,9 +49,16 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( } ).extend(mqtt.config.MQTT_RO_SCHEMA.schema) + +@lru_cache(maxsize=256) +def _slugify_upper(string: str) -> str: + """Return a slugified version of string, uppercased.""" + return slugify(string).upper() + + MQTT_PAYLOAD = vol.Schema( vol.All( - json.loads, + json_loads, vol.Schema( { vol.Required(ATTR_ID): cv.string, @@ -106,7 +115,7 @@ class MQTTRoomSensor(SensorEntity): self._state = STATE_NOT_HOME self._name = name self._state_topic = f"{state_topic}/+" - self._device_id = slugify(device_id).upper() + self._device_id = _slugify_upper(device_id) self._timeout = timeout self._consider_home = ( timedelta(seconds=consider_home) if consider_home else None @@ -179,11 +188,10 @@ class MQTTRoomSensor(SensorEntity): self._state = STATE_NOT_HOME -def _parse_update_data(topic, data): +def _parse_update_data(topic: str, data: dict[str, Any]) -> dict[str, Any]: """Parse the room presence update.""" parts = topic.split("/") room = parts[-1] - device_id = slugify(data.get(ATTR_ID)).upper() + device_id = _slugify_upper(data.get(ATTR_ID)) distance = data.get("distance") - parsed_data = {ATTR_DEVICE_ID: device_id, ATTR_ROOM: room, ATTR_DISTANCE: distance} - return parsed_data + return {ATTR_DEVICE_ID: device_id, ATTR_ROOM: room, ATTR_DISTANCE: distance}