Hola @elfedagger
Si me dan cambios para hacer en el contenedor Gladys Node-RED, los haré con gusto ![]()
Tengo muchas ganas de que mis persianas solares Somfy se cierren y abran automáticamente de nuevo, es un verdadero confort que Gladys me permite a través de Node Red. Pero lo que he intentado seguir sobre lo que se ha hecho con este problema supera con creces mis competencias.
Todo está en manos de @Psoy
Lo siento por no poder ayudar mucho con este tema, estoy al 100% Zigbee en mi casa.
Pero para mí funciona, solo quiero probar conectando mi llave Zigbee y el Rflink para ver cómo reacciona a este cambio. Lo haré la próxima semana.
Pero ya conectando solo el Rflink funciona muy bien. Haré un resumen de la manipulación, pero no sé cómo integrarlo
en la imagen de Gladys.
Yo también todo Zigbee, pero para Somfy no tengo elección.
Hola @Psoy @elfedagger
acabo de encontrar en la documentación de z2m que se puede « adjuntar » el puerto de un dispositivo USB externo al docker a un puerto USB interno del docker: Docker | Zigbee2MQTT
Se puede ver cómo se mapea un dispositivo específico en un puerto definido y se le otorgan permisos de usuario.
¿Podríais probar esto en lugar de mi script?
En mi opinión (aún no probado), esto no resolverá el problema de montar automáticamente un dispositivo específico a través de Gladys que lanza un node-red interno, pero si se utiliza un docker dedicado para node-red, entonces será posible para todos (a condición de encontrar la ruta/el nombre exacto del dispositivo en el host).
Buenas noches,
Entonces probé con mi llave Zigbee, el nodo Serial se conecta bien y el Zigbee funciona perfectamente. La limitación que hay, de hecho, como en el miniPC, es que tan pronto como se desconecta la llave Zigbee que está en el puerto USB0 y se desconecta el Rflink que está en el puerto USB1 (por X razones, el disyuntor salta (no se desconecta nada, pero así es)), luego se vuelve a conectar el Rflink primero, se le asignará el puerto USB0 y para la llave Zigbee, se le asignará el puerto USB1,
Y allí, el Zigbee no funcionará hasta que la llave Zigbee no vuelva a estar en el puerto USB0 y será imposible asignarle el puerto USB1 en la integración Gladys (no he encontrado por qué). Por otro lado, el Rflink funcionará, el nodo serial estará conectado y enviará los mensajes recibidos por la llave Zigbee (en jerga, evidentemente) ya que ve algo en su puerto inicial, el puerto USB1.
La solución es desconectar todo y volver a conectarlo, si la llave Zigbee estaba en el puerto USB0, se vuelve a conectar primero y el Rflink en segundo lugar que estará en el puerto USB1, como al inicio
Entonces, ¿realmente es un problema? ¿Quién desconecta sus puertos USB?
En régimen establecido, esta modificación, para mantener el nodo serial conectado, funciona bien. Para información, basta con tener una tarjeta Mega 2560 y cargar el programa Rflink para poder probar la conexión.
Aquí está lo que he introducido en ssh, en la Raspberry:
Todos los comandos se ejecutan en el host, no en el docker gladys.
También es necesario que tu docker Gladys y Node-red estén en funcionamiento.
Hay que crear un archivo llamado « 99-docker-tty.rules »
En la carpeta /etc/udev/rules.d
Hay que escribir este comando para ir a esta carpeta
cd /etc/udev/rules.d
Luego creamos y editamos el nuevo archivo: 99-docker-tty.rules
sudo nano 99-docker-tty.rules
Copiamos/pegamos dentro las siguientes instrucciones:
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'"
para guardar el archivo escribimos:
ctrl+X
Luego escribimos
Y
Presionamos la tecla
Enter
para guardar y salir.
Luego, aplicación de las reglas, escribimos el comando de abajo
sudo udevadm control --reload
Finalmente, hay que crear el script que va a montar y desmontar automáticamente el dispositivo en el puerto usb:
Vayan a la carpeta: /usr/local/bin
escriban este comando
cd /usr/local/bin
Luego, creen un archivo llamado « docker_tty.sh »
sudo nano docker_tty.sh
Copiamos/pegamos:
#!/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
salimos y guardamos
ctrlX
Luego escribimos Y y la tecla Enter
Y para terminar, damos los derechos de ejecución a este script:
sudo chmod +x /usr/local/bin/docker_tty.sh
ATENCIÓN: este script no está validado por @pierre-gilles y si quieres probar no uses la máquina que hace funcionar Gladys todos los días
@mutmut gracias por el desarrollo de este programa.
Si estás de acuerdo @pierre-gilles, habría que automatizar estos comandos e integrarlos en la imagen de prueba de gladys node-red, que podré volver a probar eventualmente. Gracias de antemano
Buenas noches @mutmut
Acabo de mirar lo que has enviado, pero por lo que veo es para el puerto Zigbee, y para el puerto Rflink creo que habrá que retomar las instrucciones, y eso es un poco demasiado técnico para mí ![]()
Si tienes tiempo, ¿puedes guiarme, como antes? Lo probaré encantado ![]()
¡No estoy seguro de que sea la mejor solución, debo admitirlo!
Tu propuesta implica manipular el host y modificar el contenedor Docker en ejecución, lo cual no es una buena práctica. Un contenedor debe ser inmutable: no debe modificarse directamente, ya que cada vez que se actualiza la imagen, se elimina y se recrea (ese es todo el principio de Docker).
Creo que sería mejor centrarse en una solución más simple. En mi opinión, podemos salir adelante ajustando simplemente el docker run ![]()
hola @pierre-gilles
gracias por tu respuesta
Sí, estoy de acuerdo contigo, por eso te preguntaba si tenías tiempo de hacer una imagen que integre estos cambios, y por lo tanto, si he entendido bien, que se lanzaría con el docker run
Pero justo tu solución no es una solución que esté en el docker run ![]()
Yo solo quiero que me des un docker run que funcione sin ninguna otra modificación.
Voy a intentar ver eso, pero no es fácil
Voy a intentar ver eso, pero no es fácil.
¿Hay que crear un nuevo contenedor Gladys con Docker? o ¿simplemente añado líneas de comandos en el docker run?
En realidad, la idea es que me proporciones el comando docker run completo para lanzar el contenedor oficial de Node-RED correctamente.
Por ahora, en el tutorial del sitio web (Intégrer Node-RED avec Gladys Assistant en MQTT | Gladys Assistant), lanzaba el contenedor de esta manera:
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
Hay que investigar para encontrar un docker run que funcione con el acceso a los puertos USB dentro de este contenedor, sin ninguna modificación posterior al lanzamiento del contenedor.
¿Lo que me dices es modificar el docker run, que Gladys lanza cuando se le pide acceso a Node RED?
¿Si es así, cómo accedo a ese docker run para modificarlo? ¿Utilizo el que acabas de enviarme? ¿Y luego cómo lo lanzo?
Por ahora solo conozco este 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
¡Sí!
Es el que te acabo de dar en mi mensaje anterior sí ![]()
¿Escribiéndolo en el terminal y lanzándolo? No entiendo muy bien la pregunta ![]()
Te confundes con el Docker run de Gladys, aquí hablamos de Node-RED
No, está muy claro, el primero lanza el contenedor de Gladys que contiene el lanzamiento de node red (si se puede decir) y el otro es solo el contenedor de Node red, el que es lanzado por gladys.
Entonces, si lanzo el contenedor que acabas de enviarme, lanzo node red como si fuera Gladys quien lo lanzara?
No exactamente, la configuración está aquí, lo que nos da un docker run:
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
(En producción)
Estoy perdido, no veo cómo hacerlo ![]()
Buenas noches @pierre-gilles
Cuando ejecuto tu docker run (con o sin sudo delante), hay un problema de permisos
• Error: EACCES: permission denied, copyfile '/usr/src/node-red/node_modules/node-red/settings.js' -> '/data/settings.js'
Este error indica que el contenedor de Node-RED no tiene permiso para copiar el archivo de configuración settings.js del directorio de origen /usr/src/node-red/node_modules/node-red/ al directorio de datos /data/.
Pero sin embargo, cuando lanzo Node Red desde gladys funciona, ¿no falta algo? He intentado poner --user 1000:1000 \, pero no da resultado.
He resuelto el problema así:
`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
`ahora Node Red arranca y
si cambio los permisos para restringirlos un poco, nada funciona,
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 Node Red se queda en bucle como antes
Un poco de ayuda sería bienvenida, porque ahora estoy dando vueltas y no avanzo ![]()
Gracias de antemano
En el código de la integración de Node-RED, hay un chown para cambiar el propietario de la carpeta: