Hallo, ich habe ein Anemometer, welches über einen D1-Mini (ESPEasy) per "Pulse counter" die Gesamtumdrehungen hochzählt.
Diesen Wert will ich jede Minute auslesen und in FHEM zwischen speichern. Den nächsten Wert sowie den gespeicherten Wert will ich verwenden um die Windgeschwindigkeit zu berechnen. Danach soll der letzte Wert wieder zwischengespeichert werden und es geht von vorne los.
Ich habe das mit einem Dummy sowie mit einen userReading versucht, doch jedesmal wird beim Schreiben des neuen Wertes ein neuer Event ausgelöst und das Ergebnis meiner Berechnung ist immer Null, weil die Werte in diesem Moment gleich sind.
userReading:
attr ESPEasy_WS_Windsensor userReadings V { Windspeed();; }, G_Old { my $G_Old = ReadingsNum("ESPEasy_WS_Windsensor", "G", "");; $G_Old }
Script (Windspeed):
# Windgeschwindigkeit
sub Windspeed () {
my $rps;
my $G_Now;
my $G_Old;
my $v;
$G_Now = ReadingsNum("ESPEasy_WS_Windsensor", "G", "");
$G_Old = ReadingsNum("ESPEasy_WS_Windsensor", "G_Old", "");
$rps = ($rpsNow - $rpsOld) / 60;
$v = sprintf "%.2f", (1.761 / (1 + $rps) + 3.013 * $rps);
if ($v == 1.76) {
$v = 0.00;
}
return $v;
}
Wie kann ich das Problem lösen?
Danke und Gruß
Thomas
Also:
ReadingsNum liefert einen numerischen Wert, daher würde ich als "Ersatzwert" auch eine Zahl statt "" nehmen: $G_Now = ReadingsNum("ESPEasy_WS_Windsensor", "G", 0);
Dann:
$G_Old = ReadingsNum("ESPEasy_WS_Windsensor", "G_Old", "");
wie soll das Reading G_Old denn ausgelesen werden, wenn es das nicht gibt!?
Bzw.: wo setzt du es denn!?
Setzen von Readings: setreading DeviceName ReadingName Wert
Also musst du irgendwann mal das Reading G_Old auch setzen:
fhem("setreading ESPEasy_WS_Windsensor G_Old $G_Old")
Die "fhem-Funktion" brauchst du, weil du innerhalb von Perl bist und aber eben einen fhem Befehl (setreading) aufrufen willst...
Es gibt auch die Möglichkeit, dass das Device selbst alte Werte aufhebt:
Attribut oldreadings
Dort dann eben das/die Reading(s) angeben, für die du "alte" Werte haben willst...
Abfrage dann mit OldReadingsVal/OldReadingsNum
ABER: dann musst du dafür sorgen, dass eben keine Zwischenwerte kommen, sonst stimmt nat. OldReadings nicht, bzw. liefert nicht das erwartete Ergebnis...
...sollte mit passendem userReadings passen, weil ja dann immer berechnet wird, wenn sich was ändert...
Gruß, Joachim
Oh, die Methode OldReadings scheint genau das zu sein was ich brauche. Aber leider funktioniert es nicht bei mir....?
Unknown command OldReadingsNum("ESPEasy_WS_Windsensor","G",0), try help.
Ok, war mein Fehler. Jetzt funktioniert es.
Vielen Dank! Jetzt läuft es perfekt.
# Windgeschwindigkeit
sub Windspeed () {
my $rps;
my $G_Now;
my $G_Old;
my $v;
$G_Now = ReadingsNum("ESPEasy_WS_Windsensor", "G", 0);
$G_Old = OldReadingsNum("ESPEasy_WS_Windsensor", "G", 0);
$rps = ($G_Now - $G_Old) / 60;
$v = sprintf "%.2f", (1.761 / (1 + $rps) + 3.013 * $rps);
if ($v == 1.76) {
$v = 0.00;
}
return $v;
}