
Hoy decidí presentar al público un proyecto en el que había estado trabajando durante los últimos años:
LightHub . Lo que resultó al final puede llamarse quizás la solución más barata para crear una casa inteligente, que, sin embargo, puede:
- Controle la iluminación y los dispositivos de alimentación (relés, reguladores DMX-512 y Modbus RTU)
- Gestione la calefacción por suelo radiante (se utilizan como sensores de temperatura una docena y media de DS18B20 diluidos alrededor del apartamento como sensores de temperatura)
- Operar válvulas de ventilación / aire acondicionado
- Gestionar un sistema de ventilación improvisado.
- Muchas cosas en las que no pensé inicialmente, simplemente porque el controlador resultó ser completamente abierto, configurable de manera flexible y complementaba perfectamente las soluciones OpenSource Openhab + Mosquitto + NodeRed
Los interruptores convencionales, botones, sensores de contacto, sensores de fugas, etc., que pueden controlar tanto las cargas locales como los dispositivos conectados a otros mismos controladores o a todo lo que comprende el protocolo MQTT, están conectados a la entrada del controlador. Por ejemplo, tengo un interruptor de láminas instalado en la caja de la puerta delantera. Cuando cierro la cerradura tres vueltas, las luces se apagan, calefacción por suelo radiante, calderas, receptor de AV. Cuando regreso, el estado de estos dispositivos se restaura como estaba antes de salir.
En la salida, por ejemplo,
tales módulos de relé , DMX, periféricos Modbus.
Los controladores se configuran utilizando archivos JSON, que se cargan a través de http al inicio del controlador (además, la configuración se puede guardar en NVRAM a través de la CLI de serie). Y, por supuesto, todo esto está controlado por el sistema Openhab 2, a través de una aplicación móvil normal.
Las tareas de "pequeña automatización" se resuelven tanto con la ayuda de las reglas regulares de openhab (no muy conveniente) como con la ayuda de NodeRed. (Con respecto a NodeRed,
aquí hay un artículo que describe perfectamente un ejemplo de automatización).
Las fuentes, junto con ejemplos de configuraciones, se publican en
GIThub , un poco de la descripción se publica en
el sitio web del proyecto. En consecuencia, una historia más completa debajo del corte.
ACTUALIZACIÓN: Han pasado seis meses desde la publicación, y así es como se ve el prototipo industrial del dispositivo durante la instalación en un armario eléctrico.
La placa Arduino DUE está instalada en la placa base.

Se retira la placa, aislamiento óptico visible, protección de entrada, DMX, Modbus, controladores de 1 cable, un potente conjunto de transistores (por ejemplo) para controlar el relé.

