Hallo, ich muss eine Abfrage so gestalten, dass diese sooft mit je 3s verzögert erneut aufgerufen wird, bis das Ergebnis true ist.
- ich möchte eine Lampe ausschalten
- der Strom dieser Lampe wird überwacht
- nach dem Ausschalten, wird eine Messzeit von 3s benötigt
- danach wird entschieden den Ausschaltbefehl nochmal zu senden wenn immer noch Strom fliesst
- das soll solange wiederholt werden, bis die Lampe tatsächlich ausgeschaltet wird
- ein Notify wird nur einmal ausgelöst
- ein dauerhaftes at +3s möchte ich vermeiden
Wie kann man das Problem angehen?
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.
Zitat 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")]
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.
Sorry, hatte ja auch nur die [BEDINGUNG] gepostet, welche nicht funktioniert - daher habe ich den Rest der Zeile für meine Frage weggelassen...
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.
Der 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...
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]
Mit DOIF bekomme ich das nicht gelöst, gibt es eine andere Variante?
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
Hallo, vielen Dank!
Ich habe es jetzt so gelöst:
Shelly1_Hof:relay0:.off set LEDlight off; define LEDat at +00:00:03 IF ([MQTT2_shelly1pmminig3:switch_0_apower] > 2)(sleep 0.1,set LEDlight off)
-> Allerdings funktioniert das ganze nur 1x ! Es kommt aber vor, dass der Funkbefehl wieder nicht ankommt und ich nochmal "off" senden muss, d.h. mir fehlt ja der Trigger, da das Relais ja bereits ausgeschaltet ist...
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.
Ich möchte gerne das LED-Licht in Verbindung mit dem Hoflicht schalten, ist eine Funk-LED ohne Rückmeldung, daher die Stromauswertung.
Hatte in der Aufzählung oben auch geschrieben:
Zitatein Notify wird nur einmal ausgelöst
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
ok, verstanden, werde das mit den jetzt vorhandenen "2 Versuchen" mal prüfen ...
mit unbegrenztem anfunken schlecht oder nicht erreichbarer devices kann man ggf auch das gesamte system lahmlegen. ;)
warum nicht den funk verbessern?