Nettoyer rapidement des équipements

Bon, je ne comprends pas.
J’ai carrément restaurer ma VM complète en date de samedi dernier et là encore les données ne remontent pas plus loin qu’une semaine avant.

Rien avant le 23.

Je vais voir en restaurer un backup du 22 ou 23 à tout hasard.
Mais là je vais forcément perdre des données…

Bon apparemment le souci était entre le 22 et le 23.
Le fait de restaurer en date du 22 me permet de voir que j’ai plus de données dans le dashboard.
Sauf que quand je le laisse, j’ai la roue qui tourne sans s’arrêter et je ne peux rien faire :frowning:

Mais déjà je vois des données sur les 4 dernières semaines et 12 derniers mois…

A mon avis, garde ça et avec les autres sauvegardes, on va bien arriver à restaurer les données >= au 22.
Il faudrait regarder dans conso_teleinfo ou tu en es au niveau heure pour le 22.
Si tu veux comme c’est long et compliqué à expliquer, Tu peux peut-être me donner accès à ton Jeedom
pour que je regarde déjà dans quel état c’est. Et j’essaierai de te faire tes restaurations avec adminer. Et on peut en même temps échanger par téléphone si j’ai des questions. Pour essayer de régler le problème rapidement.
Avant toute chose, il faudra refaire un backup avant au cas où.

A toi de voir.

Je t’ai envoyé un MP ce matin, on en reparle :wink:

Bon, voilà ce que j’ai fait :

  • récupération par adminer sur la VM backup de la table teleinfo et teleinfo_save, 150 Mo quand même.
  • ensuite backup côté production
  • ensuite j’ai ouvert mes 2 sql pour identifier les dates de début et de fin et j’ai nettoyé la table sur les données qui se sont ajoutées toutes seules hier et ce matin le temps de récupérer ces backups.
  • un delete coté db sur la production du 29/11/2018 au 22/05/2020 (j’aurai pu affiner mais vu que j’avais le backup…)

delete from conso_teleinfo where ((rec_date between '2018-11-29' and '2020-05-21') or (rec_date = '2020-05-22' and rec_time <= '06:15:22'))

et un import après avoir vérifié l’INSERT dans le fichier SQL par sécurité.

J’ai été voir le dashboard mais il est toujours faux, donc je présume qu’il me faut aussi modifier la table teleinfo_save aussi…
Sauf que les données remontent à 2017 et elles s’arrêtent à 2018.
Du coup, je ne comprends pas trop car là je pense que mon insert a du marcher non ?

Ensuite côté db par exemple pour electricité, j’ai bien fait une synchro au cas où tu poses la question. Les graphes démarrent le 25. Sauf que j’ai bien des données en 24 :

Jusqu’à 23h53.

MAIS si je regarde le 23 ou le 22…

EDIT : Et j’ai compris ! Mon erreur était de travailler sur un fichier non zippé. Le serveur ne récupérait pas le fichier complet. Je viens de faire un tar.gz et je l’ai poussé (de 1 Go passé à 80 Mo), pareil, la page d’adminer charge le fichier à 100% et reste à moitié blanche.

Du coup, j’ai voulu passer par le plugin tant qu’à faire !

Hop, tout content :

****************Import de l\historique *********************
Restauration de  l'historique conso_teleinfo.sql.gz
gunzip < /var/www/html/plugins/conso/core/class/../../ressources/backup/conso_teleinfo.sql.gz | mysql  -hlocalhost -ujeedom --pcXXXX jeedom
Restauration en cours ......
Restauration Terminée
[END CONSO_HISTORIQUE SUCCESS]

Je vais réinjecter tes fichiers du coup !

Par contre, j’ai bien un souci, je n’ai aucune donnée dans la table pv 1545 avant le 22, je ne comprends pas pourquoi ! Pourtant je te les ai bien données je les ai depuis le début de l’installation :frowning:

Bon alors après avoir restauré mon teleinfo, j’ai donc fait le nettoyage pour l’ECS sur cette période et réinjecter ton fichier corrigé puis synchro.

J’ai toujours un souci malgré tes données corrigées en puissance voir graphique du 1/5 au 31/5.

le problème semble être entre le 18 et le 24. pourtant la puissance instantanée semble bonne.

Mais comme l’historique sur les informations d’ECS ne dure pas plus de 7j pour jour/veille, je n’arrive pas à savoir qui est en cause.

Je viens de vérifier sur mon jeedom de backup, mais je n’ai aucune donnée de PV avant le 29/4 ! Je ne pige pas.

J’ai restauré un backup encore plus vieux du 19 pour voir si je n’aurai pas fait une bêtise, mais je n’en ai pas souvenir. Pareil ! Pas de données avant le 28/04 21h … je ne comprends pas. J’ai restauré mon plus vieux backup du 3/5 et j’avais déjà plus de données du PV. Je ne comprends pas du tout … bizarre !

J’ai gardé cette version et j’ai corrigé le PV.

Pour le PV, j’ai une idée. J’ai un autre équipement qui est la vraie conso remontée par l’API et le fournisseur, plus précise que le compteur pulse. Je me demande si je ne pourrais pas copier l’équipement. Il s’agit de l’équipement 1547. Tu penses possible ?

Je n’ai jamais réussi à traiter ces données par suivi conso car c’est un remplissage que je vais chaque jour d’un coup. A investiguer ensuite.

Par contre, j’aimerai que tu m’expliques comment je ne peux pas avoir de données en table consoteleinfo alors que mes stats me remontent bien des informations sur les 2 derniers mois (mars/avril).
On dirait que j’ai paumé les données de puissance/énergie mais pas les données calculées par le plugin mais dans ce cas pourquoi le dashboard reste vide sur PV ???

Ces stats sont des maxbetween sur mois, semaine, jour.

Pourtant c’est vide :

Je ne comprends pas !

Est ce tu réinjectes conso_teleinfo_save dans conso_teleinfo ou dans conso_teleinfo_save?
Sinon si tu n’a plus rien il faudra travailler sur conso_jour qui lui contient tout l’historique pour les graphiques

Non j’ai réinjecté teleinfo dans teleinfo ; pas save.
J’ai remarqué que save était sur des dates bien plus vieilles (certainement la fonction historisation) : 2017/2018. Donc je n’y ai pas touché.

Ok donc du coup il faut travailler sur conso_jour qui lui doit contenir tes données depuis le début.
Les graphiques s’appuient sur elle sauf pour le graphiques des puissances qui d’appuie sur conso_teleinfo.
Quand tu fais une synchro conso_jour est mis à jour à partir de conso_teleinfo.
Moi par exemple j’ai recupéré les historiques de mon EcoDevices que j’ai réinjecté dans conso_jour pour avoir mes infos sur plusieurs année.

Je viens de t’envoyer un MP.

Sinon pour ton PV, tes stats doivent s’appuyer sur les données historiques de Jeedom par du plugin Suivi conso. C’est pour cela que tu as tes stats et pas de graphique dans suivi_conso.

Pour l’ECS le soucis se situe au 22/05/2020. En fait sur le jour les données que tu m’avais fourni vont que jusqu’à 6h15. Et tu as encore dans ta table des données à partir de 23h14 avec des valeurs erronées. D’ou le problème.

Du coup je t’ai supprimés c’est quelques lignes qui mettent le bazar. Et j’ai corrigé la dernière pour avoir une valeur acceptable. Il faudra voir si tu as des données en plus pour compléter cette journée. En attendant une synchro et cela devrait être mieux.

Les données maintenant:

Et pour ton PV, il faut d’abord commencer par regarder s’il n’y a pas quelque chose dans conso_jour sur ton backup

Hello,

Déjà merci pour ton aide.

Pour l’ECS, tout semble bon. Par contre, en regardant le dashboard, je vois un souci pour septembre 2018, bizarre.

Du coup, j’ai compris le principe, il faut corriger la table jour qui sert de référence pour tous les calculs, chose faite.

Il faudrait presque une aide pour tout ça tellement c’est pratique !

et voilà :

Pour le PV, j’ai regardé la table conso jour, nada dedans. Oui, je prends l’historisation du prix veille, semaine, mois pour afficher mes stats. Au final, ça fait le boulot pour mon suivi. Mais pour le suivi global, oui c’est perdu.

Du coup, ma proposition de prendre l’API une fois par jour comme je le fais et la traiter ?

Je te laisse mon accès BDD (confiance à fond !) mais du coup, le souci c’est que je n’ai rien de plus que l’historique Jeedom que je stocke soit 7 jours sur les grandeurs principales de l’API. Il faudrait que je fasse tourner le code sur plusieurs jours dans une boucle et que l’on puisse peupler le plugin par cette méthode en différé, une fois par jour à coup de pas de 5 min.

L’autre manière « sale » est de faire ça toutes les 5 min, mais je m’y refuse car si tout le monde fait ça sur le serveur APS, il va tomber ou on va se faire « détecter ».

