Smart Home in Containern (ioBroker + Zigbee in Docker)

Eintrag


Für einige Zeit habe ich mehrere Standard-Sonoff-Relais verwendet, die das Licht über Google Home Mini steuern. Aber am Ende wollte ich mehr. Die Standardfunktionalität reicht nicht aus, ich habe mich entschlossen, das System schrittweise etwas flexibler zu gestalten. Ich habe mich für ioBroker entschieden.

Zuerst habe ich wie üblich nach Funktionen gesucht, sie ausgewählt und sie überprüft. Als die Grundbedürfnisse getrennt arbeiteten, begann er sich zusammenzusetzen. Und natürlich bin ich auf Probleme gestoßen.

Die Hauptschwierigkeiten:

  • Was genau zu wählen? Schließlich gibt es viele Möglichkeiten, unseren Plan umzusetzen. Und selbst in der gewählten Lösung gibt es viele Möglichkeiten ...
  • Es gibt keine vorgefertigten Anweisungen, wie genau die von mir ausgewählten Lösungen und genau in meinen Konfigurationen zusammengestellt werden können.

Was ich gewählt habe, warum, auf welche Schwierigkeiten ich gestoßen bin und wie ich sie lösen kann, und es wird diskutiert.

Mit Blick auf die Zukunft werde ich beschreiben, wie ioBroker in Docker auf einem alten Laptop gestartet und Zigbee hineingeworfen wurde, um direkt mit Xiaomi-Sensoren ohne Gateway zu interagieren. Ich gebe keine Standardanweisungen, nur meine "Beulen".

Da es noch nicht produktiv ist, ist es durchaus möglich, etwas zu ändern. Also werde ich für die Ratschläge und Korrekturen dankbar sein :)

Wunschliste und der Zug meiner Gedanken


Es gab Sonoff-Rollen (in eWeLink aufgewickelt), eine Art Verlängerungskabel (Tuya SmartLife), ein Xiaomi-Gateway mit mehreren Sensoren (Mi Home) und eine Google Home Mini-Spalte.

eWeLink und SmartLife haben normalerweise auf Google Home aufgenommen und Sprachbefehle wie "Schalten Sie das Licht über dem Tisch ein" abgehört. Mi Home wurde nicht gestartet (in Google Home werden nur wenige Xiaomi-Geräte unterstützt).

Ich habe ioBroker eingesetzt, das Xiaomi Gateway in die Hand genommen, im Prinzip hat alles funktioniert. Alles ist schön, ich habe die Skripte überprüft, sie sind geschrieben (ich habe Node-Red gewählt), ich habe beschlossen, alles daran zu machen.

Ich bin jedoch kein professioneller Administrator, ich kann herausfinden, wie ich es bereitstellen soll, aber ich weiß nicht, in welche Feinheiten wie Bibliotheken und Komponenten eingefügt wird (und ich möchte nicht tief eintauchen). Daher störte es mich ein wenig, dass ioBroker nodejs benötigte, eine Art npm, mit der ich vorher nichts zu tun hatte. Es gibt Schwierigkeiten mit Versionen (wie das Standard-Yum aus dem Repository, das zu alte Nodejs usw. enthält).

Nun, d.h. Ich habe alles angefangen, aber die Angst blieb in meinem Herzen, dass ich nicht verstehe, wie es funktioniert, obwohl es funktioniert. Und wenn beispielsweise während eines Upgrades etwas kaputt geht, weiß ich nicht, wie ich es beheben kann. Neben ioBroker wollte ich aber auch andere Systeme auf den Laptop stapeln.

Ich werde zum Beispiel ein Update für etwas veröffentlichen, das zu funktionieren scheint. Und nach einiger Zeit stellt sich heraus, dass es schlecht funktioniert. Wir müssen das Backup vor einem Monat zurücksetzen. Darüber hinaus bezieht sich die Sicherung nicht nur auf dieses System, sondern auf alle anderen, da ich bis zum Ende nicht verstehe, von welchem ​​System die ausführbaren Dateien stammen, wo sich die Konfigurationsdateien befinden, wo sich die Daten selbst befinden ...

Es hat mich sehr gestört, deshalb habe ich mich für Docker entschieden. Der Code im Container. Daten separat wird das Verzeichnis auf dem Host gemountet. Einfach zu sichern.

Gibt es eine neue Version? Ja, auch auf einer anderen virtuellen Maschine kann leicht überprüft werden, wie die neue Version des Containers mit Daten aus diesem Verzeichnis funktioniert. Verschiedene Systeme stören sich nicht. Es ist einfach, die Binärdateien einiger Systeme zurückzusetzen. Auch hier ist es einfach, auf etwas anderes zu übertragen (ioBroker im Container funktioniert sowohl mit Synology als auch mit Single-Board). Schönheit!

Es wird mehr Anforderungen geben (um über das Internet verfügbar zu machen, aber aus Sicherheitsgründen nicht öffentlich verfügbar zu sein), die sich bei der Auswahl der Konfigurationen weiter auswirken.

Installation


Das Host-Betriebssystem ist nicht kritisch, ich habe CentOS heruntergeladen (aus dem alten Speicher erinnerte ich mich, dass es für alle Netzwerkaufgaben ziemlich stabil und fehlerfrei funktionierte). Die aktuelle Version war Cent OS 8.

Setzen Sie es. Ich habe grundlegende Einstellungen wie Hostname, fail2ban vorgenommen (nur eine Gewohnheit, obwohl sich der Host nur im LAN befindet). Setzen Sie Docker. Ich werde nicht weiter darauf eingehen. Beispielanweisungen .

Es ist Zeit, ioBroker zu starten. Aber welches Netzwerk soll man wählen? Host oder Macvlan?

Zunächst wollte Macvlan, dass jeder Container seine IP-Adresse vom Router erhält. Aber dann beschloss er, dieses Unternehmen aufzugeben:

  • Bei Host müssen Sie natürlich explizit angeben, welche Ports weitergeleitet werden sollen, und sicherstellen, dass sie sich nicht mit anderen Containern überschneiden. Aber
  • iptables müssen in jedem Container konfiguriert werden. Einschließlich nach jedem Neustart mit anderen Parametern, Upgrade / Austausch. Im Host-Modus ist dies ein zentraler Punkt für das Sicherheitsmanagement.
  • Ich habe immer noch vor, es nicht nur von zu Hause aus über WLAN verfügbar zu machen. In diesem Fall ist es bequemer, einen Host von außen zugänglich zu machen (und a la Port-Mapping darauf), als ihn für mehrere zu konfigurieren.

Derzeit aktiviert ZeroTier One. Installiert es nur auf dem Host. Der Zugriff auf die IP-Adresse dieses Hosts (nicht lokal, aber von ZeroTier ausgestellt) und des Ports 8082 vom Mobiltelefon aus über GPRS, wenn der ZeroTier-Client perfekt ausgeführt wird, öffnet die vis-Schnittstelle.

Also Standard

docker run -d --name ioBroker -p 8081:8081 -p 8082:8082 -v /opt/iobroker/:/opt/iobroker/ --device=/dev/ttyACM0 --env-file /opt/ioBroker_env.list --restart=always buanet/iobroker:latest 

Hoppla! Irgendwas ist schief gelaufen.

docker logs ioBroker zeigt, dass im letzten Schritt keine Verbindung zu externen Ressourcen besteht. Ich kann keinen razorzvolitischen Namen bekommen.

docker exec -it ioBroker bash zeigt, dass Ping über IP gut von ihm geht, aber nicht nach Namen.

Google, ich finde eine Reihe von Links darüber, wie der Docker den DNS-Server falsch ersetzt. Ich regiere /etc/docker/daemon.json, ich verstehe dnsmasq - nichts hilft.

Ein Gedanke schleicht sich ein, plötzlich ist etwas auf Netzwerkebene blockiert. Der Container enthält jedoch kein Telnet oder Curl. Ich kann dies nicht überprüfen. Die Installation ist auch nicht einfach - die Installation funktioniert nicht. Sie können die erforderlichen Hosts natürlich manuell in / etc / hosts angeben. Dies ist jedoch zu zeitaufwändig. Ich überprüfe besser andere Versionen.

Zum Beispiel stoppe ich dumm die Firewall auf dem Host in der Hoffnung, dass sich alles öffnet. Aber nein

Ich erinnere mich, dass die Verfügbarkeit von Ports immer noch mit wget überprüft werden kann. Und er ist im Container! Und kann auch per IP nichts herunterladen. Auch die Weboberfläche des Heimrouters kann keine Verbindung herstellen. Nun, das heißt, das Problem liegt definitiv nicht im DNS, sondern in iptables.

Infolgedessen funktionierte alles, nachdem die Docker-Schnittstelle zur vertrauenswürdigen Zone hinzugefügt wurde:

 sudo firewall-cmd --permanent --zone=trusted --change-interface=docker0 sudo firewall-cmd --reload 

Das ist sogar interessant, habe ich irgendwo in der Anleitung übersehen?

Oder würde ich nicht CentOS 8 nehmen, aber etwas anderes, es würde kein Problem geben (in anderen Betriebssystemen wird standardmäßig keine Firewall verwendet)?

Oder ist es für alle so offensichtlich, dass sie nicht in die Anleitung schreiben, ich bin schon lange allein dumm?

Zigbee


Mein ioBroker befindet sich also im Container und es sind nur wenige Ports veröffentlicht. Dies ist nun der Administrator 8081 und der Vis 8082, dann wird mqtt 1883 hinzugefügt und möglicherweise etwas, um Tuya zu unterstützen (ich habe einen solchen Treiber gesehen, habe es aber noch nicht herausgefunden).

Leider werden für die Interaktion mit Xiaomi-Geräten über das Gateway Multicasts benötigt, und dies in dieser Konfiguration der Komplexität. Deshalb habe ich mich entschlossen, einen USB-Stick-Container hineinzuwerfen. Auch ein normaler Betrieb.

