Themen dieses Kurses

  • Übersicht

    Der im Rahmen des Themenabends durchgeführte Kurs erklärt die ersten Schritte der Einrichtung und Konfiguration einer ZigBee basierten Homeautomation. Dabei geht es nicht darum bestehende - kommerzielle - Gateways zur Verwaltung von ZigBee Geräten einzusetzen, sondern auf einem RaspberryPi oder ähnlichen Rechnern unter Linux ein Gateway zusammen mit einem CC2531 Netzwerksniffer aufzubauen.

  • Vorbereitung

    Für den Kurs wird keine explizite Hard- oder Software benötigt und die Teilnehmer können dem Vortrag und den Vorführungen folgen. Es ist aber möglich selber die einzelnen Schritte nachzuvollziehen und ebenfalls über den eigenen Rechner ein ZigBee Netz aufzubauen.

    Dafür wird folgendes benötigt:

    • 1 x CC2531 z. B. von Amazon (der Debugger zum Beschreiben ist lokal vorhanden.)
    • 1 x ein ZigBee Gerät z. B. Osram Smart+ Plug von Amazon 

    Zusammen mit einem Laptop mit Linux können dann alle Schritte nachvollzogen werden.

    Eine Liste weiterer Endgeräte, die mit dem Gateway in der aktuellen Version genutzt werden können ist auf der Projektseite auf GitHub zu finden.

    • Aufspielen der Firmware auf den CC2531

      Um auf den CC2531 die geeignete Firmware aufzuspielen wird ein CC Debugger von Texas Instruments sowie ein Adapter benötigt. Diese sind über einige Plattformen wie z. B. Amazon bestellbar (Debugger, Adapter).

      Zusätzlich wird die entsprechende Firmware und das Tool zum Flashen benötigt.

      Firmware

      Die für uns interessante Firmware wird auf der GitHub Seite des Gateways zur Verfügung gestellt und dort auch immer wieder aktualisiert. Dabei gibt es dort 2 verschiedene Varianten des Firmware:

      • Coordinator
      • Router

      Die Coordinator Firmware ist für die Verwaltung der Geräte zuständig und ist quasi der Netzverwalter. Alleine kann ein Coordinator in der aktuellen Firmware - Version bis zu 30 Geräte direkt verwalten.

      sudo apt install -y tmux unzip
      wget https://github.com/Koenkk/Z-Stack-firmware/raw/master/coordinator/default/CC2531/CC2531_DEFAULT_20190223.zip
      unzip CC2531_DEFAULT_20190223.zip

      Um mehr Geräte nutzen zu können werden Router benötigt. Diese können entweder durch CC2531 mit Router Firmware oder durch Dauerstrom Geräten wie z. B. dem Osram Smart+ Plug zur Verfügung gestellt werden. Dabei ist es abhängig von den Geräten selber wieviele Geräte sie wiederum verwalten können.

      Flashen

      Zum Flashen unter Linux wird cc-tool benötigt. Dieses lässt sich problemlos per git herunterladen und lokal compilieren und nutzen:

      sudo apt install -y git autoconf libtool libboost-dev libboost-all-dev libusb-1.0-0-dev
      git clone https://github.com/dashesy/cc-tool.git

      cd cc-tool
      ./bootstrap
      ./configure
      make
      Danach müssen sowohl der CC Debugger als auch der damit verbundene CC2531 an den Rechner angeschlossen werden. Die LED am CC Debugger wird dann zunächst rot leuchten. Nach einem Druck auf die Reset - Taste sollte sie dann grün leuchten.

      Sollte der CC Debugger weiterhin rot leuchten, sicherheitshalber richtige Polung der Anschlüsse überprüfen!

      Damit ist der CC Debugger im Programmiermodus und die Firmware kann aufgespielt werden:

      sudo ./cc-tool -e -w ../CC2531ZNP-Prod.hex
      Damit ist die Vorbereitung des CC2531 abgeschlossen und der kann benutzt werden.

      • Herunterladen und Einrichten des Gateways

        Als Gateway nutzen wir zigbee2mqtt von Koenkk. Das Gateway ist komplett auf GitHub zu finden.

        Herunterladen

        Um auch einfach wieder Updates durchführen zu können sollte das Gateway per Git heruntergeladen und verwaltet werden:

        sudo git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
        sudo chown -R pi: /opt/zigbee2mqtt
        Wir gehen dabei davon aus, dass die Installation auf einem RaspberryPi stattfindet und der Benutzer der Benutzer pi ist. Ansonsten bitte anpassen.

        Um die Software laufen zu lassen muss die Umgebung zur Verfügung gestellt werden. Dies ist Node.js mit npm.

        sudo curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
        sudo apt-get install -y nodejs

        Mit den folgenden Aufrufen sollte die Version getestet werden:

        node --version  # Should output v10.X
        npm --version  # Should output 6.X

        Danach können dann die Module installiert und konfiguriert werden:

        cd /opt/zigbee2mqtt
        npm install

        Damit ist das Gateway vorbereitet, kann aber noch nicht gestartet werden, da noch kein Mosquitto MQTT Server zur Verfügung steht um die Daten des Gatways zu speichern.

        • Einrichtung des Mosquitto MQTT Servers

          Der Mosquitto MQTT Server ist für die Zwischenspeicherung der Nachrichten, die vom ZigBee - Netzwerk kommen und dahin gehen sollen zuständig. Er funktioniert wie ein Telegramm - Dienst. Das Gateway kann z. B. den Zustand eines Schalters an eine Adresse (topic) des MQTT senden. Clients wie z. B. NodeRed oder OpenHAB2 etc. können nun an dieser Adresse lauschen (subscribe) und bekommen dadurch jede Änderung der Daten an dieser Adresse mit. Dadurch können sie sofort auf die Änderung reagieren von von sich aus auf eine Adresse eine Naschricht schicken oder Aktionen auslösen.

          Für die Grundinstallation ohne jegliche Absicherung des Dienstes reicht die folgende Zeile:

          sudo apt-get install mosquitto mosquitto-clients -y

          Vor dem Produktiveinsatz des Dienstes sollte die Kommunikation zwischen MQTT server und weiteren externen Geräten abgesichert werden.

          • Anpassen der Konfiguration, erster Start

            Der Datei /opt/zigbee2mqtt/data/configuration.yaml liegt die Konfiguration für das Gateway. Falls der MQTT nicht auf dem lokalen Rechner läuft oder es eine Anpassung für den Benutzernamen und das Kennwort gibt, können diese hier eingetragen werden:

            # MQTT settings
            mqtt:
              # MQTT base topic for zigbee2mqtt MQTT messages
              base_topic: zigbee2mqtt
              # MQTT server URL
              server: 'mqtt://localhost'
              # MQTT server authentication, uncomment if required:
              # user: my_user
              # password: my_password

            Es handelt sich hierbei um eine yaml - Datei. Bei diesem Dateityp ist es wichtig die Einrückungen (Leerschritte) beizubehalten.

            Nun steht dem ersten Start nicht mehr im Weg:

            cd /opt/zigbee2mqtt
            npm start

            Der Server sollte nun melden, dass er an den MQTT Server verbunden ist.

            Geräte, die in den Verbindungsmodus geschaltet wurden sollten nun auch sichtbar werden.

            Die Meldungen, die nun vom an den MQTT Server geschickt und dort gespeichert werden lassen sich über den folgenden Befehl abrufen:

            mosquitto_sub -t \#
            • Anpassen des friendly_name

              Jedes Gerät hat seine eindeutige ID, aber die ID kann sich keiner merken. Daher kann in der Datei /opt/zigbee2mqtt/data/configuration.yaml der friendly_name angepasst werden um einen sprechenden Namen für die Geräte zu bekommen.

              Dazu zunächst den Server stoppen (mit STRG+C oder systemctl stop zigbee2mqtt) und die Datei dann editieren.

              Beispiel:

              devices:
                '0xacb01baa0a0031b0':
                  friendly_name: 'smartplug01'
                  retain: false

              Nach dem Neustart des Dienstest nutzt der Server dann statt der bisherigen ID den friendly_name.

              • Geräte per MQTT direkt steuern

                Nachdem unsere Steckdose einen sprechenden Namen hat, können wir an das Gerät Nachrichten schicken (geht natürlich auch mit den IDs, ist aber mühsamer):

                mosquitto_pub -t zigbee2mqtt/smartplug01/set -m '{ "state": "OFF" }'
                mosquitto_pub -t zigbee2mqtt/smartplug01/set -m '{ "state": "ON" }'

                Der Nachrichteninhalt ist dabei ein JSON - Element, dass das Gateway auswertet und entsprechende Kommandos verschickt. Um ein Kommando zu senden wir an den Topic, der über mosquitto_sub ausgelesen wurde ein /set angehangen und die Nachricht dorthin geschickt.

                • Automatischer Start des Dienstes

                  Es ist sinnvoll den Dienst so einzurichen, dass er beim Systemstart automatisch startet und nicht immer auf der Konsole per Hand aufgerufen werden muss.

                  Dazu kann die Datei /etc/systemd/system/zigbee2mqtt.service mit folgendem Inhalt angelegt werden:

                  [Unit]
                  Description=zigbee2mqtt
                  After=network.target
                  [Service]
                  ExecStart=/usr/bin/npm start
                  WorkingDirectory=/opt/zigbee2mqtt
                  StandardOutput=inherit
                  StandardError=inherit
                  Restart=always
                  User=pi
                  [Install]
                  WantedBy=multi-user.target

                  Nach dem Anlegen kann er Dienst direkt für den Systemstart eingebunden und gestartet werden:

                  sudo systemctl enable --now zigbee2mqtt.service

                  Ausgaben des Dienstes können jetzt über journalctl ausgelesen werden:

                  sudo journalctl --unit zigbee2mqtt.service


                  • Installation und Einrichtung von node-red

                    Um node-red auf dem Rasbian zu installieren gibt es ein fertiges script:

                    cd
                    wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered
                    bash update-nodejs-and-nodered

                    Die Frage ob die Installation durchgeführt werden soll und ob die RaspberryPi spezifischen Nodes aktiviert werden sollen können mit y beantwortet werden.

                    Nach der Installation kann node-red über den Befehl node-red-start manuell gestartet werden oder direkt mit sudo systemctl enable --now nodered für den Systemstart installiert und gestartet werden.

                    Per Webbrowser ist node-red nun unter http://IPdesGeraetes:1880/ erreichbar.