Wieso funktioniert mein Timer nicht?

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Wieso funktioniert mein Timer nicht?

Beitrag von Steinspiel »

Moin,

Ich habe ein Problem mit einem Timer, kann aber den Fehler nicht finden. Vielleicht sieht jemand anderes wo ich was falsch gemacht habe:

Also: wenn eine Lampe (Flur_2) eingeschaltet wird muss ich prüfen ob eine weitere Lampe (Flur_1) schon eingeschaltet ist oder nicht. Ist Flur_1 eingeschaltet, soll die Rule abbrechen ansonsten soll sie weiterlaufen. Die Prüfung muss mit 5 sec Zeitverzögerung nach einschalten von Flur_2 stattfinden, deshalb habe ich den Timer "tFlur_1_SICHERHEIT" gesetzt.
Soweit scheint die Rule zu funktionieren, Schau ich mir aber das Log an, zeigt sich das keine 5 sec zwischen den LogInfos liegen, die Abfrage bzw. gegebenenfalls der Abbruch finden unmittelbar nach einschalten von Flur_2 statt!

Habe ich eine Klammer falsch gesetzt?

der Teil meiner Rule mit dem Timer:

Code: Alles auswählen

var Timer tFlur_1_SICHERHEIT = null				// Timervariable fuer SICHERHEIT Flur_1 definieren: Gedenksekunde VOR Abfrage Flur:1 AN ?

rule "SICHERHEIT Flur_2 Licht_AUS"

when
        Item Flur2_Power changed to ON                                                                                  // Wenn Flur_2 AN-geschaltet wird
                                                                                                                                                    
then

        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde EIN-geschaltet ---")                              // LogInfo    
        
        tFlur_1_SICHERHEIT?.cancel                                                                                      // Gedenksekunde zunächst eventuell laufende Timer entfernen
        logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_1 Gedenksekunde fuer 5 sec gesetzt ---")                 // Gedenksekunde LogInfo 
        tFlur_1_SICHERHEIT = createTimer(now.plusSeconds(5), [|                                                         // Gedenksekunde Timer auf 5 sec anlegen
        tFlur_1_SICHERHEIT = null                                                                                       // Gedenksekunde Timer wieder auf NULL setzen      

                ]
                )

                if(Flur1_Power.state == ON) {                                                                                    // Abfrage ob Flur1 auch an ist, wenn ja -> Abbruch
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Abbruch -> Flur_1 ist ebenfalls eingeschaltet ---")              // LogInfo 
                return;
                }
Auszug aus dem Log

Code: Alles auswählen

2020-05-20 09:44:01.214 [INFO ] [e.model.script.PROD_SPEZ_klein_rules] - --- SICHERHEIT--Flur_2 wurde EIN-geschaltet ---
2020-05-20 09:44:01.216 [INFO ] [.model.script.PROD_SPEZ_klein_rules_] - --- SICHERHEIT--Flur_1 Gedenksekunde fuer 5 sec gesetzt ---
2020-05-20 09:44:01.224 [INFO ] [e.model.script.PROD_SPEZ_klein_rules] - --- SICHERHEIT--Abbruch -> Flur_1 ist ebenfalls eingeschaltet ---	
Danke...
bis dann, Steinspiel

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Wieso funktioniert mein Timer nicht?

Beitrag von bastler »

du hast die abfrage ob flur1 on ist nicht in die eckigen klammern genommen. darum wird nach fünf sekunden nur der timer wieder auf null gesetzt. wenn die abfrage auch erst nach fünf sekunden kommen soll dann glaub ich musst du es so machen:

Code: Alles auswählen

var Timer tFlur_1_SICHERHEIT = null				// Timervariable fuer SICHERHEIT Flur_1 definieren: Gedenksekunde VOR Abfrage Flur:1 AN ?

rule "SICHERHEIT Flur_2 Licht_AUS"

when
        Item Flur2_Power changed to ON                                                                                  // Wenn Flur_2 AN-geschaltet wird
