Node-RED-Integration: USB-Ports für Docker-Container freigeben

Hallo @elfedagger :slight_smile: Wenn mir Änderungen am Gladys Node-RED-Container gegeben werden, mache ich sie gerne :slight_smile:

:slightly_smiling_face: Ich freue mich darauf, dass meine Somfy-Sonnenschutzanlagen wieder automatisch schließen und öffnen. Das ist wirklich ein angenehmer Komfort, den mir Gladys über Node Red ermöglicht. Aber was ich versucht habe, um dem zu folgen, was an diesem Problem gemacht wurde, übersteigt meine Fähigkeiten bei weitem.

Alles liegt in den Händen von @Psoy :slight_smile: Entschuldigung, dass ich bei diesem Thema nicht viel helfen kann, ich bin zu 100% Zigbee bei mir zu Hause.

Aber bei mir funktioniert es, ich möchte nur testen, indem ich meinen Zigbee-Key und den Rflink anschließe, um zu sehen, wie diese Änderung reagiert. Das werde ich nächste Woche machen.
Aber schon beim Anschließen nur des Rflinks funktioniert es sehr gut. Ich werde eine Zusammenfassung der Manipulation machen, aber ich weiß nicht, wie ich das in das Gladys-Image integrieren soll.

Ich auch alles Zigbee, aber bei Somfy habe ich keine Wahl.

Hallo @Psoy @elfedagger
Ich habe gerade in der z2m-Dokumentation gesehen, dass man den USB-Port eines externen USB-Geräts an den Docker an einen internen USB-Port des Docker anhängen kann: Docker | Zigbee2MQTT

Man sieht, dass ein bestimmtes Gerät auf einen definierten Port gemappt wird und dass Benutzerrechte darauf vergeben werden.

Könntet ihr zufällig das stattdessen von meinem Skript testen?

Meiner Meinung nach (noch nicht getestet) wird das nicht das Problem lösen, ein bestimmtes Gerät automatisch über Gladys zu mounten, das einen internen Node-Red startet, aber wenn man einen dedizierten Docker für Node-Red verwendet, dann wird es für alle möglich sein (vorausgesetzt, man findet den genauen Pfad/Namen des Geräts auf dem Host).

Guten Abend,
Also, ich habe es mit meinem Zigbee-Stick getestet, der Serial-Node verbindet sich gut und das Zigbee funktioniert perfekt. Die Einschränkung, die es gibt, und zwar auch beim Mini-PC, ist, dass sobald man den Zigbee-Stick, der am USB0-Port angeschlossen ist, abzieht und den Rflink, der am USB1-Port angeschlossen ist, abzieht (aus welchen Gründen auch immer, z. B. wenn die Sicherung rausfliegt (man zieht nichts ab, aber so ist es)), und dann den Rflink zuerst wieder ansteckt, wird ihm der USB0-Port zugewiesen und für den Zigbee-Stick wird der USB1-Port zugewiesen.
Und dann funktioniert das Zigbee nicht mehr, solange der Zigbee-Stick nicht wieder auf den USB0-Port zurückgesetzt wird, und es ist unmöglich, ihm den USB1-Port in der Gladys-Integration zuzuweisen (ich habe nicht herausgefunden, warum). Allerdings funktioniert der Rflink, der Serial-Node ist verbunden und sendet die von dem Zigbee-Stick empfangenen Nachrichten (in Kauderwelsch, natürlich), da er etwas auf seinem Anfangsport, dem USB1-Port, sieht.
Die Lösung besteht darin, alles abzustecken und wieder anzustecken. Wenn der Zigbee-Stick am USB0-Port war, steckt man ihn zuerst wieder an und dann den Rflink, der dann am USB1-Port ist, wie bei der Initialisierung.

Also, ist das wirklich ein Problem? Wer zieht seine USB-Ports ab?

Im stabilen Betrieb funktioniert diese Änderung, um den Serial-Node verbunden zu halten, gut. Zur Information, man braucht nur eine Mega 2560-Karte und muss ihr das Rflink-Programm einspielen, um die Verbindung zu testen.

Hier ist, was ich per SSH in den Raspberry eingegeben habe:

Alle Befehle werden auf dem Host ausgeführt, nicht im Gladys-Docker.
Man muss auch sicherstellen, dass dein Gladys- und Node-Red-Docker laufen.

Man muss eine Datei namens « 99-docker-tty.rules » erstellen
Im Ordner /etc/udev/rules.d
Man muss diesen Befehl eingeben, um in diesen Ordner zu gelangen
cd /etc/udev/rules.d

Dann erstellt und bearbeitet man die neue Datei: 99-docker-tty.rules
sudo nano 99-docker-tty.rules

Man kopiert/klebt die folgenden Anweisungen hinein:

