Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Boris099
Beiträge: 383
Registriert: 19. Feb 2020 20:51
Answers: 3
Wohnort: Saarbrücken

Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Beitrag von Boris099 »

PI4b, OH2.5.12

Ich habe an 2 Tasmota Geräten (Electrodragon potentialfrei) Magnetschalter installiert und frage diese in einem Rule entsprechend ab
und schalte damit einige LEDs in der Einfahrt usw.
Das Rule wird erst aktiv sobald "Nacht" aktiv wird, also wenn Dunkel. Soweit funktioniert das prima, die Magnetschalter lösen aus,
das wird vom Rule alles sauber abgearbeitet.
-> Jedoch spinnt da was und ich habe "Geisterschaltungen" d.h. auch ohne Trigger der Magnetschalter schaltet das Rule und das
ohne Unterbrechung, also wenn Timer abgelaufen wird abgeschaltet und nach ein paar Sekunden wieder an usw.
Es muß das Rule sein (und nicht die Schalter), da auch der im Rule gesetzte Timer, bei den Geisterschaltungen verwendet wird.
-> Aber ich kann weder im Openhab Log noch in der Konsole der entsprechenden Tasmotas finden, das die Items aktiviert wurden.
Die Items habe ich definiert und die fragen den entsprechenden Channel ab.
Im Log als auch in der Konsole sehe ich dann ganz sauber z.B. POWER3 "ON" und "OFF" wenn der Magnetschalter triggered.
Dummerweise jedoch nichts davon wenn die "Geisterschaltungen" laufen.

Was kann das sein?
Gibt es da noch ein weiteres Log das man checken kann?

Eines viel mir gestern Abend auf: In dem Moment als "Nacht" aktiv wurde, fingen die Geisterschaltungen an und ganz bekloppt
am Tag davor war da Nix..., habe das Rule nun deaktiviert, sonst werden die Nachbarn unruhig:-)
Ich hatte das gleiche Rule zuvor mit anderen Ewelink Magnetschaltern im Einsatz, da hatte ich in keinem Fall solche Problem.
Die Schalter nun ausgetauscht, lediglich die Items im rule geändert (sonst nichts) und nun habe ich diese Probleme.
Die Ewelink sind WLAN Batterie betrieben und die halten max. 6 Wochen...deshalb nun auf diese Electrogragon/Tasmota gewechselt.


Das Rule (Sensor_GARAGE tickt irgendwie andersrum, also wenn Tor auf => "OFF")

Code: Alles auswählen

// Globale Variablen
var Timer Lampe_Einfahrt_Timer = null
var Timer Lampe_Kandelaber_Timer = null
var Timer LED_Nachbar_Timer = null
var Timer LED_GVorne_Timer = null
var Timer LED_GWald_Timer = null

rule "Einfahrt_Licht"
when
        Item Sensor_TOR received update ON or
        Item Sensor_TUER received update ON or
        Item Sensor_GARAGE received update OFF or
        Item S_Touch90_1 received update ON or
        Item zwave_device_6c898019_node8_scene_number received update 4
then
        if(Nacht.state != OFF) {
                if(Lampe_Einfahrt_Timer !== null)
                Lampe_Einfahrt_Timer.reschedule(now.plusSeconds(240))
                if(Lampe_Einfahrt.state != ON) {
                Lampe_Einfahrt.sendCommand(ON)
                Lampe_Einfahrt_Timer = createTimer(now.plusSeconds(240), [|
                Lampe_Einfahrt.sendCommand(OFF)
                Lampe_Einfahrt_Timer = null
                ])
                }[
unten folgen nur noch weitere switches


Die 3 items für die Magnetschalter

Code: Alles auswählen

Switch Sensor_TOR {channel="mqtt:homeassistant_00F0F2:583ffe5b:00F0F2:00F0F2_5FRL_5F3#switch"}
Switch Sensor_GARAGE {channel="mqtt:homeassistant_012669:583ffe5b:012669:012669_5FRL_5F3#switch"}
Switch Sensor_TUER {channel="mqtt:homeassistant_00F0F2:583ffe5b:00F0F2:00F0F2_5FRL_5F2#switch"}
von Boris099 » 29. Apr 2022 17:36
Also ich habe es gelöst!

Die voherige "when Abfrage" war falsch, und das fiel mit den Ewelink Magnetschaltern nicht auf, da diese nicht andauernd irgendwelche
Telemetry Daten senden. Eigenartig ist trotzdem das Openhab diese Telemetry Daten hier auswertet und dann immer wieder schaltet ....

OK also ich habe

Code: Alles auswählen

received update ON
geändert zu

Code: Alles auswählen

changed from OFF to ON
und jetzt flutscht es :-)
Gehe zur vollständigen Antwort
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Beitrag von udo1toni »

Du wirst schon die gesamte Rule zeigen müssen. Gerade im Zusammenhang mit Timern gibt es - speziell mit openHAB Versionen vor 3.0 - einiges zu beachten.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Boris099
Beiträge: 383
Registriert: 19. Feb 2020 20:51
Answers: 3
Wohnort: Saarbrücken

Re: Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Beitrag von Boris099 »

Hi Udo,

hier das komplette rule, aber wie gesagt unten kommen nur noch weitere switches.
Es schalten übrigens immer alle switches nicht nur Einzelne. Und im Log als auch Konsole ist nichts zu sehen.
Mit den vorherigen Ewelink Schaltern und unverändertes rule hatte ich nie Probleme, deshalb meine Frage
ob ich noch auf andere Art und Weise tracken kann wieso das rule schaltet?

Code: Alles auswählen

// Globale Variablen
var Timer Lampe_Einfahrt_Timer = null
var Timer Lampe_Kandelaber_Timer = null
var Timer LED_Nachbar_Timer = null
var Timer LED_GVorne_Timer = null
var Timer LED_GWald_Timer = null

rule "Einfahrt_Licht"
when
        Item Sensor_TOR received update ON or
        Item Sensor_TUER received update ON or
        Item Sensor_GARAGE received update OFF or
        Item S_Touch90_1 received update ON or
        Item zwave_device_6c898019_node8_scene_number received update 4
then
        if(Nacht.state != OFF) {
                if(Lampe_Einfahrt_Timer !== null)
                Lampe_Einfahrt_Timer.reschedule(now.plusSeconds(240))
                if(Lampe_Einfahrt.state != ON) {
                Lampe_Einfahrt.sendCommand(ON)
                Lampe_Einfahrt_Timer = createTimer(now.plusSeconds(240), [|
                Lampe_Einfahrt.sendCommand(OFF)
                Lampe_Einfahrt_Timer = null
                ])
                }
                if(LED_Nachbar_Timer !== null)
                LED_Nachbar_Timer.reschedule(now.plusSeconds(240))
                if(LED_Nachbar.state != ON) {
                LED_Nachbar.sendCommand(ON)
                LED_Nachbar_Timer = createTimer(now.plusSeconds(240), [|
                LED_Nachbar.sendCommand(OFF)
                LED_Nachbar_Timer = null
                ])
                }
                if(Lampe_Kandelaber_Timer !== null)
                Lampe_Kandelaber_Timer.reschedule(now.plusSeconds(240))
                if(Lampe_Kandelaber.state != ON) {
                Lampe_Kandelaber.sendCommand(ON)
                Lampe_Kandelaber_Timer = createTimer(now.plusSeconds(240), [|
                Lampe_Kandelaber.sendCommand(OFF)
                Lampe_Kandelaber_Timer = null
                ])
                }
                if(LED_GVorne_Timer !== null)
                LED_GVorne_Timer.reschedule(now.plusSeconds(240))
                if(LED_GVorne.state != ON) {
                LED_GVorne.sendCommand(ON)
                LED_GVorne_Timer = createTimer(now.plusSeconds(240), [|
                LED_GVorne.sendCommand(OFF)
                LED_GVorne_Timer = null
                ])
                }
                if(LED_GWald_Timer !== null)
                LED_GWald_Timer.reschedule(now.plusSeconds(240))
                if(LED_GWald.state != ON) {
                LED_GWald.sendCommand(ON)
                LED_GWald_Timer = createTimer(now.plusSeconds(240), [|
                LED_GWald.sendCommand(OFF)
                LED_GWald_Timer = null
                ])
                }
        }
end
und so sieht das z.B. aus im Log wenn ein Magnetschalter schaltet

Code: Alles auswählen

2022-04-27 14:46:56.535 [vent.ItemStateChangedEvent] - mqtt_homeassistant_00F0F2_583ffe5b_00F0F2_00F0F2_5FRL_5F3_switch changed from OFF to ON

2022-04-27 14:46:56.540 [vent.ItemStateChangedEvent] - Sensor_TOR changed from OFF to ON


2022-04-27 14:48:03.094 [vent.ItemStateChangedEvent] - mqtt_homeassistant_00F0F2_583ffe5b_00F0F2_00F0F2_5FRL_5F3_switch changed from ON to OFF

2022-04-27 14:48:03.099 [vent.ItemStateChangedEvent] - Sensor_TOR changed from ON to OFF
und in der Konsole von Tasmota

Code: Alles auswählen

14:46:56.004 MQT: stat/A-Tor34/SWITCH3T = {"TRIG":"TOGGLE"}
14:46:56.013 MQT: tele/A-Tor34/STATE = {"Time":"2022-04-27T14:46:56","Uptime":"6T20:33:02","UptimeSec":592382,"Heap":24,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":8,"POWER1":"OFF","POWER2":"OFF","POWER3":"ON","Wifi":{"AP":1,"SSId":"NSA","BSSId":"70:4F:57:44:F2:B6","Channel":1,"Mode":"11n","RSSI":36,"Signal":-82,"LinkCount":1,"Downtime":"0T00:00:03"}}
14:46:56.016 MQT: stat/A-Tor34/RESULT = {"POWER3":"ON"}
14:46:56.019 MQT: stat/A-Tor34/POWER3 = ON
14:48:02.655 MQT: stat/A-Tor34/SWITCH3T = {"TRIG":"TOGGLE"}
14:48:02.665 MQT: tele/A-Tor34/STATE = {"Time":"2022-04-27T14:48:02","Uptime":"6T20:34:08","UptimeSec":592448,"Heap":24,"SleepMode":"Dynamic","Sleep":50,"LoadAvg":19,"MqttCount":8,"POWER1":"OFF","POWER2":"OFF","POWER3":"OFF","Wifi":{"AP":1,"SSId":"NSA","BSSId":"70:4F:57:44:F2:B6","Channel":1,"Mode":"11n","RSSI":34,"Signal":-83,"LinkCount":1,"Downtime":"0T00:00:03"}}
14:48:02.670 MQT: stat/A-Tor34/RESULT = {"POWER3":"OFF"}
14:48:02.675 MQT: stat/A-Tor34/POWER3 = OFF
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))

Boris099
Beiträge: 383
Registriert: 19. Feb 2020 20:51
Answers: 3
Wohnort: Saarbrücken

Re: Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Beitrag von Boris099 »

Ich bin etwas verwirrt, ob es vllcht der Switchmode der Tasmota´s ist. Ich habe da schonmal mit rumgespielt, weil der eine switch "umgekehrt" angezeigt wird. Habe letzendlich diese Anzeige nicht korrigieren können und habe deshalb nochmal auf Switchmode 0 zurückgestellt (default)
Aber muß da evtl Switchmode 2 für die betreffenden Channels gesetzt werden (im device)?

In einem Beitrag zu Magnetschaltern in Tasmota las ich im creationX forum:

Mach besser noch die Einstellungen:

switchmode2 2
switchmode3 2

in der Konsole!
Dann stimmt der Status der Magnetschalter immer. SwitchmodeX 0 ist nur eine Toggle Funktion, die auch mal außer Tritt kommen kann
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Beitrag von udo1toni »

OK, ich gehe davon aus, dass die Lampen nicht ausschließlich über die Bewegungsmelder (oder Magnetkontakte... whatever) geschaltet werden und Du deshalb so viele Timer eingebaut hast, damit Lampen, die zum Zeitpunkt des Triggers bereits eingeschaltet sind, nicht automatisch abgeschaltet werden? Ansonsten wäre dieser Ansatz etwas arg umständlich. Aber selbst dann erscheint mir der Ansatz suboptimal. Besser wäre in meinen Augen, sich den Zustand in einem Hilfsitem zu merken (alternativ über ein Array) Auch drängt sich eine Gruppe zur Lösung auf.
Items:

