Hay pocos artículos sobre un entorno de programación como Node-RED en Internet en ruso . Este artículo revelará el secreto de la cortina sobre este producto y mostrará, usando el ejemplo de la creación de un algoritmo de control de iluminación para sensores de movimiento, lo simple que es usar Node-RED para implementar varios escenarios y reglas para automatizar una casa inteligente en una forma completamente gráfica sin escribir ningún código.
¿Qué es Node-RED?
IBM, como otras grandes empresas, está tratando de encontrar su nicho en la evolución de Internet de las cosas. Esto generalmente se asocia con el lanzamiento de aplicaciones y productos de código abierto para popularizar sus plataformas pagas. Por ejemplo, en IBM, la plataforma paga es Bluemix.Node-RED es una creación de código abierto de IBM y, como está escrito simplemente en el sitio, es una herramienta que sirve para conectar hardware, API y servicios de formas nuevas e interesantes.Estos métodos se basan en el uso de líneas de comunicación gráfica a través de las cuales se envían mensajes entre nodos. Por lo tanto, puede conectar los diferentes bloques simplemente con el mouse sin usar la programación.El desarrollo en Node-RED se lleva a cabo a través de un navegador ordinario, el núcleo en sí puede ejecutarse en varias plataformas: PC, RPi, nube, etc.Node-RED para hogar inteligente
Decidí probar Node-RED para escribir guiones y reglas para el hogar inteligente. Es decir, para la automatización. La conexión con varios actuadores, servicios web y sensores se realiza en OpenHAB. ¿Por qué decidí no hacer automatización allí? Varias razones:- En OpenHAB, los scripts y las reglas se escriben en su propio idioma. No quería estudiarlo solo por una sola aplicación.- La depuración de las reglas en sí es casi imposible. Si la regla no funciona, es difícil entender por qué. Me gustaría que mis reglas sean independientes del hardware, los canales de comunicación, las plataformas y el software en sí para comunicarse con los dispositivos. Para poder cambiar fácilmente a otra plataforma UD, por ejemplo Domoticz, MajorDomo, FHEM y llevar mis reglas conmigo, y no reescribirlas bajo la nueva plataforma UD.Control de iluminación mediante sensores de movimiento y luz.
Entonces comencemos. En realidad, la tarea original es simple y trivial:he controlado los puntos LED para la iluminación en el pasillo. Quiero que la luz se ilumine con el movimiento y se apague después de 10 segundos.Vamos a complicar un poco la tarea:- La luz debe encenderse solo cuando está oscuro afuera- La intensidad de la luz debe depender del tiempo - hasta las 9 pm la luz debe encenderse a toda intensidad, y después de eso solo un 10% como luz de fondo.Sensores, intérpretes, etc. hierro
Los protocolos y las opciones de comunicación con sensores y actuadores que no describiré aquí. Baste decir que en mi casa inteligente todos estos protocolos se reducen a uno: MQTT, y a través de él ya se está produciendo comunicación con Node-RED.Entonces, ¿qué sensores y actuadores tengo?1. El sensor de movimiento. Publica un mensaje ABIERTO sobre el tema / myhome / state / Hall_motion cuando detecta movimiento y CERRADO si no hay movimiento durante 2 segundos.2. Sensor de luz. Mide el brillo del alumbrado público en el rango de 0-1000 Lux. Publica un mensaje una vez por minuto en el tema / myhome / state / Lumin_Hall con el nivel de luz actual.3. Control de atenuación de lámparas LED. Está suscrito al tema / myhome / command / Light_Hall / state. Si escribe 0 allí, la luz se apagará. 100 - se enciende al máximo brillo. 1-99: cambiará la intensidad de la luz. Para iluminación nocturna, intensidad suficiente 1.Descripción del flujo en Nodo-RED
Se supone que ya ha instalado Node-RED. Si no, siga el enlace de arriba e instale cualquier opción conveniente para usted: en una computadora, Raspberry, clowd, etc. En mi caso, Node-RED está instalado en RPi2 (en mi opinión, incluso viene con Raspbian, por lo que no es necesario instalar nada). Este flujo no requiere la instalación de ninguna biblioteca adicional.Entradas y salidas
En primer lugar, creamos las entradas y salidas necesarias para nuestro algoritmo. Estos serán clientes MQTT que se suscriban a los temas relevantes. Los arrastramos desde la biblioteca a la izquierda y lo personalizamos.Nota: Los nombres de bloque que se muestran se pueden cambiar en su configuración.Para el sensor de luz, cree el nodo Sensor de luz Hall a partir de la entrada MQTT:
en su configuración, es suficiente registrar la dirección y el tema del agente MQTT.
Mi corredor está girando en la misma plataforma, así que solo deje localhost.Creamos el nodo Hall Motion Sensor para el sensor de movimiento:
todo es igual para él, solo configure otro tema / myhome / state / Hall_motion.
Como puede ver la dirección y los parámetros del intermediario, este nodo ya se ha hecho cargo del anterior, por lo que no necesita ingresarlos en uno nuevo.Queda por agregar la salida MQTT para hacer una salida para el atenuador LED. Arrastre y suelte la salida MQTT y llámela Atenuador de luz Hall.
En los parámetros, nuevamente, solo necesita especificar el tema deseado, a qué mensajes para controlar el atenuador se enviarán - / myhome / command / Light_Hall / state
Como resultado, obtuvimos tres nodos para nuestro Flow.
No estaría de más probarlos para comprobar su funcionalidad. Es facil.Conectamos la salida de depuración a los bloques de entrada.
Y conecte la entrada de inyección al bloque de salida.
En la configuración de este nodo, debe cambiar la carga útil al nivel del brillo deseado de la lámpara. Por ejemplo, en este caso es 100.
Podemos crear varios bloques de inyección idénticos copiando y pegando, cambiando el brillo y conectándolo a la salida de esta manera:
Eso también funcionará. Es hora de verificar. Hacemos clic en el botón Implementar:
debajo de los nodos MQTT, debería ver un pequeño mensaje:
Esto significa que están conectados al agente MQTT. Si todo salió según el plan, entonces en la pestaña de depuración derecha debería ver los mensajes de los sensores, y si hace clic en los rectángulos a la izquierda de los nodos de inyección, la intensidad de la luz de la lámpara conectada al atenuador debería cambiar. Si todo funciona, puedes ir más allá.Circuito de control de iluminación del sensor de movimiento
Por simplicidad, me referiré a los bloques individuales interconectados como cadenas. En primer lugar, intentemos hacer un circuito simple que encienda la luz mediante el sensor de movimiento y la apague después de un tiempo. Para hacer esto, de acuerdo con el concepto Node-RED, necesitamos el mensaje del sensor de movimiento para alcanzar el atenuador a través de ciertos bloques y tener un cierto texto. Primero, trataremos con la inclusión de la luz.En primer lugar, seleccionamos de todos los mensajes del sensor de movimiento un mensaje con el texto ABIERTO; esto significa que el movimiento ha aparecido. Para hacer esto, use el bloque de interruptores. Conéctelo a la salida del bloque Hall Motion Sensor que ya hemos creado.
Lo configuraremos para que el bloque solo envíe mensajes con el texto ABIERTO
Como puede ver en la imagen, el bloque comparará la carga útil con el texto ABIERTO y enviará mensajes a la salida si el texto coincide.Nuestro atenuador requiere que se le envíen mensajes con el brillo requerido 0 ... 100. No entenderá el texto ABIERTO. Por lo tanto, usamos el bloque Cambiar para cambiar el texto del mensaje.
En la configuración de este bloque, escriba el cambio requerido (la carga útil del mensaje que cambiamos a 100) la intensidad de iluminación requerida.Y finalmente, lo conectamos todo a la entrada de nuestro atenuador:
si inicia este circuito, puede asegurarse de que funcione: la luz se encenderá en movimiento. Queda por asegurarse de que también se apaga.Para hacer esto, use la unidad de disparo y conéctela a la salida del sensor de movimiento.
El bloque de activación le permite generar mensajes retrasados y también puede restablecerse mediante un mensaje específico. Lo
configuraremos de esta manera: esta configuración significa que cuando llega el primer mensaje, el disparador no envía nada, pero comienza un retraso de tiempo de 8 segundos y luego envía un mensaje con el texto 0. El disparador también se reinicia si recibe una entrada con el texto ABIERTO. ¿Qué significa esto en nuestro caso?Supongamos que el sensor de movimiento muestra un mensaje ABIERTO. Este mensaje devolverá el disparador a su estado original sin ninguna reacción. Luego, después de un tiempo, el sensor de movimiento emitirá un mensaje CERRADO. Este mensaje iniciará el retraso de tiempo y 8 segundos después de eso, el disparador mostrará un mensaje 0.Si durante este tiempo de retraso el mensaje ABIERTO llega nuevamente, el disparador volverá a su estado original y esperará el siguiente mensaje (que lógicamente estará CERRADO). En este caso, el activador no mostrará ningún mensaje.Es decir, de esta manera creamos un temporizador que nos servirá para apagar automáticamente la luz después de una exposición determinada. Si recordamos la descripción del sensor de movimiento, queda claro por qué se configuran 8 segundos aquí, y no se agregan 10 - 2 segundos debido a la velocidad de obturación del sensor de movimiento.Queda por conectar la salida del disparador al atenuador y puede iniciar el circuito para la verificación.
Observo que por simplicidad publico capturas de pantalla de cadenas ya depuradas. Puede colgar bloques con su cadena de depuración para comprender cómo funciona, y su cadena puede verse así:
Y no hay nada de qué preocuparse.Y puede hacerlo así: en
general, al hacer clic en los rectángulos a la izquierda de los bloques de Inyección, puede depurar el circuito sin hierro, en su computadora portátil durante un viaje en el metro o incluso en una tableta.Circuito de encendido / apagado de luz dependiendo del brillo del alumbrado público
Ahora debemos asegurarnos de que la luz no se enciende si la calle es demasiado clara. Para hacer esto, necesitamos agregar otra cadena y cambiar ligeramente la cadena principal para tener en cuenta este factor.Primero, tome el bloque de interruptores que ya conocemos y conéctelo a la salida del sensor de luz.
Configuraremos esta unidad para que envíe mensajes desde el sensor de luz a una de las salidas, dependiendo de la iluminación actual.
La condición anterior significa que si la iluminación es inferior a 10 lux, el mensaje se enviará a la salida 1. De lo contrario, irá a la salida 2. No olvide que debe seleccionar la
Opción para que el mensaje se dirija solo a una de las salidas.Según el principio de funcionamiento, lógicamente resulta que si el mensaje apareció en la primera salida (superior), debemos habilitar la detección de movimiento y, si está en la segunda, apagarlo.Aquí, por supuesto, son posibles los métodos 1000 y 1, el más simple de los cuales es simplemente bloquear el mensaje para encender la luz del sensor de movimiento si hay luz afuera. Nos damos cuenta de ello.Cabe señalar que en Node-RED, el motor de ejecución se implementa en función de los mensajes. Es decir sin mensaje, sin evento, sin reacción. Esto impone ciertos detalles en el caso de que lleguen mensajes diferentes de forma asincrónica, es decir, en diferentes momentos. Por ejemplo, en este caso, el mensaje del sensor de luz es asíncrono con los mensajes del sensor de movimiento. Por lo tanto, para tener en cuenta el efecto del sensor de luz, debemos recordar la información que estaba en su mensaje y luego aplicarla la próxima vez que venga un mensaje del sensor de movimiento.En este caso, el contexto viene al rescate, un campo donde puede almacenar información durante la ejecución del flujo. El contexto es global en relación con todo el entorno, o local para un flujo específico, o generalmente solo para un bloque específico.En nuestro caso, utilizaremos un contexto local para este flujo. Es decir Las variables serán visibles para todos los bloques en este flujo. Creemos un bloque de cambio y conéctelo a la primera salida del Detector de umbral de luz.
Como recordamos, aparece un mensaje en esta salida si el sensor de luz informa que el alumbrado público es inferior a 10 Lux. Considere la configuración del bloque de cambio.
En este caso, usamos la regla Set para establecer la variable flow.Light_enabled en Yes. Por lo tanto, asignamos un valor a la variable global, que podemos usar en otros bloques.Del mismo modo, cree el segundo bloque de cambio y conéctelo a la segunda salida.
Su configuración será la siguiente:
Para averiguar si dicho detector funciona correctamente, podemos crear un circuito simple con bloques Inject y Debug.
Al mismo tiempo, en la configuración del bloque Inject, indicamos que debe dar a cada segundo el valor del flujo variable. Light_enabled
Luego, el resultado del sensor de luz se puede ver fácilmente en la pestaña Debug.
El circuito general de encendido / apagado de la luz para el sensor de luz se verá así
ahora, para tener en cuenta este efecto En el circuito de control del sensor de movimiento, nos basta con insertar el bloque de interruptores en el circuito de la ruta para encender la luz.
Y configúrelo para que omita los mensajes del sensor de movimiento solo si nuestro flujo variable global. Light_enabled está configurado en Sí, es decir Está oscuro afuera.
Hecho Ahora nuestro flujo se ve así:
Cambiar el brillo de la lámpara dependiendo del tiempo
Queda muy poco. Queremos cambiar la intensidad de la lámpara LED. Es decir si está oscuro con nosotros, pero la hora es antes de las 9 p.m., la luz debería encenderse a plena potencia. Pero después de las nueve, solo a baja potencia, como la iluminación nocturna.Para hacer esto, cree un bloque de inyección:
se puede configurar para que muestre un mensaje en un momento específico. Póngalo a las 21:00 todos los días.
Al mismo tiempo, notamos que emitirá un mensaje con un valor de 1. Esta será nuestra intensidad de luz de fondo deseada en el modo nocturno. Para usar este valor en el circuito de control de luz, usamos el mismo truco con variables globales. Cree un cambio:
bloquéelo y configúrelo para que la variable flow.Light_Brightness tenga asignado el valor del mensaje.
Para devolver el brillo inicial en la mañana, cree un segundo bloque de inyección, que se ejecutará a las 6 de la mañana y le dará un valor de brillo de 100. Conéctelo allí.
Por lo tanto, a la variable flow.Light_brightness se le asignará el valor 1 cada noche a las 9 en punto, y el valor 100 cada mañana a las 6 en punto. Solo queda aplicar esto en el circuito principal. Para esto, ya tenemos un bloque de ajuste de brillo de luz:
para el cual solo necesitamos cambiar la configuración para que no asigne una constante, sino el valor de la variable flow.Light_brightness.
Resultado final
El flujo final, libre de bloques de depuración, se ve limpio y ordenado. Al crear, solo utilizamos bloques de construcción de la instalación Node-RED. En flows.nodered.org , sin embargo, hay más de 800 bloques y bibliotecas adicionales que le permiten agregar muchas cosas diferentes.
Para aquellos que estén interesados en repetir este algoritmo, publico el flujo que utilicé para la depuración:
así como su código json, que puede importarse fácilmente a cualquier versión de Node-RED y probarse.[{"id":"5afd41b4.d61318","type":"switch","z":"2384634b.17767c","name":"Movement detected?","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"OPEN","vt":"str"}],"checkall":"false","outputs":1,"x":562,"y":285,"wires":[["381b0d6d.a0bd7a"]]},{"id":"35bac8e.57dd5b8","type":"trigger","z":"2384634b.17767c","op1":"5","op2":"0","op1type":"nul","op2type":"val","duration":"8","extend":false,"units":"s","reset":"OPEN","name":"Switch off delay","x":750,"y":373,"wires":[["e995e130.1e2118","af1f191f.498098"]]},{"id":"d85623d1.29b058","type":"change","z":"2384634b.17767c","name":"Light Brightness Adjustment","rules":[{"t":"set","p":"payload","pt":"msg","to":"Light_brightness","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":1013.9999389648438,"y":284.63330078125,"wires":[["e995e130.1e2118","af1f191f.498098"]]},{"id":"934ff922.ca34f","type":"inject","z":"2384634b.17767c","name":"","topic":"","payload":"OPEN","payloadType":"str","repeat":"","crontab":"","once":false,"x":258.5,"y":408,"wires":[["5afd41b4.d61318"]]},{"id":"ea0e2e99.52a6f8","type":"inject","z":"2384634b.17767c","name":"","topic":"","payload":"CLOSED","payloadType":"str","repeat":"","crontab":"","once":false,"x":269,"y":459,"wires":[["35bac8e.57dd5b8","5afd41b4.d61318"]]},{"id":"4187db59.93c2dc","type":"mqtt in","z":"2384634b.17767c","name":"Hall Light Sensor","topic":"/myhome/state/Lumin_Hall","qos":"2","broker":"bfc8eee2.a46c9","x":243,"y":146,"wires":[["c94e7c4.849f48"]]},{"id":"c94e7c4.849f48","type":"switch","z":"2384634b.17767c","name":"Light Threshold Selector","property":"payload","propertyType":"msg","rules":[{"t":"lt","v":"10","vt":"num"},{"t":"else"}],"checkall":"false","outputs":2,"x":517.3333129882812,"y":145.7166748046875,"wires":[["48e6a07a.962798"],["ca8b6623.f11c7"]]},{"id":"381b0d6d.a0bd7a","type":"switch","z":"2384634b.17767c","name":"Light Enabled?","property":"Light_enabled","propertyType":"flow","rules":[{"t":"eq","v":"Yes","vt":"str"}],"checkall":"true","outputs":1,"x":775.5,"y":285,"wires":[["d85623d1.29b058"]]},{"id":"48e6a07a.962798","type":"change","z":"2384634b.17767c","name":"Enable Light","rules":[{"t":"set","p":"Light_enabled","pt":"flow","to":"Yes","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":822,"y":109,"wires":[[]]},{"id":"ca8b6623.f11c7","type":"change","z":"2384634b.17767c","name":"Disable Light","rules":[{"t":"set","p":"Light_enabled","pt":"flow","to":"No","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":824.6666259765625,"y":177.51666259765625,"wires":[[]]},{"id":"b6ea27c1.c33cd","type":"inject","z":"2384634b.17767c","name":"","topic":"","payload":"Light_enabled","payloadType":"flow","repeat":"1","crontab":"","once":false,"x":330.5,"y":678,"wires":[["db66aec8.b3abc"]]},{"id":"db66aec8.b3abc","type":"debug","z":"2384634b.17767c","name":"Light_enabled","active":false,"console":"false","complete":"payload","x":670.5,"y":679,"wires":[]},{"id":"fa4b50b8.e6e0f","type":"inject","z":"2384634b.17767c","name":"","topic":"","payload":"5","payloadType":"num","repeat":"","crontab":"","once":false,"x":233.5,"y":212,"wires":[["c94e7c4.849f48"]]},{"id":"e7b1a39.f9e596","type":"inject","z":"2384634b.17767c","name":"","topic":"","payload":"100","payloadType":"num","repeat":"","crontab":"","once":false,"x":235,"y":266,"wires":[["c94e7c4.849f48"]]},{"id":"4b2f3c6f.de9aac","type":"mqtt in","z":"2384634b.17767c","name":"Hall Motion Sensor","topic":"/myhome/state/Hall_motion","qos":"2","broker":"87b370d1.dd497","x":247,"y":334,"wires":[["5afd41b4.d61318","35bac8e.57dd5b8"]]},{"id":"e995e130.1e2118","type":"mqtt out","z":"2384634b.17767c","name":"Hall Light Dimmer ","topic":"/myhome/command/Light_Hall/state","qos":"0","retain":"true","broker":"87b370d1.dd497","x":1310,"y":315,"wires":[]},{"id":"781e72a7.3c0abc","type":"inject","z":"2384634b.17767c","name":"Reduce Brightness at 21:00","topic":"Night Brightness","payload":"1","payloadType":"str","repeat":"","crontab":"00 21 * * *","once":false,"x":339,"y":517,"wires":[["adbf1e2e.3f5ae"]]},{"id":"aa444315.a48ad8","type":"inject","z":"2384634b.17767c","name":"Normal Brightness at 6:00","topic":"Night Brightness","payload":"50","payloadType":"num","repeat":"","crontab":"00 6 * * *","once":false,"x":349.6666259765625,"y":604.683349609375,"wires":[["adbf1e2e.3f5ae"]]},{"id":"adbf1e2e.3f5ae","type":"change","z":"2384634b.17767c","name":"Light Brightness Adjustment","rules":[{"t":"set","p":"Light_brightness","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":692,"y":554,"wires":[[]]},{"id":"af1f191f.498098","type":"debug","z":"2384634b.17767c","name":"","active":true,"console":"false","complete":"false","x":1303.5,"y":429,"wires":[]},{"id":"bfc8eee2.a46c9","type":"mqtt-broker","z":"2384634b.17767c","broker":"localhost","port":"1883","clientid":"","usetls":false,"verifyservercert":true,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willRetain":null,"willPayload":"","birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":""},{"id":"87b370d1.dd497","type":"mqtt-broker","z":"2384634b.17767c","broker":"localhost","port":"1883","clientid":"","usetls":false,"verifyservercert":true,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willRetain":null,"willPayload":"","birthTopic":"","birthQos":"0","birthRetain":null,"birthPayload":""}]
Resumen
En este artículo traté de demostrar y decir cuán fácil es implementar algoritmos de automatización del hogar todos los días en un entorno Node-RED. También traté de mostrar las principales ventajas de este entorno de programación, como:- una representación gráfica lógica de conexiones y funciones- facilidad de programación y depuración de scripts de usuario- independencia de hardware y plataforma de los algoritmos resultantes - este script funcionará igualmente bien con OpenHAB, y con ioBroker y con cualquier otra plataforma de casa inteligente que admita el protocolo MQTT.- facilidad de intercambio de algoritmos listos para usar entre usuarios gracias al código JSON de Copy-Paste y la presencia de una plataforma en línea para el intercambio de soluciones exitosas.Node-RED puede hacer mucho más, por ejemplo, recibir información meteorológica de Internet, enviar notificaciones a Twitter o trabajar con termostatos Nest. Y sobre esta base, puede crear muchos otros algoritmos de automatización interesantes y útiles. Pero estos son temas para los siguientes artículos.