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 :