Abfrage solange verzögert wiederholen bis Ergebnis true

Begonnen von Rainer1, 27 Februar 2024, 06:56:41

Vorheriges Thema - Nächstes Thema

Rainer1

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?

Damian

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

betateilchen

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 die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Rainer1

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")]

betateilchen

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.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rainer1

Sorry, hatte ja auch nur die [BEDINGUNG] gepostet, welche nicht funktioniert - daher habe ich den Rest der Zeile für meine Frage weggelassen...

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rainer1

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...

Damian

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]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rainer1

Mit DOIF bekomme ich das nicht gelöst, gibt es eine andere Variante?

Otto123

#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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Rainer1

#12
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...

Otto123

#13
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.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Rainer1

#14
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

Otto123

#15
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Rainer1

ok, verstanden, werde das mit den jetzt vorhandenen "2 Versuchen" mal prüfen ...

frank

mit unbegrenztem anfunken schlecht oder nicht erreichbarer devices kann man ggf auch das gesamte system lahmlegen.  ;)

warum nicht den funk verbessern?
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html