
Envoyé de mon JSN-L21 en utilisant Tapatalk
Code : Tout sélectionner
// 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("#[Consommation][Puissance Instantanée][Production (API)]#")->getId();
$cmdpower = cmd::byId($cmdIdpower);
//$sizetime=sizeof($etime);
//$scenario->setlog("taille time : $sizetime");
//$sizepow=sizeof($eqpow);
//$scenario->setlog("taille power : $sizepow");
for($i = 0; $i < sizeof($etime); $i++) {
$timeread = date("Y-m-d H:i:s", strtotime("$etime[$i]"));
if ($timeread != "1970-01-01 01:00:00") {
$cmdpower->addHistoryValue($eqpow[$i],$etime[$i]);
$scenario->setLog("Ajout de la valeur $eqpow[$i] à $cmdIdpower pour $etime[$i]" );
}
else {
$scenario->setLog("Pas de valeur à ajouter" );
}
}
// dernier élément de temps
$fintime = end($etime);
// adaptation du format date pour le dernier élément de temps
$fintime = date("Y-m-d H:i:s", strtotime("$fintime"));
// update graphique dernière valeur reformatée
$fintime = date("d/m@H:i", strtotime("$fintime"));
$scenario->setData("last_time_api",$fintime);
$scenario->setLog("Dernière mise à jour à $fintime");
// notification en cas de problème
$maxTime = 7200; // temps en secondes - 2h maximum
$deltamaxTime = time() - $fintime; // on calcule le delta
if ($deltamaxTime > $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
}
$scenario->setData('monitor_api',$monitor_api_value); // et on passe à la variable pour jeedom
Code : Tout sélectionner
#!/bin/bash
sudo rm /var/www/html/montheme/flux_aps.json
curl -H "Content-Type: application/x-www-form-urlencoded" http://api.apsystemsema.com:8073/apsema/v1/ecu/getPowerInfo -d ecuId=MONIDdECU -d filter=power -d date=$1 -o /var/www/html/montheme/flux_aps.json
Code : Tout sélectionner
// definition du talon
$talon=550;
// récupération de l'ID pour la production "précise" par API
$cmdIdprod= cmd::byString("#[Consommation][Puissance Instantanée][Production]#")->getId();
// récupération de l'ID pour la consommation @5min (calcul par scénario indépendant)
$cmdIdconso= cmd::byString("#[Capteurs et Actionneurs][Compteur Linky Garage][PAPP]#")->getId();
// 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"));
$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);
// calcul du nombre de boucles : now - minuit par pas de 5 minutes et arrondi
$nowtoday = date("Y-m-d H:i:s");
$nowinit = date("Y-m-d 00:00:00");
$bouclemax = floor((strtotime($nowtoday) - strtotime($nowinit))/(5*60));
//$scenario->setLog("il est $nowtoday, j'ai donc $bouclemax boucles à calculer");
// récupération du talon de consommation le matin
$tempstalon = date("Y-m-d H:i:s", strtotime("today 05:55"));
$tempstalon5minbefore = date("Y-m-d H:i:s", strtotime("today 05:50"));
$ptalon = history::getStatistique($cmdIdconso, $tempstalon5minbefore, $tempstalon)["avg"];
// au cas où on vérifie si valeur erronée !
if ($ptalon > 750.0) {
$ptalon = $talon;
$scenario->setLog("Valeur du talon estimée : $talon");
}
else {
$scenario->setLog("Valeur du talon mesurée : $ptalon");
}
// définitions
$gain = 0;
$prodtotale = 0;
// on démarre à minuit et minuit 5 donc !
$temps = date("Y-m-d H:i:s", strtotime("today 00:05"));
$temps5minbef = date("Y-m-d H:i:s", strtotime("today 00:00"));
$scenario->setLog("Temps up/down : $temps / $temps5minbef");
for ($i = 0; $i < ($bouclemax+1); $i++) {
// calcul la consommation moyenne 5min avant jusqu'à la valeur de la production
$pcons5min = history::getStatistique($cmdIdconso, $temps5minbef, $temps)["avg"];
$pprod5min = history::getStatistique($cmdIdprod, $temps5minbef, $temps)["avg"];
//$scenario->setLog("@ $temps - Prod : $pprod5min Conso : $pcons5min");
// 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 = $pprod5min * 0.08333;
$prodtotale = $prodtotale + $pprodWh;
if ($pprod5min == 0) {
$gainup = 0;
$scenario->setLog("@ $temps - Prod nulle : $pprod5min alors $gain");
}
else if ($pcons5min == 0) {
$gainup = $talon;
$scenario->setLog("@ $temps - Prod non nulle : $pprod5min mais conso nulle $pcons5min alors talon $gain");
}
else {
$gainup = $pprod5min;
$scenario->setLog("@ $temps - Prod non nulle : $pprod5min 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");
// décalage des bornes de temps
$temps = date("Y-m-d H:i:s", (strtotime($temps)+(60*5)));
$temps5minbef = date("Y-m-d H:i:s", (strtotime($temps5minbef)+(60*5)));
}
// 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("gainproduction", $gain);
$scenario->setData("used_ratio", $ratio);
$scenario->setData("prodtotale", $prodtotale);
Code : Tout sélectionner
// definition du talon
$talon=550;
// récupération de l'ID pour la production "précise" par API
$cmdIdprodAPI= cmd::byString("#[Consommation][Puissance Instantanée][Production (API)]#")->getId();
// récupération de l'ID pour la consommation @5min (calcul par scénario indépendant)
$cmdIdconso= cmd::byString("#[Capteurs et Actionneurs][Compteur Linky Garage][PAPP]#")->getId();
// contre mesure avec la production totale avec le pulse compteur temps réel (moins précis)
//$cmdIdprod= cmd::byString("#[Consommation][Production][Conso Jour TOTAL]#")->getId();
// 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"));
$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"];
// au cas où on vérifie si valeur erronée !
if ($ptalon > 750.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("gainproduction", $gain);
$scenario->setData("used_ratio", $ratio);
$scenario->setData("prodtotale", $prodtotale);
Juste une petite correction en graswinhex a écrit : ↑24 juin 2019, 01:02tu parles de graphique ou de courbe ?
courbe je ne pense pas la chose faisable.
pour ton cas reunir les 2 selon l'actualisation
variable incrémente sur virtuel
ou event
ton scenario avec les 2 retours (pulse/api)
dans la valeur de la variable ou event
#timestamp#-valuedate(#api#,U)<300?#api#:#pulse#
Code : Tout sélectionner
<style>
/* presence 662 / HistoExt 709 / HistoLexique 710 / temperature 707 */
[data-plan_id="662"], [data-plan_id="710"] ,[data-plan_id="707"] {
display:none;
}
/* methode clip-path https://bennettfeely.com/clippy/ */
[data-plan_id="709"] {
position: absolute !important;
-webkit-clip-path: inset(5% 64% 95% 37%);
clip-path: inset(5% 64% 95% 37%);
}
</style>
Code : Tout sélectionner
var HistoExt = $('[data-plan_id="709"]');
HistoExt.show().css('clip-path','none');
Code : Tout sélectionner
<div>
<style>
[data-plan_id="795"] {
position: absolute !important;
-webkit-clip-path: inset(5% 64% 95% 37%);
clip-path: inset(5% 64% 95% 37%);
}
</style>
</style>
<button class="btn" ondblclick="test2();"onclick="test();">1clic / 2 clic = montre/cache pour le graph 795</button>
<script>
var graph795 = $('[data-plan_id="795"]');
function test() {
graph795.show().css('clip-path','none');
};
function test2() {
graph795.hide();
};
</script>
</div>
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 6 invités