Nous programmons le contrôle de l'éclairage par des capteurs de mouvement et d'éclairage sur Node-RED

Il existe peu d'articles sur un environnement de programmation tel que Node-RED sur Internet en langue russe . Cet article révélera le secret du rideau sur ce produit et montrera, à l'aide de l'exemple de création d'un algorithme de contrôle d'éclairage pour les capteurs de mouvement, à quel point il est simple d'utiliser Node-RED pour implémenter divers scénarios et règles pour automatiser une maison intelligente sous une forme complètement graphique sans écrire de code.



Qu'est-ce que Node-RED?


IBM, comme d'autres grandes entreprises, essaie de trouver sa niche dans l'Internet des objets en évolution. Ceci est généralement associé à la sortie d'applications et de produits open source afin de populariser leurs plateformes payantes. Par exemple, chez IBM, la plate-forme payante est Bluemix.

Node-RED est une création open source d'IBM et, comme il est simplement écrit sur le site, c'est un outil qui sert à connecter le matériel, les API et les services de manière nouvelle et intéressante.

Ces méthodes sont basées sur l'utilisation de lignes de communication graphiques à travers lesquelles des messages sont envoyés entre les nœuds. Ainsi, vous pouvez connecter les différents blocs simplement avec la souris sans utiliser de programmation.

Le développement dans Node-RED s'effectue via un navigateur ordinaire, le noyau lui-même peut être exécuté sur différentes plates-formes - PC, RPi, cloud, etc.

Node-RED pour la maison intelligente


J'ai décidé d'essayer Node-RED pour écrire des scripts et des règles pour la maison intelligente. Autrement dit, pour l'automatisation. La connexion même avec divers actionneurs, services Web et capteurs se fait sur OpenHAB. Pourquoi ai-je décidé de ne pas y faire d'automatisation? Plusieurs raisons:
- Dans OpenHAB, les scripts et les règles sont écrits dans leur propre langage. Je ne voulais pas l'étudier uniquement pour une seule application.
- Le débogage des règles lui-même est pratiquement impossible - si la règle ne fonctionne pas, il est difficile de comprendre pourquoi
- je voudrais que mes règles soient indépendantes du matériel, des canaux de communication, des plates-formes et du logiciel lui-même pour communiquer avec les appareils. Pour que je puisse facilement passer à une autre plate-forme UD, par exemple Domoticz, MajorDomo, FHEM et emporter mes règles avec moi, sans les réécrire sous la nouvelle plate-forme UD.

Contrôle de l'éclairage par des capteurs de mouvement et de lumière


Commençons donc. En fait, la tâche d'origine est simple et triviale:
j'ai contrôlé des spots LED pour l'éclairage dans le couloir. Je veux que la lumière s'allume en mouvement et s'éteigne après 10 secondes.

Compliquons un peu la tâche:
- La lumière ne doit s'allumer que lorsqu'il fait sombre à l'extérieur
- L'intensité de la lumière doit dépendre du temps - jusqu'à 21 heures, la lumière doit s'allumer à pleine intensité, et après seulement 10% comme rétro-éclairage.

Capteurs, interprètes, etc. fer


Les protocoles et les options de communication avec les capteurs et actionneurs que je ne décrirai pas ici. Qu'il suffise de dire que dans ma maison intelligente, tous ces protocoles sont réduits à un - MQTT, et grâce à lui la communication avec Node-RED est déjà en cours.
Alors, quels capteurs et actionneurs ai-je?
1. Le capteur de mouvement. Publie un message OUVERT dans la rubrique / myhome / state / Hall_motion lorsqu'il détecte un mouvement et FERMÉ s'il n'y a aucun mouvement pendant 2 secondes.
2. Capteur de lumière. Il mesure la luminosité de l'éclairage public dans la plage de 0 à 1 000 lux. Il publie un message une fois par minute dans le sujet / myhome / state / Lumin_Hall avec le niveau d'éclairage actuel.
3. Lampes LED de contrôle de gradateur. Il est abonné à la rubrique / myhome / command / Light_Hall / state. Si vous écrivez 0 là - la lumière s'éteindra. 100 - s'allume à la luminosité maximale. 1-99 - changera l'intensité lumineuse. Pour un éclairage nocturne, une intensité suffisante 1.

Description du flux dans le nœud-RED


Il est supposé que vous avez déjà installé Node-RED. Sinon, suivez le lien ci-dessus et installez n'importe quelle option qui vous convient - sur un ordinateur, Raspberry, clowd, etc. Dans mon cas, Node-RED est installé sur RPi2 (à mon avis, il vient même avec Raspbian, donc rien ne doit être installé du tout). Ce flux ne nécessite l'installation d'aucune bibliothèque supplémentaire.

