Interruptores táctiles con Modbus: por qué son necesarios y cómo aplicarlos en un apartamento inteligente


En los sistemas de presupuesto de una casa inteligente, generalmente se usan interruptores estándar; su tipo de salida también se denomina "contacto seco" . Sin embargo, esta no es la única opción: en busca de un interruptor hermoso, me encontré con dispositivos con el protocolo Modbus RTU dentro. Además de la hermosa apariencia, le permiten configurar el modo de operación de cada botón, controlar la luz de fondo en detalle y conectarlos al controlador central (utilicé Wiren Board 5 ), cuatro cables son suficientes: alimentación, tierra y dos líneas para RS-485.

Cómo conectar un interruptor de este tipo y configurar el control de la luz y la ventilación desde él, consulte a continuación. El artículo también describirá en detalle cómo trabajar con dispositivos Modbus en general.

Explicación del especialista en marketing de Wiren Board: este artículo nació de un tema creado por Kallyanbl4 en nuestro foro . Después de nuestra solicitud, escribió un artículo completo y permitió publicarlo en nuestro blog, por lo que muchas gracias a él. Todo el texto está escrito por el autor, excepto las notas al final.

Descripción de interruptores


Después de estudiar lo que ahora está en el mercado, compré estos interesantes interruptores de los chinos:



Sus ventajas:

  • buen diseño
  • interruptores táctiles, cuando se presionan, parpadean, se iluminan en la oscuridad en un agradable color blanco;
  • precio relativamente bajo - 2000 rublos cada uno. El precio incluye grabado láser individual;
  • Interruptor programable: puede configurar el botón para casi cualquier acción: encender la luz, controlar los LED, subir / bajar la cortina, ...

Especificaciones del interruptor:

  • tensión de alimentación - 12 V;
  • velocidad de transferencia de datos - 19200 bit / s;
  • número de bits transmitidos - 8;
  • número de bits de parada - 1;
  • control de paridad: sin verificación.

Cuando se trabaja en Modbus RTU, los dispositivos conectados tienen los llamados registros, celdas en las que se almacena la información. En la captura de pantalla, una descripción de los registros para el interruptor de cuatro teclas:



Cuando hace clic en uno de los botones táctiles, los valores en los registros 0-3 cambiarán de 0 a 1.

Disyuntor


En el controlador Wiren Board 5, según la configuración, hay de dos a cuatro puertos RS-485. Los conmutadores (en mi caso hay 27 de ellos) deben estar conectados a estos puertos.

En este caso, todos los interruptores pueden funcionar en un bus común. Los interruptores se pueden conectar en serie, conduciendo el cable de un interruptor a otro, pero decidí conectar todos los cables en una pantalla.

Cable de conexión - UTP Cat 5e de ocho núcleos. Puede usar un cuatro núcleos, pero generalmente hago todo por "por si acaso". Puede considerar otros cables de cuatro núcleos, pero el punto importante es que el cable debe estar blindado, porque a pesar de las frecuencias de señal bastante bajas, no se excluyen las pérdidas y las pérdidas.

Como resultado, todos los interruptores están interconectados como se muestra en la imagen:



Como se puede ver en la figura, todos los conmutadores están interconectados mediante un conmutador UTP pasivo. Para los núcleos 1 y 2 (naranja y blanco-naranja) se transmiten datos (líneas A y B), la alimentación de 12 V está conectada a los núcleos 7 y 8 (marrón y blanco-marrón). Uso Mean Well NDR-75-12 como fuente de alimentación .

No sabía cómo se comportaba el interruptor UTP chino pasivo, por lo tanto, al diseñar el escudo, proporcioné un lugar para un interruptor RS-423 activo. Observo que el circuito funciona tanto a través de interruptores pasivos como activos. E incluso cuando están conectados entre sí.



Control de luz por relé


Según mi proyecto, se planifican 27 dispositivos independientes (luces, ventiladores) en el apartamento, alimentados por 220 V. Se seleccionaron tres módulos de relés WBIO-DO-R10A-8 y un WBIO-DO-R10R-4 para controlarlos. La elección se debe al hecho de que casi toda la iluminación del apartamento es LED, que difiere de las lámparas incandescentes por una alta corriente de arranque. Los relés seleccionados pueden proporcionar una conmutación actual de hasta 10 A por canal, lo que en mi caso es innecesario, pero, como se mencionó anteriormente, "por si acaso con un margen".



