Tempo : Injection quotidienne dans suiviconso des données Enedis au pas de 30', sans clé linky

ourg…cela sent la boulette dans le code… :frowning: je ne peux pas verifier ma version faute d’accès à ma box…merci la fibre :frowning: .
Mais je viens de relire patiement tout le code et je me demande si j’ai corrigé la version sur le forum lors du passage au comptage 1/2h… à moins que je sois encore sur un compatge enedis à l’heure…Et oui Endis ne compte pas partout pareil. Il a commencé à communiqué les données au pas de l’heure…puis progressivement à la 1/2h

D’ou la différence de 2, puisque je divise par 2

si tu as le temps attend dimanche que je te confirme cela via un essaie avec ma box, sinon -sans certitude- modifie les lignes 120& 124

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;
}

par

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"] ;
    $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"] ;
    $hp = 0;
}

Semaine prochaine je m’y colle, j’optimise le code et j’essaye de lui faire verifier la presence de datas aussi sans quoi il reporte au lendemain avec n incrémenté de +1

tu peux personnellemnt je n’ai jamais eu de soucis…et pourtant je lui ai injecté plusieurs fois 2 ans d’un coup (javais intégré dans les hitoriques les datas recupérées en csv sur Enedis via le plugin export). Mais j’ai une box costaud -Atlas- difficile à mettre en surcharge

Je me suis demandé effectivement, car perso j’ai un Raspberry avec une carte SD. C’est un peu bizarre car autant sur l’import initial, effectivement ça peut être gros, autant quand tu ne rajoutes qu’un jour, soit 48 lignes, c’est rien…
Je tenterai !

Je vais essayer de modifier les lignes 120 à 124 et voir demain ce qui se passe.

Mais je ne suis pas non plus dans l’urgence donc si cela ne change rien, j’attendrai de tes nouvelles en fin de semaine/début de prochaine (je pars ce WE de toute façon)

EDIT petit test de fin de soirée, j’ai vidé mon équipement, fait la modif que tu as évoquée et relancé le script… J’ai pas les bonnes données, c’est bien plus gros (j’étais plutôt vers 26-27 kWh sur ENEDIS)

Je te laisse regarder quand tu peux et revenir vers moi :slight_smile:

Bonne fin de semaine en tous cas !

ma box est de retour en ligne :slight_smile:
voici mon script et ouf pas d’erreur finalement cf plus bas :slight_smile:

//mettre l'id de l'equipement <= a prendre sur le Panel du dashboard suiviconso
$id_equipement = 259;
$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 = 125439213;
$hchc = 61007697;
$hchp2 = 0;
$hchc2 = 0;
$hchp3 = 0;
$hchc3 = 0;
//mettre la commande du plugin Enedis
$commande_ConsoHoraire = cmd::byString("#[Maison][BB][Consommation Horaire]#");
$id_commande_ConsoHoraire = $commande_ConsoHoraire->getId();

//mettre la commande du plugin Ecowat//
$cmd = cmd::byString("#[Maison][Tempo][Maintenant]#");
$cmdId = $cmd->getId();

$scenario->setLog('idconsohoraire = ' . $id_commande_ConsoHoraire);
$scenario->setLog('idtempo = ' . $cmdId);


//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 = 48;
  $i = $r;
    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
         $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 !  :-)");      
 
      

et il faut bien diviser par 2 car tu récuperes des puissances par 1/2h
par exemple :

19/03/2025 de 18:00:00 à 18:30:00 tu a soustiré 1,126 kW en 1/2h.
Sauf que nous nous sommes compté & facturé en kWh…
Donc 1.126 kW en 1/2h cela revient a avoir consommé 1.126/2=0.563 kW par 1/2h sur 1h…donc c’est 0.563 kWh

et (copier coller d’une réponse que j’avais faite l’année derniere) Enedis donne une valeur moyenne de la puissance consommée sur le pas de temps choisis (15’,30’ ou 1h).
Donc en fonction de votre pas de temps vous devez pour avoir des kWh (-kW pendant 1h-)

d’abord faire la somme des données par heure
et la diviser par le nombre de valeurs additionnés.
Donc pour un pas de 30’ il faut deux valeurs pour faire 60’(1h), donc il faut diviser la somme par 2… et pour 15’ par 4 et pour 60’ par 1
Le kWh prend en compte le temps de marche des appareils. Dis différemment le kilowatt-heure( kWh) met en relation la puissance à la durée de fonctionnement de l’appareil

Donc il est aussi logique que la somme de puissance instantané relevé avec linky sur 1h soit égale à la différence des index de début et fin de cette heure relevé par linky

Et il est tout aussi logique que la moyenne des puissances réelles ramenés à un pas de temps de 15’,30’,ou 60’ par Enedis soient le reflet quasi exacte de tes index.

La différence est surement du à ce que l’arrondi d’une somme n’est pas égal à la somme des arrondis
exemple :
additionnons 10,123 et 20,124
Arrondi de la somme : 10,123+ 20,124 = 30,247 l’arrondi est = à 30,50
Somme des arrondis : 10,12 + 20,12 = 30,44

Pour ton cas : la somme debug et consohoraire du 19 = 54.964 et tu as bien 59.964/2= 27.482 Kw/h d’afficher sur ton widget linky.

reste à iddentifier dans le log du scenario pourquoi ces deux lignes n’injectent pas la donnée…

Ok c’est très clair, merci ! Donc l’erreur principale viendrait des lignes non injectées ?

Je viens de refaire un test en prenant ton script: mêmes erreurs, il manque des lignes :frowning:

EDIT qui m’inquiète un peu:

  1. même en rajoutant une pause d’une seconde, idem, y’a des lignes qui sautent :frowning:

  2. pour le 20, j’ai bien 48 lignes en base ! MAIS… Pas le même chiffre
    image

image

Une remarque tout de même, la conso d’une journée c’est le max - le min de la journée. Donc je ne pense pas que les lignes manquantes aient une quelconque influence.

1 « J'aime »

Du coup on revient à ce que j’énonçais au début, la ligne mini du jour J et le maxi du J-1 qui ne serait pas égales ?

Je crois que j’ai trouvé une piste @superbricolo @Oliflo !!!

Dans ma table conso_teleinfo, la ligne à 00:00:00 n’est présente que sur la dernière ligne.
(par exemple ici on passe directement de 23h59 à 00:29 donc la première info du 20/03 est 40 205)

Ce qui permettrait par exemple ici entre les deux d’avoir une ligne à 00:00:00 le 20/03 et donc dans conso_jour de commencer à 39560 et non 40205 ?

Ce qui ferait dans ce cas 645 Wh en plus sur ma journée du 20, soit 23 805 + 6785 = 30 590, soit le relevé ENEDIS de 30 589 !!!

En fait il faudrait l’insérer à la fin de chaque jour non ? Et donc remonter le bloc du dernier insert dans la boucle n ?

EDIT:

image

je viens de tenter en remontant le bloc de l’insert à 00:00:00 en fin de boucle n (donc chaque jour après les 48 boucles), et j’ai bien les bons chiffres pour le 20… Mais pas pour les autres jours :frowning: incroyable !

EDIT 2: j’ai refait une injection (avec ma modif de script) sur tous les jours depuis mon arrivée dans Tempo.

En orange, les jours KO, en vert les OK (raccord ENEDIS - Suivi Conso OK à l’arrondi près)

donc cela confirme que le script sur le fil du forum est ok.

Il faut que tu regarde le log du script au niveau des lignes qui ont sautées pour que l’on sache pourquoi

copie colle les que je regarde aussi (soit large pour etre sur d’avoir tout le log ad hoc)

Ne serait ce pas un problème de timestamp. Si jamais tu as des doublons, la 2ème ligne ne pourra être créée. Il y a une clé unique sur ce celui-ci

Normal… le script enregistre les données de 00 et 30 à 59 et 29.
Pourquoi ? pour intégrer facilement la données de 00:00:00 sur la bonne journée

Il y a 48 items max sur une journée, ils se repartissent de 00:29 à 23:59 par pas de 30’
la ligne de 00:00:00 est technique elle est strictement égale à 23:59:59

par contre si une donnée n’est pas remonté ,les index journaliers seront faux sur conso_jour

oui suiviconso bloque le doublon timestamp… c’est pour cela que dans mon injection je demande l’écrasement en cas de doublon.

As tu pu identifier les lignes qui sautent…si oui dis moi lesquelles et communique le log… car je ne vois qu’une solution à priori c’est une donnée mal entrée dans l’historique…ou sinon j’ai une anomalie dans le script mais je ne la vois pas pour le moment

Je ne suis pas devant mon PC mais je regarde dès que possible. Dans le PDF que j’avais envoyé, j’avais envoyé les lignes manquantes en orange (mais je crois que j’ai enlevé le timestamp…)

Le script ne « touche » pas à la table conso_jour.
il appel le dernier index connu dans la base conso_teleinfo et lui ajoute la conso du pas concerné.

ensuite conso_jour se met à jour tout seul via suiviconso

Je ne comprenais pas pourquoi tu avais un ecart …donc finalement j’ai traduit les timestamp :

Et sauf erreur :
1742426999 =>20/03/2025 00:29:59 index hcmin =40 205
1742340599=>19/03/2025 00:29:59 index hcmax = 39 560

c’est normal qu’il ne soit pas égaux… tu aurait du prendre le hcmax du 19/03/2025 à 23:59:59… (1742425199) pour le comparer au hcmini du 20
Car dans ton approche il s’est passé 24h entre les deux datas

donc cela va dans le sens qu’il faut regarder le log du scenario pour les données mal ou pas injecté pour comprendre pourquoi…

C’est ce que j’ai fait justement non?

Pour moi c’est ce qu’il manque au scénario car ces Wh ne sont ni dans le max du 19 ni dans le mini du 20.

donc la journée du 20, avec la modif, à la fin suivi conso retranche le maxi du 20-40205 et non maxi du 20-39 000kWh comme c’était le cas avant, vu que la première donnée du 20 est celle de 00:00:00

edit : j’ai compris ce que tu as calculé… désolé je n’avais pas percuté.

mais attention la 1er info, a savoir l’index de départ du 20 est celui de 00:00:00 ou de 23:59:59

donc la data de 00:29:59 - celle de 00:00:00 donne la consommation de 00:00:01 à 00:30:00

Pas de souci.

En fait, j’ai percuté quand @superbricolo a dit que le plugin calcule entre le mini du jour J et le maxi.
Au final, le mini du 20 pour le plugin, c’était celui de 00:29:59 alors que ça aurait dû être celui de 23:59:59 puisqu’on enlève une seconde

c’est pour cela qu’il y a cette ligne technique à 00:00:00

Oui tout à fait mais dans ton script elle ne se mettait que sur la dernière date, du coup si tu mets n=15 par exemple, elle ne se met sur sur le dernier, là je l’ai remonté pour qu’elle se remettre sur chaque jour.

Mais je pense que le timestamp bloque les dernières journées, je ne sais pas trop comment on peut modifier ça

@superbricolo la clé primaire est uniquement sur le timestamp ou timestamp+ID équipement ?

Je pensais rajouter un If dans le script en disant
Si count (*) de la clé primaire>0 → on change la clé primaire (en ajoutant 1 au timestamp par exemple) mais ça me paraît dangeureux d’avoir la clé primaire uniquement sur timestamp ?
Un ID à rajouter aiderait peut-être ?