readingsUpdate, STATE and reading state

2,038 views
Skip to first unread message

Willi

unread,
Oct 17, 2012, 6:02:24 PM10/17/12
to fhem-de...@googlegroups.com
Hallo,

ich habe soeben testweise das Modul TRX_WEATHER auf die Nutzung von readingsUpdate umgestellt.

Der erste Teil funktioniert auch gut. Die mittels
  attr BTHR918N_60 event-on-change-reading battery,dewpoint,forecast,humidity,pressure,temperature
angegeben Reading werden von Filelog nur geschrieben, wenn sich diese ändern.

Problem ist aber STATE. Dieses wird immer im Filelog geschrieben.
Hört sich erst mal logisch, an da es kein Reading und somit nicht durch event-on-change-reading in readingUpdate() behandelt werden kann.

Also habe ich mir gedacht, dass ich statt STATE das Reading state schreibe.

Problem ist hier aber, dass dann im Filelog statt vorher
2012-10-17_23:54:13 BTHR918N_60 T: 19.8 H: 53 P: 999 D: 10.0 BAT: ok
jetzt "state:" vorangestellt wird:
2012-10-17_23:54:13 BTHR918N_60 state: T: 19.8 H: 53 P: 999 D: 10.0 BAT: ok

Damit funktionieren die gplots, die T: H: etc. nach Position auswerten natürlich nicht mehr.

Wie ist das mit dem Reading "state" und STATE gedacht?

Wie bekommt man den state/STATE richtig als Event ins Filelog und wie kann man diesen mittels event-on-change-reading unterdrücken, damit nur Änderungen geloggt werden?
Und zwar kompatibel zum bisherigen Verhalten?

Grüße

Willi

Rudolf Koenig

unread,
Oct 18, 2012, 3:24:21 AM10/18/12
to fhem-de...@googlegroups.com
> Wie bekommt man den state/STATE richtig als Event ins Filelog

Im Moment gar nicht. Man muesste beim Setzen des Readings state auch STATE
setzen bzw. ein event ohne den Namen des Readings erzeugen. Das koennte man in
setReadingsVal oder DoTrigger machen. DoTrigger ist generisher, bedeutet also
die Pruefung von mehr Modulen auf Seiteneffekte.

Laengerfristig bedeutet das, dass:
- entweder die aktuelle Doppelspeicherung STATE == Readings->state
behalten wird,
- oder die meisten FileLog / gnuplot Definitionen umgebaut werden muessen, was
wiederum auch den Umbau der Altdaten erfordert.

Ich bin z.Zt fuer STATE behalten.

Willi

unread,
Oct 18, 2012, 5:43:10 AM10/18/12
to fhem-de...@googlegroups.com
Finde ich gut. Ansonsten funktionieren bei vielen Anwendern die alten Filelogs nicht mehr oder müssten konvertiert werden........

Die Änderung in DoTrigger, um bei Reading "state" ein Event ohne den Namen des Readings zu generieren fände ich gut.

Machst Du mir einen Vorschlag dafür (diff für fhem.pl) oder soll ich versuchen zu verstehen wie DoTrigger() funktioniert und einen Änderungsvorschlag machen?

Ich bin gerne bereit dies dann intensiv auf mehreren Systemen zu testen, bevor es ins SVN kommt.

Danke!

Rudolf Koenig

unread,
Oct 18, 2012, 6:48:36 AM10/18/12
to fhem-de...@googlegroups.com
> Machst Du mir einen Vorschlag daf�r (diff f�r fhem.pl) oder soll ich
> versuchen zu verstehen wie DoTrigger() funktioniert und einen
> �nderungsvorschlag machen?

DoTrigger ist mir zu heikel. Lieber nur setReadingsVal + readingsUpdate
===================================================================
--- fhem.pl (revision 1966)
+++ fhem.pl (working copy)
@@ -2688,6 +2688,9 @@
my ($hash,$rname,$val,$ts) = @_;
$hash->{READINGS}{$rname}{VAL} = $val;
$hash->{READINGS}{$rname}{TIME} = $ts;
+ if($rname eq "state") {
+ $hash->{STATE} = $val;
+ }
}

sub
@@ -2928,6 +2931,7 @@
#Log 1, "changed!" if($changed); # DEBUG
my $rv= "$reading: $value";
addEvent($hash, $rv) if($changed);
+ addEvent($hash, $value) if($changed && $reading eq "state");

return $rv;
}

Willi

unread,
Oct 18, 2012, 6:50:55 AM10/18/12
to fhem-de...@googlegroups.com
Super! Ich melde mich nach Test!

Willi

unread,
Oct 18, 2012, 2:52:19 PM10/18/12
to fhem-de...@googlegroups.com
Hallo Rudi,

vielen Dank für den Änderungsvorschlag. Ich habe getestet.

Die Änderung:
  
@@ -2928,6 +2931,7 @@
   #Log 1, "changed!" if($changed); # DEBUG
   my $rv= "$reading: $value";
   addEvent($hash, $rv) if($changed);
+  addEvent($hash, $value) if($changed && $reading eq "state");
   


hat leider als Nebeneffekt, dass dann zwei Events generiert werden, nämlich für "state:" und ohne:
2012-10-18_19:53:18 BTHR918N_3a state: T: 19.8 H: 55 P: 1003 BAT: ok
2012-10-18_19:53:18 BTHR918N_3a T: 19.8 H: 55 P: 1003 D: 10.5 BAT: ok

Was funktioniert, ist diesen Abschnitt statt dessen wie folgt zu ändern:

"
   my $rv= "$reading: $value";
+  $rv = "$value" if($changed && ($reading eq "state")); 
   addEvent($hash, $rv) if($changed);
"

Damit klappt es auch mittels
   attr BTHR918N_3a event-on-change-reading state
nur den State als Event zu loggen, sofern sich dieser geändert hat.

Positiv an der Änderung ist, dass man durch setzen des Readings "state" mit der Funktion readingsUpdate() auch automatisch STATE gesetzt hat. Es schadet allerdings auch nicht diesen zusätzlich noch einmal im Modul zu setzen, wie dies bei einigen Modulen der Fall ist, die bereits readingsUpdate()  verwenden.
Man braucht sich also in Zukunft nicht mehr um STATE zu kümmern, hat es aber aus Kompatibilitätsgründen immer noch.

Wenn die oben genannte Änderung für Dich so ok ist, teste ich noch weiter.

Anbei der komplette DIFF der Version, die ich aktuell verwende.

Grüße

Willi
---------------------------------------------------------
--- fhem.pl.orig 2012-10-17 22:48:05.580892635 +0200
+++ ../bin/fhem.pl 2012-10-18 20:44:50.503346598 +0200
@@ -2688,6 +2688,9 @@
   my ($hash,$rname,$val,$ts) = @_;
   $hash->{READINGS}{$rname}{VAL} = $val;
   $hash->{READINGS}{$rname}{TIME} = $ts;
+  if($rname eq "state") { 
+    $hash->{STATE} = $val; 
+  } 
 }
 
 sub
@@ -2927,6 +2930,7 @@
   # add to CHANGED hash
   #Log 1, "changed!" if($changed); # DEBUG
   my $rv= "$reading: $value";
+  $rv = "$value" if($changed && ($reading eq "state")); 
   addEvent($hash, $rv) if($changed);
   
   return $rv;

Rudolf Koenig

unread,
Oct 19, 2012, 3:22:43 AM10/19/12
to fhem-de...@googlegroups.com
> hat leider als Nebeneffekt, dass dann zwei Events generiert werden, n�mlich > f�r "state:" und ohne:

Das war mir bewusst. Wenn das ein Problem ist, dann postulieren wir: Readings
stehen auch als event im Form von "ReadingsName: Wert" zur Verfuegung.
Ausnahme ist "state", da wird nur der Wert gemeldet.


> Anbei der komplette DIFF der Version, die ich aktuell verwende.

Eingecheckt.

Willi

unread,
Oct 19, 2012, 4:13:08 AM10/19/12
to fhem-de...@googlegroups.com
Am Freitag, 19. Oktober 2012 09:22:45 UTC+2 schrieb Rudolf Koenig:
Eingecheckt.

Super! Danke! 

Willi

unread,
Oct 19, 2012, 1:44:50 PM10/19/12
to fhem-de...@googlegroups.com
Zur Info. Ich habe soeben eine neue Version des TRX_WEATHER-Moduls eingecheckt (inkl. Doku in commandref.html). Dieses nutzt jetzt readingsUpdate(), so dass jetzt auch die Attribute event-on-update-reading und event-on-change-reading genutzt werden können.

Zusammen mit der Änderung von Rudi kann man auch state als Reading nutzen.

Ist dann also morgen per updatefhem verfügbar.

MfG Willi
Reply all
Reply to author
Forward
0 new messages