Ok, habe es wieder geändert, aber Problem bleibt weiter hin. Habe jetzt auch die url verändert:
$url="https://www.solarprognose.de/web/solarprediction/api/v1?access-token=$SP_TOKEN&project=$SP_PROJECT&item=$SP_ITEM&id=$SP_ID&type=$typ&_format=$SP_FORMAT&algorithm=own-v1&start_day=$start&end_day=$end";
Ich habe es dir komplett mit meinen Daten per PN geschickt.
<?php
function datenholen($typ,$start,$end)
{
$SP_TOKEN = "xxxxxxxxxx";
$SP_ITEM = 'location';
$SP_PROJECT = "xxxxxxxxx";
$SP_FORMAT = 'json';
$SP_TYPE = 'hourly';
$SP_ID = 'xxxx';
$SP_START = 0;
$SP_END = 4;
$url="https://www.solarprognose.de/web/solarprediction/api/v1?access-token=$SP_TOKEN&project=$SP_PROJECT&item=$SP_ITEM&id=$SP_ID&type=$typ&_format=$SP_FORMAT&algorithm=own-v1&start_day=$start&end_day=$end";
$datenjson=file_get_contents($url);
return $datenjson;
}
$tageswerteid=10605; //Stringvariable mit dem Profil ~HTMLBox
$stundenwerteid=38649; //Stringvariable mit dem Profil ~HTMLBox
$starttag=0; //0 aktueller Tag
$endtag=4; //die nächsten Tage
//Tagesdaten aufbereiten
$daten=json_decode(datenholen("daily",$starttag,$endtag),true); //Start- und Endtag an den eigenen Tarif anpassen
//$daten=json_decode($daten_taeglich,true);
$Liste_HTML = "";
$Liste_HTML = $Liste_HTML."<table class=\"wwx\" border=\"1\" style=\"width:100%\">";
$Liste_HTML = $Liste_HTML."<tr>";
$Liste_HTML = $Liste_HTML."<thead class=\"blue\">";
//Tageswerte Kopf
for ($i=$starttag; $i<=$endtag; $i++)
{
$Liste_HTML=$Liste_HTML."<th><center>".date("d.m.Y",time()+(3600*24)*$i)."</center></th>";
}
$Liste_HTML=$Liste_HTML."</tr></thead>";
//Tageswerte Zeile
$Liste_HTML=$Liste_HTML."<tr>";
for ($i=$starttag; $i<=$endtag; $i++)
{
$Liste_HTML=$Liste_HTML."<td><center>".$daten["data"][date("Ymd",time()+(3600*24)*$i)]." kWh</center></td>";
}
$Liste_HTML=$Liste_HTML."</tr></table";
setvalue($tageswerteid,$Liste_HTML);
//Stündliche Daten
$daten=json_decode(datenholen("hourly",$starttag,$endtag),true);
$i=0;
$Liste_HTML = "";
$Liste_HTML_erg="";
$Liste_HTML_ergs="";
$datum=0;
$zeit=0;
$Liste_HTML = $Liste_HTML."<table class=\"wwx\" border=\"1\" style=\"width:100%\">";
//var_dump($daten["data"]);
foreach ($daten["data"] as $stunde)
{
//Datum aus dem Array Index ermitteln
$timestamp=array_keys($daten["data"])[$i];
if ($datum!=date("d.m.Y",$timestamp))
{
//ab Zeile 2 die vorige Zeile anhängen und die Zeitenzeile schließen
if ($i>0)
{
$Liste_HTML=$Liste_HTML."</tr></thead>";
$Liste_HTML_erg=$Liste_HTML_erg."</tr>";
$Liste_HTML_ergs=$Liste_HTML_ergs."</tr>";
$Liste_HTML=$Liste_HTML.$Liste_HTML_erg.$Liste_HTML_ergs;
$Liste_HTML_erg="";
$Liste_HTML_ergs="";
}
//Datumskopf
$datum=date("d.m.Y",$timestamp);
$Liste_HTML=$Liste_HTML."<tr><thead class=\"blue\"><th colspan=\"11\"><center>".date("d.m.Y",$timestamp)."</center></th></thead></tr>";
//Beginn Kopf für Zeiten
$Liste_HTML=$Liste_HTML."<tr><thead class=\"blue\">";
$Liste_HTML_erg=$Liste_HTML_erg."<tr>";
$Liste_HTML_ergs=$Liste_HTML_ergs."<tr>";
}
//Zeiten
if ($zeit<strtotime(date("G:i:s",$timestamp)))
{
$zeit=strtotime(date("G:i:s",$timestamp));
$Liste_HTML=$Liste_HTML."<th><center>".date("G:i",$timestamp)."</center></th>";
$Liste_HTML_erg=$Liste_HTML_erg."<td>".$stunde[0]." kW</td>";
$Liste_HTML_ergs=$Liste_HTML_ergs."<td>".$stunde[1]." kWh</td>";
}
else
{
$zeit=0;
$Liste_HTML=$Liste_HTML."<tr><thead class=\"blue\">";
$Liste_HTML=$Liste_HTML."<th><center>".date("G:i",$timestamp)."</center></th>";
$Liste_HTML_erg=$Liste_HTML_erg."<tr>";
$Liste_HTML_ergs=$Liste_HTML_ergs."<tr>";
$Liste_HTML_erg=$Liste_HTML_erg."<td>".$stunde[0]." kW</td>";
$Liste_HTML_ergs=$Liste_HTML_ergs."<td>".$stunde[1]." kWh</td>";
}
$i++;
}
//letzte Zeile anhängen
$Liste_HTML=$Liste_HTML."</tr></thead>";
$Liste_HTML_erg=$Liste_HTML_erg."</tr>";
$Liste_HTML_ergs=$Liste_HTML_ergs."</tr>";
$Liste_HTML=$Liste_HTML.$Liste_HTML_erg.$Liste_HTML_ergs;
$Liste_HTML = $Liste_HTML."</table>";
setvalue($stundenwerteid,$Liste_HTML);
Ich habe gestern auch mal in den Tarif Premium gewechselt mit 60 Abfragen am Tag.
Hat sich jetzt geklärt, hatte anstatt die Standort ID die Anlagen ID im Skript. Großes Danke an pitti
@pitti
Kann man oben deinen Timer Code für das normale Skript auch nutzen oder nur mit deiner angepassten Version?
Danke -aber Du hast ja super vorgearbeitet
Das mit den Säulen hat tatsächlich etwas gedauert bis ich es so hatte wie ich wollte.
Was mache ich:
da man nur 20 API Calls hat rufe ich nur die stündlichen Werte ab
das mache ich per Event in einem täglichen Zeitfenster von 5 bis 21 Uhr (vielleicht im Sommer nachschärfen)
den Tageswert bekommt man ja durch aufsummieren oder über den letzten Stundenwert eines Tages
habe mir einen Mitternachtstimer gestellt der 15 Sekunden im neuen Tag die…
Hi Heiko,
sieht ja wirklich großartig aus. ich würde das auch gerne installieren. Welches Skript sollte man jetzt nehmen, also welche funktioniert? Dein Skript würdest du nicht posten?
pitti:
Kannst du verraten wie das mit den Balken funktioniert oder ist das eher Top Secret?
Gefällt mir sehr sehr gut und ist übersichtlich.
Danke schon mal und Grüße
Stephan
1 „Gefällt mir“
pitti
22. Februar 2023 um 19:57
67
Hi Stephan,
Du bist nicht der Erste der nach dem Script frage
Kann ich schon machen, aber ist nicht so ein ‘ich führ das mal aus und alles geht’. Da muss man halt noch etwas Hand anlegen.
Timer anlegen
Archivierung aktivieren und einstellen
Quickchart Klasse installieren/hinterlegen
WebFront gestalten
Um nur paar Dinge zu nennen.
Ich kann das gern morgen mal einstellen wenn es @Proxima recht ist.
Will da nicht dazwischenfunken.
Meinst Du das Balkendiagramm, das ist ganz normales IPS - nix Geheimnisvolles. Die Befüllung der Archivvariable war etwas tricky weil über den Tag kann die Prognose auch mal nach unten gehen und das mögen Zählervariablen nicht so richtig.
Gruß Heiko
4 „Gefällt mir“
Proxima
22. Februar 2023 um 20:17
68
Mir ???
Klar ist mir das recht. Ich war ja nicht der Urheber des Ausgangsscripts. Und um ehrlich zu sein, gefällt mir die Art, wie Du das Thema visualisiert hast. Das würde ich ebenfalls nachbauen wollen.
Speziell das installieren/hinterlegen der Quickchart Klasse ist mir nicht klar.
Was zeigt die aktuelle Leistung an? Die Leistung des/der Wechselrichter?
Grüße
1 „Gefällt mir“
Hallo Heiko,
vielen Dank, ich würde mich sehr freuen wenn du dein Skript bereitstellen würdest.
Auch wenn es nicht unbedingt Plug & Play ist würde ich es doch gerne versuchen .
Mich würde auch interessieren was die aktuelle Leistung anzeigt?
Viele Grüße
Stephan
pitti
23. Februar 2023 um 08:00
70
Moin,
das mit der „Aktuellen Leistung“ war bissle Spielerei bzw. Vorbereitung auf meine PV-Anlage. Im Moment wird da nur die aktuelle Stundenprognose verwendet Kann man also an dieser Stelle auch weglassen.
Gruß Heiko
yansoph
23. Februar 2023 um 11:25
71
Bei diesem Bedarf würde sich beinahe ein Modul lohnen…
Wenn es jemand machen will, gerne. Aus meinen Basteleien kann genommen werden was gebraucht wird. Ich hab damit kein Problem.
1 „Gefällt mir“
pitti
23. Februar 2023 um 14:10
73
Ha, sorry - das Originalscript kommt ja von Dir - hatte es verwechselt
Gruß Heiko
1 „Gefällt mir“
pitti
23. Februar 2023 um 15:04
74
So, wer mehr über die Chart-Darstellung wissen möchte => Pitti's erste Skript-Bibliothek - #4 von pitti
Gruß Heiko
1 „Gefällt mir“
Hallo Heiko,
bei deinem Timer Event passiert bei mir nichts bzw. wenn ich das Skript ausführe
// TIMER EVENT
else if($_IPS['SENDER'] == "TimerEvent") {
$event = IPS_GetName($_IPS['EVENT']);
if($event == 'UpdateDaily') {
// Midnight reset to 0
$vid = CreateVariableByName($_IPS['SELF'], 'Tagesprognose', 2);
SetValue($vid, 0);
$vid = CreateVariableByName($_IPS['SELF'], 'Stundenprognose', 2);
SetValue($vid, 0);
} elseif($event == 'UpdateHourly') {
// from 05:00 to 21:00
$data = UpdateForecast($SP_TOKEN, $SP_PROJECT, $SP_ITEM, $SP_ID, $SP_HOURLY, $SP_FORMAT, $SP_START, $SP_END);
// aktuellen Werte abgleichen wenn notwendig
$vid = CreateVariableByName($_IPS['SELF'], 'Tagesprognose', 2);
$ad = GetValue($vid);
if($ad != $data['Tageswert']) {
SetValue($vid, $data['Tageswert']);
}
$vid = CreateVariableByName($_IPS['SELF'], 'Stundenprognose', 2);
SetValue($vid, $data['Stundenwert']);
// SVG Chart
$vid = CreateVariableByName($_IPS['SELF'], 'Aktuelle Leistung', 3);
$svg = DrawChart($data['Stundenwert']);
SetValue($vid, $svg);
// HTML Table
$html = BuildHtml($data);
$vid = CreateVariableByName($_IPS['SELF'], 'Vorhersage', 3);
SetValue($vid, $html);
}
}
Das else if am Anfang ist glaube ich falsch oder?
pitti
23. Februar 2023 um 16:52
76
Zeig doch mal deine Timer (Screenshot Objectbaum)!
pitti
23. Februar 2023 um 16:53
77
Ahh Quatsch, das war doch nur ein Ausschnitt von meinem Script! Das passt doch gar nicht zu dem Original?!?!
Hatte ich mir gedacht, deshalb hatte ich oben gefragt ob der Timer Code nur zu deinem Skript passt.
Bei mir sind die Prognosedaten ziemlich daneben. Gestern Prognose 10,3 kWh und habe jetzt 17,1 kWh aktuell. Vorgestern war es noch mehr, da war es fast das doppelte von der Prognose her.
pitti
24. Februar 2023 um 15:52
80
Hmm, da bin ja dann gespannt wenn mal meine Anlage produziert!
Aber sei doch froh - schlimmer wenn anders herum
Ich bin noch nicht dazu gekommen das Script online zu stellen. Bin derzeit etwas überbeansprucht - kann erst Ende nächster Woche werden, aber es bringt ja auch nix es online zu stellen und ich kann nicht supporten!
Gruß Heiko
1 „Gefällt mir“
Hauptsache das Skript kommt
Weiß jetzt auch nicht in wie weit man einen Verlust mit einrechnen muss was die Anlage macht.