Innocent hat geschrieben: ↑17. Aug 2024 08:34
Variante 1 würde ich mal versuchen wollen. Kannst du mir da unter die Arme greifen?
Ja, sicher.
Innocent hat geschrieben: ↑17. Aug 2024 08:34
Kommen heim, Brunnen an. Konnte aber per App ausschalten. Da erste mal.
Klebt da das Relais im Shelly?
Ich glaube nicht, dass der Shelly den echten Schaltzustand weitermeldet, sondern lediglich den Schaltzustand, den der Controller weitergibt. Es gibt also keinen Hilfskontakt am Relais, welcher aktiv überwacht wird, damit der Controller den mechanischen Zustand des Relais erkennen kann.
Dass die Steuerung über openHAB ausfällt, deutet darauf hin, dass das Gerät instabil läuft - warum auch immer. Du könntest schauen, ob es eine neue Firmware für das Gerät gibt. Eventuell befindet sich das Gerät nicht in einem guten Empfangsbereich für das WLAN? gibt halt viele Fehlerquellen...
Möglichkeit für Variante 1:
Code: Alles auswählen
var Timer tCheck = null // Zeiger für Timer
var OnOffType cCommand // zwischengespeicherter empfangener Befehl
rule "Check status"
when
Item Pumpe received command // Item soll geschaltet werden
then
tPumpe?.cancel // falls Timer läuft, abbrechen
cCommand = receivedCommand as OnOffType // aktuellen Befehl setzen
tPumpe = createTimer(now.plusSeconds(5), [| // Timer starten und nach 5 Sekunden ausführen
if(Pumpe.state != cCommand) { // Falls Soll von Ist abweicht
Pumpe.sendCommand(cCommand) // Befehl senden
tPumpe.reschedule(now.plusSeconds(5)) // und Timer erneut in 5 Sekunden ausführen
} else // ansonsten
tPumpe = null // timer löschen
])
end
Die globalen Variablen müssen im Rules-File vor der ersten Rule definiert werden.
Empfängt das Item Pumpe einen Befehl, so wird die Rule gestartet. Läuft zu diesem Zeitpunkt ein Timer tPumpe, so wird dieser abgebrochen. Das Fragezeichen vor dem .cancel bewirkt, dass der BEfehl nur ausgeführt wird, wenn es tatsächlich einen Timer gibt.
Anschließend wird der Timer neu erzeugt. Dabei wird zuvor der empfangene Befehl in einer globalen Variablen gesichert. Ich bin mir nicht sicher, ob dieser Schritt notwendig ist, bin aber gerade zu faul, das auszuprobieren

Läuft der Timer ab, so prüft der Code, ob der Schaltzustand dem Befehl entspricht. Ist das nicht der Fall, so wird der Befehl erneut gesendet und der Timer erneut geplant.
Stimmt der Schaltzustand mit dem Befehl überein, so wird der Timer gelöscht.
Der Timer muss so weit in der Zukunft liegen, dass der tatsächliche Schaltzustand sicher angezeigt wird, hier habe ich mal 5 Sekunden gewählt. Sollte das nicht reichen, musst Du die Zahl erhöhen.
Der Timer wird dann so lange immer wieder den Befehl senden, bis der Schaltzustand passt.
Ein wichtiger Punkt: das Item sollte in den Metadaten die Option autoupdate="false" gesetzt bekommen, denn sonst setzt openHAB von sich aus den Status auf den gesendeten Befehl. Wir wollen aber auf jeden Fall die echte Rückmeldung vom Shelly auswerten.
So sieht das dann im Log aus:
Code: Alles auswählen
2024-08-17 18:57:38.821 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command ON
2024-08-17 18:57:43.824 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command ON
2024-08-17 18:57:48.827 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command ON
2024-08-17 18:57:53.830 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command ON
2024-08-17 18:57:58.832 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command ON
2024-08-17 18:58:03.833 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command ON
2024-08-17 18:58:08.835 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command ON
2024-08-17 18:58:13.837 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command ON
2024-08-17 18:58:18.840 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command ON
2024-08-17 18:58:23.587 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Pumpe' changed from NULL to ON
2024-08-17 18:58:38.110 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command OFF
2024-08-17 18:58:43.111 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command OFF
2024-08-17 18:58:48.112 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command OFF
2024-08-17 18:58:53.114 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command OFF
2024-08-17 18:58:58.116 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command OFF
2024-08-17 18:59:03.118 [INFO ] [openhab.event.ItemCommandEvent ] - Item 'Pumpe' received command OFF
2024-08-17 18:59:03.365 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Pumpe' changed from ON to OFF
Ich habe hier das Item manuell über die Karaf Konsole auf den passenden Status gesetzt, ist ja ein Testsystem ohne echte Hardware...