FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: uwirt am 04 Juni 2024, 10:57:44

Titel: 24-Stunden Temperatur Minimum und Maximum
Beitrag von: uwirt am 04 Juni 2024, 10:57:44
Gibt es eine Möglichkeit von Temperatur-Readings ein 24-Stunden-Minimum bzw. -Maximum zu berechnen?

Ich habe mir dazu das statistics-Modul angesschaut nur leider ist das dort leider nicht implementiert.
Titel: Aw: 24-Stunden Temperatur Minimum und Maximum
Beitrag von: jkriegl am 04 Juni 2024, 11:36:33
Schau Dir mal das Modul average an.
Titel: Aw: 24-Stunden Temperatur Minimum und Maximum
Beitrag von: Aurel_B am 04 Juni 2024, 12:04:34
Falls du an einer individuelle Lösung interessiert bist, so mache ich es:

In 99_myUtils.pm:

sub avgMinMaxAusLog($$$) {
    my($offset, $logfile, $cspec) = @_;
    my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time - $offset);
    my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime;
    my $oll = $attr { global } { verbose };
    $attr { global } { verbose } = 0;
    my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec"));
    $attr { global } { verbose } = $oll;
    my ($cnt, $cum, $avg, $min, $max) = (0)x5;
    foreach(@logdata) {
        my @line = split(" ", $_);
        if (defined $line[1] && $line[1] ne "") {
            $cnt += 1;
            $cum += $line[1];
# Beim ersten Eintrag min/max setzen
if ($cnt == 1) {
$min = $line[1];
$max = $line[1];
# Bei den darauffolgenden Einträgen $min/max ermitteln
} else {
if ($line[1] < $min) { $min = $line[1]; }
if ($line[1] > $max) { $max = $line[1]; }
}
}
    }
    if ("$cnt" > 0) {
        $avg = sprintf("%0.5f", $cum / $cnt)
    };
    Log 4, ("avgMinMaxAusLog: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, Count: $cnt, Cum: $cum, Average: $avg, Minimum: $min, Maximum: $max");
    return ($avg, $min, $max);
}

Und dann ein "at":

defmod at_Tagestemperaturen_speichern at *23:59:00 {\
# Mittelwerte, Min & Max ermitteln\
foreach my $Temp ( 'EG', '1Stock', '2Stock', 'Estrich', 'Keller', 'Aussen' ) {\
my ($avg, $min, $max) = avgMinMaxAusLog(24*60*60, "dblog", "Temp_".$Temp.":temperature_avg_10min");;\
print ("setreading Temp_'.$Temp.' avg_24h $avg");;\
# Avg/Min/Max Readings setzen\
fhem("setreading Temp_$Temp avg_24h $avg");;\
fhem("setreading Temp_$Temp min_24h $min");;\
fhem("setreading Temp_$Temp max_24h $max");;\
# Avg/Min/Max speichern in DB\
fhem('set dblog addLog Temp_'.$Temp.':avg_24h.* !useExcludes');;\
fhem('set dblog addLog Temp_'.$Temp.':min_24h.* !useExcludes');;\
fhem('set dblog addLog Temp_'.$Temp.':max_24h.* !useExcludes');;\
}\
}

Ich speichere alle 10min einen Durchschnittswert für jeden Temperatursensor in meiner DB ab "DbLogInclude temperature_avg_10min", kannst du auch anders machen. Die Routine "avgMinMaxAusLog" berechnet dann für einen gewünschten Zeitraum Min/Max/Durchschnitt für diese Logeinträge. Funktioniert seit Jahren einwandfrei.
Titel: Aw: 24-Stunden Temperatur Minimum und Maximum
Beitrag von: uwirt am 04 Juni 2024, 12:16:51
Ich werde mir eure Vorschläge anschauen.

Im Prinzip ist es eigentlich ein gleitendes 24h Maximum bzw. Minimum welches ich mir im FTUI darstellen lassen möchte. Im Moment ist sind es halt die Maximum- und Minimum-Werte vom Vortag.


04-06-_2024_12-14-52.png

Titel: Aw: 24-Stunden Temperatur Minimum und Maximum
Beitrag von: uwirt am 07 Juni 2024, 09:36:39
Ich bin immer noch nach der Suche wie ich gleitende 24h Maxima und Minima berechnen kann.

Was ist denn der Unterschied im statistics-Modul zwischen statStateDay statStateDayLast?
Titel: Aw: 24-Stunden Temperatur Minimum und Maximum
Beitrag von: Der_Tom am 09 Juni 2024, 19:08:26
Zitat von: uwirt am 07 Juni 2024, 09:36:39Ich bin immer noch nach der Suche wie ich gleitende 24h Maxima und Minima berechnen kann.

Hi Uwirt,

falls du noch immer auf der Suche nach einer Lösung bist habe ich das ganze mal in ein MSwitch gepackt ( anstatt doif / 99_Utils / whatever ) - auch aus Eigeninteresse.

ggf nutzt du MSwitch ja , zumindest habe ich deinen Namen mal in entsprechendem Thread gelesen.

ist relativ easy anzupassen und liest eine bereits angelegte Logdatei aus, um entsprechende Werte zu ermitteln .

Im grossen und ganzen habe ich den Code von Aurel_B hierfür genutzt.
Falls Interesse kann ich die RAW für dieses device posten.
Optisch ist es auf die schnelle dahingemacht !

gruss Thomas