WDS100 O C6 Rain 1h 24h Summe bilden

Begonnen von maxx8888, 02 Juli 2013, 21:40:10

Vorheriges Thema - Nächstes Thema

maxx8888

Hi!

Ich uploade meine Wetterdaten seit gestern bei Openweather.org.
Das funkioniert perfekt soweit.

Sensor Modell: HM-WDS100-C6-O

Readings:
Activity: alive 2013-07-01 01:45:22
CommandAccepted yes 2013-06-11 20:20:02
PairedTo 0x41 2013-06-11 20:21:14
R-intKeyVisib invisib 2013-06-11 20:21:14
R-pairCentral 0x41 2013-06-11 20:21:14
RegL_00: 01:00 02:01 05:00 0A:00 0B:00 0C:41 00:00 2013-06-11 20:21:14
RegL_01: 05:1E 00:00 2013-06-11 20:21:15
brightness 9 2013-07-02 21:35:40
humidity 60 2013-07-02 21:35:40
isRaining 0 2013-07-02 21:35:40
powerOn - 2013-06-11 20:49:45
rain 25.37 2013-07-02 21:35:40
state T: 21.1 H: 59 W: 0 R: 25.37 IR: 0 WD: 35 WDR: 22.5 S: 162 B: 9 2013-07-02 21:28:42
sunshine 162 2013-07-02 21:35:40
temperature 20.6 2013-07-02 21:35:40
unknown 06000000 2013-06-11 20:49:45
windDirRange 45 2013-07-02 21:35:40
windDirection 45 2013-07-02 21:35:40
windSpeed 0 2013-07-02 21:35:40

Jetzt würde ich gerne aus der aufkumulierten Regenmenge die Summe der letzten Stunde und der letzten 24 Stunden rausrechnen um sie ebenfalls bei Openweather upzuloaden.

Kann mir da wer einen Tipp geben wie das funktioniert?

Vielen Dank!!

Maxx

Frank S.

Moin.

Ich habe diese Wetterstation seit ein paar Tagen in Betrieb und möchte diese Regenmengen auch berechnen. Gibt es dort mittlerweile eine Idee, wie man dies für diesen Sensor umsetzen kann.

Schöne Grüße
Frank S.

Thomas Kregelin

Ich berechne die Werte wie folgt:

Zunächst ist eine Funktion zur Berechnung der Differenz der gemessenen Regenmengen in 99_MyUtils anzulegen:

(Abgeleitet von einer Funktion zur Mittelwertberechnung unter : http://www.fhemwiki.de/wiki/Relative_Mittelwerte_berechnen_und_loggen )


# myDiff
# berechnet die Differenz aus der ersten Zeile eines LogFiles und der letzten Zeile eines LogFiles über einen Zeitraum zwischen einem Zeitpunkt in der Vergangenheit und dem Zeitpunkt des Aufrufs
sub
myDiff($$$)
{
 my ($offset,$logfile,$cspec) = @_;
 my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset);
 my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime;
 my $oll = $attr{global}{verbose};
 $attr{global}{verbose} = 0;
 my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec"));
 $attr{global}{verbose} = $oll;
 my ($cnt, $first, $last, $diff) = (0)x4;
 foreach (@logdata){
  my @line = split(" ", $_);
  if(defined $line[1] && "$line[1]" ne ""){
   $cnt += 1;
    if ($cnt == 1) {
     $first = $line[1];
    }
   $last = $line[1];
  }
 }
$diff = $last - $first;
Log 4, ("myDiff: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, First: $first, Last: $last, Diff: $diff");
return $diff;
}


Danach in der fhem.cfg Folgendes hinzufügen (inklusive Umrechnung der Windmesswerte von km/h in m/s):


define RegenmengeOffset dummy
define RegenmengeTag dummy
define RegenmengeLast1Hours dummy
define RegenmengeLast3Hours dummy
define RegenmengeLast24Hours dummy
define WindSpeed_mps dummy

