Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Proposition code uxix3
#1
Bonjour,
Voici une proposition de code pour source_uxix3 apportant 2 améliorations :
- le calculs sont fait en binaire ce qui soulage le processeur
- les données de consommation et injection journalières en W, fidèles à ce que le linky comptabilise, sont remontées en MQTT (très pratique si l'on souhaite suivre dans home assistant sa conso). On pourrait faire mieux car les données totales sont effacées chaque jour, mais de toute façon le total sera agrégé côté home assistant !

il resterait à implémenter (andré?) la possibilité de configurer la vitesse de dialogue du JSY (2 vitesses sont possibles sur le 333: 9600bps ou 9600x2bps)

si andré peut utiliser ce code dans une prochaine version Smile

Code :
// *************************************************
// * Client lecture JSY-MK-333 * Triphasé *
// * Développement initial de Pierre F (Mars 2024) *
// * update PhDV61 Juin 2024 et Août 2024*
// *************************************************


void Setup_JSY333() {
  MySerial.setRxBufferSize(SER_BUF_SIZE);
  MySerial.begin(9600*2, SERIAL_8N1, RXD2, TXD2);  //PORT DE CONNEXION AVEC LE CAPTEUR JSY-MK-333
}

void Requete_JSY333() {
  int i;
  byte msg_send[] = { 0x01, 0x03, 0x01, 0x00, 0x00, 0x44, 0x44, 0x05 };
  for (i = 0; i < 8; i++) {
    MySerial.write(msg_send[i]);
  }
}

void Lecture_JSY333() {
  float Tension_M1, Tension_M2, Tension_M3;
  float Intensite_M1, Intensite_M2, Intensite_M3;
  float PVA_M_inst1, PVA_M_inst2, PVA_M_inst3;
  float PW_inst1, PW_inst2, PW_inst3;

  byte Lecture333[200];
  bool injection;
  bool sens1, sens2, sens3;
  long delta_temps = 0;

  Requete_JSY333();

  int a = 0;
  while (MySerial.available()) {
    Lecture333[a] = MySerial.read();
    a++;
  }

  if (a == 141) {                                               //message complet reçu
    delta_temps = (unsigned long)(millis() - Temps_precedent);  // temps écoulé depuis le dernier appel
    Temps_precedent = millis();                                 // on conserve la valeur du temps actuel pour le calcul précédent

    Tension_M1 = ((Lecture333[3] << 8) + Lecture333[4]) / 100;
    Tension_M2 = ((Lecture333[5] << 8) + Lecture333[6]) / 100;
    Tension_M3 = ((Lecture333[7] << 8) + Lecture333[8]) / 100;

    Intensite_M1 = float(((Lecture333[9] << 8) + Lecture333[10])) / 100;
    Intensite_M2 = float(((Lecture333[11] << 8) + Lecture333[12])) / 100;
    Intensite_M3 = float(((Lecture333[13] << 8) + Lecture333[14])) / 100;

    sens1 = (Lecture333[104]) & 0x01;
    sens2 = (Lecture333[104] >> 1) & 0x01;
    sens3 = (Lecture333[104] >> 2) & 0x01;

    if (sens1) { Intensite_M1 *= -1; }
    if (sens2) { Intensite_M2 *= -1; }
    if (sens3) { Intensite_M3 *= -1; }

    injection = (Lecture333[104] >> 3) & 0x01;  // si true, injection

    // Lecture des Puissances actives de chacune des phases
    PW_inst1 = float((Lecture333[15] << 8) + Lecture333[16]);
    PW_inst2 = float((Lecture333[17] << 8) + Lecture333[18]);
    PW_inst3 = float((Lecture333[19] << 8) + Lecture333[20]);

    //Lecture des puissances apparentes de chacune des phases, qu'on signe comme le Linky
    PVA_M_inst1 = float((Lecture333[35] << 8) + Lecture333[36]);
    if (sens1) { PVA_M_inst1 = -PVA_M_inst1; }
    PVA_M_inst2 = float((Lecture333[37] << 8) + Lecture333[38]);
    if (sens2) { PVA_M_inst2 = -PVA_M_inst2; }
    PVA_M_inst3 = float((Lecture333[39] << 8) + Lecture333[40]);
    if (sens3) { PVA_M_inst3 = -PVA_M_inst3; }

    if (injection) {
      PuissanceS_M_inst = 0;
      PuissanceI_M_inst = float((Lecture333[21] << 24) +  (Lecture333[22] << 16) + (Lecture333[23] << 8)  + Lecture333[24]);
      PVAS_M_inst = 0;
      PVAI_M_inst = abs(PVA_M_inst1 + PVA_M_inst2 + PVA_M_inst3);  // car la somme des puissances apparentes "signées" est négative puisqu'en "injection" au global

      // PhDV61 : on considère que cette puissance active "globale" a duré "delta_temps", et on l'intègre donc pour obtenir une énergie en Wh
      Energie_jour_Injectee += ((float)delta_temps / 1000.0) * (PuissanceI_M_inst / 3600.0);
      Energie_M_Injectee = Energie_jour_Injectee;

    } else {  // soutirage
      PuissanceI_M_inst = 0;
      PuissanceS_M_inst = float((Lecture333[21] << 24) +  (Lecture333[22] << 16) + (Lecture333[23] << 8)  + Lecture333[24]);
      PVAS_M_inst = PVA_M_inst1 + PVA_M_inst2 + PVA_M_inst3;

      // PhDV61 : on considère que cette puissance active "globale" a duré "delta_temps", et on l'intègre donc pour obtenir pour obtenir une énergie en Wh
      Energie_jour_Soutiree += ((float)delta_temps / 1000.0) * (PuissanceS_M_inst / 3600.0);
      Energie_M_Soutiree = Energie_jour_Soutiree;
    }
   
    MK333_dataBrute = "";
    MK333_dataBrute = "<strong>Triphasé</strong>";

    if (Intensite_M1 < 0)
      MK333_dataBrute += "<br>Phase1 : " + String(Tension_M1) + "V x " + String(Intensite_M1) + "A = " + String(int(PVA_M_inst1)) + "VA</br>";
    else
      MK333_dataBrute += "<br>Phase1 : " + String(Tension_M1) + "V x +" + String(Intensite_M1) + "A = +" + String(int(PVA_M_inst1)) + "VA</br>";

    if (Intensite_M2 < 0)
      MK333_dataBrute += "<br>Phase2 : " + String(Tension_M2) + "V x " + String(Intensite_M2) + "A = " + String(int(PVA_M_inst2)) + "VA</br>";
    else
      MK333_dataBrute += "<br>Phase2 : " + String(Tension_M2) + "V x +" + String(Intensite_M2) + "A = +" + String(int(PVA_M_inst2)) + "VA</br>";

    if (Intensite_M3 < 0)
      MK333_dataBrute += "<br>Phase3 : " + String(Tension_M3) + "V x " + String(Intensite_M3) + "A = " + String(int(PVA_M_inst3)) + "VA</br>";
    else
      MK333_dataBrute += "<br>Phase3 : " + String(Tension_M3) + "V x +" + String(Intensite_M3) + "A = +" + String(int(PVA_M_inst3)) + "VA</br>";

    if (PuissanceS_M_inst == 0)
      MK333_dataBrute += "<br>Puissance active injectée    : " + String(PuissanceI_M_inst) + "W</br>";
    else
      MK333_dataBrute += "<br>Puissance active soutirée    : " + String(PuissanceS_M_inst) + "W</br>";

    if (PVAS_M_inst == 0)
      MK333_dataBrute += "<br>Puissance apparente injectée : " + String(PVAI_M_inst) + "VA</br>";
    else
      MK333_dataBrute += "<br>Puissance apparente soutirée : " + String(PVAS_M_inst) + "VA</br>";

    if (PVA_M_inst1 != 0)
      MK333_dataBrute += "<br>Facteur de puissance phase 1 : " + String(abs(PW_inst1 / PVA_M_inst1)) + "</br>";
    if (PVA_M_inst2 != 0)
      MK333_dataBrute += "<br>Facteur de puissance phase 2 : " + String(abs(PW_inst2 / PVA_M_inst2)) + "</br>";
    if (PVA_M_inst3 != 0)
      MK333_dataBrute += "<br>Facteur de puissance phase 3 : " + String(abs(PW_inst3 / PVA_M_inst3)) + "</br>";

    MK333_dataBrute += "<br>Energie jour nette soutirée (Linky): " + String(Energie_jour_Soutiree) + "Wh</br>";
    MK333_dataBrute += "<br>Energie jour nette injectée (Linky): " + String(Energie_jour_Injectee) + "Wh</br>";

    MK333_dataBrute += "<br>Energie totale soutirée : " + String(Energie_M_Soutiree) + "Wh</br>";
    MK333_dataBrute += "<br>Energie totale injectée : " + String(Energie_M_Injectee) + "Wh</br>";

    Pva_valide = true;
    filtre_puissance();
    PuissanceRecue = true;  //Reset du Watchdog à chaque trame du JSY reçue
    EnergieActiveValide = true;
    if (cptLEDyellow > 30) {
      cptLEDyellow = 4;
    }
  } else {
    StockMessage("Pas tout reçu, pas traité... nombre de données : " + String(a));
  }
}
Répondre
#2
Salut,
Merci pour cette proposition de code, je me posais une question. Si j'ai bien compris, tu viens écraser la valeur de Energie_M_Soutiree et Energie_M_Injectee pour écrire la valeur du jour calculée "Linky". Mais pourquoi tu n'écris pas plutôt dans les variables EnergieJour_M_Soutiree et EnergieJour_M_Injectee ? Y a t-il une raison à cela ?

Je viens d'essayer autre chose de mon côté, uniquement dans le fichier MQTT, j'ai modifié la ligne 299 comme suit (insertion des variables Linky et modification du %d en %.2f sur ces variables) :
Code :
sprintf(value, "{\"PuissanceS_M\": %d, \"PuissanceI_M\": %d, \"Tension_M\": %.1f, \"Intensite_M\": %.1f, \"PowerFactor_M\": %.2f, \"Energie_M_Soutiree\":%d,\"Energie_M_Injectee\":%d, \"EnergieJour_M_Soutiree\":%.2f, \"EnergieJour_M_Injectee\":%.2f", PuissanceS_M, PuissanceI_M, Tension_M, Intensite_M, PowerFactor_M, Energie_M_Soutiree, Energie_M_Injectee, Energie_jour_Soutiree, Energie_jour_Injectee);

Je n'ai pas encore bien l'habitude du code d'André, j'ai commencé à le regarder hier. À priori ça a l'air de remonter les bonnes données, mais je l'ai envoyé sur l'ESP il n'y a que quelques minutes.
Répondre
#3
Je ne sais plus trop pourquoi j'ai fait comme ça, mais c'était la façon la plus simple pour que cela fonctionne Smile
Répondre


Atteindre :


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