El cambio de relé ocurre a través de la interfaz web del controlador . El procedimiento es intuitivo, no se requieren instrucciones ni sugerencias.

Parte de software


Archivo de puerto

De la descripción del hardware de Wiren Board 5 aprendemos que tiene dos puertos de dispositivo / dev / ttyAPP1 y / dev / ttyAPP4 correspondientes a dos puertos RS-485. En mi caso, el conmutador está conectado al puerto / dev / ttyAPP1 .

Dirección del dispositivo (conmutador)

Al intercambiar datos utilizando el protocolo Modbus RTU, cada dispositivo se identifica por su propio número único: la dirección Modbus. Como regla general, el fabricante indica esta dirección en forma de tres dígitos en el dispositivo en sí, pero si no hay ese número en el dispositivo, puede iterar sobre las direcciones desde la línea de comando (se usa que la dirección se almacena en el registro Modbus 0x80):

root@wirenboard:~# service wb-mqtt-serial stop root@wirenboard:~# for i in {1..247}; do modbus_client -mrtu /dev/ttyAPP1 --debug -a$i -t3 -r0x80 -s1 -pnone; done 2>/dev/null | grep Data: 

El resultado debe estar en la forma:

 Data: 0x008e 

Respuesta recibida en formato hexadecimal y corresponde a 142 en decimal.
Cabe señalar que cada vez que se llama a la utilidad modbus_client , se debe detener el estándar del controlador de sondeo wb-mqtt-serial para el controlador; de lo contrario, la utilidad modbus_client no funcionará.

Intercambio de datos entre Switch y Wiren Board

Arriba, se escribe un bucle que sondea todas las direcciones Modbus posibles y devuelve el valor de la dirección si se encuentra un dispositivo. El bucle utiliza la utilidad modbus_client , que es necesaria para depurar los dispositivos conectados. En este punto, usándolo, nos aseguraremos de que todo esté conectado correctamente y que el interruptor interactúe correctamente con el controlador. Para hacer esto, intente leer los datos en el interruptor de registro 0x01:

 root@wirenboard:~# service wb-mqtt-serial stop root@wirenboard:~# modbus_client -mrtu /dev/ttyAPP1 --debug -a142 -s1 -pnone -b19200 -a142 -t0x03 

(una descripción de la utilidad y sus claves se encuentra en la documentación del controlador).

El resultado será el siguiente:

 Opening /dev/ttyAPP1 at 19200 bauds (N, 8, 1) [8E][03][00][64][00][01][DA][EA] Waiting for a confirmation... <8E><03><02><00><01><2C><5B> SUCCESS: read 1 of elements: Data: 0x0001 

Tal resultado significa que se escribe un valor discreto 1. en el registro Después de presionar uno de los botones del interruptor, el valor del registro cambiará al valor opuesto:

 SUCCESS: read 1 of elements: Data: 0x0000 

Si se observa el resultado, como en este párrafo, entonces todo está conectado correctamente, el interruptor y el controlador se entienden entre sí.

Conductor nativo para el interruptor

Después de asegurarnos de que el controlador y el conmutador se entiendan, es hora de dar una descripción de las teclas del conmutador a nivel de software. Los desarrolladores sugieren agregar una descripción del dispositivo conectado al archivo /etc/wb-mqtt-serial.conf o crear una plantilla personalizada en forma del archivo /usr/share/wb-mqtt-serial/templates/config-*.json

Fui de la segunda manera, mi plantilla se ve así:

 { "device_type": "4-band-switch", "device": { "name": "4-band-switch", "id": "4bsw", "enabled": true, "channels": [{ "name": "All", "reg_type": "holding", "address": "0x00", "type": "switch" }, { "name": "Window", "reg_type": "holding", "address": "0x01", "type": "switch" }, { "name": "Side", "reg_type": "holding", "address": "0x02", "type": "switch" }, { "name": "Diode", "reg_type": "holding", "address": "0x03", "type": "switch" } ] } } 

