-
-
Notifications
You must be signed in to change notification settings - Fork 29k
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
@@ -138,7 +138,9 @@ def remove_trigger_discovery_data( | |||
hass: HomeAssistant, discovery_hash: tuple[str, str] | |||
) -> None: | |||
"""Remove discovery data.""" | |||
del hass.data[DATA_MQTT].debug_info_triggers[discovery_hash] |
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.
Moved to #120430
discovery_data: DiscoveryInfoType | ||
|
||
|
||
def clear_discovery_hash(hass: HomeAssistant, discovery_hash: tuple[str, str]) -> None: | ||
"""Clear entry from already discovered list.""" | ||
hass.data[DATA_MQTT].discovery_already_discovered.remove(discovery_hash) |
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.
Moved to #120430
homeassistant/components/mqtt/tag.py
Outdated
@@ -180,5 +181,6 @@ async def async_tear_down(self) -> None: | |||
self._sub_state = subscription.async_unsubscribe_topics( | |||
self.hass, self._sub_state | |||
) | |||
if self.device_id: |
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.
Moved to #120430
ffd153b
to
51fda9a
Compare
Proposed change
Rework #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.
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
andbinary_sensor
.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
.In case a
node_id
is specified (e.g.node123
) in the device discovery topic ...... 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
discovery_id
for anmqtt
item must be the same. Migration is supported of the single topic id has anode_id
and aobject_id
. After migration theobject
id moves inside the discovery payload and the previousnode_id
becomes the newobject_id
of the device discovery topic.The config to migrate to must have a
migrate_discovery
config option set toTrue
. This will allow clearing the migrated discovery topics without removing them. So"migrate_discovery": true
needs to be added to the JSON discovery payload(s) to migrate to. Migration is supported in both directions.Example (device automation):
Discovery topic single:
homeassistant/device_automation/0AFFD2/bla/config
Discovery id:
0AFFD2 bla
Discovery payload single:
Migrated:
Discovery topic device:
homeassistant/device/0AFFD2/config
Discovery id:
0AFFD2 bla
Discovery payload device:
If the new device discovery payload has the same
discovery_id
and comes after the single discovery payload. Home Assistant will publishNone
(retained) to the single discovery payload to remove it.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: