Werte sich kontinuierlich aktualisieren lassen

Begonnen von chq, 10 März 2019, 09:17:13

Vorheriges Thema - Nächstes Thema

chq

Hallo,

ich lasse mir momentan mehrere Werte meiner Wetterstation auf dem Smartphone anzeigen.

Für die rot umkreiste Darstellung der Werte (siehe Bild) verwende ich folgenden Code für das Attribut "stateFormat":

{"Wind: ".round(ReadingsVal("Wetterstation","wind_speed",0),0)." Böen: ".round(ReadingsVal("Wetterstation","wind_gust",0),0)."<br>Feuchtigkeit: ".round(ReadingsVal("Wetterstation","humidity",0),0)."%"}

Leider aktualisieren sich die Werte jedoch nicht kontinuierlich, sondern werden bei jedem Aufruf der FHEM-Oberfläche lediglich einmalig abgefragt.

Kann man das so umbauen, dass sich die Werte beim eintreffen entsprechender Events fortlaufend aktualisieren und falls ja, wie?

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

justme1968

wenn ich das richtig sehe gehören die readings nicht zu dem device das du anzeigst. deshalb du funktioniert die aktualisierung nicht.

wenn es das gleiche device ist sollte alles passen. und auch das format von stateFromat wird einfacher.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

chq

Aber es ist doch das gleiche Device (das denke ich zumindest):

Internals:
   DEF        ## ==eq !=ne <lt >gt le<= ge>=

(([Wetterstation:wind_speed] >= 32 or [Wetterstation:wind_gust] >= 37) and [HM_markise:state] ne "closed") (set HM_markise pct 100) ## Markise reinfahren bei Wind

DOELSEIF (([Wetterstation:wind_speed] >= 32 or [Wetterstation:wind_gust] >= 37) and [HM_markise:state] eq "closed") ()

DOELSEIF ([24:00]) ()

## Im stateFormat werden die Nachkommastellen der eingehenden Readings abgeschnitten.
   FUUID      5c7e4477-f33f-b9fb-9f2b-962dc92bad00ffb9
   MODEL      FHEM
   NAME       doif_Wetter
   NR         60
   NTFY_ORDER 50-doif_Wind
   STATE      Wind: 20 Böen: 28<br>UVR: 197.0 Hum: 92
   TYPE       DOIF
   VERSION    18706 2019-02-23 21:48:22
   READINGS:
     2019-03-10 10:02:04   Device          Wetterstation
     2019-03-10 10:01:32   cmd             2
     2019-03-10 10:01:32   cmd_event       Wetterstation
     2019-03-10 10:01:32   cmd_nr          2
     2019-03-09 17:42:24   e_HM_markise_state closed
     2019-03-10 10:02:04   e_Wetterstation_wind_gust 28.1
     2019-03-10 10:02:04   e_Wetterstation_wind_speed 19.8
     2019-03-09 12:22:22   mode            enabled
     2019-03-10 10:01:32   state           windy
     2019-03-10 00:00:00   timer_01_c03    11.03.2019 00:00:00
   Regex:
     accu:
   attr:
     cmdState:
       0:
         windy
       1:
         windy
       2:
         idle
     wait:
     waitdel:
   condition:
     0          (::ReadingValDoIf($hash,'Wetterstation','wind_speed') >= 32 or ::ReadingValDoIf($hash,'Wetterstation','wind_gust') >= 37) and ::ReadingValDoIf($hash,'HM_markise','state') ne "closed"
     1          (::ReadingValDoIf($hash,'Wetterstation','wind_speed') >= 32 or ::ReadingValDoIf($hash,'Wetterstation','wind_gust') >= 37) and ::ReadingValDoIf($hash,'HM_markise','state') eq "closed"
     2          ::DOIF_time_once($hash,0,$wday)
   days:
   devices:
     0           Wetterstation HM_markise
     1           Wetterstation HM_markise
     all         Wetterstation HM_markise
   do:
     0:
       0          set HM_markise pct 100
     1:
       0         
     2:
       0         
     3:
   helper:
     event      wind_speed: 19.8,wind_gust: 28.1
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   Wetterstation
     timerevent wind_gust: 40.3,wind_speed: 31.3,humidity: 93
     triggerDev Wetterstation
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: Wetterstation
       state: windy
     timerevents:
       wind_gust: 40.3
       wind_speed: 31.3
       humidity: 93
     timereventsState:
       wind_gust: 40.3
       wind_speed: 31.3
       humidity: 93
     triggerEvents:
       wind_speed: 19.8
       wind_gust: 28.1
     triggerEventsState:
       wind_speed: 19.8
       wind_gust: 28.1
   internals:
   interval:
   intervalfunc:
   itimer:
   localtime:
     0          1552258800
   readings:
     0           Wetterstation:wind_speed Wetterstation:wind_gust HM_markise:state
     1           Wetterstation:wind_speed Wetterstation:wind_gust HM_markise:state
     all         Wetterstation:wind_speed Wetterstation:wind_gust HM_markise:state
   realtime:
     0          00:00:00
   time:
     0          24:00:00
   timeCond:
     0          2
   timer:
     0          0
   timers:
     2           0
   trigger:
   triggertime:
     1552258800:
       localtime  1552258800
       hash:
   uiState:
   uiTable:
