-
-
Notifications
You must be signed in to change notification settings - Fork 30.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow MQTT device based auto discovery #118757
base: dev
Are you sure you want to change the base?
Conversation
Hey there @emontnemery, @bdraco, mind taking a look at this pull request as it has been labeled with an integration ( Code owner commandsCode owners of
|
Since this is difficult to read for someone not involved. Does this still support specifying topics device-wide (ie. same for all entities), and then overriding them on a per-entity basis if required? |
Effectively the PR is the same is the previous PR, but we love to seem some test results. We will try to update this branch as good as possible. A documentation PR is linked. |
9d516dd
to
317bb4b
Compare
bdb0bf7
to
85d2546
Compare
ffd153b
to
51fda9a
Compare
fbc9829
to
d23973b
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There is a merge conflict.
Please take a look at the requested changes, and use the Ready for review button when you are done, thanks 👍 |
5c7ee65
to
b280d9a
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A few nits to pick.
@pytest.fixture | ||
def tag_mock() -> Generator[AsyncMock]: | ||
"""Fixture to mock tag.""" | ||
with patch("homeassistant.components.tag.async_scan_tag") as mock_tag: | ||
yield mock_tag | ||
|
||
|
||
@pytest.mark.no_fail_on_log_exception |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This was moved because the fixture was needed for some added discovery tests with device-based discovery
@@ -1197,7 +1197,6 @@ async def test_mqtt_ws_get_device_debug_info( | |||
} | |||
data_sensor = json.dumps(config_sensor) | |||
data_trigger = json.dumps(config_trigger) | |||
config_sensor["platform"] = config_trigger["platform"] = mqtt.DOMAIN |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This key is no longer added, see:
https://github.com/home-assistant/core/pull/118757/files#diff-189ecd07b98c2a9602a647f97dfe63e919c95af2d3856701044958b230591ef1L274
@@ -1254,7 +1253,6 @@ async def test_mqtt_ws_get_device_debug_info_binary( | |||
"unique_id": "unique", | |||
} | |||
data = json.dumps(config) | |||
config["platform"] = mqtt.DOMAIN |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The platform
is is no longer added to the discovery message, see:
https://github.com/home-assistant/core/pull/118757/files#diff-189ecd07b98c2a9602a647f97dfe63e919c95af2d3856701044958b230591ef1L274
Proposed change
Rework of #109030 which introduces a new device based MQTT discovery schema.
The original PR was reverted during the beta of HA Core 2024.6.0. With PR and branch we aim to test and optimize large MQTT setups that run via MQTT discovery.
The new device based discovery payload allows multiple
mqtt
components to set up with one configuration payload.Context
The current MQTT discovery model only allows to setup per component, if a device has multiple entities to published, the device context, availability and origin information needs to be duplicated.
This PR reduces IO overhead in the paho client on processing discovery packages: The baseline was 10000 packets, with device discovery it 6250 packet reads so a 37.5% reduction in I/O. Processing less I/O reduced the paho client run time by ~18%. The grouped discovery reduced the run time in the HA client by ~12%.
This PR adds a way to discover all components for a device with one discovery. The device, availability and origin mapping is only submitted once. Also the following options are allowed in the shared context:
state_topic
command_topic
encoding
qos
Except for
device
andorigin
options, supported shared options can be overridden in the component config.Discovery updates and removal is fully supported.
The device based discovery coexists with the component based discovery, so no deprecation is planned for discovery with the single component schema to guarantee older devices keep working.
Example
The example below is of a device based auto discovery that supplies a
sensor
, abinary_sensor
and atag
.Discovery topic:
Payload:
Note that a required
platform
option is added to identify the component platform. The keys under thecomponents
(abbreviatedcmp
), are treated asobject_id
and are used to create a unique devicediscovery_id
. In this case thediscover_id's
aretest123 bins1
andtest123 sens1
.For entity components defined in the device based configuration payload the
unique_id
is required.... this will become part of the
object_id
.The
discovery_id
's becometest123 node123 bins1
andtest123 node123 sens1
.Migration from single topic to device based discovery
To allow a smooth migration from single topic discovery to device based discovery, the single platform platform discovery configs must have a
unique_id
anddevice
config. Note that migration is only supported if the entities in the device based payload have the sameunique_id
anddevice
identifier.To allow a take over via the device based discovery all included items must be made ready for migration first by publishing the
{"migrate_discovery": true }
payload to the existing platform based discovery topics. This will allow migration and clearing the migrated discovery topics without removing the registry settings with possible customization's. Migration is supported in both directions. When a rollback is intended{"migrate_discovery": true }
is to be published to the device based discovery topic, and then included components can be migrated back to single component discovery topics.Example (device automation and 2 sensors):
Discovery topic single:
homeassistant/device_automation/0AFFD2/bla1/config
Discovery id:
0AFFD2 bla1
Discovery payload single:
Discovery topic single:
homeassistant/sensor/0AFFD2/bla2/config
Discovery id:
0AFFD2 bla2
Discovery payload single:
Migrate to a one device config discovery payload:
First enable discovery migration:
Publish:
To the topics:
homeassistant/device_automation/0AFFD2/bla1/config
homeassistant/sensor/0AFFD2/bla2/config
Now the new device based discovery payload must be send to migrate the discovery topic.
Discovery topic device:
homeassistant/device/0AFFD2/config
Discovery id:
0AFFD2
Discovery payload device:
Note that in this example the
node_id
becomes theobject_id
in the device based discovery topic, and theobject_id
from the single component is placed as a key under thecomponents
(cmp
) key. Thedevice
part is now shared and all entities have aunique_id
.The source integration, responsible for the entities and the migration, is also responsible for cleaning up the old discovery topics after the migration has been completed. This the source integration should publish empty payloads to the old configuration topics, if these topic are retained. Note that retained configs must be cleared with a retained empty payload.
In the example a retained empty payload is to be published to the topics:
homeassistant/device_automation/0AFFD2/bla1/config
homeassistant/sensor/0AFFD2/bla2/config
Removing the device or components
Updating works the same as with single component based discovery.
To remove all components at once a (retained) empty payload must be send to the discovery topic
homeassistant/device/0AFFD2/config
.To remove a component from an existing example configuration, only the
platform
key must be specified.To remove the
device_automation
component from the the example discover publish:Type of change
Additional information
Checklist
ruff format homeassistant tests
)If user exposed functionality or configuration variables are added/changed:
If the code communicates with devices, web services, or third-party tools:
Updated and included derived files by running:
python3 -m script.hassfest
.requirements_all.txt
.Updated by running
python3 -m script.gen_requirements_all
..coveragerc
.To help with the load of incoming pull requests: