Wiederholen einer SET Anweisung solange, bis der Befehl ausgeführt wurde

Begonnen von sunflyer, 06 November 2020, 20:12:55

Vorheriges Thema - Nächstes Thema

sunflyer

Ich würde gerne wissen, wie ich einen SET Befehl solange wiederholen kann, bis er tatsächlich ausgeführt wurde.
Hintergrund: Ich Schalte einen Verbraucher über einen Shelly1 Aktor, der mit WiFi verbunden ist. Leider ist diese Verbindung
nicht stabil und er ist manchmal nicht erreichbar, wenn das auslösende Event ihn an oder ausschalten soll:

Es wird die Temperatur über einen Threshold abgefragt, der den Shelly1 Aktor schaltet:


define th_temperature_Sauna_DS18B20 THRESHOLD Sauna_DS18B20:temperature:0:SaunaTemp OR SaunaSchalter:state:off shelly1_E09806964B37
attr th_temperature_Sauna_DS18B20 state_cmd1_gt off
attr th_temperature_Sauna_DS18B20 state_cmd2_lt on


Ist die eingestellte Temperatur unterschritten und der SaunaSchalter eingeschaltet, so sendet der Threshold das Comande "set shelly1_E09806964B37 on"
bzw. im umgekehrten Fall "set shelly1_E09806964B37 off".
Ist dieser nun nicht erreichbar, dann läuft das Event durch und es folg keine Reaktion, auch wenn der Shelly1 ein paar Minuten später wieder erreichbar ist.

Ich habe nun zum test zwei dummy angelegt, einen Schakter (SaunaStatus) und ein virtuelles Schütz (HS_Schütz):


define HeizungsStatus dummy
attr HeizungsStatus setList state:on,off
attr HeizungsStatus webCmd on:off

define HS_Schuetz dummy
attr HS_Schuetz setList state:on,off
attr HS_Schuetz webCmd on:off[
/code]

Um nach dem Einschalten (HeizungsStatus wird on") das Schütz immer wieder einzuschalten benutze ich folgendes DOIF Element:

[code]
define doif_Schalte_SaunaHeizung DOIF ([HeizungsStatus] eq "on" and [HS_Schuetz] eq "off")(set HS_Schuetz on) DOELSE
attr doif_Schalte_SaunaHeizung repeatcmd 10


Nun sieht man im Log, dass er den Befehl "set HS_Schuetz on" immer wieder alle 10 Sekunden absendet und somit HS_Schuetz einschaltet auch wenn man
es dazwischen wieder abschaltet.


2020-11-06 20:09:07 dummy HeizungsStatus on
2020-11-06 20:09:07 dummy HS_Schuetz on
2020-11-06 20:09:07 DOIF doif_Schalte_SaunaHeizung cmd_nr: 1
2020-11-06 20:09:07 DOIF doif_Schalte_SaunaHeizung cmd: 1
2020-11-06 20:09:07 DOIF doif_Schalte_SaunaHeizung cmd_event: HeizungsStatus
2020-11-06 20:09:07 DOIF doif_Schalte_SaunaHeizung cmd_1
2020-11-06 20:09:07 DOIF doif_Schalte_SaunaHeizung wait_timer: 06.11.2020 20:09:12 cmd_1 HeizungsStatus

2020-11-06 20:09:12 DOIF doif_Schalte_SaunaHeizung wait_timer: no timer
2020-11-06 20:09:12 dummy HS_Schuetz on
2020-11-06 20:09:12 DOIF doif_Schalte_SaunaHeizung cmd_nr: 1
2020-11-06 20:09:12 DOIF doif_Schalte_SaunaHeizung cmd: 1
2020-11-06 20:09:12 DOIF doif_Schalte_SaunaHeizung cmd_event: HeizungsStatus
2020-11-06 20:09:12 DOIF doif_Schalte_SaunaHeizung cmd_1
2020-11-06 20:09:12 DOIF doif_Schalte_SaunaHeizung wait_timer: 06.11.2020 20:09:17 cmd_1 HeizungsStatus

2020-11-06 20:09:17 DOIF doif_Schalte_SaunaHeizung wait_timer: no timer
2020-11-06 20:09:17 dummy HS_Schuetz on
2020-11-06 20:09:17 DOIF doif_Schalte_SaunaHeizung cmd_nr: 1
2020-11-06 20:09:17 DOIF doif_Schalte_SaunaHeizung cmd: 1
2020-11-06 20:09:17 DOIF doif_Schalte_SaunaHeizung cmd_event: HeizungsStatus
2020-11-06 20:09:17 DOIF doif_Schalte_SaunaHeizung cmd_1
2020-11-06 20:09:17 DOIF doif_Schalte_SaunaHeizung wait_timer: 06.11.2020 20:09:22 cmd_1 HeizungsStatus

2020-11-06 20:09:20 DOIF doif_Schalte_SaunaHeizung wait_timer: no timer
2020-11-06 20:09:20 DOIF doif_Schalte_SaunaHeizung cmd_nr: 2
2020-11-06 20:09:20 DOIF doif_Schalte_SaunaHeizung cmd: 2
2020-11-06 20:09:20 DOIF doif_Schalte_SaunaHeizung cmd_event: HeizungsStatus
2020-11-06 20:09:20 DOIF doif_Schalte_SaunaHeizung cmd_2
2020-11-06 20:09:20 dummy HeizungsStatus off
2020-11-06 20:09:22 dummy HS_Schuetz off


Die Frage ist nun, wie erreiche ich es, dass er mit dem Repeat aufhört, wenn das HS_Schuetz eingeschaltet ist und nicht immer weiter versucht es
mehrfach einzuschalten? Allerdings soll er natürlich weiterhin solange den Befehl absetzen, bis das HS_Schuetz erreichbar ist. Im Dummy hier ist dies
natürlich sofort nach dem ersten Befehl der Fall, trotzdem läuft der Repeat weiter.

Könnt ihr mir hierbei weiterhelfen ?
Grüße
sunflyer

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

sunflyer

Hallo Betateilchen,
daran habe ich auch schon gedacht, nur worauf soll der Watchdog reagieren ?
Das Shelly Device sendet ja nunmal gar kein Event, wenn es kein Kommando bekommt.
Das Kommando Event versickert einfach im Log und geht dort durch die fehlende Erreichbarkeit einfach verloren.
Daher der Versuch, mit DOIF und repeat das Komando solange zu wiederholen bis es ausgeliefert wurde.

Danach läuft der repeat aber leider weiter und  hört nicht auf, das Kommando immer wieder abzusetzen.
Hier ist das Problem, oder habe ich dabei iregndetwas übersehen?

Grüße
Sunflyer

betateilchen

Zitat von: sunflyer am 06 November 2020, 20:24:46
daran habe ich auch schon gedacht, nur worauf soll der Watchdog reagieren ?

Zum Beispiel auf das "set" das an das Shelly geschickt wird. Und dann sollte das watchdog device darauf warten, ob innerhalb einer bestimmten Zeit eine Reaktion des Shelly erfolgt.

Ein häufig gemachter Denkfehler bei watchdog ist der Glaube, man könne nur auf das tatsächlich zu kontrollierende device triggern. Man kann im Gegenteil auf jeden beliebigen in FHEM auftauchenden event reagieren. Und auch ein set erzeugt einen event.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

sunflyer

Wie würde eine solches Watchdog Definition dann aussehen wenn dieser dann den einen Statechange zu "on" beim dummy oder dem Shelly1 erwarten müsste?

Und mit welchem Kommando bekomme ich es dann hin, dass das DOIF aufhört, im endlos repeat Modus weiter den Start zu versuchen nachdem das Shelly device auf "on" ging?


Damian

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

sunflyer

Danke für die Unterstützung!  ;)

Ich konnte das Problem nun mit Hilefe eines Dummy Devices und eines Watchdogs lösen.
Der Termostat schaltet nun per Threshold nicht direkt das Shelly1 Relais sondern das Dummy Device "HeizungsStatus" an und aus.
Der Watchdog wartet mit autorestart auf das Event des Dummy Devices und triggert dann im 5 Sekundentakt das
Shelly1 Relais solange, bis dieses selber ein Event on oder off sendet.

Watchdog:

define w_Control_Sauna_Schuetz watchdog HeizungsStatus 00:00:05 shelly1_E09806964B37 set shelly1_E09806964B37.* {(ReadingsVal("HeizungsStatus","state",-1))}
attr w_Control_Sauna_Schuetz autoRestart 1


Dummy:

define HeizungsStatus dummy
attr HeizungsStatus setList state:on,off
attr HeizungsStatus webCmd on:off


Threshold:

define th_temperature_Sauna_DS18B20 THRESHOLD Sauna_DS18B20:temperature:0:SaunaTemp OR SaunaSchalter:state:off HeizungsStatus


Danke an alle, die geholfen haben !