Erweiterungen für die Davis Vantage Pro2 Wetterstation

Begonnen von PeterCu, 09 August 2020, 10:07:58

Vorheriges Thema - Nächstes Thema

PeterCu

--- 88_VantagePro2.pm.org   2019-01-27 07:35:37.601875975 +0100
+++ 88_VantagePro2.pm.new   2019-01-26 12:56:07.840354915 +0100
@@ -53,7 +53,7 @@ VantagePro2_Define($$)
   my @a = split("[ \t][ \t]*", $def);
   Log 5, "VantagePro2 Define: $a[0] $a[1] $a[2] $a[3]";
   return "Define the host as a parameter i.e. VantagePro2"  if(@a < 3);
-
+
   my $host = $a[2];
   my $port=$a[3];
   my $delay=$a[4];
@@ -181,7 +181,7 @@ VantagePro2_GetStatus($)
        my ($etyear)=unpack("s2",$t);
        $etyear=sprintf("%.02f",($etyear/100*25.4));

-        $itemp=sprintf("%.02f",(($itemp/10)-32)*5/9);
+        $itemp=sprintf("%.02f",((($itemp/10)-32)*5/9));
        $otemp=sprintf("%.02f",(($otemp/10)-32)*5/9);
        $rainrate=sprintf("%.02f",$rainrate/5);
        $windspeed=sprintf("%.02f",$windspeed*1.609);
@@ -215,117 +215,237 @@ VantagePro2_GetStatus($)
        {
         $hit=$otemp;
        }
+       
+        ###
+        ### Luftdruck in hPa by PC Web
+        ###
+       
+        my $barohPa;
+        $barohPa=sprintf("%.02f",$barometer/76*1013.25);
+
+
+        ###
+        ### absolute Luftfeuchtigkeit und div. Temperaturen by PC Web
+        ###
+
+        # http://www.wetterochs.de/wetter/feuchte.html
+       
+        my ($humidityInAbs,$konst,$DD,$TK,$humidityOutAbs,$a,$b,$otempWet,$otempDew,$otempApp,$v);
+
+        if ($itemp >= 0) {
+            $a = 7.5;
+            $b = 237.3;
+        } else {
+            $a = 9.5;
+            $b = 265.5;
+        }
+       
+        $konst = 10**5 *18.016/8314.3;
+        $DD =($ihum/100 * 6.1078 * (10**($a*$itemp/($itemp + $b))));
+        $TK = $itemp + 273.15;
+
+        $humidityInAbs = sprintf("%.02f",$konst*$DD/$TK);
+
+        if ($otemp >= 0) {
+            $a = 7.5;
+            $b = 237.3;
+        } else {
+            $a = 9.5;
+            $b = 265.5;
+        }
+
+        $DD =($ohum/100 * 6.1078 * (10**($a*$otemp/($otemp + $b))));
+        $TK = $otemp + 273.15;
+
+        $humidityOutAbs = sprintf("%.02f",$konst*$DD/$TK);

+        # TD(r,T) = b*v/(a-v) mit v(r,T) = log10(DD(r,T)/6.1078)
+
+        sub log10 {
+            my $n = shift;
+            return log($n)/log(10);
+        }
+
+        $a = 7.5;
+        $b = 237.3;
+          $DD =($ohum/100 * 6.1078 * (10**($a*$otemp/($otemp + $b))));
+
+        if ($DD >= 0) {
+            $v=log10($DD/6.1078);
+        } else {
+            $v = 0;
+        }
+       
+        $otempDew = sprintf("%.02f",$b*$v/($a-$v));
+
+        # https://www.sps-forum.de/stammtisch/14599-taupunkttemperatur-feuchtkugeltemperatur.html
+       
+        $otempWet = sprintf("%.02f",(-5.809 + 0.058*$ohum + 0.697*$otemp + 0.003*$ohum*$otemp));
+
+        # Calculate the apparent temperature:
+        # Australian Bureau of Meteorology http://reg.bom.gov.au/info/thermal_stress/#atapproximation [^]
+        # Robert G. Steadman. 1994: Norms of apparent temperature in Australia.
+        #    Ta = wvutilsConvertFToC( temp );
+        #    e = humidity / 100.0 * 6.105 * exp( 17.27 * Ta / ( 237.7 + Ta ) );
+        #    ws = wvutilsConvertMPHToMPS( windspeed );
+        #    AT = Ta + 0.33 * e - 0.70 * ws - 4.00;
+        #    result = wvutilsConvertCToF( AT );
+
+        $otempApp = sprintf("%.02f",$otemp + 0.33*$DD - 0.7*$windspeed/3.6 - 4);
+       
+        #
+        # Ende: absolute Luftfeuchtigkeit und div. Temperaturen by PC Web
+        #
+       
        $text="T-OUT: ".$otemp." T-WC-OUT: ".$wct." T-HI-OUT: ".$hit." T-IN: ".$itemp." H-OUT: ".$ohum." H-IN: ".$ihum." W: ".$windspeed." W-AV: ".$avgwindspeed." WD: ".$winddir." R: ".$rainrate." S: ".$solar." UV: ".$uv." RD: ".$drain." RM: ".$mrain. " RY: ".$yrain." SR: ".$stormrain." BM: ".$barometer." BT: ".$btrend. " ET-DAY: ".$etday." ET-MONTH: ".$etmonth." ET-YEAR: ".$etyear;
        my $n=0;

        Log 4,"$name: $text";
        if (!$hash->{local}){
-             $sensor="temperature-outside";
+             $sensor="temperatureOutside";
             $hash->{CHANGED}[$n++] = "Temperature Outside: ".$otemp;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $otemp." (Celsius)";;

-             $sensor="temperature-windchill";
+             $sensor="temperatureWindchill";
             $hash->{CHANGED}[$n++] = "WCT: ".$wct;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $wct." (Celsius)";;

-             $sensor="temperature-heatindex";
+             $sensor="temperatureHeatindex";
             $hash->{CHANGED}[$n++] = "HeatT: ".$hit;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $hit." (Celsius)";;

-             $sensor="temperature-inside";
+             $sensor="temperatureInside";
             $hash->{CHANGED}[$n++] = "Temperature Inside: ".$itemp;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $itemp." (Celsius)";;

-         $sensor="humidity outside";
+             $sensor="humidityOutside";
             $hash->{CHANGED}[$n++] = "Humidity Outside: ".$ohum;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $ohum." (%)";;

-         $sensor="humidity inside";
+             $sensor="humidityInside";
             $hash->{CHANGED}[$n++] = "Humidity Inside: ".$ihum;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $ihum." (%)";;

-         $sensor="windspeed";
+             $sensor="windspeed";
             $hash->{CHANGED}[$n++] = "Wind: ".$windspeed;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $windspeed." (km/h)";;

-         $sensor="10 min. average windspeed";
+             $sensor="10minAverageWindspeed";
             $hash->{CHANGED}[$n++] = "10 Min. Wind: ".$avgwindspeed;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $avgwindspeed." (km/h)";;

-         $sensor="wind direction";
+             $sensor="windDirection";
             $hash->{CHANGED}[$n++] = "Wind Direction: ".$winddir;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $winddir." (Degrees)";;

-         $sensor="solar";
+             $sensor="solar";
             $hash->{CHANGED}[$n++] = "Solar: ".$solar;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $solar." (Watt/m^2)";;

-         $sensor="UV";
+             $sensor="uv";
             $hash->{CHANGED}[$n++] = "UV: ".$uv;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $uv." (UV/Index)";;

-         $sensor="rainrate";
+             $sensor="rainrate";
             $hash->{CHANGED}[$n++] = "Rainrate: ".$rainrate;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $rainrate." (mm/h)";;

-         $sensor="day rain";
+             $sensor="dayRain";
             $hash->{CHANGED}[$n++] = "Dayrain: ".$drain;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $drain." (mm/day)";;

-         $sensor="month rain";
+             $sensor="monthRain";
             $hash->{CHANGED}[$n++] = "Monthrain: ".$mrain;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $mrain." (mm/month)";;

-         $sensor="year rain";
+             $sensor="yearRain";
             $hash->{CHANGED}[$n++] = "Yearrain: ".$yrain;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $yrain." (mm/year)";;

-         $sensor="storm rain";
-         $hash->{CHANGED}[$n++] = "SR: ".$stormrain;
-         $hash->{READINGS}{$sensor}{TIME} = TimeNow();
-         $hash->{READINGS}{$sensor}{VAL} = $stormrain." (mm/storm)";;
+             $sensor="stormRain";
+             $hash->{CHANGED}[$n++] = "SR: ".$stormrain;
+             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
+             $hash->{READINGS}{$sensor}{VAL} = $stormrain." (mm/storm)";;

-         $sensor="barometer";
+             $sensor="barometerMm";
             $hash->{CHANGED}[$n++] = "Barometer: ".$barometer;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $barometer." (Millimeters)";;

-         $sensor="barometer trend";
+             $sensor="barometerTrend";
             $hash->{CHANGED}[$n++] = "Barometer Trend: ".$btrend;
             $hash->{READINGS}{$sensor}{TIME} = TimeNow();
             $hash->{READINGS}{$sensor}{VAL} = $btrend;

-         $sensor="ET Day";
+         $sensor="etDay";
         $hash->{CHANGED}[$n++] = "ETD: ".$etday;
         $hash->{READINGS}{$sensor}{TIME} = TimeNow();
         $hash->{READINGS}{$sensor}{VAL} = $etday." (mm/day)";;

-         $sensor="ET Month";
+         $sensor="etMonth";
         $hash->{CHANGED}[$n++] = "ETM: ".$etmonth;
         $hash->{READINGS}{$sensor}{TIME} = TimeNow();
         $hash->{READINGS}{$sensor}{VAL} = $etmonth." (mm/month)";;

-         $sensor="ET Year";
+         $sensor="etYear";
         $hash->{CHANGED}[$n++] = "ETY: ".$etyear;
         $hash->{READINGS}{$sensor}{TIME} = TimeNow();
         $hash->{READINGS}{$sensor}{VAL} = $etyear." (mm/year)";;

+
+             #
+             # Readings by PC Web
+             #
+
+         $sensor="barometer";
+              $hash->{CHANGED}[$n++] = "Barometer: ".$barohPa;
+              $hash->{READINGS}{$sensor}{TIME} = TimeNow();
+              $hash->{READINGS}{$sensor}{VAL} = $barohPa." (hPa)";;
+
+                $sensor="humidityInsideAbsolute";
+              $hash->{CHANGED}[$n++] = "Humidity inside, absolute: ".$humidityInAbs;
+              $hash->{READINGS}{$sensor}{TIME} = TimeNow();
+              $hash->{READINGS}{$sensor}{VAL} = $humidityInAbs." (g/m^3)";;
+
+                 $sensor="humidityOutsideAbsolute";
+              $hash->{CHANGED}[$n++] = "Humidity outside, absolute: ".$humidityOutAbs;
+              $hash->{READINGS}{$sensor}{TIME} = TimeNow();
+              $hash->{READINGS}{$sensor}{VAL} = $humidityOutAbs." (g/m^3)";;
+
+                 $sensor="temperatureOutsideDew";
+              $hash->{CHANGED}[$n++] = "temperatureOutsideDew: ".$otempDew;
+              $hash->{READINGS}{$sensor}{TIME} = TimeNow();
+              $hash->{READINGS}{$sensor}{VAL} = $otempDew." (Celsius)";;
+
+                 $sensor="temperatureOutsideWetBulb";
+              $hash->{CHANGED}[$n++] = "temperatureOutsideWetBulb: ".$otempWet;
+              $hash->{READINGS}{$sensor}{TIME} = TimeNow();
+              $hash->{READINGS}{$sensor}{VAL} = $otempWet." (Celsius)";;
+
+                 $sensor="temperatureOutsideApparent";
+              $hash->{CHANGED}[$n++] = "temperatureOutsideApparent".$otempApp;
+              $hash->{READINGS}{$sensor}{TIME} = TimeNow();
+              $hash->{READINGS}{$sensor}{VAL} = $otempApp." (Celsius)";;
+
+             #
+             # End of Readings by PC Web
+             #
+
             DoTrigger($name, undef) if($init_done);   
        }
        $hash->{STATE} = $text;

Christoph Morrison

Und lieferst du auch noch eine Zusammenfassung, was dein Code ändert/verbessert?
Ansonsten ist mir bewusst, dass der Code des Moduls nicht besonders toll ist, aber dein Patch würde das jetzt auch nicht substanziell verbessern.

rudolfkoenig

Vernehme ich einen impliziten Wunsch, das Modul zu reaktivieren, und die Verantwortung als Maintainer dafuer zu uebernehmen?