...
Zitat von: Rainer1 am 27 Februar 2024, 06:56:41Hallo, ich muss eine Abfrage so gestalten, dass diese sooft mit je 3s verzögert erneut aufgerufen wird, bis das Ergebnis true ist.
z. B. damit: https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Anwendungsbeispiele_mit_bedingter_Wiederholung_einer_Ausf%C3%BChrung
Zitat von: Rainer1 am 27 Februar 2024, 06:56:41- ein Notify wird nur einmal ausgelöst
- ein dauerhaftes at +3s möchte ich vermeiden
Wie kann man das Problem angehen?
Im notify ein einmal auszuführendes at anlegen lassen, das nach drei Sekunden prüft, ob der Zielzustand erreicht ist und anderenfalls wieder ein at für 3 Sekunden später anlegt.
Formuliere doch erstmal die gesamte Aufgabe in einen möglichst einfachen logischen Ablauf, bevor Du versuchst, das in irgendwelchen devices (egal ob DOIF oder was anderes) umzusetzen.
Deine Strichliste vom Anfang des Threads ist übrigens nicht das, was ich damit meine.
Zitat von: Rainer1 am 27 Februar 2024, 09:11:57Zitat von: Damian am 27 Februar 2024, 07:43:00Zitat von: Rainer1 am 27 Februar 2024, 06:56:41Hallo, ich muss eine Abfrage so gestalten, dass diese sooft mit je 3s verzögert erneut aufgerufen wird, bis das Ergebnis true ist.
z. B. damit: https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Anwendungsbeispiele_mit_bedingter_Wiederholung_einer_Ausf%C3%BChrung
Versuche die Bedingung mit DOIF zu erstellen, bekomme es aber nicht hin, da es nicht funktioniert:
defmod di_LED DOIF {[ReadingsVal("Shelly1","relay0","0" eq "on")]
Die Beispiele bezogen sich auf die Funktion set_Exec, die hast du hier gar nicht benutzt. Wie die Funktion aufgebaut ist. steht in der verlinkte Wiki-Dokumentation paar Zeilen davor. Ob im DOIF oder sonst wo in fhem muss man schon genau die beschriebene Syntax befolgen. Du hast eine neue Syntax erfunden, die es so nicht gibt.
Zitat von: Rainer1 am 28 Februar 2024, 07:38:20Sorry, hatte ja auch nur die Bedingung gepostet, welche nicht funktioniert - daher habe ich den Rest der Zeile für meine Frage weggelassen...
Dann musst du den kompletten Code posten und vorher genau aufschreiben, was der Code machen soll.
Zitat von: Damian am 28 Februar 2024, 07:39:21Zitat von: Rainer1 am 28 Februar 2024, 07:38:20Sorry, hatte ja auch nur die Bedingung gepostet, welche nicht funktioniert - daher habe ich den Rest der Zeile für meine Frage weggelassen...
Dann musst du den kompletten Code posten und vorher genau aufschreiben, was der Code machen soll.
Zitat von: Rainer1 am 28 Februar 2024, 07:41:57Der Anteil hinter der [BEDINGUNG] wurde immer ausgeführt, daher scheint diese nicht korrekt zu sein.
Nachfolgender Code hinter der Bedingung soll nur dann aufgerufen werden, wenn das Relay des Shelly auf "on" wechselt...
Der Trigger beim DOIF wird ohne ReadingsVal angegeben, hier also:
DOIF {[Shelly1:"relay0:on"];.../code]
Zwei Dummy zur Simulation, das notify zur Lösung der Aufgabe:
defmod Lampe1 dummy
attr Lampe1 room Test
attr Lampe1 setList on off
defmod Lampe1Strom dummy
attr Lampe1Strom room Test
attr Lampe1Strom setList on off
defmod Lampe1_notify_1 notify Lampe1:off define Lampe1At at +00:00:03 IF ([Lampe1Strom] eq 'on')(sleep 0.1,set Lampe1 off)
attr Lampe1_notify_1 room Test
Event Protokoll der Simulation
2024-03-25 09:07:14.967 dummy Lampe1 on
2024-03-25 09:07:16.260 dummy Lampe1Strom on
2024-03-25 09:07:27.341 at Lampe1At Next: 09:07:30
2024-03-25 09:07:27.352 Global global DEFINED Lampe1At
2024-03-25 09:07:27.353 dummy Lampe1 off
2024-03-25 09:07:30.448 at Lampe1At Next: 09:07:33
2024-03-25 09:07:30.464 Global global DEFINED Lampe1At
2024-03-25 09:07:30.465 dummy Lampe1 off
2024-03-25 09:07:33.562 at Lampe1At Next: 09:07:36
2024-03-25 09:07:33.583 Global global DEFINED Lampe1At
2024-03-25 09:07:33.584 dummy Lampe1 off
2024-03-25 09:07:34.339 dummy Lampe1Strom off
Weil Du es anders machst als ich! Ich werte den Schaltbefehl vom Licht aus, Du wertest irgendein Relay aus und schaltest anschließend Dein Licht im gleichen notify aus. Das ist etwas völlig anderes!
ZitatShelly1_Hof:relay0:.off set LEDlight off; ...
So war mein Ansatz
LEDlight:off define LEDat at +00:00:03 IF ([MQTT2_shelly1pmminig3:switch_0_apower] > 2)(sleep 0.1,set LEDlight off)Bedingung ist dabei, dass LEDlight auch den notwendigen Event erzeugt! Das
set LEDlight off im "Fehlerfall" triggert auch erneut das notify, daher kommt die Wiederholung bis zum Erfolg.
Kannst Du ja machen, ist aber eine weitere Aufgabe. Falls ich Dich richtig verstehe brauchst Du dafür einfach ein zweites notify mit dieser DEF:
Shelly1_Hof:relay0:.off set LEDlight off
Das erste notify übernimmt die Kopplung der Schaltvorgänge,
Das zweite notify überwacht den Erfolg der Ausschaltung.
Falls das funktioniert kann man überlegen ob es sinnvoll ist das noch zu optimieren / kombinieren. Immer auch unter dem Aspekt, dass Du Deine eingerichtet Schaltlogik in 3 Jahren noch verstehst. ;D
mit unbegrenztem anfunken schlecht oder nicht erreichbarer devices kann man ggf auch das gesamte system lahmlegen. ;)
warum nicht den funk verbessern?