Hallo Zusammen,
ich habe eine API von Solarprognose.de in der ich Prognosedaten abrufe in Solaranzeige.
Könntet Ihr mir erklähren ob ich diese Werte auch in Symcon abfragen kann und wie ich das anstelle.
Beste Grüße und vorab schon mal vielen Dank
Hallo Zusammen,
ich habe eine API von Solarprognose.de in der ich Prognosedaten abrufe in Solaranzeige.
Könntet Ihr mir erklähren ob ich diese Werte auch in Symcon abfragen kann und wie ich das anstelle.
Beste Grüße und vorab schon mal vielen Dank
Schon länger her, aber hier bitte
<?php
function datenholen($typ,$start,$end)
{
$accesstoken="HIERDEINACCESSOKEN";
$mailadresse="DEINEMAILADRESSE";
$url="https://www.solarprognose.de/web/solarprediction/api/v1?access-token=".$accesstoken."&project=".$mailadresse."&type=".$typ."&_format=json&algorithm=own-v1&&start_day=".$start."&end_day=".$end;
$datenjson=file_get_contents($url);
return $datenjson;
}
$tageswerteid=40653; //Stringvariable mit dem Profil ~HTMLBox
$stundenwerteid=18894; //Stringvariable mit dem Profil ~HTMLBox
$starttag=0; //0 aktueller Tag
$endtag=5; //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);
Sieht dann so aus
Ich verwende aber den WwixSkin von @pitti
Hi Helmut,
gerade Dein Script gefunden - das ist ja mal ein Ding - mein Skin in Action ![]()
Eingebaut und funktioniert - Danke! Das mit dem Standort, Anlage usw. anlegen hat ein weng gedauert, aber dann hats sofort funktioniert!
Werde mich mal die Tage mit beschäftigen … das bekommt man doch noch schöner hin ![]()
Danke & schönes WE
Heiko
Super, wenn es funktioniert. Ich bin mit den Vorhersagen auch sehr zufrieden. Lediglich tiefer Nebel ist problematisch.
Und ja, deinen Skin verwende ich schon von Beginn an. Vorallem die schmalen Slider finde ich perfekt. Danke dafür ![]()
Gespannt ich bin, was du draus machst. Man könnte das ganze in Balken darstellen, wofür ich jetzt auch schon eine grundsätzliche Lösung habe.
Siehe hier:
Habe ja letztens mit Canvas und Zeichnen bei meinem Sonnengang-Script rumgespielt, werde ich wohl hier auch mal auspropieren ![]()
Du hast einen bezahlten Tarif, oder? Mehr Tage?
Gruß Heiko
Theoretisch
Ich hab mal den Tarif gewählt, eine Rechnung gibts nicht.
So, hat richtig lange gedauert weil eigentlich keine Zeit und immer nur 10-15 min dran gebaut … aber jetzt hab ich es erstmal für mich ![]()
Also nicht viel anders als Du schon vorgearbeitet bzw. angedacht hast!
Bei der aktuellen Leistung habe ich mit GitHub - typpo/quickchart-php: PHP client for QuickChart chart API rumgespielt ![]()
Danke für die klasse Vorarbeit!
Heiko
Schaut super aus. Wie machst du das mit den Säulen? Ich hab mich die Tage auch mit Säulen auseinandergesetzt und auch was „gabastelt“. Wobei ich ehrlich sagen muss, die reine Anzeige der Werte für den Tag ist übersichtlicher bzw. für mich schneller erfassbar.
ABER, die Anzeige der „Aktuellen Leistung“ gefällt mir. Muss ich mir anschauen bzw. hast da ein paar Schnipsel?
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:
Im Bild kannste den UpdateDaily (15sek nach Mitternacht) und den UpdateHourly (aller 15 sek nach voller Stunde) sehen
Hier der Timer-Code
// 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);
}
}
Die „Aktuelle Leistung“ mache ich über GitHub - typpo/quickchart-php: PHP client for QuickChart chart API. Einfach den Inhalt 1 zu 1 in ein Script packen und ferig!
Das Ergebnis lass ich mir als SVG in eine Stringvariable schreiben
mit ~HTMLBox Profil
<?php
$ID = 12345; // Stringvariable
// Quickchart Script file
require_once(IPS_GetKernelDir()."scripts".DIRECTORY_SEPARATOR.'System.QuickChart.ips.php');
$chart = new QuickChart(array(
'width' => 110,
'height' => 60,
'format' => 'svg'
));
$chart->setConfig("{
type: 'gauge',
data: {
datasets: [
{
data: [2500, 5000, 7500],
value: 3930,
minValue: 0,
backgroundColor: ['red', 'orange', 'green'],
borderWidth: 1,
},
],
},
options: {
legend: {
display: false,
},
title: {
display: false,
text: 'Aktuelle Leistung',
position: 'bottom',
},
needle: {
radiusPercentage: 0,
widthPercentage: 2,
lengthPercentage: 40,
color: '#c0c0c0',
},
valueLabel: {
fontSize: 8,
backgroundColor: 'transparent',
color: '#fff',
formatter: function (value, context) {
return value.toLocaleString('de-DE') + ' kWh';
},
bottomMarginPercentage: 10,
},
plugins: {
datalabels: {
display: 'auto',
formatter: function (value, context) {
return context.chart.data.labels[context.dataIndex/100];
},
color: '#fff',
font: {
weight: 'bold',
size: 6,
}
},
},
},
}");
SetValueString($ID, $chart->toBinary()) ;
Das wars eigentlich schon!
Melde Dich bei Fragen!
Heiko
Nachtrag: den Aggregationstyp für den Tageswert auf „Zähler“ stellen!!!
Danke an Heiko und Helmut für das Skript und weiteres.
@pitti
du verwendest auch das gleiche Skript wie Helmut oder hast du das auch abgeändert?
Jein ![]()
Also ja, Basis war und ist das Script von Helmut. Aber die Abfrage funktionierte nicht mehr, die API erwartet jetzt wohl noch eine ID (der Anlage …) als Query-Parameter.
Nachdem dann das Script soweit lief habe ich es in meinen "Style " transformiert.
Gruß Heiko
Ok, stellt sich mir noch die Frage wenn ich zwei Dachflächen benutze mit anderen Ausrichtungen, werde ich wohl das Skript nicht nutzen können.
Wieso nicht, man kann die Anlagen ja schön in solarprognose einrichten und bekommt dann unterschiedliche IDs pro Anlage. Entweder Script duplizieren, oder Logik einbauen um 2x die Anfrage mit unterschiedlichen IDs zu durchlaufen!
Gruß Heiko
Ok, werde mich mal die Tage damit beschäftigen und mich registrieren und die Anlage anlegen.
Bei mir war es etwas lustig nach dem Registrieren - man muss ja erst die Anlage(n) usw. anlegen.
Bis ich dahinter kam wie man das macht vergingen paar Minuten
Habe jedenfalls wild rumgeklickt! Glaube über Übersicht war dann erfolgreich!
Was und wo muss ich da noch im Skript ergänzen?
Ach, und die URL sieht bei mir so aus …
$SP_TOKEN = "<api-tocken>";
$SP_ITEM = 'location';
$SP_PROJECT = "<mail-adresse";
$SP_FORMAT = 'json';
$SP_TYPE = 'hourly';
$SP_ID = <anlagen-id>;
$SP_START = 0;
$SP_END = 1;
$url="https://www.solarprognose.de/web/solarprediction/api/v1?access-token=$token&project=$project&item=$item&id=$id&type=$typ&_format=$format&algorithm=own-v1&start_day=$start&end_day=$end";
Sehr eigenartig. Bei mir läuft das noch immer so wie ich es original gemacht hab.
Deswegen
Alternativ: Wenn Sie nur einen Standort haben, brauchen Sie item/id/token nicht zu senden, die API gibt dann automatisch Daten für den ersten Standort zurück