Auf unten stehender Grafik wird die Kommunikation zwischen den verschiedenen Instanzen dargestellt. Generell laufen alle GUIs, die Studierende aufrufen auf dem Hauptgerät (auf ```192.168.178.75:1880```) und werden aus einer zentralen Node-Red Instanz zur Verfügung gestellt. In der Darstellung der Reactors sind die verschiedenen Hosts zu erkennen, auf denen diese laufen. Theoretisch ist es auch möglich alle Instanzen auf dem gleichen Raspi unter verschiedenen Portnummern zu starten. Da ein Raspi allerdings nur einen Display-Anschluss hat, kann nur ein Reactor gleichzeitig angezeigt werden.
Um die Lösung in einem Netzwerk aufzusetzen und zu reproduzieren, werden zunächst zwei Raspberry Pis (Generation nach Wahl, empfohlen 4) benötigt. Auf diesen ist das Raspberry Pi OS mit dem Raspberry Pi Imager zu installieren. Sobald das Gerät gestartet und hochgefahren ist, kann mit der Installation von Docker begonnen werden. Ist diese Installation abgeschlossen, empfehlen wir, Portainer zur vereinfachten Verwaltung der Container-Umgebung zu deployen. Sobald Portainer bereit ist, kann dessen Web-App einfach über den Browser erreicht werden, um weitere Container zu erstellen (Standard-Port ```9000```).
An dieser Stelle ist es wichtig zu unterscheiden, ob ein **Main oder Secondary Device** erstellt werden soll. Abhängig davon ist bei einem **Main Device** ein zusätzlicher Container als MQTT-Broker zu erstellen. In unserem MVP haben wir uns für den Mosquitto-Broker entschieden, da die lokale Version des HiveMQ-Brokers Fehlermeldungen ausgegeben hat. Für den Broker ist zu empfehlen, die Standard-Ports zu verwenden, um im Nachgang weniger Anpassungen in der von uns bereits erstellten Node-RED Umgebung vornehmen zu müssen. Ist dieser erfolgreich gestartet, kann mit dem Deployment der Node-RED Umgebung begonnen werden.
Dies ist sowohl für **Main und Secondary Device** zu tätigen. Hierfür ist zu Beginn in Portainer eine neue Volume, bspw. mit dem Namen _„node_red_data“_ zu erzeugen (Gilt für jeden Node-RED Container). Anschließend kann unter Container ein neuer Container erstellt werden. Dabei ist neben einem aussagekräftigen Namen und dem Image (```nodered/node-red:latest```) im Bereich Advanced Container Settings, unter dem Reiter Volumes, das zuvor erstellte Volume zu mappen. Innerhalb des Containers ist dabei auf _„/data“_ zu referenzieren. Zusätzlich kann als Environment Variable _„TZ“_ auf _„Europe/Berlin“_ und als Restart Policy _„Unless stopped“_ angegeben werden, bevor der Container erstellt wird. Sollten mehrere Node-RED Container auf demselben Pi betrieben werden, ist im Bereich Network Ports Configuration unter Manual Network Port Publishing ein freier Port des Hosts (bspw. ```1881```) auf den Port ```1880``` des Containers zu mappen. Nun kann der Container deployed werden.
Sobald Node-RED einsatzbereit ist, kann die Web-App standardmäßig über den Port ```1880``` erreicht werden. Hat das Interface geladen, können über das Burger-Symbol Flows importiert werden. An dieser Stelle ist die JSON-File aus diesem Repository einzufügen. Anschließend erscheinen zwei neue Flows: _„IoT Hackathon Publisher“_ (unrelevant bei Secondary Device, kann entfernt werden) und _„IoT Hackathon Subscriber“_ in der Umgebung. Wie in den Absätzen zuvor beschrieben, vereinen die jeweiligen Flows Backend und Frontend der Anwendung. Um die Lösung einsatzfähig zu machen, ist an Nodes in beiden Flows mit einem _„!“_ eine Anpassung der IP-Adresse (```10.0.100.132```) auf die eigene/auf das Main Device vorzunehmen (Abhängig davon, ob es sich um eine MQTT-Node handelt). Gleiches gilt, wenn die Node-RED Umgebung nicht unter dem Port ```1880``` betrieben wird. Sind alle Änderungen vorgenommen, kann in der rechten, oberen Ecke die Lösung deployed werden und ist einsatzbereit.
Wurde ein **Secondary Device** erstellt, sind folgende Adressen über den Browser zu erreichen:```{IP-Adresse:Port}```
Um sich redundante Schritte nach jedem Start des Raspis zu ersparen und **direkt als Reactor empfangsbereit zu sein**, kann zusätzlich folgende Einstellung vorgenommen werden (Chromium startet anschließend automatisch im Kiosk Modus nach dem Start):