Donc tu ne peux pas avoir le même timestamp pour plusieurs équipements différents
C’est peut-être de là de vient le souci ? Si on intègre les données sur un timestamp utilisé sur un autre équipement?
Question sûrement bête mais pourquoi ne pas mettre l’unicité sur le couple timestamp - ID?
C’était comme ça quand j’ai repris le plugin, et je n’ai pas touché.
Et maintenant j’ai rendu le plugin à son propriétaire comme il le souhaitait
Ah ok je pensais que tu l’avais encore.
Tu penses que c’est grave si je mets timestamp+1 si count(*)>0?
non aucun problème
Allez je tente ça alors et je vous tiens au courant.
Question bête du coup mais y’a-t-il un intérêt à enlever une seconde avant d’écrire les lignes sql ?
PS: conso désormais bonne un jour sur deux…
Je ne pense pas qu’il y a un intérêt à cela, sauf si tu veux faire quelque chose de particulier sur les bornes de début ou fin de journée (genre 23h59:59 ou 00h00:01)
le seul intérêt de mettre 1s avant est de mettre sur le jour J l’ensemble des consommations de J.
explication:
Sauf erreur de ma part :Le plugin Linky enregistre sur 00:00:00 du 22/03/2025 le segment de conso de 23:30:00 à 23:59:59 du 21/03/2025.
donc tu aurais dans ce cas un décalage puisque 00:00:00 est sur le 22 il ne sera pas compté avec les conso du 21/03/2025.
En l’injectant une seconde avant, ce segment de consommation reste du la journée du 21
Ensuite j’insiste mais il me semble que nous pourrions identifier pourquoi un segment n’est pas injecté…
Si tu peux m’indiquer lesquels sont manquant dans la table tele_info et me communiquer le log de la journée de l’injection correspondant je pourrais peut être trouver une explication
J’ai trouvé une piste, en fait, le timestamp devant être unique, il était déjà utilisé par d’autres équipements… J’ai donc vidé toutes les tables du plugin et relancé un import de mon équipement depuis 19 jours.
En ajoutant un controle avec mon count(*) >0, j’ai bien 49 lignes par jour (les 48 du script + celle de 00:00:00)
Sur les 19 derniers jours j’en ai 3 qui ne sont pas raccord, pourquoi, je ne sais pas
Voici le log complet de l’import:
scenario236.log (1,7 Mo)
pas vu d’erreur dans le log pour le 21 (cf ci après)
Par contre pas de consommation à 00h30 et à 13h00
Pourrais tu mettre les données 1/2h de linky pour le 21 pour verifier les écarts avec le log d’import ?
date = 2025-03-21 00:29:59
Couleur_n= HCJB
hp = 0
hc = 0
date = 2025-03-21 00:59:59
Couleur_n= HCJB
hp = 0
hc = 0.11
date = 2025-03-21 01:29:59
Couleur_n= HCJB
hp = 0
hc = 0.125
date = 2025-03-21 01:59:59
Couleur_n= HCJB
hp = 0
hc = 0.12
date = 2025-03-21 02:29:59
Couleur_n= HCJB
hp = 0
hc = 0.09
date = 2025-03-21 02:59:59
Couleur_n= HCJB
hp = 0
hc = 0.1
date = 2025-03-21 03:29:59
Couleur_n= HCJB
hp = 0
hc = 0.15
date = 2025-03-21 03:59:59
Couleur_n= HCJB
hp = 0
hc = 0.12
date = 2025-03-21 04:29:59
Couleur_n= HCJB
hp = 0
hc = 0.14
date = 2025-03-21 04:59:59
Couleur_n= HCJB
hp = 0
hc = 0.14
date = 2025-03-21 05:29:59
Couleur_n= HCJB
hp = 0
hc = 0.105
date = 2025-03-21 05:59:59
Couleur_n= HCJB
hp = 0
hc = 0.09
date = 2025-03-21 06:29:59
Couleur_n= HCJB
hp = 0.1
hc = 0
date = 2025-03-21 06:59:59
Couleur_n= HCJB
hp = 0.14
hc = 0
date = 2025-03-21 07:29:59
Couleur_n= HCJB
hp = 0.33
hc = 0
date = 2025-03-21 07:59:59
Couleur_n= HCJB
hp = 0.025
hc = 0
date = 2025-03-21 08:29:59
hchc3 =0
Couleur_n= HCJB
hp = 0.04
hc = 0
date = 2025-03-21 08:59:59
Couleur_n= HCJB
hp = 0.125
hc = 0
date = 2025-03-21 09:29:59
Couleur_n= HCJB
hp = 0.165
hc = 0
date = 2025-03-21 09:59:59
Couleur_n= HCJB
hp = 0.11
hc = 0
date = 2025-03-21 10:29:59
Couleur_n= HCJB
hp = 0.375
hc = 0
date = 2025-03-21 10:59:59
Couleur_n= HCJB
hp = 0.065
hc = 0
date = 2025-03-21 11:29:59
Couleur_n= HCJB
hp = 0.06
hc = 0
date = 2025-03-21 11:59:59
Couleur_n= HCJB
hp = 0.165
hc = 0
date = 2025-03-21 12:29:59
Couleur_n= HCJB
hp = 0.025
hc = 0
date = 2025-03-21 12:59:59
Couleur_n= HCJB
hp = 0
hc = 0
date = 2025-03-21 13:29:59
Couleur_n= HCJB
hp = 0.325
hc = 0
date = 2025-03-21 13:59:59
Couleur_n= HCJB
hp = 0.465
hc = 0
date = 2025-03-21 14:29:59
Couleur_n= HCJB
hp = 0.33
hc = 0
date = 2025-03-21 14:59:59
Couleur_n= HCJB
hp = 0.34
hc = 0
date = 2025-03-21 15:29:59
Couleur_n= HCJB
hp = 0.82
hc = 0
date = 2025-03-21 15:59:59
Couleur_n= HCJB
hp = 0.51
hc = 0
date = 2025-03-21 16:29:59
Couleur_n= HCJB
hp = 0.17
hc = 0
date = 2025-03-21 16:59:59
Couleur_n= HCJB
hp = 0.255
hc = 0
date = 2025-03-21 17:29:59
Couleur_n= HCJB
hp = 0.31
hc = 0
date = 2025-03-21 17:59:59
Couleur_n= HCJB
hp = 0.075
hc = 0
date = 2025-03-21 18:29:59
Couleur_n= HCJB
hp = 0.07
hc = 0
date = 2025-03-21 18:59:59
Couleur_n= HCJB
hp = 0.09
hc = 0
Couleur_n= HCJB
hp = 0.12
hc = 0
date = 2025-03-21 19:59:59
Couleur_n= HCJB
hp = 0.1
hc = 0
date = 2025-03-21 20:29:59
Couleur_n= HCJB
hp = 0.085
hc = 0
date = 2025-03-21 20:59:59
Couleur_n= HCJB
hp = 0.09
hc = 0
date = 2025-03-21 21:29:59
Couleur_n= HCJB
hp = 0.08
hc = 0
date = 2025-03-21 21:59:59
Couleur_n= HCJB
hp = 0.09
hc = 0
date = 2025-03-21 22:29:59
Couleur_n= HCJB
hp = 0
hc = 0.795
date = 2025-03-21 22:59:59
Couleur_n= HCJB
hp = 0
hc = 1.52
date = 2025-03-21 23:29:59
Couleur_n= HCJB
hp = 0
hc = 1.52
date = 2025-03-21 23:59:59
Couleur_n= HCJB
hp = 0
hc = 1.38
12,555
Le voilà (j’ai laissé la veille à 23h30 et le lendemain 00h30)
Pour 13h ça parait plausible, j’ai des panneaux solaires. 00h30 par contre?
conso horaire.pdf (70,4 Ko)
Bon on approche de la solution.
Pour 13:00:00 => il y avait 0 dans les logs Linky doc c’est normal.
Pour 00:30:00 => il n’y a pas de data dans le log linky
Et cela ce n’est pas normal. C’est une anomalie chez eux.
Sachant que la données journalière est une différence d’index fin/debut, si tu n’as pas tous les index intermédiaires tu n’auras pas la même valeur.
Dans ton log la somme de 00:30:00(donc 01:00:00 car elle n’est pas presente) jusqu’a 00:00:00 = 12.539 Kwh soit aux arrondis les 12,505 Kwh pressent dans suiviconso
partages tu cette analyse ?
Je ne suis pas devant mon PC donc je ne peux pas fouiner mais je pense que tu as raison.
Je vais faire la vérification pour le 13/03 car l’écart est assez important sur cette journée
Encore mieux pour le 13… Je n’ai que ça dans l’export des données horaires ENEDIS
Somme totale: 6.904 kWh… qui ne correspondent ni aux données présentes dans conso_jour (3,175) ni à celles d’ENEDIS journalier (8.53) ???
si tu soustrais la ligne de 00:00:00 qui appartient au 12, alors tu as : 6.356 kW mais c’est une somme sur des tranches d’1/2h donc tu divises par deux pour revenir sur un pas horaire.
6.356/2 = 3.178 kWh , soit presque aux arrondis ce que tu as dans le suivis.
Il me semble que so la conso est 0 Enedis inscrit 0 dans son comptage. Par contre lorsqu’ils n’ont pas de données ils ne mettent rien.
Je n’ai pas souvent eu des manquent de données é ou 3 fois en 2 ans. Et à chaque fois je les ai reconstitué avec les différence d’index de la journée(sans forcement chercher à les mettre sur le bon creneau lorsqu’il y en avait trop sur une journée) et injecté via le pluggin export dans l’historique adhoc de jeedom.
Pour les reconstituer va exporter sur ton compte Enedis les fichiers csv au pas le plus fin
bon courage.
Pour une journée ou deux je crois que je vais faire l’impasse
Je partage dans la soirée les modifs du scénario que j’ai faites si tu veux.
Ça permet de mettre une ligne à 00:00:00 sur chaque journée, ce qui est utile si tu changes la valeur de n
Voilà le code final que j’utilise.
2 modifs par rapport au tien:
- J’ai remonté la partie « création de la ligne à 00:00:00 » afin de la créer aussi bien s’il y a une seule journée à créer que plusieurs (si on change la valeur de n)
- J’ai rajouté un test SQL avec un count(*) sur la table conso_teleinfo pour vérifier que le timestamp n’existe pas déjà puisqu’il doit être unique quelque soit l’équipement (grosse erreur selon moi mais je ne peux pas modifier la structure du plugin). On peut l’optimiser en faisant une boucle, car pour le moment, si le timestamp existe, je fait « timestamp=timestamp +1 » mais rien ne dit que timestamp +1 n’existe pas déjà…
//mettre l'id de l'equipement <= a prendre sur le Panel du dashboard suiviconso
$id_equipement = 361;
$fin_hp = "22:00:00";
$fin_hc = "06:00:00";
$debut_hp = DateTime::createFromFormat('H:i:s', "06:00:01");
$debut_hc = DateTime::createFromFormat('H:i:s', "22:00:01");
#$scenario->setLog('debut_hp = ' . $debut_hp);
#$scenario->setLog('debut_hc = ' . $debut_hc);
//mettre les index de démarrage pour la 1er fois si vous voulez être raccord avec votre compteur. sinon mettez 0 donné au 16/09 pour moi
$hchp = 0;
$hchc = 0;
$hchp2 = 0;
$hchc2 = 0;
$hchp3 = 0;
$hchc3 = 0;
//mettre la commande du plugin Enedis
$commande_ConsoHoraire = cmd::byString("#[Energie][Linky][Consommation Horaire]#");
$id_commande_ConsoHoraire = $commande_ConsoHoraire->getId();
//mettre la commande du plugin Ecowat//
$cmd = cmd::byString("#[Energie][Linky Maison][PTEC]#");
$cmdId = $cmd->getId();
$scenario->setLog('idconsohoraire = ' . $id_commande_ConsoHoraire);
$scenario->setLog('idtempo = ' . $cmdId);
/*
$date = new DateTime();
$timestamp = $date->getTimestamp();
$sql = "INSERT INTO `conso_teleinfo` (timestamp, rec_date, rec_time, hchp, hchc, hchp2, hchc2, hchp3, hchc3, ptec, papp, id_equipement) VALUES (:timestamp, :rec_date, :rec_time, :hchp, :hchc, :hchp2, :hchc2, :hchp3, :hchc3, :ptec, :papp, :id_equipement) ON DUPLICATE KEY UPDATE timestamp = timestamp";
$parameters = array(
':timestamp' => $timestamp,
':rec_date' => "2025-01-01",
':rec_time' => "00:00:00",
':hchp' => $hchp,
':hchc' => $hchc,
':hchp2' => $hchp2,
':hchc2' => $hchc2,
':hchp3' => $hchp3,
':hchc3' => $hchc3,
':ptec' => "HCJB",
':papp' => 0,
':id_equipement' => $id_equipement,
);
$results = DB::Prepare($sql, $parameters, DB::FETCH_TYPE_ALL);
*/
//choisir n le nombre de jours à recuperer, par défault 1 // A voir pour mettre une variable pour calculer le n
for ($n = 1 ; $n >= 1; $n--) {
//calcul du nombre d'occurrence à la date définie par n ..normalement 48, mettre 48 c'est mieux en cas de trou
#$r = history::getStatistique($id_commande_ConsoHoraire, date('Y-m-d H:i:s', strtotime("today - $n days 00:00:01")), date('Y-m-d H:i:s', strtotime("tomorrow - $n days 00:00:01")))["count"];
$r = 1;
$i = 48;
for ($r = 1; $r <= $i; $r++) {
// Calculer la date
$date = new DateTime();
$date->setTime(0, 0, 0);
$date->sub(new DateInterval('P' . $n . 'D'));
$date->add(new DateInterval('PT' . ($r * 30) . 'M'));
$date->sub(new DateInterval('PT1S')); // Soustraire une seconde
$scenario->setLog('date = ' . $date->format('Y-m-d H:i:s'));
// Calculer la datei
$datei = clone $date;
$datei->add(new DateInterval('PT1S'));
// Calculer le timestamp de la date
$timestamp = $date->getTimestamp();
#$timestamp = $timestamp - 1; //inutile maintenant201223
// Log du timestamp
$scenario->setLog('n = ' . $n);
$scenario->setLog('r = ' . $r);
$scenario->setLog('date = ' . $date->format('Y-m-d H:i:s'));
$scenario->setLog('datei = ' . $datei->format('Y-m-d H:i:s'));
$scenario->setLog('timestamp = ' . $timestamp);
//calcul la date d'injection à 59:59
$rec_date = $date->format('Y-m-d');
$date->add(new DateInterval('PT1S')); // Ajouter une seconde
$rec_time = $date->format('H:i:s');
$datei->add(new DateInterval('PT1S')); // Ajouter une seconde
$rec_timei = $datei->format('H:i:s');
$scenario->setLog('rec_date= ' .$rec_date);
$scenario->setLog('rec_time= ' .$rec_time);
$scenario->setLog('rec_timei ' .$rec_timei);
//recuperer les derniers index presents dans la table
$sql = "SELECT hchp, hchc, hchp2, hchc2, hchp3, hchc3 FROM `conso_teleinfo` WHERE id_equipement = $id_equipement ORDER BY timestamp DESC LIMIT 1";
$scenario->setLog("SQL = $sql");
$results = DB::Prepare($sql, NULL, DB::FETCH_TYPE_ALL);
foreach ($results as $result) {
$hchp = $result['hchp'];
$hchc = $result['hchc'];
$hchp2 = $result['hchp2'];
$hchc2 = $result['hchc2'];
$hchp3 = $result['hchp3'];
$hchc3 = $result['hchc3'];
$scenario->setLog("hchp =" . $hchp);
$scenario->setLog("hchc =" . $hchc);
$scenario->setLog("hchp2 =" . $hchp2);
$scenario->setLog("hchc2 =" . $hchc2);
$scenario->setLog("hchp3 =" . $hchp3);
$scenario->setLog("hchc3 =" . $hchc3);
}
//verification vs les index mis ci dessus
if ($hchp < $hchpi) { $hchp = $hchpi; } else { $hchp = $hchp; }
if ($hchc < $hchci) { $hchc = $hchci; } else { $hchc = $hchc; }
if ($hchp2 < $hchpi2) { $hchp2 = $hchpi2; } else { $hchp2 = $hchp2; }
if ($hchc2 < $hchci2) { $hchc2 = $hchci2; } else { $hchc2 = $hchc2; }
if ($hchp3 < $hchpi3) { $hchp3 = $hchpi3; } else { $hchp3 = $hchp3; }
if ($hchc3 < $hchci3) { $hchc3 = $hchci3; } else { $hchc3 = $hchc3; }
//determination de la couleur n
if ($rec_time > '00:00:00' && $rec_time <= '06:00:00') {
$debut = date('Y-m-d H:i:s', strtotime("yesterday - $n days 06:00:00"));
$fin = date('Y-m-d H:i:s', strtotime("today - $n days 05:59:59"));
$scenario->setLog("debut =" . $debut);
$scenario->setLog("fin =" . $fin);
} else if ($rec_time > '06:00:00' && $rec_time <= '23:59:59') {
$debut = date('Y-m-d H:i:s', strtotime("today - $n days 06:00:00"));
$fin = date('Y-m-d H:i:s', strtotime("tomorrow - $n days 05:59:59"));
}
$value = history::getStatistique($cmdId, $debut, $fin)["last"];
$scenario->setData("Couleur_n", $value);
$scenario->setLog('Couleur_n= ' .$value);
$scenario->setLog('debut= ' .$debut);
$scenario->setLog('fin= ' .$fin);
if ($rec_time > $debut_hp->format('H:i:s') && $rec_time <= $debut_hc->format('H:i:s')) {
$hp = history::getStatistique($id_commande_ConsoHoraire, $date->format('Y-m-d H:i:s'), $datei->format('Y-m-d H:i:s'))["sum"] / 2;
$hc = 0;
} else {
$hc = history::getStatistique($id_commande_ConsoHoraire, $date->format('Y-m-d H:i:s'), $datei->format('Y-m-d H:i:s'))["sum"] / 2;
$hp = 0;
}
//log
$hpchdate = $date;
$hpchdatei = $datei;
$scenario->setLog('hp = ' .$hp);
$scenario->setLog('hc = ' .$hc);
//calcul hp hc avec la couleur
$couleur = $scenario->getData("Couleur_n");
if ($couleur == "HPJB" || $couleur == "HCJB") {
$hchp = $hchp + ($hp * 1000);
$hchc = $hchc + ($hc * 1000);
$hchp2 = $hchp2 + 0;
$hchc2 = $hchc2 + 0;
$hchp3 = $hchp3 + 0;
$hchc3 = $hchc3 + 0;
if ($rec_time > $debut_hp->format('H:i:s') && $rec_time <= $debut_hc->format('H:i:s')) {
$ptec = "HPJB";
} else {
$ptec = "HCJB";
}
} elseif ($couleur == "HPJW" || $couleur == "HCJW") {
$hchp = $hchp + 0;
$hchc = $hchc + 0;
$hchp2 = $hchp2 + ($hp * 1000);
$hchc2 = $hchc2 + ($hc * 1000);
$hchp3 = $hchp3 + 0;
$hchc3 = $hchc3 + 0;
if ($rec_time > $debut_hp->format('H:i:s') && $rec_time <= $debut_hc->format('H:i:s')) {
$ptec = "HPJW";
} else {
$ptec = "HCJW";
}
} elseif ($couleur == "HPJR" || $couleur == "HCJR") {
$hchp = $hchp + 0;
$hchc = $hchc + 0;
$hchp2 = $hchp2 + 0;
$hchc2 = $hchc2 + 0;
$hchp3 = $hchp3 + ($hp * 1000);
$hchc3 = $hchc3 + ($hc * 1000);
if ($rec_time > $debut_hp->format('H:i:s') && $rec_time <= $debut_hc->format('H:i:s')) {
$ptec = "HPJR";
} else {
$ptec = "HCJR";
}
} else {
//La condition est fausse, on arrête la boucle.\n et .\r
$scenario->setLog("couleur ko en date du " .$hpchdate);
$scenario->setLog("à " .$hpchdatei);
scenario::stop();; // Cela arrête la boucle <= pas sur à vérifier et mettre un message dans la notification
}
//ajustement des données à injecter à 59 au lieu de 00
$rec_time = $date->format('H:i:s');
$date = new DateTime($rec_time);
$date->sub(new DateInterval('PT1S'));
$rec_time = $date->format('H:i:s');
$papp = ($hp + $hc) * 2000;
$scenario->setLog("timestamp =" .$timestamp);
$scenario->setLog("rec_date =" .$rec_date);
$scenario->setLog("rec_time =" .$rec_time);
$scenario->setLog("hchp =" .$hchp);
$scenario->setLog("hchc =" .$hchc);
$scenario->setLog("hchp2 =" .$hchp2);
$scenario->setLog("hchc2 =" .$hchc2);
$scenario->setLog("hchp3 =" .$hchp3);
$scenario->setLog("hchc3 =" .$hchc3);
$scenario->setLog("ptec =" .$ptec);
$scenario->setLog("papp =" .$papp);
$scenario->setLog("id_equipement =" .$id_equipement);
// insertion dans table conso_teleinfo
//vérification de non existence d'un timstamp identique
$sql_timestamp = "SELECT count(*) AS compte_timestamp FROM `conso_teleinfo` WHERE timestamp = $timestamp";
$scenario->setLog("SQL Timestamp = $sql_timestamp");
$results_timestamp = DB::Prepare($sql_timestamp, NULL, DB::FETCH_TYPE_ALL);
foreach ($results_timestamp as $result_timestamp) {
$nb_timestamp = $result_timestamp['compte_timestamp'];
$scenario->setLog("SQL compte timestamp = $compte_timestamp");
}
if ( $compte_timestamp >0){
$timestamp = $timestamp +1;
};
$sql = "INSERT INTO `conso_teleinfo` (timestamp, rec_date, rec_time, hchp, hchc, hchp2, hchc2, hchp3, hchc3, ptec, papp, id_equipement) VALUES (:timestamp, :rec_date, :rec_time, :hchp, :hchc, :hchp2, :hchc2, :hchp3, :hchc3, :ptec, :papp, :id_equipement) ON DUPLICATE KEY UPDATE timestamp = timestamp";
$parameters = array(
':timestamp' => $timestamp,
':rec_date' => $rec_date,
':rec_time' => $rec_time,
':hchp' => $hchp,
':hchc' => $hchc,
':hchp2' => $hchp2,
':hchc2' => $hchc2,
':hchp3' => $hchp3,
':hchc3' => $hchc3,
':ptec' => $ptec,
':papp' => $papp,
':id_equipement' => $id_equipement,
);
$results = DB::Prepare($sql, $parameters, DB::FETCH_TYPE_ALL);
}
//insertion dans table conso_teleinfo de la ligne fictive à J
$timestamp = $timestamp + 1;
$date = new DateTime();
$date->setTimestamp($timestamp);
$rec_date = $date->format('Y_m-d');
$rec_time = $date->format('H:i:s');
$scenario->setLog("timestamp =" .$timestamp);
$scenario->setLog("rec_date =" .$rec_date);
$scenario->setLog("rec_time =" .$rec_time);
$sql = "INSERT INTO `conso_teleinfo` (timestamp, rec_date, rec_time, hchp, hchc, hchp2, hchc2, hchp3, hchc3, ptec, papp, id_equipement) VALUES (:timestamp, :rec_date, :rec_time, :hchp, :hchc, :hchp2, :hchc2, :hchp3, :hchc3, :ptec, :papp, :id_equipement) ON DUPLICATE KEY UPDATE timestamp = timestamp";
$parameters = array(
':timestamp' => $timestamp,
':rec_date' => $rec_date,
':rec_time' => $rec_time,
':hchp' => $hchp,
':hchc' => $hchc,
':hchp2' => $hchp2,
':hchc2' => $hchc2,
':hchp3' => $hchp3,
':hchc3' => $hchc3,
':ptec' => $ptec,
':papp' => $papp,
':id_equipement' => $id_equipement,
);
$results = DB::Prepare($sql, $parameters, DB::FETCH_TYPE_ALL);
}
$scenario->setLog("well done ! :-)");
@superbricolo je tente désespérément d’injecter mes index de production d’électricité grâce aux panneaux, sur le même modèle que ce scenario.
Peux-tu m’indiquer dans quelle table et sur quel champ je dois insérer les index stp?
j’ai créé un équipement suivi conso en mode « prod elec » sans rien mettre d’autre comme pour le « conso », mais quand j’insère les données, rien ne remonte
merci !
Tu récupères les infos comment?
de la même manière, la production dans le plugin ENEDIS