Zusammenspiel von event-on-change-reading und event-min-interval?

Begonnen von Tobias, 23 April 2013, 13:13:14

Vorheriges Thema - Nächstes Thema

rudolfkoenig

Ich mag Leute, die sich im Not selbst helfen :)

Kann ich davon ausgehen, dass diese Loesung ausreichend ist?

Tobias

hmm, zu früh gefreut... doch nicht. Ich geh davon aus das ich in fhem.pl etwas anpassen muss. Komme aber das WE nicht dazu
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Tobias

kurze Bitte an alle weiteren betroffenen, und Rudi.
Könnt ihr bitte mal folgenden Patch in fhem.pl testen?
Damit sollte ein Event nur nur dann generiert werden wenn
MinIntervall abgelaufen ist und keine Wertänderung stattgefunden hat sowie innerhalb von MinInterval eine Wertänderung stattfindet.
Es muss das Reading sowohl in "Event-on-change" als auch in "Event-on-update" als auch in "event-min-intervall" enthalten sein.
--- fhem.pl.org 2013-05-28 14:42:35.000000000 +0200
+++ fhem.pl     2013-05-28 15:15:23.000000000 +0200
@@ -3244,7 +3244,7 @@
     $changed= !($attreocr || $attreour)
               || $eour
               || ($eocr && ($value ne $readings->{VAL}));
-    #Log 1, "EOCR:$eocr EOUR:$eour CHANGED:$changed";
+    #Log 3, "Reading:$reading, Value:$value,EOCR:$eocr EOUR:$eour CHANGED:$changed";

     my @v = grep { my $l = $_;
                    $l =~ s/:.*//;
@@ -3254,10 +3254,18 @@
       my $now = $hash->{".updateTime"};
       my $le = $hash->{".lastTime$reading"};
       if($le && $now-$le < $minInt) {
-        $changed = 0 if(!$eocr);
+        if(!$eocr || ($eocr && $value eq $readings->{VAL})){
+          $changed = 0;
+        } else {
+          $hash->{".lastTime$reading"} = $now;
+        }
+        #Log 3, "Test 1";
+        #Log 3, "Reading:$reading, LastTimeReading:$reading $le, Now:$now, MinInt:$minInt, EOCR:$eocr, changed:$changed";
       } else {
         $hash->{".lastTime$reading"} = $now;
         $changed = 1 if($eocr);
+        #Log 3, "Test 2";
+        #Log 3, "Reading:$reading, LastTimeReading:$reading $le, Now:$now, MinInt:$minInt, EOCR:$eocr, changed:$changed";
       }
     }
   }

Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

rudolfkoenig

Meiner Ansicht nach ist das ok so, ich habe es auch eingecheckt.

Ich meine aber, dass in diesem Fall das Attribut event-on-update-reading irrelevant ist, es betrifft nur die beiden anderen, was mAn verstaendlich ist.

locodriver

@Rudolf:
Danke für die aktuellen Änderungen für die 3 Attribute. Ich hätte noch eine Bitte/Anregung, um die Handhabung der 3 Attribute zu erleichtern.

Ich habe z.Z. die Readings eines HM-TCs mit allen 3 Attributen maskiert:

attr BD_Regler event-min-interval actuator:900,measured-temp:900,desired-temp:900,humidity:900
attr BD_Regler event-on-change-reading actuator,measured-temp,desired-temp,humidity
# attr BD_Regler event-on-update-reading actuator,measured-temp,desired-temp,humidity


Das Log wird dadurch übersichtlicher und es gehen auch keine für den Plot notwendigen Daten verloren. Allerdings werden ja jetzt nur noch die Readings geloggt, welche explizit in den Attributen genannt werden. Dazu hätte ich einen Vorschlag: Ist es möglich, zu den gerätespezifischen Readings noch zwei allgemein gültige Argumente zu implementieren - z.B. "all" (ist ja jetzt als Default gesetzt, wenn die Attribute nicht definiert werden) und "nothing"? Dann könnte man z.B. die wichtigen Readings in der genannten Art loggen und andere nur bei Veränderungen, um Tipp- und Kopierfehler zu vermeiden, die bei vielen Argumenten auftreten können:

attr BD_Regler event-on-change-reading all

Beim TC z.b. Batterie, Betriebsart, Anzeigeart usw.?