define RegenmengeNotify notify OC3:rain.* {\
  my $menge = (ReadingsVal("OC3", "rain", 0) - ReadingsVal("RegenmengeOffset", "state", 0));;\
  my $last1hours = myDiff("3600", "FileLog_OC3", "10:::");;\
  my $last3hours = myDiff("10800", "FileLog_OC3", "10:::");;\
  my $last24hours = myDiff("86400", "FileLog_OC3", "10:::");;\
  fhem("set RegenmengeTag $menge");;\
  fhem("set RegenmengeLast1Hours $last1hours");;\
  fhem("set RegenmengeLast3Hours $last3hours");;\
  fhem("set RegenmengeLast24Hours $last24hours");;\
}

define RegenmengeOffsetReset at *00:00:00 {\
  my $offset = ReadingsVal("OC3", "rain", 0);;\
  fhem("set RegenmengeOffset $offset");; \
}

define WindSpeedNotify notify OC3:windSpeed.* {\
  my $windspeed = (ReadingsVal("OC3", "windSpeed", 0) / 3.6);;\
  $windspeed = int(100 * $windspeed + 0.5) / 100;;\
  fhem("set WindSpeed_mps $windspeed") \
}


Dann können die Werte mit dem openweathermap Modul übertragen werden:


...
attr owo owoSrc03 rain_today:RegenmengeTag:state
attr owo owoSrc04 wind_speed:WindSpeed_mps:state
attr owo owoSrc05 rain_1h:RegenmengeLast1Hours:state
attr owo owoSrc06 rain_24h:RegenmengeLast24Hours:state
...


Gruß

Frank S.

Moin.

Danke für den Tipp. Hab's gerade ausprobiert und es funktioniert super.

Schöne Grüße
Frank S.

Frank S.

Moin.

Noch mal Danke für die Hilfe. Die Berechnung läuft seit gestern ohne Probleme.

Ein Spezialfall ist mir noch aufgefallen. Was passiert beim Überlauf des Zählers? In diesem Fall kommen bei der Berechnung negative Werte raus. Gibt es dort einen Weg, dies abzufangen?

Ich habe gestern dies auch für die Berechnung der Sonnscheindauer pro Tag angewendet. Funktioniert ja genauso, aber hier läuft der Zähler mehrmals am Tag über. Dieser geht nur von 0 bis 254.

Schöne Grüße
Frank S.

Frank S.

Moin.

Mir ist heute noch etwas aufgefallen. Ist es möglich das bei Übertagung des Wertes 0, dies nicht bei openweather.org aktualisiert wird? Dies ist unter anderem beim Wert "rain today" vorgestern war der Wert 7.2, gestern und heute bisher 0. Der Graf bieb bei 7.2 stehen und ist nicht auf 0 aktualisiert worden.

Laut Logfile wird aber der Wert 0 übertragen.

Schöne Grüße
Frank

Thomas Kregelin

Hi Frank,

ZitatWas passiert beim Überlauf des Zählers?

Tja - hab' ich mich zwischenzeitlich auch gefragt - der Regenmengezähler läuft meines Wissens bis 999 mm. Momentan ist bei mir noch viel Platz - hab' mir daher noch keine Lösung überlegt ...

ZitatIst es möglich das bei Übertagung des Wertes 0, dies nicht bei openweather.org aktualisiert wird?

Das Gefühl habe ich auch - vielleicht liegt es am owo Modul - dann wäre die Frage bei betateilchen (Link) richtig aufgehoben.

Vielleicht liegt es auch an openweathermap.org - bin noch nicht tiefer eingestiegen.

