{"id":394,"date":"2021-06-09T15:10:03","date_gmt":"2021-06-09T13:10:03","guid":{"rendered":"https:\/\/www.iot-embedded.de\/iot-2021\/?p=394"},"modified":"2021-06-09T15:10:51","modified_gmt":"2021-06-09T13:10:51","slug":"der-umstieg-von-raspbian-lite-auf-balena-os-und-die-damit-verbundenen-schwierigkeiten","status":"publish","type":"post","link":"https:\/\/www.iot-embedded.de\/iot-2021\/smart-drive\/der-umstieg-von-raspbian-lite-auf-balena-os-und-die-damit-verbundenen-schwierigkeiten\/","title":{"rendered":"Der Umstieg von Raspbian Lite auf Balena OS und die damit verbundenen Schwierigkeiten"},"content":{"rendered":"\n<p>Wie im letzten Blogeintrag beschrieben konnte die Funktionalit\u00e4t des Beschleunigungssensors\/Gyroskops best\u00e4tigt werden, indem erste Daten erfolgreich ausgelesen wurden. Um die ausgelesenen Sensordaten jetzt in die geplante Infrastruktur zu einzugliedern und die Anforderungen an das Projekt einzuhalten, muss die getestete Funktionalit\u00e4t in das bestehende Projekt integriert werden.<\/p>\n\n\n\n<p>Hierzu wurde zun\u00e4chst die Dockerfile angepasst, um alle Abh\u00e4ngigkeiten zu installieren.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM balenalib\/%%BALENA_MACHINE_NAME%%-debian-python:latest-run\n\n# Workaround, damit RPi.GPIO w\u00e4hrend der Installation kompiliert werden kann\n#RUN apt-get -y update; apt-get -y upgrade; apt-get -y install build-essential\n\nRUN apt-get update; apt-get -y install i2c-tools\n\nWORKDIR \/usr\/src\/app\nCOPY requirements.txt .\nRUN pip install --no-cache-dir -r requirements.txt\n\nCOPY app.conf .\nCOPY .\/src .\n\nCMD modprobe i2c-dev &amp;&amp; python app.py<\/code><\/pre>\n\n\n\n<p>Docker installiert jetzt sowohl i2c, das zum Ansteuern des Sensors benutzt wird, als auch das smbus2 Paket \u00fcber requirements.txt. <br>Der Code zum Auslesen der Sensordaten wurde soweit angepasst, dass er in die bestehende Infrastruktur passt und die gelesenen Daten an redis weiterleitet, anstatt sie auszugeben.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>def _perform_mesaurement(self):\n        self._logger.info(\"Starte neue Messung\")\n\n        # Beispiel: Wir messen Beschleunigung und Rotation des Sensors.\n        # Register\n        power_mgmt_1 = 0x6B\n        power_mgmt_2 = 0x6C\n\n        def read_byte(reg):\n            return bus.read_byte_data(address, reg)\n\n        def read_word(reg):\n            h = bus.read_byte_data(address, reg)\n            l = bus.read_byte_data(address, reg + 1)\n            value = (h &lt;&lt; 8) + l\n            return value\n\n        def read_word_2c(reg):\n            val = read_word(reg)\n            if val &gt;= 0x8000:\n                return -((65535 - val) + 1)\n            else:\n                return val\n\n        def dist(a, b):\n            return math.sqrt((a * a) + (b * b))\n\n        def get_y_rotation(x, y, z):\n            radians = math.atan2(x, dist(y, z))\n            return -math.degrees(radians)\n\n        def get_x_rotation(x, y, z):\n            radians = math.atan2(y, dist(x, z))\n            return math.degrees(radians)\n\n        bus = SMBus(1)  # bus = smbus.SMBus(0) fuer Revision 1\n        address = 0x68  # via i2cdetect\n\n        # Aktivieren, um das Modul ansprechen zu koennen\n        bus.write_byte_data(address, power_mgmt_1, 0)\n\n        # Beschleunigungs- und Rotationsmessungen auslesen\n        gyroskop_xout = read_word_2c(0x43)\n        gyroskop_yout = read_word_2c(0x45)\n        gyroskop_zout = read_word_2c(0x47)\n\n        beschleunigung_xout = read_word_2c(0x3B)\n        beschleunigung_yout = read_word_2c(0x3D)\n        beschleunigung_zout = read_word_2c(0x3F)\n\n        beschleunigung_xout_skaliert = beschleunigung_xout \/ 16384.0\n        beschleunigung_yout_skaliert = beschleunigung_yout \/ 16384.0\n        beschleunigung_zout_skaliert = beschleunigung_zout \/ 16384.0\n\n        # Werte in Dictionary speichern\n        reading = {\n            \"X_acceleration\": beschleunigung_xout_skaliert,\n            \"Y_acceleration\": beschleunigung_yout_skaliert,\n            \"Z_acceleration\": beschleunigung_zout_skaliert,\n            \"X_rotation\": gyroskop_xout,\n            \"Y_rotation\": gyroskop_yout,\n            \"Z_rotation\": gyroskop_zout,\n        }\n\n        return reading<\/code><\/pre>\n\n\n\n<p>An dieser Stelle w\u00e4re zu erwarten, dass der Raspberry PI die Sensordaten ausliest und an Redis weiterleitet, allerdings funktioniert dies nicht ganz. In unseren Tests entsteht ein Problem beim Auslesen der Daten, dessen Ursache noch nicht gefunden bzw. repariert werden konnte. Der Code l\u00e4uft soweit fehlerfrei, allerdings wird bei jedem Messwert immer nur 0.0 ausgelesen. Dies legt nahe, dass entweder der Sensor kaputt ist, oder ein Problem bei der Kommunikation zwischen Raspi und Sensor besteht. Der Sensor kann als Fehlerquelle bereits ausgeschlossen werden, da dieser in vorherigen Tests funktionierte.<\/p>\n\n\n\n<p>Nach mehreren Stunden vergeblicher Fehlersuche und \u00c4rger \u00fcber mangelnde BalenaOS Dokumentation kann ich den Fehlerbereich einschr\u00e4nken. Zwischen der Raspberry Lite und Balena OS variante unterscheiden sich die Outputs beim Command <strong>i2cdetect -y 1<\/strong><\/p>\n\n\n\n<p>Output Raspberry Lite OS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pi@raspberrypi ~ $ sudo i2cdetect -y 1\n 0 1 2 3 4 5 6 7 8 9 a b c d e f\n00: -- -- -- -- -- -- -- -- -- -- -- -- --\n10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --\n60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --\n70: -- -- -- -- -- -- -- --<\/code><\/pre>\n\n\n\n<p>Output Balena OS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@f2bb9fb94eb9:\/usr\/src\/app# i2cdetect -y 1\n     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n00:          03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\n10: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f \n20: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f\n30: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f\n40: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f \n50: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f\n60: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f \n70: 70 71 72 73 74 75 76 77<\/code><\/pre>\n\n\n\n<p>Auch die Outputs beim Befehl<strong> i2cget -y 1 0x68 0x75<\/strong> unterscheidet sich.<\/p>\n\n\n\n<p>Output Raspberry Lite OS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pi@raspberry:~$ sudo i2cget -y 1 0x68 0x75\n0x68<\/code><\/pre>\n\n\n\n<p>Output Balena OS:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>root@f2bb9fb94eb9:\/usr\/src\/app# sudo i2cget -y 1 0x68 0x75\n0x00<\/code><\/pre>\n\n\n\n<p>Der erste Unterschied ist, dass in Balena OS Ger\u00e4te erkannt werden, die gar nicht vorhanden sind. Dies macht mich bereits stutzig. Auch beim 2. Command wird ein anderer Output als erwartet ausgegeben, n\u00e4mlich 0x00 statt 0x68. An dieser Stelle bin ich ehrlich gesagt etwas \u00fcberfordert und hoffe, dass @dennis uns etwas aushelfen kann.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie im letzten Blogeintrag beschrieben konnte die Funktionalit\u00e4t des Beschleunigungssensors\/Gyroskops best\u00e4tigt werden, indem erste Daten erfolgreich ausgelesen wurden. Um die ausgelesenen Sensordaten jetzt in die geplante Infrastruktur zu einzugliedern und die Anforderungen an das Projekt einzuhalten, muss die getestete Funktionalit\u00e4t<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[8],"tags":[20,19,16],"_links":{"self":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/394"}],"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=394"}],"version-history":[{"count":2,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/394\/revisions"}],"predecessor-version":[{"id":396,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/posts\/394\/revisions\/396"}],"wp:attachment":[{"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/media?parent=394"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/categories?post=394"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iot-embedded.de\/iot-2021\/wp-json\/wp\/v2\/tags?post=394"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}