Add unique id option for mqtt_room sensors (#82521)

Add unique_id setting for mqtt_room
This commit is contained in:
Jan Bouwhuis 2022-11-22 15:56:31 +01:00 committed by GitHub
parent 157222126e
commit 9c1e8486c5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 56 additions and 6 deletions

View file

@ -16,6 +16,7 @@ from homeassistant.const import (
CONF_DEVICE_ID, CONF_DEVICE_ID,
CONF_NAME, CONF_NAME,
CONF_TIMEOUT, CONF_TIMEOUT,
CONF_UNIQUE_ID,
STATE_NOT_HOME, STATE_NOT_HOME,
) )
from homeassistant.core import HomeAssistant, callback 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.Required(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int,
vol.Optional(CONF_AWAY_TIMEOUT, default=DEFAULT_AWAY_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_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_UNIQUE_ID): cv.string,
} }
).extend(mqtt.config.MQTT_RO_SCHEMA.schema) ).extend(mqtt.config.MQTT_RO_SCHEMA.schema)
@ -70,10 +72,11 @@ async def async_setup_platform(
[ [
MQTTRoomSensor( MQTTRoomSensor(
config.get(CONF_NAME), config.get(CONF_NAME),
config.get(CONF_STATE_TOPIC), config[CONF_STATE_TOPIC],
config.get(CONF_DEVICE_ID), config[CONF_DEVICE_ID],
config.get(CONF_TIMEOUT), config[CONF_TIMEOUT],
config.get(CONF_AWAY_TIMEOUT), config[CONF_AWAY_TIMEOUT],
config.get(CONF_UNIQUE_ID),
) )
] ]
) )
@ -82,8 +85,18 @@ async def async_setup_platform(
class MQTTRoomSensor(SensorEntity): class MQTTRoomSensor(SensorEntity):
"""Representation of a room sensor that is updated via MQTT.""" """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.""" """Initialize the sensor."""
self._attr_unique_id = unique_id
self._state = STATE_NOT_HOME self._state = STATE_NOT_HOME
self._name = name self._name = name
self._state_topic = f"{state_topic}/+" self._state_topic = f"{state_topic}/+"

View file

@ -5,7 +5,15 @@ from unittest.mock import patch
from homeassistant.components.mqtt import CONF_QOS, CONF_STATE_TOPIC, DEFAULT_QOS from homeassistant.components.mqtt import CONF_QOS, CONF_STATE_TOPIC, DEFAULT_QOS
import homeassistant.components.sensor as sensor 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.setup import async_setup_component
from homeassistant.util import dt 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 send_message(hass, BEDROOM_TOPIC, FAR_MESSAGE)
await assert_state(hass, BEDROOM) await assert_state(hass, BEDROOM)
await assert_distance(hass, 10) 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