From 6d07ec9a7e35ec406e73006df9f1bcfa78ea8935 Mon Sep 17 00:00:00 2001 From: hotbso <> Date: Fri, 6 Jul 2018 14:06:51 +0000 Subject: [PATCH] 98_dewpoint: new attributes absoluteHumidity, vapourPressure git-svn-id: https://svn.fhem.de/fhem/trunk@16949 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 3 + fhem/FHEM/98_dewpoint.pm | 162 ++++++++++++++++++++++++--------------- 2 files changed, 102 insertions(+), 63 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index fde3a3f78..214cc446f 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,8 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - change: 98_dewpoint: new attributes absoluteHumidity, vapourPressure + attribute absFeuchte is now deprecated, + write warning to log - bugfix: 41_Oregon: batterypercent typo, Forum #89120 - feature: 49_SSCam: HTTPS Support, buttons for refresh SSCamSTRM-devices - changed: 14_Hideki: standard battery readings diff --git a/fhem/FHEM/98_dewpoint.pm b/fhem/FHEM/98_dewpoint.pm index fd9d0ff9c..8d2f48780 100644 --- a/fhem/FHEM/98_dewpoint.pm +++ b/fhem/FHEM/98_dewpoint.pm @@ -27,6 +27,8 @@ package main; use strict; use warnings; +use vars qw(%defs); + sub Log3($$$); # default maximum time_diff for dewpoint @@ -39,8 +41,10 @@ dewpoint_Initialize($) my ($hash) = @_; $hash->{DefFn} = "dewpoint_Define"; $hash->{NotifyFn} = "dewpoint_Notify"; + $hash->{AttrFn} = "dewpoint_Attr"; $hash->{NotifyOrderPrefix} = "10-"; # Want to be called before the rest - $hash->{AttrList} = "disable:0,1 legacyStateHandling:0,1 verbose max_timediff absFeuchte"; + $hash->{AttrList} = "disable:0,1 legacyStateHandling:0,1 verbose max_timediff absFeuchte" + . " absoluteHumidity vapourPressure"; } @@ -109,6 +113,27 @@ dewpoint_Define($$) return undef; } +########################## +sub +dewpoint_Attr(@) +{ + my ($cmd, $name, $a_name, $a_val) = @_; + my $hash = $defs{$name}; + + if ($cmd eq "set" && $a_name eq "absFeuchte") { + Log(1, "dewpoint $name: attribute 'absFeuchte' is deprecated, please use 'absoluteHumidity'"); + return undef; + } + + if ($cmd eq "set" && ($a_name eq "absoluteHumidity" || $a_name eq "vapourPressure")) { + if (! goodReadingName($a_val)) { + return "Value of $a_name is not a valid reading name"; + } + } + + return undef; +} + ########################## sub dewpoint_Notify($$) @@ -273,24 +298,38 @@ dewpoint_Notify($$) # define dewtest2 dewpoint dewpoint .* T H D readingsBeginUpdate($dev); - my $current; - my $sensor; - my $aFeuchte = AttrVal($hash->{NAME},"absFeuchte", undef); + my $rval; + my $rname; + my $abs_hunidity = dewpoint_absFeuchte($temperature, $humidity); + my $aFeuchte = AttrVal($hashName, "absFeuchte", undef); if (defined($aFeuchte)) { - $sensor = "absFeuchte"; - $current = dewpoint_absFeuchte($temperature, $humidity); - readingsBulkUpdate($dev, $sensor, $current); - Log3($hashName, 5, "dewpoint absFeuchte= $current"); - $aFeuchte = "A: " . $current; + $rname = "absFeuchte"; + readingsBulkUpdate($dev, $rname, $abs_hunidity); + Log3($hashName, 5, "dewpoint absFeuchte= $abs_hunidity"); + $aFeuchte = "A: " . $abs_hunidity; + } + + my $ah_rname = AttrVal($hashName, "absoluteHumidity", undef); + if (defined($ah_rname)) { + readingsBulkUpdate($dev, $ah_rname, $abs_hunidity); + Log3($hashName, 5, "dewpoint $ah_rname= $abs_hunidity"); + $aFeuchte = "A: " . $abs_hunidity if !defined($aFeuchte); } - $sensor = $new_name; + my $vp_rname = AttrVal($hashName, "vapourPressure", undef); + if (defined($vp_rname)) { + my $vp = round(10 * dewpoint_vp($temperature, $humidity), 1); + readingsBulkUpdate($dev, $vp_rname, $vp); + Log3($hashName, 5, "dewpoint $vp_rname= $vp"); + } + + $rname = $new_name; my $has_state_format = defined(AttrVal($dev->{NAME}, "stateFormat", undef)); my $legacy_sh = AttrVal($hash->{NAME}, "legacyStateHandling", 0); if ($temp_name ne "T" || ($has_state_format && ! $legacy_sh)) { - $current = $dewpoint; - readingsBulkUpdate($dev, $sensor, $current); + $rval = $dewpoint; + readingsBulkUpdate($dev, $rname, $rval); readingsEndUpdate($dev, 1); } else { # explicit manipulation of STATE here @@ -302,26 +341,26 @@ dewpoint_Notify($$) # STATE begins with "T:". append dewpoint or insert before BAT my $lastval = $dev->{CHANGED}[$i_state_ev]; if ($lastval =~ /BAT:/) { - $current = $lastval; - $current =~ s/BAT:/$sensor: $dewpoint BAT:/g; + $rval = $lastval; + $rval =~ s/BAT:/$rname: $dewpoint BAT:/g; } elsif ($lastval =~ /<{STATE} = $current; + $dev->{STATE} = $rval; # the state event must be REPLACED - $dev->{CHANGED}[$i_state_ev] = $current; + $dev->{CHANGED}[$i_state_ev] = $rval; } # remove cached "state:..." events if any $dev->{CHANGEDWITHSTATE} = []; - Log3($hashName, 5, "dewpoint_notify: current=$current"); + Log3($hashName, 5, "dewpoint_notify: rval=$rval"); } elsif ($cmd_type eq "fan") { # >define dewpoint fan devicename devicename-outside min-temp [diff-temp] @@ -334,26 +373,26 @@ dewpoint_Notify($$) # and reading "fan" was not already "on". # - Generate reading/event "fan: off": else and if reading "fan" was not already "off". Log3($hashName, 5, "dewpoint_notify: fan devname_out=$devname_out, min_temp=$min_temp, diff_temp=$diff_temp"); - my $sensor; - my $current; + my $rname; + my $rval; if (exists $defs{$devname_out}{READINGS}{temperature}{VAL} && exists $defs{$devname_out}{READINGS}{humidity}{VAL}) { my $temperature_out = $defs{$devname_out}{READINGS}{temperature}{VAL}; my $humidity_out = $defs{$devname_out}{READINGS}{humidity}{VAL}; my $dewpoint_out = dewpoint_dewpoint($temperature_out, $humidity_out); Log3($hashName, 5, "dewpoint_notify: fan dewpoint_out=$dewpoint_out"); if (($dewpoint_out + $diff_temp) < $dewpoint && $temperature_out >= $min_temp) { - $current = "on"; + $rval = "on"; Log3($hashName, 3, "dewpoint_notify: fan ON"); } else { - $current = "off"; + $rval = "off"; Log3($hashName, 3, "dewpoint_notify: fan OFF"); } - $sensor = "fan"; - if (!exists $defs{$devName}{READINGS}{$sensor}{VAL} || $defs{$devName}{READINGS}{$sensor}{VAL} ne $current) { - Log3($hashName, 3, "dewpoint_notify: CHANGE fan $current"); - $dev->{READINGS}{$sensor}{TIME} = $tn; - $dev->{READINGS}{$sensor}{VAL} = $current; - $dev->{CHANGED}[$nev++] = $sensor . ": " . $current; + $rname = "fan"; + if (!exists $defs{$devName}{READINGS}{$rname}{VAL} || $defs{$devName}{READINGS}{$rname}{VAL} ne $rval) { + Log3($hashName, 3, "dewpoint_notify: CHANGE fan $rval"); + $dev->{READINGS}{$rname}{TIME} = $tn; + $dev->{READINGS}{$rname}{VAL} = $rval; + $dev->{CHANGED}[$nev++] = $rname . ": " . $rval; } } else { @@ -379,24 +418,24 @@ dewpoint_Notify($$) # than the inside temperature, set diff to 5. # Example: define alarmtest dewpoint alarm roomsensor roomsensor 5 Log3($hashName, 5, "dewpoint_notify: alarm devname_ref=$devname_ref, diff_temp=$diff_temp"); - my $sensor; - my $current; + my $rname; + my $rval; if (exists $defs{$devname_ref}{READINGS}{temperature}{VAL}) { my $temperature_ref = $defs{$devname_ref}{READINGS}{temperature}{VAL}; Log3($hashName, 5, "dewpoint_notify: alarm temperature_ref=$temperature_ref"); if ($temperature_ref - $diff_temp < $dewpoint) { - $current = "on"; + $rval = "on"; Log3($hashName, 3, "dewpoint_notify: alarm ON"); } else { - $current = "off"; + $rval = "off"; Log3($hashName, 3, "dewpoint_notify: alarm OFF"); } - $sensor = "alarm"; - if (!exists $defs{$devName}{READINGS}{$sensor}{VAL} || $defs{$devName}{READINGS}{$sensor}{VAL} ne $current) { - Log3($hashName, 5, "dewpoint_notify: CHANGE alarm $current"); - $dev->{READINGS}{$sensor}{TIME} = $tn; - $dev->{READINGS}{$sensor}{VAL} = $current; - $dev->{CHANGED}[$nev++] = $sensor . ": " . $current; + $rname = "alarm"; + if (!exists $defs{$devName}{READINGS}{$rname}{VAL} || $defs{$devName}{READINGS}{$rname}{VAL} ne $rval) { + Log3($hashName, 5, "dewpoint_notify: CHANGE alarm $rval"); + $dev->{READINGS}{$rname}{TIME} = $tn; + $dev->{READINGS}{$rname}{VAL} = $rval; + $dev->{CHANGED}[$nev++] = $rname . ": " . $rval; } } else { Log3($hashName, 1, "dewpoint_notify: alarm devname_out=$devname_out no temperature or humidity available" @@ -630,17 +669,16 @@ dewpoint_absFeuchte ($$) Attributes @@ -784,23 +822,21 @@ dewpoint_absFeuchte ($$) Attributes
+
  • vapourPressure <reading_name>
  • +
    +
  • max_timediff