mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 09:16:53 +00:00
98_dewpoint: Consolidated and corrected formulas for dewpoint (Forum #78359)
git-svn-id: https://svn.fhem.de/fhem/trunk@15476 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
c85dceb77e
commit
fba07d1728
@ -27,6 +27,8 @@ package main;
|
|||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
|
||||||
|
sub Log($$);
|
||||||
|
|
||||||
# Debug this module? YES = 1, NO = 0
|
# Debug this module? YES = 1, NO = 0
|
||||||
my $dewpoint_debug = 0;
|
my $dewpoint_debug = 0;
|
||||||
# default maximum time_diff for dewpoint
|
# default maximum time_diff for dewpoint
|
||||||
@ -409,56 +411,89 @@ dewpoint_Notify($$)
|
|||||||
}
|
}
|
||||||
# -----------------------------
|
# -----------------------------
|
||||||
# Dewpoint calculation.
|
# Dewpoint calculation.
|
||||||
# see http://www.faqs.org/faqs/meteorology/temp-dewpoint/ "5. EXAMPLE"
|
|
||||||
|
# 'Magnus formula'
|
||||||
|
#
|
||||||
|
# Parameters from https://de.wikipedia.org/wiki/Taupunkt#S.C3.A4ttigungsdampfdruck
|
||||||
|
# Good summary of formulas in http://www.wettermail.de/wetter/feuchte.html
|
||||||
|
|
||||||
|
my $E0 = 0.6112; # saturation pressure at T=0 °C
|
||||||
|
my @ab_gt0 = (17.62, 243.12); # T>0
|
||||||
|
my @ab_le0 = (22.46, 272.6); # T<=0 over ice
|
||||||
|
|
||||||
|
### ** Public interface ** keep stable
|
||||||
|
# vapour pressure in kPa
|
||||||
|
sub dewpoint_vp($$)
|
||||||
|
{
|
||||||
|
my ($T, $Hr) = @_;
|
||||||
|
my ($a, $b);
|
||||||
|
|
||||||
|
if ($T > 0) {
|
||||||
|
($a, $b) = @ab_gt0;
|
||||||
|
} else {
|
||||||
|
($a, $b) = @ab_le0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0.01 * $Hr * $E0 * exp($a * $T / ($T + $b));
|
||||||
|
}
|
||||||
|
|
||||||
|
### ** Public interface ** keep stable
|
||||||
|
# dewpoint in °C
|
||||||
sub
|
sub
|
||||||
dewpoint_dewpoint($$)
|
dewpoint_dewpoint($$)
|
||||||
{
|
{
|
||||||
my ($temperature, $humidity) = @_;
|
my ($T, $Hr) = @_;
|
||||||
my $dp;
|
if ($Hr == 0) {
|
||||||
my $A = 17.2694;
|
Log 1, "Error: dewpoint() Hr==0 !: temp=$T, hum=$Hr";
|
||||||
my $B = ($temperature > 0) ? 237.3 : 265.5;
|
return undef;
|
||||||
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 ($a, $b);
|
||||||
my $f1 = 1 - $f;
|
|
||||||
if ($f1 == 0) {
|
if ($T > 0) {
|
||||||
Log 1, "Error: dewpoint() (1-f)==0: temp=$temperature, hum=$humidity";
|
($a, $b) = @ab_gt0;
|
||||||
return 0;
|
} else {
|
||||||
|
($a, $b) = @ab_le0;
|
||||||
}
|
}
|
||||||
$dp = $B * $f / $f1 ;
|
|
||||||
return($dp);
|
# solve vp($dp, 100) = vp($T,$Hr) for $dp
|
||||||
|
my $v = log(dewpoint_vp($T, $Hr) / $E0);
|
||||||
|
my $D = $a - $v;
|
||||||
|
|
||||||
|
# can this ever happen for valid input?
|
||||||
|
if ($D == 0) {
|
||||||
|
Log 1, "Error: dewpoint() D==0 !: temp=$T, hum=$Hr";
|
||||||
|
return undef;
|
||||||
|
}
|
||||||
|
|
||||||
|
return round($b * $v / $D, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
### ** Public interface ** keep stable
|
||||||
|
# absolute Feuchte in g Wasserdampf pro m3 Luft
|
||||||
sub
|
sub
|
||||||
dewpoint_absFeuchte ($$)
|
dewpoint_absFeuchte ($$)
|
||||||
{
|
{
|
||||||
# Formeln von http://kellerlueftung.blogspot.de/p/blog-page_9.html
|
my ($T, $Hr) = @_;
|
||||||
# http://www.wettermail.de/wetter/feuchte.html
|
|
||||||
my ($T, $rh) = @_;
|
# 110 ?
|
||||||
if (($rh < 0) || ($rh > 110)){
|
if (($Hr < 0) || ($Hr > 110)) {
|
||||||
Log 1, "Error dewpoint: humidity invalid: $rh";
|
Log 1, "Error dewpoint: humidity invalid: $Hr";
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
# a = 7.5, b = 237.3 für T >= 0
|
my $DD = dewpoint_vp($T, $Hr);
|
||||||
# a = 7.6, b = 240.7 für T < 0 über Wasser (Taupunkt)
|
my $AF = 1.0E6 * (18.016 / 8314.3) * ($DD / (273.15 + $T));
|
||||||
my $a = ($T > 0) ? 7.5 : 7.6;
|
return round($AF, 1);
|
||||||
my $b = ($T > 0) ? 237.3 : 240.7;
|
|
||||||
my $SDD = 6.1078 * 10**(($a*$T)/($b+$T));
|
|
||||||
my $DD = $rh/100 * $SDD;
|
|
||||||
my $AF = (10**5) * (18.016 / 8314.3) * ($DD / (273.15 + $T));
|
|
||||||
my $af = sprintf( "%.1f",$AF);
|
|
||||||
return($af); # $aF = absolute Feuchte in g Wasserdampf pro m3 Luft
|
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
||||||
|
|
||||||
=pod
|
=pod
|
||||||
|
=item helper
|
||||||
|
=item summary compute dewpoint and/or generate events for starting a fan
|
||||||
|
=item summary_DE berechne Taupunkt und/oder erzeuge events zum starten eines Lüfters
|
||||||
=begin html
|
=begin html
|
||||||
|
|
||||||
<a name="dewpoint"></a>
|
<a name="dewpoint"></a>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user