Skip to content

Pass device options to HA discovery overrides#32379

Merged
Koenkk merged 1 commit into
Koenkk:devfrom
MaxRink:ha-discovery-override-options
Jun 25, 2026
Merged

Pass device options to HA discovery overrides#32379
Koenkk merged 1 commit into
Koenkk:devfrom
MaxRink:ha-discovery-override-options

Conversation

@MaxRink

@MaxRink MaxRink commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Summary

  • call entity.definition?.meta?.overrideHaDiscoveryPayload?.(payload, entity.options) directly when publishing Home Assistant discovery
  • remove the local Zigbee2MQTT-side type redeclaration for the converter hook
  • add a focused regression proving a device option reaches the override and affects the retained discovery payload

Why

Some converter-level HA discovery overrides need to be configurable per device. For example, Koenkk/zigbee-herdsman-converters#12498 adds a Bosch RM230Z option that defaults HA climate discovery to heating-only but can explicitly expose cool or heat_cool where an installation really supports cooling.

The hook signature itself belongs in zigbee-herdsman-converters, not Zigbee2MQTT. The matching converter type update is split into Koenkk/zigbee-herdsman-converters#12526.

Dependency

Validation

  • node --run build
  • node --run check
  • vitest run test/extensions/homeassistant.test.ts --config ./test/vitest.config.mts -t "passes device options"
  • git diff --check

Live validation

On my Home Assistant instance, the running Zigbee2MQTT override already had this option-passing hook. I temporarily changed Arbeitszimmer Thermostat from homeassistant_climate_modes: heat to heat_cool through zigbee2mqtt/bridge/request/device/options and verified retained HA discovery changed from modes: ["off", "heat", "auto"] to modes: ["off", "heat", "cool", "auto"] with active_modes = ['heat','cool']. I then reverted the option to heat and verified retained discovery returned to modes: ["off", "heat", "auto"].

Comment thread lib/extension/homeassistant.ts Outdated
if (entity.isDevice()) {
try {
entity.definition?.meta?.overrideHaDiscoveryPayload?.(payload);
const overrideHaDiscoveryPayload = entity.definition?.meta?.overrideHaDiscoveryPayload as

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should not be type-asserting this.

@MaxRink MaxRink force-pushed the ha-discovery-override-options branch from f412da9 to 79c5928 Compare June 23, 2026 09:38
Comment thread lib/extension/homeassistant.ts Outdated
entity.definition?.meta?.overrideHaDiscoveryPayload?.(payload);
const overrideHaDiscoveryPayload = entity.definition?.meta?.overrideHaDiscoveryPayload;
if (overrideHaDiscoveryPayload) {
Reflect.apply(overrideHaDiscoveryPayload, undefined, [payload, entity.options]);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

??

Comment thread lib/extension/homeassistant.ts Outdated
Comment on lines +1853 to +1854
const overrideHaDiscoveryPayload: HaDiscoveryPayloadOverride | undefined = entity.definition?.meta?.overrideHaDiscoveryPayload;
overrideHaDiscoveryPayload?.(payload, entity.options);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why all this stuff? It should not override or redeclare types from ZHC at all.

Suggested change
const overrideHaDiscoveryPayload: HaDiscoveryPayloadOverride | undefined = entity.definition?.meta?.overrideHaDiscoveryPayload;
overrideHaDiscoveryPayload?.(payload, entity.options);
entity.definition?.meta?.overrideHaDiscoveryPayload?.(payload, entity.options);

(Of course, this requires update on ZHC side)

Comment thread lib/extension/homeassistant.ts Outdated
if (entity.isDevice()) {
try {
entity.definition?.meta?.overrideHaDiscoveryPayload?.(payload);
// @ts-expect-error Keep the type owned by ZHC; see Koenkk/zigbee-herdsman-converters#12526.

@Nerivec Nerivec Jun 23, 2026

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this. This is expected to fail, ZHC will need to be updated for CI to pass.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know, thats why the PR currently is still marked as draft

@MaxRink MaxRink force-pushed the ha-discovery-override-options branch from 919905e to 4ce6f93 Compare June 23, 2026 18:44
@MaxRink MaxRink marked this pull request as ready for review June 23, 2026 19:11
@Koenkk Koenkk merged commit 814552a into Koenkk:dev Jun 25, 2026
11 checks passed
@Koenkk

Koenkk commented Jun 25, 2026

Copy link
Copy Markdown
Owner

thanks!

ajgon pushed a commit to deedee-ops/home-ops that referenced this pull request Jul 1, 2026
…2.1) (#200)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/koenkk/zigbee2mqtt](https://github.com/Koenkk/zigbee2mqtt) | patch | `2.12.0` → `2.12.1` |

---

### Release Notes

<details>
<summary>Koenkk/zigbee2mqtt (ghcr.io/koenkk/zigbee2mqtt)</summary>

### [`v2.12.1`](https://github.com/Koenkk/zigbee2mqtt/blob/HEAD/CHANGELOG.md#2121-2026-06-30)

[Compare Source](Koenkk/zigbee2mqtt@2.12.0...2.12.1)

##### Bug Fixes

- Add `mqtt.server_name` option to override TLS SNI ([#&#8203;32417](Koenkk/zigbee2mqtt#32417)) ([2f26083](Koenkk/zigbee2mqtt@2f26083))
- Docker: bump alpine from 3.23 to 3.24 ([#&#8203;32311](Koenkk/zigbee2mqtt#32311)) ([758a80b](Koenkk/zigbee2mqtt@758a80b))
- Home Assistant: add conductivity discovery for soil\_fertility ([#&#8203;32356](Koenkk/zigbee2mqtt#32356)) ([29ee3a7](Koenkk/zigbee2mqtt@29ee3a7))
- Home Assistant: allow discovery user overrides to win over converter ([#&#8203;32361](Koenkk/zigbee2mqtt#32361)) ([20ab0a2](Koenkk/zigbee2mqtt@20ab0a2))
- Home Assistant: apply expose-level Home Assistant discovery metadata ([#&#8203;32380](Koenkk/zigbee2mqtt#32380)) ([0140708](Koenkk/zigbee2mqtt@0140708))
- Home Assistant: mark device settings as config ([#&#8203;32439](Koenkk/zigbee2mqtt#32439)) ([e8a7e6f](Koenkk/zigbee2mqtt@e8a7e6f))
- Home Assistant: mark legacy action sensors diagnostic ([#&#8203;32377](Koenkk/zigbee2mqtt#32377)) ([72be1d7](Koenkk/zigbee2mqtt@72be1d7))
- Home Assistant: mark thermostat configuration switches as config ([#&#8203;32378](Koenkk/zigbee2mqtt#32378)) ([98a0f94](Koenkk/zigbee2mqtt@98a0f94))
- Home Assistant: pass device options to HA discovery overrides ([#&#8203;32379](Koenkk/zigbee2mqtt#32379)) ([814552a](Koenkk/zigbee2mqtt@814552a))
- Home Assistant: support cooling setpoint in climate discovery ([#&#8203;32411](Koenkk/zigbee2mqtt#32411)) ([0018ca8](Koenkk/zigbee2mqtt@0018ca8))
- Home Assistant: unit conversion for derived weather sensors by restoring device\_class with name preservation ([#&#8203;32392](Koenkk/zigbee2mqtt#32392)) ([7775ac5](Koenkk/zigbee2mqtt@7775ac5))
- **ignore:** bump actions/cache from 5 to 6 ([#&#8203;32394](Koenkk/zigbee2mqtt#32394)) ([280442b](Koenkk/zigbee2mqtt@280442b))
- **ignore:** bump actions/checkout from 6 to 7 ([#&#8203;32368](Koenkk/zigbee2mqtt#32368)) ([679436e](Koenkk/zigbee2mqtt@679436e))
- **ignore:** bump js-yaml from 4.2.0 to 5.0.0 ([#&#8203;32371](Koenkk/zigbee2mqtt#32371)) ([262139a](Koenkk/zigbee2mqtt@262139a))
- **ignore:** bump semver from 7.8.4 to 7.8.5 in the minor-patch group ([#&#8203;32369](Koenkk/zigbee2mqtt#32369)) ([9a7cac1](Koenkk/zigbee2mqtt@9a7cac1))
- **ignore:** bump the minor-patch group with 3 updates ([#&#8203;32312](Koenkk/zigbee2mqtt#32312)) ([719de7a](Koenkk/zigbee2mqtt@719de7a))
- **ignore:** update zigbee-herdsman to 10.4.1 ([#&#8203;32333](Koenkk/zigbee2mqtt#32333)) ([2f44449](Koenkk/zigbee2mqtt@2f44449))
- **ignore:** update zigbee-herdsman to 10.4.2 ([#&#8203;32388](Koenkk/zigbee2mqtt#32388)) ([628f97f](Koenkk/zigbee2mqtt@628f97f))
- **ignore:** update zigbee-herdsman to 10.5.0 ([#&#8203;32406](Koenkk/zigbee2mqtt#32406)) ([6ab52df](Koenkk/zigbee2mqtt@6ab52df))
- **ignore:** update zigbee-herdsman to 10.6.0 ([#&#8203;32422](Koenkk/zigbee2mqtt#32422)) ([dcb16b8](Koenkk/zigbee2mqtt@dcb16b8))
- **ignore:** update zigbee-herdsman to 10.6.1 ([#&#8203;32442](Koenkk/zigbee2mqtt#32442)) ([f867694](Koenkk/zigbee2mqtt@f867694))
- **ignore:** update zigbee-herdsman-converters to 26.64.0 ([#&#8203;32282](Koenkk/zigbee2mqtt#32282)) ([a68419f](Koenkk/zigbee2mqtt@a68419f))
- **ignore:** update zigbee-herdsman-converters to 26.65.0 ([#&#8203;32298](Koenkk/zigbee2mqtt#32298)) ([f4f97d1](Koenkk/zigbee2mqtt@f4f97d1))
- **ignore:** update zigbee-herdsman-converters to 26.66.0 ([#&#8203;32315](Koenkk/zigbee2mqtt#32315)) ([299b9e6](Koenkk/zigbee2mqtt@299b9e6))
- **ignore:** update zigbee-herdsman-converters to 26.67.0 ([#&#8203;32334](Koenkk/zigbee2mqtt#32334)) ([95c67c0](Koenkk/zigbee2mqtt@95c67c0))
- **ignore:** update zigbee-herdsman-converters to 26.68.0 ([#&#8203;32340](Koenkk/zigbee2mqtt#32340)) ([1de8609](Koenkk/zigbee2mqtt@1de8609))
- **ignore:** update zigbee-herdsman-converters to 26.69.0 ([#&#8203;32350](Koenkk/zigbee2mqtt#32350)) ([0377f96](Koenkk/zigbee2mqtt@0377f96))
- **ignore:** update zigbee-herdsman-converters to 26.70.0 ([#&#8203;32357](Koenkk/zigbee2mqtt#32357)) ([c6e7d2d](Koenkk/zigbee2mqtt@c6e7d2d))
- **ignore:** update zigbee-herdsman-converters to 26.71.0 ([#&#8203;32375](Koenkk/zigbee2mqtt#32375)) ([8768952](Koenkk/zigbee2mqtt@8768952))
- **ignore:** update zigbee-herdsman-converters to 26.72.0 ([#&#8203;32387](Koenkk/zigbee2mqtt#32387)) ([b58503b](Koenkk/zigbee2mqtt@b58503b))
- **ignore:** update zigbee-herdsman-converters to 26.73.0 ([#&#8203;32407](Koenkk/zigbee2mqtt#32407)) ([8d5fdad](Koenkk/zigbee2mqtt@8d5fdad))
- **ignore:** update zigbee-herdsman-converters to 26.74.0 ([#&#8203;32420](Koenkk/zigbee2mqtt#32420)) ([31fb3a6](Koenkk/zigbee2mqtt@31fb3a6))
- **ignore:** update zigbee-herdsman-converters to 26.75.0 ([#&#8203;32431](Koenkk/zigbee2mqtt#32431)) ([3760e63](Koenkk/zigbee2mqtt@3760e63))
- **ignore:** update zigbee-herdsman-converters to 26.76.0 ([#&#8203;32441](Koenkk/zigbee2mqtt#32441)) ([740de2d](Koenkk/zigbee2mqtt@740de2d))
- improve zigbee2mqtt maintenance path ([#&#8203;32255](Koenkk/zigbee2mqtt#32255)) ([ced6d93](Koenkk/zigbee2mqtt@ced6d93))
- Republish bridge/state online when HA comes online ([#&#8203;32258](Koenkk/zigbee2mqtt#32258)) ([a81e90b](Koenkk/zigbee2mqtt@a81e90b))

</details>

---

### Configuration

📅 **Schedule**: (in timezone Europe/Warsaw)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about these updates again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNDkuMyIsInVwZGF0ZWRJblZlciI6IjQzLjI0OS4zIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbInJlbm92YXRlL2NvbnRhaW5lciIsInR5cGUvcGF0Y2giXX0=-->

Reviewed-on: https://git.ajgon.casa/deedee/mark13/pulls/200
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants