Hi, ich habe ein Problem, zu dessen Lösung ich nicht fähig bin, obwohl ich alle möglichen Varianten ausprobiert habe und auch im Forum Ähnliches fand, was aber nicht wirklich funktionierte.
Mein Fernseher (Samsung) wird über eine Steckdose (TV) eingeschaltet.
In Folge sollen andere Geräte und Aktionen geschaltet werden, wenn der Samsung ,,on" meldet, statt absent oder off.
Das dauert leider verschieden lange. Daher soll folgendes DOIF cmd_1 wiederholen, bist der Samsung ,,on" meldet. Danach sollen die restlichen Zweige des DOIF abgearbeitet werden.
Ich rufe also das DOIF mit - set DITVGERAET cmd_1 - auf. Die Steckdose TV und somit auch der Samsung werden auch eingeschaltet, aber der Timer wird immer wieder verlängert. Das DOIF erkennt nicht, wenn der Samsung ,,on" meldet.
Nach einiger Zeit wird die Steckdose wegen mangelnder Last wieder automatisch ohne fhem ausgeschaltet. Geht der Samsung dadurch wieder auf absent, wird er natürlich durch den Filter wieder eingeschaltet, da ja das DOIF nicht beendet wird.
Was muss ich denn ändern, damit cmd_1 so lange wiederholt wird, bis der Samsung ,,on" meldet? Das DOIF soll nur per set aufgerufen werden.
Meine derzeitige Definition sieht so aus:
Internals:
DEF ([?Samsung] eq "absent")
(set TV:FILTER=STATE=off on, set Samsung statusRequest, set $SELF CMD_1)
DOELSE
(say 2)
(say 3)
(say 4 usw)
FUUID 5cd47da6-f33f-edf9-5487-b6245f43257a2733
MODEL FHEM
NAME DITVGERAET
NR 559
NTFY_ORDER 50-DITVGERAET
STATE cmd_1
TYPE DOIF
VERSION 19303 2019-05-01 08:47:16
READINGS:
2019-05-10 22:43:28 cmd 1
2019-05-10 22:43:28 cmd_event set_cmd_1
2019-05-10 22:43:28 cmd_nr 1
2019-05-10 22:38:24 mode enabled
2019-05-10 22:43:28 state cmd_1
2019-05-10 22:43:28 wait_timer 10.05.2019 22:43:33 cmd_1 set_cmd_1
Regex:
accu:
attr:
cmdState:
repeatcmd:
5
wait:
waitdel:
condition:
0 ::InternalDoIf($hash,'Samsung','STATE') eq "absent"
devices:
do:
0:
0 set TV:FILTER=STATE=off on, set Samsung statusRequest, set DITVGERAET CMD_1
1:
0 say 2
1 say 3
2 say 4 usw
helper:
event
globalinit 1
last_timer 0
sleepdevice set_cmd_1
sleepsubtimer 0
sleeptimer 0
triggerDev
triggerEvents
triggerEventsState
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: set_cmd_1
state: cmd_1
internals:
0 Samsung:STATE
all Samsung:STATE
itimer:
uiState:
uiTable:
Attributes:
repeatcmd 5
room 1Test
Da ich das selbe Problem noch für meinen SAT habe, wäre ich für eine funktionierende Lösung wirklch sehr dankbar.
Zitat von: Invers am 10 Mai 2019, 23:05:54
....
Das DOIF erkennt nicht, wenn der Samsung ,,on" meldet.
Wie soll er es erkennen? Du hast doch keinen Zweig, wo du auf Samsung ,,on" reagierst.
Hast du schon einen weiteren Zweig: DOELSEIF ([Samsung:state] eq "on") ausprobiert ?
Ich hatte gedacht, wenn nach dem Statusrequest die erste Zeile wiederholt wird, sieht das DOIF das doch. Hab ich mich offenbar geirrt, denn mit deinem Vorschlag funktioniert es. Das DOIF hat nur immer wieder eingeschaltet, was ich aber mit ([?Samsung:state] eq "absent") nun verhindern konnte.
Wird vielleicht gar nicht die erste Zeile immer wieder wiederholt, sondern nur die zweite Zeile? Dann hätte ich das Prinzip vorher falsch verstanden.
Ich wollte allerdings auf die gleiche Weise im selben DOIF prüfen, ob mein SAT an ist (auch mit wait).
Geht so etwas überhaupt?
Also ich meine das so:
-warte bis Samsung an
-Man ne Menge
-warte bis SAT an
-mach ne Menge
-Ende DOIF
Das klappt doch mit DOELSEIF so nicht, oder sehe ich da was nicht richtig?
EDIT:
Diesen Teil der Frage ziehe ich zurück, weil ich verstanden habe, dass es geht.
EDIT ENDE:
Hallo Damian,
ich möchte hier noch vielmals DANKE sagen, weil es nun alles perfekt funktioniert.
Eine kleine Gemeinheit hatte sich in meinem eigenen Code noch eingeschlichen. Ich hatte IF(blabla) statt IF (blabla) geschrieben. Das hat natürlich nicht funktioniert. Böse Falle.
Hier noch einmal für alle, die es interessieren könnte, das Listing des DOIF. Die Umwege sind wegen Samsung und Gigablue leider nötig. Vorher hatte ich im alten DOIF einfach die Zeiten, die zum warten benötigt werden, geschätzt und per wait festgelegt. Mit der jetzigen Methode ist die Anlage schneller einsatzbereit. So verpasst man nicht die Werbung vor dem SchleFaZ (lacht).
Internals:
DEF ([?Samsung:state] eq "absent" or [?Giga:state] ne "on")
(set TV:FILTER=STATE=off on,
IF ([$SELF:myGigaGeschaltet] == 0) (set Giga on),
setreading $SELF myGigaGeschaltet 1,
set HiFi:FILTER=STATE=off on,
set Samsung statusRequest,
set Giga statusRequest,
set $SELF CMD_1)
DOELSEIF ([Samsung:state] eq "on" and [Giga:state] eq "on")
(setreading $SELF myGigaGeschaltet 0, say 2, say 3, say 4 usw)
FUUID 5cd47da6-f33f-edf9-5487-b6245f43257a2733
MODEL FHEM
NAME DITVGERAET
NR 559
NTFY_ORDER 50-DITVGERAET
STATE initialized
TYPE DOIF
VERSION 19303 2019-05-01 08:47:16
READINGS:
2019-05-11 12:55:28 Device Giga
2019-05-11 12:51:15 cmd 0
2019-05-11 12:55:28 e_Giga_state absent
2019-05-11 12:51:15 mode enabled
2019-05-11 12:50:08 myGigaGeschaltet 1
2019-05-11 12:51:15 state initialized
Regex:
accu:
attr:
cmdState:
repeatcmd:
5
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Samsung','state') eq "absent" or ::ReadingValDoIf($hash,'Giga','state') ne "on"
1 ::ReadingValDoIf($hash,'Samsung','state') eq "on" and ::ReadingValDoIf($hash,'Giga','state') eq "on"
devices:
1 Samsung Giga
all Samsung Giga
do:
0:
0 set TV:FILTER=STATE=off on, IF ([DITVGERAET:myGigaGeschaltet] == 0) (set Giga on), setreading DITVGERAET myGigaGeschaltet 1, set HiFi:FILTER=STATE=off on, set Samsung statusRequest, set Giga statusRequest, set DITVGERAET CMD_1
1:
0 setreading DITVGERAET myGigaGeschaltet 0, say 2, say 3, say 4 usw
2:
helper:
event presence: absent,absent,stateAV: absent,input: -
globalinit 1
last_timer 0
sleeptimer -1
triggerDev Giga
triggerEvents:
presence: absent
absent
stateAV: absent
input: -
channelList: -,
triggerEventsState:
presence: absent
state: absent
stateAV: absent
input: -
internals:
itimer:
readings:
1 Samsung:state Giga:state
all Samsung:state Giga:state
trigger:
uiState:
uiTable:
Attributes:
repeatcmd 5
room 1Test
Schade, ich muss leider doch noch einmal nerven. Ich habe zum Test mehrfach
set DI_Fernseher cmd_1 aufgerufen, obwohl die Anlage schon hochgefahren war um zu testen, ob es Nebenwirkungen gibt.
Das ging auch mehrfach hintereinander gut, dann aber nach ungefähr 10-12 Versuchen bleibt das DOIF wieder in der Schleife hängen. Ich sehe nun gar keinen Grund dafür.
Samsung meldet zwar einen Fehler, aber der sollte eigentlich nicht störe, hoffe ich jedenfalls.
[SamsungAV] Samsung: ERROR cannot open file for input the session key.
Ich glaube, dass, wenn ich das DOIF mit set set DI_Fernseher cmd_1 aufrufe, die erste Zeile gar nicht beim ersten Durchlauf getestet wird. So denke ich es der Commandref entnommen zu haben. Wenn beide Geräte schon on sind, wäre das ja nicht erforderlich, diesen Zweig zu durchlaufen. Falls ich das richtig sehe, bräuchte ich einen Tipp, wie ich das DOIF sonst aufrufen könnte.
Kannst du bitte nochmal einen Blick drauf werfen?
Danke im Voraus.
List vergessen:
Internals:
DEF ([?Samsung:state] eq "absent" or [?Giga:state] ne "on")
(set TV:FILTER=STATE=off on,
IF ([$SELF:myGigaGeschaltet] == 0) (set Giga on),
setreading $SELF myGigaGeschaltet 1,
set HiFi:FILTER=STATE=off on,
set Samsung statusRequest,
set Giga statusRequest,
set $SELF CMD_1)
DOELSEIF ([Samsung:state] eq "on" and [Giga:state] eq "on")
(setreading $SELF myGigaGeschaltet 0)
FUUID 5cd6b1a5-f33f-8098-e610-c56187d53b15ae29
MODEL FHEM
NAME DI_Fernseher
NR 220
NTFY_ORDER 50-DITVGERAET
STATE cmd_1
TYPE DOIF
VERSION 19303 2019-05-01 08:47:16
READINGS:
2019-05-11 15:19:46 Device Giga
2019-05-11 15:01:46 cmd 1
2019-05-11 15:01:46 cmd_event set_cmd_1
2019-05-11 15:01:46 cmd_nr 1
2019-05-11 14:53:14 e_Giga_state on
2019-05-11 14:55:24 e_Samsung_state on
2019-05-11 15:07:45 mode enabled
2019-05-11 15:08:11 myGigaGeschaltet 0
2019-05-11 15:07:45 state cmd_1
2019-05-11 15:01:53 wait_timer no timer
Regex:
accu:
attr:
cmdState:
repeatcmd:
7
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'Samsung','state') eq "absent" or ::ReadingValDoIf($hash,'Giga','state') ne "on"
1 ::ReadingValDoIf($hash,'Samsung','state') eq "on" and ::ReadingValDoIf($hash,'Giga','state') eq "on"
devices:
1 Samsung Giga
all Samsung Giga
do:
0:
0 set TV:FILTER=STATE=off on, IF ([DI_Fernseher:myGigaGeschaltet] == 0) (set Giga on), setreading DI_Fernseher myGigaGeschaltet 1, set HiFi:FILTER=STATE=off on, set Samsung statusRequest, set Giga statusRequest, set DI_Fernseher CMD_1
1:
0 setreading DI_Fernseher myGigaGeschaltet 0
2:
helper:
event eventremaining: 2521,eventremaining_next: 5934,eventcurrenttime: 1557580786,eventcurrenttime_next: 1557580786,eventcurrenttime_hr: 15:19:46,eventcurrenttime_next_hr: 15:19:46,eventremaining_hr: 00:42:01,eventremaining_next_hr: 01:38:54
globalinit 1
last_timer 0
sleepdevice set_cmd_1
sleepsubtimer -1
sleeptimer -1
timerdev Samsung
timerevent on
triggerDev Giga
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: set_cmd_1
state: cmd_1
timerevents:
on
timereventsState:
state: on
triggerEvents:
eventremaining: 2521
eventremaining_next: 5934
eventcurrenttime: 1557580786
eventcurrenttime_next: 1557580786
eventcurrenttime_hr: 15:19:46
eventcurrenttime_next_hr: 15:19:46
eventremaining_hr: 00:42:01
eventremaining_next_hr: 01:38:54
triggerEventsState:
eventremaining: 2521
eventremaining_next: 5934
eventcurrenttime: 1557580786
eventcurrenttime_next: 1557580786
eventcurrenttime_hr: 15:19:46
eventcurrenttime_next_hr: 15:19:46
eventremaining_hr: 00:42:01
eventremaining_next_hr: 01:38:54
internals:
itimer:
readings:
1 Samsung:state Giga:state
all Samsung:state Giga:state
trigger:
uiState:
uiTable:
Attributes:
repeatcmd 7
room 1Test
Grundsätzlich kannst du solche Abfragen:
([?Samsung:state] eq "absent" or [?Giga:state] ne "on")
gleich (1)
setzen, denn sie werden bei keinem Trigger ausgewertet werden, weil sie keinen haben.
Irgendwo hakt es bei mir. Würde denn,wenn ich die Zeile austausche, nicht immer der 1. Zweig durchlaufen werden? Also auch dann, wenn beide Geräte schon an wären? Ich wollte ja eigentlich nur etwas tun, wenn mindestens eines der beiden Geräte aus ist. Aber ich probier das mal aus.
Danke.
Zitat von: Invers am 11 Mai 2019, 15:39:46
Irgendwo hakt es bei mir. Würde denn,wenn ich die Zeile austausche, nicht immer der 1. Zweig durchlaufen werden? Also auch dann, wenn beide Geräte schon an wären? Ich wollte ja eigentlich nur etwas tun, wenn mindestens eines der beiden Geräte aus ist. Aber ich probier das mal aus.
Danke.
Wenn man per set-Befehl einen DOIF-Zweig ausführt, wird keine Bedingung ausgewertet.
OK, das hatte ich ja auch so rausgelesen. Ich dachte nur, es gibt vielleicht eine andere, einfache Möglichkeit.
Ich werde den Test auf on der Geräte in einem Extra DOIF vornehmen. Das kann ja dann das aktuelle DOIF schalten.
Danke dir und schönes WE.