Attributes:
   cmdState   windy|windy|idle
   do         always
   room       DOIF
   stateFormat {"Wind: ".round(ReadingsVal("Wetterstation","wind_speed",0),0).
" Böen: ".round(ReadingsVal("Wetterstation","wind_gust",0),0).
"<br>UVR: ".round(ReadingsVal("Wetterstation","UVR",0),1).
" Hum: ".round(ReadingsVal("Wetterstation","humidity",0),0)}
So einfach wie möglich, so kompliziert wie nötig

justme1968

#3
nein. die readings (und somit auch die events) sind im Wetterstation device und du zeigst das DOIF an.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Damian

Zitat von: chq am 10 März 2019, 10:04:33
Aber es ist doch das gleiche Device (das denke ich zumindest):

Internals:
   DEF        ## ==eq !=ne <lt >gt le<= ge>=

(([Wetterstation:wind_speed] >= 32 or [Wetterstation:wind_gust] >= 37) and [HM_markise:state] ne "closed") (set HM_markise pct 100) ## Markise reinfahren bei Wind

DOELSEIF (([Wetterstation:wind_speed] >= 32 or [Wetterstation:wind_gust] >= 37) and [HM_markise:state] eq "closed") ()

DOELSEIF ([24:00]) ()

## Im stateFormat werden die Nachkommastellen der eingehenden Readings abgeschnitten.
   FUUID      5c7e4477-f33f-b9fb-9f2b-962dc92bad00ffb9
   MODEL      FHEM
   NAME       doif_Wetter
   NR         60
   NTFY_ORDER 50-doif_Wind
   STATE      Wind: 20 Böen: 28<br>UVR: 197.0 Hum: 92
   TYPE       DOIF
   VERSION    18706 2019-02-23 21:48:22
   READINGS:
     2019-03-10 10:02:04   Device          Wetterstation
     2019-03-10 10:01:32   cmd             2
     2019-03-10 10:01:32   cmd_event       Wetterstation
     2019-03-10 10:01:32   cmd_nr          2
     2019-03-09 17:42:24   e_HM_markise_state closed
     2019-03-10 10:02:04   e_Wetterstation_wind_gust 28.1
     2019-03-10 10:02:04   e_Wetterstation_wind_speed 19.8
     2019-03-09 12:22:22   mode            enabled
     2019-03-10 10:01:32   state           windy
     2019-03-10 00:00:00   timer_01_c03    11.03.2019 00:00:00
   Regex:
     accu:
   attr:
     cmdState:
       0:
         windy
       1:
         windy
       2:
         idle
     wait:
     waitdel:
   condition:
     0          (::ReadingValDoIf($hash,'Wetterstation','wind_speed') >= 32 or ::ReadingValDoIf($hash,'Wetterstation','wind_gust') >= 37) and ::ReadingValDoIf($hash,'HM_markise','state') ne "closed"
     1          (::ReadingValDoIf($hash,'Wetterstation','wind_speed') >= 32 or ::ReadingValDoIf($hash,'Wetterstation','wind_gust') >= 37) and ::ReadingValDoIf($hash,'HM_markise','state') eq "closed"
     2          ::DOIF_time_once($hash,0,$wday)
   days:
   devices:
     0           Wetterstation HM_markise
     1           Wetterstation HM_markise
     all         Wetterstation HM_markise
   do:
     0:
       0          set HM_markise pct 100
     1:
       0         
     2:
       0         
     3:
   helper:
     event      wind_speed: 19.8,wind_gust: 28.1
     globalinit 1
     last_timer 1
     sleeptimer -1
     timerdev   Wetterstation
     timerevent wind_gust: 40.3,wind_speed: 31.3,humidity: 93
     triggerDev Wetterstation
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: Wetterstation
       state: windy
     timerevents:
       wind_gust: 40.3
       wind_speed: 31.3
       humidity: 93
     timereventsState:
       wind_gust: 40.3
       wind_speed: 31.3
       humidity: 93
     triggerEvents:
       wind_speed: 19.8
       wind_gust: 28.1
     triggerEventsState:
       wind_speed: 19.8
       wind_gust: 28.1
   internals:
   interval:
   intervalfunc:
   itimer:
   localtime:
     0          1552258800
   readings:
     0           Wetterstation:wind_speed Wetterstation:wind_gust HM_markise:state
     1           Wetterstation:wind_speed Wetterstation:wind_gust HM_markise:state
     all         Wetterstation:wind_speed Wetterstation:wind_gust HM_markise:state
   realtime:
     0          00:00:00
   time:
     0          24:00:00
   timeCond:
     0          2
   timer:
     0          0
   timers:
     2           0
   trigger:
   triggertime:
     1552258800:
       localtime  1552258800
       hash:
   uiState:
   uiTable:
