F1ATB forum
Controle plus poussé des actions via 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 : Controle plus poussé des actions via MQTT (/thread-948.html)



Controle plus poussé des actions via MQTT - piamp - 13-01-2025

Bonjour,
parce que j'ai souvent besoin de mettre en route / arrêter des actions (mais sans les forcer sur on ou off) j'ai ajouté ce petit bout de code dans mqtt.ino qui permet d'envoyer en mqtt un ordre pour choisir l'état des actions :

dans la fonction testMQTTconnected :


      //souscription controle action
      char TopicCont[50];
      sprintf(TopicCont,"%s",MQTTdeviceName);
      clientMQTT.subscribe(TopicCont);
      // fin ajout



puis dans la fonction callback :

  //ajout controle actions
  if (String(topic) == MQTTdeviceName) {
    LesActions[int(char(payload[0])) - 48].Actif = int(char(payload[1])) - 48
  }
  //fin ajout controle actions




il suffit ensuite d'envoyer via home assistant ou autre, en mqtt, un message dans le topic correspondant au nom du routeur, de 2 caractères. le premier caractère indique le numéro de l'action à modifier, le second son état (0= éteint, 2=multisinus)

par exemple envoyer "00" sur un routeur à triac éteint l'action triac ; envoyer "02" le mets en mode multi sinus

Smile


RE: Controle plus poussé des actions via MQTT - Chris - 13-01-2025

Bonjour,

Ça, c'est le genre de code qui aurait tout à fait sa place dans les évolutions souhaitées !
Je vote pour :-)


RE: Controle plus poussé des actions via MQTT - Nalexdouze - 13-01-2025

Pas mal ça ;-)


RE: Controle plus poussé des actions via MQTT - Nalexdouze - 16-01-2025

Ta proposition et ton travail m'ont inspiré  Big Grin

J'ai travaillé à partir de ma version 12.06 personnalisée.

J'ai modifié cette partie du callback

Code :
if (subMQTT == 1) {
    for (int i = 0; i < NbActions; i++) {
      sprintf(ActionsTopic, "%s%s/actions/%s", PrefixMQTT, MQTTdeviceName.c_str(), LesActions[i].Titre.c_str());
      // Vérifie si le topic correspond à une action
      if (String(topic) == ActionsTopic) {
      // Lecture et mise à jour de la valeur Actif à partir du mode
      String modeRecu = StringJson("Mode", message);  // Utilisation de StringJson pour extraire "Mode"
      if (modeRecu.length() > 0) {
          int modeActif = -1;  // Valeur par défaut pour détecter une erreur
          if (modeRecu == "Inactif") {
              modeActif = 0;
          } else if (modeRecu == "Decoupe" || modeRecu == "OnOff") {
              modeActif = 1;
          } else if (modeRecu == "Multi") {
              modeActif = 2;
          } else if (modeRecu == "Train") {
              modeActif = 3;
          }

          // Applique le changement si le mode est valide
          if (modeActif >= 0) {
              LesActions[i].Actif = modeActif;
              StockMessage(LesActions[i].Titre + " mis à jour vers le mode : " + modeRecu);
          } else {
              StockMessage("Mode reçu invalide pour l'action " + LesActions[i].Titre);
          }
      }

      // Ignorer les actions inactives
      if (LesActions[i].Actif == 0) {
          StockMessage("Action reçu pour " + LesActions[i].Titre + " ignorée car inactivée.");
          return;
      }

      // Lecture des autres paramètres (Seuil/Vmin, etc.)
      LesActions[i].tOnOff = ValJson("tOnOff", message);  // Durée de marche forcée
      float seuilRecu = ValJson("Seuil", message);
      int periodeRecu = ValJson("Periode", message);
      if (!isnan(seuilRecu)) {
          LesActions[i].Vmin[periodeRecu] = seuilRecu;  // Mise à jour de Vmin pour la période donnée
      }

      LesActions[i].Prioritaire();  // Applique les modifications immédiatement
      }
    }
  }


Ainsi en envoyant un message JSON 

{
  "tOnOff":0,              // en minutes, déja existant
  "Mode": "Decoupe",  // Inactif || Decoupe/OnOff || Multi || Train
  "Seuil": 600,             // Seuil Pw de l'action 
  "Periode": 0              // Période de l'action à modifier de 0 à X
}

dans le sujet : PrefixMQTT / MQTTdeviceName / actions / nom_de_Actions

Le message peut ne contenir d'une seule valeur. Si aucune période n'est précisée ça sera la 0 qui sera modifiée.

Je souhaitais faire ces actions car étant en Offre EDF Zen Week-End - Option Flex, une sorte de Tempo, les jours "rouges" je désactive manuellement ma période 1 (de 20h30 à 0h) pour ne pas chauffer l'eau à un tarif trop élevé. Ainsi je peux scénariser le Seuil Pw à 5800 le jours "Eco" et à 0 les jours de "Sobriété" pour neutraliser la chauffe du soir.

Reste a voir s'il est pertinent de garder en StockMessage les actions reçu...

Si d'autres téméraires sont intéressé et veulent tester ce bout de code  Wink


