Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Etat GPIO vers MQTT
#1
Sad 
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
Sud 3 KWc 8 X 405Wc RECOM et 2 Hoymiles HM1500 
Ouest 1,6 KWc 4 X 425Wc TRINA SOLAR et 2 Hoymiles HM800
4 routeurs (ballon, chauffage atelier, radiateur chambre, SPA)
Répondre
#2
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/integratio...vice-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
Enphase -> Node-RED -> Source MQTT
3x IQ7+/3x 375WhC + 4x IQ8MC/4x 400WhC
1x Routeur 12.06_Custom -> CES 2,5kW
Domotique gérée sous Jeedom 4.4.19 (DIY VMM Synology)
Répondre
#3
(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/integratio...vice-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
Sud 3 KWc 8 X 405Wc RECOM et 2 Hoymiles HM1500 
Ouest 1,6 KWc 4 X 425Wc TRINA SOLAR et 2 Hoymiles HM800
4 routeurs (ballon, chauffage atelier, radiateur chambre, SPA)
Répondre
#4
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);
Répondre
#5
(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
Sud 3 KWc 8 X 405Wc RECOM et 2 Hoymiles HM1500 
Ouest 1,6 KWc 4 X 425Wc TRINA SOLAR et 2 Hoymiles HM800
4 routeurs (ballon, chauffage atelier, radiateur chambre, SPA)
Répondre
#6
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";
Enphase -> Node-RED -> Source MQTT
3x IQ7+/3x 375WhC + 4x IQ8MC/4x 400WhC
1x Routeur 12.06_Custom -> CES 2,5kW
Domotique gérée sous Jeedom 4.4.19 (DIY VMM Synology)
Répondre
#7
(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 ?
Sud 3 KWc 8 X 405Wc RECOM et 2 Hoymiles HM1500 
Ouest 1,6 KWc 4 X 425Wc TRINA SOLAR et 2 Hoymiles HM800
4 routeurs (ballon, chauffage atelier, radiateur chambre, SPA)
Répondre
#8
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
Sud 3 KWc 8 X 405Wc RECOM et 2 Hoymiles HM1500 
Ouest 1,6 KWc 4 X 425Wc TRINA SOLAR et 2 Hoymiles HM800
4 routeurs (ballon, chauffage atelier, radiateur chambre, SPA)
Répondre
#9
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);
...
}
Répondre
#10
Bonjour, ca y est ca fontionne !!

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

Merci beaucoup
Sud 3 KWc 8 X 405Wc RECOM et 2 Hoymiles HM1500 
Ouest 1,6 KWc 4 X 425Wc TRINA SOLAR et 2 Hoymiles HM800
4 routeurs (ballon, chauffage atelier, radiateur chambre, SPA)
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 3 visiteur(s)