Attributes:
   cmdState   windy|windy|idle
   do         always
   room       DOIF
   stateFormat {"Wind: ".round(ReadingsVal("Wetterstation","wind_speed",0),0).
" Böen: ".round(ReadingsVal("Wetterstation","wind_gust",0),0).
"<br>UVR: ".round(ReadingsVal("Wetterstation","UVR",0),1).
" Hum: ".round(ReadingsVal("Wetterstation","humidity",0),0)}


Wenn du es im DOIF aktualisiert anzeigen willst, dann musst du das DOIF-Attribut state benutzen

state Wind: [Wetterstation:wind_speed:d0,0] Böen: ...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chq

#5
Hm ok,

wie würde es im Bezug auf Rechnen bei einem DOIF aussehen?

Momentan sieht mein stateFormat so aus:

{"Wind: ".round(ReadingsVal("Wetterstation","wind_speed",0),0).
" Böen: ".round(ReadingsVal("Wetterstation","wind_gust",0),0).
"<br>UVR: ".round(ReadingsVal("Wetterstation","UVR",0),1).
" LF: ".round(ReadingsVal("Wetterstation","humidity",0),0)."%"}


Langfristig würde ich jedoch gerne erreichen, dass ich den UVR-Wert nur dann mit einer Nachkommastelle angezeigt bekomme, wenn der Wert niedriger als zehn ist. Für sich alleine funktioniert die folgende Codezeile im stateFormat auch bereits schon:

{if(ReadingsVal("Wetterstation","UVR",0)>=10) {round(ReadingsVal("Wetterstation","UVR",0),0)} else {round(ReadingsVal("Wetterstation","UVR",0),1)}}

Nur in den oberen Codeblock bekomme ich es noch nicht reingebastelt.

Kann evtl. nochmal jmd. helfen?

Gruß Chris
So einfach wie möglich, so kompliziert wie nötig

Damian

Runden brauchst du nicht, das macht schon die Filterangabe d0 (siehe Commandref zu DOIF). Beim state musst du Perlcode wie folgt in  Klammern setzen: {(...)}

z. B. state Text bla bla {(Perl)} Text bla bla
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF