From 9c1e8486c54508468963604b0d35dc9ef22e532b Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Tue, 22 Nov 2022 15:56:31 +0100 Subject: [PATCH] Add unique id option for `mqtt_room` sensors (#82521) Add unique_id setting for mqtt_room --- homeassistant/components/mqtt_room/sensor.py | 23 +++++++++--- tests/components/mqtt_room/test_sensor.py | 39 +++++++++++++++++++- 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/mqtt_room/sensor.py b/homeassistant/components/mqtt_room/sensor.py index a6927048051..b1b52e42fce 100644 --- a/homeassistant/components/mqtt_room/sensor.py +++ b/homeassistant/components/mqtt_room/sensor.py @@ -16,6 +16,7 @@ from homeassistant.const import ( CONF_DEVICE_ID, CONF_NAME, CONF_TIMEOUT, + CONF_UNIQUE_ID, STATE_NOT_HOME, ) from homeassistant.core import HomeAssistant, callback @@ -42,6 +43,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( vol.Required(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, vol.Optional(CONF_AWAY_TIMEOUT, default=DEFAULT_AWAY_TIMEOUT): cv.positive_int, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Optional(CONF_UNIQUE_ID): cv.string, } ).extend(mqtt.config.MQTT_RO_SCHEMA.schema) @@ -70,10 +72,11 @@ async def async_setup_platform( [ MQTTRoomSensor( config.get(CONF_NAME), - config.get(CONF_STATE_TOPIC), - config.get(CONF_DEVICE_ID), - config.get(CONF_TIMEOUT), - config.get(CONF_AWAY_TIMEOUT), + config[CONF_STATE_TOPIC], + config[CONF_DEVICE_ID], + config[CONF_TIMEOUT], + config[CONF_AWAY_TIMEOUT], + config.get(CONF_UNIQUE_ID), ) ] ) @@ -82,8 +85,18 @@ async def async_setup_platform( class MQTTRoomSensor(SensorEntity): """Representation of a room sensor that is updated via MQTT.""" - def __init__(self, name, state_topic, device_id, timeout, consider_home): + def __init__( + self, + name: str | None, + state_topic: str, + device_id: str, + timeout: int, + consider_home: int, + unique_id: str | None, + ) -> None: """Initialize the sensor.""" + self._attr_unique_id = unique_id + self._state = STATE_NOT_HOME self._name = name self._state_topic = f"{state_topic}/+" diff --git a/tests/components/mqtt_room/test_sensor.py b/tests/components/mqtt_room/test_sensor.py index b17a2bed457..562b8c95fd0 100644 --- a/tests/components/mqtt_room/test_sensor.py +++ b/tests/components/mqtt_room/test_sensor.py @@ -5,7 +5,15 @@ from unittest.mock import patch from homeassistant.components.mqtt import CONF_QOS, CONF_STATE_TOPIC, DEFAULT_QOS import homeassistant.components.sensor as sensor -from homeassistant.const import CONF_DEVICE_ID, CONF_NAME, CONF_PLATFORM, CONF_TIMEOUT +from homeassistant.const import ( + CONF_DEVICE_ID, + CONF_NAME, + CONF_PLATFORM, + CONF_TIMEOUT, + CONF_UNIQUE_ID, +) +from homeassistant.core import HomeAssistant +from homeassistant.helpers import entity_registry as er from homeassistant.setup import async_setup_component from homeassistant.util import dt @@ -82,3 +90,32 @@ async def test_room_update(hass, mqtt_mock_entry_with_yaml_config): await send_message(hass, BEDROOM_TOPIC, FAR_MESSAGE) await assert_state(hass, BEDROOM) await assert_distance(hass, 10) + + +async def test_unique_id_is_set( + hass: HomeAssistant, mqtt_mock_entry_with_yaml_config +) -> None: + """Test the updating between rooms.""" + unique_name = "my_unique_name_0123456789" + assert await async_setup_component( + hass, + sensor.DOMAIN, + { + sensor.DOMAIN: { + CONF_PLATFORM: "mqtt_room", + CONF_NAME: NAME, + CONF_DEVICE_ID: DEVICE_ID, + CONF_STATE_TOPIC: "room_presence", + CONF_QOS: DEFAULT_QOS, + CONF_TIMEOUT: 5, + CONF_UNIQUE_ID: unique_name, + } + }, + ) + await hass.async_block_till_done() + state = hass.states.get(SENSOR_STATE) + assert state.state is not None + + entity_registry = er.async_get(hass) + entry = entity_registry.async_get(SENSOR_STATE) + assert entry.unique_id == unique_name