ACTION=="add", SUBSYSTEM=="tty", RUN+="/usr/local/bin/docker_tty.sh 'added' '%E{DEVNAME}' '%M' '%m'"
ACTION=="remove", SUBSYSTEM=="tty", RUN+="/usr/local/bin/docker_tty.sh 'removed' '%E{DEVNAME}' '%M' '%m'"

Um die Datei zu speichern, gibt man ein:
ctrl+X
Dann tippt man

Y

Man drückt die Taste
Enter
zum Speichern und Schließen.

Dann Anwendung der Regeln, man gibt den folgenden Befehl ein
sudo udevadm control --reload

Schließlich muss man das Skript erstellen, das das Gerät automatisch am USB-Port ein- und aushängt:
Gehe in den Ordner: /usr/local/bin
tippe diesen Befehl
cd /usr/local/bin

Dann erstellt man eine Datei namens « docker_tty.sh »
sudo nano docker_tty.sh

Man kopiert/einfügt:

#!/usr/bin/env bash                                                             
echo "Usb event: $1 $2 $3 $4" >> /tmp/docker_tty.log        
if [ ! -z "$(docker ps -qf name=gladys-node-red)" ]                                     
th en                                                                            
if [ "$1" == "added" ]                                                          
    then
        chmod a+rw $2                                                                         
        docker exec -u 0 gladys-node-red mknod $2 c $3 $4                               
        docker exec -u 0 gladys-node-red chmod -R 777 $2                                
        echo "Adding $2 to docker" >> /tmp/docker_tty.log                
    else                                                                        
        docker exec -u 0 gladys-node-red rm $2                                          
        echo "Removing $2 from docker" >> /tmp/docker_tty.log            
    fi                                                                          
fi

man verlässt und speichert
ctrlX
dann tippt man Y und die Taste Enter

Und zum Schluss gibt man diesem Skript Ausführungsrechte:
sudo chmod +x /usr/local/bin/docker_tty.sh

ACHTUNG: Dieses Skript wurde nicht von @pierre-gilles validiert und wenn du es testen möchtest, verwende nicht den Rechner, der Gladys jeden Tag laufen lässt
@mutmut danke für die Entwicklung dieses Programms.

Wenn du einverstanden bist @pierre-gilles, sollte man diese Befehle automatisieren und in das Testbild von gladys node-red integrieren, das ich eventuell erneut testen könnte. Vielen Dank im Voraus

Guten Abend @mutmut
Ich habe mir angesehen, was du geschickt hast, aber soweit ich sehe, geht es dabei um den Zigbee-Port, und für den RFLink-Port muss man, glaube ich, die Anweisungen noch einmal durchgehen, und das ist mir ein bisschen zu technisch :roll_eyes:
Falls du Zeit hast, könntest du mich bitte, wie beim letzten Mal, anleiten? Ich würde gerne bereitwillig testen :grinning:

Ich bin mir nicht sicher, ob das die beste Lösung ist, muss ich zugeben!

Dein Vorschlag erfordert Manipulationen am Host und ändert den laufenden Docker-Container, was keine gute Praxis ist. Ein Container sollte unveränderlich sein: Er sollte niemals direkt geändert werden, da er bei jedem Image-Update gelöscht und neu erstellt wird (das ist das ganze Prinzip von Docker).

Ich denke, es wäre besser, sich auf eine einfachere Lösung zu konzentrieren. Meiner Meinung nach können wir das einfach durch Anpassen des docker run lösen :slight_smile:

hallo @pierre-gilles
Danke für deine Antwort
Ja, ich bin deiner Meinung, deshalb habe ich dich gefragt, ob du Zeit hast, ein Bild zu erstellen, das diese Änderungen integriert, und das, wenn ich es richtig verstanden habe, mit dem docker run gestartet werden würde

Aber genau das ist es ja: Deine Lösung ist keine Lösung, die in docker run enthalten ist :stuck_out_tongue:

Ich will einfach nur, dass du mir ein docker run gibst, das funktioniert, ohne dass ich weitere Änderungen vornehmen muss!

ich werde versuchen, das zu prüfen, aber es ist nicht sicher

Ich werde versuchen, das zu prüfen, aber es ist nicht sicher.
Muss ich einen neuen Gladys-Container mit Docker erstellen? Oder füge ich einfach Befehle in das docker run hinzu?

Eigentlich geht es darum, dass du mir den vollständigen docker run-Befehl zum Starten des offiziellen Node-RED-Containers lieferst.

Bisher habe ich den Container im Tutorial auf der Website (Intégrer Node-RED avec Gladys Assistant en MQTT | Gladys Assistant) so gestartet:

docker run -d \
--log-opt max-size=10m \
--restart=always \
--privileged \
-u root \
--network=host \
--name node_red \
-v /var/lib/node-red:/data \
nodered/node-red

Es muss untersucht werden, um einen docker run-Befehl zu finden, der mit dem Zugriff auf die USB-Ports funktioniert, ohne nachträgliche Änderungen am Container nach dem Start.

