Am Rand und nicht am Abgrund




Für ein spezielle Projekt habe ich mich in das Thema IoT Edge mit dem Raspberry PI versucht einzuarbeiten. Wenn es nach mir ginge, würde ich sagen mehr schlecht als recht, aber es kommt immer auf die Betrachtungsweise an. Durch mein Experimentieren habe ich viel gelernt, welches in den nächsten Monaten sicher noch öfter an unterschiedlichen Stellen erwähnt werden wird. Hier möchte ich im Grunde nur eine kurze Zusammenfassung bringen.

Am Rande der Technologie

Aus besagtem Grunde wollte ich mich intensiver mit dem Thema IoT beschäftigen. Im Besonderen sollte es der IoT Edge sein (sagt man das so, der Edge? Keine Ahnung) Was ist daran so besonders? Die Tatsache, dass dies der Begin der nächsten kleinen technologischen Revolution ist. IoT Edge verkörpert in seiner Art das Fog Computing. Das bedeutet, dass die Cloud erweitert wird. Nicht eine große Anzahl von verteilten Rechenzentren allein werden die Massen an Daten verarbeiten können. Die Cloud wird im Laufe der nächsten Jahre ausgelagert auch auf die Endanwendergeräte.
Wie bitte? Mein Computer wird Teil der Cloud? Ja, das wird er und nicht nur der, sondern auch die vielen kleinen IoT Devices. Waschmaschinen, Kühlschränke - ja der IoT Kühlschrank kommt wieder - und all die anderen Geräte, die eine CPU haben, werden Teil des großen Ganzen. SkyNet lässt grüßen? Naja, wir werden sehen, wie klug wir die Geräte machen. Schließlich sind wir diejenigen, die diese Geräte a) programmieren und b) ihnen das "Leben" einhauchen.

Gut, zurück zum Thema IoT Edge.

Himbeerkuchen

Mein Versuch begann damit einem Raspberry PI so viel Leben einzuhauchen, dass er in regelmäßigen Abständen die aktuellen Licht und Temperaturdaten meiner Wohnung übermittelt. Mit der richtigen Anleitung ging das sehr schnell.

Das Setup I :

Raspberry PI (RPI) mit Windows IoT Core und dem klassischen Raspberry PI Sensor Pack. Als Applikation lief eine Exe File mit einem Timer, der alle 5 Minuten die Daten übermittelte.

Das war alles fast kein Problem, abgesehen von ein paar kleineren Netzwerkfehlern bei mir zu Hause. Das ganze war innerhalb von 6 Stunden erledigt.

Das wahre Problem hier ist jedoch die Machbarkeit. Ein solches Setup entspricht nicht dem, was in der Realität zur Zeit vorherrscht. Auch wenn Microsoft gerne möchte, dass IoT Core mehr zum Einsatz kommt, Linux ist doch noch etwas verbreiteter. Also musste ich den nächsten Schritt gehen, RPI mit Linux.

Das Setup II:

Der RPI fühlt sich mit Linux einfach beeindruckend gut an. Ein Problem, das .Net Framework ist hierfür nicht geschaffen. Also muss .Net Core ran. Für mich tatsächlich das erste Mal, weil ich einfach abwarte wollte.
Also, ran an den RPI, auf dem nun Raspian installiert wurde. Dann noch schnell die Edge Umgebung drauf und NICHTS GEHT MEHR. Moment, was habe ich falsch gemacht?

Schlick und Modder

Als ich die erste Installation durchführte, ließ ich mich mächtig in die Irre führen, was mir mehrere Stunden Lernen einbrockte. Ich ging davon aus dass die Anleitung [1] geschrieben wurde, mit dem Wissen, dass es funktioniert. Weit gefehlt, der Autor hat nur vermutet, dass es klappt. 
Ich hatte schlichtweg vor, die Azure Functions Runtime auf einem RPI zum Laufen zu bringen, was laut der Beschreibung klappen sollte (Konjunktiv).
Die ersten Versuche endeten damit, dass ich erst einmal lernte, wo man die Logs von docker findet. Dazu kam, dass ich feststellten durfte, dass die Dockerversion 17.11 CE für IoT Edge nicht brauchbar ist. Ach was sage ich, sie ist für niemanden zu gebrauchen, was ja auch dazu führte, dass sie sehr schnell gegen eine höhere Version ausgetauscht wurde. Aber bitte meine Lieben, warum erwische ich denn immer wieder diese Versionen, die nicht funktionieren. (Augenverdreh)

A man with his hands covered with mudNach dem Update von Docker auf allen Geräten konnte es endlich losgehen. Sollte man meinen. Dem macOS beizubringen, dass pip installiert werden soll ist auch nicht ganz logisch, wenn man die ganze Zeit mit sudo apt-get install arbeitet. Mit pip sollten irgendwelche Tools nachinstalliert werden, die dann dummerweise auf dem Mac nicht funktionierten. Eine Woche später schon sieht das ganz anders aus, da hat wohl jemand mächtig am Bug-Killer gebastelt.
Nach sehr vielen erfolglosen Versuchen richtete ich mir einen Linuxrechner ein, bei dem fast alles auf Anhieb funktionierte nur leider die Azure Functions Environment auf dem RPI nicht. Was ist da bloß los? Im Log vom edgeAgent (docker logs edgeAgent) stand nur der Hinweis, dass die Function nicht gestartet werden konnte. 

Also erstmal wieder auf Anfang. Blanke SD-Card mit frischem Raspian, saubere Linuxumgebung und mit mächtig Blutdruck ein Feedback an die Leute geschrieben, die die Dokumentation fabriziert hatten. Nach ca. 5 Stunden kam eine Antwort "Kannste ma 'n Log zeigen" Leute, welches Log? Von Docker gibt es drei und wer weiß, wo noch Zeug hingeschrieben wird.
Die Logs, die ich gefunden habe musste ich aus technischen Gründen als Gist ablegen. Dort schaute sich tatsächlich jemand den Quatsch an und siehe da: "Ja du, die Function startet nicht". Ach nee, Blitzmerker, das habe ich nach einer Woche fummeln auch festgestellt. Was ist denn das Problem? Any Idea? "Na nimm doch mal ein anderes Image für dein IoT Edge Module(microsoft/dotnet:2.0.0-runtime-stretch-arm32v7)". Gesagt getan. Das eine Image im Dockerfile gegen das andere ausgetauscht. Aber warte mal, was steht da? IoT Edge Module? Das ist keine Function. Die darauf folgende Nacht habe ich sehr unruhig geschlafen. Da bekommt man Hilfe und dann ist das total nutzlos, denn ich hatte ja nicht vor, ein Modul zu starten, sondern eine Function App. Oh Gott lass es vernunftbegabte Softwareentwickler regnen.

Reinigender R(S)egen

Nach einer sehr unruhigen Nacht machte es plötzlich Pling. Ja klar, der Kollege wollte wirklich nur helfen und schickt mir quasi durch zehn Blumen gesprochen den Hinweis, dass Functions evtl noch nicht funktionieren. Ja Moment, das ließe sich doch sehr schnell herausfinden, ich hatte ja inzwischen schon gelernt, wie man mit Registries für Docker Container umgeht, wie man in VSCode die richtigen Extensions installiert und vieles mehr. 


Heute dann brachte mir eine Anfrage bei StackOverflow die ersehnte Antwort, auch wenn sie für mich im Grunde niederschmetternd war, so hatte meine Suche endlich ein Ende. Meine Anfrage dort wurde prompt von meinen Community Kollegen beantwortet. Functions werden bei IoT Edge noch nicht unterstützt. Okay. Eine weitere Antwort brachte aber so viel Licht ins Dunkel, dass es mich für viele Tage erleuchten wird. (Nu bleib mal auf dem Teppich) 

"So, I went to check the status of Azure Functions Runtime and the good news is that they have now a version of their runtime for ARM."

Ich werde in absehbarer Zeit meine geliebten Functions auf eines der coolsten Devices nageln können. Herrlich. Vielen Dank an das Azure Functions Team.

Wenn ich Erfolg in diesem Projekt vermelden kann, dann werde ich einen weiteren Post schreiben.

~janekf

Links zu den Anleitungen:
[1] Hervorragende Anleitung, um IoT Edge auf den RPI zu bekommen: https://blog.jongallant.com/2017/11/azure-iot-edge-raspberrypi/

[2] Microsofts Dokumentation, die zu Beginn sehr viel zu wünschen übrig ließ: