FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Rainer1 am 27 Februar 2024, 06:56:41

Titel: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Rainer1 am 27 Februar 2024, 06:56:41
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?
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Damian am 27 Februar 2024, 07:43:00
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
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: betateilchen am 27 Februar 2024, 08:41:38
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.
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Rainer1 am 27 Februar 2024, 09:11:57
Zitat von: Damian am 27 Februar 2024, 07:43:00
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

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")]
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: betateilchen am 27 Februar 2024, 09:21:42
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.
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Damian am 27 Februar 2024, 11:48:01
Zitat von: Rainer1 am 27 Februar 2024, 09:11:57
Zitat von: Damian am 27 Februar 2024, 07:43:00
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



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.
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Rainer1 am 28 Februar 2024, 07:38:20
Sorry, hatte ja auch nur die [BEDINGUNG] gepostet, welche nicht funktioniert - daher habe ich den Rest der Zeile für meine Frage weggelassen...
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Damian am 28 Februar 2024, 07:39:21
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.
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Rainer1 am 28 Februar 2024, 07:41:57
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...
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Damian am 28 Februar 2024, 09:23:30
Zitat von: Damian am 28 Februar 2024, 07:39:21
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: 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]
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Rainer1 am 25 März 2024, 07:25:38
Mit DOIF bekomme ich das nicht gelöst, gibt es eine andere Variante?
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Otto123 am 25 März 2024, 09:05:11
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
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Rainer1 am 25 März 2024, 09:51:03
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...
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Otto123 am 25 März 2024, 10:11:19
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.
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Rainer1 am 25 März 2024, 10:36:35
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
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Otto123 am 25 März 2024, 10:41:08
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
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: Rainer1 am 25 März 2024, 10:56:34
ok, verstanden, werde das mit den jetzt vorhandenen "2 Versuchen" mal prüfen ...
Titel: Aw: Abfrage solange verzögert wiederholen bis Ergebnis true
Beitrag von: frank am 25 März 2024, 11:15:55
mit unbegrenztem anfunken schlecht oder nicht erreichbarer devices kann man ggf auch das gesamte system lahmlegen.  ;)

warum nicht den funk verbessern?