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