Was du mir sagst, ist, dass ich den docker run ändern soll, den Gladys startet, wenn sie den Zugriff auf Node RED anfordert?
Falls das so ist, wie komme ich an diesen docker run, um ihn zu ändern? Verwende ich den, den du mir gerade geschickt hast? Und wie starte ich ihn danach?

Bisher kenne ich nur diesen docker run:

docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--cgroupns=host \
--restart=always \
--privileged \
--network=host \
--name gladys \
-e NODE_ENV=production \
-e SERVER_PORT=80 \
-e TZ=Europe/Paris \
-e SQLITE_FILE_PATH=/var/lib/gladysassistant/gladys-production.db \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/gladysassistant:/var/lib/gladysassistant \
-v /dev:/dev \
-v /run/udev:/run/udev:ro \
gladysassistant/gladys:node-red-usb-ports

Ja!

Ja, das ist das, das ich dir gerade in meiner vorherigen Nachricht gegeben habe :slight_smile:

Indem du es in das Terminal eingibst und es startest? Ich verstehe die Frage nicht ganz :smiley:

Du verwechselst das mit dem Docker run von Gladys, hier geht es um Node-RED

Nein, das ist sehr klar, der erste startet den Container von Gladys, der den Start von Node-RED (wenn ich so sagen darf) enthält, und der andere ist einfach nur der Container von Node-RED, der von Gladys gestartet wird.

Also, wenn ich den Container starte, den du mir gerade geschickt hast, starte ich Node-RED, als ob es Gladys wäre, die es startet?

Nicht genau, die Konfiguration ist hier, was uns einen Docker Run gibt:

docker run -d \
  --name gladys-node-red \
  --restart always \
  -p 1881:1880 \
  -v /var/lib/gladysassistant/node-red:/data \
  --log-opt max-size=10m \
  nodered/node-red:3.1

(In Produktion)

Ich bin verloren, ich sehe nicht, wie ich vorgehen soll :thinking:

Hallo @pierre-gilles
Wenn ich deinen docker run (mit oder ohne sudo davor) starte, gibt es ein Berechtigungsproblem
• Error: EACCES: permission denied, copyfile '/usr/src/node-red/node_modules/node-red/settings.js' -> '/data/settings.js'
Dieser Fehler deutet darauf hin, dass der Node-RED-Container keine Berechtigung hat, die Konfigurationsdatei settings.js vom Quellverzeichnis /usr/src/node-red/node_modules/node-red/ in das Datenverzeichnis /data/ zu kopieren.
Aber wenn ich Node Red über Gladys starte, funktioniert es, fehlt da nicht etwas? Ich habe versucht, --user 1000:1000 \ einzufügen, aber das bringt nichts.
Ich habe das Problem so gelöst:

`pi@rasp3b:~ $ sudo chmod 777 /var/lib/gladysassistant/node-red
pi@rasp3b:~ $ docker restart ada12c9cdc4a
ada12c9cdc4a
pi@rasp3b:~ $ ls -l /var/lib/gladysassistant/node-red
total 36
drwxr-xr-x 3 pi pi 4096 Mar 24 23:12 lib
drwxr-xr-x 2 pi pi 4096 Mar 24 23:12 node_modules
-rw-r–r-- 1 pi pi 120 Mar 24 23:12 package.json
-rw-r–r-- 1 pi pi 23200 Mar 24 23:12 settings.js

`dann startet Node Red und
wenn ich die Berechtigungen etwas einschränke, funktioniert nichts mehr,

pi@rasp3b:~ $ sudo chmod 766 /var/lib/gladysassistant/node-red
pi@rasp3b:~ $ docker restart ada12c9cdc4a
ada12c9cdc4a
pi@rasp3b:~ $ ls -l /var/lib/gladysassistant/node-red
ls: cannot access '/var/lib/gladysassistant/node-red/package.json': Permission denied
ls: cannot access '/var/lib/gladysassistant/node-red/settings.js': Permission denied
ls: cannot access '/var/lib/gladysassistant/node-red/node_modules': Permission denied
ls: cannot access '/var/lib/gladysassistant/node-red/lib': Permission denied
total 0
d????????? ? ? ? ?            ? lib
d????????? ? ? ? ?            ? node_modules
-????????? ? ? ? ?            ? package.json
-????????? ? ? ? ?            ? settings.js

et dann hängt sich Node Red wieder auf
Ein bisschen Hilfe wäre hier sehr willkommen, denn ich drehe mich im Kreis und komme nicht weiter :sob:
Vielen Dank im Voraus

Im Node-RED-Integrationscode gibt es tatsächlich einen chown-Befehl, um den Besitzer des Ordners zu ändern:

https://github.com/GladysAssistant/Gladys/blob/master/server/services/node-red/lib/configureContainer.js#L24