then
        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde EIN-geschaltet ---")                              // LogInfo    
        
        tFlur_1_SICHERHEIT?.cancel                                                                                      // Gedenksekunde zunächst eventuell laufende Timer entfernen
        logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_1 Gedenksekunde fuer 5 sec gesetzt ---")                 // Gedenksekunde LogInfo 
        tFlur_1_SICHERHEIT = createTimer(now.plusSeconds(5), [|                                                         // Gedenksekunde Timer auf 5 sec anlegen
            tFlur_1_SICHERHEIT = null                                                                                   // Gedenksekunde Timer wieder auf NULL setzen      
            if (Flur1_Power.state == ON) {                                                                              // Abfrage ob Flur1 auch an ist, wenn ja -> Abbruch
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Abbruch -> Flur_1 ist ebenfalls eingeschaltet ---")    // LogInfo 
            }
        ])

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: Wieso funktioniert mein Timer nicht?

Beitrag von Steinspiel »

bastler hat geschrieben: 20. Mai 2020 10:39 [...]
du hast die abfrage ob flur1 on ist nicht in die eckigen klammern genommen. darum wird nach fünf sekunden nur der timer wieder auf null gesetzt.
Das hatte ich vergessen zu erwähnen: so wie Du es vorgeschlagen hast habe ich es schon probiert. Die 5 sec werden dann laut Log auch eingehalten, nur wenn der Abbruch erfolgt weil Flur_1 schon angeschaltet ist, dann bricht die Rule nicht ab sondern wird trotzdem fortgesetzt. Ich poste mal die ganze Rule, so wie Du sie jetzt vorgeschlagen hast, dann kann man vielleicht besser sehen was ich meinte.

Code: Alles auswählen

var Timer tFlur_1_SICHERHEIT = null                                                     // Timervariable fuer SICHERHEIT Flur_1 definieren: Gedenksekunde VOR Abfrage Flur:1 AN ?
var Timer tFlur_2_SICHERHEIT = null                                                     // Timervariable fuer SICHERHEIT Flur_2 definieren: 40 sec Wartezeit für Flur_2

rule "SICHERHEIT Flur_2 Licht_AUS"

when
        Item Flur2_Power changed to ON                                                                                  // Wenn Flur_2 AN-geschaltet wird
                                                                                                                                                    
then

        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde EIN-geschaltet ---")                              // LogInfo    
        
        tFlur_1_SICHERHEIT?.cancel                                                                                      // Gedenksekunde zunächst eventuell laufende Timer entfernen
        logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_1 Gedenksekunde fuer 5 sec gesetzt ---")                 // Gedenksekunde LogInfo 
        tFlur_1_SICHERHEIT = createTimer(now.plusSeconds(5), [|                                                         // Gedenksekunde Timer auf 5 sec anlegen
        tFlur_1_SICHERHEIT = null                                                                                       // Gedenksekunde Timer wieder auf NULL setzen      

                if(Flur1_Power.state == ON) {                                                                           // Abfrage ob Flur1 auch an ist, wenn ja -> Abbruch
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Abbruch -> Flur_1 ist ebenfalls eingeschaltet ---")    // LogInfo 
                return;
                }

                ]
                )

                tFlur_2_SICHERHEIT?.cancel                                                                              // zunächst eventuell laufende Timer entfernen
                tFlur_2_SICHERHEIT = createTimer(now.plusSeconds(35), [|                                                // Timer auf 35 sec anlegen
                logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_2 Timer wird auf 35 sec gesetzt ---")            // LogInfo 
                tFlur_2_SICHERHEIT = null                                                                               // Timer wieder auf NULL setzen                            
                
                        if(Flur2_Power.state == ON) {                                                                   // wenn Flur_2 nach 42 sec noch AN-geschaltet
                        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 ist nach 40 sec noch AN ---")           // LogInfo 
                        Flur2_Power.sendCommand(OFF)                                                                    // Flur_2 AUS-schalten
                        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde nach 40 sec AUS-geschaltet ---")  // LogInfo 
                        }

                                if(Flur2_Power.state == OFF) {                                                                                  // wenn Flur_2 schon AUS-geschaltet ist
                                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 war nach 40 sec bereits AUS-geschaltet ---")            // LogInfo 
                                }
                                ]
                                )
        