Übrigens habe ich unseren Sensor ins FhemWiki eingetragen (http://www.fhemwiki.de/wiki/HM-WDS100-C6-O). Falls du noch Ergänzungen hast - gerne ins Wiki eintragen.

PS: Hab' mir gestern auch noch den Taupunkt ausgeben lassen:

fhem.cfg:

...
define dew_state dewpoint dewpoint OC3 T H D
define dew_OC3 dewpoint dewpoint OC3 temperature humidity dewpoint
...
attr owo owoSrc07 dewpoint:OC3:dewpoint:273.15
...


Gruß
T


Frank S.

Moin.

Ich habe eine Lösung für den Überlauf gefunden. Ist garnicht so schwer. Wenn es einen Überlauf gibt, ist die Differnz negativ. Wenn dies der Fall ist, addiere ich 1000 dazu.

##########################################################
# myDiff
# berechnet die Differenz aus der ersten Zeile eines LogFiles und der letzten Zeile eines LogFiles über einen Zeitraum zwischen einem Zeitpunkt in der Vergangenheit und dem Zeitpunkt des Aufrufs
sub
myDiff($$$)
{
 my ($offset,$logfile,$cspec) = @_;
 my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset);
 my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime;
 my $oll = $attr{global}{verbose};
 $attr{global}{verbose} = 0;
 my @logdata = split("
", fhem("get $logfile - - $period_s $period_e $cspec"));
 $attr{global}{verbose} = $oll;
 my ($cnt, $first, $last, $diff) = (0)x4;
 foreach (@logdata){
  my @line = split(" ", $_);
  if(defined $line[1] && "$line[1]" ne ""){
   $cnt += 1;
    if ($cnt == 1) {
     $first = $line[1];
    }
   $last = $line[1];
  }
 }
$diff = $last - $first;
if ($diff < 0) {
     $diff += 1000;
   }
Log 4, ("myDiff: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, First: $first, Last: $last, Diff: $diff");
return $diff;
}


Schöne Grüße
Frank

Frank S.

Moin.

Auf eine ähnliche Weise berechne ich nun auch die Sonnenscheindauer der letzten Stunden.

Hier gibt es die Problematik, dass der Zähler nur bis 255 zählt. Daher kommt der Überlauf mehrmals am Tag. Daraus habe ich eine weitere Funktion in 99_MyUtils erstellt. Diese addiert die Differenzen zwischen den einzelnen Schritten, wenn ein Überlauf ist, dann wird 256 dazu addiert.

##########################################################
# mySunshine
# Die sonnenscheindauer aus LogFiles über einen beliebigen Zeitraum
sub
mySunshine($$$)
{
 my ($offset,$logfile,$cspec) = @_;
 my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset);
 my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime;
 my $oll = $attr{global}{verbose};
 $attr{global}{verbose} = 0;
 my @logdata = split("
", fhem("get $logfile - - $period_s $period_e $cspec"));
 $attr{global}{verbose} = $oll;
 my ($cnt, $akt, $last, $diff, $sum) = (0)x5;
 foreach (@logdata){
  my @line = split(" ", $_);
  if(defined $line[1] && "$line[1]" ne ""){
   $cnt += 1;
    if ($cnt == 1) {
     $last = $line[1];
    }
    else {
     $last = $akt;
    }
   $akt = $line[1];
   $diff = $akt - $last;

   if ($diff < 0) {
     $diff += 256;
   }
   $sum += $diff;

  }
 }

Log 4, ("myDiff: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, Akt.: $akt, Last: $last, Diff: $diff, Sum: $sum");
return $sum;
}


In fhem.cfg dann folgender Aufruf mit Speicherung der Sonnenscheindauer des letzten Tages.

## Sonnenscheindauer pro Tag
define SonnenscheinLastTag dummy
define Sonnenschein24h dummy

define SonnenscheinNotify notify Wetterstation:sunshine.* {\
         my $last24sunshine = mySunshine("86400", "FileLog_Wetterstation", "18:::");;\
         fhem("set Sonnenschein24h $last24sunshine") \
}

define SonnenscheinOffsetReset at *23:58:00 {\
                 my $last24sunshine = mySunshine("86400", "FileLog_Wetterstation", "18:::");;\
         fhem("set SonnenscheinLastTag $last24sunshine");;\
}

define FileLog_SonnenscheinTag FileLog /var/InternerSpeicher/fhem/log/SonnenscheinTag-%Y.log SonnenscheinLastTag
attr FileLog_SonnenscheinTag logtype text
attr FileLog_SonnenscheinTag room CUL_HM


Eine Frage zum Abschluss, welche Einheit hat der Wert sunshine?

Schöne Grüße
Frank S.


Frank S.

Nachtrag zu meiner Frage nach der Einheit von sunshine.

Ich habe mir das LogFile noch mal angesehen. Es müssen Minuten sein.

Denn,

17:07:00  S: 123
17:10:00  S: 126

Schöne Grüße
Frank

cwagner

#10
Guten Morgen, eine wirklich tolle Zusammenstellung von Tipps und Ideen, die ich alle ausprobieren werde. Überzeugend und superverständlich dargestellt - Danke dafür

Auf den ersten Blick würde ich die Tagesregenmenge allerdings im Timer (AT) unterbringen und nicht von einem Trigger-Ereignis abhängig machen. Damit kann ich sicherstellen, dass immer zu einem festen Zeitpunkt die Regenmenge festgehalten wird. Das entspricht auch den Gepflogenheiten der staatlichen Wetterdienste, die aktuell (Sommerzeit) immer um 7.50 Uhr die Tagesmenge der letzten 24 Stunden protokollieren. Du hast es beim Saldieren der Sonnenminuten ja genauso gemacht.

RegenmengeLast24h verstehe ich dann als gleitenden Rückblick über die letzten 24 Stunden.

Ich benutzte die Station seit Frühjahr und  beim Regenzähler ist mir eine Missweisung im Faktor 1,2 aufgefallen. Wenn ich exakt 1 Liter Regen habe, zeigt meine Station etwa 1.2.
Mit Hilfe Deiner Routinen werde ich diesen punktuell ermittelten Wert jetzt mal systematisch checken - in diesem Augenblick sieht es aber nach Sonne aus und so werde ich Deinen Sonnenminutenzähler heute besonders gerne nutzen.

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

daschauher

Hallo an Alle,

die myDiff Funktion habe ich bei mir auch eingebunden und funktioniert bestens.

Ich bin gerade dabei die Logfiles zu optimieren. Neben der Verkleinerung der Dateigröße habe ich nun auch eine Klima_Log Datei, in der die Wetterstation und alle anderen Thermostate enthalten sind. Quasi ein Logfile für alle Temperaturen.
Leider funktioniert jetzt der Dummie nicht mehr der Anzeigt wieviel es in der letzten Stunde geregnet hat.
Es gibt da noch einen anderen Sensor der mehr als 10 Stellen im Logfile hat. Ich vermute die myDiff Funktion sucht sich den letzten Eintrag raus der 10 Stellen hat, weil dort ja der Regenwert steht.
Die Frage ist nun ob sich die myDiff Funktion so umbauen lässt dass man beim Aufruf der Funktion noch den Namen des Sensors mit angeben kann dessen Wert dann abgerufen wird?
Selbst verstehe ich da leider zu wenig davon und bin für jede hilfe dankbar.

Grüsse
Markus

daschauher

Hallo nochmal,

Kommando zurück  ;)
Habs mittlerweile durch viel rumprobieren und etwas Glück selbst hin bekommen...

Roli1606

Hallo,

ist es auch möglich den Sonnenschein von 24 Uhr an zu addieren? Momentan schreibt er den Wert der letzten 24 h auf.

Vielen dank schon mal
Roland
Cubietruck mit Stefanius Image
FHEM 5.8
HMLAN
und CUL

Roli1606

#14
Ich habe es gelöst wenn auch etwas umständlich. hier der Code falls den jemand brauchen kann.

define Sonnenschein_Tag_at at +*00:05:00 {\
my $ssm = (($hour*3600)+($min*60)+$sec);;\
        my $since24sunshine = mySunshine("$ssm", "FileLog_Sens_Wetterstation", "18:::");;\
        fhem("set Sonnenschein_Tag $since24sunshine") \
}
attr Sonnenschein_Tag_at room Wetter

Gruß Roland
Cubietruck mit Stefanius Image
FHEM 5.8
HMLAN
und CUL