FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: ChrisW am 16 September 2017, 13:39:32

Titel: Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 16 September 2017, 13:39:32
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?
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: Ellert am 16 September 2017, 18:10:52
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.
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 16 September 2017, 21:44:19
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
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: amenomade am 16 September 2017, 21:56:29
ZitatIm Wiki steht leider so vieles

In CommandRef aber viel mehr https://fhem.de/commandref_DE.html#DOIF
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 16 September 2017, 22:03:21
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*
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 17 September 2017, 21:41:18
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
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: Rolfg am 17 September 2017, 22:03:27
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
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 18 September 2017, 10:57:24
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


Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: CoolTux am 18 September 2017, 12:13:27
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
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 18 September 2017, 16:24:09
Danke aber nun funktioniert das screenOn nicht mehr wenn etwas True wird.
Sicher das wait in das attribut ??
Fehlermeldungen habe ich keine. screenoff funktioniert.
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: CoolTux am 18 September 2017, 16:32:04
Im ganzen Code sehe ich nicht ein screenoff. Keine Ahnung was du aus meinem Code machst
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 22 September 2017, 19:20:22
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
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: CoolTux am 22 September 2017, 19:24:26
Ein list vom DOIF wurde hier mehr Aufschluss bringen.
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 22 September 2017, 19:58:49
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
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: CoolTux am 22 September 2017, 20:03:35
Und der Befehl
set Winconnect.TABLET screenOn
einfach in der Kommandozeile von FHEMWEB eingegeben klappt?
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 22 September 2017, 21:53:28
Ja damit geht es an.
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: Damian am 22 September 2017, 22:00:31
ohne do always wird nur nach Zustandswechsel geschaltet.
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag 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.

Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: Damian am 22 September 2017, 22:17:07
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.
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 22 September 2017, 22:30:31
lol doch so einfach ? Scheint im Test echt zu klappen ich werd es mal weiter im Auge behalten :)
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 25 September 2017, 08:16:39
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?
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: Damian am 25 September 2017, 11:28:11
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.

Titel: Antw:Kleine DOIF Hilfe :)
Beitrag 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 ?
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: Damian am 25 September 2017, 11:45:22
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
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag 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 :)
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: Damian am 25 September 2017, 12:50:31
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.
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 25 September 2017, 12:59:49
dann hat es nicht funktioniert. Hatte es erst auf 1.
Nun mit 0 klappt es derzeit .. komisch
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 06 Februar 2019, 21:28:14
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
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: amenomade am 06 Februar 2019, 22:26:06
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)
?
Titel: Antw:Kleine DOIF Hilfe :)
Beitrag von: ChrisW am 10 Februar 2019, 09:24:44
Danke schaut aktuell so aus als ob es funktioniert :)