Anwendungsbeispiel JsonMod - SolCast Solar-Vorhersage abrufen

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

Vorheriges Thema - Nächstes Thema

freetz

Hallo zusammen und erst einmal ein großes Danke an @herrmannj für dieses klasse Modul! Das wird mir in Zukunft so einige Geräteabfragen vereinfachen.

Im Moment stehe ich vor einem etwas komplexeren Problem:
Ich möchte für die vorhersagebasierte Ladung der Batterie meiner Photovoltaik-Anlage die Solareinstrahlung von SolCast abrufen. Das Problem dabei ist, dass bei den Vorhersagedaten generell die nächsten 168 Halbstundenvorhersagen kommen, das entsprechende Datum wird dann auf untergeordneter Ebene mitgeliefert. Verkürzt sieht das Ganze dann so aus:
{
  "forecasts": [
    {
      "pv_estimate": "9.5",
      "pv_estimate10": "6",
      "pv_estimate90": "13.8",
      "period_end": "2018-01-01T01:00:00.00000Z",
      "period": "PT30M"
    },
    {
      "pv_estimate": "10",
      "pv_estimate10": "8",
      "pv_estimate90": "12",
      "period_end": "2018-01-01T12:30:00.00000Z",
      "period": "PT30M"
    }
  ]
}


Für die Vorhersage für den heutigen Solarertrag müsste ich also $.forecasts[0], $.forecasts[1] bis $.forecasts
  • einlesen und dann immer vergleichen, ob period_end noch dem heutigen Tag entspricht. Idealerweise müsste dabei noch dieser UTC-codierte Zeitstempel an die lokalen Zeitzone angepasst werden (oder umgekehrt).
    Für die Tagessumme müssten dann alle Werte des Tages aus pv_estimate (Werte in kWh) addiert werden und durch (60 / period) geteilt werden, weil die Werte nicht stündlich, sondern halbstündlich (bei kostenpflichtigen Paketen auch in noch geringeren Abständen) ausgegeben werden.

    Am Ende sollte dann ein (halb-)stündlich aktualisierter Wert stehen, der den voraussichtlich noch zu erwartenden Solarertrag ausgibt. Anhand dessen könnte man dann die Ladung der Batterie oder das Einschalten anderer Verbraucher steuern.

    Meine Frage ist jetzt, ob sich das irgendwie mit JsonMod umsetzen lässt, oder ob ich dafür doch ein eigenes Modul stricken muss. Momentan habe ich ein selbstgestricktes Python-Programm am Laufen, das das oben genannte macht, vielleicht hilft das noch zum Verständnis:
    https://github.com/fredlcore/SolarEdge_Predictive_Charging/

    Da ich sonst aber alles mit FHEM steuere, würde ich mich sehr freuen, wenn ich diese Funktionalität nicht auslagern müsste.

    Danke schon einmal für jeden Hinweis!
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

frober

Raspi 3b mit Raspbian Buster und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

freetz

#2
Ah, das ist schon mal ein guter Hinweis! Aber "nativ" wäre natürlich noch schöner :).
Ich habe jetzt mit
multi(jsonPath('$.forecasts[*]'), concat('pv_estimate_', index()), property('pv_estimate'));
eine Liste aller über 300 Einträge mit den jeweiligen Ertragsvoraussagen bekommen.
Wenn ich hier jetzt statt index() den Inhalt von period_end einsetzen könnte, dann ließen sich die Readings schon mal nach dem jeweiligen Tag filtern, und dann wäre das mit der Summierung auch schon mal einen guten Schritt einfacher...

EDIT: jsonPath('$.forecasts[index()].pv_period') anstelle von index() gibt leider einen Syntax Error
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

freetz

Yay, mit
multi(jsonPath('$.forecasts[*]'), concat('pv_estimate_', property('period_end')), property('pv_estimate'));
hat's geklappt - sehr schön :).
Ich denke, jetzt komme ich weiter, werde das Ergebnis dann aber gerne hier bei Interesse noch posten...
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

MadMax-FHEM

Zitat von: frober am 11 August 2021, 09:30:22
Du kannst Python direkt mit Fhem nutzen, vielleicht ist das eine Alternative
https://forum.fhem.de/index.php/topic,63816.60.html

Zitat von: freetz am 11 August 2021, 10:05:14
Ah, das ist schon mal ein guter Hinweis! Aber "nativ" wäre natürlich noch schöner :).

Evtl. eine (weitere) Alternative: https://forum.fhem.de/index.php/topic,115230.msg1094931.html#msg1094931

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

freetz

Sehr cool! ich bin mit Python an sich aber noch am Fremdeln (auch, weil ich seit über 20 Jahren Perl als erste Wahl beim Programmieren verwende), insofern würde ich erst einmal schauen, ob ich es auch mit "Bordmitteln" hinbekomme. Aber als Backup ist das eine sehr coole Option!
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

freetz

So sieht die (für diesen Teil) fertige Lösung aus, für alle, die es interessiert:
attr SolCast readingList multi(jsonPath('$.forecasts[*]'), concat('pv_estimate_', property('period_end')), property('pv_estimate'));;\
single(jsonPath('$.forecasts[0].period'),'period','');;
attr SolCast userReadings forecast_today {\
  my $total=0;;\
  my $period = ReadingsVal("SolCast", "period", 0);;\
  $period =~ s/.*(\d\d).*/$1/;;\
  my ($date, $time) = split(" ", FmtDateTime(time()));;\
  my $hash = $defs{$NAME};;\
  my $readings = $hash->{READINGS};;\
  foreach my $reading ( keys %{$readings} ) {\
    if ($reading =~ /$date/) {\
      my $val = ReadingsVal($NAME,$reading,0);;\
      $total += $val/(60/$period);;\
    }\
  }\
  return $total;;\
}
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

xerion

Bzgl. Solarprognose kann ich dir dieses Modul auch empfehlen, dann brauchst du nicht alles selber machen, was es schon gibt ;-)
https://forum.fhem.de/index.php/topic,117864.1155.html
Ich würde mich  freuen, wenn du meinen Einladungscode für Tibber, der Stromanbieter, der dir hilft, deinen Stromverbrauch zu verstehen und zu reduzieren, nutzt: https://invite.tibber.com/5fc08jbs. So bekommen wir beide 50 Euro und 100 % Ökostrom / https://geld-fuer-eauto.de/ref/334561880

freetz

Danke, ich glaube, da war ich bei meiner Recherche auch schon darauf gestoßen, aber das scheint alles auf DWD-Daten zu basieren. Der Punkt bei mir ist, dass die DWD-Daten im Tagesverlauf nur alle sechs Stunden aktualisiert werden, SolCast hingegen aktualisiert alle 30 Minuten. So sind die Werte für den gesamten Tag am Morgen noch relativ identisch, aber zum Nachmittag hin kommen doch Abweichungen von bis zu 20 Prozent zustande (bei mir zumindest). Das ist gerade für mein Anwendungsziel, wo ich die Batterie so spät wie möglich am Tag laden möchte, ein no-go, so dass ich DWD nur als Backup einsetzen würde, falls SolCast irgendwann auch für kleinere Installationen kostenpflichtig wird.

Da sich die Tagesprognose für SolCast dank JsonMod mit den oben genannten wenigen Zeilen in FHEM einbinden lässt, war der Aufwand zum Glück auch überschaubar. Vielleicht wäre das umgekehrt etwas, was die Modul-Maintainer übernehmen wollen würden, um mehrere Datenbasen anbieten zu können.
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

xerion

Es wäre vielleicht ganz hilfreich wenn du deine komplette Definition zur Verfügung stellen könntest damit haben es dann die nächsten Einsteiger einfacher.
Ich würde mich  freuen, wenn du meinen Einladungscode für Tibber, der Stromanbieter, der dir hilft, deinen Stromverbrauch zu verstehen und zu reduzieren, nutzt: https://invite.tibber.com/5fc08jbs. So bekommen wir beide 50 Euro und 100 % Ökostrom / https://geld-fuer-eauto.de/ref/334561880

freetz

Was meinst Du mit "kompletter Definition"? Welche DbLogExcludes, interval etc. ich da noch verwende, ist ja von Fall zu Fall unterschiedlich und verwirrt gerade Einsteiger vielleicht dahingehend, was denn nun das Relevante ist. Oder meinst Du alle damit zusammenhängenden Devices (DOIFs, SolCast Reporting, Max Eco Schalter zum vorzeitigen Batterieladen, Wechselrichter-Batterie-Anbindung)? Auch das ist ja am Ende ziemlich speziell auf meine Situation hier zugeschnitten.
Aber ich teile gerne, was sinnvoll erscheint...
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

xerion

#11
Als grundsätzlich meinte ich die defmod von dem JsonMod, das würde ja schon helfen wie ein Anfänger es definieren muss bzgl. der API. Dann wäre natürlich interessant wie du mit den den ganzen Daten (Readings)  weiter umgehst. Was berechnest du wie, auch wenn es auf dein System zugeschnitten hilft es m.E. um das System zu verstehen und sich ggf. selber davon Use Cases ableiten zu können.
Es gibt auch "halbe" Beispiele" über HTTPMOD. Du hast dich ja jetzt für JsonMod entschieden und bestimmt einen Grund dafür gehabt.

