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

Bonjour SuperBricolo,

J’ai fini par faire un scénario qui va tous les matins à 04h00 récupérer les consommations horaires au pas de 30’ de la veille dans l’historique du plugin Enedis et les injecter directement dans la table ‹ conso_teleinfo › du plugin-suiviconso
J’y ajoute en même temps le papp (c’est facile car c’est 2x la valeur du pas de 30’ de Enedis), le petc… et bientôt la t°.
A priori l’injection c’est bien passé, je suis même remonté jusqu’au 3 octobre 2023 , démarrage de mon abonnement tempo.

Je me doute que ce n’est pas forcement une utilisation prévue, mais après en avoir essayé plusieurs, c’est la seule qui pourrait ,à priori, donner, certes avec 1j de retard, la pleine puissance de cet outils dans le reporting. Et voir les évolutions des conso au pas de 30’.
Et pour moi dont le compteur est hors de portée d’une TIC c’est un peu la seule solution.

Question : est ce que le fait de ne pas ajouter de commande va bloquer la diggestion et le rendu des données des tableaux ?

Si oui comment faire pour ajouter des commandes qui ne crées pas de ligne dans la table ? -car cela biaise les index dans le scénarios actuel et prends de la place pour rien

merci

Bravo, pour l’intégration. A l’occasion ton script m’intéresse pour mettre dans la doc du plugin.
Sinon, pour tes questions, je ne sais pas, j’ai jamais essayé. Sans commande, est ce que le dashboard s’affiche? As tu testé?
Si cela ne fonctionne pas, on pourra faire une petite modif pour arranger ça

non je n’ai rien sur le dashboard. Je ne suis pas surpris car aucune commande n’a été crée finalement.
:grinning: je veux bien une petite modification pour arranger cela à l’occasion !!

Pour le script je le bascule sur ce fil dès que je finis sa V2 pour le rendre facile a utiliser. Je suis en train de le commenter et de modifier la détermination des couleurs pour taper non plus sur un virtuel mais sur le plugin Ecowat. Car Jeedom surprime tous les matins les données qui se répètent en suivant dans les historiques. Donc un Blue, Blue,Blue…il ne subsiste que le dernier à chaque fois… Je vais aller cherche HPJB/etc… de Ecowatt directement dans le scénario.

Correction du 13/01/2024
Alignement des injections à 29/59 au lieu de 00/30. cela permet de ne pas avoir à 00h00 la consommation de la veille pour 23h30-00h00 pris en compte dans le calcul du jour.
Ajout d’une ligne à 0 à 0h00 pour le bon fonctionnement. elle ne sert à rien dans les calculs mais est nécessaire pour le moment pour la synchro car crée un évènement sur la journée.

je laisse les logs pour le moment

Correction du 05/12/2023
régression corrigé , j’avais omis de remettre l’appel pour les derniers index dans la base.
j’ai laissé les logs pour le moment

Correction du 04/12/2023

  • corrige la couleur en prenant en compte la couleur de 06h00 à 05h59 le lendemain. au lieu de la journée
  • ne nécessite plus de modifier avec adminer les index de la table conso_teleinfo en supprimant « unique » pour timestamp

