Anwendungsbeispiel JsonMod - SolCast Solar-Vorhersage abrufen

Begonnen von freetz, 11 August 2021, 09:05:22

Vorheriges Thema - Nächstes Thema

J0EK3R

#45
Moinmoin Limes  :)

Vielen Dank für Deinen Beitrag!  :D
Den Tipp mit "&hours=72" habe ich gleich eingebaut!

Überseh' ich was, oder lässt Du in Deinem Code die Pufferung der bereits vergangenen Tageswerte weg?

In meinem Code in der foreach-Schleife in forecast_today:

        $hash->{Helper}{today}{$ttime} = $val;

und hier die Bildung der Tagessumme

my $values = $hash->{Helper}{today};;\
        my $total = sum values %{$values};;\
$total /= (60/$period);;\
return $total;;\


Denn - wenn Du beispielsweise stündlich die Werte von Solcast aktualisierst - wird die Tagessumme immer kleiner, weil Solcast nicht die Werte des kompletten Tages liefert, sondern ab dem aktuellen Zeitpunkt...

Beste Grüße
J0EK3R

limes1337

Hi J0EK3R,

sehr schön, dass ich auch ein bisschen mithelfen kann :-).

Du hast das Skript vollkommen korrekt verstanden. forecast_today speichert erst einmal nur die verbleibende Prognose bis zum Tagesende. Ich habe 3 Dachausrichtungen und die Werte für die 3 Sites werden stündlich von Solcast abgeholt. Dabei werden dann, wie Du weist die UserReadings ermittelt. Was ich im letzten Beitrag allerdings nicht erwähnt habe ist, dass ich ein weiteres Skript (PvForecast) habe, dass dann noch Berechnungen durchführt und die Zusammenfassung von allen 3 Dachseiten einen Dummy schreibt. Das ist dann meine Grundlage für alles weitere. Das Skript findest Du unten und es macht stündlich folgendes:

  • Grundsätzlich rechnet es die Vorhersagen für alle 3 Dachausrichtungen zusammen
  • Es ermittelt die Gesamtvorhersage für die PV Anlage für heute verbleibend ($today_fc_remaining). Und es errechnet den voraussichtlichen Gesamtertrag für heute in $today_fc_total, wobei outdoor.pv meine PV Anlage ist.
  • Es ermittelt die Gesamtvorhersage für die PV Anlage für morgen und übermorgen.
  • Es ermittelt einmal morgens zwischen 4 und 5 Uhr, die Gesamtvorhersage für die anstehenden 3 Tage und speichert die Vorhersage für heute separat in forecast_today_total_morning. Letzteres erlaubt mir eben einen Vergleich aus ursprünglicher Tagesvorhersage und tatsächlichem Ertrag. Die 3 Tages Vorhersage verwende ich für weitere Aktionen wie bspw. die Wallbox Steuerung (s. letzter Beitrag).

Ich hoffe das ist verständlich und macht Sinn  :) Ich habe das mal vor 3-4 Tagen aufgesetzt und es gibt sicherlich noch Bedarf für etwas Feinschliff. Mit dem Grundkonzept bin ich aber ganz zufrieden.

Schönen Feiertag,
limes


sub PVForecast ()
{
$today_fc_remaining = round(ReadingsVal("tech.online.solcast_so","forecast_today","0") + ReadingsVal("tech.online.solcast_so2","forecast_today","0") + ReadingsVal("tech.online.solcast_nw","forecast_today","0"),1);
$today_fc_total = round($today_fc_remaining + ReadingsVal("outdoor.pv","Daily_yield_kwh","0"),1);
$tomorrow_fc = round(ReadingsVal("tech.online.solcast_so","forecast_tomorrow","0") + ReadingsVal("tech.online.solcast_so2","forecast_tomorrow","0") + ReadingsVal("tech.online.solcast_nw","forecast_tomorrow","0"),1);
$overmorrow_fc = round(ReadingsVal("tech.online.solcast_so","forecast_overmorrow","0") + ReadingsVal("tech.online.solcast_so2","forecast_overmorrow","0") + ReadingsVal("tech.online.solcast_nw","forecast_overmorrow","0"),1);

fhem("setreading cellar.control.energy forecast_today_remaining $today_fc_remaining");
fhem("setreading cellar.control.energy forecast_today_total $today_fc_total");
fhem("setreading cellar.control.energy forecast_tomorrow $tomorrow_fc");
fhem("setreading cellar.control.energy forecast_overmorrow $overmorrow_fc");

if (strftime ("%H",localtime (time)) == 4)
{
fhem("setreading cellar.control.energy forecast_today_total_morning $today_fc_total");
$allDays_fc = $today_fc_total + $tomorrow_fc + $overmorrow_fc;
fhem("setreading cellar.control.energy forecast_3days $allDays_fc");
}

}

