F1ATB forum
Etat GPIO vers MQTT - Version imprimable

+- F1ATB forum (https://f1atb.fr/forum_f1atb)
+-- Forum : Forum de F1ATB (https://f1atb.fr/forum_f1atb/forum-3.html)
+--- Forum : Routeur Photovoltaïque (https://f1atb.fr/forum_f1atb/forum-4.html)
+---- Forum : Evolutions faites, à faire, dont vous rêvez... (https://f1atb.fr/forum_f1atb/forum-10.html)
+---- Sujet : Etat GPIO vers MQTT (/thread-345.html)



Etat GPIO vers MQTT - Crazybike63 - 21-08-2024

Bonjour tout le monde, j'ai besoin d'un coup de main pour modifier le code de l'ESP. 

J'ai fabriqué un routeur pour modifier un spa (suppression de l'electronique d'origine par le routeur sur lequel j'ai apporté quelques modifications, deux sondes de temperature, un ventilo piloté pour le radiateur des triacs, un ecran, etc.... )

J'ai besoin de lire l'etat logique d'un GPIO de mon esp, (celui ci est deja choisi, pas besoin d'un code pour choisir parmi plusieurs), et d'envoyé via MQTT son état a HomeAssistant. Il s'agit d'une alarme quand le filtre se colmate. 

J'ai quelques connaissances en arduino et je sais lire l'état avec un digitalRead mais apres je ne sais pas modifier le "MQTT.ino" de F1ATB, je crois qu'il faut grater du coté des "void DeviceToDiscover" ou  "void DeviceBin2Discover" mais je n'en suis pas du tout  Sad Sad Confused Huh

Si un âme charitable peut me mettre sur la voie ..... Smile

Merci par avance


RE: Etat GPIO vers MQTT - Nalexdouze - 21-08-2024

Salut,



Alors je dirais qu'il te faut dans

Citation :void sendMQTTDiscoveryMsg_global()

ajouter une ligne avant 

Citation :Serial.println("Paramètres Auto-Discovery publiés !");

du genre 

Citation :DeviceToDiscover("state_GPIO", "", "device_class", "0");

Soit tu trouve une classe correspondant à ton attente sinon laisse le champ device_class vide.
https://www.home-assistant.io/integrations/binary_sensor/#device-class

Puis dans 

Citation :void SendDataToHomeAssistant()

avant 

Citation :sprintf(value, "%s}", value);

ajoutes

Citation :sprintf(value, "%s,\"Etat Filtre\":%d", value, var_digitalRead);

Je peux me tromper mais je pense que tu dois creuser dans ce sens.

Wink


RE: Etat GPIO vers MQTT - Crazybike63 - 22-08-2024

(21-08-2024, 03:28 PM)Nalexdouze a écrit : Salut,



Alors je dirais qu'il te faut dans

Citation :void sendMQTTDiscoveryMsg_global()

ajouter une ligne avant 

Citation :Serial.println("Paramètres Auto-Discovery publiés !");

du genre 

Citation :DeviceToDiscover("state_GPIO", "", "device_class", "0");

Soit tu trouve une classe correspondant à ton attente sinon laisse le champ device_class vide.
https://www.home-assistant.io/integrations/binary_sensor/#device-class

Puis dans 

Citation :void SendDataToHomeAssistant()

avant 

Citation :sprintf(value, "%s}", value);

ajoutes

Citation :sprintf(value, "%s,\"Etat Filtre\":%d", value, var_digitalRead);

Je peux me tromper mais je pense que tu dois creuser dans ce sens.

Wink

Bonjour  Nalexdouze, merci pour ta réponse rapide et très détaillée. J'ai testé mais bien que je n'ai pas d'erreur de compilation cela ne semble pas fonctionner. mosquito et mqtt explorer ne détectent pas le nouveau message (découverte ). Je l'ai fait pour une deuxième sonde de température (radiateur triacs) et cela fonctionne bien ....

Quelle documentation utiliser pour le codage MQTT.ino ? Idea Huh

Je vais continuer à chercher .... Sleepy


RE: Etat GPIO vers MQTT - F1ATB - 22-08-2024

Il faut faire comme pour ActifType:
La découverte
DeviceBin2Discover(ActifType);

et l'envoi
sprintf(value, "%s,\"%s\":%d", value, ActifType.c_str(), 1);
ou
sprintf(value, "%s,\"%s\":%d", value, ActifType.c_str(), 0);


RE: Etat GPIO vers MQTT - Crazybike63 - 22-08-2024

(22-08-2024, 09:31 AM)F1ATB a écrit : Il faut faire comme pour ActifType:
La découverte
DeviceBin2Discover(ActifType);

et l'envoi
sprintf(value, "%s,\"%s\":%d", value, ActifType.c_str(), 1);
ou
sprintf(value, "%s,\"%s\":%d", value, ActifType.c_str(), 0);

Bonjour André et merci pour votre réponse.

Pourriez vous m'expliquer la construction de " sprintf(value, "%s,\"%s\":%d", value, ActifType.c_str(), 1);" 
ou m'indiquer un lien ou je pourrais trouver une explication ?

J'ai trouvé celui ci:  sprintf() avec Arduino | Imprimer plusieurs variables sur le moniteur série (programmingelectronics.com)

Merci pour votre aide


RE: Etat GPIO vers MQTT - Nalexdouze - 22-08-2024

Ton lien est très bien expliqué je trouve  Big Grin

sprintf(value, "%s,\"%s\":%d", value, ActifType.c_str(), 1);

On reprends la variable String(value) du json envoyé et on y ajoute des compléments.

En gros value = value+"ajout";


RE: Etat GPIO vers MQTT - Crazybike63 - 24-08-2024

(22-08-2024, 02:12 PM)Nalexdouze a écrit : Ton lien est très bien expliqué je trouve  Big Grin

sprintf(value, "%s,\"%s\":%d", value, ActifType.c_str(), 1);

On reprends la variable String(value) du json envoyé et on y ajoute des compléments.

En gros value = value+"ajout";

Je suis perdu, je veux juste envoyer "1" ou "0"  Huh 

Si je comprends bien  sprintf permet d'envoyer une "phrase" ou chaine dans lequel on veux mettre des variables différentes, je nage plus je coule  Undecided Undecided 

je n'arrive pas à décortiquer le code d'André, j'imagine que c'est  simple pour vous mais moi  je suis complètement perdu.

ca doit ressembler à quelque chose comme ca :


char etatgpio [1];
sprintf(etatgpio, "%d", digitalRead(14));


je ne comprend pas le " ActifType.c_str(), 1);" ou " ActifType.c_str(), 0);" cela veut dire qu'il est à 1 ou à 0 ?


RE: Etat GPIO vers MQTT - Crazybike63 - 24-08-2024

j'ai créé ca:

etatgpio = digitalRead (14);
DeviceBin2Discover(etatgpio);



Puis pour l'envoi:

 sprintf(value, "%s,\"%s\":%d", value, etatgpio.c_str(), 1);

je teste .... Sad

Et ca marche pas lol


RE: Etat GPIO vers MQTT - F1ATB - 25-08-2024

sendMQTTDiscoveryMsg_global() {
String monGPIO ="gpio14";
.....
...
DeviceBin2Discover(monGPIO);
}


SendDataToHomeAssistant() {
String monGPIO ="gpio14";
.....
...
int etatgpio = digitalRead (14);
sprintf(value, "%s,\"%s\":%d", value, monGPIO.c_str(), etatgpio);
...
}


RE: Etat GPIO vers MQTT - Crazybike63 - 04-09-2024

Bonjour, ca y est ca fontionne !!

Merci à Nalexdouze et F1ATB, grace à vous j'ai pu apprendre et comprendre "sprintf"

Merci beaucoup