FHEM > Automatisierung

Anwendungsbeispiel JsonMod - SolCast Solar-Vorhersage abrufen

<< < (6/6)

freetz:
Ja, da steht, dass es das Tuning (schon länger) nicht mehr gibt, aber angeblich für Bestandskunden weiter angeboten wird. Ich bin aber erst seit Juli dabei, also nach der Ankündigung von oben und kann sagen, dass bei mir zuerst da stand, dass noch zu wenige Daten da sind, aber nach einiger Zeit gab's dann den grünen Haken (s. Anhang).
Ist aber letztlich für die Fragestellung egal, denn das Tuning soll ja eher so Faktoren wie Verschattung etc. berücksichtigen. Das fällt i.d.R. aber nicht so extrem ins Gewicht, zumindest nicht so deutlich wie die Unterschiede zwischen DWD und SolCast Vorhersage auch ohne Tuning schon waren.

Mit Deinem Schnipsel kann ich jetzt auf die Schnelle nichts anfangen, hier ist meine entsprechende FHEM Config:


--- Code: ---defmod SolCast_Reporting HTTPMOD https://api.solcast.com.au/rooftop_sites/... 0
attr SolCast_Reporting bodyDecode utf-8
attr SolCast_Reporting extractAllJSON 1
attr SolCast_Reporting replacement01Mode expression
attr SolCast_Reporting replacement01Regex {{([^}]+)}}
attr SolCast_Reporting replacement01Value ReadingsVal($name, $1, "")
attr SolCast_Reporting room Solar
attr SolCast_Reporting set01Data {"measurement": {"period_end": "{{period_end}}","period": "{{reporting_interval_ISO8601}}","total_power": $val}}
attr SolCast_Reporting set01Name pvProduction
attr SolCast_Reporting setHeader1 Content-Type: application/json
attr SolCast_Reporting setHeader2 Accept: */*
attr SolCast_Reporting stateFormat [SolCast_Reporting:value]
attr SolCast_Reporting userReadings reporting_interval {ReadingsVal($NAME, "reporting_interval", 300)},\
reporting_interval_ISO8601 {return "PT" . ReadingsVal($NAME, "reporting_interval", 300) / 60 . "M"},\
period_end {return strftime('%Y-%m-%dT%H:%M:%SZ', gmtime(time))}\

--- Ende Code ---


--- Code: ---defmod di_reset_production DOIF ([+[SolCast_Reporting:reporting_interval]]) \
(setreading SolCast_Reporting period_end {strftime('%Y-%m-%dT%H:%M:%SZ', gmtime(time))},\
set SolCast_Reporting pvProduction {(ReadingsVal("BydBattery","avg_production","N/A")/1000)},\
setreading BydBattery avg_production_counter 0,\
setreading BydBattery avg_production 0,\
setreading BydBattery avg_production_sum 0)
--- Ende Code ---

Und hier noch der Ausschnitt aus dem userReading des Batterie-Devices "BydBattery":


--- Code: ---avg_production_counter:Meter_Power.* {
  ReadingsVal($NAME,"avg_production_counter",0)+1;
},

avg_production_sum:Meter_Power.* {
  ReadingsVal($NAME,"avg_production_sum",0) + ReadingsVal($NAME, "pvProduction",0);
},

avg_production:Meter_Power.* {
  my $aps = ReadingsVal($NAME,"avg_production_sum",0);
  my $apc = ReadingsVal($NAME, "avg_production_counter", 0);
  if ($apc > 0) {
    return sprintf("%.1f", $aps/$apc);
  } else {
    return 0;
  }
}
--- Ende Code ---

Ich hoffe, das hilft weiter...

ansgru:
Hier als mal der Monat November dargestellt: grün ist der tatsächliche Ertrag, Pink die Prognose (jeweils am Vorabend um 22h ermittelt). So richtig zuverlässig sind die Prognosen nicht... Ich bin jetzt parallel mit SolarForecast (ist ein FHEM Modul) am schauen und kann dann in 1-2 Monaten einen Vergleich anstellen.

sig10680:

--- Zitat von: ansgru am 17 Oktober 2021, 10:55:47 ---Danke dir freetz für deine Arbeit! Ich habe diese etwas weiterentwickelt und zusätzlich noch ein UserReading für morgen erstellt sowie eine Funktion, welche bei jedem Aufruf die aktuellen Prognosewerte in einen dblog schreibt. Historische Werte werden dabei belassen, es werden nur die abgerufenen Werte überschrieben. Hintergrund: so kann ich mir einen Graphen plotten der mir eine Vorhersage liefert, aber auch einen Rückblick damit ich schauen kann, wie gut die Prognose stimmt. Das UserReading für morgen brauche ich um z.B. am Abend vorher gewisse Grossverbraucher mit dem günstigen Nachttarif laufen lassen zu können falls der prognostizierte Solarstrom nicht reichen sollte.

Hier das UserReading:


--- Code: ---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;
},
forecast_tomorrow {
use Time::Piece ();
use Time::Seconds;

my $total = 0;
my $period = ReadingsVal("SolCast", "period", 0);
$period =~ s/.*(\d\d).*/$1/;
my ($date, $time) = split(" ", FmtDateTime(time()));
my $date = Time::Piece->strptime($date, '%Y-%m-%d');
$date += ONE_DAY;
$date = $date->strftime('%Y-%m-%d');
my $hash = $defs{"SolCast"};
my $readings = $hash->{READINGS};
foreach my $reading (keys %{$readings}) {
if ($reading =~ /$date/) {
my $val = ReadingsVal("SolCast", $reading, 0);
$total += $val/(60/$period);
}
}
return $total;
}

--- Ende Code ---

Und hier die Funktion um die Vorhersage im dblog zu speichern (gehört in MyUtils):


--- Code: ---# Braucht 3 Argumente: $name = Name des "Solcast" Devices, $dblog und $dbrep Namen der dblog/dbrep Devices. Bei jedem Aufruf wird der Forecast für morgen sowie alle aktuellen Prognosewerte gespeichert. Die Prognosewerte werden dabei überschrieben, alte Werte bleiben bestehen
sub forecast_in_DB_speichern($$$) {
my ( $name, $dblog, $dbrep ) = @_;
my $val = ReadingsVal($name, "forecast_tomorrow", 0);
my $time = strftime('%Y-%m-%d %H:%M:%S', localtime(time + 86400));
fhem("set ".$dblog." addCacheLine $time|$name|JSONMOD|forecast|forecast|$val");
my %hash = %{$defs{$name}{READINGS}};
my @pv_estimates = sort grep /pv_estimate/, keys %hash;
# Max/Min Forecast Zeitpunkt ermitteln
$pv_estimates[-1] =~ m/pv_estimate_(.*)/;
my $max = str2time($1);
$pv_estimates[0] =~ m/pv_estimate_(.*)/;
my $min = str2time($1);
# Alle alten Werte löschen die aktualisiert werden sollen
fhem("set ".$dbrep." sqlCmd DELETE FROM `history` WHERE DEVICE = '".$name."' AND `TIMESTAMP` >= FROM_UNIXTIME(".$min.") AND `TIMESTAMP` <= FROM_UNIXTIME(".$max.")");

foreach my $reading (@pv_estimates) {
$reading =~ m/pv_estimate_(.*)/;
$time = strftime('%Y-%m-%d %H:%M:%S', localtime(str2time($1)));
$val = ReadingsVal($name, $reading, 0) * 1000;
fhem("set ".$dblog." addCacheLine $time|$name|JSONMOD|pv_estimate|pv_estimate|$val");
}
}

--- Ende Code ---

Die eigentliche Speicherung erfolgt dann in einem at:


--- Code: ---defmod at_SolCast_Prognose_speichern at *22:00 {forecast_in_DB_speichern('SolCast','dblog','DB_Bereinigung_Kostal')}
--- Ende Code ---

Prognosen siehe Anhang. Es besteht noch Optimierungsbedarf, im Moment habe ich alle meine Module (O, S & W) zusammengefasst zu einer Anlage (Südausrichtung). Wenn ich Zeit und Lust habe, splitte ich das auf 3 Anlagen mit der korrekten Ausrichtung und Neigung und aktualisiere dann meinen Code. Was mir auch schon aufgefallen ist: Nebel/"grauer Himmel" wird nicht richtig prognostiziert, so ist z.B. bei uns im Moment Hochnebel und der PV Ertrag entsprechend gering, das spiegelt sich aber nicht in der SolCast Prognose wieder (siehe auch 10. Oktober, das war auch so ein Tag wo bis am Mittag Hochnebel herrschte). Die DWD Werte kann ich leider nicht benutzen da keine Station bei mir in der Nähe ist.

--- Ende Zitat ---

Hallo,
ich habe bei mir auch Solcast mit JsonMod eingebunden und es läuft!
Würde auch ein Plot mir Vorhersage ohne DBlog funktionieren! Wenn ja wie müsste man dies anstellen!

mfg Sig10680

Navigation

[0] Themen-Index

[*] Vorherige Sete

Zur normalen Ansicht wechseln