mähschaf

Guten Abend,

kurze Frage: Ich nutze seit ca. einem Monat SolCast. Der Forecast betrug die ganze Zeit eine Woche. Ich meine, 20 tägliche  Abfragen waren in meinem freien Account drin.

Dieser Fred hat mir echt geholfen, die Vorhersagen "einzusammeln". Danke dafür!

Heute habe ich festgestellt, dass die json API "nur" noch 2 Tage Forecast (+heute) liefert. Die Anzahl der täglichen Requests beträgt allerdings 50.

Ist da irgendetwas passiert, was ich nicht mitbekommen habe? Wird der Plan nach einem Monat evt. angepasst?

Danke für Eure Zeit,
Martin

J0EK3R

Moin Martin  :)

Hast Du am Ende der Url "&hours=72" stehen - das würde entsprechend einschränken?  ???


defmod SolCast_Sueddach JsonMod https://api.solcast.com.au/rooftop_sites/XXXX-YYYY-ZZZZ-AAAA/forecasts?format=json&api_key=ABC&hours=72


Beste Grüße
J0EK3R

mähschaf

Hallo J0EK3R,

danke für die Antwort!

Meine URL sieht so aus:
https://api.solcast.com.au/rooftop_sites/<id>/forecasts?format=json&api_key=<key>

Also ohne hour...

J0EK3R

...verrückte Idee:

Wie wäre es mit "&hours=174" oder eben entsprechend Deiner Wünsche!?  8)

mähschaf

Unglaublich. Klappt.

Mann, da hätte ich auch selber drauf kommen können. Aber da es vorher problemlos lief.....  ::)

DANKE!!! Und ein schönes Wochenende!

Mickey

Hi Limes, ich habe deine SUB übernommen und bekomme vor lauter Ahnungslosigkeit folgendes:

ZitatERROR:

Global symbol "$today_fc_remaining" requires explicit package name (did you forget to declare "my $today_fc_remaining"?) at ./FHEM/99_myUtils.pm line 21. Global symbol "$today_fc_total" requires explicit package name (did you forget to declare "my $today_fc_total"?) at ./FHEM/99_myUtils.pm line 22. Global symbol "$today_fc_remaining" requires explicit package name (did you forget to declare "my $today_fc_remaining"?) at ./FHEM/99_myUtils.pm line 22. Global symbol "$tomorrow_fc" requires explicit package name (did you forget to declare "my $tomorrow_fc"?) at ./FHEM/99_myUtils.pm line 23. Global symbol "$overmorrow_fc" requires explicit package name (did you forget to declare "my $overmorrow_fc"?) at ./FHEM/99_myUtils.pm line 24. Global symbol "$today_fc_remaining" requires explicit package name (did you forget to declare "my $today_fc_remaining"?) at ./FHEM/99_myUtils.pm line 26. Global symbol "$today_fc_total" requires explicit package name (did you forget to declare "my $today_fc_total"?) at ./FHEM/99_myUtils.pm line 27. Global symbol "$tomorrow_fc" requires explicit package name (did you forget to declare "my $tomorrow_fc"?) at ./FHEM/99_myUtils.pm line 28. Global symbol "$overmorrow_fc" requires explicit package name (did you forget to declare "my $overmorrow_fc"?) at ./FHEM/99_myUtils.pm line 29. Global symbol "$today_fc_total" requires explicit package name (did you forget to declare "my $today_fc_total"?) at ./FHEM/99_myUtils.pm line 33. Global symbol "$allDays_fc" requires explicit package name (did you forget to declare "my $allDays_fc"?) at ./FHEM/99_myUtils.pm line 34. Global symbol "$today_fc_total" requires explicit package name (did you forget to declare "my $today_fc_total"?) at ./FHEM/99_myUtils.pm line 34. Global symbol "$tomorrow_fc" requires explicit package name (did you forget to declare "my $tomorrow_fc"?) at ./FHEM/99_myUtils.pm line 34. Global symbol "$overmorrow_fc" requires explicit package name (did you forget to declare "my $overmorrow_fc"?) at ./FHEM/99_myUtils.pm line 34. Global symbol "$allDays_fc" requires explicit package name (did you forget to declare "my $allDays_fc"?) at ./FHEM/99_myUtils.pm line 35.

Kannst du mir (DUMMY) bitte Helfen?

Liebe Grüße, Michael
Zu mir:
Ich bin leider fast blind (EU Rentner) und nicht zu "faul" was nachzulesen. Bitte seht mir nach, wenn ich einmal zu viel frage oder auch mal Schreibfehler mache. Danke, Michael

limes1337

Hi Michael,

ich bin kein Perl Freak, aber ich vermute ich kann Dir helfen. Ich gehe davon aus, dass Du in Deinem myUtils irgendwo "use strict" eingebaut hast. Zur Folge musst Du Variablen auch strikt (um im Wortlaut zu bleiben) definieren, so ich Perl richtig verstanden habe. Mehr dazu lesen kannst Du bspw. hier:
https://perlmaven.com/global-symbol-requires-explicit-package-name

Im konkreten Beispiel heißt das einfach, dass Du in meinem Skript die Variablen mit einem "my" deklarieren musst. Oder um es Dir einfach zu machen, probier es mal damit:

sub PVForecast ()
{
my $today_fc_remaining = round(ReadingsVal("tech.online.solcast_so","forecast_today","0") + ReadingsVal("tech.online.solcast_so2","forecast_today","0") + ReadingsVal("tech.online.solcast_nw","forecast_today","0"),1);
my $today_fc_total = round($today_fc_remaining + ReadingsVal("outdoor.pv","Daily_yield_kwh","0"),1);
my $tomorrow_fc = round(ReadingsVal("tech.online.solcast_so","forecast_tomorrow","0") + ReadingsVal("tech.online.solcast_so2","forecast_tomorrow","0") + ReadingsVal("tech.online.solcast_nw","forecast_tomorrow","0"),1);
my $overmorrow_fc = round(ReadingsVal("tech.online.solcast_so","forecast_overmorrow","0") + ReadingsVal("tech.online.solcast_so2","forecast_overmorrow","0") + ReadingsVal("tech.online.solcast_nw","forecast_overmorrow","0"),1);

fhem("setreading cellar.control.energy forecast_today_remaining $today_fc_remaining");
fhem("setreading cellar.control.energy forecast_today_total $today_fc_total");
fhem("setreading cellar.control.energy forecast_tomorrow $tomorrow_fc");
fhem("setreading cellar.control.energy forecast_overmorrow $overmorrow_fc");

if (strftime ("%H",localtime (time)) == 4)
{
fhem("setreading cellar.control.energy forecast_today_total_morning $today_fc_total");
$allDays_fc = $today_fc_total + $tomorrow_fc + $overmorrow_fc;
fhem("setreading cellar.control.energy forecast_3days $allDays_fc");
}

}


Mickey

Hi Limes,

Zu dir: 10000000 mal DANKE - Das war echt einfach für meine Augen.

Ich habe noch ein my vor $allDays_fc
gemacht. Er hat jetzt kein "Error" mehr angezeigt.

Dummy cellar.control.energy ist angelegt

Wenn du Lust hast, kannst du es gerne kontrollieren:
Okay, okay - Sorry, wenn ich nerve.

sub PVForecast ()
{
my $today_fc_remaining = round(ReadingsVal("tech.online.solcast_so1","forecast_today","0") + ReadingsVal("tech.online.solcast_so2","forecast_today","0"),1);
my $today_fc_total = round($today_fc_remaining + ReadingsVal("outdoor.pv","Daily_yield_kwh","0"),1);
my $tomorrow_fc = round(ReadingsVal("tech.online.solcast_so1","forecast_tomorrow","0") + ReadingsVal("tech.online.solcast_so2","forecast_tomorrow","0"),1);
my $overmorrow_fc = round(ReadingsVal("tech.online.solcast_so1","forecast_overmorrow","0") + ReadingsVal("tech.online.solcast_so2","forecast_overmorrow","0"),1);

fhem("setreading cellar.control.energy forecast_today_remaining $today_fc_remaining");
fhem("setreading cellar.control.energy forecast_today_total $today_fc_total");
fhem("setreading cellar.control.energy forecast_tomorrow $tomorrow_fc");
fhem("setreading cellar.control.energy forecast_overmorrow $overmorrow_fc");

if (strftime ("%H",localtime (time)) == 4)
{
fhem("setreading cellar.control.energy forecast_today_total_morning $today_fc_total");
my $allDays_fc = $today_fc_total + $tomorrow_fc + $overmorrow_fc;
fhem("setreading cellar.control.energy forecast_3days $allDays_fc");
}

}


Ich habe nur 2 PV Dächer (Ost/West).

- Liebe Grüße, Michael
Zu mir:
Ich bin leider fast blind (EU Rentner) und nicht zu "faul" was nachzulesen. Bitte seht mir nach, wenn ich einmal zu viel frage oder auch mal Schreibfehler mache. Danke, Michael

Mickey

Hi Limes, ich nochmal

