Kostenlose Wetterdaten von open-meteo.com

Begonnen von Guenni1404, 20 März 2023, 20:22:34

Vorheriges Thema - Nächstes Thema

betateilchen

Zitat von: Gisbert am 17 Dezember 2023, 13:51:11Ich wundere mich nur, dass die Geodaten in den Readings nicht denen in der Definition übereinstimmen. Das war bei der HPPTMOD-Definition auch so.

Darüber würde ich mir keine allzu großen Gedanken machen, das ist bei fast alle Wetterdiensten so. Entweder das sind Rundungsdifferenzen bei der internen Berechnung oder es sind schlicht die Positionsdaten der nächstgelegenen Wetterstation von der die Daten stammen.

Aber allzu weit liegen die Werte ja nicht auseinander.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

mumpitzstuff

Bei mir sieht der Plot jetzt so aus. Positionsdaten sind die von holle75.

Machen diese Daten irgendwie Sinn?

holle75

die machen aufgrund der leicht uneterschiedlichen lat/lon wahrscheinlich Sinn. Habe auf schnell hier ->

https://forum.fhem.de/index.php?topic=83097.msg1297219#msg1297219

mal einen Vergleich gepostet. Heute Abend mach ich nochmal ordentlich.

vielen Dank!

mumpitzstuff

#18
Hier mal meine aktuellen Definitionen:

defmod OpenMeteo HTTPMOD https://api.open-meteo.com/v1/forecast?latitude=<REPLACE>&longitude=<REPLACE>&current=temperature_2m,relative_humidity_2m,precipitation,rain,cloud_cover,wind_speed_10m,wind_gusts_10m&hourly=temperature_2m,relative_humidity_2m,dew_point_2m,precipitation_probability,precipitation,weather_code,rain,cloud_cover,wind_speed_10m,wind_gusts_10m,direct_radiation&timezone=Europe%2FBerlin&models=best_match 3600
attr OpenMeteo enableControlSet 1
attr OpenMeteo enforceGoodReadingNames 1
attr OpenMeteo event-on-change-reading .*
attr OpenMeteo extractAllJSON 1

defmod FileLog_OpenMeteo FileLog ./log/OpenMeteo-%Y-%m.log OpenMeteo
defmod SVG_FileLog_OpenMeteo_1 SVG FileLog_OpenMeteo:SVG_FileLog_OpenMeteo_1:CURRENT
attr SVG_FileLog_OpenMeteo_1 fixedoffset 6
attr SVG_FileLog_OpenMeteo_1 fixedrange 7days
attr SVG_FileLog_OpenMeteo_1 nrAxis 2,2

Logproxy Device (es kann auch ein bereits bestehendes verwendet werden):

define LOG_PROXY logProxy
99_myUtils.pm Funktion:

sub logProxy_WetterOpenMeteo2Plot($$$$;$$) {
    my ($device, $fcValue, $from, $to, $fcHour, $expMode) = @_;
    my $regex;
    my @rl;
    my $hdmreading;
    my $hdmtime;

    return undef if(!$device);

    if ($fcValue =~ s/_$//)
    {
        $regex = "^hourly_".$fcValue."_[\\d]+\$";
    }

    $fcHour = 12 if(!defined $fcHour);
    $expMode = "point" if(!defined $expMode);

#Log3 undef,2, "regex: ".$regex;
#Log3 undef,2, "FCvalue: ".$fcValue;

    if( defined($defs{$device}) ) {
        if( $defs{$device}{TYPE} eq "HTTPMOD" ) {
            @rl = sort{
                my ($an) = ($a =~ m/hourly.*_(\d+).*/);
#Log3 undef,2, "an: ".$an;
#Log3 undef,2, "a: ".$a;
                my ($bn) = ($b =~ m/hourly.*_(\d+).*/);
                $an <=> $bn or $a cmp $b;
                }( grep /${regex}/,keys %{$defs{$device}{READINGS}} );
            return undef if( !@rl );
        } else {
            Log3 undef, 2, "logProxy_WetterOpenMeteo2Plot: $device is not a HTTPMOD device";
            return undef;
        }
    }
#Log3 undef,2, Dumper(@rl);

    my $fromsec = SVG_time_to_sec($from);
    my $tosec   = SVG_time_to_sec($to);
    my $sec = $fromsec;
    my ($h,$hdmsec,$hdmmin,$hdmhour,$hdmmday,$hdmmon,$hdmyear,$hdmwday,$hdmyday,$hdmisdst);
    my $timestamp;

    my $reading;
    my $value;
    my $prev_value;
    my $min = 999999;
    my $max = -999999;
    my $ret = "";

    # while not end of plot range reached
    while(($sec < $tosec) && @rl) {
        #remember previous value for start of plot range
        $prev_value = $value;

        $reading = shift @rl;

        ($h) = $reading =~ m/^hourly.*_(\d+).*/;

        $value = ReadingsVal($device,$reading,undef);

#Log3 undef,2, "reading: ".$reading;
#Log3 undef,2, "h: ".$h;
        use Date::Parse;
        $hdmreading = ReadingsVal($device, "hourly_time_".$h ,undef);

#Log3 undef,2, "hdmvorCONV: ".$hdmreading;
        $hdmtime = str2time($hdmreading);

#Log3 undef,2, "hdmreading: ".$hdmreading;
#Log3 undef,2, "hdmtime: ".$hdmtime;


        ($hdmsec, $hdmmin, $hdmhour, $hdmmday, $hdmmon, $hdmyear, $hdmwday, $hdmyday, $hdmisdst) = localtime($hdmtime);

        # necessary conversion of $mon and $year
        $hdmmon += 1;
        $hdmyear += 1900;

        $timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $hdmyear, $hdmmon, $hdmmday, $hdmhour, $hdmmin, $hdmsec);
#Log3 undef,2, "timestamp: ".$timestamp;
        $sec = SVG_time_to_sec($timestamp);

        # skip all values before start of plot range
        next if( SVG_time_to_sec($timestamp) < $fromsec );

        # add first value at start of plot range
        if( !$ret && $prev_value ) {
            $min = $prev_value if( $prev_value < $min );
            $max = $prev_value if( $prev_value > $max );
            $ret .= "$from $prev_value\n";
        }

        # done if after end of plot range
        last if($sec > $tosec);

        $min = $value if( $value < $min );
        $max = $value if( $value > $max );

        # add actual controll point
        $ret .= "$timestamp $value\n";

#Log 3, "$timestamp $value -0- $reading";
    }
   
    if(($sec < $tosec) && !@rl && ($expMode eq "day")) {
        $timestamp = sprintf("%04d-%02d-%02d_%02d:%02d:%02d", $hdmyear, $hdmmon, $hdmmday, 23, 59, 59);
        if(SVG_time_to_sec($timestamp) < $tosec) {
            $ret .= "$timestamp $value\n";
        }
        else {
            $ret .= "$to $value\n";
        }
    }
    elsif(($sec > $tosec) && ($expMode eq "day")) {
           $value = $prev_value + ($value - $prev_value)*(86400 + ($tosec - $sec))/86400;
           $ret .= "$to $value\n";
    }
   
    return ($ret,$min,$max,$prev_value);
}

Gplot File (LOG_PROXY eventuell durch das eigene Device ersetzen):
# Created by FHEM/98_SVG.pm, 2023-12-18 17:34:40
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid ytics
set ylabel "Regenmenge (mm)"
set y2label "Sonneneinstrahlung (W/m²)"
set y3label "Temperatur/Taupunkt (°C)"
set y4label "Bewölkung / Regenwahrscheinlichkeit (%)"
set y4range [0:100]

#LOG_PROXY Func:logProxy_WetterOpenMeteo2Plot("OpenMeteo","temperature_2m_",$from,$to,0,"day")
#LOG_PROXY Func:logProxy_WetterOpenMeteo2Plot("OpenMeteo","dew_point_2m_",$from,$to,0,"day")
#LOG_PROXY Func:logProxy_WetterOpenMeteo2Plot("OpenMeteo","direct_radiation_",$from,$to,0,"day")
#LOG_PROXY Func:logProxy_WetterOpenMeteo2Plot("OpenMeteo","rain_",$from,$to,0,"day")
#LOG_PROXY Func:logProxy_WetterOpenMeteo2Plot("OpenMeteo","precipitation_probability_",$from,$to,0,"day")
#LOG_PROXY Func:logProxy_WetterOpenMeteo2Plot("OpenMeteo","cloud_cover_",$from,$to,0,"day")
#LOG_PROXY ConstX:TimeNow(),0,100
#LOG_PROXY ConstY:0

plot "<IN>" using 1:2 axes x1y3 title 'Temperatur (°C)' ls l0 lw 2 with quadraticSmooth,\
     "<IN>" using 1:2 axes x1y3 title 'Taupunkt' ls l1 lw 2 with quadraticSmooth,\
     "<IN>" using 1:2 axes x1y2 title 'Sonneneinstrahlung (W/m²)' ls l4fill lw 1 with steps,\
     "<IN>" using 1:2 axes x1y1 title 'Regen (mm)' ls l2fill lw 1 with steps,\
     "<IN>" using 1:2 axes x1y4 title 'Regenwahrscheinlichkeit (%)' ls l5fill lw 1 with quadraticSmooth,\
     "<IN>" using 1:2 axes x1y4 title 'Wolken (%)' ls l6fill lw 1 with quadraticSmooth,\
     "<IN>" using 1:2 axes x1y4 notitle ls l5 lw 4 with lines,\
     "<IN>" using 1:2 axes x1y3 notitle ls l2 lw 2 with lines

Den Wind habe ich mal weg gelassen, da dafür noch eine weitere Achse notwendig gewesen wäre. Das Ergebnis knn man hier vergleichen (Ort muss man oben noch eintragen und kann sich dann das Diagramm ansehen):

https://open-meteo.com/en/docs#current=temperature_2m,relative_humidity_2m,precipitation,rain,cloud_cover,wind_speed_10m,wind_gusts_10m&hourly=temperature_2m,dew_point_2m,precipitation_probability,precipitation,rain,cloud_cover,wind_speed_10m,wind_gusts_10m,direct_radiation&models=

holle75

#19
Grossartig, das Selbe wollte ich auch gerade machen.

Nochmals vielen Dank für deine Hilfe.

Edit: Für Nachbauer, ich glaube es braucht auch noch ein Logproxy Device

defmod LogproxyWetter logProxy
name it as you like.

Im Plot könnt ihr mannigfaltig auch andere Werte verwursten und darstellen. Diese könnt ihr euch hier "zusammenklicken" -> https://open-meteo.com/en/docs

und entsprechend Mumpitzstuff´s Anleitung im Gplot file einbauen.

LutzG

Hallo,
Zitat von: mumpitzstuff am 18 Dezember 2023, 18:22:59Hier mal meine aktuellen Definitionen:
Vielen Dank, sieht echt cool aus!

Zitat von: holle75 am 18 Dezember 2023, 22:04:36Edit: Für Nachbauer, ich glaube es braucht auch noch ein Logproxy Device

defmod LogproxyWetter logProxy
name it as you like.
ich habe jetzt eine ganze Weile rumprobiert, aber hier müßte der Name: LOG_PROXY sein, also:
defmod LOG_PROXY logProxyDie Profis wissen natürlich, das man das auch im "Gplot File" ändern kann: #LOG_PROXY Func:logProxy[...]  --->  #DEIN_NAME_VOM_LOG_PROXY Func:logProxy[...]... ich hab aber noch nie einen Plot so erstellt und habe ziemlich lange gesucht um das raus zu finden. Ich hoffe, die Info hilft auch Anderen beim nachbauen!

Viele Grüße, Lutz
DMZ: J5040 mit OpenMediaVault, in Docker: Portainer, Fhem, MariaDB, zigbee2mqtt, esphome, NextCloudPi, Jellyfin, Grocy.
Intranet: J5005 mit OpenMediaVault, in Docker: Portainer, Fhem-minimal, urbackup - läuft nur, wenn Rechner laufen.

mumpitzstuff

Habe beides auch oben ergänzt. Danke.