DOIF - DOELSEIF vs. DOELSE Problem

Begonnen von Morgennebel, 27 Dezember 2015, 18:46:28

Vorheriges Thema - Nächstes Thema

Morgennebel

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
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Ellert

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.

Morgennebel

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
Einziger Spender an FHEM e.V. mit Dauerauftrag seit >= 24 Monaten

FHEM: MacMini/ESXi, 2-3 FHEM Instanzen produktiv
In-Use: STELLMOTOR, VALVES, PWM-PWMR, Xiaomi, Allergy, Proplanta, UWZ, MQTT,  Homematic, Luftsensor.info, ESP8266, ESERA

Ellert