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!
Du musst ein list vom DOIF und den betroffenen Devices posten, damit man mehr erkennen kann.
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
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.
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.
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") ...
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!