Convertir décimal en plusieurs valeurs binaires

Mon problème

Convertir une valeur décimale en 8 binary-sensor

Ma configuration


En déplacement et n’ayant pas accès à ma configuration, je ne peux être exhaustif ici.
HAOS 7.6
Supervisor 2022.05.2
Core 2022.5.4
Sur machine virtuelle Hyper-V


Bonjour,
Je dispose d’une interface d’entrées/sorties sur réseau Ethernet. Le pilotage ou l’interrogation se fait à l’aide de trame simples à envoyer via Node-Red via TCPout ou TCPrequest.

Le problème vient de la réponse retournée par l’interface pour lire l’état des entrées. Je reçois une trame que j’arriver à traiter afin de n’avoir que l’état des entrées, mais il s’agit d’une chaine de caractères représentant l’octet sous forme décimale. Et en plus, l’état des entrées est inversé (à 1 lorsque l’entrée n’est pas activée).

En gros,

Si je reçois 255, cela correspond à un octet 1111 1111 qui correspond à aucune entrée activée …
Si je reçois 254, cela correspond à un octet 1111 1110 qui indique que l’entrée 1 (bit de poids faible à droite) est active
Si je reçois 191, cela correspond à un octet 1011 1110 qui indique que les entrées 1 et 7 sont actives
Etc …

Grace à red-contrib-string-binary-parser, je peux convertir les valeurs décimale en valeurs binaires (msg.payload passe de ‹ 255 › à ‹ 1111 1111 ›).
Ce que je voudrais réaliser, c’est que chaque bit soit affecté à un binary-sensor de home assistant.

Étant complètement novice en Node-red, je sèche, et donc je fais appel à la communauté pour me filer un petit coup de pouce, si possible …

Merci d’avance et n’hésitez pas à me poser des questions si je n’ai pas été assez clair.

A+

Pas sûr d’avoir tout compris…
Mais, le couteau suisse souvent évoqué sur le forum NodeRed pour « bricoler » un buffer et l’éclater en diverses valeurs est node-red-contrib-buffer-parser (node) - Node-RED
En sortie de ce noeud, il « suffit » d’appeler le service qui va bien pour créer/modifier les binary_sensor que tu veux.
Ce noeud Buffer Parser est développé par Steve Mcl, également auteur de cron+ qui est très actif et très pédagogue sur le forum nodered.

Bonjour
ton probleme est assez simple à résoudre il me semble; bien qu’il faudrait nous en montrer davantage.
Je vais t’expliquer au travers d’un exemple;
si par exemple, tu veux récuperer le 4eme bit de ton octet, cela signifie que dans ton octet ce bit a un poids de 2 puissance 3 (8 en décimal)
il suffit donc de multiplier (fontion AND bit à bit) ton octet par 8 pour isoler ton entrée
si résultat = 0 alors ton entree est à 1 et si résultat=1 alors ton entrée est a zero

exemple de multiplication bit par bit :
octet = 1011 1011
AND = 0000 1000
resultat = 0000 1000

fais cela 8 fois pour chacun des 8 bits

dans NodeRed ca devrait s’ecrire environ comme ca :

res0 = octet && 1
res1 = octet && 2
res3 = octet && 4
res4= octet && 8
res5= octet && 16
etc…

Bonjour,

Merci pour les premières réponses.

Je vais essayer d’être plus explicite alors :smile:

Je reçois un msg.payload = octet en décimal (valeur de 0 à 255).
Chaque bit de cet octet correspond à l’état d’une entrée : 0 = entrée activée, 1 = entrées non activée.

Je cherche à faire un truc comme ça :

Est-ce que c’est plus clair ?

Par contre Jippy, je suis désolé, mais je suis complètement ignare dans le fonctionnement de Node Red :pensive:. J’ai bien compris ta proposition de faire un masque, mais je ne sais pas comment le programmer …

@Ramirez22 , je ne suis pas un expert de NodeRed non plus, mais ta solution semble pas mal ; qu’est ce qui ne fonctionne pas ?
Moi ce que je te proposais , c’est de remplacer, ta box « Octet binaire>8bit » par une fonction, qui faisait la meme chose.

Bien vu !

J’ai réussi à faire cela avec une fonction :

Avec le code suivant (pour la sortie 1)

if (msg.payload && 1 === 0){
    msg.payload="1-On";
    return msg;
}
    msg.payload="1-Off";
    return msg;

Il ne me reste plus qu’à adapter le msg.payload pour piloter les entités correspondantes !

Sinon, y a t’il un moyen de simplifier (avec une fonction à plusieurs sorties par exemple) ?
[edit] Ah, j’ai trouvé, dans l’onglet setup. Reste à voir comment faire ça, mais ça devrait aller. Merci encore

Merci pour l’aide en tout cas

Bonjour
voila c’est ca; c’est bien !
oui tu peux tout faire dans la meme fonction et avec une sortie comme ca :
return [ msg1, msg2, msg3, msg4, msg5, msg6, msg7, msg8];