Entrées et sorties


Tout d'abord, nous créons les entrées et sorties nécessaires à notre algorithme. Il s'agira de clients MQTT abonnés aux rubriques pertinentes. Nous les faisons glisser de la bibliothèque de gauche et les personnalisons.

Remarque: Les noms de bloc affichés peuvent être modifiés dans leurs paramètres.

Pour le capteur de lumière, créez le nœud Hall Light Sensor à partir de l'entrée MQTT:



dans sa configuration, il suffit d'enregistrer l'adresse et le sujet du courtier MQTT.



Mon courtier tourne sur la même plate-forme, alors laissez simplement localhost.

Nous créons le nœud Hall Motion Sensor pour le capteur de mouvement:



Tout est pareil pour lui, il suffit de définir un autre sujet / myhome / state / Hall_motion.



Comme vous pouvez voir l'adresse et les paramètres du courtier, ce nœud a déjà pris le relais du précédent, vous n'avez donc pas besoin de les saisir dans un nouveau.

Il reste à ajouter la sortie MQTT pour faire une sortie pour le gradateur LED. Faites glisser et déposez la sortie MQTT et appelez-la Hall Light Dimmer.



Dans les paramètres, encore une fois, il vous suffit de spécifier la rubrique souhaitée, à laquelle les messages pour contrôler le gradateur seront envoyés - / myhome / command / Light_Hall / state



En conséquence, nous avons obtenu trois nœuds pour notre Flow.



Il ne ferait pas de mal de les tester pour leur fonctionnalité. C'est simple.
Nous connectons la sortie de débogage aux blocs d'entrée.



Et connectez l'entrée d'injection au bloc de sortie.



Dans les paramètres de ce nœud, vous devez modifier la charge utile au niveau de la luminosité souhaitée de la lampe. Par exemple, dans ce cas, il s'agit de 100.



Nous pouvons créer plusieurs blocs d'injection identiques par copier-coller, changer la luminosité et les connecter à la sortie comme ceci:



Cela fonctionnera aussi. Il est temps de vérifier. Nous cliquons sur le bouton Déployer:



sous les nœuds MQTT, vous devriez voir un petit message:



cela signifie qu'ils sont connectés au courtier MQTT. Si tout s'est déroulé comme prévu, dans l'onglet de débogage de droite, vous devriez voir les messages des capteurs, et si vous cliquez sur les rectangles à gauche des nœuds d'injection, l'intensité lumineuse de la lampe connectée au gradateur devrait changer. Si tout fonctionne, vous pouvez aller plus loin.

Circuit de commande d'éclairage du capteur de mouvement


Pour simplifier, je ferai référence aux blocs individuels interconnectés comme des chaînes. Tout d'abord, essayons de créer un circuit simple qui allume la lumière par le capteur de mouvement et l'éteint après un certain temps. Pour ce faire, selon le concept Node-RED, nous avons besoin du message du capteur de mouvement pour atteindre le gradateur à travers certains blocs et avoir un certain texte. Tout d'abord, nous traiterons de l'inclusion de la lumière.

Tout d'abord, nous sélectionnons parmi tous les messages du capteur de mouvement un message avec le texte OUVERT - cela signifie que le mouvement est apparu. Pour ce faire, utilisez le bloc commutateur. Connectez-le à la sortie du bloc Hall Motion Sensor que nous avons déjà créé.



Nous allons le configurer pour que le bloc ne génère que des messages avec le texte OPEN



Comme vous pouvez le voir sur l'image, le bloc comparera la charge utile avec le texte OUVERT et enverra des messages à la sortie si le texte correspond.

Notre variateur nécessite que des messages avec la luminosité requise 0 ... 100 y soient entrés. Il ne comprendra pas le texte OUVERT. Par conséquent, nous utilisons le bloc Modifier pour modifier le texte du message.




Dans les paramètres de ce bloc, notez la modification requise - la charge utile du message passe à 100 - l'intensité d'éclairage requise.

Et enfin, nous connectons tout cela à l'entrée de notre gradateur:



si vous démarrez ce circuit, vous pouvez vous assurer qu'il fonctionne - la lumière s'allumera en mouvement. Reste à s'assurer qu'il s'éteint également.

Pour ce faire, utilisez l'unité de déclenchement et connectez-la à la sortie du capteur de mouvement.



Le bloc déclencheur vous permet de générer des messages retardés et peut également être réinitialisé par un message spécifique. Nous allons le



