Sommaire

Node-RED : Communiquer avec une API en JSON

Contexte

Dans ma domotique, deux capteurs de mouvement Zigbee sont d’une part et d’autres de mon entrée et de mon couloir.
Lorsque que le soleil est en dessous de l’horizon et que ces derniers détectent du mouvement, cela active deux bandes LED sous WLED.

L’automatisation est faite sous Node-RED en contrôlant les entités via Home Assistant.
Depuis la version 2022.7 d’HA, mes deux contrôleurs LED apparaissent hors ligne sur HA alors qu’ils sont toujours utilisables ailleurs (via l’application WLED, via leur page Web, leur API,…).
Un bug existe, mais à l’heure où j’écris ces lignes, il n’est pas corrigé… 😞

WLED proposant une API, je me suis dit que c’est le bon moment pour apprendre à l’utiliser dans Node-RED.
Nous allons donc voir par cette problématique comment lire des données d’une API (méthode GET) et comment en envoyer (méthode POST).

Expérimentations avec cURL

La première étape est de comprendre comment fonctionne l’API. Pour cela, rien de mieux que cURL !

En épluchant la documentation de l’API Json, j’ai traduit les commandes dont j’avais besoin.

Méthode GET

Pour connaitre l’état des LEDs, j’effectue la commande suivante :

1
curl -X GET "http://192.168.22.7/json/state" -H "Content-Type: application/json"

Le résultat :

1
{"on":false,"bri":25,"transition":7,"ps":-1,"pl":-1,"nl":{"on":false,"dur":60,"mode":1,"tbri":0,"rem":-1},"udpn":{"send":false,"recv":true},"lor":0,"mainseg":0,"seg":[{"id":0,"start":0,"stop":79,"len":79,"grp":1,"spc":0,"of":0,"on":true,"frz":false,"bri":255,"cct":127,"col":[[255,160,0],[0,0,0],[0,0,0]],"fx":0,"sx":128,"ix":128,"pal":51,"sel":true,"rev":false,"mi":false}]}

Ayant seulement besoin de connaitre l’état (et non les autres informations), je filtre avec jQuery :

1
2
curl --silent -X GET "http://192.168.22.7/json/state" -H "Content-T
ype: application/json" | jq .on

Méthode POST

Pour allumer la bande LED dans ma configuration voulue (toutes les LEDs : couleurs RGB à [255,160,0], luminosité à 25 et sans effet), après de nombreux tests, j’arrive à la commande suivante :

1
curl -X POST "http://192.168.22.7/json/state" -d '{"on":true,"bri":25,"seg":[{"id":0,"col":[[255,160,0],[0,0,0],[0,0,0]],"fx":0}]}' -H "Content-Type: application/json"

Et pour finir, pour éteindre la bande LED :

1
curl -X POST "http://192.168.22.7/json/state" -d '{"on":false}' -H "Content-Type: application/json"

J’ai donc mon lot de commande nécessaire pour mon cas d’usage. Il ne me reste plus qu’as les traduire dans Node-RED.

Tests sous Node-RED

Méthode GET

C’est le nœud http request qui va être utilisé pour faire le travail.

Étant dans une phase de test, j’adjoins un inject qui a pour seul intérêt de pouvoir lancer la requête HTTP lorsque je clique sur son bouton.
Le switch me permet de filtrer la value (ici un booléen) de la key “on” afin de faire poursuivre mon flow en fonction de sa valeur de retour.
Les debug me permettent de m’assurer de la bonne finalité de mon flow.

Voici donc un illustration de cette configuration :

/2022/07-18-nodered-json-api/img/Screenshot_1.webp
Méthode GET : Configuration

Le résultat se retrouve alors dans la section debug à droite :

/2022/07-18-nodered-json-api/img/Screenshot_2.webp
Méthode GET : Résultat

Comme ma bande LED est éteinte, c’est bien le debug OFF ? qui a reçu des informations.

Méthode POST

Pour envoyer des données, on utilise le nœud function. Il faut donc créer autant de fonctions que de message (s’ils sont distincts).

Voici donc une illustration de mon flow qui allume ou éteint ma bande LED :

/2022/07-18-nodered-json-api/img/Screenshot_3.webp
Méthode POST : Configuration

Etant donné que le endpoint HTTP est le même, j’envoie les données (donc différentes) sur le même http request.

Conclusion

En enlevant les nœuds inject et debug, j’ai des ensembles fonctionnels me permettant d’effectuer des actions sur l’API en JSON de WLED.

De par cet apprentissage, je ne dépends plus d’Home Assistant pour le pilotage de mes bandes LEDs.
De plus, je peux maintenant plus simplement appréhender l’utilisation d’autres APIs. 😏