In der Befehlszeile haben Sie dafür bereits --device=/dev/ttyACM0 . Das Gerät im Container erschien. In ioBroker habe ich den Standardtreiber "Zigbee für Xiaomi und andere Geräte" aktiviert, aber es hat nicht funktioniert.

Google schlägt vor, dass Sie den Benutzer zur Dialout-Gruppe hinzufügen müssen, um auf die serielle Schnittstelle zuzugreifen. Ich gehe in den Container, füge iobroker zu dieser Gruppe hinzu - es hilft nicht.

Ich sehe die Hinweise, dass Sie das serialport-Paket über npm installieren müssen.

Ich kann keine Rechte. Google weiter.

Bluefox allein teilt jemandem mit, dass dies über das Verzeichnis /opt/iobroker/node_modules/iobroker.javascript/ erfolgen muss. Ich habe keine und habe immer noch keine Installationsrechte (das heißt, die Installation beginnt und dann) stürzt ab).

Schließlich wird mir klar, dass ich in der Befehlszeile explizit angeben muss, in welches Verzeichnis gestellt werden soll.

 npm install -g serialport --production --save --prefix "/opt/iobroker" 

Es ist installiert, hilft aber nicht.

Ich fange an zu vermuten, dass Sie sich noch mit Zugriffsrechten befassen müssen. Überprüfung (natürlich aus dem Inneren des Behälters):

 test -w /dev/ttyACM0 && echo success || echo failure 

Erfolg Das heißt Trotzdem warf der Docker das Gerät richtig.

 sudo -H -u iobroker test -w /dev/ttyACM0 && echo success || echo failure 

Doof! Fehler

Bash im Container läuft unter dem Root, aber vom iobroker-Benutzer gibt es keinen Zugriff auf den Port. Trotz vorheriger Hinzufügung zur Dialout-Gruppe.

ls -l /dev/ttyACM0 gibt

 crw-rw----. 1 root 18 166, 0 Nov 3 18:14 /dev/ttyACM0 

Ha! Was ist 18 anstelle des Namens der Gruppe?

Auf dem crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0 ist alles korrekt: crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0 crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0

Es stellt sich heraus, dass auf dem dialout:x:18 in / etc / group dialout:x:18 und im Container dialout:x:20

Obwohl ich der Gruppe einen Benutzer mit diesem Namen hinzugefügt habe, macht es keinen Sinn, dass die Nummer nicht dieselbe ist. Also habe ich eine weitere Gruppe mit der Kennung 18 erstellt und den Benutzer bereits hinzugefügt:

 groupadd -g 18 serial usermod -a -G serial iobroker 

Ich habe alles für mehr Sicherheit neu gestartet. Und damit endete mein Showdown :)

Er löste ruhig alle Sensoren vom Xiaomi-Gateway und band es an ioBroker.

Ich sehe sie als Objekte in ioBroker selbst:



Vis Lesungen werden gelesen:



Wenn die Kontakte am Lecksensor geschlossen sind, werden Daten empfangen. Und das Bild ändert sich:



Und in Node-Red kommt das Signal. Dementsprechend wird, obwohl E-Mails oder etwas anderes gesendet werden, eine Sprach- oder MP3-Datei an die GH Mini-Spalte gesendet:



Übrigens erwartete mich beim Betrachten der Objekte eine Überraschung:



Ich drehte den Xiaomi-Würfel auf eine andere Seite. Die letzten Änderungen werden grün angezeigt.
Flip90 hat sich geändert - das ist verständlich. Dieses Signal wird zur Steuerung abgefangen. Aber es stellt sich heraus, dass es immer noch flip90_from und flip90_to gibt - mit welcher Seite er sich gedreht hat.

Es stellt sich heraus, dass Sie theoretisch noch mehr Steuersignale vom Würfel erhalten können. Wenn Sie beispielsweise Pfeile an den Kanten zeichnen (wie in einem Kreis), können Sie nicht nur „90 drehen“, sondern auch in welche Richtung (von sich selbst oder zu sich selbst, links oder rechts) verfolgen.

Für flip180 funktioniert es auch. Und für andere Gesten gibt es ähnliche zusätzliche Informationen (Oberseite beim Drehen um 180 °, Oberseite beim Schieben, Oberseite beim Tippen)

Nicht, dass es dringend gebraucht worden wäre. Aber im Standard Mi Home gab es keine Informationen über die Gesichter. Es scheint, dass ich bei der vorherigen Verbindung über Xiaomi Gateway diese auch nicht gesehen habe und nicht wusste, dass jedes Gesicht eine Nummer hat. Früher wusste ich nur über die zusätzliche Aktion des Sturzes (freier Fall) Bescheid, aber sie wurden aus Mi Home ausgewiesen (anscheinend ließen sie ihn zu oft fallen).

Final


Ich brauche nur zu arbeiten. Dann können Sie Schönheit bringen, Skripte schreiben, Tuya verbinden, einen Container mit Blynk für andere Projekte starten ...

Und vielleicht, um etwas basierend auf Ihren Kommentaren zu wiederholen :)

Source: https://habr.com/ru/post/de474354/


All Articles