mirror of
https://github.com/home-assistant/core.git
synced 2026-09-24 15:31:52 -05:00
Remove the MQTT object_id option after 6 months of deprecation (#164460)
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -107,7 +107,6 @@ ABBREVIATIONS = {
|
||||
"modes": "modes",
|
||||
"name": "name",
|
||||
"o": "origin",
|
||||
"obj_id": "object_id",
|
||||
"off_dly": "off_delay",
|
||||
"on_cmd_type": "on_command_type",
|
||||
"ops": "options",
|
||||
|
||||
@@ -268,7 +268,6 @@ CONF_VIA_DEVICE = "via_device"
|
||||
CONF_DEPRECATED_VIA_HUB = "via_hub"
|
||||
CONF_SUGGESTED_AREA = "suggested_area"
|
||||
CONF_CONFIGURATION_URL = "configuration_url"
|
||||
CONF_OBJECT_ID = "object_id"
|
||||
CONF_SUPPORT_URL = "support_url"
|
||||
|
||||
DEFAULT_ALARM_CONTROL_PANEL_COMMAND_TEMPLATE = "{{action}}"
|
||||
|
||||
@@ -29,7 +29,6 @@ from homeassistant.const import (
|
||||
CONF_MODEL_ID,
|
||||
CONF_NAME,
|
||||
CONF_UNIQUE_ID,
|
||||
CONF_URL,
|
||||
CONF_VALUE_TEMPLATE,
|
||||
)
|
||||
from homeassistant.core import Event, HassJobType, HomeAssistant, callback
|
||||
@@ -84,8 +83,6 @@ from .const import (
|
||||
CONF_JSON_ATTRS_TEMPLATE,
|
||||
CONF_JSON_ATTRS_TOPIC,
|
||||
CONF_MANUFACTURER,
|
||||
CONF_OBJECT_ID,
|
||||
CONF_ORIGIN,
|
||||
CONF_PAYLOAD_AVAILABLE,
|
||||
CONF_PAYLOAD_NOT_AVAILABLE,
|
||||
CONF_QOS,
|
||||
@@ -1412,58 +1409,12 @@ class MqttEntity(
|
||||
"""Set entity_id from default_entity_id if defined in config."""
|
||||
object_id: str
|
||||
default_entity_id: str | None
|
||||
# Setting the default entity_id through the CONF_OBJECT_ID is deprecated
|
||||
# Support will be removed with HA Core 2026.4
|
||||
if (
|
||||
CONF_DEFAULT_ENTITY_ID not in self._config
|
||||
and CONF_OBJECT_ID not in self._config
|
||||
):
|
||||
return
|
||||
if (default_entity_id := self._config.get(CONF_DEFAULT_ENTITY_ID)) is None:
|
||||
object_id = self._config[CONF_OBJECT_ID]
|
||||
else:
|
||||
_, _, object_id = default_entity_id.partition(".")
|
||||
return
|
||||
_, _, object_id = default_entity_id.partition(".")
|
||||
self.entity_id = async_generate_entity_id(
|
||||
self._entity_id_format, object_id, None, self.hass
|
||||
)
|
||||
if CONF_OBJECT_ID in self._config:
|
||||
domain = self.entity_id.split(".")[0]
|
||||
if not self._discovery:
|
||||
async_create_issue(
|
||||
self.hass,
|
||||
DOMAIN,
|
||||
self.entity_id,
|
||||
issue_domain=DOMAIN,
|
||||
is_fixable=False,
|
||||
breaks_in_ha_version="2026.4",
|
||||
severity=IssueSeverity.WARNING,
|
||||
learn_more_url=f"{learn_more_url(domain)}#default_enity_id",
|
||||
translation_placeholders={
|
||||
"entity_id": self.entity_id,
|
||||
"object_id": self._config[CONF_OBJECT_ID],
|
||||
"domain": domain,
|
||||
},
|
||||
translation_key="deprecated_object_id",
|
||||
)
|
||||
elif CONF_DEFAULT_ENTITY_ID not in self._config:
|
||||
if CONF_ORIGIN in self._config:
|
||||
origin_name = self._config[CONF_ORIGIN][CONF_NAME]
|
||||
url = self._config[CONF_ORIGIN].get(CONF_URL)
|
||||
origin = f"[{origin_name}]({url})" if url else origin_name
|
||||
else:
|
||||
origin = "the integration"
|
||||
_LOGGER.warning(
|
||||
"The configuration for entity %s uses the deprecated option "
|
||||
"`object_id` to set the default entity id. Replace the "
|
||||
'`"object_id": "%s"` option with `"default_entity_id": '
|
||||
'"%s"` in your published discovery configuration to fix this '
|
||||
"issue, or contact the maintainer of %s that published this config "
|
||||
"to fix this. This will stop working in Home Assistant Core 2026.4",
|
||||
self.entity_id,
|
||||
self._config[CONF_OBJECT_ID],
|
||||
f"{domain}.{self._config[CONF_OBJECT_ID]}",
|
||||
origin,
|
||||
)
|
||||
|
||||
if self.unique_id is None:
|
||||
return
|
||||
@@ -1475,7 +1426,8 @@ class MqttEntity(
|
||||
(entity_platform, DOMAIN, self.unique_id)
|
||||
)
|
||||
) and deleted_entry.entity_id != self.entity_id:
|
||||
# Plan to update the entity_id basis on `object_id` if a deleted entity was found
|
||||
# Plan to update the entity_id based on `default_entity_id`
|
||||
# if a deleted entity was found
|
||||
self._update_registry_entity_id = self.entity_id
|
||||
|
||||
@final
|
||||
|
||||
@@ -42,7 +42,6 @@ from .const import (
|
||||
CONF_JSON_ATTRS_TEMPLATE,
|
||||
CONF_JSON_ATTRS_TOPIC,
|
||||
CONF_MANUFACTURER,
|
||||
CONF_OBJECT_ID,
|
||||
CONF_ORIGIN,
|
||||
CONF_PAYLOAD_AVAILABLE,
|
||||
CONF_PAYLOAD_NOT_AVAILABLE,
|
||||
@@ -173,7 +172,6 @@ MQTT_ENTITY_COMMON_SCHEMA = _MQTT_AVAILABILITY_SCHEMA.extend(
|
||||
vol.Optional(CONF_JSON_ATTRS_TOPIC): valid_subscribe_topic,
|
||||
vol.Optional(CONF_JSON_ATTRS_TEMPLATE): cv.template,
|
||||
vol.Optional(CONF_DEFAULT_ENTITY_ID): cv.string,
|
||||
vol.Optional(CONF_OBJECT_ID): cv.string,
|
||||
vol.Optional(CONF_UNIQUE_ID): cv.string,
|
||||
}
|
||||
)
|
||||
|
||||
@@ -1116,10 +1116,6 @@
|
||||
}
|
||||
},
|
||||
"issues": {
|
||||
"deprecated_object_id": {
|
||||
"description": "Entity {entity_id} uses the `object_id` option which is deprecated. To fix the issue, replace the `object_id: {object_id}` option with `default_entity_id: {domain}.{object_id}` in your \"configuration.yaml\", and restart Home Assistant.",
|
||||
"title": "Deprecated option object_id used"
|
||||
},
|
||||
"invalid_platform_config": {
|
||||
"description": "Home Assistant detected an invalid config for a manually configured item.\n\nPlatform domain: **{domain}**\nConfiguration file: **{config_file}**\nNear line: **{line}**\nConfiguration found:\n```yaml\n{config}\n```\nError: **{error}**.\n\nMake sure the configuration is valid and [reload](/config/developer-tools/yaml) the manually configured MQTT items or restart Home Assistant to fix this issue.",
|
||||
"title": "Invalid config found for MQTT {domain} item"
|
||||
|
||||
@@ -1330,257 +1330,6 @@ async def test_discover_alarm_control_panel(
|
||||
].discovery_already_discovered
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("topic", "config", "entity_id", "name", "domain", "deprecation_warning"),
|
||||
[
|
||||
(
|
||||
"homeassistant/alarm_control_panel/object/bla/config",
|
||||
'{ "name": "Hello World 1", "obj_id": "hello_id", "state_topic": "test-topic", "command_topic": "test-topic" }',
|
||||
"alarm_control_panel.hello_id",
|
||||
"Hello World 1",
|
||||
"alarm_control_panel",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/binary_sensor/object/bla/config",
|
||||
'{ "name": "Hello World 2", "obj_id": "hello_id", "state_topic": "test-topic" }',
|
||||
"binary_sensor.hello_id",
|
||||
"Hello World 2",
|
||||
"binary_sensor",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/button/object/bla/config",
|
||||
'{ "name": "Hello World button", "obj_id": "hello_id", "command_topic": "test-topic" }',
|
||||
"button.hello_id",
|
||||
"Hello World button",
|
||||
"button",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/camera/object/bla/config",
|
||||
'{ "name": "Hello World 3", "obj_id": "hello_id", "state_topic": "test-topic", "topic": "test-topic" }',
|
||||
"camera.hello_id",
|
||||
"Hello World 3",
|
||||
"camera",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/climate/object/bla/config",
|
||||
'{ "name": "Hello World 4", "obj_id": "hello_id", "state_topic": "test-topic" }',
|
||||
"climate.hello_id",
|
||||
"Hello World 4",
|
||||
"climate",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/cover/object/bla/config",
|
||||
'{ "name": "Hello World 5", "obj_id": "hello_id", "state_topic": "test-topic" }',
|
||||
"cover.hello_id",
|
||||
"Hello World 5",
|
||||
"cover",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/fan/object/bla/config",
|
||||
'{ "name": "Hello World 6", "obj_id": "hello_id", "state_topic": "test-topic", "command_topic": "test-topic" }',
|
||||
"fan.hello_id",
|
||||
"Hello World 6",
|
||||
"fan",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/humidifier/object/bla/config",
|
||||
'{ "name": "Hello World 7", "obj_id": "hello_id", "state_topic": "test-topic", "target_humidity_command_topic": "test-topic", "command_topic": "test-topic" }',
|
||||
"humidifier.hello_id",
|
||||
"Hello World 7",
|
||||
"humidifier",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/number/object/bla/config",
|
||||
'{ "name": "Hello World 8", "obj_id": "hello_id", "state_topic": "test-topic", "command_topic": "test-topic" }',
|
||||
"number.hello_id",
|
||||
"Hello World 8",
|
||||
"number",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/scene/object/bla/config",
|
||||
'{ "name": "Hello World 9", "obj_id": "hello_id", "state_topic": "test-topic", "command_topic": "test-topic" }',
|
||||
"scene.hello_id",
|
||||
"Hello World 9",
|
||||
"scene",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/select/object/bla/config",
|
||||
'{ "name": "Hello World 10", "obj_id": "hello_id", "state_topic": "test-topic", "options": [ "opt1", "opt2" ], "command_topic": "test-topic" }',
|
||||
"select.hello_id",
|
||||
"Hello World 10",
|
||||
"select",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/sensor/object/bla/config",
|
||||
'{ "name": "Hello World 11", "obj_id": "hello_id", "state_topic": "test-topic" }',
|
||||
"sensor.hello_id",
|
||||
"Hello World 11",
|
||||
"sensor",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/switch/object/bla/config",
|
||||
'{ "name": "Hello World 12", "obj_id": "hello_id", "state_topic": "test-topic", "command_topic": "test-topic" }',
|
||||
"switch.hello_id",
|
||||
"Hello World 12",
|
||||
"switch",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/light/object/bla/config",
|
||||
'{ "name": "Hello World 13", "obj_id": "hello_id", "state_topic": "test-topic", "command_topic": "test-topic" }',
|
||||
"light.hello_id",
|
||||
"Hello World 13",
|
||||
"light",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/light/object/bla/config",
|
||||
'{ "name": "Hello World 14", "obj_id": "hello_id", "state_topic": "test-topic", "command_topic": "test-topic", "schema": "json" }',
|
||||
"light.hello_id",
|
||||
"Hello World 14",
|
||||
"light",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/light/object/bla/config",
|
||||
'{ "name": "Hello World 15", "obj_id": "hello_id", "state_topic": "test-topic", "command_off_template": "template", "command_on_template": "template", "command_topic": "test-topic", "schema": "template" }',
|
||||
"light.hello_id",
|
||||
"Hello World 15",
|
||||
"light",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/vacuum/object/bla/config",
|
||||
'{ "name": "Hello World 16", "obj_id": "hello_id", "state_topic": "test-topic", "schema": "state" }',
|
||||
"vacuum.hello_id",
|
||||
"Hello World 16",
|
||||
"vacuum",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/valve/object/bla/config",
|
||||
'{ "name": "Hello World 17", "obj_id": "hello_id", "state_topic": "test-topic" }',
|
||||
"valve.hello_id",
|
||||
"Hello World 17",
|
||||
"valve",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/lock/object/bla/config",
|
||||
'{ "name": "Hello World 18", "obj_id": "hello_id", "state_topic": "test-topic", "command_topic": "test-topic" }',
|
||||
"lock.hello_id",
|
||||
"Hello World 18",
|
||||
"lock",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/device_tracker/object/bla/config",
|
||||
'{ "name": "Hello World 19", "obj_id": "hello_id", "state_topic": "test-topic" }',
|
||||
"device_tracker.hello_id",
|
||||
"Hello World 19",
|
||||
"device_tracker",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/binary_sensor/object/bla/config",
|
||||
'{ "name": "Hello World 2", "obj_id": "hello_id", '
|
||||
'"o": {"name": "X2mqtt"}, "state_topic": "test-topic" }',
|
||||
"binary_sensor.hello_id",
|
||||
"Hello World 2",
|
||||
"binary_sensor",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/button/object/bla/config",
|
||||
'{ "name": "Hello World button", "obj_id": "hello_id", '
|
||||
'"o": {"name": "X2mqtt", "url": "https://example.com/x2mqtt"}, '
|
||||
'"command_topic": "test-topic" }',
|
||||
"button.hello_id",
|
||||
"Hello World button",
|
||||
"button",
|
||||
True,
|
||||
),
|
||||
(
|
||||
"homeassistant/alarm_control_panel/object/bla/config",
|
||||
'{ "name": "Hello World 1", "def_ent_id": "alarm_control_panel.hello_id", '
|
||||
'"state_topic": "test-topic", "command_topic": "test-topic" }',
|
||||
"alarm_control_panel.hello_id",
|
||||
"Hello World 1",
|
||||
"alarm_control_panel",
|
||||
False,
|
||||
),
|
||||
(
|
||||
"homeassistant/binary_sensor/object/bla/config",
|
||||
'{ "name": "Hello World 2", "def_ent_id": "binary_sensor.hello_id", '
|
||||
'"o": {"name": "X2mqtt"}, "state_topic": "test-topic" }',
|
||||
"binary_sensor.hello_id",
|
||||
"Hello World 2",
|
||||
"binary_sensor",
|
||||
False,
|
||||
),
|
||||
(
|
||||
"homeassistant/button/object/bla/config",
|
||||
'{ "name": "Hello World button", "def_ent_id": "button.hello_id", '
|
||||
'"o": {"name": "X2mqtt", "url": "https://example.com/x2mqtt"}, '
|
||||
'"command_topic": "test-topic" }',
|
||||
"button.hello_id",
|
||||
"Hello World button",
|
||||
"button",
|
||||
False,
|
||||
),
|
||||
(
|
||||
"homeassistant/button/object/bla/config",
|
||||
'{ "name": "Hello World button", "def_ent_id": "button.hello_id", '
|
||||
'"obj_id": "hello_id_old", '
|
||||
'"o": {"name": "X2mqtt", "url": "https://example.com/x2mqtt"}, '
|
||||
'"command_topic": "test-topic" }',
|
||||
"button.hello_id",
|
||||
"Hello World button",
|
||||
"button",
|
||||
False,
|
||||
),
|
||||
],
|
||||
)
|
||||
async def test_discovery_with_object_id(
|
||||
hass: HomeAssistant,
|
||||
mqtt_mock_entry: MqttMockHAClientGenerator,
|
||||
caplog: pytest.LogCaptureFixture,
|
||||
topic: str,
|
||||
config: str,
|
||||
entity_id: str,
|
||||
name: str,
|
||||
domain: str,
|
||||
deprecation_warning: bool,
|
||||
) -> None:
|
||||
"""Test discovering an MQTT entity with object_id."""
|
||||
await mqtt_mock_entry()
|
||||
async_fire_mqtt_message(hass, topic, config)
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get(entity_id)
|
||||
|
||||
assert state is not None
|
||||
assert state.name == name
|
||||
assert (domain, "object bla") in hass.data["mqtt"].discovery_already_discovered
|
||||
|
||||
assert (
|
||||
f"The configuration for entity {domain}.hello_id uses the deprecated option `object_id`"
|
||||
in caplog.text
|
||||
) is deprecation_warning
|
||||
|
||||
|
||||
async def test_discovery_with_default_entity_id_for_previous_deleted_entity(
|
||||
hass: HomeAssistant,
|
||||
mqtt_mock_entry: MqttMockHAClientGenerator,
|
||||
|
||||
@@ -468,40 +468,6 @@ async def test_value_template_fails(
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"hass_config",
|
||||
[
|
||||
{
|
||||
mqtt.DOMAIN: {
|
||||
sensor.DOMAIN: {
|
||||
"name": "test",
|
||||
"state_topic": "test-topic",
|
||||
"object_id": "test",
|
||||
}
|
||||
}
|
||||
},
|
||||
],
|
||||
)
|
||||
async def test_deprecated_option_object_id_is_used_in_yaml(
|
||||
hass: HomeAssistant, mqtt_mock_entry: MqttMockHAClientGenerator
|
||||
) -> None:
|
||||
"""Test issue registry in case the deprecated option object_id was used in YAML."""
|
||||
await mqtt_mock_entry()
|
||||
await hass.async_block_till_done()
|
||||
|
||||
state = hass.states.get("sensor.test")
|
||||
assert state is not None
|
||||
|
||||
issue_registry = ir.async_get(hass)
|
||||
issue = issue_registry.async_get_issue(mqtt.DOMAIN, "sensor.test")
|
||||
assert issue is not None
|
||||
assert issue.translation_placeholders == {
|
||||
"entity_id": "sensor.test",
|
||||
"object_id": "test",
|
||||
"domain": "sensor",
|
||||
}
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"mqtt_config_subentries_data",
|
||||
[
|
||||
|
||||
Reference in New Issue
Block a user