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


Messages dans ce sujet
RE: Controle plus poussé des actions via MQTT - par Nalexdouze - 16-01-2025, 04:43 PM

Atteindre :


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