{"id":132,"date":"2021-05-15T22:14:52","date_gmt":"2021-05-15T20:14:52","guid":{"rendered":"https:\/\/www.iot-embedded.de\/iot-2021\/?p=132"},"modified":"2021-05-15T22:14:54","modified_gmt":"2021-05-15T20:14:54","slug":"balena-cloud-laeuft","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2021\/smart-drive\/balena-cloud-laeuft\/","title":{"rendered":"Balena Cloud l\u00e4uft!"},"content":{"rendered":"<p>Balena Cloud l\u00e4uft!<\/p>\n<p>Als letzter Schritt zur vorgegebenen Architektur fehlt noch die Integration der Balena Cloud. Die Inbetriebnahme wird hier kurz beschrieben.<\/p>\n<p>Als erstes legt man sich einen kostenlosen Account an und erstellt die erste Applikation. Nun gelangt man auf das Dashboard zu dieser Applikation und sieht, dass man keine Devices und keine Releases hat. Als Test wird das aus dem vorherigen Beitrag bekannte Skript \u00fcber die Balena Cloud deployed.<\/p>\n<h2>Device hinzuf\u00fcgen<\/h2>\n<p>Zuerst muss der Pi als Device zur Applikation hinzugef\u00fcgt werden. Dazu geht man auf <i>New Device<\/i> und w\u00e4hlt die gew\u00fcnschten Einstellungen. Ich habe von der DHBW einen Raspberry Pi 4 und entscheide mich f\u00fcr die Anbindung des Pi \u00fcber WLAN. Also gebe ich die SSID und das WLAN-Passwort an. Nun kann das Image (ca. 160 MB) heruntergeladen werden.<\/p>\n<p>Nun muss das heruntergeladene Image entpackt werden und auf eine SD-Karte f\u00fcr den Pi geschrieben werden. Daf\u00fcr bietet Balena ein eigenes Tool, ich verwende jedoch lieber die Boardmittel von Linux bzw. macOS: dd. Der Befehl lautet folgenderma\u00dfen:<\/p>\n<pre class=\"block\">dd if=balena.img of=\/dev\/sdc bs=1m\n<\/pre>\n<p>Nach kurzer Zeit ist das Image geschrieben. Es sind mehrere Partitionen auf der SD-Karte sichtbar. Die Karte wird nun in den Pi gesteckt und der Strom eingeschaltet. Andere Ger\u00e4te sind nicht notwendig. Und tats\u00e4chlich: nach wenigen Sekunden erscheint das erste Device im Dashboard.<\/p>\n<h2>Release erstellen<\/h2>\n<p>Bisher ist die eigene Software noch nicht auf dem Pi angekommen. Um dies nachzuholen, wird ein Release erstellt. Sp\u00e4ter wird das Release dann auf alle verf\u00fcgbaren Devices deployed. Dazu geht man auf <i>New Release<\/i> und entscheidet sich f\u00fcr eine Variante. Entweder das Balena CLI Interface oder per git. Letzteres ist schon auf meinem Rechner, also warum sollte ich mehr Software installieren? Ich nehme also git.<\/p>\n<h3>Repository erstellen<\/h3>\n<p>Zun\u00e4chst wird ein Repository erstellt und diesem die drei Dateien (dockerfile, requirements.txt und src\/app.py) des vorherigen Beitrags hinzugef\u00fcgt. Es sind nun zwei kleine \u00c4nderungen am dockerfile notwendig.<\/p>\n<ol>\n<li>Umbenennen in Dockerfile.template<\/li>\n<li>Basis Image \u00e4ndern<\/li>\n<\/ol>\n<p>Als Basis Image muss ein Image der Balena Cloud verwendet werden. Laut Doku gibt es mehr als 26.000 verschiedene Images. Die Auswahl ist aber trotzdem leicht zu treffen. Im Groben kann man die zugrunde liegende Distribution und die integrierte Programmiersprache w\u00e4hlen. Au\u00dferdem muss das Image f\u00fcr die entsprechende Hardware gew\u00e4hlt werden (hier Raspberry Pi 4). Diese Auswahl kann jedoch automatisiert erfolgen, indem ein Platzhalter angegeben wird. Entscheidet man sich f\u00fcr all diese Faktoren, l\u00e4sst sich daraus der Name des Image zusammensetzen (<a href=\"https:\/\/www.balena.io\/docs\/reference\/base-images\/base-images\/\">Weitere Infos hier<\/a>). F\u00fcr diesen Fall wird also die erste Zeile wie folgt angepasst, w\u00e4hrend der Rest unver\u00e4ndert bleibt.<\/p>\n<pre class=\"block\">FROM balenalib\/%%BALENA_MACHINE_NAME%%-alpine-python:3.9.1-run\n<\/pre>\n<p>Damit sind alle Anpassungen gemacht und das Repository ist bereit.<\/p>\n<h3>Push in die Balena Cloud<\/h3>\n<p>Nachdem auf dem Dashboard <i>New Release<\/i> angeklickt wurde, wird die Anleitung angezeigt. Dort kann man auch einen SSH-Key hinzuf\u00fcgen. Man w\u00e4hlt die manuelle Methode und erzeugt mit dem folgenden Befehl ein neues SSH-Key Paar auf seinem Rechner.<\/p>\n<pre class=\"block\">ssh-keygen -t ed25519\n<\/pre>\n<p>Als Name w\u00e4hle ich balena und die Passphrase bleibt leer. Anschlie\u00dfend wird der Inhalt von balena.pub in die Eingabemaske auf dem Dashboard kopiert. Nun ist noch der folgende Eintrag in der ssh-config-Datei notwendig. Diese ist in der Regel $HOME\/.ssh\/config<\/p>\n<pre class=\"block\">Host balena git.balena-cloud.com\n\tHost git.balena-cloud.com\n\tIdentityFile ~\/.ssh\/balena\n<\/pre>\n<p>Der Eintrag sorgt daf\u00fcr, dass der Verbindung zur Balena Cloud der passende private-Key zugeordnet wird. Hat man nur einen SSH-Key, kann man bei Erstellung den Namen leer lassen und dieser Schritt entf\u00e4llt.<\/p>\n<p>Nun muss dem oben erstellten Repository ein neuer Remote-Ort hinzugef\u00fcgt werden. Den passenden Befehl kopiert man aus der Anleitung auf dem Balena Dashboard. Ebenso den Befehl zum pushen in die Cloud.<\/p>\n<p>Der Vorgang dauerte bei mir etwa eine Minute, bis mir eine Erfolgsmeldung ausgegeben wurde. Anschlie\u00dfend wird die Software auf die Devices verteilt. Das dauert beim ersten Mal relativ lange, geht danach jedoch schneller, da immer nur die neueste Schicht des Docker Image verteilt werden muss. Deshalb sollte der Quellcode nur in der letzten Schicht sein. Nun noch den MQTT-Broker starten und schon l\u00e4uft das ganze. Im Dashboard wird die Terminalausgabe des Device angezeigt. Sendet man mit einem anderen Client eine Zahl im Topic <i>intervall<\/i>, so \u00e4ndert der Device die Abst\u00e4nde zwischen den Nachrichten. Zieht man den Stecker des Pi, dauert es mehrere Minuten, bis das Device im Dashboard als <i>offline<\/i> angezeigt wird.<\/p>\n<h2>Fazit<\/h2>\n<p>Die Infrastruktur f\u00fcr unser Projekt steht. Ab jetzt k\u00f6nnen wir uns auf die Entwicklung der eigentlichen Software konzentrieren und den Teil f\u00fcr die Devices einfach deployen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Balena Cloud l\u00e4uft! Als letzter Schritt zur vorgegebenen Architektur fehlt noch die Integration der Balena Cloud. Die Inbetriebnahme wird hier kurz beschrieben. Als erstes legt man sich einen kostenlosen Account an und erstellt die erste Applikation. Nun gelangt man auf<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[8],"tags":[],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/132"}],"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\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/comments?post=132"}],"version-history":[{"count":2,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/132\/revisions"}],"predecessor-version":[{"id":134,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/132\/revisions\/134"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/media?parent=132"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/categories?post=132"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/tags?post=132"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}