RE: Controle plus poussé des actions via MQTT - F1ATB - 16-01-2025

J'ai déplacé les messages dans le sous forum évolution pour m'en souvenir lors d'une prochaine version.

André


RE: Controle plus poussé des actions via MQTT - James - 21-02-2025

Excellent ! J'attends impatiemment cette modification qui me serait très utile ... ?Merci Piamp, Alexdouze, André ?


RE: Controle plus poussé des actions via MQTT - F1ATB - 21-02-2025

A la lecture du code que je n'ai pas encore eu le temps de tester, je tique sur une instruction

int periodeRecu = ValJson("Periode", message);

ValJson renvoie normalement un float et on déclare la variable comme un entier. Le compilo accepte?

André


RE: Controle plus poussé des actions via MQTT - Nalexdouze - 24-02-2025

La compilation passe en tout cas Wink

Dans l'absolu seuilRecu est aussi un entier, du moins c'est des entiers que j'envoie dans mon json Tongue

Je n'ai précisé mais le message peut-être :
{
  "tOnOff":0,              // pour une marche forcée, rien ne change
}

ou

{
  "Mode": "Decoupe",  // change le mode    
}

ou

{
  "Seuil": 5800,            // Définit le seuil de la période 2 à 5800W
  "Periode": 2  
}


RE: Controle plus poussé des actions via MQTT - Lo13 - 02-03-2025

Salut,

Ca à l'air génial comme méthode de controle surtout avec Home Assistant et ses Automations.

A partir de quelle ligne doit on modifié dans le fichier MQTT.ino ? 67 ou 130 ?

En tout cas bon boulot !

J'espere que ca sera dans une prochaine version  Wink


(16-01-2025, 04:43 PM)Nalexdouze a écrit : Ta proposition et ton travail m'ont inspiré  Big Grin

J'ai travaillé à partir de ma version 12.06 personnalisée.

J'ai modifié cette partie du callback

Code :
if (subMQTT == 1) {
    for (int i = 0; i < NbActions; i++) {
      sprintf(ActionsTopic, "%s%s/actions/%s", PrefixMQTT, MQTTdeviceName.c_str(), LesActions[i].Titre.c_str());
      // Vérifie si le topic correspond à une action
      if (String(topic) == ActionsTopic) {
      // Lecture et mise à jour de la valeur Actif à partir du mode
      String modeRecu = StringJson("Mode", message);  // Utilisation de StringJson pour extraire "Mode"
      if (modeRecu.length() > 0) {
          int modeActif = -1;  // Valeur par défaut pour détecter une erreur
          if (modeRecu == "Inactif") {
              modeActif = 0;
          } else if (modeRecu == "Decoupe" || modeRecu == "OnOff") {
              modeActif = 1;
          } else if (modeRecu == "Multi") {
              modeActif = 2;
          } else if (modeRecu == "Train") {
              modeActif = 3;
          }

          // Applique le changement si le mode est valide
          if (modeActif >= 0) {
              LesActions[i].Actif = modeActif;
              StockMessage(LesActions[i].Titre + " mis à jour vers le mode : " + modeRecu);
          } else {
              StockMessage("Mode reçu invalide pour l'action " + LesActions[i].Titre);
          }
      }

      // Ignorer les actions inactives
      if (LesActions[i].Actif == 0) {
          StockMessage("Action reçu pour " + LesActions[i].Titre + " ignorée car inactivée.");
          return;
      }

      // Lecture des autres paramètres (Seuil/Vmin, etc.)
      LesActions[i].tOnOff = ValJson("tOnOff", message);  // Durée de marche forcée
      float seuilRecu = ValJson("Seuil", message);
      int periodeRecu = ValJson("Periode", message);
      if (!isnan(seuilRecu)) {
          LesActions[i].Vmin[periodeRecu] = seuilRecu;  // Mise à jour de Vmin pour la période donnée
      }

      LesActions[i].Prioritaire();  // Applique les modifications immédiatement
      }
    }
  }


Ainsi en envoyant un message JSON 

{
  "tOnOff":0,              // en minutes, déja existant
  "Mode": "Decoupe",  // Inactif || Decoupe/OnOff || Multi || Train
  "Seuil": 600,             // Seuil Pw de l'action 
  "Periode": 0              // Période de l'action à modifier de 0 à X
}

dans le sujet : PrefixMQTT / MQTTdeviceName / actions / nom_de_Actions

Le message peut ne contenir d'une seule valeur. Si aucune période n'est précisée ça sera la 0 qui sera modifiée.

Je souhaitais faire ces actions car étant en Offre EDF Zen Week-End - Option Flex, une sorte de Tempo, les jours "rouges" je désactive manuellement ma période 1 (de 20h30 à 0h) pour ne pas chauffer l'eau à un tarif trop élevé. Ainsi je peux scénariser le Seuil Pw à 5800 le jours "Eco" et à 0 les jours de "Sobriété" pour neutraliser la chauffe du soir.

Reste a voir s'il est pertinent de garder en StockMessage les actions reçu...

Si d'autres téméraires sont intéressé et veulent tester ce bout de code  Wink