{"id":169,"date":"2021-05-19T14:38:23","date_gmt":"2021-05-19T12:38:23","guid":{"rendered":"https:\/\/www.iot-embedded.de\/iot-2021\/?p=169"},"modified":"2021-06-19T09:50:40","modified_gmt":"2021-06-19T07:50:40","slug":"erste-schritte-mit-balena-und-der-iot-beispielarchitektur","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2021\/wichtige-hinweise\/erste-schritte-mit-balena-und-der-iot-beispielarchitektur\/","title":{"rendered":"Erste Schritte mit Balena und der IoT-Beispielarchitektur"},"content":{"rendered":"\n<p>Das Git-Repository unter <a href=\"https:\/\/github.com\/DennisSchulmeister\/dhbwka-wwi-iotws-architektur\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/github.com\/DennisSchulmeister\/dhbwka-wwi-iotws-architektur<\/a> enth\u00e4lt die vorgeschlagene Referenzarchitektur zur Umsetzung der Projekte. Der Quellcode kann direkt \u00fcbernommen und f\u00fcr das jeweilige Projekt angepasst und weiterentwickelt werden. Dieser Blogbeitrag soll die Architektur sowie die ersten Schritte zum Kennenlernen der zugrunde liegenden Balena-Cloud vorstellen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Allgemeine Systemarchitektur<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"483\" src=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-allgemein-1024x483.png\" alt=\"\" class=\"wp-image-170\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-allgemein-1024x483.png 1024w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-allgemein-300x142.png 300w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-allgemein-768x362.png 768w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-allgemein-1536x725.png 1536w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-allgemein.png 1696w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Allgemeine Systemarchitektur<\/figcaption><\/figure>\n\n\n\n<p>Die allgemeine Systemarchitektur beruht auf einem zentralen MQTT Message Broker, \u00fcber den die IoT-Devices mit dem Backend und untereinander integriert werden. Dies bietet sich an, da auf diese Weise jede Komponente lediglich die Adresse des MQTT-Brokers kennen muss, um eingebunden zu werden. Untereinander kennen sich die Devices und Komponenten nicht und k\u00f6nnen auch nicht direkt miteinander kommunizieren. Stattdessen schickt jede Komponente beliebig formatierte Nachrichten (in unserem Fall im JSON-Format, UTF-8 kodiert) an selbst gew\u00e4hlte &#8222;Topics&#8220; des Message Brokers und verl\u00e4sst sich darauf, dass die anderen Komponenten die f\u00fcr sie relevanten Topics \u00fcberwachen. Auf diese Weise k\u00f6nnen jederzeit neue Devices und Komponenten hinzugef\u00fcgt oder alte Komponenten entfernt bzw. ausgetauscht werden, ohne dass die anderen Teile davon betroffen sind.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deviceseitige Softwarearchitektur<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"491\" src=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-device-1024x491.png\" alt=\"\" class=\"wp-image-171\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-device-1024x491.png 1024w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-device-300x144.png 300w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-device-768x369.png 768w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-device-1536x737.png 1536w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/architektur-device.png 1667w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption>Deviceseitige Softwarearchitektur<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"501\" src=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-grafana-1024x501.png\" alt=\"\" class=\"wp-image-174\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-grafana-1024x501.png 1024w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-grafana-300x147.png 300w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-grafana-768x376.png 768w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-grafana-1536x752.png 1536w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-grafana.png 1900w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Programmiersprache im Beispiel ist Python. Entwicklung, Test und Produktivsetzung s\u00e4mtlicher Komponenten erfolgen mit Docker \u2013 sowohl auf den IoT-Devices als auch im Backend. Auf Seiten der Devices wird dies durch die <strong>Balena Cloud<\/strong> im Produktivbetrieb bzw. das <strong>Balena CLI<\/strong> w\u00e4hrend der Entwicklung vollst\u00e4ndig automatisiert. Die IoT-Devices umfassen folgende Komponenten:<\/p>\n\n\n\n<ul><li><code>redis<\/code>: Zentraler Redis-Server<\/li><li><code>sensor<\/code>: Python-Programm zum Auslesen der Sensordaten und Ablage in Redis<\/li><li><code>startstopbutton<\/code>: Python-Programm zum Starten und Stoppen der Sensormessungen<br><strong>Vorsicht:<\/strong> Dieser belegt den GPIO-Pin 2, der u.a. auch f\u00fcr I\u00b2C benutzt wird!<\/li><li><code>mqtthandler<\/code>: Python-Programm zum Versand der Sensordaten via MQTT<\/li><li><code>grafana<\/code>: Lokales Grafana-Dashboard zur \u00dcberwachung der Devices<\/li><\/ul>\n\n\n\n<p>Hauptbestandteil ist hier der Redis-Server, der als strukturierter in-memory Key-Value-Store sowohl f\u00fcr die lokale Zwischenspeicherung der Sensordaten als auch die Kommunikation der Teilprogramme untereinander sorgt. Der Server ist so konfiguriert, dass bei einem Stromausfall maximal die Daten der letzten Sekunde verloren gehen k\u00f6nnen. Die Sensordaten werden dabei via MQTT an das Backend sowie weitere, interessierte Empf\u00e4nger verschickt. Dabei ist sichergestellt, dass bei einem Teilausfall des Systems keine Sensordaten verloren gehen, sondern der Sendevorgang automatisch nachgeholt wird. Ebenso erlauben die Devices eine einfache Fernsteuerung durch JSON-kodierte Kommandos via MQTT.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Entwicklung der IoT-Devices<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"549\" src=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cli-1024x549.png\" alt=\"\" class=\"wp-image-175\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cli-1024x549.png 1024w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cli-300x161.png 300w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cli-768x412.png 768w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cli-1536x823.png 1536w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cli-2048x1097.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Das <strong>Balena CLI<\/strong> kann s\u00e4mtliche Client-Komponenten auf einen lokales Entwicklerboard (hier Rasbperry Pi) ausf\u00fchren und bei \u00c4nderungen am Quellcode automatisch aktualisieren (sog. <strong>Livepush<\/strong>). Das erstmalige Starten der Komponenten dauert lange. Daf\u00fcr werden die betroffenen Komponenten bei jeder Quellcode\u00e4nderungen innerhalb weniger Sekunden neugestartet, so dass man fast wie lokal entwickeln kann. Die notwendigen Schritte sind hierf\u00fcr:<\/p>\n\n\n\n<ol><li>In der Balena Cloud eine neue Anwendung registrieren<\/li><li>Development-Version des Balena OS herunterladen und auf SD-Karte schreiben<\/li><li>Das Entwicklerboard mit dem eben heruntergelandenen Balena OS starten<\/li><li>In der Cloud den \u201eLocal Mode\u201c aktivieren<\/li><li>Auf der Kommandozeile folgende Befehle ausf\u00fchren:<ul><li><code>cd device<\/code><\/li><li><code>sudo balena scan<\/code><\/li><li><code>balena push xxxxxx.local<\/code><\/li><\/ul><\/li><\/ol>\n\n\n\n<p><code>xxxxxx.local<\/code> muss hierbei durch den mit <code>sudo balena scan<\/code> ermittelten Hostnamen ersetzt werden (z.B. <code>6076a30.local<\/code>). Alternativ kann auch die IP-Adresse des Boards verwendet werden. Auf der Konsole werden alle Log-Ausgaben der Services und des Devices ausgegeben. Dies kann mit <code>Strg+C<\/code> beendet werden. Das Device l\u00e4uft allerdings weiter.<\/p>\n\n\n\n<p>Folgende Befehle k\u00f6nnen bei der Entwicklung n\u00fctzlich sein:<\/p>\n\n\n\n<ul><li><code>balena logs xxxxxx.local<\/code>:<br>Wiederaufnahme der Log-Ausgabe in der Konsole<\/li><li><code>balena logs xxxxxx.local --service sensor --service mqtthandler<\/code>:<br>Konsolenausgabe auf einzelne Services einschr\u00e4nken<\/li><li><code>balena ssh xxxxxx.local<\/code>:<br>SSH-Verbindung zum Hostsystem des Devices herstellen<\/li><li><code>balena ssh xxxxxx.local mqtthandler<\/code>:<br>SSH-Verbindung zu einem Containersystem des Devices herstellen<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Produktivsetzung der IoT-Devices<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"512\" src=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cloud-1024x512.png\" alt=\"\" class=\"wp-image-176\" srcset=\"https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cloud-1024x512.png 1024w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cloud-300x150.png 300w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cloud-768x384.png 768w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cloud-1536x768.png 1536w, https:\/\/www.iot-embedded.de\/iot-2021\/wp-content\/uploads\/sites\/5\/2021\/05\/screenshot-balena-cloud-2048x1024.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Zur Produktivsetzung der Devices muss in der Cloud der \u201eLocal Mode\u201d deaktiviert werden (in den Ger\u00e4teeinstellungen des Entwicklerboards). Anschlie\u00dfend kann das Device wieder \u00fcber die Balena Cloud verwaltet und konfiguriert werden. Das eigentliche Deployment erfolgt mit folgendem Befehl:<\/p>\n\n\n\n<p><code>balena push IoT-Projekt<\/code><\/p>\n\n\n\n<p>Die Bezeichnung <code>IoT-Projekt<\/code> muss dabei durch den tats\u00e4chlichen Namen der Anwendung innerhalb der Balena Cloud ersetzt werden. Innerhalb der Cloud kann das Verhalten der Devices \u00fcber verschiedene Umgebungsvariablen beeinflusst werden. Eine Auflistung findet sich in den README-Dateien und den Konfigurationsdateien der einzelnen Komponenten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das Git-Repository unter https:\/\/github.com\/DennisSchulmeister\/dhbwka-wwi-iotws-architektur enth\u00e4lt die vorgeschlagene Referenzarchitektur zur Umsetzung der Projekte. Der Quellcode kann direkt \u00fcbernommen und f\u00fcr das jeweilige Projekt angepasst und weiterentwickelt werden. Dieser Blogbeitrag soll die Architektur sowie die ersten Schritte zum Kennenlernen der zugrunde liegenden<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/169"}],"collection":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/comments?post=169"}],"version-history":[{"count":6,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/169\/revisions"}],"predecessor-version":[{"id":432,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/169\/revisions\/432"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/media?parent=169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/categories?post=169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/tags?post=169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}