configurer de cette façon: Ce paramètre signifie que lorsque le premier message arrive, le déclencheur n'envoie rien, mais démarre un délai de 8 secondes et ensuite il envoie un message avec le texte 0. Le déclencheur est également réinitialisé s'il reçoit une entrée avec le texte OUVERT. Qu'est-ce que cela signifie dans notre cas?

Supposons que le capteur de mouvement affiche un message OUVERT. Ce message ramènera le déclencheur à son état d'origine sans aucune réaction. Ensuite, après un certain temps, le détecteur de mouvement émet un message FERMÉ. Ce message démarrera la temporisation et 8 secondes après que le déclencheur affichera un message 0.

Si pendant ce délai, le message OPEN arrive à nouveau, le déclencheur reviendra à son état d'origine et attendra le prochain message (qui sera logiquement FERMÉ). Dans ce cas, le déclencheur n'affichera aucun message.
Autrement dit, nous avons créé une minuterie qui nous servira à éteindre automatiquement la lumière après une exposition donnée. Si nous rappelons la description du capteur de mouvement, il devient clair pourquoi 8 secondes sont définies ici, et non 10 - 2 secondes sont ajoutées en raison de la vitesse d'obturation du capteur de mouvement lui-même.

Il reste à connecter la sortie de déclenchement au gradateur et vous pouvez démarrer le circuit pour vérification.



Je note que pour plus de simplicité, je poste des captures d'écran de chaînes déjà déboguées. Vous pouvez accrocher des blocs avec votre chaîne de débogage pour comprendre comment cela fonctionne, et votre chaîne peut ressembler à ceci:



Et il n'y a rien à craindre.

Et vous pouvez le faire comme ceci: en



général, en cliquant sur les rectangles à gauche des blocs d'injection, vous pouvez déboguer le circuit sans fer à repasser - sur votre ordinateur portable lors d'un voyage dans le métro ou même une tablette.

Circuit marche / arrêt de la lumière en fonction de la luminosité de l'éclairage public


Maintenant, nous devons nous assurer que la lumière ne s'allume pas si la rue est trop claire. Pour ce faire, nous devons ajouter une autre chaîne et modifier légèrement la chaîne principale pour tenir compte de ce facteur.

Tout d'abord, prenez le bloc de commutation que nous connaissons déjà et connectez-le à la sortie du capteur de lumière.



Nous allons configurer cette unité afin qu'elle envoie des messages du capteur de lumière à l'une des sorties, en fonction de l'éclairage actuel.



La condition ci-dessus signifie que si l'éclairage est inférieur à 10 lux, le message sera envoyé à la sortie 1. Sinon, il ira à la sortie 2. N'oubliez pas que vous devez sélectionner l'



option pour que le message soit dirigé vers une seule des sorties.

Sur la base du principe de fonctionnement, il s'avère logiquement que si le message apparaît sur la première sortie (supérieure), nous devons activer la détection de mouvement, et si sur la seconde, puis l'éteindre.

Ici, bien sûr, 1000 et 1 méthodes sont possibles, la plus simple étant de simplement bloquer le message pour allumer la lumière du capteur de mouvement si elle est lumineuse à l'extérieur. Nous le réalisons.

Il est à noter que dans Node-RED, le moteur d'exécution est implémenté en fonction des messages. C'est-à-dire pas de message - pas d'événement, pas de réaction. Cela impose certaines spécificités dans le cas où différents messages arrivent de manière asynchrone, c'est-à-dire à différents moments. Par exemple, dans ce cas, le message du capteur de lumière est asynchrone avec les messages du capteur de mouvement. Par conséquent, afin de prendre en compte l'effet du capteur de lumière, nous devons nous souvenir des informations contenues dans son message, puis les appliquer la prochaine fois qu'un message provient du capteur de mouvement.

Dans ce cas, le contexte vient à la rescousse - un champ où vous pouvez stocker des informations pendant l'exécution du flux. Le contexte est global par rapport à l'ensemble de l'environnement, ou local à un flux spécifique, ou généralement uniquement à un bloc spécifique.

Dans notre cas, nous utiliserons un contexte local à ce flux. C'est-à-dire les variables seront visibles par tous les blocs de ce flux. Créez un bloc de changement et connectez-le à la première sortie du détecteur de seuil de lumière.



Comme nous nous en souvenons, un message apparaît sur cette sortie si le capteur de lumière signale que l'éclairage public est inférieur à 10 Lux. Tenez compte de la configuration du bloc de modification.



