[Gelöst] DOIF/IF matcht nicht wie ich möchte

Begonnen von micomat, 31 August 2023, 12:15:40

Vorheriges Thema - Nächstes Thema

micomat

Hey Leute,

ich verzweifle gerade mit meinem DOIF...
Ziel soll sein, den Rollo und die Markise zu steuern und dabei zu berücksichtigen, ob sie sich aktuell bewegt:
([Taster_WZ_R] eq "Taster_WZ_R_Down Long") (IF ([rollomoving:state] eq "yes") (set telegrambot message "Markise R stop")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Long") (IF ([rollomoving:state] eq "no") (set telegrambot message "Markise R runter")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Short") (IF ([rollomoving:state] eq "no") (set telegrambot message "Rollo R runter")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Short") (IF ([rollomoving:state] eq "yes") (set telegrambot message "Rollo R stop")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Long") (IF ([rollomoving:state] eq "no") (set telegrambot message "Markise R hoch")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Long") (IF ([rollomoving:state] eq "yes") (set telegrambot message "Markise R stop")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Short") (IF ([rollomoving:state] eq "no") (set telegrambot message "Rollo R hoch")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Short") (IF ([rollomoving:state] eq "yes") (set telegrambot message "Rollo R stop"))

"rollomoving" ist aktuell noch ein dummy, der dann durch den Status des Rollos/Markise ersetzt wird. Aber vorher möchte ich das "trocken" testen. Daher auch die Telegrambot message, statt einer Schaltaktion.
Es funktioniert prima, solange der "state" von "rollomoving" auf "no" steht. Sobald der auf "yes" gesetzt wird, tut das DOIF/IF nicht mehr. Ich drehe es in alle Richtungen, finde aber den Fehler nicht...

Danke für eure Ideen!
Synology DS218+ with fhem+iobroker in docker, 2x RasPi w. ser2net, CUL433+868, IT, EGPM2LAN, THZ/LWZ, FB_Callmonitor, HMS100TF, Homematic, 2x TX3-TH, Pushover, USB-IR-SML-Head, SONOS, GHoma, MBus, KLF200

Damian

Du musst ein list vom DOIF und den betroffenen Devices posten, damit man mehr erkennen kann.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

micomat

Gerne:

Der Taster:
Internals:
   DEF        5A036A
   FUUID      64eca093-f33f-2b81-190e-7b0add029af0a8ac
   HMLAN1_MSGCNT 407
   HMLAN1_RAWMSG E5A036A,0000,663891CD,FF,FFB1,5E84405A036A0000000169
   HMLAN1_RSSI -79
   HMLAN1_TIME 2023-08-31 12:02:37
   IODev      HMLAN1
   LASTInputDev HMLAN1
   MSGCNT     407
   NAME       Taster_WZ_R
   NR         490
   NTFY_ORDER 48-Taster_WZ_R
   STATE      Taster_WZ_R_Up Short
   TYPE       CUL_HM
   channel_01 Taster_WZ_R_Up
   channel_02 Taster_WZ_R_Down
   disableNotifyFn 1
   lastMsg    No:5E - t:40 s:5A036A d:000000 0169
   protLastRcv 2023-08-31 12:02:37
   protRcv    407 last_at:2023-08-31 12:02:37
   rssi_at_HMLAN1 cnt:407 min:-100 max:-66 avg:-77.25 lst:-79
   READINGS:
     2023-08-28 15:26:43   D-firmware      1.4
     2023-08-28 15:26:43   D-serialNr      OEQ0482551
     2023-08-28 20:47:54   IODev           HMLAN1
     2023-08-31 12:02:37   battery         ok
     2023-08-28 15:26:43   cfgState        updating
     2023-08-28 15:26:49   commState       CMDs_pending
     2023-08-31 12:02:37   state           Taster_WZ_R_Up Short
   helper:
     HM_CMDNR   94
     lastMsgTm  1693476157.51488
     mId        006B
     peerFriend -
     peerOpt    -:pushButton
     regLst     0
     rxType     28
     supp_Pair_Rep 0
     cmds:
       TmplKey    :no:1693248474.34668
       TmplTs     1693248474.34668
       cmdKey     0:1:0::Taster_WZ_R:006B:01:
       cmdLst:
         assignHmKey noArg
         clear      [(readings|trigger|register|oldRegs|rssi|msgEvents|{msgErrors}|attack|all)]
         deviceRename -newName-
         fwUpdate   -filename- [-bootTime-]
         getConfig  noArg
         getDevInfo noArg
         getRegRaw  (List0|List1|List2|List3|List4|List5|List6|List7) [-peerChn-]
         raw        -data- [...]
         regBulk    -list-.-peerChn- -addr1:data1- [-addr2:data2-]...
         regSet     [(prep|{exec})] -regName- -value- [-peerChn-]
         reset      noArg
         tplDel     -tplDel-
         unpair     noArg
       lst:
         condition  slider,0,1,255
         peer       
         peerOpt   
         tplDel     
       rtrvLst:
         cmdList    [({short}|long)]
         deviceInfo [({short}|long)]
         list       [({normal}|full)]
         param      -param-
         reg        -addr- -list- [-peerChn-]
         regList    noArg
         regTable   noArg
         regVal     -addr- -list- [-peerChn-]
         saveConfig [-filename-]
         tplInfo    noArg
     expert:
       def        0
       det        0
       raw        1
       tpl        0
     io:
       flgs       2
       newChn     +5A036A,02,00,00
       nextSend   1693476157.60471
       rxt        2
       vccu       
       p:
         5A036A
         00
         00
         00
       prefIO:
     mRssi:
       mNo        5E
       io:
         HMLAN1:
           -77
           -77
     peerIDsH:
     prt:
       bErr       0
       sProc      0
     q:
       qReqConf   00
       qReqStat   
     role:
       dev        1
     rssi:
       at_HMLAN1:
         avg        -77.2555282555283
         cnt        407
         lst        -79
         max        -66
         min        -100
     tmpl:
Attributes:
   IODev      HMLAN1
   alias      Taster_WZ_R
   autoReadReg 4_reqStatus
   expert     rawReg
   firmware   1.4
   model      HM-PB-2-WM55
   serialNr   OEQ0482551
   subType    pushButton
   webCmd     getConfig:clear msgEvents

Das DOIF
Internals:
   CFGFN     
   DEF        ([Taster_WZ_R] eq "Taster_WZ_R_Down Long") (IF ([rollomoving:state] eq "yes") (set telegrambot message "Markise R stop")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Long") (IF ([rollomoving:state] eq "no") (set telegrambot message "Markise R runter")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Short") (IF ([rollomoving:state] eq "no") (set telegrambot message "Rollo R runter")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Short") (IF ([rollomoving:state] eq "yes") (set telegrambot message "Rollo R stop")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Long") (IF ([rollomoving:state] eq "no") (set telegrambot message "Markise R hoch")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Long") (IF ([rollomoving:state] eq "yes") (set telegrambot message "Markise R stopupl")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Short") (IF ([rollomoving:state] eq "no") (set telegrambot message "Rollo R hoch")) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Short") (IF ([rollomoving:state] eq "yes") (set telegrambot message "Rollo R stop"))



   FUUID      64eda2de-f33f-2b81-473e-d6af064def3ce185
   MODEL      FHEM
   NAME       doif_Taster_WZ_R
   NOTIFYDEV  Taster_WZ_R,global
   NR         14055
   NTFY_ORDER 50-doif_Taster_WZ_R
   STATE      cmd_7
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2023-08-31 12:02:37   Device          Taster_WZ_R
     2023-08-31 12:02:37   cmd             7
     2023-08-31 12:02:37   cmd_event       Taster_WZ_R
     2023-08-31 12:02:37   cmd_nr          7
     2023-08-31 12:02:37   e_Taster_WZ_R_STATE Taster_WZ_R_Up Short
     2023-08-31 12:02:17   mode            enabled
     2023-08-31 12:02:37   state           cmd_7
   Regex:
     accu:
     collect:
     cond:
       Taster_WZ_R:
         0:
           &STATE     ^Taster_WZ_R$
         1:
           &STATE     ^Taster_WZ_R$
         2:
           &STATE     ^Taster_WZ_R$
         3:
           &STATE     ^Taster_WZ_R$
         4:
           &STATE     ^Taster_WZ_R$
         5:
           &STATE     ^Taster_WZ_R$
         6:
           &STATE     ^Taster_WZ_R$
         7:
           &STATE     ^Taster_WZ_R$
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0          ::InternalDoIf($hash,'Taster_WZ_R','STATE') eq "Taster_WZ_R_Down Long"
     1          ::InternalDoIf($hash,'Taster_WZ_R','STATE') eq "Taster_WZ_R_Down Long"
     2          ::InternalDoIf($hash,'Taster_WZ_R','STATE') eq "Taster_WZ_R_Down Short"
     3          ::InternalDoIf($hash,'Taster_WZ_R','STATE') eq "Taster_WZ_R_Down Short"
     4          ::InternalDoIf($hash,'Taster_WZ_R','STATE') eq "Taster_WZ_R_Up Long"
     5          ::InternalDoIf($hash,'Taster_WZ_R','STATE') eq "Taster_WZ_R_Up Long"
     6          ::InternalDoIf($hash,'Taster_WZ_R','STATE') eq "Taster_WZ_R_Up Short"
     7          ::InternalDoIf($hash,'Taster_WZ_R','STATE') eq "Taster_WZ_R_Up Short"
   do:
     0:
       0          IF ([rollomoving:state] eq "yes") (set telegrambot message "Markise R stop")
     1:
       0          IF ([rollomoving:state] eq "no") (set telegrambot message "Markise R runter")
     2:
       0          IF ([rollomoving:state] eq "no") (set telegrambot message "Rollo R runter")
     3:
       0          IF ([rollomoving:state] eq "yes") (set telegrambot message "Rollo R stop")
     4:
       0          IF ([rollomoving:state] eq "no") (set telegrambot message "Markise R hoch")
     5:
       0          IF ([rollomoving:state] eq "yes") (set telegrambot message "Markise R stopupl")
     6:
       0          IF ([rollomoving:state] eq "no") (set telegrambot message "Rollo R hoch")
     7:
       0          IF ([rollomoving:state] eq "yes") (set telegrambot message "Rollo R stop")
     8:
   helper:
     DEVFILTER  ^global$|^Taster_WZ_R$
     NOTIFYDEV  global|Taster_WZ_R
     event      battery: ok,Taster_WZ_R_Up Short
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   Taster_WZ_R
     timerevent battery: ok,Taster_WZ_R_Up Short
     triggerDev Taster_WZ_R
     DOIF_eventa:
       cmd_nr: 7
       cmd: 7
       cmd_event: Taster_WZ_R
       cmd_7
     DOIF_eventas:
       cmd_nr: 7
       cmd: 7
       cmd_event: Taster_WZ_R
       state: cmd_7
     timerevents:
       battery: ok
       Taster_WZ_R_Up Short
     timereventsState:
       battery: ok
       state: Taster_WZ_R_Up Short
     triggerEvents:
       battery: ok
       Taster_WZ_R_Up Short
     triggerEventsState:
       battery: ok
       state: Taster_WZ_R_Up Short
   internals:
     all         Taster_WZ_R:STATE
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      doif_Taster_WZ_R
   verbose    5

Und der Dummy:
Internals:
   CFGFN     
   FUUID      64eda8e4-f33f-2b81-e8a4-97545d4216c13f57
   NAME       rollomoving
   NR         14548
   STATE      yes
   TYPE       dummy
   READINGS:
     2023-08-31 12:01:12   state           yes
Attributes:
   alias      rollomoving
   webCmd     yes:no
Synology DS218+ with fhem+iobroker in docker, 2x RasPi w. ser2net, CUL433+868, IT, EGPM2LAN, THZ/LWZ, FB_Callmonitor, HMS100TF, Homematic, 2x TX3-TH, Pushover, USB-IR-SML-Head, SONOS, GHoma, MBus, KLF200

Damian

Der siebte Fall trifft in der Bedingung von DOIF zu, allerdings ist IF nicht wahr. Da aber DOIF den siebten Zweig abgearbeitet hat, auch wenn nichts passiert ist, wird nicht weiter geprüft. Dieses Verhalten kann man mit dem Attribut checkall übersteuern. Besser ist aber folgende Lösung:

Wenn du die IF-Bedingungen als UND-Verknüpfung in die DOIF-Bedingung aufnimmst, dann ist die Bedingung nur dann wahr, wenn es auch was zu tun gibt:

([Taster_WZ_R] eq "Taster_WZ_R_Down Long" and [rollomoving:state] eq "yes") (set telegrambot message "Markise R stop") DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Long" and [rollomoving:state] eq "no") ...

Damit wird es ebenfalls korrekt funktionieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

micomat

Danke, Damian,

Dein Beispiel mit der UND Verknüfpung hatte ich zuerst versucht.
Problem dabei ist, wenn die Markise mit der Handfernbedienung gesteuert wird, verändert sich der Status "rollomoving" von no auf yes. Das triggert dann das DOIF mit dem zuletzt im HM-Taster gespeicherten Status.
Es soll nur auf den Taster triggern und nicht wenn sich lediglich "rollomoving" ändert.
Synology DS218+ with fhem+iobroker in docker, 2x RasPi w. ser2net, CUL433+868, IT, EGPM2LAN, THZ/LWZ, FB_Callmonitor, HMS100TF, Homematic, 2x TX3-TH, Pushover, USB-IR-SML-Head, SONOS, GHoma, MBus, KLF200

Damian

Zitat von: micomat am 31 August 2023, 14:11:06Danke, Damian,

Dein Beispiel mit der UND Verknüfpung hatte ich zuerst versucht.
Problem dabei ist, wenn die Markise mit der Handfernbedienung gesteuert wird, verändert sich der Status "rollomoving" von no auf yes. Das triggert dann das DOIF mit dem zuletzt im HM-Taster gespeicherten Status.
Es soll nur auf den Taster triggern und nicht wenn sich lediglich "rollomoving" ändert.

Dann musst du einfach bei rollomoving den Trigger rausnehmen:

([Taster_WZ_R] eq "Taster_WZ_R_Down Long" and [?rollomoving:state] eq "yes") (set telegrambot message "Markise R stop") DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Long" and [?rollomoving:state] eq "no") ...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

micomat

#6
Den Trigger rausnehmen... mein Gott, manchmal sieht man vor lauter Wald die Bäume nicht.
Dieser Tipp hätte mir 4h Nerven gespart.

So sieht das DOIF jetzt final aus:
([Taster_WZ_R] eq "Taster_WZ_R_Down Long" and [?Markise_Kurz:execution] eq "stop") (set Markise_Kurz down) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Long" and [?Markise_Kurz:execution] ne "stop") (set Markise_Kurz stop) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Short" and [?Rollo_Rechts:execution] eq "stop") (set Rollo_Rechts down) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Down Short" and [?Rollo_Rechts:execution] ne "stop") (set Rollo_Rechts stop) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Long" and [?Markise_Kurz:execution] eq "stop") (set Markise_Kurz up) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Long" and [?Markise_Kurz:execution] ne "stop") (set Markise_Kurz stop) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Short" and [?Rollo_Rechts:execution] eq "stop") (set Rollo_Rechts up) DOELSEIF
([Taster_WZ_R] eq "Taster_WZ_R_Up Short" and [?Rollo_Rechts:execution] ne "stop") (set Rollo_Rechts stop)

Vielen Dank!
Synology DS218+ with fhem+iobroker in docker, 2x RasPi w. ser2net, CUL433+868, IT, EGPM2LAN, THZ/LWZ, FB_Callmonitor, HMS100TF, Homematic, 2x TX3-TH, Pushover, USB-IR-SML-Head, SONOS, GHoma, MBus, KLF200