Hauptmenü

Rückfrage zu waitsame

Begonnen von Marko1976, 21 Dezember 2025, 12:30:30

Vorheriges Thema - Nächstes Thema

Marko1976

Ich habe mal eine Nachfrage zu waitsame. Dabie handelt es sich ja um eine allgemeine Eigenschaft in praktisch allen Devices.
Wenn ich die commandref dazu lese, verstehe ich es so, dass ein Event innerhalb der eingestellten Zeit zweimal auftreten muss.

Was allerdings nichts aus der CommandRef hervor geht ist der Punkt ob das waittsame das zweite Auftreten aktiv abfragt ob nur das Vorkommen prüft. Süeziell bei Events die durch Pollen in einem bestimmten Intervall ausgelöst werden, ist ersteres ja praktisch nie erreichbar, es sei denn waitsame denkt einen kompletten Pollzyklus ab.

Wie ist es nun richtig zu verstehen?

Damian

Zitat von: Marko1976 am 21 Dezember 2025, 12:30:30Ich habe mal eine Nachfrage zu waitsame. Dabie handelt es sich ja um eine allgemeine Eigenschaft in praktisch allen Devices.
Wenn ich die commandref dazu lese, verstehe ich es so, dass ein Event innerhalb der eingestellten Zeit zweimal auftreten muss.

Was allerdings nichts aus der CommandRef hervor geht ist der Punkt ob das waittsame das zweite Auftreten aktiv abfragt ob nur das Vorkommen prüft. Süeziell bei Events die durch Pollen in einem bestimmten Intervall ausgelöst werden, ist ersteres ja praktisch nie erreichbar, es sei denn waitsame denkt einen kompletten Pollzyklus ab.

Wie ist es nun richtig zu verstehen?

Wie kommst du darauf, dass es eine Eigenschaft in allen Devices ist?

Es ist ein Attribut des DOIF-Moduls und nur dort kommt es vor (auch in der Commandref).

Zu deiner Frage: Es müssen zwei Events kommen, es wird nicht gepollt.


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

Marko1976

Zitat von: Damian am 21 Dezember 2025, 14:49:38Wie kommst du darauf, dass es eine Eigenschaft in allen Devices ist?
Das mag daran liegen, dass ich praktisch nur DOIF's verwende. Ich habe jedenfalls kein Device im Kopf, wo es nicht vorkommt, abgesehen von irgendwlechen Gerätedevices die Modulspezifisch sind.

Das heißt aber wie beschrieben, dass wenn das Event nicht durch Poll ióder irgendeinen anderen Umstand zweimal von alleine erzeugt wird reagiert das DIF dann gar nicht mehr.

Hintergrund ist folgender:
Ich nutze AMAD um vom Handy die Resident-Devices zu schalten und in "schläft" umzustellen.
Leider haben die aktuellen Handys die ich nutze/besitze alle das Problem, das sie zwischendurch Ladestopps als Akkuschutz einbauen. Dabie wird dann immer von AMAD an das Deive gesendet, dass das Handy /die PErson nicht mehr schlafend ist und somit im DOIF die Routine zum aufstehen aktiviert wird.
Da dieser Akkuschutz imme rnur für max. 2 Sekunden umspringt war meine Hoffnung per waitsame die Aufstehroutine kurz zu verzögern und nur dann auszuführen wenn das Handy tatsächich, also länger als 2 Sekunden, nicht geladen wird. Doch das funktioniert nicht das das zweite Event fehlt und somit die Routine gar nicht mehr auslöst.

Gibt es eine Möglichkeit das waitsame so zu verdrehen, dass es nach ablauf der eingestellten Zeit selbstständig prüft ob der gleiche Zustand noch vorhanden ist? Oder gibt es vielleicht eine Alternative Funktion dazu, die mir nicht bekannt ist?

Damian

Zitat von: Marko1976 am 21 Dezember 2025, 18:57:59Gibt es eine Möglichkeit das waitsame so zu verdrehen, dass es nach ablauf der eingestellten Zeit selbstständig prüft ob der gleiche Zustand noch vorhanden ist? Oder gibt es vielleicht eine Alternative Funktion dazu, die mir nicht bekannt ist?


Du setzt einen wait-Timer und prüfst mit IF nach dessen Ablauf den Zustand des Devices.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Marko1976

Zitat von: Damian am 21 Dezember 2025, 19:57:30....prüfst mit IF nach dessen Ablauf den Zustand des Devices
Das hieße ich muss innerhalb des IF's alle Bedingungen einbauen die bereits im ursprünglichen DOIF-Zweig vorhanden sind, richtig?

Damian

Zitat von: Marko1976 am 21 Dezember 2025, 20:36:08
Zitat von: Damian am 21 Dezember 2025, 19:57:30....prüfst mit IF nach dessen Ablauf den Zustand des Devices
Das hieße ich muss innerhalb des IF's alle Bedingungen einbauen die bereits im ursprünglichen DOIF-Zweig vorhanden sind, richtig?

Wenn die dann noch gelten sollen - ja.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Marko1976

So sieht mein jetziges DOIF aus:
## Person schläft
(([Galaxy_S25_Ultra_Marko] eq "present") and ([GalaxyS25ultra_Marko:powerPlugged] eq "1") and [?22:00-12:00])
    (set rr_Marko schläft) ({Ansage("Gute Nacht Marko", "Echo_Schlafzimmer,Echo_Wohnzimmer")})

## Person ist anwesend
DOELSEIF (([Galaxy_S25_Ultra_Marko] eq "present") and ([GalaxyS25ultra_Marko:powerPlugged] eq "0"))
    (set rr_Marko zuhause)
    (IF ([rr_Marko:lastState] eq "abwesend") ({Ansage("Willkommen zu Hause Marko", "Echo_Wohnzimmer")}))
    (IF ([rr_Marko:lastState] eq "absent") ({Ansage("Willkommen zu Hause Marko", "Echo_Wohnzimmer")}))
    (IF ([rr_Marko:lastState] eq "schläft") ({Ansage("Guten Morgen, Marko", "Echo_Wohnzimmer,Echo_Schlafzimmer")}))
    (IF ([rr_Marko:lastState] eq "asleep") ({Ansage("Guten Morgen, Marko", "Echo_Wohnzimmer,Echo_Schlafzimmer")}))

##Person ist abwesend
DOELSEIF (([Galaxy_S25_Ultra_Marko] eq "absent") and ([GalaxyS25ultra_Marko:powerPlugged] eq "0"))
    (set rr_Marko abwesend)
   
##Person ist verreist
DOELSEIF ([rr_Marko:state] eq "verreist")
    ()
Es geht um den zweiten Zweig im DOIF.
Es würde ja reichen wenn ich das Reading PowerPlugged mit einem wait von 3 Sekunden abfrage, also den Ausführungsteil so abändere:
(IF ([GalaxyS25ultra_Marko:powerPlugged] eq "0") (set rr_Marko zuhause))Aber dann bekomme ich in diesem speziellen Fall ein Problem mit dem Rest des Ausführungsteils, oder nicht. Der würde doch trotzdem nach Ablauf des wait ausgeführt.

Das bedeutet für mich, ich habe technisch drei Möglichkeiten:
1. Ich breche die Ausführung irgendwie komplett ab (alles bisher dazu gefundene mit isdisabled finde ich irgendwie mehr Verwirrend als hilfreich),
2. Ich ergänze das If auch in den anderen Ausführungsteilen (sofern ein If im If technisch innerhalb des Ausführungsteiles funktioniert),
3. Ich setze das DOIF mit set zurück auf den ersten Zweig (was aber zur Konsequenz hat, dass die Ansage unzutreffenderweise ausgegeben wird).

Oder sehe ich das falsch?

Damian

Du kannst IFs ineinander schachteln
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Marko1976

