Seite 3 von 4

Re: OH3 Beleuchtung rule

Verfasst: 17. Jan 2021 23:02
von ThomasW
Hey
das von dir beschriebene Verhalten ist genau so zu erwarten.

erst erstellst du einen Timer der nach einer Zeit das licht ausschalten soll, wenn du das Licht dann über einen Schalter einschaltest wird das garnicht von deiner Rule bemerkt da der Schalter nicht als Triger gesetzt ist. Daher führt der Timer seine Funktion aus.

du müsstest jetzt noch ergänzen das beim drücken des Schalters der Timer abgebrochen wird.

Timer sind über die UI leider nicht global daher kannst du später da nicht drauf zugreifen

Re: OH3 Beleuchtung rule

Verfasst: 18. Jan 2021 03:00
von SIDE22
OK danke also muss ich den Schalter demnach mit in die rule bauen so das der Timer abgebrochen wird.

Nur habe ich bei der aktuellen rule das Problem das der Timer so wie die rule aktuell ist garnicht abgebrochen wird ..

Die rule wird ja ausgelöst wenn ein Melder auf ON wechselt
Dann soll der Timer ja abgebrochen werden und ein neuer angelegt werden nur klappt dies leider nicht ganz .. das Licht geht immer aus und nach paar Sekunden wieder an in OH2 war dies nicht so
Ist der Befehl für den Abbruch des Zimmers in OH3 anders ?
Hab schon paar Mal gelesen das viele das
In meinem Beispiel mit

Code: Alles auswählen

tTreppe = null
Machen wird der Timer damit den wieder zurück gesetzt ?


LG
Florian

Re: OH3 Beleuchtung rule

Verfasst: 18. Jan 2021 10:57
von udo1toni
Nein, ein Timer wird durch (z.B.) tTreppe.cancel abgebrochen. Ein tTreppe = null entfernt lediglich den Zeiger auf den Timer. Das Problem sind die globalen Variablen, die natürlich nicht innerhalb der Rule definiert sein dürfen.

Im englischen Forum konnte ich bisher nichts dazu finden (außer eine Aussage (aus OH2-Zeiten) dass es keine globalen Variablen gibt, was dann ja bedeutet, dass man Timer nicht mehr canceln kann...

Re: OH3 Beleuchtung rule

Verfasst: 18. Jan 2021 12:10
von ThomasW
SIDE22 hat geschrieben: 18. Jan 2021 03:00 OK danke also muss ich den Schalter demnach mit in die rule bauen so das der Timer abgebrochen wird.
genau du must dem mit einbauen

Code: Alles auswählen

wenn schalter gedrückt dann timer.cancel
das funktioniert aber nicht über die UI da die timer hier nicht global angelegt werden und du somit in einem zweiten Aufruf der rule, was durch den Schalter ja passieren soll, nicht mehr auf den timer zugreifen kannst.

Das funktioniert bei mir nur wenn ich das über eine Datei mit der rule mache.

Re: OH3 Beleuchtung rule

Verfasst: 18. Jan 2021 13:06
von SIDE22
also das timer.cancel geht bei mir einfach nicht egal ob über ui oder als datei
wäre die richtige schreibweise den

Code: Alles auswählen

tTreppe?.cancel
oder

Code: Alles auswählen

tTreppe.cancel 
habe immer auch in OH2 die obere genommen.

also man kann bei den timer ja eine variable anlegen mit dem

Code: Alles auswählen

var Timer tTreppe = null
allerdings geht es auch wenn man beim anlegen des timers einfach nur schreibt zb.

Code: Alles auswählen

createTimer(now.plusSeconds(210)) [|
]

nur kann man den timer so ja nicht abbrechen vorher weil das system ja nicht weis wo es definiert ist.
also wird es dann wohl aktuell ein fehler in openhab sein das der timer nicht abgebrochen wird ?
udo1toni hat geschrieben: 18. Jan 2021 10:57 Nein, ein Timer wird durch (z.B.) tTreppe.cancel abgebrochen. Ein tTreppe = null entfernt lediglich den Zeiger auf den Timer. Das Problem sind die globalen Variablen, die natürlich nicht innerhalb der Rule definiert sein dürfen.
die variablen müssen ja immer an erster stelle stehen war OH2 ja schon so daher hab ich es jetzt so auch wieder

LG
Florian

Re: OH3 Beleuchtung rule

Verfasst: 18. Jan 2021 15:08
von ThomasW
SIDE22 hat geschrieben: 18. Jan 2021 13:06 also das timer.cancel geht bei mir einfach nicht egal ob über ui oder als datei
wäre die richtige schreibweise den

Code: Alles auswählen

tTreppe?.cancel
oder

Code: Alles auswählen

tTreppe.cancel 
habe immer auch in OH2 die obere genommen.
gehen beide soweit ich weis

Jetzt versuch mal bitte folgendes in einer datei nicht über die UI da kannst du leider nicht mit deinen timern arbeiten
das wäre jetzt so meine idee

Code: Alles auswählen


var Timer tGarten = null
var Timer tTreppe = null

rule "Licht"

when

    // hier deine Bedingungen einfügen Melder und auch Schalter (diese sollten dann auch mit Garten_ oder Treppe_ anfangen)
    
then

val licht = triggeringItemName.split("_").get(0)                       			// "Garten" oder "Treppe"
val Licht = gLichter.members.filter[i|i.name.contains(licht)].head     		// gLichtGarten oder gLichtTreppe
if(Licht.state != 100) {                                               				// Licht nicht in Dauerbetrieb
  if(licht != "Garten") {                                              					// falls nicht Garten
    if(gHelligkeit.state < 60) {                                       				// falls dunkel
      gLichtTreppe.sendCommand(25)                                     			// entsprechendes Licht auf 25%
      tTreppe?.cancel                                                  				// Timer abbrechen
      tTreppe = createTimer(now.plusSeconds(20),[|                     		// Timer anlegen
        gLichtTreppe.sendCommand(0)                                   	 		// Licht aus
      ])
    }else{													//wird ausgeführt wenn Licht.state=100 
    tTreppe?.cancel											//timer abbrechen
    }
  } else if(licht == "Garten") {                                       				// falls Garten
    if(gHelligkeitOUT.state < 110) {                                   				// falls dunkel
      gLichtGarten.sendCommand(95)                                     			// entsprechendes Licht auf 95%
      tGarten?.cancel                                                  				// Timer abbrechen
      tGarten = createTimer(now.plusSeconds(60),[|                     		// Timer anlegen
        gLichtGarten.sendCommand(0)                                    			// Licht aus
      ])
    }
  }
}
end

ich hoffe das bringt dein gewünschtes ergebniss

Re: OH3 Beleuchtung rule

Verfasst: 18. Jan 2021 17:43
von udo1toni
Der Unterschied zwischen tTreppe?.cancel und tTreppe.cancel ist schnell erklärt:

tTreppe.cancel bricht den laufenden Timer ab, dessen Zeiger in tTreppe gespeichert ist. Existiert dieser Timer aus irgendeinem Grund nicht, so kommt es zu eine NullPointer Exception.

tTreppe?.cancel brichtden Timer nur an ab, wenn er auch existiert. Man könnte als Äqui9valent auch

Code: Alles auswählen

if(tTreppe !== null) tTreppe.cancel
Wobei das ja strenggenommen noch nicht ausreicht.

Unterm Strich ist die Variante mit dem Fragezeichen die bessere...

Re: OH3 Beleuchtung rule

Verfasst: 20. Jan 2021 07:59
von SIDE22
So Moin.
Danke Udo für die Erklärung :)
Allerdings hab ich gestern Mal getestet und gesehen das andere rule wo Timer cancel mit drin ist dieser nicht abgebrochen wird
Die Variante von Thomas hab ich getestet und es ist das selbe der Timer wird nicht abgebrochen ..

