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