Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
stockage eeprom
#1
Bonjour, j'ai la 1ere donnée du stockage eeprom annuel qui est aberrante (10000000) est il possible de la supprimer en gardant les autres?
merci d'avance et bonne journée.
Répondre
#2
J'ai la même chose sur l'un de mes ESP. Est-ce un bug du code, ou une faiblesse de l'ESP ? je ne sais pas.
Mais j'ai eu le cas sur plusieurs ESP.

A part faire un bout de code (au reset ?) qui vient lire les data en EEPROM, et les "nettoie" en filtrant les quelques données aberrantes (par exemple en les remplaçant par la moyenne des deux valeurs qui l'entourent), ou faire un reset complet en changeant la clé, mais dans ce cas on perd l'historique, je ne vois pas.

On peut s'inspirer du module stockage pour écrire ce code. ça ne doit pas être trop compliqué. Quand j'ai le temps, je me penche dessus.

Bon, j'ai instrumenté le code stockage pour comprendre pourquoi les données sont "vérolées".
Dans mon cas, j'ai un serveur Linky, et un serveur UxIx3.
Mon serveur UxIx3 est mon serveur "principal" pour les données de consommation. Par contre, avec tous les plantages depuis la 9.03 et jusqu'à la V11.19 compilée avec la version beta de la bibliothèque cartes qui fonctionne merveilleusement bien, j'ai passé mon ESP Chauffe-eau enfants de UxIx3 à Linky.
SAUF QUE, si je le laisse la nuit sur serveur Linky, alors la donnée de conso enregistrée en EEPROM est celle du Linky, et pas celle du serveur UxIx3 qui n'a pas la même origine/historique.
Du coup, puisque c'est la valeur totale qui est enregistrée chaque jour, et pas la valeur du jour, dans l'historique, alors les calculs effectués pour retrouver la valeur consommée chaque jour deviennent FAUX.

Peut-être aurait-il fallu stocker les conso jour, et pas la conso totale dans l'EEPROM. ainsi, l'intégrité de l'historique aurait été conservée même lorsqu"on bascule d'un serveur à l'autre.
Pas de chance.

Je vais juste corriger ces valeurs "à la main" avec un bout de code pour que tout rentre dans l'ordre chez moi, et je ferai attention à l'avenir de bien revenir à la configuration UxIx3 pour tous mes clients avant d'aller me coucher quand je bidouille.
V12.0 modifiée récurrence d'interrogation serveurs, RTE, et code UxIx3. 1 serveur RMS UxIx3, 1 client Triac CE + 1 client SSR CE.  1 client SSR sur CE tri sur 1 serveur Linky réf. CACSI. Variateurs de fréquence sur Piscine et Spa.
6 panneaux (2 SO 2 S, 2 SE ) 425Wc produisent 13kWh de jour actuellement. 
Répondre
#3
voilà ce que j'ai fait pour corriger les "valeurs erronées".

1/ instrumenter le code pour afficher dans la page web "données brutes" les données stockées qui posent problème.
2/ définir une logique de correction
3/ implémenter la correction des données en EEPROM, chez moi en stockant simplement la valeur de la veille + 15000W dans la valeur erronée.

la fonction a modifier dans stockage.ino pour faire apparaitre les données "erronées" ( chez moi > 50000 ou <-50000 ),
puis, une fois sûr de mon coup, en écrivant le correctif dans l'EEPROM.

String HistoriqueEnergie1An(void) {
String S = "";
int Adr_SoutInjec = 0;
long EnergieJour = 0;
long DeltaEnergieJour = 0;
int iS = 0;
long lastDay = 0;
int index=0;

for (int i = 0; i < NbJour; i++) {
iS = (idxPromDuJour + i + 1) % NbJour;
Adr_SoutInjec = adr_HistoAn + iS * 4;
EnergieJour = EEPROM.readLong(Adr_SoutInjec);
// if (EnergieJour<0) EnergieJour = 0;
if (lastDay == 0) { lastDay = EnergieJour; }
DeltaEnergieJour = EnergieJour - lastDay;


// ici, on affiche les problèmes détectés dans la page "données brutes". Bien analyser et comprendre avant de définir la logique de correction
if ( (DeltaEnergieJour<0) )
{
StockMessage(" erreur stockage E_Jour, lastDay, Delta : " + String(i) + "," + String(index++) + "," +
String(EnergieJour) + "," + String(lastDay) );

EnergieJour = lastDay + 15000; // mise à jour du compteur stocké erroné. C'est chez moi "Energie jour" qui est "faussée".
EEPROM.writeLong(Adr_SoutInjec, EnergieJour); // et on remplace la valeur en EEPROM
EnergieJour = EEPROM.readLong (Adr_SoutInjec); // puis on relit pour vérifier. On ne sait jamais. Mieux vaut être sûr.
DeltaEnergieJour = EnergieJour - lastDay; // on recalcule DeltaEnergieJour qui doit maintenant valoir 15000 (valeur moyenne chez moi)

StockMessage(" Correction : E_Jour, lastDay, Delta : " + String(i) + "," + String(index) + "," +
String(EnergieJour) + "," + String(lastDay) );
}

lastDay = EnergieJour;
S += String(DeltaEnergieJour) + ",";
}
return S;
}

et voilà , les erreurs détectées, l'affichage avant la correction, et après. Tout rentre dans l'ordre.

   
   
   
V12.0 modifiée récurrence d'interrogation serveurs, RTE, et code UxIx3. 1 serveur RMS UxIx3, 1 client Triac CE + 1 client SSR CE.  1 client SSR sur CE tri sur 1 serveur Linky réf. CACSI. Variateurs de fréquence sur Piscine et Spa.
6 panneaux (2 SO 2 S, 2 SE ) 425Wc produisent 13kWh de jour actuellement. 
Répondre
#4
Oui, c'est un problème dont je n'ai toujours pas compris l'origine. J'ai cela sur1 de mes 4 ESP qui tournent H24.
Répondre
#5
Chez moi, j'ai identifié la source du problème André. C'est le basculement entre deux sources de puissances.

Car tu stockes la conso totale, et non pas la conso du jour. Comme la conso totale change d'une source de mesure de puissance à une autre, alors on stocke des données incohérentes.
Et quand tu recalcules les conso jours, en soustrayant à la conso totale jusqu'à ce jour, la conso totale jusqu'à la veille, tu te retrouves avec n'importe quoi si entre temps la source a été changée (par ex chez toi entre UxIx2 et Linky ( et chez moi entre Linky et UxIx3 ).

Il aurait mieux valu je pense stocker vraiment la conso DU jour sur 365 jours. Ainsi, plus de risque d'erreur en cas de changement de source.
V12.0 modifiée récurrence d'interrogation serveurs, RTE, et code UxIx3. 1 serveur RMS UxIx3, 1 client Triac CE + 1 client SSR CE.  1 client SSR sur CE tri sur 1 serveur Linky réf. CACSI. Variateurs de fréquence sur Piscine et Spa.
6 panneaux (2 SO 2 S, 2 SE ) 425Wc produisent 13kWh de jour actuellement. 
Répondre
#6
Je vais regarder.
Merci Philippe
Répondre
#7
(06-09-2024, 11:26 AM)PhDV61 a écrit : Bonjour et merci du tuyau!.
Faut il faire un EEPRIOM.commit  pour stocker en dur dans l'EEPROM?
sinon les valeurs ne sont pas réellement stockées dans l'EEPROM, si on relit , les valeurs ne sont pas modifiées, on ne modifie que l'affichage!!
Bonne journée.



voilà ce que j'ai fait pour corriger les "valeurs erronées".

1/ instrumenter le code pour afficher dans la page web "données brutes" les données stockées qui posent problème.
2/ définir une logique de correction
3/ implémenter la correction des données en EEPROM, chez moi en stockant simplement la valeur de la veille + 15000W dans la valeur erronée.

la fonction a modifier dans stockage.ino pour faire apparaitre les données "erronées" ( chez moi > 50000 ou <-50000 ),
puis, une fois sûr de mon coup, en écrivant le correctif dans l'EEPROM.

String HistoriqueEnergie1An(void) {
  String S = "";
  int Adr_SoutInjec = 0;
  long EnergieJour = 0;
  long DeltaEnergieJour = 0;
  int iS = 0;
  long lastDay = 0;
  int index=0;

  for (int i = 0; i < NbJour; i++) {
    iS = (idxPromDuJour + i + 1) % NbJour;
    Adr_SoutInjec = adr_HistoAn + iS * 4;
    EnergieJour = EEPROM.readLong(Adr_SoutInjec);
    // if (EnergieJour<0) EnergieJour = 0;
    if (lastDay == 0) { lastDay = EnergieJour; }
    DeltaEnergieJour = EnergieJour - lastDay;


    // ici, on affiche les problèmes détectés dans la page "données brutes". Bien analyser et comprendre avant de définir la logique de correction
    if ( (DeltaEnergieJour<0) )
      {
        StockMessage(" erreur stockage  E_Jour, lastDay, Delta : " +  String(i) + "," + String(index++) + "," +
            String(EnergieJour) + "," + String(lastDay) );

      EnergieJour = lastDay + 15000;                // mise à jour du compteur stocké erroné. C'est chez moi "Energie jour" qui est "faussée".
      EEPROM.writeLong(Adr_SoutInjec, EnergieJour);  // et on remplace la valeur en EEPROM
      EnergieJour = EEPROM.readLong (Adr_SoutInjec); // puis on relit pour vérifier. On ne sait jamais. Mieux vaut être sûr.
      DeltaEnergieJour = EnergieJour - lastDay;      // on recalcule DeltaEnergieJour qui doit maintenant valoir 15000 (valeur moyenne chez moi)

      StockMessage(" Correction : E_Jour, lastDay, Delta : " +  String(i) + "," + String(index) + "," +
                String(EnergieJour) + "," + String(lastDay) );
    }

    lastDay = EnergieJour;
    S += String(DeltaEnergieJour) + ",";
  }
  return S;
}

et voilà , les erreurs détectées, l'affichage avant la correction, et après. Tout rentre dans l'ordre.
Répondre
#8
Appuyez sur le bouton RAZ de la V12 et tout sera enlevé.

André
Répondre
#9
Merci André mais je voudrais conserver l'historique, de plus je suis en version 11, comme j'ai ajouté de l'affichage, je ne change pas de version trop souvent.
J'ai fait la modif ci dessus, rectifié les valeurs de l'EEPROM, mais elle ne sont pas gardées a la relecture!!!
je dois laisser la rectification en permanence pour avoir un affichage correct.
Je n'ai pas trop trouvé de doc sur la fonction "commit"! ca fait quoi? écriture en dur?
bonne journée
Répondre
#10
Il faut terminer toute sequence d'ecriture par commit. C'est la que cela devient effectif.
Cdlt
Répondre


Atteindre :


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