LG
Florian

Re: OH3 Beleuchtung rule

Verfasst: 20. Jan 2021 17:29
von udo1toni
Ja, das funktioniert in OH3 so nicht mehr. Die Variable muss global definiert sein.

Wenn man die Rule komplett als Rule laufen lässt (also inklusive Trigger in einer .rules Datei speichert) sollte man den Timer auch abbrechen können (korrekte Implementation mal vorausgesetzt)


Gesendet von iPad mit Tapatalk

Re: OH3 Beleuchtung rule

Verfasst: 20. Jan 2021 20:31
von ThomasW
udo1toni hat geschrieben: 20. Jan 2021 17:29 Wenn man die Rule komplett als Rule laufen lässt (also inklusive Trigger in einer .rules Datei speichert) sollte man den Timer auch abbrechen können (korrekte Implementation mal vorausgesetzt)
So sollte es sein.
Manchmal liegt der Fehler im Detail.

Code: Alles auswählen

var Timer tGarten = null
var Timer tTreppe = null

rule "Licht"

when

    // hier deine Bedingungen einfügen Melder und auch Schalter (diese sollten dann auch mit Garten_ oder Treppe_ anfangen)
    
then

val licht = triggeringItemName.split("_").get(0)                       			// "Garten" oder "Treppe"
val Licht = gLichter.members.filter[i|i.name.contains(licht)].head     		    // gLichtGarten oder gLichtTreppe
if(Licht.state != 100) {                                               			// Licht nicht in Dauerbetrieb
  if(licht != "Garten") {                                              			// falls nicht Garten
     if(gHelligkeit.state < 60) {                                       		// falls dunkel
        gLichtTreppe.sendCommand(25)                                     		// entsprechendes Licht auf 25%
        tTreppe?.cancel                                                  		// Timer abbrechen
        tTreppe = createTimer(now.plusSeconds(20),[|                     		// Timer anlegen
            gLichtTreppe.sendCommand(0)                                   	 	// Licht aus
        ])
     }
   }  else if(licht == "Garten") {                                       		// falls Garten
       if(gHelligkeitOUT.state < 110) {                                   		// falls dunkel
          gLichtGarten.sendCommand(95)                                     		// entsprechendes Licht auf 95%
          tGarten?.cancel                                                  		// Timer abbrechen
          tGarten = createTimer(now.plusSeconds(60),[|                     		// Timer anlegen
             gLichtGarten.sendCommand(0)                                    	// Licht aus
            ] )
        }
    }
}
else{													                        //wird ausgeführt wenn Licht.state=100 
    tTreppe?.cancel										                        //beide timer abbrechen
    tGarten?.cancel
    logInfo("Licht", "Beide Timer abgebrochen")
}
end
Habe es jetzt an die richtige stelle geschrieben hoffe ich. Habe einen Logeitrag mit eingefügt bitte überprüfe einmal ob dieser ins Log geschrieben wird wenn ja sollten die Timer abgebrochen werden.