Schöne Weihnachten,
(der Artikel steht schon mal in Anfängerfragen, aber ich kann ihn nicht hierher verschieben).
Ich bastele gerade an einer DOIF-Struktur für Lüftungsempfehlungen (in Abhängigkeit vom Taupunkt, Temperaturen, Feuchtigkeiten usw.) in Zusammenspiel mit dem FLOORPLAN-Modul. Es klappt das meiste recht gut, nur habe ich ein Problem mit komplexeren DOELSEIF-Anweisungen.
Folgendes DOIF funktioniert illustriert das Problem:
Internals:
CFGFN
DEF ([EG.Arbeitszimmer.Wandthermostat_Climate:temperature] > 30)
(set D_TEST 1)
DOELSEIF ([EG.Arbeitszimmer.FensterLinks] eq "closed")
(set D_TEST 2)
DOELSEIF ([EG.Arbeitszimmer.FensterLinks] eq "open")
(set D_TEST 3)
DOELSE
(set D_TEST 4)
NAME DI_TEST
NR 998
NTFY_ORDER 50-DI_TEST
STATE cmd_4
TYPE DOIF
Readings:
2015-12-27 18:38:19 Device EG.Arbeitszimmer.Wandthermostat_Climate
2015-12-27 18:38:19 cmd_event EG.Arbeitszimmer.Wandthermostat_Climate
2015-12-27 18:38:19 cmd_nr 4
2015-12-27 14:27:52 e_EG.Arbeitszimmer.FensterLinks_STATE closed
2015-12-27 18:38:19 e_EG.Arbeitszimmer.Wandthermostat_Climate_temperature 0
2015-12-27 18:38:19 state cmd_4
Condition:
0 ReadingValDoIf('EG.Arbeitszimmer.Wandthermostat_Climate','temperature','') > 30
1 InternalDoIf('EG.Arbeitszimmer.FensterLinks','STATE','') eq "closed"
2 InternalDoIf('EG.Arbeitszimmer.FensterLinks','STATE','') eq "open"
Devices:
0 EG.Arbeitszimmer.Wandthermostat_Climate
1 EG.Arbeitszimmer.FensterLinks
2 EG.Arbeitszimmer.FensterLinks
all EG.Arbeitszimmer.Wandthermostat_Climate EG.Arbeitszimmer.FensterLinks
Do:
0:
0 set D_TEST 1
1:
0 set D_TEST 2
2:
0 set D_TEST 3
3:
0 set D_TEST 4
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Internals:
1 EG.Arbeitszimmer.FensterLinks:STATE
2 EG.Arbeitszimmer.FensterLinks:STATE
all EG.Arbeitszimmer.FensterLinks:STATE
Itimer:
Readings:
0 EG.Arbeitszimmer.Wandthermostat_Climate:temperature
all EG.Arbeitszimmer.Wandthermostat_Climate:temperature
State:
Timerfunc:
Trigger:
Attributes:
do always
Das Fenster ist entweder zu oder offen und daher sollte der Dummy D_TEST auf den Wert 2 oder 3 gesetzt werden. Die DOIF-Anweisung setzt ihn jedoch immer auf 4 (der Wert aus der DOELSE-Verzweigung).
Reduziere ich das Beispiel auf
Internals:
CFGFN
DEF ([EG.Arbeitszimmer.FensterLinks] eq "closed")
(set D_TEST 2)
DOELSEIF ([EG.Arbeitszimmer.FensterLinks] eq "open")
(set D_TEST 3)
DOELSE
(set D_TEST 4)
NAME DI_TEST
NR 998
NTFY_ORDER 50-DI_TEST
STATE cmd_2
TYPE DOIF
Readings:
2015-12-27 18:42:32 Device EG.Arbeitszimmer.FensterLinks
2015-12-27 18:42:32 cmd_event EG.Arbeitszimmer.FensterLinks
2015-12-27 18:42:32 cmd_nr 2
2015-12-27 18:42:32 e_EG.Arbeitszimmer.FensterLinks_STATE open
2015-12-27 18:42:32 state cmd_2
Condition:
0 InternalDoIf('EG.Arbeitszimmer.FensterLinks','STATE','') eq "closed"
1 InternalDoIf('EG.Arbeitszimmer.FensterLinks','STATE','') eq "open"
Devices:
0 EG.Arbeitszimmer.FensterLinks
1 EG.Arbeitszimmer.FensterLinks
all EG.Arbeitszimmer.FensterLinks
Do:
0:
0 set D_TEST 2
1:
0 set D_TEST 3
2:
0 set D_TEST 4
Helper:
globalinit 1
last_timer 0
sleeptimer -1
Internals:
0 EG.Arbeitszimmer.FensterLinks:STATE
1 EG.Arbeitszimmer.FensterLinks:STATE
all EG.Arbeitszimmer.FensterLinks:STATE
Itimer:
Readings:
State:
Timerfunc:
Trigger:
Attributes:
do always
D.h. die erste DOIF-Bedingung über den Wandthermostaten ist entfernt, funktioniert die Abfrage tadellos. Im Beispiel oben wird D_TEST auf 3 bei offenen Fenster und auf 3 bei geschlossenem Fenster gesetzt.
Offenbar gibt es aber Probleme, wenn ich den Fenster-Zustand in Kombination mit einem anderen Wert prüfe - das scheitert dann.
Bug oder Feature und was mache ich falsch?
Danke, -MN
Wie schon vermutet: Der EG.Arbeitszimmer.Wandthermostat_Climate:temperature liefert regelmäßig eine Temperatur. Ich nehme an unter 30°C, das triggert den DOELSE Fall, weil keine andere Bedingung wahr ist, bei diesem Trigger.
Hallo Ellert,
vielen Dank für die schnelle Reaktion. Anbei ein list auf den Fensterkontakt:
Internals:
CFGFN ./FHEM/hm-heating-eg-arbeitszimmer.cfg
DEF 2ACB06
HMLAN1_MSGCNT 28
HMLAN1_RAWMSG E2ACB06,0000,01C4AC45,FF,FFB2,E3A0412ACB06314307018C00
HMLAN1_RSSI -78
HMLAN1_TIME 2015-12-27 18:44:40
IODev HMLAN2
LASTInputDev HMLAN1
MSGCNT 28
NAME EG.Arbeitszimmer.FensterLinks
NR 215
NTFY_ORDER 50-EG.Arbeitszimmer.FensterLinks
STATE closed
TYPE CUL_HM
lastMsg No:E3 - t:41 s:2ACB06 d:314307 018C00
peerList EG.Arbeitszimmer.HeizungLinks_WindowRec,EG.Arbeitszimmer.Wandthermostat_WindowRec,
protLastRcv 2015-12-27 18:44:40
rssi_at_HMLAN1 max:-77 min:-81 cnt:28 lst:-78 avg:-79.21
Readings:
2015-12-27 11:31:32 Activity alive
2015-04-23 16:33:04 CommandAccepted yes
2015-04-23 16:33:03 D-firmware 2.4
2015-04-23 16:33:03 D-serialNr LEQ0501122
2015-04-23 16:33:05 PairedTo 0x000000
2015-04-22 19:20:26 R-EG.Arbeitszimmer.HeizungLinks_WindowRec-expectAES off
2015-04-22 19:20:26 R-EG.Arbeitszimmer.HeizungLinks_WindowRec-peerNeedsBurst on
2015-04-22 19:20:27 R-EG.Arbeitszimmer.Wandthermostat_WindowRec-expectAES off
2015-04-22 19:20:27 R-EG.Arbeitszimmer.Wandthermostat_WindowRec-peerNeedsBurst on
2015-04-23 16:33:05 R-cyclicInfoMsg on
2015-04-22 19:20:25 R-eventDlyTime 0 s
2015-04-22 19:20:25 R-pairCentral 0x000000
2015-04-22 19:20:25 R-sabotageMsg on
2015-04-22 19:20:25 R-sign off
2015-04-23 16:33:05 RegL_00. 02:00 09:01 0A:00 0B:00 0C:00 10:01 14:06 00:00
2015-04-23 16:33:05 RegL_01. 08:00 20:60 21:00 22:64 30:06 00:00
2015-04-23 16:33:06 RegL_04.EG.Arbeitszimmer.HeizungLinks_WindowRec 01:01 00:00
2015-04-23 16:33:07 RegL_04.EG.Arbeitszimmer.Wandthermostat_WindowRec 01:01 00:00
2015-12-27 09:41:54 alive yes
2015-12-27 18:44:40 battery ok
2015-12-27 18:44:40 contact closed (to EG.Arbeitszimmer.Wandthermostat)
2015-12-27 11:31:32 peerList EG.Arbeitszimmer.HeizungLinks_WindowRec,EG.Arbeitszimmer.Wandthermostat_WindowRec,
2015-12-27 09:41:54 recentStateType info
2015-12-27 09:41:54 sabotageError off
2015-12-27 18:44:40 state closed
2015-12-27 18:44:40 trigger_cnt 140
Helper:
HM_CMDNR 227
mId 00B1
rxType 28
Expert:
def 1
det 0
raw 1
tpl 0
Io:
newChn +2ACB06,00,00,00
nextSend 1451238280.43173
rxt 2
vccu vccu
p:
2ACB06
00
00
00
prefIO:
HMLAN2
Mrssi:
mNo E3
Io:
HMLAN1 -78
Prt:
bErr 0
sProc 0
sleeping 1
Q:
qReqConf
qReqStat
Role:
chn 1
dev 1
Rssi:
At_hmlan1:
avg -79.2142857142857
cnt 28
lst -78
max -77
min -81
Attributes:
IODev HMLAN2
IOgrp vccu:HMLAN2
actCycle 028:00
actStatus alive
autoReadReg 4_reqStatus
expert 2_full
firmware 2.4
model HM-SEC-SC-2
peerIDs 00000000,2E96A103,31430703,
room EG.Arbeitszimmer
serialNr LEQ0501122
subType threeStateSensor
Der STATE, state und contact sind auf closed, sollte dann die DOELSEIF Bedingung auf eq "closed" nicht greifen...?
Danke, -MN
Lies mal die Einleitung http://fhem.de/commandref_DE.html#DOIF. Wird die Frage dadurch beantwortet?