[GELÖST] cmd_1 wiederholen, bis state vom Samsung auf "on" geht .....

Begonnen von Invers, 10 Mai 2019, 23:05:54

Vorheriges Thema - Nächstes Thema

Invers

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.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Damian

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 ?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Invers

#2
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:


Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Invers

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


Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Invers

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.

Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Invers

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
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Damian

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.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Invers

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.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Invers

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.
Pi3B+ mit SSD/ Bullseye | FB7590 AX | 12 x Dect200 | CUL433+868 | SDuino | HM-LAN | 3 x Heizung FHT + FKontakte | KeyMatic + 4 FB | HM Wandtaster 2-fach m. LED | 6 x Türkont. TFK-TI | HM-Bew.-Melder innen | 3 x Smoked. HM-SEC-SD-2