Restriction connues :

  • si pas de données dans ecowatt maintenant => le scenario s’arrête
    solutions : importer les données via un scenario, en respectant les heures (>06h00
    pour HPx et >22h00 pour HCx

Voici le script
<<<<<<<<<<<<c’est une beta>>>>>>>>>>> donc soyez prudent et surtout indulgent. C’est mon premier codage …je débute tout juste le php et le ‹ jeedom ›.

nécessite :

  • plugin suiviconso :grinning:… Vous créez un nouvel élément sur lequel vous ne cocher surtout rien afin qu’aucune commandes ne soient appelées
  • plugin Enedis
  • plugin Ecowat

Le bloc code

//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");

//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 !  :-)");      
 
       
 
         
 
      



Le timestamp est utilisée comme clé de recherche dans certains cas. Donc ce n’est pas une bonne idée de supprimer l’unicité du champs. Il vaudrait mieux en calculer un à partir de rec_date et rec_time

Sinon tu as essayé de faire "Synchroniser tout’ pour voir si les données de conso_teleinfo se propageait bien vers conso_jour, ce qui permettrait d’avoir un dashboard aevc les graphiques, je pense.

Pour le code soit lisible il faut que tu mettes des balises.Utilises cet icone quand tu rédiges le post
image
Cela donne un truc comme ça:
image

je l’ai supprimé car j’ai deux compteurs.
Donc je vais avoir systématiquement 2 entrées qui auront la même timestamp mais sur un id_equipement différent. Mais si je laisse l’unicité du timestamp, seule une des deux sera injecter dans la table.

Tu fais une différence 5 secondes entre les 2 équipements et ce sera réglé. En tout cas je vais regarder ton script et voir si je ne pourrais pas l’intégrer directement dans le plugin.
J’ai regardé vite fait en travers, mais tes infos tu les récupères sur l’historiques Jeedom? C’est ça?

j’ai trouvé pourquoi le dashboard n’affichait pas ce qu’il fallait. j’injectais en KWh et non en Wh
j’ai modifié le scénario

voici ce que j’obtient

avec 0 commande

oui c’est le plus simple que j’ai trouvé. Tous les matins à 04h00 (il me semble) le plugin Enedis incrémente les données de la veille dans l’historique.

C’est nickel. Du coup, il n’y a rien à faire pour que cela fonctionne, si ce n’est comme je disais avant, intégrer peut-être ton script comme mode possible pour l’intégration des données dans SuiviConso.

bonne idée que de l’intégrer.
Attends quelques jours que je finisse de l’éprouver.

Quelques idées de modification

1- la couleur du jour et la tarification n’apparaisse pas sur le dasboard car aucune référence n’est entrée dans l’équipement

2- la vue jour devrait être par défaut affichée sur la veille

3- la vue jour devrait être en conso et non en puissance ?

4- résolu, c’est deux valeurs une HT et l’autre TTC

5-pourquoi ne pas afficher les variations de puissance, via la donnée papp dans le bloc en haut à droite ?

6- et enfin as tu la possibilité de mettre des couts d’abonnements différents sur deux éléments différents ?.
j’ai deux compteurs, le premier 36kva et l’autre 9 kva

Ca devrait pouvoir se faire.

C’est à voir si je peux

Non, tu as le graphe 7 derniers jours pour cela

Ce tableau est prévu pour le fil de l’eau. Et comme là tu es sur des données de la veille, je ne vois pas l’intérêt. De plus il n’est pas assez grand pour tout afficher

C’est possible si tu utilises le type Prod Elect (C’est prévu pour la production, mais tu peux le détourner)

Salut,

Pour être tout à fait précis, le plugin Enedis effectue le 1er appel de la journée aléatoirement entre 3h01 et 6h59.

Ha !!! Ba mince alors !
Merci pour cette info, je vais programmer la récurrence du scénario à 07h00.

Idéalement il faudrait que je fasse un appel de date de collecte à 3h00 pour savoir si il lance ou non le scenario et resteste toute les 30’ ensuite jusqu’à succès…mais je ne suis pas sur d’y arriver facilement.

merci , vu ! par contre sauf si j’ai mal fait, il n’y a plus de facture… dommage

Si on peut avoir des factures, il faut juste créer les périodes correspondantes et dire que tu veux une facture

ok ! top !
merci

Bonjour,

Ce script pourrait-il être utilisé pour le compteur gaz via le plugin gazpar ? En effet j’avais essayé de créer un équipement qui prenait les infos remontées par le plugin, mais à moins que je n’ai pas compris et mal fait qqch, ça me remplissait la table teleinfo avec des valeurs identiques toutes les minutes. Insérer a posteriori que les quelques lignes pertinentes serait suffisant.

Bonjour,

il y a cela dans la table de remonté de GRDFconnect
image
Donc pas de conso horaire.
Importer la conso jour doit être faisable assez facilement… à priori… j’ai juste quelques journées d’expérience dans le codage et de connaissance de jeedom… par contre je ne sais pas quel rendu cela pourrait avoir sur suiviconso

Après importer régulièrement un fichier au pas horaire issue du site il suffit de prendre le tuto de superbricolo

Bonjour SuperBricolo

j’ai mis le script à jour pour corriger un problème de prise en compte des couleurs.
j’y ai laissé les logs pour le moment