Una descripción detallada de la plantilla escrita anteriormente está en la descripción del controlador wb-mqtt-serial . Trate brevemente los campos:

  • "Nombre": "Todos" es el nombre del botón. Si la plantilla está escrita correctamente, este botón aparecerá en la pestaña Configuración con la dirección / devices / 4bsw_142 / controls / All
  • "Reg_type": "holding" - tipo y tamaño del registro. El conmutador utiliza "retención", un registro de 16 bits disponible para leer y escribir.
  • "Dirección": "0x00": la dirección del registro del interruptor desde el cual el controlador leerá los datos.
  • "Tipo": "interruptor": cómo se mostrará el interruptor en la interfaz web. En el caso de "interruptor" - en forma de un interruptor discreto.

Guarde la plantilla en el controlador. Después de eso, en la sección de la interfaz web (Configs -> /etc/wb-mqtt-serial.conf), puede agregar un nuevo dispositivo con esta plantilla (interruptor de 4 bandas). Agregue nuestro primer interruptor y haga clic en Guardar.

La regla que activa el relé cuando se presiona el botón del interruptor


Dentro del controlador de estado, todos los dispositivos conectados se describen mediante mensajes MQTT . Los dispositivos también se controlan enviando mensajes MQTT. Los clientes de la cola de mensajes MQTT (intermediario) son tanto la interfaz web como el motor de reglas .

Para mayor claridad, veremos cómo la interfaz web maneja el mensaje entrante. Abrimos la pestaña Configuración de la interfaz web y vemos qué sucede cuando se presiona el botón Todos en el conmutador: dentro del conmutador, el valor del registro Modbus cambia, el controlador serie wb-mqtt sondea el conmutador y, de acuerdo con la plantilla del dispositivo, el conmutador de 4 bandas envía un mensaje MQTT en el tema / devices / 4bsw_142 / controls / All , y en la página de configuración, el valor en el tema / devices / 4bsw_142 / controls / All cambiará instantáneamente de 0 a 1.

Considere el segundo cliente: el motor de reglas. El motor, como la interfaz web, funciona con la cola de mensajes y puede responder a los cambios en el valor, la función whenChanged se utiliza para esto. En mi caso, la regla se veía así:

 //   defineRule("switch_all", { whenChanged: "4bsw_142/All", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT3_R3A2"] = newValue; dev["wb-gpio"]["EXT3_R3A5"] = newValue; dev["wb-gpio"]["EXT1_R3A1"] = newValue; dev["wb-gpio"]["EXT1_R3A2"] = newValue; dev["wb-gpio"]["EXT1_R3A5"] = newValue; dev["wb-gpio"]["EXT2_R3A8"] = newValue; dev["wb-gpio"]["EXT3_R3A7"] = newValue; } }); //  defineRule("switch_window", { whenChanged: "4bsw_142/Window", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT4_ON4"] = newValue; // dev["wb-gpio"]["EXT3_R3A6"] = newValue; // dev["wb-gpio"]["EXT3_R3A7"] = newValue; } }); // defineRule("switch_side", { whenChanged: "4bsw_142/Side", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT1_R3A3"] = newValue; dev["wb-gpio"]["EXT1_R3A4"] = newValue; dev["wb-gpio"]["EXT2_R3A1"] = newValue; } }); // defineRule("switch_diode", { whenChanged: "4bsw_142/Diode", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT2_R3A2"] = newValue; dev["wb-gpio"]["EXT2_R3A3"] = newValue; dev["wb-gpio"]["EXT3_R3A3"] = newValue; } }); 

Estaré encantado de responder todas las preguntas en los comentarios.

Notas del vendedor


  1. Es mejor tender la línea RS-485 con un cable KSPEVG 2x2x0.35 (cuesta solo 30 rublos por metro), y no con una estrella, sino con un autobús.
  2. Le recomendamos que tenga cuidado con las lámparas LED: su corriente de arranque puede exceder las 150 (!) Veces clasificadas (este será un artículo separado). Observe los potentes módulos de relé WB-MR6 : corriente de 16 A por canal, incluida una corriente de entrada de hasta 800 (!) Amplificador en la modificación S.

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


All Articles