HM-WDS100-C6-O Regenmenge zurücksetzen

Begonnen von herman, 07 August 2013, 17:01:08

Vorheriges Thema - Nächstes Thema

herman

Ich bin überrascht, dass ich zu diesem Thema im Forum nichts gefunden habe.

Die Wetterstation scheint die Sonnenscheindauer und die Regenmenge fortlaufend weiter zu zählen.
Zur Steuerung der Bewässerung möchte ich die Regenmenge pro Tag errechnen.

Würdet Ihr das über ein notify lösen und die Differenz in einem Reading am Gerät speichern oder gibt es einen eleganteren Weg über das Log? Leider habe ich noch zu wenig Erfahrung mit den ganzen Log-Funktionen - ich habe gesehen, dass es einige Beispiele von Graphen mit delta Funktionen gibt.

Hat jemand vlt. schon eine Lösung für das Thema?

Vielen Dank & Grüße,
Merhan

herman

Ich habe folgende, simple Lösung umgesetzt:

zwei Funktionen in my_utils:

sub BestimmeRegenmengeProTag()
{
     my $menge = "";
    $menge .= (ReadingsVal("Wetterstation", "rain", 0) - ReadingsVal("RegenmengeOffset", "state", 0));
    { fhem("set RegenmengeTag $menge") }
}

sub SetRegenmengeOffset()
{
    my $offset = "";
    $offset .= ReadingsVal("Wetterstation", "rain", 0);
    { fhem("set RegenmengeOffset $offset") }
}

Jedes Mal wenn die Station neue Daten schickt, wird die Regenmenge / Tag aktualisiert. Das Offset wird einmal am Tag, nach der Bewässerung zurückgesetzt.


/// fhem.cfg

define RegenmengeTag dummy
define RegenmengeOffset dummy

define RegenmengeNotify notify Wetterstation {BestimmeRegenmengeProTag()}
define RegenmengeOffsetReset at *19:30:00 {SetRegenmengeOffset()}

martinp876

oder gleich in ein Notify:

define RegenmengeNotify notify Wetterstation:rain.* {\
         my $menge = (ReadingsVal("Wetterstation", "rain", 0) -\
                ReadingsVal("RegenmengeOffset", "state", 0));;\
    fhem("set RegenmengeTag $menge") \
}

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


wichtig wäre beim notify nur auf ein Event zu triggern. Wenn die Station sich meldet werden 9 trigger ausgelöst - und jedes mal errechnest du den regenwert. Das kostet unnötig Performance.

Ansonsten ist meine Variante exakt deine nur ohne Util.

Gruss Martin

Frank S.

Moin.

Danke für den Tipp. Ich habe Deine Variante gerade ausprobiert. Aber wie würden man auf ein Event triggern?

Schöne Grüße
Frank S.

Frank S.

Moin.

Noch ein Nachtrag zu meiner Frage. Die Erfassung der Regenmenge funktioniert super. Danke für den Tipp.

Nun möchte ich die Daten in ein LogFile schreiben. Es wird alle drei Minuten eine Zeile ins Logfile geschrieben. Wie kann man es hinbekommen, dass er nur alle Stunden, nach der Berechnung der Regenmenge einen EIntrag bekommt?

## Regenmenge pro Test
define Regenmenge_Test dummy
define RegenmengeOffset_Test dummy

define RegenmengeNotify_Test notify Wetterstation:rain.* {\
         my $menge = (ReadingsVal("Wetterstation", "rain", 0) -\
                ReadingsVal("RegenmengeOffset_Test", "state", 0));;\
    fhem("set Regenmenge_Test $menge") \
}

define RegenmengeOffsetReset_Test at +*00:01:00 {\
                 my $offset = ReadingsVal("Wetterstation", "rain", 0);;\
                 fhem("set RegenmengeOffset_Test $offset");; \
}

define FileLog_Regenmenge_Test FileLog /var/InternerSpeicher/fhem/log/Regenmenge_Test-%Y.log Regenmenge_Test
attr FileLog_Regenmenge_Test logtype text
attr FileLog_Regenmenge_Test room CUL_HM


Schöne Grüße
Frank S.

Frank S.

Moin.

Nach dem ich mich mal wieder mit den Handbuch beschäftgit habe, habe ich festgestellt, dass die Datei jedes mal neu geschrieben wird, wenn die Variable aktualisiert wurden. In diesem Fall "Regenmenge_Test". Nun habe ich mir eine Variable "Regenmenge_Test_log" geschaffen, die die mit dem Wert von "Regenmenge_Test" aktualisert wird, wenn der Offset gesetz wird. Danach wird das Logfile geschrieben.

## Regenmenge pro Test
define Regenmenge_Test dummy
define Regenmenge_Test_log dummy
define RegenmengeOffset_Test dummy