Dans ce cas, nous utilisons la règle Set pour définir la variable flow.Light_enabled sur Oui. Ainsi, nous avons attribué une valeur à la variable globale, que nous pouvons utiliser dans d'autres blocs.

De la même manière, créez le deuxième bloc de modification et connectez-le à la deuxième sortie.



Sa configuration sera la suivante:



Pour savoir si un tel détecteur fonctionne correctement, nous pouvons créer un circuit simple avec des blocs d'injection et de débogage.



Dans les paramètres Injecter bloc , nous notons qu'il devrait publier chaque seconde valeur de la variable flow.Light_enabled



Ensuite , le résultat du capteur de lumière peut être facilement vu dans l'onglet Mise au point de la



chaîne totale on / off la lumière sur l'éclairage du capteur ressemblera à ceci



maintenant, pour tenir compte de cet effet le circuit de commande du capteur de mouvement, il nous suffit d'insérer le bloc interrupteur dans le circuit du chemin pour allumer la lumière.



Et configurez-le de manière à ce qu'il ignore les messages du capteur de mouvement uniquement si notre flux de variables globales.Light_enabled est défini sur Oui, c'est-à-dire il fait sombre dehors.



C'est fait! Maintenant, notre flux ressemble à ceci:



Modification de la luminosité de la lampe en fonction du temps


Il en reste très peu. Nous voulons changer l'intensité de la lampe LED. C'est-à-dire s'il fait sombre chez nous, mais qu'il est avant 21 heures, la lumière devrait s'allumer à pleine puissance. Mais après neuf heures - seulement à faible puissance, comme l'éclairage nocturne.
Pour ce faire, créez un bloc Inject:



il peut être configuré pour qu'il affiche un message à un moment précis. Réglez-le à 21h00 tous les jours.



Dans le même temps, nous notons qu'il émettra un message avec une valeur de 1. Ce sera notre intensité de rétro-éclairage souhaitée en mode nuit. Pour utiliser cette valeur dans le circuit de contrôle de la lumière, nous utilisons la même astuce avec les variables globales. Créez une modification: bloquez-la



et configurez-la de sorte que la variable flow.Light_Brightness reçoive la valeur du message.


Pour rendre la luminosité initiale le matin, créez un deuxième bloc d'injection, qui sera exécuté à 6 heures du matin et donnera une valeur de luminosité de 100. Connectez-le là.



Ainsi, la variable flow.Light_brightness se verra attribuer la valeur 1 tous les soirs à 9 heures et la valeur 100 tous les matins à 6 heures. Il ne reste plus qu'à l'appliquer dans le circuit principal. Pour ce faire, nous avons déjà le bloc de réglage de la luminosité de la lumière:



pour lequel nous avons seulement besoin de modifier le paramètre afin qu'il n'affecte pas une constante, mais la valeur du débit variable.



Résultat final


Le flux final, débarrassé des blocs de débogage, semble net et propre. Lors de la création, nous avons utilisé uniquement les blocs de construction de l'installation Node-RED. Sur flows.nodered.org , cependant, il existe plus de 800 blocs et bibliothèques supplémentaires qui vous permettent d'ajouter de nombreuses choses différentes.



Pour ceux qui souhaitent répéter cet algorithme, je poste le flux que j'ai utilisé pour le débogage:



ainsi que son code json, qui peut être facilement importé dans n'importe quelle version de Node-RED et testé.
[{"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":""}]


Résumé


Dans cet article, j'ai essayé de démontrer et de dire à quel point il est facile d'implémenter des algorithmes de domotique au quotidien dans un environnement Node-RED. J'ai également essayé de montrer les principaux avantages de cet environnement de programmation, tels que:
- une représentation graphique logique des connexions et des fonctions
- facilité de programmation et facilité de débogage des scripts utilisateur
- indépendance du matériel et de la plate-forme des algorithmes résultants - ce script fonctionnera aussi bien avec OpenHAB qu'avec ioBroker et avec toute autre plate-forme de maison intelligente prenant en charge le protocole MQTT.
- facilité d'échange d'algorithmes prêts à l'emploi entre utilisateurs grâce au code Copy-Paste JSON et la présence d'une plateforme en ligne pour l'échange de solutions performantes.

Node-RED peut faire beaucoup plus, par exemple, recevoir la météo sur Internet, envoyer des notifications à Twitter ou utiliser les thermostats Nest. Et sur cette base, vous pouvez créer de nombreux autres algorithmes d'automatisation intéressants et utiles. Mais ce sont des sujets pour les articles suivants.

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


All Articles