Note de ce sujet :
  • Moyenne : 5 (1 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Controle plus poussé des actions via MQTT
#1
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
Répondre
#2
Bonjour,

Ça, c'est le genre de code qui aurait tout à fait sa place dans les évolutions souhaitées !
Je vote pour :-)
Répondre
#3
Pas mal ça ;-)
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
#4
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
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
#5
J'ai déplacé les messages dans le sous forum évolution pour m'en souvenir lors d'une prochaine version.

André
Répondre


Atteindre :


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