stateFormat wird beim Start nicht ausgewertet?

Begonnen von Reinerlein, 18 Januar 2013, 09:36:26

Vorheriges Thema - Nächstes Thema

Reinerlein

Hallo,

ich habe gerade bei meinen 1wire Temperatur-Sensoren das Attribut stateFormat eingesetzt. Damit formatiere ich den State so, dass nur noch die Temperatur dort steht und das Grad-Zeichen mit einem C dahinter.
Das funktioniert soweit prima. Danke für dieses Feature.

Allerdings ist mir aufgefallen, dass nach einem Neustart von FHEM, zwar die Temperatur neu eingelesen wird (Zumindest ist der Zeitstempel frisch), allerdings in meinem State dann wieder die Originalformatierung (mit Temperature und Alarm) steht.
Erst wenn die Temperatur nach dem eingestellten Interval aktualisiert wird, stimmt die Anzeige wieder...

Das Feature scheint also beim ersten Mal nicht richtig zu greifen... Hat das noch jemand so beobachten können?

Grüße Reinerlein

rudolfkoenig

stateFormat wird nur im readingsEndUpdate ausgewertet, und das passiert nur, falls das Modul ein Reading (auf Grund von Hardware-Meldung) aendert. STATE sollte aber in fhem.state gespeichert sein, und anhand dessen beim Start wieder gesetzt sein. Koennte ich eine genauere Beschreibung bzw. ein Beispiel (_minimales_ fhem.cfg+fhem.state) zum reproduzieren haben?

Reinerlein

Hi Rudi,

also, die Definition der 1wire Devices:
define OWServer OWServer localhost:4304

define hwr_Temperatur OWDevice 28.B42472040000 15
attr hwr_Temperatur model DS18B20
attr hwr_Temperatur stateFormat temperature °C


und hier mal der Auszug aus dem Statefile dazu:
setstate hwr_Temperatur 21.6875 °C
setstate hwr_Temperatur 2013-01-18 11:46:13 alarm 1
setstate hwr_Temperatur 2013-01-18 11:46:13 state temperature: 21.6875  alarm: 1
setstate hwr_Temperatur 2013-01-18 11:46:13 temperature 21.6875

Ist das mit diesen mehrfachen setstate-Anweisungen normal?

Hier mal das Listing, bevor es aktualisiert wurde:
Internals:
   DEF        28.B42472040000 15
   IODev      OWServer
   NAME       hwr_Temperatur
   NR         11
   STATE      temperature: 21.5  alarm: 1
   TYPE       OWDevice
   Readings:
     2013-01-18 17:27:57   alarm           1
     2013-01-18 17:27:57   state           temperature: 21.5  alarm: 1
     2013-01-18 17:27:57   temperature     21.5
   Fhem:
     address    28.B42472040000
     alerting   1
     bus        bus.0
     interfaces temperature
     interval   15
     getters:
       address
       crc8
       family
       fasttemp
       id
       locator
       r_address
       r_id
       r_locator
       temperature
       temperature10
       temperature11
       temperature12
       temperature9
       temphigh
       templow
       type
     polls:
       temperature
     setters:
       temphigh
       templow
     state:
       temperature
Attributes:
   model      DS18B20
   stateFormat temperature °C


und hier ein Listing des Geräts, wenn es dann aktualisiert wurde:
Internals:
   DEF        28.B42472040000 15
   IODev      OWServer
   NAME       hwr_Temperatur
   NR         11
   STATE      21.125 °C
   TYPE       OWDevice
   Readings:
     2013-01-18 17:24:58   alarm           1
     2013-01-18 17:24:58   state           temperature: 21.125  alarm: 1
     2013-01-18 17:24:58   temperature     21.125
   Fhem:
     address    28.B42472040000
     alerting   1
     bus        bus.0
     interfaces temperature
     interval   15
     getters:
       address
       crc8
       family
       fasttemp
       id
       locator
       r_address
       r_id
       r_locator
       temperature
       temperature10
       temperature11
       temperature12
       temperature9
       temphigh
       templow
       type
     polls:
       temperature
     setters:
       temphigh
       templow
     state:
       temperature
Attributes:
   model      DS18B20
   stateFormat temperature °C

Warum sind hier eigentlich das Reading "state" und der "STATE" selbst denn unterschiedlich?

Die Zeitstempel nicht beachten, ich habe die Datenabzüge kreuz und quer gemacht. Das Problem tritt ja immer auf...

Grüße Reinerlein

rudolfkoenig

Ist wohl ein Bug:
- fhem.pl liest die Definition (fhem.cfg, erst define, dann attr mit stateFormat)
- DefineFn in OWServer setzt den Status, aber zu diesem Zeitpunkt ist stateFromat noch nicht bekannt
- setState (beim lesen der Statefile) traut sich nicht STATE mit dem alten Wert zu ueberschreiben, da ein neueres schon existiert

Habs gefixed: stateFormat wird auch beim setzen ausgewertet, nicht erst beim ersten Event.
Ab morgen per update verfuegbar.

Sonst:

> Ist das mit diesen mehrfachen setstate-Anweisungen normal?

Ja, die Zeile ohne Zeitstempel setzt STATE, die anderen die einzelnen Readings samt Zeitstempel.


>  Warum sind hier eigentlich das Reading "state" und der "STATE" selbst denn unterschiedlich?

Reading state ist das, was der Modulauthor vorschlaegt, STATE ist das, was man in FHEMWEB/XmlList/list/etc sieht.
STATE = Readings->{state}, falls kein stateFomrat gesetzt wurde.