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:

Zigbee2mqtt Integration in Home Assistant

   

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

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page