Oder kann man in der jetzigen Implementierung die Argumentliste als String übergeben? So in der Art:

Logliste=actuator,measured-temp,desired-temp,humidity
attr BD_Regler event-on-change-reading Logliste


Danke Uwe
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

rudolfkoenig

> noch zwei allgemein gültige Argumente zu implementieren

Verstehe nicht wieso und wozu, aber:
- all kann man als .* schreiben (beide Attribute nehmen eine Liste von regexps!)
- nothing kann man als solches hinschreiben, ich kenne kein Reading mit dem Namen nothing


>  Oder kann man in der jetzigen Implementierung die Argumentliste als String übergeben?

Nicht wirklich.
WENN mann auf save (inkl autocreate) verzichtet, dann kann man defaultattr verwenden, das ist mAn noch eleganter.

locodriver

Zitat- all kann man als .* schreiben (beide Attribute nehmen eine Liste von regexps!)

Werde ich mal probieren, habe ich mit diesen Attributen noch nicht in Zusammenhang gebracht.

Zitat>  Oder kann man in der jetzigen Implementierung die Argumentliste als String übergeben?

Nicht wirklich.
WENN mann auf save (inkl autocreate) verzichtet, dann kann man defaultattr verwenden, das ist mAn noch eleganter.

Autocreate habe ich deaktiviert; wie würde sowas aussehen?
fhem 6.0 auf Rpi3 Bookworm
HM-LAN-CFG (FW 0.965), HM-MOD-UART, 2x HM-TC-IT-WM-W-EU, 4x HM-Sec-RHS und 3x HM-CC-RT-DN, 6x HM-LC-Bl1-FM mit je 1x Somfy-Motor,
2x HM-LC-SW2-FM für Licht und Lüfter, 2x HM-PB-6-WM55, Alexa, Jeelinkcross, CUL, CUNO2, IR-Blaster

rudolfkoenig

> wie würde sowas aussehen?

Siehe http://fhem.de/commandref.html#setdefaultattr
Ein bisschen Mitdenken ist hier wirklich erwuenscht.

Willi

Ich muss mal ein großes Lob loswerden (@Rudi, @Tobias, und wen ich sonst noch vergessen habe).
Das Zusammenspiel von event-on-change-reading und event-min-interval finde ich phantastisch!

Damit kann ich meine gesprächigen Oregon-Sensoren beibringen weniger zu loggen (bzw. Events zu generieren) und andererseits bekomme ich aber sofort Änderungen mit.

So definiere ich jetzt die Oregon-Sensoren wie folgt:

define Alte_Garage TRX_WEATHER BTHR918
attr Alte_Garage event-min-interval state:600
attr Alte_Garage event-on-change-reading state
attr Alte_Garage event-on-update-reading .*


Im Zusammenspiel mit folgendem Filelog, der nur die T:-Zeilen loggt:
define FileLog_Alte_Garage FileLog /var/log/fhem/Alte_Garage-%Y.log Alte_Garage:T\x3a.*
attr FileLog_Alte_Garage logtype temp4press8:Temp/Press,temp4hum6dew10:Temp/Hum,text


Damit habe ich jetzt folgendes im Log:
Zitat2013-08-27_12:21:29 Alte_Garage T: 19.9 H: 69 P: 1005 D: 14.0 BAT: low RSSI: 5
2013-08-27_12:31:37 Alte_Garage T: 19.9 H: 69 P: 1005 D: 14.0 BAT: low RSSI: 5
2013-08-27_12:41:45 Alte_Garage T: 19.9 H: 69 P: 1005 D: 14.0 BAT: low RSSI: 5
2013-08-27_12:47:27 Alte_Garage T: 20 H: 68 P: 1005 D: 13.9 BAT: low RSSI: 5
2013-08-27_12:57:35 Alte_Garage T: 20 H: 68 P: 1005 D: 13.9 BAT: low RSSI: 5

Wie man sieht wird normalerweise alle 10 Minuten geloggt. Um 12:47:27 hat sich die Temperatur verändert und damit wurde ausserhalb der Reihe sofort ein Event generiert.

Grüße

Willi
FHEM@Q600(debian) mit DS9490R (1Wire) | FHEM@Sheevaplug(debian) mit RFXCOM-Receiver(80002), CULv3 & USB-WDE1 | FHEM@odroid mit CULv2 & RFXtrx433