Y así es como se ve el controlador en un riel DIN (se quita la cubierta), junto a un bloque de relé típico. (Como escribí, deliberadamente no pongo elementos de potencia dentro de la caja del controlador)
Todo comenzó con reparaciones en el departamento, durante las cuales decidí hacer la casa decentemente más inteligente.
Al mismo tiempo, francamente, no quería gastar mucho dinero en la solución "Marca" de Smart House. Además, muchas soluciones "serias" utilizaron estándares cerrados e integrados entre sí mediante muletas.
En consecuencia, me propuse la tarea de ensamblar una casa inteligente con los componentes más prefabricados y económicos.
Como hardware para el controlador, elegí el escudo Arduino Mega 2560 + Ethernet.
Actualización: Después de escuchar los comentarios a continuación, porté el proyecto a Atmel SAM3X8E ARM Cortex-M3 (Arduino DUE), una placa que, al mismo precio barato, tiene un orden de magnitud de mayor rendimiento y, lo más importante, RAM. Tuve que jugar con la biblioteca DMX, pero ahora tanto DMX-IN como DMX-OUT funcionan con el mismo hardware USART, sin ocupar los recursos del procesador. El proyecto ya se encuentra en
github y se compila automáticamente para la plataforma deseada.
Un precio de un centavo, una gran cantidad de puertos de entrada / salida, 4 UART de hardware, un tamaño decente de NVRAM, que hasta ahora he logrado ocupar solo el 30% del firmware y que se ajusta a toda la configuración con un margen, y directamente en el formato JSON confirmó la razonabilidad de la elección.
Después de actualizar el Bootloader y
ajustar la biblioteca de Ethernet, pude usar con éxito el Watchdog de hardware del procesador, lo que se sumó a la decisión de la "industria" y todavía tengo tranquilidad, aunque el firmware no se notó incluso sin él.
La ausencia de cualquier sistema operativo en el controlador nos permite considerarlo un "sistema en tiempo real", que permite, por ejemplo, generar mediante programación la misma señal DMX.
El cuello de botella es del tamaño de la RAM. Y esto no permite el uso de toda la vasta periferia del controlador. Aunque, más de 30 canales diferentes (elementos, en términos de una configuración) encajan perfectamente en la memoria. Y conectar todo lo que permite la placa Arduino Mega es una tarea, sin embargo, no relacionada con la realidad.
(en ARM - no hay más cuellos de botella)
Además, la escalabilidad se logra al aumentar el número de dispositivos. Por ejemplo, tengo dos controladores involucrados. Están espaciados alrededor del apartamento (esto también le permite no tirar de todos los cables a un punto). Para la interacción entre ellos, así como con los sistemas Openhab y NodeRed, se utiliza el agente MQTT Mosquitto.
Como controlador de bus de 1 cable, utilicé un chip
ds2482-100 (controlador I2C)
con Aliexpress , que a un precio de 60 rublos garantiza un funcionamiento estable con un bus de hasta 100M.
Para una configuración flexible del dispositivo, modifiqué la biblioteca AJSON para Arduino, de modo que tenga la capacidad de cargar un objeto a través de http, leer y escribir un objeto desde / hacia el controlador NVRAM. Fork está disponible
en Github .
La CLI de serie al crear un nuevo controlador, debe registrar una dirección MAC única en NVRAM. Ese MAC es la clave por la cual se carga inicialmente la configuración del servidor http.
Como software de gestión, tomé Openhab 2, que tiene toda la funcionalidad que necesito, además de una aplicación móvil, además de Cloud, cuya función, sin embargo, es solo proporcionar acceso a la infraestructura doméstica desde el exterior, sin reenviar puertos en el enrutador y no tener IP fija. Además, Openhab tiene integración con HomeKit de Apple, que le permite controlar dispositivos en casa con el iPhone, sin instalar una aplicación. (La oportunidad es interesante, pero uso principalmente la aplicación "nativa").
Algunas capturas de pantalla de Openhab La presencia de una gran cantidad de iluminación LED en el proyecto del apartamento también requirió una gestión razonable.
Detalles de iluminación LEDLas soluciones encontradas en el mercado eran "cosas en sí mismas" cerradas o costaban dinero inadecuado, mientras que admitían pocos canales. A menudo, los fabricantes estaban limitados a tres canales (RGB), aunque la opción RGBW permite el uso de cintas LED como la iluminación principal, y no solo para la iluminación de color.
Pensando, ordené un
par de placas en AliExpress, cada una de las cuales puede controlar 30 canales LED con una corriente nominal de hasta 2A por canal.
Para aumentar la potencia máxima de un canal, cambié de tiras de LED a tiras de 12V a 24V. En este caso, ilumine completamente la habitación unos 16-18 metros cuadrados. m era posible con 4 teclas. Las instalaciones más grandes tuvieron que dividirse en zonas: en la sala de estar conecté de forma independiente 4 cintas de 5 m cada una, usando 16 canales.
Para el control sincrónico de toda la sala, tuve que encontrar el tipo de canal "grupo"
Aquí está la descripción de la sala de estar en la configuración JSON:
"kuh":[7,["kuhline","kuhfre","kuhwork","kuhwin"]], "kuhwin":[1,5], "kuhline":[1,13], "kuhfre":[1,25], "kuhwork":[1,1],
El primer elemento de la matriz es el tipo de canal, el segundo es el parámetro del canal, que puede ser una matriz.
Para un elemento de tipo 7 (grupo), el argumento es una matriz de elementos en el grupo.
La recursión, por supuesto, es compatible.
Para un elemento de tipo 1 (cinta RGBW), el argumento es la dirección DMX base del canal.
Con la biblioteca estándar EasyDMX, las tarjetas no funcionaron de inmediato. Al final resultó que, el controlador LED chino no digirió el retraso de 2 ms entre los cuadros DMX (retraso entre cuadros). Una simple modificación del código de la biblioteca (reducir a la mitad el ciclo) ayudó.
Bifurcaciones de bibliotecas en github
A petición de los lectores, se agregaron imágenes sobre el tema "Iluminación LED en acción"

Este es un decodificador DMX alternativo de la categoría "caro y rico"
Además, hay una "sesión de fotos", donde puede comprender cuánto cambia la habitación cuando cambia la iluminación, y también que usando solo el color blanco en las cintas RGBW, puede obtener una iluminación difusa que es agradable a la vista.
Recomiendo cintas exclusivamente con luz blanca cálida (2700K)








Y luego, algunos ejemplos de la combinación de focos y LED:




Con la iluminación ordinaria de CA 220V, logré controlar los atenuadores chinos con Aliexpress que tienen soporte para Modbus RTU (protocolo de control industrial estándar sobre RS-485). Estos reguladores están perfectamente controlados localmente (por interruptores sin fijación), al mismo tiempo, el controlador tiene la capacidad de leer el brillo y controlarlos a través de Modbus (implementado para un dispositivo de dos canales hasta ahora).
En el momento de la publicación del artículo, los atenuadores faltaban en Aliexpress, pero encontré un fabricante chino por etiqueta en la placa de circuito del dispositivo. Aquí hay un
enlace a su sitio web ascético . Respondemos ansiosamente las preguntas por correo electrónico, incluso enviamos poca documentación.
Otra opción para controlar la iluminación de 220V es usar un atenuador de CA DMX-512. En e-bay, en surtido, cualquier factor de forma: una placa o un riel DIN. De uno a ocho canales.
Al principio, tuve cuidado con esta opción, ya que el controlador todavía estaba en una forma muy experimental y, por confiabilidad, quería mantener el control local autónomo. Pero ahora ya usaría esta opción.
A continuación, instalé un aire acondicionado de canal, que puede calentar y enfriar todo el apartamento. Para distribuir de alguna manera el frío y el calor en las habitaciones, instalé servos con control de señal de 0-10V. El ángulo de apertura de la válvula se ajusta automáticamente usando NodeRed, en el que se encontró un
conveniente controlador PID para esto.
Detalles de aire acondicionadoDesafortunadamente, no fue posible encontrar unidades de amortiguación de aire con un PWM o alguna entrada digital, por lo que se compraron 4 convertidores PWM a una señal analógica estándar 0..10V en el mismo AliExpress.
Desafortunadamente, no veo estos dispositivos en Aliexpress, pero en e-bay,
por favorLos convertidores funcionaron de inmediato, solo tuve que reprogramar el temporizador de salida PWM para establecer la frecuencia adecuada.
A continuación se muestra un ejemplo de reprogramación de los temporizadores 3 y 4 (responsables del pin 2, 3, 5, 6, 7, 8 Arduino Mega a una frecuencia de 4000 Hz).
pinMode(iaddr,OUTPUT); //timer 0 for pin 13 and 4 //timer 1 for pin 12 and 11 //timer 2 for pin 10 and 9 //timer 3 for pin 5 and 3 and 2 //timer 4 for pin 8 and 7 and 6 int tval = 7; // 111 in binary - used as an eraser TCCR4B &= ~tval; // set the three bits in TCCR2B to 0 TCCR3B &= ~tval; tval=2; //prescaler = 2
Luego, comencé a buscar controladores de calefacción de piso WiFi. En general, encontré un buen dispositivo que valía unos 6 mil rublos de Teplolux, pero tenía algunos inconvenientes importantes para mí.
A pesar de la presencia de una aplicación móvil, el protocolo de control fue cerrado. Hice un poco de ingeniería inversa, lo que demostró que, en teoría, el protocolo se puede descifrar. Quizás hubiera hecho esto, pero descubrí que sin reinstalar los enchufes, este dispositivo no está instalado en la misma fila con los interruptores. Esto determinó el destino del dispositivo: después de venderlo, implementé la funcionalidad de un termostato simple en mi controlador, ahorrando casi 30 mil rublos en 5 pisos cálidos.
Resultó lo siguiente:- Toda la administración: localmente en el controlador e independientemente de la infraestructura de TI del hogar
- Se utilizan mediciones de sensores de temperatura de 1 cable. Si el sensor no puede ser interrogado durante mucho tiempo, el calentador se apaga.
- A través de MQTT puede encender / apagar el piso cálido y configurar su temperatura. En consecuencia, los pisos se controlan a través de interfaces y la aplicación móvil Openhab
- No implementé scripts y horarios complicados en el controlador. Si lo desea, esto se implementa fácilmente mediante las reglas de Openhab o Node-Red. Me limité a apagar los dispositivos cuando la gente sale de la casa.
Aquí hay un ejemplo de una configuración para un piso cálido:
"ow":{ "2807FFD503000036":{"emit":"t_bath1","item":"h_bath1"} }, "items":{ "h_bath1":[5,24,33], },
Al sondear un termómetro OneWire con la dirección especificada, se transfiere al bus MQTT en el tema t_bath1, y también, dentro del controlador, al objeto h_bath del tipo No. 5 (termostato), el relé se conecta al pin # 24 del controlador, la configuración es de 33 grados (puede ajustarse mediante MQTT )
Entradas de dispositivoEn la configuración de cada entrada, puede especificar cómo se envía el comando al objeto local y cómo se emite el comando en el tema MQTT. Además, por separado tanto para la "presión" condicional del botón como para la "liberación".
Ejemplos: "in":{ "41":{"emit":"/myhome/in/all","scmd":"HALT","rcmd":"REST"}, "38":{"item":"spots_en"}, "37":{"emit":"/myhome/in/light","scmd":"ON","rcmd":"OFF"}, "40":{"emit":"/myhome/in/gstall","scmd":"TOGGLE","rcmd":"TOGGLE"}, "35":{"emit":"/myhome/s_out/water_leak"} }
Pin 41: Interruptor Reed en la cerradura de la puerta delantera - cuando está bloqueado - emita el comando HALT al tema / myhome / in / all, cuando esté desbloqueado - el comando REST.
Para mí, esto lleva a completar "quedarse dormido" y "despertar" en casa. Por cierto, los comandos no están incluidos en el conjunto estándar de OpenHab, pero resultó ser extremadamente conveniente - HALT - apaga el dispositivo, REST - restaura la configuración del dispositivo al último valor (color, brillo, temperatura), pero solo para el dispositivo que fue apagado por el comando HALT y no OFF Esto le permite no incluir lo que estaba apagado al momento de salir de casa.
Pin 38: solo un interruptor de luz ordinario. Cuando está cerrado, emite (por defecto) el comando ON, cuando se abre, el comando OFF. Estos valores se pasan al objeto spots_en. Está claro que el estado de un objeto se puede cambiar desde una aplicación móvil. En este caso, el interruptor, por así decirlo, permanece, por ejemplo, en la posición de encendido, pero la luz está apagada.
Para los amantes de los interruptores de recorrido clásicos, la sintaxis de Pin 40 es adecuada: tanto cuando se enciende como se apaga, se emite el comando TOGGLE (también, por cierto, uno nuevo, relativo a OpenHab), que cambia la posición de encendido y apagado del dispositivo (en este ejemplo, la lámpara se controla no localmente, sino a través de MQTT otro controlador).
Si no se trata de un interruptor basculante sino de un botón, simplemente ajuste “rcmd”: "" - solo dará un comando de interruptor cuando se presione.
Ah, bueno, casi me olvido de describir DMX-IN, la entrada para la cual, podría decirse, comencé este desarrollo.
Hay una gran cantidad de controladores de tiras LED DMX de diseño exitoso y, en general, ergonómicos en el mercado.
Uno de estos (panel táctil) lo compré al principio para experimentar con DMX. Todo está bien, pero la arquitectura DMX no proporciona ningún control desde más de un lugar. Hay un Maestro, que se traduce constantemente en el canal de brillo de los canales. Pero en este proyecto este problema está resuelto. El controlador LightHub monitorea los cambios del canal DMX en la entrada conectada al panel táctil. Si cambian, traduce los cambios a la salida (con asignación a dispositivos configurados, incluidos grupos de tiras de LED).
Hasta ahora nada ha cambiado: los dispositivos se controlan normalmente de forma remota. Vale la pena que el panel táctil cambie los valores de brillo de los canales; estos cambios se transmiten a las salidas DMX.
Por extraño que parezca, esta muleta resultó ser bastante ergonómica. Aunque, como lo ha demostrado la experiencia, es cada vez menos probable que usemos el panel táctil y cada vez más teléfonos inteligentes para controlar dispositivos.
ConclusiónDesafortunadamente, en un artículo es imposible describir todos los matices inherentes al desarrollo.
Por ejemplo, el tema de la conexión de dispositivos Modbus, su extracción y sincronización del estado local del dispositivo con el sistema Smart Home, la integración con una instalación de suministro simple permaneció completamente detrás de escena. Bueno, y tal vez una comparación con los sistemas existentes de clases relacionadas, como, por ejemplo, MegaD-328, AMS e, incluso, WirenBoard. Quizás si hay interés, continuaré.
Además, mientras estábamos detrás de escena, usando NodeRed, pudimos integrar el sistema con Telegram. Si bien funciona para recibir alertas, pero puede crear un Bot completo.
Con respecto al proyecto LightHub, a pesar de su bajo costo, los controladores resultaron ser una solución completamente funcional. Honestamente, yo mismo no creía que sobre la base de Arduino se pudiera crear un sistema de trabajo estable, pero, en mi opinión, era posible.
Por supuesto, aún queda mucho por hacer: aléjese completamente del código rígido (solo un poco más), limpie y refactorice un poco el código, documente cuidadosamente el proyecto, abra la placa de circuito impreso (ahora los escudos de interfaz se sueldan simplemente sobre la base de placas de pruebas y contienen tres MAX-485 - (DMX-IN, DMX-OUT, Modbus) y 1-Wire bridge) - y esto se convertirá, de hecho, en una solución llave en mano de muy bajo costo.
Advertencia: le recuerdo que el proyecto todavía está en el nivel de la placa de pruebas. Al abrir el siguiente spoiler, puede dañar sus sentidos estéticos.
Algunas fotos
El primer controlador que controla el LED (60 canales DMX-512), Modbus (atenuadores, entrada), flaps;