Ich abe den betreffenden Zwei jetzt folgendermaßen geändert und diese Nacht/Morgen ausprobiert:
## Person ist anwesend
DOELSEIF (([Galaxy_S25_Ultra_Marko] eq "present") and ([GalaxyS25ultra_Marko:powerPlugged] eq "0"))
(IF ([GalaxyS25ultra_Marko:powerPlugged] eq "0") (set rr_Marko zuhause))
(IF ([GalaxyS25ultra_Marko:powerPlugged] eq "0") (IF ([rr_Marko:lastState] eq "abwesend") ({Ansage("Willkommen zu Hause Marko", "Echo_Wohnzimmer")})))
(IF ([GalaxyS25ultra_Marko:powerPlugged] eq "0") (IF ([rr_Marko:lastState] eq "absent") ({Ansage("Willkommen zu Hause Marko", "Echo_Wohnzimmer")})))
(IF ([GalaxyS25ultra_Marko:powerPlugged] eq "0") (IF ([rr_Marko:lastState] eq "schläft") ({Ansage("Guten Morgen, Marko", "Echo_Wohnzimmer,Echo_Schlafzimmer")})))
(IF ([GalaxyS25ultra_Marko:powerPlugged] eq "0") (IF ([rr_Marko:lastState] eq "asleep") ({Ansage("Guten Morgen, Marko", "Echo_Wohnzimmer,Echo_Schlafzimmer")})))

Das Abfangen des Handy-Ladefehlers funktioniert, doch leider wurde auch keine Ansage ausgegeben.Ist da vielleicht doch ein Syntexfehler drin? Mit so einem doppelten If habe ich noch nie zu tun gehabt.
Einfacher fände ich es ja wenn es ein "Else exit" oder so geben würde das man in cmd2_1 einbauen könnte, das einfach die weitere Ausführung abbricht, aber so etwas gibt es nicht, oder? Ich meine "else" gibt es natürlich, aber so ein "Exit" nicht, jedenfalls ist mir nichts bekannt.

Damian

Du definierst mit jeder Klammer auf eine neue Sequenz im DOIF - das willst du nicht.

so würde man den Zweig mit IFs programmieren:

DOELSEIF ([Galaxy_S25_Ultra_Marko] eq "present" and [GalaxyS25ultra_Marko:powerPlugged] eq "0")
(
  IF ([GalaxyS25ultra_Marko:powerPlugged] eq "0") (
    set rr_Marko zuhause,
    IF ([rr_Marko:lastState] eq "abwesend" or [rr_Marko:lastState] eq "absent") ({Ansage("Willkommen zu Hause Marko", "Echo_Wohnzimmer")}) ELSE (
      IF ([rr_Marko:lastState] eq "schläft" or [rr_Marko:lastState] eq "asleep") ({Ansage("Guten Morgen, Marko", "Echo_Wohnzimmer,Echo_Schlafzimmer")})
    )
  )
)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Marko1976

Also du hast jeweils das Englisch und Deutsch zusammengefasst und dann statt der einzelnen Unterkommandos cms 2_1, cmd2_2, cmd2_3 etc. alles in einen einzigen cmd1-Zweig zusammengeschrieben, sehe ich das richtig?

Das bedeutet wenn nach Ablauf des wait die IF-Prüfung trueergibt wird der gesamte cms1_Teil ausgeführt, wobei es darin noch die weitere IF-Prüfung auf den "lastState" gibt.

Das einzige was ich aktuell noch nicht ganz durchblicke welchen Unterschied das "else" macht. Mir ist natürlich die Bedeutung klar, aber hat es einen offensichtlichen Unterschied zur vorherigen Schreibweise in der beide (alle 4) Teilschritte auch nur bei Zutreffen der jeweiligen If-Bedingung ausgeführt wurden.

Ich muss sagen so komplexe Bedingungsabfragen kenne ich bisher nur aus Excel.

Damian

Zitat von: Marko1976 am 22 Dezember 2025, 15:38:12Das einzige was ich aktuell noch nicht ganz durchblicke welchen Unterschied das "else" macht. Mir ist natürlich die Bedeutung klar, aber hat es einen offensichtlichen Unterschied zur vorherigen Schreibweise in der beide (alle 4) Teilschritte auch nur bei Zutreffen der jeweiligen If-Bedingung ausgeführt wurden.

Es hat was mit Effizienz zu tun. Es kostet unnötig Performance Dinge abzufragen, von denen man weiß, dass sie nicht wahr sein können. Daher macht es Sinn überflüssige Abfragen per ELSE auszuschließen
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF