Raspbian Gladys 4 - Bildentwicklung - Überlegungen

Hallo zusammen!

Wie ich in meinem letzten Newsletter erwähnt habe, ist eine meiner Prioritäten im Moment, ein offizielles Raspbian-Image für Gladys 4 zu erstellen.

Die Spezifikationen sind wie folgt:

  • Muss für alle Versionen des Raspberry Pi (1, 2, 3, 4, Zero, Zero W, etc.) funktionieren
  • Gladys 4 wird über Docker installiert
  • Muss sich selbst aktualisieren können, ohne dass man sich über die CLI anmelden muss.
  • Gladys-Daten (DB, etc.) werden in /var/lib/gladysassistant gespeichert
  • USB-Ports werden verwaltet und in Docker exponiert
  • Hostname « gladys »

Mein aktuelles Problem

Laut dem, was ich gefunden habe, gibt es derzeit ein Problem mit den neuesten Versionen von Docker auf ARMv6-Geräten (also Raspberry Pi 1 und W). Die Builds laufen auf diesen Rasps nicht.

Siehe =>

Eine Möglichkeit wäre, zu einer älteren Version von Docker zurückzukehren, ABER ohne auf Raspbian Buster zu wechseln, da diese Versionen nur auf Stretch gebaut wurden.

Laut meinen Tests scheint es nicht tausend Lösungen zu geben:

  1. Zwei verschiedene Images erstellen: eines für Raspberry Pi ARMv6 (Rpi 1 und W) und eines für die anderen (2, 3, 4). Das Image für Raspberry Pi ARMv6 würde auf Stretch basieren. (Das ist viel Arbeit)
  2. Nur ein Image unter Buster erstellen und sagen, dass Gladys nicht mehr mit Raspberry Pi 1/W kompatibel ist (ich bin kein Fan dieser Lösung)
  3. Die neueste Version von HypriotOS verwenden, ein auf Raspbian Buster basierendes OS mit der neuesten Docker-Version vorinstalliert. Ich habe es noch nicht getestet, aber HypriotOS scheint eine gute Lösung zu sein!
  4. HypriotOS + flash + cloud-init verwenden! Das wäre die ultimative Kombination. Das Ziel wäre, das Image auf meiner Seite über eine cloud-init-YAML-Datei ( Beispiel ) zu erstellen, dann ohne es jemals zu starten, es so auf der Website zu veröffentlichen. Dadurch ist das Image hyper sauber (weil ich es nie gebootet habe) und beim ersten Start lädt das Image die Docker-Image von Gladys 4 in der neuesten Version herunter und startet es. Der Vorteil ist, dass das Image immer auf dem neuesten Stand ist. Der Nachteil ist, dass der Raspberry Pi beim ersten Start von Gladys mit dem Internet verbunden sein muss und dass der Download bei langsamen Verbindungen etwas Zeit in Anspruch nehmen kann.

Also, ich arbeite daran, ich bin offen für Feedback, wenn ihr Anmerkungen/Tipps habt, interessiert mich das :slight_smile:

@VonOx?

Offensichtlich ist der Nachteil der Lösung 4 gar kein richtiger Nachteil, ich denke, die meisten Raspberry Pis haben Internetzugang, komplett offline Raspberry Pis sind Einzelfälle und die betreffenden Benutzer sind in der Kategorie „Experte“ und werden damit klarkommen :grin:.

Die Lösung 5 wäre, ein Raspberry Pi-Image mit QEMU zu erstellen.

Ich bin der Meinung, dass Lösung 5 die „perfekte“ Lösung ist, aber sie ist auch die zeitaufwendigste ^^ Nicht einfach, alles umzusetzen und alles zu verstehen!

Ich denke, ich habe im Moment mehr Mehrwert, wenn ich an den Services arbeite :slight_smile:

Ich habe gerade Methode 4 auf einem Raspberry Pi 1 getestet, dem Äquivalent eines Pi Zero W. Zwar nicht besonders repräsentativ für die gesamte Palette, aber es lohnt sich, unter den schlechtesten Bedingungen zu testen, um zu wissen, was einen erwartet.

