[gelöst] Absolute Feuchtigkeit g/m³ berechnen

Begonnen von sash.sc, 22 September 2019, 10:26:41

Vorheriges Thema - Nächstes Thema

sash.sc

Hallo zusammen.

Ich musste letzten mein System komplett neu aufsetzen, und habe nach einem Backup festgestellt, dass das dewpointmodul wohl mein LOG zumüllt.
Habe mich dann in der WIKI belesen, dass es auch die Möglichkeit gibt, die ganze Berechnung in myutils auszulagern.
Möchte mich von dem dewpointmodul trennen.
Habe dies auch gemacht, Taupunktberechnug klappt wunderbar. Jedoch fehlt mir die Berechnung der absoluten feuchtigkeit.
Habe soweit hier im Forum auch nix gefunden.
Hat da jemand eine Formel oder einen Tipp, wie man das ganze lösen könnte ?

Über 99_myutils wäre nicht schlecht und dann als usrreading !!!!

Gruß und Danke schonmal
Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

sash.sc

Habe mich mal auf die Suche gemacht, und versucht die Formel aus dem Dewpoint Modul zu adaptieren.

userReadings absHumidity (1000000 * (18.016/8314.3) * (ReadingsVal("$name","dewpoint",0)) / (273.15 + (ReadingsVal("$name","temperature",20))))

Scheint aber noch nicht zu funktionieren.
Kann da jemand was zu sagen, warum es nicht funktionert ?

Gruß und Danke
Sascha

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

MadMax-FHEM

Wie der commandref zu entnehmen:

Zitat von: commandref
userReadings
Komma getrennte Liste von benutzerdefinierten Readings. Jede Definition hat folgendes Format:

    <reading>[:<trigger>] [<modifier>] { <perl code> }

mindestens mal geschweifte Klammern für Perl...

Und ich würde (da du ja mit Zahlen rechnen willst/musst) auch ReadingsNum statt ReadingsVal nehmen.

Eventuell auch noch mit Trigger arbeiten...
...aber erst mal testen, ob es geht.

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)

mumpitzstuff

sub absHumidity($$)
{
  my ($curTemp,$curHum) = @_;
  return (6.112 * exp(1)**((17.67 * $curTemp)/($curTemp + 243.5)) * $curHum * 18.02) / ((273.15 + $curTemp) * 100.0 * 0.08314);
}

sub dewpoint($$)
{
my $dp;
my ($temperature, $humidity) = @_;
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) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";
  return 0;
}
my $e1 = $e / 610.78;
my $f = log( $e1 ) / $A;
my $f1 = 1 - $f;
if ($f1 == 0) {
  Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";
  return 0;
}
$dp = $B * $f / $f1 ;
sprintf "%.2f", $dp;
}


Hier meine beiden Funktionen für die absolute Feuchtigkeit und den Dewpoint, die ich seit vielen Monaten verwende.

sash.sc

Danke für den Hinweis mit der geschweiften Klammer.

So hat es funktioniert.

Hier mal meine komplette definition.


attr userReadings dewpoint:temperature.* {urDewpoint($name)},
absHumidity {(100000 * (18.016/8314.3) * (ReadingsVal("$name","dewpoint",0)) / (273.15 + (ReadingsVal("$name","temperature",20))))},
schimmelt {schimmelfreiMinTemp(ReadingsVal("$name","temperature",20),ReadingsVal("$name","humidity",100),70)}


Der dewpoint wird über eine Routine in der myutils berechnet, habe ich aus der WIKI zu dewpoint, steht ganz unten.
Dann wird das Reading abshumidity geschrieben.
das Reading schimmelt kommt auch aus der myUtils aus einer Berechnung. Dieser Wert gibt an, ab welcher temp. Schimmelgefahr besteht !

Gruß und Danke
Sascha
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

sash.sc

Wie sieht den der Aufruf dafür aus, bzw. welche Werte musst Du übergeben ?

Zitat von: mumpitzstuff am 22 September 2019, 15:00:09
sub absHumidity($$)
{
  my ($curTemp,$curHum) = @_;
  return (6.112 * exp(1)**((17.67 * $curTemp)/($curTemp + 243.5)) * $curHum * 18.02) / ((273.15 + $curTemp) * 100.0 * 0.08314);
}

sub dewpoint($$)
{
my $dp;
my ($temperature, $humidity) = @_;
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) { Log 1, "Error: dewpoint() e==0: temp=$temperature, hum=$humidity";
  return 0;
}
my $e1 = $e / 610.78;
my $f = log( $e1 ) / $A;
my $f1 = 1 - $f;
if ($f1 == 0) {
  Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";
  return 0;
}
$dp = $B * $f / $f1 ;
sprintf "%.2f", $dp;
}


Hier meine beiden Funktionen für die absolute Feuchtigkeit und den Dewpoint, die ich seit vielen Monaten verwende.
Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

mumpitzstuff

erster parameter: Temperatur
zweiter parameter: relative Luftfeuchtigkeit

MadMax-FHEM

Wie geschrieben würde ich ReadingsVal noch in ReadingsNum ändern...
...wenn du mal Geräte hast, die Einheiten "mitgeben" kommt es (u.U.) zu unschönen Warnings... ;)

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)

sash.sc

Ok. Danke. Werde das heute Abend mal testen.

Gesendet von meinem MI 9 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb