Nach dem ich vor 2 Wochen auf ZHA umgestiegen bin, musste ich mich zwangsweise mit dem Thema Konfiguration von ZigBee Geräten unter ZHA ein wenig auseinander setzen. Dabei bin ich auf die Integration ZHA Toolkit aus dem HACS gestoßen. Und möchte euch gerne die Funktionsweise am Bsp. von Energie Report vorstellen.
Nach der Installation von ZHA Toolkit aus dem HACS ist noch ein Ertrag in der configuration,yaml notwendig
zha_toolkit:
Danach ein Home Assistant Neustart, damit die zha_toolkit Aktionen zur verfügung stehen.
Zuerst sollte man das jeweilige Gerät scannen, also die Abfrage nach verfügbaren Clustern durchführen. Aktion: zha_toolkit.scan_device
Das ganze in den Entwicklungswerkzeugen → Aktionen
Als Device Reference (ieee) gibt man einfach eine beliebige Entität des betroffenen Gerätes an.
Hier am Beispiel einer INNR Plugs SP120
action: zha_toolkit.scan_device
data:
ieee: switch.innr_garage
Das Ergebnis sieht dann so aus:
zha_toolkit_version: v1.1.33
zigpy_version: 0.87.0
zigpy_rf_version: 0.48.0
ieee_org: switch.innr_garage
ieee: 00:15:8d:00:03:41:7b:a1
command: scan_device
command_data: null
start_time: "2025-12-07T20:59:38.859478+00:00"
errors: []
params:
dir: 0
tries: 1
expect_reply: true
args: []
kwargs: {}
read_before_write: true
read_after_write: true
scan:
ieee: 00:15:8d:00:03:41:7b:a1
nwk: "0xe546"
model: SP 120
manufacturer: innr
manufacturer_id: "0x4454"
endpoints:
- id: 1
device_type: "0x0010"
profile: "0xc05e"
in_clusters:
"0x0000":
cluster_id: "0x0000"
title: Basic
name: basic
attributes: {}
commands_received: {}
commands_generated: {}
"0x0003":
cluster_id: "0x0003"
title: Identify
name: identify
attributes: {}
commands_received: {}
commands_generated: {}
"0x0004":
cluster_id: "0x0004"
title: Groups
name: groups
attributes: {}
commands_received: {}
commands_generated: {}
"0x0005":
cluster_id: "0x0005"
title: Scenes
name: scenes
attributes: {}
commands_received: {}
commands_generated: {}
"0x0006":
cluster_id: "0x0006"
title: On/Off
name: on_off
attributes: {}
commands_received: {}
commands_generated: {}
"0x0008":
cluster_id: "0x0008"
title: Level control
name: level
attributes: {}
commands_received: {}
commands_generated: {}
"0x000a":
cluster_id: "0x000a"
title: Time
name: time
attributes: {}
commands_received: {}
commands_generated: {}
"0x0702":
cluster_id: "0x0702"
title: MeteringClusterInnr
name: smartenergy_metering
attributes: {}
commands_received: {}
commands_generated: {}
"0x0b04":
cluster_id: "0x0b04"
title: Electrical Measurement
name: electrical_measurement
attributes: {}
commands_received: {}
commands_generated: {}
out_clusters:
"0x0003":
cluster_id: "0x0003"
title: Identify
name: identify
attributes: {}
commands_received: {}
commands_generated: {}
"0x000a":
cluster_id: "0x000a"
title: Time
name: time
attributes: {}
commands_received: {}
commands_generated: {}
"0x0019":
cluster_id: "0x0019"
title: Ota
name: ota
attributes: {}
commands_received: {}
commands_generated: {}
- id: 2
device_type: "0x1000"
profile: "0xc05e"
in_clusters:
"0x1000":
cluster_id: "0x1000"
title: LightLink
name: lightlink
attributes: {}
commands_received: {}
commands_generated: {}
out_clusters: {}
success: true
Dann sucht man sich das Richtige Cluster heraus. In dem Bespiel den Energie Report
"0x0702":
cluster_id: "0x0702"
title: MeteringClusterInnr
name: smartenergy_metering
attributes: {}
commands_received: {}
commands_generated: {}
Als nächstes kann man sich mit der Aktion zha_toolkit.conf_report_read die aktuelle Konfiguration ausgeben lassen. Cluster haben wir ja aus dem scan erhalten 0x0702 beim Attribute war try & error angesagt. Und schließlich habe ich einfach 0x0000 also einen 0 eingegeben. Da im UI-Modus nur dezimal Werte eingegeben werden können, muss man in den YAML-Modus wechseln um die Hexa-dezimal Werte eingeben zu können.
action: zha_toolkit.conf_report_read
data:
ieee: switch.innr_garage
endpoint: 1
cluster: 0x0702
attribute: 0x0000
Das Ergebnis:
zha_toolkit_version: v1.1.33
zigpy_version: 0.87.0
zigpy_rf_version: 0.48.0
ieee_org: switch.innr_garage
ieee: 00:15:8d:00:03:41:7b:a1
command: conf_report_read
command_data: null
start_time: "2025-12-07T21:14:11.146637+00:00"
errors: []
params:
endpoint_id: 1
cluster_id: 1794
attr_id: 0
dir: 0
tries: 1
expect_reply: true
args: []
kwargs: {}
read_before_write: true
read_after_write: true
success: true
result_conf:
- cluster: MeteringClusterInnr
cluster_id: "0x0702"
ep: 1
attr_id: "0x0000"
direction: 0
status: 0
type: "0x25"
min_interval:
- 60
max_interval:
- 1800
reportable_change:
- 255
attr: current_summ_delivered
Da wir nun wissen wie die aktuelle Konfiguration aussieht, können wir mit der Aktion zha_toolkit.conf_report diese nach unseren Bedürfnissen anpassen.
Als Bsp: Also wir ändern reportable_change auf den Wert 200
action: zha_toolkit.conf_report
data:
ieee: switch.innr_garage
endpoint: 1
cluster: 1794
attribute: 0
min_interval: 60
max_interval: 1800
reportable_change: 200
Wenn man jetzt erneut die Aktion zha_toolkit.conf_report_read ausführt, sollten nun die neu gesetzten Konfiguration Werte ausgelesen werden.
zha_toolkit_version: v1.1.33
zigpy_version: 0.87.0
zigpy_rf_version: 0.48.0
ieee_org: switch.innr_garage
ieee: 00:15:8d:00:03:41:7b:a1
command: conf_report_read
command_data: null
start_time: "2025-12-07T21:24:08.916076+00:00"
errors: []
params:
endpoint_id: 1
cluster_id: 1794
attr_id: 0
dir: 0
tries: 1
expect_reply: true
args: []
kwargs: {}
read_before_write: true
read_after_write: true
success: true
result_conf:
- cluster: MeteringClusterInnr
cluster_id: "0x0702"
ep: 1
attr_id: "0x0000"
direction: 0
status: 0
type: "0x25"
min_interval:
- 60
max_interval:
- 1800
reportable_change:
- 200
attr: current_summ_delivered
Zugegeben, ein wenig komplizierter als bei ZigBee2MQTT, aber auch kein Ding der Unmöglichkeit.
Somit lässt sich alles was ein Gerät an konfigurierbaren Cluster zur verfügung stellt auch nach belieben konfigurieren. ![]()
Hier Vollständigkeitshalber die Dokumentation von ZHA Toolkit. Diese Integration bietet weit mehr als nur die Möglichkeit der Geräte Konfiguration.
ZHA Toolkit
Gruß Osorkon