[GELÖST] Reading zwischenspeichern

Begonnen von thgorjup, 11 April 2020, 22:44:15

Vorheriges Thema - Nächstes Thema

thgorjup

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
FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

MadMax-FHEM

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
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)

thgorjup

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.
FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy

thgorjup

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;
}
FHEM auf Ubuntu 18.04LTS, 2x nanoCUL, JeeLink, nanoPIR, MQTT, ESP-Easy, HUE.
Sensoren+Aktoren: HM, IT, Lacrosse, Multitrade-PIR, VU+, Somfy