Hallo,
brauche mal hilfe bei meinem DOIF :
define di_fhemtabletscreen DOIF ([Winconnect.FHEMTABLET:motion_detect] eq "True" or [Winconnect.FHEMTABLET:microphone_detect] eq "True") (set Winconnect.FHEMTABLET screenOn)
Ich möchte bei winconnect.FHEMTABLET:motion_detect und Winconnect.FHEMTABLET:microphone_detect True "set Winconnect.FHEMTABLET screenOn" setzen. Das funktioniert auch.
Jedoch suche ich nu nach eine Lösung das wenn inconnect.FHEMTABLET:motion_detectWinconnect.FHEMTABLET:microphone_detect False ist für sagen wir 30 Minuten dann set Winconnect.FHEMTABLET screenOn
Lässt sich so etwas mit einem DOIF bauen ? Oder muss ich da mit einem Watchdog arbeiten?
Das kann mit DOIF gelöst werden. Ergänze das DOIF um einen DOELSEIF Zweig mit der False-Bedingung und nutze das Attribut wait um den Befehl zu verzögern. Falls der erste Zweig innerhalb der Wartezeit True wird, dann wird der Zweite Zweig abgebrochen und der Befehl nicht ausgeführt.
Hast du mal ein kleines Beispiel? Muss ja nicht für mich sein aber wo ich mir den Aufbau angucken aknn? Im Wiki steht leider so vieles :D
ZitatIm Wiki steht leider so vieles
In CommandRef aber viel mehr https://fhem.de/commandref_DE.html#DOIF
Danke ich setze nun alle X minuten per at das screenoff.
Das doif von mir macht das Display dann an :)
Ist einfacher für mich *g*
Okay diese Lösung ist doch nicht so gut. Wenn ich alle 30 min Display ausmachen lasse und bei 29 gerade daor bin ist es aus obwohl True ist ;)
Man müsste den watchdog dann umbauen aber das scheint mir auch nicht einfacher zu sein :D
Setz doch in deinem doif ein DOELSEIF mit dem gleichen Code nur true durch false ersetzen und das atribut wait. Schau in die commanref doif atribut wait. Das ist sehr gut erklärt.
Gruß Rolf
hmm okay hab es so verstanden
([Winconnect.FHEMTABLET:motion_detect] eq "True" or [Winconnect.FHEMTABLET:microphone_detect] eq "True") (set Winconnect.FHEMTABLET screenOn) DOELSE ([Winconnect.FHEMTABLET:motion_detect] eq "False" or [Winconnect.FHEMTABLET:microphone_detect] eq "False") wait 1800
im log ist aber ein fehler
017.09.18 10:41:28 2: di_fhemtabletscreen: False eq "False" or False eq "False": Unknown command False, try help.
2017.09.18 10:41:31 3: WINCONNECT set Winconnect.FHEMTABLET screenOn
2017.09.18 10:41:42 2: di_fhemtabletscreen: False eq "False" or False eq "False": Unknown command False, try help.
2017.09.18 10:41:43 3: WINCONNECT set Winconnect.FHEMTABLET screenOn
DOELSEIF
([Winconnect.FHEMTABLET:motion_detect] eq "True" or [Winconnect.FHEMTABLET:microphone_detect] eq "True") (set Winconnect.FHEMTABLET screenOn) DOELSEIF ([Winconnect.FHEMTABLET:motion_detect] eq "False" or [Winconnect.FHEMTABLET:microphone_detect] eq "False") (set Winconnect.FHEMTABLET screenOn)
und das wait als Attribut
attr wait 0:1800
Danke aber nun funktioniert das screenOn nicht mehr wenn etwas True wird.
Sicher das wait in das attribut ??
Fehlermeldungen habe ich keine. screenoff funktioniert.
Im ganzen Code sehe ich nicht ein screenoff. Keine Ahnung was du aus meinem Code machst
hab es nun angepasst. Geht aber irendwie nicht.
Hab ein True ausgelöst. Bildschirm geht aber nicht an.
define di_tabletscreen DOIF ([Winconnect.TABLET:motion_detect] eq "True" or [Winconnect.TABLET:microphone_detect] eq "True") (set Winconnect.TABLET screenOn) DOELSEIF ([Winconnect.TABLET:motion_detect] eq "False" or [Winconnect.TABLET:microphone_detect] eq "False") (set Winconnect.TABLET screenOff)\
attr di_tabletscreen wait 0:1800
Ein fehler noch ? oder muss man noch was hinzufügen?
Da energiesparen den Bildschirm auch ausmachen kkann will ich immer ein screenon schicken bei true
Ein list vom DOIF wurde hier mehr Aufschluss bringen.
Internals:
DEF ([Winconnect.TABLET:motion_detect] eq "True" or [Winconnect.TABLET:microphone_detect] eq "True") (set Winconnect.TABLET screenOn) DOELSEIF ([Winconnect.TABLET:motion_detect] eq "False" or [Winconnect.TABLET:microphone_detect] eq "False") (set Winconnect.TABLET screenOff)
NAME di_tabletscreen
NR 434
NTFY_ORDER 50-di_tabletscreen
STATE cmd_1
TYPE DOIF
READINGS:
2017-09-22 19:58:05 Device Winconnect.TABLET
2017-09-22 18:24:38 cmd 1
2017-09-22 18:24:38 cmd_event Winconnect.TABLET
2017-09-22 18:24:38 cmd_nr 1
2017-09-22 19:58:05 e_Winconnect.TABLET_microphone_detect True
2017-09-22 19:58:05 e_Winconnect.TABLET_motion_detect False
2017-09-22 18:24:38 state cmd_1
2017-09-22 19:58:05 wait_timer no timer
condition:
0 ReadingValDoIf($hash,'Winconnect.TABLET','motion_detect') eq "True" or ReadingValDoIf($hash,'Winconnect.TABLET','microphone_detect') eq "True"
1 ReadingValDoIf($hash,'Winconnect.TABLET','motion_detect') eq "False" or ReadingValDoIf($hash,'Winconnect.TABLET','microphone_detect') eq "False"
devices:
0 Winconnect.TABLET
1 Winconnect.TABLET
all Winconnect.TABLET
do:
0:
0 set Winconnect.TABLET screenOn
1:
0 set Winconnect.TABLET screenOff
2:
helper:
event microphone_detect: True
globalinit 1
last_timer 0
sleepdevice Winconnect.TABLET
sleepsubtimer 0
sleeptimer -1
timerdev Winconnect.TABLET
timerevent microphone_detect: True
triggerDev Winconnect.TABLET
timerevents:
microphone_detect: True
timereventsState:
microphone_detect: True
triggerEvents:
microphone_detect: True
triggerEventsState:
microphone_detect: True
internals:
itimer:
readings:
0 Winconnect.TABLET:motion_detect Winconnect.TABLET:microphone_detect
1 Winconnect.TABLET:motion_detect Winconnect.TABLET:microphone_detect
all Winconnect.TABLET:motion_detect Winconnect.TABLET:microphone_detect
regexp:
0:
1:
all:
state:
STATE:
trigger:
Attributes:
wait 0:1800
Und der Befehl
set Winconnect.TABLET screenOn
einfach in der Kommandozeile von FHEMWEB eingegeben klappt?
Ja damit geht es an.
ohne do always wird nur nach Zustandswechsel geschaltet.
hm wie bekomm ich das den nun sauber hin ?
Will ja nur damit hinbekommen das das Tablet immer an bleibt wenn in den 30 Minuten eins von beiden True ist. Wenn jetzt 30 Minuten False bei beiden ist soll screenOff gehen.
Zitat von: ChrisW am 22 September 2017, 22:02:27
hm wie bekomm ich das den nun sauber hin ?
Will ja nur damit hinbekommen das das Tablet immer an bleibt wenn in den 30 Minuten eins von beiden True ist. Wenn jetzt 30 Minuten False bei beiden ist soll screenOff gehen.
Dann musst du bei false mit and statt or arbeiten.
lol doch so einfach ? Scheint im Test echt zu klappen ich werd es mal weiter im Auge behalten :)
also heute morgen auch wieder das Problem screenOn führt er nicht aus. Mache ich es Manuell geht das Display an.
Irgendwie nach der Nacht wieso auch immer klappt das DoIf nicht mehr. Der STatus dort wurde aber verändert :(
([Winconnect.TABLET:motion_detect] eq "True" or [Winconnect.TABLET:microphone_detect] eq "True") (set Winconnect.TABLET screenOn) DOELSEIF ([Winconnect.TABLET:motion_detect] eq "False" and [Winconnect.TABLET:microphone_detect] eq "False") (set Winconnect.TABLET screenOff)
Hab mal ein Filelog erstellt aber da steht nur sowas:
2017-09-25_09:16:42 di_tabletscreen wait_timer: 25.09.2017 09:46:42 cmd_2 Winconnect.TABLET
2017-09-25_09:18:32 di_tabletscreen wait_timer: no timer
2017-09-25_09:18:33 di_tabletscreen wait_timer: 25.09.2017 09:48:33 cmd_2 Winconnect.TABLET
2017-09-25_09:22:17 di_tabletscreen wait_timer: no timer
2017-09-25_09:22:33 di_tabletscreen wait_timer: 25.09.2017 09:52:33 cmd_2 Winconnect.TABLET
2017-09-25_09:22:36 di_tabletscreen wait_timer: no timer
2017-09-25_09:22:41 di_tabletscreen wait_timer: 25.09.2017 09:52:41 cmd_2 Winconnect.TABLET
2017-09-25_09:22:44 di_tabletscreen wait_timer: no timer
2017-09-25_09:22:49 di_tabletscreen wait_timer: 25.09.2017 09:52:49 cmd_2 Winconnect.TABLET
2017-09-25_09:22:49 di_tabletscreen wait_timer: no timer
2017-09-25_09:22:54 di_tabletscreen wait_timer: 25.09.2017 09:52:54 cmd_2 Winconnect.TABLET
2017-09-25_09:22:55 di_tabletscreen wait_timer: no timer
2017-09-25_09:22:59 di_tabletscreen wait_timer: 25.09.2017 09:52:59 cmd_2 Winconnect.TABLET
2017-09-25_09:23:02 di_tabletscreen wait_timer: no timer
2017-09-25_09:23:04 di_tabletscreen wait_timer: 25.09.2017 09:53:04 cmd_2 Winconnect.TABLET
2017-09-25_09:23:12 di_tabletscreen wait_timer: no timer
2017-09-25_09:23:43 di_tabletscreen wait_timer: 25.09.2017 09:53:43 cmd_2 Winconnect.TABLET
Kann es sein das wegen dem wait attribut auch für screen on gewartet wird?
Dein Timer zur Ausführung wird zwar gesetzt, paar Minuten später wird durch ein Ereignis aber wieder in den cmd_1 Zustand gewechselt - das Löscht den Timer - die Ausführung von cmd_2 kommt nicht zum Zuge.
hm und eine idee wie ich das nun am besten gelöst bekomme ? Kann man den timer nicht im code einbauen ? Würde das was bringen ?
Zitat von: ChrisW am 25 September 2017, 11:39:59
hm und eine idee wie ich das nun am besten gelöst bekomme ? Kann man den timer nicht im code einbauen ? Würde das was bringen ?
setze mal dieses Attribut im deinem DOIF: https://fhem.de/commandref_DE.html#DOIF_checkReadingEvent
okay Danke habe mal checkReadingEvent 0 gesetzt im ersten Test hat es nun geklappt ich versuche es nun mal mit beiden zusammen ob das auch noch geht :)
Zitat von: ChrisW am 25 September 2017, 12:40:15
okay Danke habe mal checkReadingEvent 0 gesetzt im ersten Test hat es nun geklappt ich versuche es nun mal mit beiden zusammen ob das auch noch geht :)
eigentlich müsstest du checkReadingEvent auf 1 setzen, damit es Wirkung zeigt.
dann hat es nicht funktioniert. Hatte es erst auf 1.
Nun mit 0 klappt es derzeit .. komisch
so lange ohne ausgekommen aber jetzt habe ich fhem neu gemacht nun will ich es nochmal versuchen.. mit checkReadingEvent 0 hat es auch nicht besser funktioniert. Mit 1 aber auch nicht.
Sehe das bei wait_timer öfters notimer oder so etwas was ( 06.02.2019 21:39:11 cmd_2 Winconnect.TABLET ) aber dann wieder zu notimer wechselt........ die beiden Mic und Motion verändern sich aber nicht !
Internals:
DEF ([Winconnect.TABLET:motion_detect] eq "True" or [Winconnect.TABLET:microphone_detect] eq "True") (set Winconnect.TABLET screenOn) DOELSEIF ([Winconnect.TABLET:motion_detect] eq "False" and [Winconnect.TABLET:microphone_detect] eq "False") (set Winconnect.TABLET screenOff)
FUUID 5c5496c6-f33f-09a2-0553-30fd4008f75d212c
MODEL FHEM
NAME di_tabletscreen
NR 670
NTFY_ORDER 50-di_tabletscreen
STATE cmd_1
TYPE DOIF
.attraggr:
.attrminint:
READINGS:
2019-02-06 21:24:20 Device Winconnect.TABLET
2019-02-05 20:55:02 cmd 1
2019-02-05 20:55:02 cmd_event Winconnect.TABLET
2019-02-05 20:55:02 cmd_nr 1
2019-02-06 21:23:54 e_Winconnect.TABLET_microphone_detect True
2019-02-06 21:11:24 e_Winconnect.TABLET_motion_detect False
2019-02-05 20:55:02 error set Winconnect.TABLET screenOn: Device needs to be ON to adjust screenon.
2019-02-05 20:55:02 state cmd_1
2019-02-06 21:23:54 wait_timer no timer
Regex:
attr:
wait:
0:
0
1:
800
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Winconnect.TABLET','motion_detect') eq "True" or ::ReadingValDoIf($hash,'Winconnect.TABLET','microphone_detect') eq "True"
1 ::ReadingValDoIf($hash,'Winconnect.TABLET','motion_detect') eq "False" and ::ReadingValDoIf($hash,'Winconnect.TABLET','microphone_detect') eq "False"
devices:
0 Winconnect.TABLET
1 Winconnect.TABLET
all Winconnect.TABLET
do:
0:
0 set Winconnect.TABLET screenOn
1:
0 set Winconnect.TABLET screenOff
2:
helper:
event memory_available: 1.893
globalinit 1
last_timer 0
sleepdevice Winconnect.TABLET
sleepsubtimer 0
sleeptimer -1
timerdev Winconnect.TABLET
timerevent microphone_detect: True
triggerDev Winconnect.TABLET
timerevents:
microphone_detect: True
timereventsState:
microphone_detect: True
triggerEvents:
memory_available: 1.893
triggerEventsState:
memory_available: 1.893
internals:
itimer:
perlblock:
readings:
0 Winconnect.TABLET:motion_detect Winconnect.TABLET:microphone_detect
1 Winconnect.TABLET:motion_detect Winconnect.TABLET:microphone_detect
all Winconnect.TABLET:motion_detect Winconnect.TABLET:microphone_detect
trigger:
uiState:
uiTable:
Attributes:
DbLogExclude .*
checkReadingEvent 1
wait 0:800
Wäre es nicht besser mit:
([Winconnect.TABLET:motion_detect] eq "True" or [Winconnect.TABLET:microphone_detect] eq "True") (set Winconnect.TABLET screenOn) DOELSE (set Winconnect.TABLET screenOff)
?
Danke schaut aktuell so aus als ob es funktioniert :)