Zigbee2mqtt absichern und in Home Assistant einbinden
Nachdem die Installation und Grundkonfiguration von Zigbee2mqtt erfolgreich war, sollte nun ein "Feintuning" der Zigbee2mqtt Konfiguration erfolgen. Eine Übersicht aller Konfigurationsparameter ist auf zigbee2mqtt.io zu finden.
Zigbee-Netzwerk absichern
Zur Absicherung des Zigbee-Netzwerks, sollten im Abschnitt advanced:
in der Datei data/configuration.yaml
mindestens folgende Werte angepasst werden:
# Optional: advanced settings
advanced:
# Optional: ZigBee pan ID (default: shown below)
pan_id: 0x1a62
# Optional: Zigbee extended pan ID (default: shown below)
ext_pan_id: [0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD, 0xDD]
# Optional: network encryption key, will improve security (Note: changing requires repairing of all devices) (default: shown below)
network_key: [1, 3, 5, 7, 9, 11, 13, 15, 0, 2, 4, 6, 8, 10, 12, 13]
# Optional: ZigBee channel, changing requires re-pairing of all devices. (Note: use a ZLL channel: 11, 15, 20, or 25 to avoid Problems)
# (default: 11)
channel: 11
Eine zufällige Extended PAN IS kann auf den meisten Linux-Systemen mit einem Befehl erstellt werden:
dd if=/dev/urandom bs=1 count=8 2>/dev/null | od -A n -t u1 | awk '{printf "["} {for(i = 1; i< NF; i++) {printf "%s, ", $i}} {printf "%s]\n", $NF}'
zum Generieren eines Netzwerkschlüssels kann folgendes Kommando genutzt werden:
dd if=/dev/urandom bs=1 count=16 2>/dev/null | od -A n -t u1 | awk '{printf "["} {for(i = 1; i< NF; i++) {printf "%s, ", $i}} {printf "%s]\n", $NF}'
Zigbee-Kanal wählen
Damit Zigbee zuverlässig funktioniert, macht es Sinn sich etwas Gedanken über den zu verwendenden Zigbee-Kanal zu machen. Vor allem da ein späterer Wechsel Zigbee-Kanal ein Re-Pairing aller Zigbee-Devices nach sich zieht.
In dem Artikel ZigBee and WiFi Coexistence auf metageek.com werden die technischen Grundlagen gut beschrieben. Quintessenz des Artikels: WiFi und Zigbee verwenden teilweise die gleichen Frequenzen im 2,4GHz Bereich. Es sollte für das Zigbee-Netzwerk daher ein Kanal verwendet werden, der möglichst wenig Überlagerungen mit den umliegenden WiFi-Netzwerken hat.
Für das Smartphone gibt es eine Vielzahl von Apps mit denen man sich die Belegung der WiFi-Kanäle anschauen kann. Ich habe gute Erfahrungen mit der OpenSource-Lösung WiFiAnalyzer gemacht. Die App kann sowohl aus dem Google PlayStore als auch über F-Droid installiert werden.
Das Ergebnis meiner Analyse war nicht sonderlich erbaulich. Alle 2,4 GHz Kanäle sind durch benachbarte WLANs ziemlich ausgebucht. Da sich die Kanäle der benachbarten WLANs aber jeder Zeit ändern können und ich darauf sowieso keinen Einfluss nehmen kann, bleibt also nur die Optimierung der eigenen WLAN-Infrastruktur. Ich habe für mich beschlossen den Kanal 25 zu verwenden, und gleichzeitig dafür zu sorgen, dass meine Unifi-APs den WiFi-Kanal 11 nicht mehr benutzen, damit es möglichst wenig Interferenzen gibt. Ob diese Rechnung aufgeht wird sich zeigen...
Home Assistant einrichten
Die Einbindung in Home Assistant ist denkbar einfach. Es muss lediglich sichergestellt werden, dass in der Home Assistant configuration.yaml
im Abschnitt mqtt:
das Device Discovery aktiviert wurde. Zusätzlich sollten noch eine sogenannte Birth
und Will
Message von Home Assistant gesetzt werden, so dass Zigbee2mqtt mitbekommt, wenn Home Assistant neu gestartet wird. Auf diese Weise können die von Zigbee2mqtt zwischengespeicherte Werte erneut an Home Assistant gesendet werden, wenn es neu gestartet wurde.
mqtt:
[...]
discovery: true
birth_message:
topic: 'hass/status'
payload: 'online'
will_message:
topic: 'hass/status'
payload: 'offline'
Zigbee2mqtt von Home Assistant aus steuern
Damit die wichtigsten Einstellungen für Zigbee2mqtt auch von Home Assistant aus durchgeführt werden können, müssen einige Controls in Home Assistant eingerichtet werden. Damit die zentrale Konfigurationsdatei halbwegs überschaubar bleibt habe ich die Konfigurationsänderungen in einem Package zusammengefasst. Dazu muss im Verzeichnis der Home Assistant Installation in dem auch die Datei configuration.yaml
liegt zunächst ein Unterverzeichnis packages
angelegt werden.
Dann muss sichergestellt werden, dass im Abschnitt homeassistant:
die Packages aktiviert werden. Mit folgender Anweisung werden alle YAML-Dateien im Verzeichnis packages
beim Start von Home Assistant inkludiert:
# Include all packages in packages/
packages: !include_dir_named packages
Jetzt wird in dem Verzeichnis packages
die Datei zigbee2mqtt.yaml
angelegt:
cat <<\EOF > packages/zigbee2mqtt.yaml
# Input select for Zigbee2mqtt debug level
input_select:
zigbee2mqtt_log_level:
name: Zigbee2mqtt Log Level
options:
- debug
- info
- warn
- error
initial: info
icon: mdi:format-list-bulleted
# Input text to input Zigbee2mqtt friendly_name for scripts
input_text:
zigbee2mqtt_old_name:
name: Zigbee2mqtt Old Name
zigbee2mqtt_new_name:
name: Zigbee2mqtt New Name
zigbee2mqtt_remove:
name: Zigbee2mqtt Remove
# Scripts for renaming & removing devices
script:
zigbee2mqtt_rename:
alias: Zigbee2mqtt Rename
sequence:
service: mqtt.publish
data_template:
topic: zigbee2mqtt/bridge/config/rename
payload_template: >-
{
"old": "{{ states.input_text.zigbee2mqtt_old_name.state | string }}",
"new": "{{ states.input_text.zigbee2mqtt_new_name.state | string }}"
}
zigbee2mqtt_remove:
alias: Zigbee2mqtt Remove
sequence:
service: mqtt.publish
data_template:
topic: zigbee2mqtt/bridge/config/remove
payload_template: "{{ states.input_text.zigbee2mqtt_remove.state | string }}"
# Timer for joining time remaining (120 sec = 2 min)
timer:
zigbee_permit_join:
name: Time remaining
duration: 120
sensor:
# Sensor for monitoring the bridge state
- platform: mqtt
name: Zigbee2mqtt Bridge state
state_topic: "zigbee2mqtt/bridge/state"
icon: mdi:router-wireless
# Sensor for Showing the Zigbee2mqtt Version
- platform: mqtt
name: Zigbee2mqtt Version
state_topic: "zigbee2mqtt/bridge/config"
value_template: "{{ value_json.version }}"
icon: mdi:zigbee
# Sensor for Showing the Coordinator Version
- platform: mqtt
name: Coordinator Version
state_topic: "zigbee2mqtt/bridge/config"
value_template: "{{ value_json.coordinator }}"
icon: mdi:chip
# Switch for enabling joining
switch:
- platform: mqtt
name: "Zigbee2mqtt Main join"
state_topic: "zigbee2mqtt/bridge/config/permit_join"
command_topic: "zigbee2mqtt/bridge/config/permit_join"
payload_on: "true"
payload_off: "false"
automation:
# Automation for sending MQTT message on input select change
- alias: Zigbee2mqtt Log Level
initial_state: "on"
trigger:
platform: state
entity_id: input_select.zigbee2mqtt_log_level
action:
- service: mqtt.publish
data:
payload_template: "{{ states('input_select.zigbee2mqtt_log_level') }}"
topic: zigbee2mqtt/bridge/config/log_level
# Automation to start timer when enable join is turned on
- id: zigbee_join_enabled
alias: Zigbee Join Enabled
trigger:
platform: state
entity_id: switch.zigbee2mqtt_main_join
to: "on"
action:
service: timer.start
entity_id: timer.zigbee_permit_join
# Automation to stop timer when switch turned off and turn off switch when timer finished
- id: zigbee_join_disabled
alias: Zigbee Join Disabled
trigger:
- platform: event
event_type: timer.finished
event_data:
entity_id: timer.zigbee_permit_join
- platform: state
entity_id: switch.zigbee2mqtt_main_join
to: "off"
action:
- service: timer.cancel
data:
entity_id: timer.zigbee_permit_join
- service: switch.turn_off
entity_id: switch.zigbee2mqtt_main_join
- id: "zigbee2mqtt_create_notification_on_successfull_interview"
trigger:
platform: mqtt
topic: 'zigbee2mqtt/bridge/log'
condition:
condition: template
value_template: '{{trigger.payload_json.type == "pairing" and trigger.payload_json.message == "interview_successful"}}'
action:
- service: persistent_notification.create
data_template:
title: Device joined the zigbee2mqtt network
message: "Name: {{trigger.payload_json.meta.friendly_name}},
Vendor: {{trigger.payload_json.meta.vendor}},
Description: {{trigger.payload_json.meta.description}}"
EOF
Nach einem Neustart von Home Assistant sollten die Geräte nun bereit für die Integration in Lovelace sein.
In einer beliebigen Lovelace-Ansicht können die soeben erzeugten Elemente als Karte eingebunden werden. Dazu auf der entsprechenden Karte über das Menü oben rechts den Punkt "Benutzeroberfläche konfigurieren" auswählen. Dann kann über das Runde Plus-Zeichen eine neue Karte hinzugefügt werden. In dem Dialog wird ganz unten der Punkt "Manuell" ausgewählt und dort der folgende YAML-Code eingetragen:
title: Zigbee2mqtt
type: entities
show_header_toggle: false
entities:
- entity: sensor.zigbee2mqtt_bridge_state
- entity: sensor.zigbee2mqtt_version
- entity: sensor.coordinator_version
- entity: input_select.zigbee2mqtt_log_level
- type: divider
- entity: switch.zigbee2mqtt_main_join
- entity: timer.zigbee_permit_join
- type: divider
- entity: input_text.zigbee2mqtt_old_name
- entity: input_text.zigbee2mqtt_new_name
- entity: script.zigbee2mqtt_rename
- type: divider
- entity: input_text.zigbee2mqtt_remove
- entity: script.zigbee2mqtt_remove
Wenn alles geklappt hat, sollte es ungefähr so aussehen:
Quellen
[1] Zigbee2mqtt Documentation - Configuration
[2] metageek.com - ZigBee and WiFi Coexistence
[3] Zigbee2mqtt Documentation - Home Assistant
[2] https://github.com/azuwis/zigbee2mqtt-networkmap/
Kommentare