Die Einrichtung dauert zwar recht lange… Es ist nicht sehr schnell für den Benutzer. Der Docker-Pull dauert ewig (trotz Glasfaser, aber der Ethernet-Port ist langsam + der CPU hat Mühe, die Layer-Archive zu entpacken).

Ich denke, die beste Lösung für den Moment ist, eine Mischung aus Lösung 3 und 4 zu verwenden:

  • Ich erstelle das Image mit cloud-init auf meiner Seite
  • Dann starte ich es einmal auf einem Pi 1, damit der Pull + das Starten einmal erfolgt (die DB initialisiert sich so)

Beim ersten Start hat der Benutzer eine Gladys-Instanz, die quasi sofort läuft, das ist sicherlich flüssiger für den Endbenutzer.. Wir sind noch nicht bei der vollständigen Automatisierung des Image-Builds, aber für mich ist die Priorität Nr. 1 die Benutzererfahrung!

Was ist für dich ein „Plombe“?

Weil ich persönlich nichts dagegen habe, das Ding 30-60 Minuten laufen zu lassen… :stuck_out_tongue:

20 Minuten :smiley:

Es ist nicht die Länge, die für den Benutzer unklar ist, sondern dass es kein externes Feedback gibt. Man verbindet den Pi und wartet, und wenn es nicht funktioniert, weiß man nicht, was schiefgelaufen ist… Und vor allem, wenn ein Fehler auftritt, ist alles im Eimer, und es sei denn, man sucht in den cloud-init-Logs, wird man nie wirklich wissen, was schiefgelaufen ist.

Beispiel: Ich hatte Probleme mit der DNS-Auflösung des Docker Hub beim docker pull (wirklich dumme Probleme, es reichte aus, den Befehl neu zu starten), und deshalb funktionierte nichts mehr ^^

Wenn wir wollen, dass das Produkt ohne CLI verwendbar ist, muss der Installationsprozess fehlerfrei sein. Je weniger wir beim Kunden machen, desto sicherer ist es, dass alles gut geht.

Nun, zunächst habe ich den hybriden Ansatz gewählt, gebaut auf einem Raspberry Pi 1 mit:

  • Ein Docker-Container Gladys 4, der auf Port 80 hört, zugänglich unter gladys.local
  • Ein Watchtower-Container

Beide mit restart=always, also sollte es immer gut gehen.

Ich teste das Image auf einem neueren Pi, um zu sehen, ob alles funktioniert!

Ich sage trotzdem eines der Nachteile dieser Methode:

Beim ersten Start des Benutzers, wenn seine Version von Gladys nicht aktuell ist, wird Watchtower sie automatisch aktualisieren. Aber dann wird der Benutzer wahrscheinlich dabei sein, sein Gladys einzurichten, und der Server wird neu gestartet, während der Benutzer mitten in der Konfiguration ist! Auch nicht besonders sauber.

Getestet auf Raspberry Pi 4, welch ein Vergnügen!

Et hop, ein erstes Bild von Raspbian Gladys 4, recht grundlegend:

https://mirror-fr-2.gladysassistant.com/releases/gladys-4-alpha-1.img.zip

  • Getestet auf Raspberry Pi 1 und 4
  • Basierend auf HypriotOS 1.11.1 (Docker 19.03.0 CE + Raspbian Buster)
  • USB-Ports funktionieren (getestet mit einem Schlüssel von Zwave.me)
  • Automatisches Update mit Watchtower

Lasst mich wissen, wenn ihr Feedback habt :slight_smile:

Hallo zusammen,

ich möchte meine Meinung zu der Frage äußern, da ich viel mit RPi und Docker entwickelt habe, und zwar auf allen Modellen.

Die Probleme mit den armv6-Modellen (Pi1 und 0) sind wiederkehrend, aber ich halte HypriotOS nicht für die ultimative Lösung, da es einschränkend sein kann:
Für mich ist es wichtig, mit den Raspberry Pi verschiedene Dinge zu tun. Auch auf HypriotOS ist es nicht möglich, mit allen Hardware-Schnittstellen zu arbeiten (ich habe es nie geschafft, einen einfachen OneWire-Temperatursensor zu integrieren). Ebenso ist es sehr kompliziert, einen über HDMI angeschlossenen Bildschirm auf diesem OS zu nutzen.
Daher wird die Nutzung der Pi mit HypriotOS auf Gladys beschränkt sein, und man muss sicherstellen, dass alle USB-Geräte erkannt werden.

