Ausführungsreihenfolge userReadings

Begonnen von OK_DE, 06 Juni 2024, 11:10:20

Vorheriges Thema - Nächstes Thema

OK_DE

Hallo,

Knabbere gerade an folgendem Problem:
- Ich lese die Temperatur und relative Luftfeuchte des Homematic Wandthermostats aus, um den Taupunkt wie im Wiki definiert in 99_myUtils.pm zu berechnen.
- Dann habe ich ich im Forum eine Formel gefunden um mittels Temperatur und Taupunkt die absulute Luftfeuchte zu berechnen und eine Funktion dafür in 99_myUtils.pm programmiert.
Dabei wird das vorher berechnete Userreading dewpoint ausgelesen und in der Formel verwendet.

Jetzt wollte ich die Funktionen nacheinander aufrufen um immer den aktuellen Taupunkt zu verwenden ohne ihn erneut zu berechnen.

Mein erster Versuch war als zweiten Eintrag in userReadings auf den dewpoint zu triggern das funktioniert aber nicht.
dewpoint:measured-temp.* {myUtils_Dewpoint($name)}, humidity-absolute:dewpoint.* {myUtils_Absolute_Humidity($name)}
Dann habe ich testweise in userReading bei beiden auf measured-temp getriggert.
Das geht aber ich weis nicht ob FHEM den aktuellen oder einen älteren Taupunkt für die zweite Berechnung benutzt. Kann mir da einer Auskunft geben.
dewpoint:measured-temp.* {myUtils_Dewpoint($name)}, humidity-absolute:measured-temp.* {myUtils_Absolute_Humidity($name)}
Hier noch die Funktionen aus 99_myUtils.pm falls jemand danach sucht.
sub myUtils_Dewpoint
{
my ($dname,$tname,$hname) = @_;

#Prüfen, ob überhaupt ein Device(-name) als Parameter übergeben wurde
if(!defined($dname)) {
Log3 undef,1,"Error: myUtils_Dewpoint: No device specified!";
return 0;
}

#Prüfen, ob das angegebene Device überhaupt existiert
if(!$defs{$dname}) {
Log3 undef,1,"Error: myUtils_Dewpoint: Device $dname is not defined!";
return 0;
}

#Wenn keine Readingsnamen für die Temperatur oder Luftfeuchtigkeit
#übergebenwurde wird per default measured-temp oder humidity verwendet
$tname='measured-temp' if(!defined($tname));
$hname='humidity' if(!defined($hname));

my $dp;

#Auslesen der Readingswerte für Temperatur und Luftfeuchtigkeit aus den
#entsprechenden Readings des Devices
my $temperature = ReadingsVal($dname,$tname,0);
my $humidity = ReadingsVal($dname,$hname,0);

#Log 1,"myUtils_Dewpoint: devicename=$dname, temp=$temperature, humidity=$humidity";

#Magische Berechnung :)
my $A = 17.2694;
my $B = ($temperature > 0) ? 237.3 : 265.5;
my $es = 610.78 * exp( $A * $temperature / ($temperature + $B) );
my $e = $humidity/ 100 * $es;
if ($e == 0) {
Log3 undef,1, "Error: myUtils_Dewpoint: $dname - e==0: temp=$temperature, hum=$humidity";
return 'ERR';
}
my $e1 = $e / 610.78;
my $f = log( $e1 ) / $A;
my $f1 = 1 - $f;
if ($f1 == 0) {
Log3 undef,1, "Error: myUtils_Dewpoint: $dname - (1-f)==0: temp=$temperature, hum=$humidity";
return 'ERR';
}
$dp = $B * $f / $f1 ;

#Rückgabe der Taupunkt-Temperatur
return sprintf "%.2f", $dp;
}

sub myUtils_Absolute_Humidity
{
my ($devicename,$temperaturename,$dewpointname) = @_;

#Prüfen, ob überhaupt ein Device(-name) als Parameter übergeben wurde
if(!defined($devicename)) {
Log3 undef,1,"Error: myUtils_Absolute_Humidity: No device specified!";
return 0;
}

#Prüfen, ob das angegebene Device überhaupt existiert
if(!$defs{$devicename}) {
Log3 undef,1,"Error: myUtils_Absolute_Humidity: Device $devicename is not defined!";
return 0;
}

#Wenn keine Readingsnamen für die Temperatur oder Taupunkt
#übergeben wurde wird per default meaured-temp oder dewpoint verwendet
$temperaturename='measured-temp' if(!defined($temperaturename));
$dewpointname='dewpoint' if(!defined($dewpointname));

#Auslesen der Readingswerte für Temperatur und Taupunkt aus den
#entsprechenden Readings des Devices
my $temperature = ReadingsVal($devicename,$temperaturename,20);
my $dewpoint = ReadingsVal($devicename,$dewpointname,0);

if ($dewpoint == 0) {
Log3 undef,1, "ERROR: myUtils_Absolute_Humidity: devicename=$devicename, temp=$temperaturename, dewpoint=$dewpointname";
return 'ERR';
}

#Magische Berechnung :)
my $absolutehumidity = ((100000 * (18.016 / 8314.3) * $dewpoint) / (273.15 + $temperature));

#Rückgabe der Taupunkt-Temperatur
return sprintf "%.2f", $absolutehumidity;
}

ph1959de

Nicht direkt die Antwort auf die Frage, aber was spricht dagegen, das 98_dewpoint Modul zu verwenden?
Aktives Mitglied des FHEM e.V. | Moderator im Forenbereich "Wiki"