Existem poucos artigos em um ambiente de programação como o Node-RED na Internet em russo . Este artigo irá revelar o segredo da cortina sobre este produto e mostrar, usando o exemplo da criação de um algoritmo de controle de iluminação para sensores de movimento, como é simples usar o Node-RED para implementar vários cenários e regras para automatizar uma casa inteligente de forma completamente gráfica sem escrever nenhum código.
O que é o Node-RED?
A IBM, como outras grandes empresas, está tentando encontrar seu nicho na Internet em evolução. Isso geralmente é associado ao lançamento de aplicativos e produtos de código aberto para popularizar suas plataformas pagas. Por exemplo, na IBM, a plataforma paga é Bluemix.O Node-RED é uma criação de código aberto da IBM e, como é simplesmente escrito no site, é uma ferramenta que serve para conectar hardware, APIs e serviços de maneiras novas e interessantes.Esses métodos são baseados no uso de linhas de comunicação gráfica através das quais as mensagens são enviadas entre os nós. Assim, você pode conectar os vários blocos simplesmente com o mouse sem usar a programação.O desenvolvimento no Node-RED é realizado através de um navegador comum, o próprio kernel pode ser executado em várias plataformas - PC, RPi, nuvem, etc.Node-RED para casa inteligente
Decidi tentar o Node-RED para escrever scripts e regras para casa inteligente. Ou seja, para automação. A própria conexão com vários atuadores, serviços da web e sensores é feita no OpenHAB. Por que eu decidi não fazer automação lá? Várias razões:- No OpenHAB, scripts e regras são escritos em seu próprio idioma. Eu não queria estudá-lo apenas por uma aplicação.- A depuração das regras em si é quase impossível - se a regra não funcionar, é difícil descobrir por que- eu gostaria que minhas regras fossem independentes de hardware, canais de comunicação, plataformas e software em si para comunicação com dispositivos. Para que eu possa alternar facilmente para outra plataforma UD, por exemplo, Domoticz, MajorDomo, FHEM e levar minhas regras comigo, e não reescrevê-las na nova plataforma UD.Controle de iluminação por sensores de movimento e luz
Então, vamos começar. Na verdade, a tarefa original é simples e trivial:eu controlei pontos de LED para iluminação no corredor. Quero que a luz acenda o movimento e apague-se após 10 segundos.Vamos complicar um pouco a tarefa:- A luz deve acender somente quando está escuro lá fora- A intensidade da luz deve depender do tempo - até as 21h, a luz deve acender com intensidade total e depois disso apenas 10% como luz de fundo.Sensores, artistas, etc. ferro
Os protocolos e opções de comunicação com sensores e atuadores não serão descritos aqui. Basta dizer que em minha casa inteligente todos esses protocolos são reduzidos a um - MQTT e, através dele, a comunicação com o Node-RED já está acontecendo.Então, quais sensores e atuadores eu tenho?1. O sensor de movimento. Publica uma mensagem OPEN no tópico / myhome / state / Hall_motion quando detecta movimento e FECHADO se não houver movimento por 2 segundos.2. sensor de luz. Ele mede o brilho da iluminação pública na faixa de 0-1000 Lux. Ele publica uma mensagem uma vez por minuto no tópico / myhome / state / Lumin_Hall com o nível de luz atual.3. Controle de dimmer lâmpadas LED. Está inscrito no tópico / myhome / command / Light_Hall / state. Se você escrever 0 lá - a luz se apagará. 100 - liga com brilho máximo. 1-99 - altera a intensidade da luz. Para iluminação noturna, intensidade suficiente 1.Descrição do Fluxo no Node-RED
Supõe-se que você já instalou o Node-RED. Caso contrário, siga o link acima e instale qualquer opção conveniente para você - em um computador, framboesa, palhaço etc. No meu caso, o Node-RED está instalado no RPi2 (na minha opinião, ele vem com o Raspbian, então nada precisa ser instalado). Esse fluxo não requer a instalação de nenhuma biblioteca adicional.Entradas e saídas
Primeiro de tudo, criamos as entradas e saídas necessárias para o nosso algoritmo. Esses serão clientes MQTT que estão assinando os tópicos relevantes. Nós os arrastamos da biblioteca à esquerda e personalizamos.Nota: Os nomes dos blocos exibidos podem ser alterados em suas configurações.Para o sensor de luz, crie o nó Hall Light Sensor a partir da Entrada MQTT:
Em sua configuração, é suficiente registrar o endereço e o tópico do broker MQTT.
Meu corretor está girando na mesma plataforma, então deixe o localhost.Criamos o nó Hall Motion Sensor para o sensor de movimento:
tudo é igual para ele, basta definir outro tópico / myhome / state / Hall_motion.
Como você pode ver o endereço e os parâmetros do broker, esse nó já substituiu o anterior, portanto, não é necessário inseri-los em um novo.Resta adicionar a saída MQTT para gerar uma saída para o dimmer de LED. Arraste e solte a Saída MQTT e chame-a de Hall Light Dimmer.
Nos parâmetros, novamente, você só precisa especificar o tópico desejado, para o qual as mensagens para controlar o dimmer serão enviadas - / myhome / command / Light_Hall / state
Como resultado, temos três nós para o nosso Flow.
Não faria mal testá-los quanto à funcionalidade. É fácilNós conectamos a saída de depuração aos blocos de entrada.
E conecte a entrada de injeção ao bloco de saída.
Nas configurações deste nó, você precisa alterar a carga útil para o nível do brilho desejado da lâmpada. Por exemplo, nesse caso, é 100.
Podemos criar vários blocos de injeção idênticos copiando e colando, alterando o brilho e conectando-o à saída da seguinte maneira:
Isso também funcionará. Está na hora de checar.
Clicamos no botão Implementar: Nos nós do MQTT, você verá uma pequena mensagem:
Isso significa que eles estão conectados ao broker do MQTT. Se tudo correu conforme o planejado, na guia de depuração direita você deve ver as mensagens dos sensores e, se clicar nos retângulos à esquerda dos nós de injeção, a intensidade da luz da lâmpada conectada ao dimmer deve mudar. Se tudo funcionar, você pode ir mais longe.Circuito de controle de iluminação do sensor de movimento
Para simplificar, vou me referir a blocos interconectados individuais como cadeias. Primeiro de tudo, vamos tentar fazer um circuito simples que acenda a luz pelo sensor de movimento e apague depois de algum tempo. Para fazer isso, de acordo com o conceito Node-RED, precisamos da mensagem do sensor de movimento para alcançar o dimmer através de certos blocos e ter um determinado texto. Primeiro, trataremos da inclusão da luz.Primeiro, selecionamos de todas as mensagens do sensor de movimento uma mensagem com o texto ABRIR - isso significa que o movimento apareceu. Para fazer isso, use o bloco do interruptor. Conecte-o à saída do bloco Hall Motion Sensor que já criamos.
Vamos configurá-lo para que o bloco apenas envie mensagens com o texto OPEN
Como você pode ver na figura, o bloco comparará a carga útil com o texto ABRIR e enviará mensagens para a saída 1 se o texto corresponder.Nosso redutor exige que as mensagens com o brilho necessário de 0 a 100 sejam inseridas nele. Ele não entenderá o texto ABRIR. Portanto, usamos o bloco Alterar para alterar o texto da mensagem.
Nas configurações deste bloco, anote a alteração necessária - carga útil da mensagem que mudamos para 100 - a intensidade de iluminação necessária.E, finalmente, conectamos tudo à entrada do nosso dimmer:
se você iniciar este circuito, poderá garantir que ele funcione - a luz acenderá em movimento. Resta garantir que ele também apague.Para fazer isso, use a unidade Trigger e conecte-a à saída do sensor de movimento.
O bloco de gatilho permite gerar mensagens atrasadas e também pode ser redefinido por uma mensagem específica. Vamos
configurá- lo da seguinte forma: essa configuração significa que, quando a primeira mensagem chega, o gatilho não envia nada, mas inicia um atraso de 8 segundos e depois envia uma mensagem com o texto 0. O gatilho também é redefinido se receber uma entrada com o texto ABRIR. O que isso significa no nosso caso?Suponha que o sensor de movimento exiba uma mensagem ABRIR. Esta mensagem retornará o gatilho ao seu estado original sem nenhuma reação. Depois de algum tempo, o sensor de movimento emitirá uma mensagem FECHADA. Esta mensagem iniciará o atraso de tempo e 8 segundos depois o gatilho exibirá uma mensagem 0.Se durante esse período de atraso a mensagem ABRIR chegar novamente, o gatilho retornará novamente ao seu estado original e aguardará a próxima mensagem (que será logicamente FECHADA). Nesse caso, o gatilho não exibirá nenhuma mensagem.Ou seja, dessa maneira, criamos um timer que nos servirá para desligar automaticamente a luz após uma determinada exposição. Se recordarmos a descrição do sensor de movimento, fica claro por que 8 segundos são definidos aqui e não 10 ou 2 segundos são adicionados devido à velocidade do obturador do próprio sensor de movimento.Resta conectar a saída do gatilho ao dimmer e você pode iniciar o circuito para verificação.
Percebo que, por simplicidade, publico capturas de tela de cadeias já depuradas. Você pode pendurar blocos com sua cadeia de depuração para entender como ela funciona e sua cadeia pode ficar assim:
E não há nada com que se preocupar.E você pode fazer o seguinte: em
geral, clicando nos retângulos à esquerda dos blocos de injeção, você pode depurar o circuito sem ferro - no seu laptop durante uma viagem no metrô ou até em um tablet.Circuito de ligar / desligar a luz, dependendo do brilho da iluminação pública
Agora precisamos garantir que a luz não acenda se a rua estiver muito clara. Para fazer isso, precisamos adicionar outra cadeia e alterar ligeiramente a cadeia principal para levar esse fator em consideração.Primeiro, pegue o bloco do interruptor que já conhecemos e conecte-o à saída do sensor de luz.
Vamos configurar esta unidade para que envie mensagens do sensor de luz para uma das saídas, dependendo da iluminação atual.
A condição acima significa que, se a iluminação for menor que 10 lux, a mensagem será enviada para a saída 1. Caso contrário, ela será enviada para a saída 2. Não esqueça que você precisa selecionar a
Opção para que a mensagem seja direcionada para apenas uma das saídas.Com base no princípio de operação, logicamente acontece que, se a mensagem aparecer na primeira saída (superior), precisamos ativar a detecção de movimento e, na segunda, desligá-la.Aqui, é claro, os métodos 1000 e 1 são possíveis, o mais simples dos quais é simplesmente bloquear a mensagem para acender a luz do sensor de movimento, se houver luz externa. Nós percebemos isso.Note-se que no Node-RED, o mecanismo de execução é implementado com base em mensagens. I.e. nenhuma mensagem - nenhum evento, nenhuma reação. Isso impõe determinadas especificidades no caso de mensagens diferentes chegarem de forma assíncrona, ou seja, em diferentes momentos. Por exemplo, neste caso, a mensagem do sensor de luz é assíncrona com as mensagens do sensor de movimento. Portanto, para levar em consideração o efeito do sensor de luz, precisamos lembrar as informações que estavam em sua mensagem e aplicá-las na próxima vez que uma mensagem vier do sensor de movimento.Nesse caso, o contexto chega ao resgate - um campo em que você pode armazenar informações durante a execução do fluxo. O contexto é global em relação a todo o ambiente, ou local para um fluxo específico, ou geralmente apenas para um bloco específico.No nosso caso, usaremos um contexto local para esse fluxo. I.e. variáveis serão visíveis para todos os blocos nesse fluxo. Vamos criar um bloco de alteração e conectá-lo à primeira saída do detector de limite de luz.Como
lembramos, uma mensagem aparece nessa saída se o sensor de luz relatar que a iluminação da rua é inferior a 10 Lux. Considere a configuração do bloco de alterações.Neste
caso, usamos a regra Set para definir a variável flow.Light_enabled como Yes. Assim, atribuímos um valor à variável global, que podemos usar em outros blocos.Da mesma maneira, crie o segundo bloco de alteração e conecte-o à segunda saída.
Sua configuração será a seguinte:
Para descobrir se esse detector funciona corretamente, podemos criar um circuito simples com os blocos Inject e Debug.
Ao mesmo tempo, nas configurações do bloco Injetar, indicamos que ele deve gerar o valor da variável de fluxo a cada segundo.Luz_enabled
Em seguida, o resultado do sensor de luz pode ser facilmente visto na guia Debug.O circuito geral de ativação
/ desativação da luz geral para o sensor de luz terá esta aparência
Agora, para levar esse efeito em consideração o circuito de controle do sensor de movimento, basta inserir o bloco do interruptor no circuito do caminho para acender a luz.
E configure-o para que ele ignore as mensagens do sensor de movimento somente se o fluxo variável global. Light_enabled estiver definido como Sim - ou seja, está escuro lá fora.
Feito! Agora nosso fluxo fica assim:
Alterar o brilho da lâmpada, dependendo do tempo
Ainda resta muito pouco. Queremos mudar a intensidade da lâmpada LED. I.e. se estiver escuro conosco, mas antes das 21 horas, a luz deve acender com força total. Mas depois das nove - apenas em baixa potência, como iluminação noturna.Para fazer isso, crie um bloco de injeção:
Ele pode ser configurado para exibir uma mensagem em um horário específico. Defina às 21:00 todos os dias.
Ao mesmo tempo, observamos que ele emitirá uma mensagem com o valor 1. Essa será a intensidade de luz de fundo desejada no modo noturno. Para usar esse valor no circuito de controle de luz, usamos o mesmo truque com variáveis globais. Crie uma mudança: bloqueie
e configure-o para que a variável flow.Light_Brightness receba o valor da mensagem.
Para retornar o brilho inicial da manhã, crie um segundo bloco de injeção, que será executado às 6 da manhã e forneça um valor de brilho de 100. Conecte-o lá.
Assim, a variável flow.Light_brightness receberá o valor 1 todas as noites às 9 horas e o valor 100 todas as manhãs às 6 horas. Resta apenas aplicar isso no circuito principal. Para isso, já temos um bloco de ajuste do brilho da luz:
para o qual precisamos alterar apenas a configuração para que não atribua uma constante, mas o valor da variável flow.Light_brightness.
Resultado final
O fluxo final, limpo de blocos de depuração, parece limpo e arrumado. Ao criar, usamos apenas componentes básicos da instalação do Node-RED. No flows.nodered.org , no entanto, existem mais de 800 blocos e bibliotecas adicionais que permitem adicionar muitas coisas diferentes.
Para aqueles que estão interessados em repetir esse algoritmo, publico o fluxo que usei para depuração:
além do código json, que pode ser facilmente importado para qualquer versão do Node-RED e testado.[{"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":""}]
Sumário
Neste artigo, tentei demonstrar e explicar como é fácil implementar algoritmos diários de automação residencial em um ambiente Node-RED. Também tentei mostrar as principais vantagens desse ambiente de programação, como:- uma representação gráfica lógica de conexões e funções- facilidade de programação e facilidade de depuração de scripts do usuário- independência de hardware e plataforma dos algoritmos resultantes - esse script funcionará igualmente bem com o OpenHAB e com o ioBroker e com qualquer outra plataforma doméstica inteligente que suporte o protocolo MQTT.- facilidade de troca de algoritmos prontos entre usuários, graças ao código JSON Copy-Paste e a presença de uma plataforma on-line para a troca de soluções bem-sucedidas.O Node-RED pode fazer muito mais, por exemplo, receber informações meteorológicas da Internet, enviar notificações para o Twitter ou trabalhar com termostatos Nest. E com base nisso, você pode criar muitos outros algoritmos de automação interessantes e úteis. Mas estes são tópicos para os seguintes artigos.