Für mich wäre es daher besser, bei Raspbian zu bleiben (aber das ist nur meine einfache Meinung und der erste Beitrag, den ich im Forum schreibe :wink:).
Außerdem habe ich, angesichts der Beiträge von gestern, die Docker-Issues angesehen:
docker-ce segmentation fault on Raspbian

Ich habe es geschafft, Docker 19.03.2 auf Raspbian Buster auf einer RPi0W zu installieren.
Ich kann detailliert beschreiben, wenn es euch nützlich ist.

Danke @Reno für dein Feedback!

Wenn du das Verfahren genauer beschreiben könntest, würde mich das interessieren :slight_smile:

Ich habe keine Erfahrung mit HypriotOS, ich dachte, es wäre einfach ein Raspbian Buster mit installiertem Docker, aber tatsächlich könnte es besser sein, ein klassisches Raspbian Buster zu verwenden, wenn das möglich ist

Gern geschehen, wenn es hilft :+1:

Offenbar liegt das Problem am Binärprogramm ‹ containerd › (v1.2.6-3), das nicht für armv6 kompiliert ist und da das Projekt container.io laut meinen Informationen noch nicht frei ist, können wir es auch nicht selbst kompilieren…
Allerdings bietet Hypriot eine etwas ältere Version (v1.2.6-1) auf seinen Servern an, die auf armv6 läuft, aber ich habe nicht verstanden, wie diese erstellt wurde.
Man muss also einfach ein Debian-Paket herunterladen und manuell installieren:
curl -s https://packagecloud.io/install/repositories/Hypriot/rpi/script.deb.sh | sudo bash
wget --content-disposition https://packagecloud.io/Hypriot/rpi/packages/raspbian/buster/containerd.io_1.2.6-1_armhf.deb/download.deb
sudo dpkg -i containerd.io_1.2.6-1_armhf.deb
Ich bin mir nicht sicher, ob die erste Zeile obligatorisch ist. Muss getestet werden

Dann Docker installieren:
curl -sSL https://get.docker.com | sh

Was Hypriot angeht, habe ich das vor mehr als einem Jahr, vielleicht sogar zwei (die Zeit vergeht schnell…) getestet, bevor ich wieder zu Raspbian gewechselt bin. Laut dem, was ich gelesen hatte, war der Zugriff auf die Hardware nicht im Fokus des Projekts, aber vielleicht hat sich das inzwischen geändert?

Ok, ich verstehe die Geschichte besser! :slight_smile:

Ich behalte das im Hinterkopf und sobald ich es teste, hinterlasse ich hier eine Nachricht. Es ist klar, dass es wahrscheinlich besser ist, ein klassisches Raspbian zu haben, wenn man andere Programme neben Gladys behalten möchte.

Die Verwaltung wäre anders, alles wäre von Anfang an enthalten. :wink:

Genau :slight_smile: :blush: Im Moment gibt es nur Z-Wave, MQTT, RTSP-Kamera, Telegram & DarkSky.

Es gibt einige Dienste, die gerade migriert werden (Xiaomi, Philips Hue, Sonos, ..), es wird gearbeitet!

Das Ziel ist es, alle Module, einschließlich Sonoff, zu migrieren. Es befindet sich derzeit in einem Pull Request (ein Entwickler arbeitet gerade am Modul). Es sollte also in Kürze eintreffen, alles hängt vom Entwicklungsfortschritt ab.

@damalgos +1, tatsächlich wird der Sonoff-Dienst gerade von @AlexTrovato migriert. Das PR für MQTT wurde kürzlich migriert, also sollte das diesen Dienst freischalten können.

Momentan ist die direkte Integration von Google Home nicht in meinen kurzfristigen Entwicklungsplänen (es gibt schon genug Arbeit bei der Migration der Dienste!), aber langfristig warum nicht. Wie immer sind alle PRs willkommen :slight_smile: