Hogar inteligente en contenedores (ioBroker + Zigbee en Docker)

Entrada


Durante algún tiempo utilicé varios relés Sonoff estándar que controlan la luz a través de Google Home Mini. Pero al final quería más. La funcionalidad estándar no es suficiente, decidí gradualmente hacer que el sistema sea algo más flexible. Elegí ioBroker.

Al principio, como siempre, miré, elegí, verifiqué piezas de funcionalidad. Cuando, por separado, las necesidades básicas funcionaron, comenzó a armar. Y, por supuesto, me encontré con problemas.

Las principales dificultades:

  • ¿Qué elegir exactamente? Después de todo, hay muchas formas de implementar nuestro plan. E incluso en la solución elegida hay muchas opciones ...
  • No hay instrucciones preparadas sobre cómo armar exactamente el conjunto de soluciones que he elegido y precisamente en mis configuraciones.

Lo que elegí, por qué, qué dificultades encontré y cómo resolverlas, y será discutido.

Mirando hacia el futuro, describiré cómo ioBroker se lanzó en la ventana acoplable en una computadora portátil vieja y arrojó a Zigbee para interactuar con los sensores de Xiaomi directamente, sin una puerta de enlace. No doy instrucciones estándar, solo mis "golpes".

Como todavía no es productivo, es muy posible cambiar algo. Así que agradeceré los consejos y correcciones :)

Lista de deseos y el tren de mis pensamientos


Había carretes Sonoff (enrollados en eWeLink), algún tipo de cable de extensión (Tuya SmartLife), puerta de enlace Xiaomi con varios sensores (Mi Home), columna Google Home Mini.

eWeLink y SmartLife normalmente se escuchaban en Google Home, escuchaban comandos de voz como "Enciende las luces sobre la mesa". Mi Home no se inició (hay pocos dispositivos Xiaomi compatibles con Google Home).

Puse ioBroker, cogí el Xiaomi Gateway, en principio, todo funcionó. Todo es hermoso, verifiqué los guiones, están escritos (elegí Node-Red), decidí hacer todo al respecto.

Sin embargo, no soy un administrador profesional, puedo descubrir cómo prepararlo, pero no sé en qué sutilezas se incluyen las bibliotecas y los componentes (y no quiero profundizar). Por lo tanto, me molestó un poco que ioBroker necesitara nodejs, algunos npm con los que no tenía negocios antes. Existen dificultades con las versiones (como el yum estándar del repositorio puso nodos demasiado viejos, etc.).

Bueno, es decir Empecé todo, pero el miedo permaneció en mi corazón de que, aunque funciona, no entiendo cómo. Y si, por ejemplo, algo se rompe durante una actualización, no sabré cómo solucionarlo. Pero además de ioBroker, también quería apilar otros sistemas en la computadora portátil.

Pondré, por ejemplo, una actualización de algo que parece funcionar. Y después de un tiempo resulta que funciona mal. Tendremos que revertir la copia de seguridad hace un mes. Además, la copia de seguridad no es solo de este sistema, sino de todos los demás, porque no entiendo hasta el final de dónde son los archivos ejecutables, dónde están los archivos de configuración, dónde están los datos en sí ...

Me molestó mucho, así que decidí usar Docker. El código en el contenedor. Datos por separado, el directorio está montado en el host. Fácil de respaldar.

¿Hay una nueva versión? Sí, incluso en otra máquina virtual es fácil verificar cómo funcionará la nueva versión del contenedor con datos de este directorio. Los diferentes sistemas no interfieren entre sí. Es fácil revertir los binarios de algunos sistemas. Nuevamente, es fácil transferirlo a otra cosa (ioBroker en el contenedor funciona tanto en Synology como en una sola placa). Belleza!

Habrá más requisitos (para que estén disponibles a través de Internet, pero no estén disponibles públicamente para la seguridad), afectarán aún más al elegir las configuraciones.

Instalación


El sistema operativo host no es crítico, descargué CentOS (de la memoria anterior recordé que para todas las tareas de red funcionó de manera bastante estable y sin errores). La versión actual era Cent OS 8.

Ponlo Realicé configuraciones básicas como el nombre de host, fail2ban (solo un hábito, aunque el host solo está en LAN). Pon Docker. No me detendré en esto. Instrucciones de ejemplo .

Es hora de lanzar ioBroker. ¿Pero qué red elegir? Anfitrión o Macvlan?

Primero, Macvlan quería que cada contenedor obtuviera su dirección IP del enrutador. Pero luego decidió abandonar esta aventura:

  • Con Host, por supuesto, debe indicar explícitamente qué puertos reenviar, asegúrese de que no se crucen con otros contenedores. Pero
  • iptables deberá configurarse dentro de cada contenedor. Incluyendo después de cada reinicio con otros parámetros, actualización / reemplazo. Y en modo Host, es un punto único de gestión de seguridad.
  • Todavía planeo hacer que esté disponible no solo desde el hogar WiFi. Y en este caso, es más conveniente hacer que un host sea accesible desde el exterior (y una asignación de puertos en él) que configurarlo para varios.

Actualmente comprobado ZeroTier One. Lo instalé solo en el host. El acceso a la dirección IP de este host (no local, pero emitido por ZeroTier) y al puerto 8082 desde el teléfono móvil a través de GPRS cuando el cliente ZeroTier se está ejecutando abre perfectamente la interfaz visual).

Tan estándar

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 

Ups Algo salió mal.

docker logs ioBroker muestra que en el último paso no hay conexión a recursos externos. No puedo obtener un nombre de razorolvit.

docker exec -it ioBroker bash muestra que el ping sobre IP pasa bien, pero no por nombre.

Google, encuentro un montón de enlaces acerca de cómo la ventana acoplable sustituye incorrectamente al servidor DNS. Gobierno /etc/docker/daemon.json, entiendo dnsmasq, nada ayuda.

Un pensamiento se arrastra, de repente algo está bloqueado a nivel de red. Pero no hay telnet ni rizo en el contenedor, no puedo verificarlo. La instalación tampoco es fácil: la instalación de yum no funciona. Por supuesto, puede especificar manualmente los hosts necesarios en / etc / hosts, pero esto lleva demasiado tiempo, mejor verifique otras versiones.

Por ejemplo, estúpidamente detengo Firewalld en el host con la esperanza de que todo se abra. Pero no

Recuerdo que la disponibilidad del puerto aún se puede verificar con wget. ¡Y él está en el contenedor! Y no puedo descargar nada ni por IP. Incluso la interfaz web del enrutador doméstico no se puede conectar. Bueno, eso significa que el problema definitivamente no está en el DNS, sino en iptables.

Como resultado, todo funcionó después de agregar la interfaz del acoplador a la zona de confianza:

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

Eso es incluso interesante, ¿se me pasó por alto en alguna parte de las instrucciones?

¿O no tomaría CentOS 8, sino algo más, no habría problema (en otro sistema operativo no tiene firewall por defecto)?

¿O es tan obvio para todos que no escriben las instrucciones, he sido tonto por mucho tiempo?

Zigbee


Entonces, mi ioBroker está en el contenedor, y solo tiene unos pocos puertos publicados. Ahora, este es el admin 8081 y vis 8082, luego se agregará mqtt 1883 y, posiblemente, algo para apoyar a Tuya (vi un controlador de este tipo, pero aún no lo he descubierto).

Por desgracia, para interactuar con los dispositivos Xiaomi a través de su puerta de enlace, se necesitan multidifusiones, y con esto en esta configuración de complejidad. Por lo tanto, decidí tirar un contenedor de memoria USB. También una operación normal.

En la línea de comando, ya has visto --device=/dev/ttyACM0 para esto. El dispositivo en el contenedor apareció. En ioBroker, activé el controlador estándar "Zigbee para Xiaomi y otros dispositivos", pero no funcionó.

Google sugiere que para acceder al puerto serie debe agregar el usuario al grupo de marcado. Entro en el contenedor, agrego iobroker a este grupo, no ayuda.

Veo las sugerencias que necesita para instalar el paquete de puerto serie a través de npm.

No puedo, no hay derechos. Google más lejos.

Bluefox solo le dice a alguien que esto debe hacerse desde el directorio /opt/iobroker/node_modules/iobroker.javascript/: no tengo uno y todavía no tengo derechos de instalación (bueno, es decir, la instalación comienza, y luego se bloquea).

Finalmente, me doy cuenta de que necesito especificar explícitamente en la línea de comando en qué directorio poner.

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

Está instalado, pero no ayuda.

Estoy empezando a sospechar que aún necesita lidiar con los derechos de acceso. Comprobación (desde el interior del contenedor, por supuesto):

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

El éxito Es decir Aún así, la ventana acoplable arrojó el dispositivo correctamente.

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

Goofy! Fracaso

bash dentro del contenedor se ejecuta bajo la raíz, pero desde el usuario de iobroker no hay acceso al puerto. A pesar de haberlo agregado previamente al grupo de marcado.

ls -l /dev/ttyACM0 da

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

Ja! ¿Qué es 18 en lugar del nombre del grupo?

Todo es correcto en el host principal: 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

Resulta que en el host principal en / etc / group dialout:x:18 , y en el contenedor dialout:x:20

Aunque agregué un usuario al grupo con ese nombre, no tiene sentido, el número no es el mismo. Así que creé otro grupo con el identificador 18 y ya le agregué el usuario:

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

Reinicié todo para mayor certeza. Y en esto terminó mi enfrentamiento :)

Con calma desató todos los sensores de la puerta de enlace de Xiaomi y lo ató a ioBroker.

Los veo como objetos en el propio ioBroker:



Las lecturas de Vis se leen:



Cuando los contactos en el sensor de fugas están cerrados, se reciben datos. Y la imagen está cambiando:



Y en Node-Red, llega la señal. En consecuencia, aunque se envía un correo electrónico u otra cosa, se envía un archivo de voz o MP3 a la columna GH Mini:



Por cierto, al ver los objetos me esperaba una sorpresa:



Giré el Xiaomi Cube a otro lado. Los últimos cambios se muestran en verde.
Flip90 ha cambiado, esto es comprensible. Esta señal es capturada para el control. Pero, resulta que todavía hay flip90_from y flip90_to, de qué lado se volvió.

Resulta que, en teoría, puedes obtener aún más señales de control del cubo. Por ejemplo, si dibuja flechas en los bordes (como en un círculo), puede seguir no solo "girar 90", sino también en qué dirección (de usted mismo o de usted mismo, izquierda o derecha).

Para flip180 también funciona. Y para otros gestos hay información adicional similar (Lado superior en la tapa 180 °, Lado superior en la diapositiva, Lado superior en el toque)

No es que se necesitara desesperadamente. Pero en el Mi Home estándar no había información sobre los rostros. Parece que con la conexión anterior a través de Xiaomi Gateway, tampoco lo vi, no sabía que cada cara tiene un número. Anteriormente, solo sabía sobre la acción adicional de la caída (caída libre), que era, pero fueron expulsados ​​de Mi Home (aparentemente, lo dejaron caer con demasiada frecuencia).

Final


Todo lo que necesito es trabajar. Entonces puedes traer belleza, escribir guiones, conectar Tuya, lanzar un contenedor con Blynk para otros proyectos ...

Y, tal vez, rehacer algo basado en sus comentarios :)

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


All Articles