gerade im Bezug auf den Titel des Threads "Anwendungsbeispiel" fehlt mir der Kontext um aus diesen Einträgen ein komplettes Anwendungsbeispiel ableiten zu können.
Bitte nicht falsch verstehen, aber mit den Informationen könnte man kein Anwendungsbeispiel für SolCast ableiten. Hier geht es eher darum wie man ein usereading in JsonMod definiert.
Ich würde mich  freuen, wenn du meinen Einladungscode für Tibber, der Stromanbieter, der dir hilft, deinen Stromverbrauch zu verstehen und zu reduzieren, nutzt: https://invite.tibber.com/5fc08jbs. So bekommen wir beide 50 Euro und 100 % Ökostrom / https://geld-fuer-eauto.de/ref/334561880

freetz

Ich weiß nicht, ob das defmod wirklich den großen Unterschied macht, denn das besteht ja nur aus der URL, aber bitte:
defmod SolCast JsonMod https://api.solcast.com.au/rooftop_sites/xxx/forecasts?format=json&api_key=yyy
Wobei xxx durch die Site-ID und yyy durch den API Key ersetzt werden muss. Wer dies nicht direkt im Device speichern möchte, findet hier Alternativen:
https://forum.fhem.de/index.php/topic,109398.0.html

Wie man mit den Readings umgeht, ist ja eben sehr auf den Anwendungskontext zugeschnitten, das userReading "forecast_today" gibt zurück, wie viel prognostizierte Sonnenenergie für den Tag noch erwartet wird. Die Info kann mir schon reichen, wenn ich einfach nur Graphen pflegen will, ich kann damit die Ladung meines E-Autos aktivieren oder wie in meinem Fall das Aufladen des PV-Speichers zu einem bestimmten Zeitpunkt starten.

Insofern entspricht der Titel exakt dem, was das userReading macht: Es ruft über JsonMod die SolCast Solar-Vorhersage ab, und stellt diese für weitere Zwecke zur Verfügung, allerdings kumuliert für den Tag und nicht halbstundenweise, wie die Daten "roh" ankommen. Insofern ist es schon mehr, als nur ein userReading in JsonMod.

Im Endeffekt ist es so, wie bei Proplanta oder einem anderen Wetter-Modul auch. Da gibt es ja ebenfalls viele Einsatzmöglichkeiten, die sehr unterschiedlich ausfallen können, aber auch der Wert alleine (insbesondere, wenn er wie hier als kumuliertem Tageswert nicht direkt abrufbar ist) ist an sich schon aussagekräftig. Alles weitere, was ich damit mache, sind verschiedene DOIFs die basierend auf diesem Wert Aktionen starten. Da gibt es schon sehr viele, sehr gute Tutorials, als dass ich da noch etwas Sinnvolles beitragen könnte.

JsonMod habe ich gegenüber HTTPMOD bevorzugt, weil ich Readings generieren muss, deren Bezeichnung aus abgerufenen Werten bestehen und die dann wiederum einen anderen abgerufenen Wert zugewiesen bekommen. Konkret: Der Zeitstempel eines Wertes wird Teil des Namens des Readings, der eigentliche Solarertrag dann der Wert des Readings, und das für alle Einträge des Tages.
Kann gut sein, dass man das in HTTPMOD (was ich sonst auch gerne verwende) auch irgendwie hinbekommen hätte, aber so ist es mit einer attr-Zeile möglich, die Readings in die richtige Form zu bekommen. Das eigentliche userReading würde mit HTTPMOD genau so funktionieren, wenn man damit eine JSON-Struktur abgerufen und entsprechend umbenannt bekommt.
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

xerion

Danke für deine ausführliche Rückmeldung. Ich habe das jetzt mal mit den Informationen aus diesem Thread versucht aufzubauen und bekomme bei den userReading immer folgenden Fehler:

Error evaluating SolCast userReading forecast_today: Experimental aliasing via reference not enabled at (eval 233678) line 2.
Ich würde mich  freuen, wenn du meinen Einladungscode für Tibber, der Stromanbieter, der dir hilft, deinen Stromverbrauch zu verstehen und zu reduzieren, nutzt: https://invite.tibber.com/5fc08jbs. So bekommen wir beide 50 Euro und 100 % Ökostrom / https://geld-fuer-eauto.de/ref/334561880

xerion

Fehler gefunden, leider Copy&Paste Fehler, ein / war noch versteckt ;-)
Ich würde mich  freuen, wenn du meinen Einladungscode für Tibber, der Stromanbieter, der dir hilft, deinen Stromverbrauch zu verstehen und zu reduzieren, nutzt: https://invite.tibber.com/5fc08jbs. So bekommen wir beide 50 Euro und 100 % Ökostrom / https://geld-fuer-eauto.de/ref/334561880