2024-10-31

Ort: bei Klaus
Anwesende: Gerhard, Klaus

Vorhaben

  1. SSH Zugriff nutzbar machen
  2. Auf einem Raspberry Pi Generation 4 (kurz: Raspi) ein Serversystem aufsetzen, RAM: 2GByte.
  3. MQTT Broker (hier: Mosquitto) installieren.
  4. Node-RED installieren.
  5. Kleinen Node-RED Flow für den Zugriff auf Daten eines Shelly (Pro) 3EM erstellen.

Durchführung

SSH Zugriff nutzbar machen

Dies gelingt auch bspw. per Windows Kommando oder bei Nutzung eines Linux Arbeitssystems per SSH Kommando, bei Nutzung eines Windows Arbeitssystem ist PUTTY aber komfortabel nutzbar und empfehlenswert. Darin lässt sich die SSH Verbindung zum Zielsystem leicht eintragen und nutzen. (Selbsterklärend, hier nicht dokumentiert)

Serversystem aufsetzen

Ziel ist ein funktionierendes, noch nicht abgesichertes System aufzusetzen. Eine optionale Absicherung bleibt dem Nutzer (hier: Klaus) bei Bedarf überlassen.

  1. Raspberry Pi Imager von https://www.raspberrypi.com/ herunterladen und installieren. Nächste Schritte per Imager.
  2. Operating System (OS): Raspberry Pi OS (other) -> Raspberry Pi OS Lite (64 Bit)
    A port of Debian Bookworm with no desktop environment.
    Ein Serversystem benötigt keine grafische Oberfläche, welche zudem zusätzliche Ressourcen benötigt. Der Verwaltungszugriff erfolgt per SSH - SSH Client PUTTY auf Windows.
  3. Unter SD-Karte den zu verwendenden bootfähigen Massenspeicher auswählen, hier ein SSD Stick von 128 GByte.
  4. Einstellungen bearbeiten
    Dies stellt das System unmittelbar für den Zugriff, u.a. per SSH, im WLAN bereit, reduziert weitere Konfigurationen.
    1. Hostname, Benutzername und Passwort festlegen
    2. Wifi einrichten
    3. Spracheinstellungen festlegen
    4. Dienste -> SSH aktivieren (Passwort zur Authentifizierung verwenden)
    5. Speichern
  5. System auf Datenträger schreiben.

Bei gebootetem System ist der Raspi per SSH (PUTTY) im Netzwerk erreich- und verwaltbar. Hierzu stehen ausschließlich Shell Kommandos zur Verfügung.

Das System wird nicht vom vorgesehenen SSD Stick gebootet, Grund unbekannt. Zur Fehlersuche wird ein Display an den Raspi angeschlossen. Obige Schritte werden mit einem externen SSD HD wiederholt, gleiches Resultat. Wiederholung mit einer 8 GByte Mikro SD Karte -> Raspi bootet regulär und ist nutzbar. Dies ist jedoch nicht gewollt.

Fehlerursache

Auf dem Raspi ist ein Bootloader installiert, der offenbar ausschließlich vom Mikro SD Kartenslot bootet. Vermutlich ist dies eine Altlast von einer älteren Installation.

Abhilfe

Per sudo raspi-config wird der factory bootloader selektiert. Nun wird regulär vom vorgesehenen SSD Stick gebootet.

MQTT Broker installieren

Anleitung nach https://www.elektronik-kompendium.de/sites/raspberry-pi/2709041.htm

sudo apt install mosquitto mosquitto-clients

Die mosquitto-clients sind die Kommandos mosquitto_pub und mosquitto_sub. Damit lassen sich das Senden und empfangen von MQTT Nachrichten testen. Diese sind auch in Shellskripten nutzbar.

Mosquitto als automatisch zu startenden Dienst (Service, Daemon) einrichten: sudo systemctl enable mosquitto

Node-RED installieren

Hierfür ist die beste Adresse https://nodered.org/docs/getting-started/raspberrypi

Unter "Installing and Upgrading Node-RED" ist ein komplexes Kommando zu finden, welches den besten Weg für die Installation und spätere Upgrades bietet. Dieses (hier folgende) Kommando ist zwingend unter dem lokalen Account aufzurufen, unter welchem Node-RED gestartet werden soll. Dies sollte in der Regel nicht root sein. Dazu wird vorher in das eigene Home-Verzeichnis gewechselt (cd ~).

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

Node-RED als automatisch zu startenden Dienst einrichten: sudo systemctl enable nodered.service

Nach einem Neustart (sudo reboot) stehen die Dienste Mosquitto und Node-RED zur Verfügung.

Kleinen Node-RED Flow für den Zugriff auf Daten eines Shelly (Pro) 3EM erstellen

Klaus nutzt einen Shelly Pro 3EM, welcher seine Daten an den MQTT Broker einer HomeMatic CCU 3 sendet. Zum Empfang dieser Daten wird zunächst ein kleiner Adapter-Flow erstellt. Dieser enthält ein "mqtt in" Node als MQTT Subscriber, welcher das passende Topic beim MQTT Broker der CCU 3 abonniert und so im Flow des Raspi zur Verfügung stellt. Dies dient temporär dazu, das bisher laufende System der CCU 3 sowie die beteiligten Endgeräte (hier: Shelly) nicht umkonfigurieren zu müssen.

Die vom obigen "mqtt in" Node, hier "from ccu" genannt, gelieferten Nachrichten werden an einen "mqtt out" Node als MQTT Publisher weitergeleitet, wobei das Topic durch "em3" ersetzt wird. Dieser Publisher, hier "to local"  genannt, sendet diese Nachrichten an den neuen, lokal auf dem Raspi arbeitenden MQTT Broker (Mosquitto). Ein weiterer MQTT Subscriber ("mqtt in" Node), hier "from em3" genannt, abonniert vom lokalen MQTT Broker alle Nachrichten mit dem Topic "em3".

Der Nachrichtenfluss ist somit folgender.

Shelly 3EM -> CCU 3 MQTT Broker -> Raspi Subscriber Node "from ccu" -> Raspi Publisher Node "to local" -> Raspi MQTT Broker -> Raspi Subscriber Node "from em3"

Der Subscriber "from em3" liefert an seinem Ausgang alle Nachrichten, die der Subscriber "from ccu" empfängt. Diese können nun so weiter verarbeitet werden, als kämen sie unmittelbar vom Shelly 3EM über den lokalen MQTT Broker.

(Zwischendurch wird der öffentliche MQTT Broker "test.mosquitto.org" ergänzend zum lokalen Broker zwecks Adaptierung mit einem kryptischen Topic genutzt, um zu sehen, dass dies genauso gelingt.)

Adapter Flow
Prinzip des Adapter Flows

Am Ausgang des switch Node "hat relevanten Schlüssel" stehen alle Nachrichten zur Verfügung, welche einen ausgewählten relevanten Schlüssel hat. Dieser Node ist tatsächlich durch vier hintereinander liegende Nodes ersetzt, welche sequenziell genau die Nachrichtenkomponente selektieren, welche die gewünschten Daten enthält. Auf diese Daten kann einfach zugegriffen und diese so leicht verarbeitet werden.

Obige Selektion gelingt bisher nicht per JacaScript Code, weil ein relevanter Schlüssel seitens des Shelly den Component-Identifier enthält, hier "EM:0". Der enthaltene Doppelpunkt ist in einem JavaScript Schlüssel nicht zulässig.