define RegenmengeNotify_Test notify Wetterstation:rain.* {\
         my $menge = (ReadingsVal("Wetterstation", "rain", 0) -\
                ReadingsVal("RegenmengeOffset_Test", "state", 0));;\
    fhem("set Regenmenge_Test $menge") \
}

define RegenmengeOffsetReset_Test at +*00:30:00 {\
                 my $offset = ReadingsVal("Wetterstation", "rain", 0);;\
                 my $menge_log = ReadingsVal("Regenmenge_Test", "state", 0);;\
                 fhem("set RegenmengeOffset_Test $offset");; \
                 fhem("set Regenmenge_Test_log $menge_log");; \
}

define FileLog_Regenmenge_Test FileLog /var/InternerSpeicher/fhem/log/Regenmenge_Test-%Y.log Regenmenge_Test_log
attr FileLog_Regenmenge_Test logtype text
attr FileLog_Regenmenge_Test room CUL_HM


Schöne Grüße
Frank

Frank S.

Moin.

Die Lösung funktioniert super. Ein Problem gibt aber noch. Die Zähler für die Regenmenge kann einen Überlauf haben, von 999 auf 0. Gibt es dort eine Möglichkeit, dies abzufnagen und zu verarbeiten?

Schöne Grüße
Frank S.

martinp876

ich würde einen dummy erzeugen. Immer wenn ins logfile geschrieben wird würde ich den wert auch in den dummy schreiben. Vor dem update kannst du prüfen, dass der alte wert (aus dummy)kleiner ist, als der neue. Wenn nicht, war es ein überlauf, du speicherst einen offset von +1000 im dummy in einem Reading. Ich hoffe, das konzept ist verstanden - die details kannst du sicher berets selbst.

Gruss Martin


Frank S.

Moin.

Danke für die Antwort.

Die Idee zu dem Konzept hatte ich. Wenn Wert in Wetterstation kleiner als Offset, dann erhöhe die Menge um 1000.

Da ich ich seit einigen Jahren in C und PHP programmiere, wüsste ich, wie ich es dort umsetzen kann. Nun wollte ich mit aber in FHEM und Perl einarbeiten, scheitere aber häufig an der Syntax, die meiner Meinung für einen Umsteiger unübersichtlich ist.

In C würde ich es so lösen.

if(WertinStation < Offset) {menge = WertinStation - Offset + 1000;}

Schöne Grüße
Frank S.

martinp876

waere es nicht eher so:

if (menge < WS + offset){
offset +=1000;
}
menge = WS + offset;

wobei menge und offset gemerkt werden müssen.
Offset könnte man auch aus der Menge errechnen, dann hat man nur eine Variable, aber mehr rechenaufwand:

if (menge%1000 > WS){
menge +=1000;
}
menge = WS + int(menge/1000)*1000;


wobei ich einem Sensor nicht auf die letzte Stelle traue und eine Hysterese vorsähe, die zu justieren wäre

if (menge%1000 > WS + 20){
menge +=1000;
}
menge = WS + int(menge/1000)*1000;


somit kannst du alles mit der variable "state " eines dummy-elements erschlagen

Frank S.

Moin.

Danke für den Tipp. Ich werde es die Tage mal ausprobieren.

Schöne Grüße
Frank S.

pointde

Der Thread ist zwar schon etwas älter, aber betrifft mich genau...
Wie kann ich es anstellen, dass der Regenwert jeden Tag um 23:30 zurückgesetzt wird.
Cool wäre es auch, ihn in l/m² anzugeben.
Könnte mir hierbei bitte jemand helfen?!

martinp876

Baue ein at um 22:30. Nehme den Wert und speichere den als offset. Dann baue einen differenziert. Fertig.
Schaue die einmal average an, vielleicht hilft dies auch.

MandelHL

#13
Hallo zusammen,

ich habe seit gestern meiner Wetterstation HM-WDS100-C6-O-2 am laufen. Wo der Unterschied zwischen der "...-2" und der im Betreff genannten Station liegt, weiß ich nicht.

Der Regensensor zeigt die ganze Zeit 9.145 mm/qm an, obwohl es noch nicht geregnet hat.
Bevor ich jetzt alles programmiere und auch die Aufzeichnungen der einzelnen Tage logge, würde ich erst einmal den Regensensor auf Null setzen. Nur auf Null setzen, ohne Zeiten zu programmieren.
Ich habe bisher nirgendwo etwas dazu gefunden, wie das geht.

Später würde ich dann die Wetterdaten gerne täglich loggen.
Aber die erwähnte Datei
Zitatzwei Funktionen in my_utils:
habe ich nicht.

Muss ich die selbst erstellen?

Der Thread ist ja ziemlich alt. Vielleicht gibt es ja sogar neue Möglichkeiten oder bereits bestehende Ideen, die Wetterstation optisch und von den Funktionen her in FHEM einzubinden.
Ich habe schon einiges gelesen und werde mir ansonsten aus allen etwas heraussuchen.

Danke und viele Grüße
Mandel