in der Not habe ich mir schnell 2 DOIF`s zusammengekloppt

defmod di_astro DOIF ([[Astro:NauticTwilightMorning]]) \
(setreading pv_forecast today_total [pv_forecas:today_remaining] )
attr di_astro DbLogExclude .*
attr di_astro do always
attr di_astro room Technik
attr di_astro stateFormat timer_01_c01


defmod di_pv_forecast DOIF ([tech.online.solcast_so1:forecast_today]) \
(setreading pv_forecast today_ost [tech.online.solcast_so1:forecast_today] )\
(setreading pv_forecast tomorrow_ost [tech.online.solcast_so1:forecast_tomorrow] )\
(setreading pv_forecast overmorrow_ost [tech.online.solcast_so1:forecast_overmorrow] )\
(setreading pv_forecast today_west [tech.online.solcast_so2:forecast_today] )\
(setreading pv_forecast tomorrow_west [tech.online.solcast_so2:forecast_tomorrow] )\
(setreading pv_forecast overmorrow_west [tech.online.solcast_so2:forecast_overmorrow] )
attr di_pv_forecast DbLogExclude .*
attr di_pv_forecast do always
attr di_pv_forecast room Technik


ZitatHeute verbleibend 0.0 Kw
Heute today_total Kw
Morgen 11.5 Kw
Übermorgen 18.5 Kw

Ich glaube, es hätte funktioniert - Nur deine Lösung ist Eleganter.

- Liebe Grüße, Michael
Zu mir:
Ich bin leider fast blind (EU Rentner) und nicht zu "faul" was nachzulesen. Bitte seht mir nach, wenn ich einmal zu viel frage oder auch mal Schreibfehler mache. Danke, Michael

Klinki

Moin Forum,

Seit zwei Tagen hole ich mir auch meine Daten von Solcast in´s fhem. Ein dickes Danke für eure Entwicklung!

Da ich ein Split-Array (Solar-Panels mit Ausrichtung OST/West auf dem Dach) habe, sind die Prognosen prinzipbedingt ungenau. Auf der Solcast-Seite werden dazu verschiedene Ansätze beschrieben. Letzten Endes wird aber nur helfen zwei Sites zu definieren und die Summe zu bilden.
Dann muss natürlich auch die Anzahl der täglichen Abfragen reduziert werden.
Oder fällt hierzu noch jemandem etwas Schlaueres ein?

Gruß,
klinki

limes1337

Hi klinki,

wie Du korrekt beschreibst, machen 2 Sites in Deinem Fall Sinn.
Es gab hier zwar schon Diskussionen darüber, aber nach meinem Verständnis hat man mit einem Free Account 50 kostenlose Abfragen pro Tag. Davon ausgehend, ein paar Gedanken, die sich sogar ergänzen:

  • Wenn man einmal stündlich abfragt, kommt man bei 2 Sties auf 2 x 24 = 48 Abfragen - sollte also passen.
  • Ansonsten kann man sich die Abfragen zwischen Sonnenuntergang und -aufgang eigentlich sparen - ob man das zeitlich steuert oder über sunrise, o.ä. sei jedem selbst überlassen
  • Für alles weitere - einfach einen zweiten Account mit neuer Mailadresse anlegen  :)

Grüße,
limes

DS_Starter

Moin,

Zitat
Ansonsten kann man sich die Abfragen zwischen Sonnenuntergang und -aufgang eigentlich sparen - ob man das zeitlich steuert oder über sunrise, o.ä. sei jedem selbst überlassen
In der Art habe ich die Steuerung der API-Calls in das Solarforecast Modul eingebaut.
LG
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Klinki

#59
Ich hatte 10 Abfragen / Tag im Kopf. Du hast Recht: es sind 48 und die reichen auch. Abfragen mit Astro-Funktion zu koppeln ist also nicht nötig. Im Gegenteil: Ich finde es spannend, wenn die Wärmpepumpe um 6 Uhr morgens die Ansage bekommt mit der Erzeugung bis 10 Uhr zu warten.
Ja, klar, ein Minimum an Heiz-Speicher-Ladung muss natürlich vorhanden sein.

Ansonsten habe ich mir die Sache sehr einfach gemacht: Die Daten für beide Sites (Ost/West) werden heruntergeladen und in einem neuen Dummy einfach summiert. Mit DOIF. Einfach. Funktioniert!

Nach dem Forecast richten sich dann die Soll-Temperaturen und ob nur (WAF-)relevante Heizkörper aufgehen. Weiter wird die WasserSpeichertemperatur auf ein Minimum gesenkt und die Wärmepumpe richtet ihre Modulations- bzw. Leistungsvorgabe entsprechend ein.
Noch nicht ausgegoren - aber funktionabel und: es wird bares Geld gespart!

@DS_Starter: Schaue mir grad Dein Modul näher an. Bin kein Perl-Experte - aber da steckt viel Arbeit drin!

Alles Gute,
klinki

Nachtrag: das SolarForecast-Modul ist ja genial! Nach zwei Stunden kann man "nur" den Funktionsumfang und nicht die Vorhersage bewerten. Nach einer Aufbereitung dieser Art suche ich schon lange. Danke dafür!