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
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.
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)}
nein. die readings (und somit auch die events) sind im Wetterstation device und du zeigst das DOIF an.
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: ...
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
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