end
bis dann, Steinspiel

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Wieso funktioniert mein Timer nicht?

Beitrag von bastler »

ich bin nicht sicher ob ich das richtig verstehe was du machen willst :)

soll der 35 sekunden timer auch abgebrochen werden wenn nach 5 sekunden flur1 on ist? dann müsstest du oben statt dem "return" ein "tFlur_2_SICHERHEIT?.cancel" und darunter noch "tFlur_2_SICHERHEIT = null" schreiben. das return an dieser stelle bringt dir nichts weil ja der rest der funktion (weil außerhalb der eckigen klammer) eh sofort ausgeführt wurde und nicht erst nach 5 sekunden.

Code: Alles auswählen

var Timer tFlur_1_SICHERHEIT = null                                                     // Timervariable fuer SICHERHEIT Flur_1 definieren: Gedenksekunde VOR Abfrage Flur:1 AN ?
var Timer tFlur_2_SICHERHEIT = null                                                     // Timervariable fuer SICHERHEIT Flur_2 definieren: 40 sec Wartezeit für Flur_2

rule "SICHERHEIT Flur_2 Licht_AUS"

when
        Item Flur2_Power changed to ON                                                                                  // Wenn Flur_2 AN-geschaltet wird
                                                                                                                                                    
then

        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde EIN-geschaltet ---")                              // LogInfo    
        
        tFlur_1_SICHERHEIT?.cancel                                                                                      // Gedenksekunde zunächst eventuell laufende Timer entfernen
        logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_1 Gedenksekunde fuer 5 sec gesetzt ---")                 // Gedenksekunde LogInfo 
        tFlur_1_SICHERHEIT = createTimer(now.plusSeconds(5), [|                                                         // Gedenksekunde Timer auf 5 sec anlegen
            tFlur_1_SICHERHEIT = null                                                                                   // Gedenksekunde Timer wieder auf NULL setzen      

            if(Flur1_Power.state == ON) {                                                                               // Abfrage ob Flur1 auch an ist, wenn ja -> Abbruch
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Abbruch -> Flur_1 ist ebenfalls eingeschaltet ---")    // LogInfo 
                tFlur_2_SICHERHEIT?.cancel                                                                              // zunächst eventuell laufende Timer entfernen
                tFlur_2_SICHERHEIT = null                                                                               // Timer wieder auf NULL setzen                            
            }

        ])

        tFlur_2_SICHERHEIT?.cancel                                                                                      // zunächst eventuell laufende Timer entfernen
        tFlur_2_SICHERHEIT = createTimer(now.plusSeconds(35), [|                                                        // Timer auf 35 sec anlegen
            logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_2 Timer wird auf 35 sec gesetzt ---")                // LogInfo 
            tFlur_2_SICHERHEIT = null                                                                                   // Timer wieder auf NULL setzen                            
            
            if(Flur2_Power.state == ON) {                                                                               // wenn Flur_2 nach 42 sec noch AN-geschaltet
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 ist nach 40 sec noch AN ---")                   // LogInfo 
                Flur2_Power.sendCommand(OFF)                                                                            // Flur_2 AUS-schalten
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde nach 40 sec AUS-geschaltet ---")          // LogInfo 
            }

            if(Flur2_Power.state == OFF) {                                                                              // wenn Flur_2 schon AUS-geschaltet ist
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 war nach 40 sec bereits AUS-geschaltet ---")    // LogInfo 
            }
        ])
        
end

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: Wieso funktioniert mein Timer nicht?

Beitrag von Steinspiel »

Mein Plan ist folgender:

Flur_2 wird EIN-geschaltet
Timer "tFlur_1_SICHERHEIT" - 5 sec warten, nach Ablauf
prüfen ob Flur_1 AN ist, wenn
JA -> Rule abbrechen = Fertig!

NEIN ->
Timer "Timer tFlur_2_SICHERHEIT" - 35 sec warten, nach Ablauf
Flur_2 AUS-schalten

Das mit dem 35 sec Timer, das Schalten usw funktioniert auch mit der Rule aus meiner ersten gepostetten Version, nur eben die 5 sec Wartezeit nicht.
bis dann, Steinspiel

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Wieso funktioniert mein Timer nicht?

Beitrag von bastler »

hm, hast du mal mein letztes beispiel probiert? ich habs hier mit meinen aktoren nachgestellt und ich würde meinen das funktioniert so wie du es brauchst. es ist halt so dass der 35 sekunden timer zwar gleichzeitig mit dem 5 sekunden timer startet, dann aber abgebrochen (und damit nicht ausgeführt) wird wenn flur1 an ist. das einzig verwirrende ist dein log-eintrag für die 35 sekunden, der gehört höher weil an der stelle wo du loggst sind die 35 sekunden schon vorbei:

Code: Alles auswählen

var Timer tFlur_1_SICHERHEIT = null                                                     // Timervariable fuer SICHERHEIT Flur_1 definieren: Gedenksekunde VOR Abfrage Flur:1 AN ?
var Timer tFlur_2_SICHERHEIT = null                                                     // Timervariable fuer SICHERHEIT Flur_2 definieren: 40 sec Wartezeit für Flur_2

rule "SICHERHEIT Flur_2 Licht_AUS"

when
        Item Flur2_Power changed to ON                                                                                  // Wenn Flur_2 AN-geschaltet wird
                                                                                                                                                    
then

        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde EIN-geschaltet ---")                              // LogInfo    
        
        tFlur_1_SICHERHEIT?.cancel                                                                                      // Gedenksekunde zunächst eventuell laufende Timer entfernen
        logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_1 Gedenksekunde fuer 5 sec gesetzt ---")                 // Gedenksekunde LogInfo 
        tFlur_1_SICHERHEIT = createTimer(now.plusSeconds(5), [|                                                         // Gedenksekunde Timer auf 5 sec anlegen
            tFlur_1_SICHERHEIT = null                                                                                   // Gedenksekunde Timer wieder auf NULL setzen      

            if(Flur1_Power.state == ON) {                                                                               // Abfrage ob Flur1 auch an ist, wenn ja -> Abbruch
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Abbruch -> Flur_1 ist ebenfalls eingeschaltet ---")    // LogInfo 
                tFlur_2_SICHERHEIT?.cancel                                                                              // zunächst eventuell laufende Timer entfernen
                tFlur_2_SICHERHEIT = null                                                                               // Timer wieder auf NULL setzen                            
            }

        ])

        logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_2 Timer wird auf 35 sec gesetzt ---")                // LogInfo 
        tFlur_2_SICHERHEIT?.cancel                                                                                      // zunächst eventuell laufende Timer entfernen
        tFlur_2_SICHERHEIT = createTimer(now.plusSeconds(35), [|                                                        // Timer auf 35 sec anlegen
            tFlur_2_SICHERHEIT = null                                                                                   // Timer wieder auf NULL setzen                            
            
            if(Flur2_Power.state == ON) {                                                                               // wenn Flur_2 nach 42 sec noch AN-geschaltet
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 ist nach 40 sec noch AN ---")                   // LogInfo 
                Flur2_Power.sendCommand(OFF)                                                                            // Flur_2 AUS-schalten
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde nach 40 sec AUS-geschaltet ---")          // LogInfo 
            }

            if(Flur2_Power.state == OFF) {                                                                              // wenn Flur_2 schon AUS-geschaltet ist
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 war nach 40 sec bereits AUS-geschaltet ---")    // LogInfo 
            }
        ])
        
end
.. man könnte alternativ probieren ob man den zweiten timer in den ersten schachtelt, aber ich finde das keine "schöne" lösung.

Tokamak
Beiträge: 183
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

Re: Wieso funktioniert mein Timer nicht?

Beitrag von Tokamak »

Die Lösung ist, nach 5 Sekunden den zweiten Timer zu starten (das ganze Logging lasse ich mal weg, dass verwirrt nur):

Code: Alles auswählen

var Timer tFlur_1_SICHERHEIT = null
var Timer tFlur_2_SICHERHEIT = null

rule "SICHERHEIT Flur_2 Licht_AUS"
when
        Item Flur2_Power changed to ON                                                                                                                                                 
then
	tFlur_1_SICHERHEIT?.cancel()
	tFlur_1_SICHERHEIT=null
	tFlur_2_SICHERHEIT?.cancel()
	tFlur_2_SICHERHEIT=null
	
	tFlur_1_SICHERHEIT=createTimer(now().plusSeconds(5),[|
		if (Flur1_Power.state==OFF) {
			tFlur_2_SICHERHEIT=createTimer(now().plusSeconds(35), [|
				if (Flur2_Power.state==ON) Flur2_Power.sendCommand(OFF)
				tFlur_2_SICHERHEIT=null
			])
		}
		tFlur_1_SICHERHEIT=null
	])
end
Eine weitere Möglichkeit ist, einen Timer zu verwenden, z.B.

Code: Alles auswählen

var Timer tFlur_SICHERHEIT = null
var Boolean bReschedule
  
rule "SICHERHEIT Flur_2 Licht_AUS"
when
        Item Flur2_Power changed to ON                                                                                                                                                 
then
	tFlur_SICHERHEIT?.cancel()
	bReschedule=false
	
	tFlur_SICHERHEIT=createTimer(now().plusSeconds(5),[|
		if (!bReschedule) {
			if (Flur1_Power.state==OFF) {
				tFlur_SICHERHEIT.reschedule(now().plusSeconds(35))
				bReschedule=true
				return;
			}
		}
		else {
			if (Flur2_Power.state==ON) Flur2_Power.sendCommand(OFF)
		}
		tFlur_SICHERHEIT=null
	])
end

Sollten die Timer nicht gecancelt werden, wenn währenddessen Flur2 wieder ausgeschaltet wird?
Proxmox mit OH 4.2 und HABApp 24 im LXC-Container

bastler
Beiträge: 121
Registriert: 7. Jan 2020 19:36
Answers: 2

Re: Wieso funktioniert mein Timer nicht?

Beitrag von bastler »

ja genau tokamak, da hab ich auch gerade rumprobiert, das ist die verschachtelte version die ich nicht so schön finde, aber wenn es besser gefällt:

Code: Alles auswählen

var Timer tFlur_1_SICHERHEIT = null                                                     // Timervariable fuer SICHERHEIT Flur_1 definieren: Gedenksekunde VOR Abfrage Flur:1 AN ?
var Timer tFlur_2_SICHERHEIT = null                                                     // Timervariable fuer SICHERHEIT Flur_2 definieren: 40 sec Wartezeit für Flur_2

rule "SICHERHEIT Flur_2 Licht_AUS"

when
        Item Flur2_Power changed to ON                                                                                          // Wenn Flur_2 AN-geschaltet wird
then

        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde EIN-geschaltet ---")                                      // LogInfo

        tFlur_1_SICHERHEIT?.cancel                                                                                              // Gedenksekunde zunächst eventuell laufende Timer entfernen
        tFlur_2_SICHERHEIT?.cancel                                                                                              // zunächst eventuell laufende Timer entfernen
        logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_1 Gedenksekunde fuer 5 sec gesetzt ---")                         // Gedenksekunde LogInfo
        tFlur_1_SICHERHEIT = createTimer(now.plusSeconds(5), [|                                                                 // Gedenksekunde Timer auf 5 sec anlegen
            tFlur_1_SICHERHEIT = null                                                                                           // Gedenksekunde Timer wieder auf NULL setzen

            if(Flur1_Power.state == ON) {                                                                                       // Abfrage ob Flur1 auch an ist, wenn ja -> Abbruch
                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Abbruch -> Flur_1 ist ebenfalls eingeschaltet ---")            // LogInfo
            }
            else {
                logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_2 Timer wird auf 35 sec gesetzt ---")                    // LogInfo
                tFlur_2_SICHERHEIT = createTimer(now.plusSeconds(35), [|                                                        // Timer auf 35 sec anlegen
                    tFlur_2_SICHERHEIT = null                                                                                   // Timer wieder auf NULL setzen

                    if(Flur2_Power.state == ON) {                                                                               // wenn Flur_2 nach 40 sec noch AN-geschaltet
                        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 ist nach 40 sec noch AN ---")                   // LogInfo
                        Flur2_Power.sendCommand(OFF)                                                                            // Flur_2 AUS-schalten
                        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde nach 40 sec AUS-geschaltet ---")          // LogInfo
                    }

                    if(Flur2_Power.state == OFF) {                                                                              // wenn Flur_2 schon AUS-geschaltet ist
                        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 war nach 40 sec bereits AUS-geschaltet ---")    // LogInfo
                    }
                ])
            }
        ])
end

Tokamak
Beiträge: 183
Registriert: 20. Aug 2019 08:37
Answers: 4
Wohnort: Aachen

Re: Wieso funktioniert mein Timer nicht?

Beitrag von Tokamak »

bastler hat geschrieben: 20. Mai 2020 13:00 ja genau tokamak, da hab ich auch gerade rumprobiert, das ist die verschachtelte version die ich nicht so schön finde, aber wenn es besser gefällt:
Sicher Geschmackssache. In meinen Augen ise es besser lesbar, weil sofort ersichtlich wird, unter welchen Bedingungen was geschieht.

Diese Threads sollen auch helfen, verschiedene Möglichkeiten zur Auswahl zu haben, zum Lernen und zum Finden des Stils, der einem am besten zusagt.
Der Code muss für den Entwickler auch nach Jahren noch verständlich sein. Daher sollte man die Code-Schnipsel aus dem Forum nicht nur unreflektiert kopieren, sondern es als Vorlage nehmen, um seinen Code selbst zu schreiben.
Proxmox mit OH 4.2 und HABApp 24 im LXC-Container

Benutzeravatar
Steinspiel
Beiträge: 396
Registriert: 28. Dez 2019 08:49
Answers: 2

Re: Wieso funktioniert mein Timer nicht?

Beitrag von Steinspiel »

Moin,

Erst mal Sorry das ich mich erst jetzt wieder melde, musste heute Nachmittag überraschend los...

Und dann Danke für eure Hilfe! Die "aufgeräumte Lösung" von @Tokamak gefällt mir am besten. Zum besseren Verständniss für mich habe ich die noch mit LogInfos und Kommentaren versehen und wie man an meinem Log sieht, funktioniert es auch!

Eine (kosmetische) Frag bleibt für mich: an welcher Stelle müsste ich das LogInfo setzen "Abbruch -> Flur_1 ist AN" für genau diesen Fall? Muss dafür noch ein "if (Flur1_Power.state==ON)" eingefügt werden?

Code: Alles auswählen

var Timer tFlur_1_SICHERHEIT = null                                                     // Timervariable fuer SICHERHEIT Flur_1 definieren: Gedenksekunde VOR Abfrage Flur:1 AN ?
var Timer tFlur_2_SICHERHEIT = null                                                     // Timervariable fuer SICHERHEIT Flur_2 definieren: 35 sec Wartezeit für Flur_2

rule "SICHERHEIT Flur_2 Licht_AUS"

when
        Item Flur2_Power changed to ON                                                                                                  // Wenn Flur_2 AN-geschaltet wird
                                                                                                                                                    
then

        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde EIN-geschaltet ---")                                              // LogInfo    

        tFlur_1_SICHERHEIT?.cancel()                                                                                                    // zunächst  laufende Timer entfernen
	tFlur_1_SICHERHEIT=null                                                                                                         // zunächst  laufende Timer NULLen        
	tFlur_2_SICHERHEIT?.cancel()                                                                                                    // zunächst  laufende Timer entfernen
	tFlur_2_SICHERHEIT=null                                                                                                         // zunächst  laufende Timer NULLen 
        
        logInfo("PROD_SPEZ_klein_rules_","--- SICHERHEIT--Flur_1 Gedenksekunde fuer 5 sec gesetzt ---")                                 // Gedenksekunde LogInfo
	tFlur_1_SICHERHEIT=createTimer(now().plusSeconds(5),[|                                                                          // Timer auf 5 sec anlegen

		if (Flur1_Power.state==OFF) {                                                                                           // wenn Flur_1 AUS
                        logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_1 ist AUS-geschaltet Timer auf 35 sec ---")               // LogInfo

			tFlur_2_SICHERHEIT=createTimer(now().plusSeconds(35), [|                                                        // Timer auf 35 sec anlegen

				if (Flur2_Power.state==ON) Flur2_Power.sendCommand(OFF)                                                 // wenn Flur_2 AN -> dann AUS
                                logInfo("PROD_SPEZ_klein_rules","--- SICHERHEIT--Flur_2 wurde nach 35 sec AUS-geschaltet ---")          // LogInfo

				tFlur_2_SICHERHEIT=null                                                                                 // zunächst  laufende Timer NULLen 
			])
		}
		tFlur_1_SICHERHEIT=null                                                                                                 // zunächst  laufende Timer NULLen 
	])


        
        
end
mein Log

Code: Alles auswählen

2020-05-20 19:49:27.476 [ome.event.ItemCommandEvent] - Item 'Flur2_Power' received command ON
2020-05-20 19:49:27.494 [nt.ItemStatePredictedEvent] - Flur2_Power predicted to become ON
2020-05-20 19:49:27.524 [vent.ItemStateChangedEvent] - Flur2_Power changed from OFF to ON
2020-05-20 19:49:27.542 [vent.ItemStateChangedEvent] - Flur2_Brightness changed from 0 to 10
2020-05-20 19:49:27.874 [INFO ] [e.model.script.PROD_SPEZ_klein_rules] - --- SICHERHEIT--Flur_2 wurde EIN-geschaltet ---
2020-05-20 19:49:27.876 [INFO ] [.model.script.PROD_SPEZ_klein_rules_] - --- SICHERHEIT--Flur_1 Gedenksekunde fuer 5 sec gesetzt ---
2020-05-20 19:49:32.882 [INFO ] [e.model.script.PROD_SPEZ_klein_rules] - --- SICHERHEIT--Flur_1 ist AUS-geschaltet Timer auf 35 sec ---
2020-05-20 19:50:07.893 [INFO ] [e.model.script.PROD_SPEZ_klein_rules] - --- SICHERHEIT--Flur_2 wurde nach 35 sec AUS-geschaltet ---
2020-05-20 19:50:07.907 [ome.event.ItemCommandEvent] - Item 'Flur2_Power' received command OFF
2020-05-20 19:50:07.923 [nt.ItemStatePredictedEvent] - Flur2_Power predicted to become OFF
2020-05-20 19:50:07.946 [GroupItemStateChangedEvent] - Gr_flur changed from ON to OFF through Flur2_Power
2020-05-20 19:50:07.948 [vent.ItemStateChangedEvent] - Flur2_Power changed from ON to OFF
2020-05-20 19:50:07.964 [vent.ItemStateChangedEvent] - Flur2_Brightness changed from 10 to 0
bis dann, Steinspiel

Antworten