Abfrage Solarprognose

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

1 „Gefällt mir“

Hi Helmut,

gerade Dein Script gefunden - das ist ja mal ein Ding - mein Skin in Action :loveips:

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 :innocent:

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 :slight_smile:

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 :slight_smile:

Du hast einen bezahlten Tarif, oder? Mehr Tage?

Gruß Heiko

Theoretisch :wink: Ich hab mal den Tarif gewählt, eine Rechnung gibts nicht.

1 „Gefällt mir“

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 :slight_smile:

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 :slight_smile:

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 :loveips:

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 Werte auf 0 zurücksetzt

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 :slight_smile: 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 :slight_smile:

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

1 „Gefällt mir“

Siehe hier …

1 „Gefällt mir“

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 :slight_smile: Habe jedenfalls wild rumgeklickt! Glaube über Übersicht war dann erfolgreich!

1 „Gefällt mir“

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";
1 „Gefällt mir“

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
1 „Gefällt mir“