Petite question sur l’historisation des informations du plugin.
Du coup, si on corrige des données jour, comment on peut recréer les informations correctes jour, semaine, mois ? Je vois que la synchro ne fait rien. A défaut sur une période que l’on peut sélectionner.
Pour ma part : jour, veille 7 jours ; semaine 1 mois ; mois ; 3 mois.

Du coup, comme l’ECS était foireux côté stats, j’ai vidé l’historisation pour semaine, mois.
Là, j’ai les données dans le dashboard, donc à vrai dire, pas grave.

Et comme tu le dis, mon historisation est toujours là pour le PV, mais plus rien côté dashboard par manque de données.

Je n’avais pas compris, mais quand tu parles historisation, c’est celle des commandes du plugin? Si c’est le cas on peut peut-être reconstitué quelque chose pour ton PV à partir de ça. Ça dépend du lissage.

Sinon effectivement l’historisation des commandes dans Jeedom est complètement indépendante du plugin. La synchro ne met à jour que conso_jour.

Sinon pour l’API, les données se présentent comment? Est ce un fichier texte, csv? Avec les données de chaque jour, on pourrait recharger ton PV dans conso_jour.

Je regarde déjà ce que tu as dans ton historique

Edit: Dans l’historique des commandes du plugin pour ton PV, je n’ai rien trouvé. Je regarde maintenant dans les commandes qui alimente dans PV suivi conso

Edit 2: Pour la commande qui alimente le PV dans le plugin, j’ai des données depuis le 02/12/2019. Je pense que l’on va pouvoir faire quelque chose. Je commence à regarder dans la soirée. Tu peux vérifier qu’il s’agit bien de la commande 13669. Je peux avoir une copie d’écran du paramétrage du PV dans suivi conso.

Hello,

Je fais un curl d’un fichier json que je traite par code :

// à modifier à la main si on veut ajouter plusieurs jours

$today = date("Y-m-d");
//$today="2019-07-07";

// https://medium.com/@rukmalf/extracting-data-from-apsystems-inverters-8c2b8e8942b6

$json = file_get_contents("http://192.168.2.90/montheme/flux_aps.json");

$arr = json_decode($json, true);

//$scenario->setLog('***************************Fonction****************************'); 

// récupération des colonnes à traiter (time et power)
$times = $arr["data"]["time"];
$powers = $arr["data"]["power"];

// à commenter ensuite
//$scenario->setLog('***************************Affichage des times récupérés****************************'); 
//$scenario->setLog($times);
//$scenario->setLog('***************************Affichage des powers récupérés****************************'); 
//$scenario->setLog($powers);


// découpage des 2 colonnes extraites en supprimant les [ et autres guillemets
$etime = explode(",", str_replace('"', "", str_replace("[", "", str_replace("]", "", $times))));
$eqpow = explode(",", str_replace('"', "", str_replace("[", "", str_replace("]", "", $powers))));

// debug
//$scenario->setLog('***************************Affichage des times nettoyés****************************'); 
//$scenario->setLog($etime);
//$scenario->setLog('***************************Affichage des powers nettoyés****************************'); 
//$scenario->setLog($eqpow);

// on ajoute tous les éléments en historique (au cas où ça sort brut)
// récupération de l'ID
$cmdIdpower = cmd::byString("#[Energie][Production par API][Prod_api]#")->getId();
$cmdpower = cmd::byId($cmdIdpower);
//$scenario->setLog("test à $cmdpower pour $cmdIdpower");

// récupération du coucher de soleil par la variable et on décale d'une heure
$coucher_var = "coucher_soleil";
$coucher = $scenario->getData($coucher_var);
$coucher_decale = date("Y-m-d H:i:s", (strtotime("$today $coucher")-3600));

//$sizetime=sizeof($etime);
//$scenario->setLog("taille time : $sizetime");
//$sizepow=sizeof($eqpow);
//$scenario->setLog("taille power : $sizepow");

// attention il manque la date du jour !
// à ajouter la valeur du jour

for($i = 0; $i < sizeof($etime); $i++) 
{  
     // conversion date du jour + heure du fichier
     $timeread = date("Y-m-d H:i:s", strtotime("$today $etime[$i]"));  
     $scenario->setLog("valeur à lire : $timeread");
    
     // si le fichier n'est pas vide
     if ($timeread != "1970-01-01 01:00:00") {
       
        // on teste si l'enregistrement est déjà présent en db
        // bornes 1min avant/après
        $debut = date("Y-m-d H:i:s", strtotime($timeread)-60);
        $fin = date("Y-m-d H:i:s", strtotime($timeread)+60);  
        $scenario->setLog("Demande valeur $debut à $fin");
  		// recherche de la valeur
        $value = history::getStatistique($cmdIdpower, $debut, $fin)["min"];
        // si la valeur est non nulle alors j'ai pas de valeur à réin
        if (sizeof($value) != 0) {
            $scenario->setLog("Pas de valeur à ajouter car de $debut à $fin, valeur lue $value");
        }
        else 
        {
        
        $timeadd = date("Y-m-d H:i:s", strtotime("$today $etime[$i]"));  
        $cmdpower->addHistoryValue($eqpow[$i],$timeadd); 
        $scenario->setLog("Ajout de la valeur $eqpow[$i] à $cmdIdpower pour $today $etime[$i]" );
        }
     }
  	 else {
        $scenario->setLog("Pas de valeur à ajouter" );
     }
}

// dernier élément de temps pour savoir si la remontée est bien dispo !
$fintime = end($etime);
$fintime = date("Y-m-d H:i:s", strtotime("$today $fintime"));
$maxtime = date("Y-m-d H:i:s", strtotime("$coucher_decale"));
$scenario->setLog("dernier : $fintime pour $maxtime" );
                
if ( $fintime != "1970-01-01 01:00:00" ) {
  // notification en cas de problème
  //$maxTime = 7200; // temps en secondes - 2h maximum 7200
  //$deltamaxTime = time() - strtotime("$fintime"); // on calcule le delta
  //        $scenario->setLog("delta : $deltamaxTime pour $fintime" );
  // update graphique dernière valeur reformatée
  $fintime=strtotime($fintime);
  $maxtime=strtotime($maxtime);
  //$scenario->setLog("Dernier $fintime pour $maxtime");
  
  if ($fintime < $maxtime){ // si supérieur, alerte
    // -- /!\alert
    $monitor_api_value = 1;
    $scenario->setLog("Alerte de remontée API !"); // log
  } else
  {
    $monitor_api_value = 0;
    $scenario->setLog("Check API OK !"); // log
  }
  // affichage sur design de l'info
  $fintime = date("d/m@H:i", $fintime); 
  $scenario->setData("last_time_api",$fintime);
  $scenario->setLog("Dernière mise à jour à $fintime");
  }
else {
  // de même info sur design
  $fintime = "Indisponible";
  $scenario->setData("last_time_api",$fintime);
  $scenario->setLog("Alerte remontée API pas encore de dispo aujourd'hui");
  $monitor_api_value = 1;  
}

$scenario->setData('monitor_api',$monitor_api_value); // et on passe à la variable pour jeedom
$scenario->setLog("Défaillance : $monitor_api_value"); // log

L’id est 13708 apparemment :

soit :

$cmdIdpower = cmd::byString("#[Energie][Production par API][Prod_api]#")->getId();

Côté suivi conso pour le suivi API :

je passe par une variable : variable(api_prodtotale)

Mais apparemment c’est la production totale de la journée. J’avais du tenter de pousser que la valeur finale de la journée lors de mes essais.

C’est un second scénario qui calcule chaque jour mes statistiques de production, autoconsommation et de gain.

Le scénario passe par défaut par le calcul en se basant sur la consommation API et si problème de remontée d’API par le pulse.

D’ailleurs, il commence par faire tourner le bloc scénario que je t’ai mis plus haut…

le bloc code en détail :

// definition du talon
$talon=350;

// récupération de l'ID pour la production "précise" par API
$cmdIdprodAPI= cmd::byString("#[Energie][Production par API][Prod_api]#")->getId();
// récupération de l'ID pour la consommation @5min (calcul par scénario indépendant)
$cmdIdconso= cmd::byString("#[Energie][Puissance Instantanée][Consommation]#")->getId();
// on passe sur P en W au lieu des VA
// #[Capteurs et Actionneurs][Compteur Linky Garage][PAPP]#

// définition des bornes de temps pour l'étude pour aujourd'hui (scénario lancé avant minuit)
$debut = date("Y-m-d H:i:s", strtotime("today 00:00"));
$fin = date("Y-m-d H:i:s", strtotime("today 23:59"));

// récupération de l'historique de la production API à 5min
$allprod = history::all($cmdIdprodAPI, $debut, $fin);

// récupération du talon quotidien - mesure premier élément de production
//$timetalon = $allprod[0]->getDatetime();
//$tempstalon = date("Y-m-d H:i:s", strtotime($timetalon));
//$tempstalon5minbefore = date('Y-m-d H:i:s',strtotime('-5 minutes',strtotime($timetalon)));
//$ptalon = history::getStatistique($cmdIdconso, $tempstalon5minbefore, $tempstalon)["avg"];

// récupération du talon de consommation le matin
$tempstalon = date("Y-m-d H:i:s", strtotime("today 06:00")); //5:50
$tempstalon5minbefore = date("Y-m-d H:i:s", strtotime("today 00:00")); //5:45
$ptalon = history::getStatistique($cmdIdconso, $tempstalon5minbefore, $tempstalon)["min"]; //avg
$scenario->setLog("Valeur du talon entre $tempstalon5minbefore et $tempstalon : min à $ptalon");

// au cas où on vérifie si valeur erronée !
if ($ptalon > 550.0) {
  $ptalon = $talon;
  $scenario->setLog("Valeur du talon estimée : $talon");
}
else {
   $scenario->setLog("Valeur du talon mesurée : $ptalon");
}

// taille à analyser
//$taille_conso = count($allcons);
//$taille_prod = count($allprod);
//$scenario->setLog("Taille conso : $taille_conso & Taille prod : $taille_prod");
// conclusion : c'est la conso le driver mais on prend comme driver la production CAR le gain n'existe que si la production démarre

// définitions
$gain = 0;
$prodtotale = 0;

for ($i = 0; $i < count($allprod); $i++) {
  // on récupère la valeur de la production et on s'arrête à l'avant dernier item sur la boucle for < pour tenir compte de la consommation à postériori
  $pprod = $allprod[$i]->getValue(); 
  // on récupère son temps
  $pprodtime = $allprod[$i]->getDatetime();
  // debug affichage
  //$scenario->setLog( "date : $pprodtime valeur : $pprod ");
  
  // déduction des bornes temps à 5min
  $temps = date("Y-m-d H:i:s", strtotime($pprodtime));
  $temps5minbef = date('Y-m-d H:i:s',strtotime('-5 minutes',strtotime($pprodtime)));
  
  // calcul la consommation moyenne 5min avant jusqu'à la valeur de la production
  $pcons5min = history::getStatistique($cmdIdconso, $temps5minbef, $temps)["avg"];
  
  // si prod = 0, le gain est 0
  // si prod != 0 alors si conso = 0 le gain est talon sinon gain est prod
  $gainup = 0;
  $pprodWh = $pprod * 0.08333;
  $prodtotale = $prodtotale + $pprodWh;
  
  if ($pprod == 0) {
     $gainup = 0;  
     //$scenario->setLog("@ $temps - Prod nulle : $pprod alors $gain");
  }
  else if ($pcons5min == 0) {
    $gainup = $talon;
    //$scenario->setLog("@ $temps - Prod non nulle : $pprod mais conso nulle $pcons5min alors talon $gain");
  }
  else {
    $gainup = $pprod;
    //$scenario->setLog("@ $temps - Prod non nulle : $pprod mais conso non nulle $pcons5min alors prod $gain");
  }

  // calcul du gain en Wh : h x puissance 1 = 60 min alors 5 min = 0.08333
    
  // normalisation du gain
  //$scenario->setLog("GainW : $gainup");
  $gainup = $gainup * 0.08333;
  //$scenario->setLog("GainWh : $gainup");
  $gain = $gain + $gainup;
  //$scenario->setLog("Gain : $gain");
  //$scenario->setLog("Production totale : $prodtotale Wh");
}

// debug global
$ratio = 100 * $gain / $prodtotale;

if ($ratio > 100.0) {
  $scenario->setLog("Ratio: $ratio limité à 100%");
  $ratio = 100;
}

$scenario->setLog("Gain Wh : $gain");
$scenario->setLog("Produit Wh : $prodtotale");
$scenario->setLog("Utilisé % : $ratio");

// passage par variable
$scenario->setData("api_gainproduction", $gain);
$scenario->setData("api_used_ratio", $ratio);
$scenario->setData("api_prodtotale", $prodtotale);

Variable api_prodtotale n’est que la production totale donnée par l’API…
et la fin du scénario :

13708 avait 3 mois d’historisation. C’est la puissance par pas de 5min tout au long de la production ; comme des données temps réel. Je l’avais limité car vu que ce sont des données à 5min, je vais taper un score sinon… je viens de le passer à 6 mois pour avoir un histo.

13669 je n’arrive pas à le trouver celui-là ?

Bon je m’étais trompé, c’est la commande 13116. J’ai pu te remettre les données dans conso_jour à partir du 01/05/2020.
Pour le reste, je verrais demain soir.

:muscle::+1:.
Bravo et merci. Je vais regarder