Code: Alles auswählen

Group gAussenlicht
Group gAussenMerker
Switch Lampe_Einfahrt     (gAussenlicht)
Switch LED_Nachbar        (gAussenlicht)
Switch Lampe_Kandelaber   (gAussenlicht)
Switch LED_GVorne         (gAussenlicht)
Switch LED_GWald          (gAussenlicht)
Switch Lampe_Einfahrt_M   (gAussenMerker)
Switch LED_Nachbar_M      (gAussenMerker)
Switch Lampe_Kandelaber_M (gAussenMerker)
Switch LED_GVorne_M       (gAussenMerker)
Switch LED_GWald_M        (gAussenMerker)
Rule:

Code: Alles auswählen

// Globale Variablen
var Timer tLichtAussen = null

rule "Einfahrt_Licht"
when
    Item Sensor_TOR received update ON or
    Item Sensor_TUER received update ON or
    Item Sensor_GARAGE received update OFF or
    Item S_Touch90_1 received update ON or
    Item zwave_device_6c898019_node8_scene_number received update 4
then
    if(Nacht.state == OFF)                                                                      // Tagsüber kein Licht (Rule abbrechen)
        return;

    if(tLichtAussen === null) {                                                                 // Kein Timer aktiv? Dann
        gAussenMerker.members.forEach[ i |                                                      // Für alle Merker
            val myState = gAussenlicht.members.filter[j|i.name.startsWith(j.name)].head.state   // Suche das zugehörige Item und lies den aktuellen Status
            i.postUpdate(myState)                                                               // schreibe den Status in den Merker
        ]
    }
    tLichtAussen?.cancel                                                                        // lösche Timer, falls vorhanden
    gAussenlicht.members.filter[ j | j.state != ON ].forEach[ i | i.sendCommand(ON)]            // Schalte alle Lampen ein, die noch aus sind

    tLichtAussen = createTimer(now.plusMinutes(4), [|                                           // Lege Timer in 4 Minuten an
        gAussenMerker.members.filter[i|i.state != ON].forEach[ j |                              // Für alle Merker, dei nicht auf ON stehen
            gAussenlicht.members.filter[ k | j.name.startsWith(k.name) ].head.sendCommand(OFF)  // Suche das zugehörige Item und sende OFF
        ]
        tLichtAussen = null                                                                     // Lösche Verweis auf Timer
    ])
end
Man könnte auch noch die Sensoren in einer Gruppe zusammenfassen (also alle, die auf ON triggern sollen), aber das ist eher marginal.

Erst mal, denke ich, kann man sehen, dass der Code wesentlich kürzer ist.
Er sieht komplexer aus, ist aber eigentlich gar nicht so schwer...
Es geht damit los, dass die Rule tagsüber gar nicht laufen muss. Statt also den Code bedingt auszuführen, wird die Rule abgebrochen, das erspart eine Ebene der Schachtelung.
Falls der Timer gerade nicht aktiv ist, merkt sich die Rule in den Merkern den aktuellen Zustand der Lichter. Dazu durchläuft es die Gruppe gAussenMerker und sucht sich für jedes Item das passende Item aus der Gruppe gAussenlicht heraus (der vordere Teil des Namens ist identisch). Der Status des gefundenen Items wird im aktuellen Item gespeichert.
Anschließend löscht die Rule einen eventuell laufenden Timer. Das hat gegenüber dem reschedule den Vorteil, dass der Timer frisch initialisiert wird.
Nun werden alle Lichter der Gruppe gAussenlicht eingeschaltet, die noch nicht eingeschaltet sind.
Zum Schluss wird der Timer angelegt und die Rule ist beendet.

Sofern keine weiteren Trigger folgen, läuft der Timer irgendwann ab und der Code kommt zur Ausführung.
Die Merker -Gruppe wird auf die Items gefiltert, welche nicht den Status ON haben. Für alle Einträge in der gefilterten Liste werden die passenden Gegenstücke herausgesucht und auf OFF gesetzt.
Zum Schluss wird der Timer deinitialisiert.

Man könnte das Ganze auch ohne Gruppen programmieren, natürlich mit entsprechend mehr Zeilen Code. Der Witz an der Sache ist aber, dass nur ein(1) Timer gebraucht wird. Damit gehst Du einem Problem aus dem Weg, nämlich, dass immer fünf Timer fast zeitgleich enden (was fast sicher zu Problemen führt).

Dein eigentliches Problem ist damit nicht unbedingt behoben.

SwitchMode:
  • 0 steht für Toggle. Bei jeder 0>1 Flanke kippt der Status des Switches. Dieser Modus ist ziemlich sicher falsch.
  • 2 steht für inverted follow. Ist der Schalter geschlossen, wird OFF gemeldet, ist der Schalter geöffnet, wird ON gemeldet.
  • 1 steht für follow. Ist der Schalter geschlossen, wird ON gemeldet, ist der Schalter offen wird OFF gemeldet.
Bei NO Kontakten (normally open) ist die 1 richtig, bei NC Kontakten (normally closed) ist die 2 richtig (dann muss der Trigger in der Rule natürlich auf ON geändert werden)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Boris099
Beiträge: 383
Registriert: 19. Feb 2020 20:51
Answers: 3
Wohnort: Saarbrücken

Re: Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Beitrag von Boris099 »

Oh Mann:-)
Das hört sich cool an, muss ich aber erst Mal verdauen, Mach ich mich morgen früh dran und gebe Feedback.
Du meinst also diese "Geisterschaltungen" können auf den multiplen Timer basieren? Ok ist denkbar...
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))

Benutzeravatar
udo1toni
Beiträge: 15249
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Beitrag von udo1toni »

Es gibt in openHAB bis einschließlich 2.5.12 für Rules 5 + 2 Threads. Das bedeutet, es können 5 + 2 Rule Codes zeitgleich ausgeführt werden. Dabei sind die fünf Threads für "gewöhnliche Rules" zuständig, während sich die zwei Threads um den Scheduler kümmern. Das heißt, es stehen zwei Threads für alle Timer und alle per Time cron gestarteten Rules (!) zur Verfügung.

Fünf Timer, die fast zwingend auf +/- 1 Millisekunde gleichzeitig ausgeführt werden, werden ziemlich sicher nicht sauber ausgeführt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Boris099
Beiträge: 383
Registriert: 19. Feb 2020 20:51
Answers: 3
Wohnort: Saarbrücken

Re: Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Beitrag von Boris099 »

Oha, das klingt plausibel! Da glaube ich schon ziemlich sicher dass es das ist. Ich melde mich
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))

Boris099
Beiträge: 383
Registriert: 19. Feb 2020 20:51
Answers: 3
Wohnort: Saarbrücken

Re: Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Beitrag von Boris099 »

Eines fällt mir aber noch ein - das rule mit den gegebenen Timer hat aber vorher mit den ewelink Magnetschaltern funktioniert ohne diese Geisterschaltungen. Da hätte ich doch eigentlich das gleiche Problem haben müssen, oder was denkst du?
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))

Boris099
Beiträge: 383
Registriert: 19. Feb 2020 20:51
Answers: 3
Wohnort: Saarbrücken

Re: Rule schaltet ohne Trigger - Wie kann ich das prüfen?

Beitrag von Boris099 »

Feedback, ich habe das rule und die items entsprechend eingepflegt und die Zeilen bzgl. Abfrage Nacht auskommentiert
damit das rule jetzt aktiv wird.

=> Zack, ohne das die Magnetschalter aktiviert wurden schaltet das Rule.
Also gehe ich davon aus, das hier Widerstände Pull-Up oder Pull-Down an die Tasmota Geräten dran müssen.
Das Klingeldraht zu den Magnetschaltern ist ca. 6m lang:-(
Ich versuche nun gerade herauszufinden ob ich nun Pull-Down oder Pull-Up benötige.
In den Geräten habe Ich GPIO gegen GND angeschlossen und wenn Magnetschalter geschlossen ist Power=OFF
10K Widerstände habe ich hier rumliegen...
Raspberry 4, Rev.1.2b, 4GB, Openhab 2.5.12 (OH3 kommt im Winter dran:-))

Antworten