From 87b83dcc1bc154f4d34749cef8639dd2a8ebb913 Mon Sep 17 00:00:00 2001 From: Jan Bouwhuis Date: Sat, 28 Feb 2026 20:12:23 +0100 Subject: [PATCH] Remove the MQTT `object_id` option after 6 months of deprecation (#164460) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../components/mqtt/abbreviations.py | 1 - homeassistant/components/mqtt/const.py | 1 - homeassistant/components/mqtt/entity.py | 56 +--- homeassistant/components/mqtt/schemas.py | 2 - homeassistant/components/mqtt/strings.json | 4 - tests/components/mqtt/test_discovery.py | 251 ------------------ tests/components/mqtt/test_mixins.py | 34 --- 7 files changed, 4 insertions(+), 345 deletions(-) diff --git a/homeassistant/components/mqtt/abbreviations.py b/homeassistant/components/mqtt/abbreviations.py index 22f725be4d65..338a15244b4d 100644 --- a/homeassistant/components/mqtt/abbreviations.py +++ b/homeassistant/components/mqtt/abbreviations.py @@ -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", diff --git a/homeassistant/components/mqtt/const.py b/homeassistant/components/mqtt/const.py index 7d601aad1fa6..8e8c5254289b 100644 --- a/homeassistant/components/mqtt/const.py +++ b/homeassistant/components/mqtt/const.py @@ -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}}" diff --git a/homeassistant/components/mqtt/entity.py b/homeassistant/components/mqtt/entity.py index 2b6f7237bfec..bd09f6517cf1 100644 --- a/homeassistant/components/mqtt/entity.py +++ b/homeassistant/components/mqtt/entity.py @@ -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 diff --git a/homeassistant/components/mqtt/schemas.py b/homeassistant/components/mqtt/schemas.py index 0d577a76d809..9e7307d2bc4f 100644 --- a/homeassistant/components/mqtt/schemas.py +++ b/homeassistant/components/mqtt/schemas.py @@ -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, } ) diff --git a/homeassistant/components/mqtt/strings.json b/homeassistant/components/mqtt/strings.json index a0688576dc09..a50c39aa5ea2 100644 --- a/homeassistant/components/mqtt/strings.json +++ b/homeassistant/components/mqtt/strings.json @@ -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" diff --git a/tests/components/mqtt/test_discovery.py b/tests/components/mqtt/test_discovery.py index cfa37cae62b1..edf7f490db2a 100644 --- a/tests/components/mqtt/test_discovery.py +++ b/tests/components/mqtt/test_discovery.py @@ -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, diff --git a/tests/components/mqtt/test_mixins.py b/tests/components/mqtt/test_mixins.py index 4f290b2d1b5e..785f564c19cc 100644 --- a/tests/components/mqtt/test_mixins.py +++ b/tests/components/mqtt/test_mixins.py @@ -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", [