Este es un decodificador DMX-512, que es conveniente colocar donde la tira de LED llega a los transformadores. Tengo - debajo del falso techo en la despensa.

Y este es el segundo controlador que sirve 1 cable, interruptores / sensores y un módulo de relé. (El módulo de relé en sí estaba ubicado justo en la caja de conexiones, donde pertenece a las tres fases. Erradiqué el vecindario de 380V y las corrientes débiles siempre que fue posible después de un incidente fallido)
Está claro que es necesario ampliar la funcionalidad. Como mínimo, hacia sensores / dispositivos inalámbricos. (Aunque, por ejemplo, ZWave ahora se puede usar a través de carpetas estándar de Openhab).
La capacidad de conectarse, por ejemplo, el presupuesto NooLight es probablemente una buena idea. Tal vez piense en migrar al ESP-8266 para expandir la RAM, aunque no me gusta dejar WiFi en una conexión LAN por cable en términos de confiabilidad. Sí, y ESP no tiene una periferia tan rica como Arduino Mega. También planeo hacer la medición de electricidad a través de sensores de corriente y conectar el codificador rotatorio a la entrada.
Además, sería útil hacer que la configuración y el inicio del controlador sean más fáciles de usar (configuradores visuales, etc.). Al mismo tiempo, deliberadamente no quiero convertir el controlador en un servidor web con archivos / imágenes, AJAX, etc. En mi opinión, esto ya debería ser una prerrogativa del servidor. Al menos basado en frambuesa.
Pero dado que el proyecto es absolutamente de código abierto, hay diferentes opciones posibles, únase.
Además, espero sus comentarios.
ACTUALIZACIÓN
Después de la publicación del artículo, después de unir fuerzas con uno de los residentes de Habr y dibujar un diagrama esquemático del Escudo LighthHub, comenzamos a diseñar la placa de circuito impreso, teniendo en cuenta toda la experiencia y los comentarios significativos
- La placa será compatible con Arduino Mega (5v) y Arduino DUE (ARM 3.3V)
- Interfaz Ethernet incorporada basada en Wiznet5500
- 8 entradas discretas optoacopladas, 8 entradas / salidas discretas con protección de voltaje / corriente
- 8 entradas analógicas con protección de voltaje / corriente. En el futuro, propongo usar entradas analógicas para controlar el consumo de energía (sensores de corriente) y para conectar potenciómetros externos (atenuadores)
- 8 salidas PWM, 4 de ellas con teclas de salida potentes (hasta 500 mA / 50V) + 4 salidas potentes discretas. Le permitirán conectarse localmente al controlador, por ejemplo, varios arrancadores o incluso una tira LED RGBW no muy larga.
- Un conector de formato UEXT, que posteriormente le permitirá conectar un periférico compatible al controlador, por ejemplo, módulos de radio adicionales para conectarse a dispositivos inalámbricos.
- Las entradas / salidas restantes se emitirán sin protección a los conectores RJ45 para conectar dispositivos locales (tarjetas de relés, DAC, etc.)
- Por supuesto, quedan interfaces de 1 cable para conectar sensores de temperatura, una entrada y salida DMX-512 para control de iluminación, Modbus RTU para todo lo demás.
Puede dejar comentarios sobre la funcionalidad, así como el deseo de unirse al pedido del primer lote de tableros,
aquíEl siguiente punto en el programa será el desarrollo de una placa controladora con un módulo ESP32 integrado (esto le permitirá alejarse del factor de forma Arduino)