HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

BtBread
Beiträge: 44
Registriert: 3. Jul 2019 10:30

HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Beitrag von BtBread »

Hallo.
Ich suche nach einem Beispiel um Lampen kurzzeitig (z.B. für einen stillen Alarm) auf andere Werte zu setzen.
Also z.B. für 1 Sek einschalten und dann wieder aus. Oder, wenn sie schon an sind, für eine Sekunde auf rot schalten und dann wieder zurück.

Wie regel ich das zurück? Die Werte vorher in Variablen speichern und nach einem sleep wieder einsetzen.
Hab da jetzt einiges probiert, aber nichts gelingt.
Hat jemand ein Beispiel? Oder mal einen guten Link wo Variablen erläutert sind? Ich finde immer nur Bruchstücke und immer andere Syntax.
Dank im Voraus.

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

Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Beitrag von udo1toni »

Das ist eigentlich ganz einfach:

Code: Alles auswählen

// Globale Variablen immer zu Beginn der Datei definieren!
var alterWert
var Timer tAlarm =null

rule "Alarm"
when
    Item myAlarm changed to ON
then
    if(tAlarm === null) {                          // Rule wurde nicht kürzlich getriggert
        alterWert = myItem.state                   // Alten Wert merken
        if(myItem.state == OFF)                    // Licht war aus
            myItem.sendCommand(ON)                 // also Licht an
        else  // Licht war nicht aus
           myItem.sendCommand(New HSBType(red))    // irgendwie auf rot schalten...
       tAlarm = createTimer(now.plusSeconds(1),[|  // einen Timer starten
           myItem.sendCommand(alterWert)           // nach Ablauf des Timers auf den alten Wert zurück
           tAlarm = null                           // und Zeiger auf Timer löschen
       ])
    }
end
Da ich bisher noch nicht mit Farbbefehlen gearbeitet habe, ist der Teil sicherlich nicht korrekt ;) aber zumindest der Schalter-Teil sollte so funktionieren (also ON/OFF)
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

BtBread
Beiträge: 44
Registriert: 3. Jul 2019 10:30

Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Beitrag von BtBread »

Hallo Udo.
Vielen Dank für deine rasche Antwort.
Genauso hab ich es eigentlich auch probiert.
Aber ich bekomme folgende Fehlermeldung im Log:

2019-08-17 15:50:39.480 [INFO ] [.eclipse.smarthome.model.script.Rule] - Testschalter wurde eingeschaltet.

2019-08-17 15:50:39.489 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Test eingeschaltet': An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.StringExtensions.operator_plus(java.lang.String,java.lang.String) on instance: null

meine Regel sieht jetzt so aus:

Code: Alles auswählen

var vL_DIMMER
var vL_TOGGLE
var vL_COLOR
var vL_ALERT 


rule "Test eingeschaltet"
when
	Item vTest_Schalter changed to ON
then
	vL_DIMMER = laempchen_dimmer.state
	vL_TOGGLE = laempchen_toggle.state  
	vL_COLOR  = laempchen_color.state
	vL_ALERT  = laempchen_alert.state
 
	
	sendCommand(laempchen_toggle,ON) 
	sendCommand(laempchen_dimmer,100)
        sendCommand(laempchen_color,100)
	sendCommand(laempchen_alert,"LSELECT")
     
     Thread::sleep(5000) // warte 5 Sek
	 
	 sendCommand(laempchen_alert,vL_ALERT)
	 sendCommand(laempchen_toggle,vL_TOGGLE) 
	 sendCommand(laempchen_dimmer,vL_DIMMER) 
   	 sendCommand(laempchen_color,vL_COLOR)
end
Ich komme einfach nicht richtig in das Thema, weil die ganzen Info so verteilt sind und die Syntax immer wieder anders ist.
gibt es irgendwo eine Doku, die die Variablen in Gänze und vollständiger Tiefe erklärt.
z.B. wo ist der Unterschied einer Deklaration mit var und val ?
Das nur als Beispiel. Dann sind manchmal die Datentyp deklariert und manchmal nicht. Und überhaupt: was gibt es für Datentypen und wann brauche ich welchen.
So was vollständiges dokumentiertes gibt es nicht oder finde ich es nicht?
aber vielen Dank nochmal, dass du dir die Sache hier anschaust.

Nachtrag:
Dimmer und Color bekomme ich hin, wenn ich bei der Deklaration schon den Wert 0 setze und damit auf Int (oder eben Zahl) einstelle.

var vL_DIMMER = 0
var vL_COLOR = 0

Bei dem Toggle funktioniert das leider nicht. das ist der State ON oder OFF. Aber weder String "OFF" noch 0 bei der Deklaration werden so interpretiert.
Genauso bei dem Alert: der kann sein "NONE", "SELECT" oder "LSELECT". Meiner Ansicht nach Strings, aber das geht nicht, wenn in der Deklaration

var vL_ALERT="NONE"

schreibe.

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

Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Beitrag von udo1toni »

Benutze bitte die Methode statt der Action, das ist ein Unterschied, also Item.sendCommand(Value) statt sendCommand(String,String)

Weiterhin ist es wirklich keine gute Idee, Thread::sleep() mit Werten über 500 zu nutzen (oder innerhalb einer Rule mehrere Thread::sleep(), die zusamen über 500 ergeben)
Deshalb habe ich in der Rule auch createTimer() verwendet :) das ist nicht schwerer als Thread::sleep(), hat aber (so wie ich es umgesetzt habe) den Vorteil, dass die Rule keinesfalls den Thread Pool blockieren wird - der Code benötigt insgesamt nur wenige Millisekunden Thread-Zeit, während Dein Code mindestens 5000+ Millisekunden läuft, und nebenher auch nicht verhindert, dass der Code mehrfach gestartet wird. Das mag im vorliegenden Fall irrelevant sein, aber es ist schlechter Stil.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

BtBread
Beiträge: 44
Registriert: 3. Jul 2019 10:30

Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Beitrag von BtBread »

Hallo Udo.
Das mit dem Timer habe ich verstanden. Habe ja auch deine anderen Threads verfolgt.
ich baue meine Regeln jetzt nach und nach um.
Diese auch, sobald die läuft und ich die in eine "echte" Rule einbaue. ist ja "nur" mein Test ;-)

Dass ich die Werte nicht in die Variablen speichern kann, hat ja nichts mit dem Thread::sleep() zu tun.
Was für einen Variablentyp muss ich denn verwenden um einen State vom Typ ON oder OFF zu speichern?

Worin liegt der Unterschied/Vorteil bei Item.sendCommand(Value) gegenüber sendCommand(Item,Value)?

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

Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Beitrag von udo1toni »

Der Unterschied ist, dass die Action zwei Parameter vom Typ String erwartet, während die Methode anhand des Itemtyps entscheiden kann, wie mit dem übergebenen Parameter umzugehen ist. Solange Du Objekte übergibst, ist das nicht weiter wild, denn jedes Objekt hat eine Methode .toString, die openHAB automatisch anwendet. Wenn Du allerdings ein Primitive verwendest, wird die Action scheitern, weil keine Methode .toString zur Verfügung steht. Beispiel:

Code: Alles auswählen

rule "test"
when
    Item testItem received command
then
    val int a = 5
    myNumberItem.postUpdate(a)
    Thread::sleep(500)
    postUpdate("myNumberItem",a)
end
Das erste postUpdate gelingt, das zweite fliegt Dir um die Ohren.

Normalerweise sollte openHAB die Variable automatisch korrekt setzen. Du kannst testweise mal String als Typ verwenden.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

BtBread
Beiträge: 44
Registriert: 3. Jul 2019 10:30

Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Beitrag von BtBread »

Hallo.
Danke. Und wieder was gelernt.
Und wie ist es mit dem PostUpdate? Genau das gleiche. Auch lieber Item.postUpdate(xxx) anstatt postUpdate(Item,String) ?
(Muss gestehen, habs nicht getestet)

So sieht es jetzt aus und läuft leider immer noch nicht, weil die Variablen vL_xxx nicht zugewiesen werden können.
Nach den Log-Infos bricht die Rule mit Java Fehler ab.
im Log:

Code: Alles auswählen

2019-08-20 21:11:51.666 [INFO ] [.eclipse.smarthome.model.script.Rule] - Testschalter wurde eingeschaltet.
2019-08-20 21:11:51.671 [INFO ] [.eclipse.smarthome.model.script.Rule] - color.State:71
2019-08-20 21:11:51.675 [INFO ] [.eclipse.smarthome.model.script.Rule] - dimmer.State:73
2019-08-20 21:11:51.678 [INFO ] [.eclipse.smarthome.model.script.Rule] - toggle.State:ON
2019-08-20 21:11:51.684 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Test eingeschaltet': An error occurred during the script execution: Could not invoke method: org.eclipse.xtext.xbase.lib.StringExtensions.operator_plus(java.lang.String,java.lang.String) on instance: null
und die Rule:

Code: Alles auswählen

var vL_DIMMER 
var vL_TOGGLE 
var vL_COLOR 

var Timer tAlarm =null

rule "Test eingeschaltet"
when
	Item vTest_Schalter changed to ON
then
	 if(tAlarm === null) { 
	 	logInfo("Rule","Testschalter wurde eingeschaltet.")
	 	logInfo("Rule","color.State:" + laempchen_color.state)
	 	logInfo("Rule","dimmer.State:" + laempchen_dimmer.state)
		logInfo("Rule","toggle.State:" + laempchen_toggle.state)
	 	
	 	vL_COLOR  = laempchen_color.state
	 	vL_DIMMER = laempchen_dimmer.state
	 	vL_TOGGLE = laempchen_toggle.state  
	 	
 	 
	 	logInfo("Rule","Variable:" + vL_COLOR)
	 
	 	logInfo("Rule","Color:  " + laempchen_color.state +" und in Variable: " + vL_COLOR)
	 	logInfo("Rule","Dimmer: " + laempchen_dimmer.state + " und in Variable: "+ vL_DIMMER)
	 	logInfo("Rule","Toggle: " + laempchen_toggle.state + " und in Variable: "+ vL_TOGGLE)

	 	
	   	laempchen_color.sendCommand(100)
		laempchen_dimmer.sendCommand(100)
	 	laempchen_toggle.sendCommand(ON) 
	 	laempchen_alert.sendCommand("LSELECT")
     
     	tAlarm = createTimer(now.plusSeconds(5),[
	 		laempchen_alert.sendCommand("NONE")
 	 		laempchen_color.sendCommand(vL_COLOR)
	 		laempchen_dimmer.sendCommand(vL_DIMMER) 
	 		laempchen_toggle.sendCommand(vL_TOGGLE)
			tAlarm = null
			logInfo("Rule","Alarm vorbei")
			])
		}
end
Was ist falsch an den Variablen?
Wäre nett, wenn mir auch noch für den letzten Rest jemand hilft.
Tausend Dank.

Benutzeravatar
peter-pan
Beiträge: 2568
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Beitrag von peter-pan »

Habe dein Regel etwas modifiziert. Sollte jetzt klappen:

Code: Alles auswählen

var vL_DIMMER 
var vL_TOGGLE 
var vL_COLOR 

var Timer tAlarm =null

rule "Test eingeschaltet"
when
	Item vTest_Schalter changed to ON
then
	 	logInfo("Rule","Testschalter wurde eingeschaltet.")
	 if(tAlarm === null) { 
//	 	logInfo("Rule","Testschalter wurde eingeschaltet.")   //  diese logInfo vor if-Klausel
	 	logInfo("Rule","color.State:" + laempchen_color.state)
	 	logInfo("Rule","dimmer.State:" + laempchen_dimmer.state)
		logInfo("Rule","toggle.State:" + laempchen_toggle.state)
	 	
	 	vL_COLOR  = laempchen_color.state.toString    // ergänzt um .toString
	 	vL_DIMMER = laempchen_dimmer.state.toString   // ergänzt um .toString
	 	vL_TOGGLE = laempchen_toggle.state.toString   // ergänzt um .toString  
	 	
 	 
	 	logInfo("Rule","Variable:" + vL_COLOR)
	 
	 	logInfo("Rule","Color:  " + laempchen_color.state +" und in Variable: " + vL_COLOR)
	 	logInfo("Rule","Dimmer: " + laempchen_dimmer.state + " und in Variable: "+ vL_DIMMER)
	 	logInfo("Rule","Toggle: " + laempchen_toggle.state + " und in Variable: "+ vL_TOGGLE)

	 	
	   	laempchen_color.sendCommand(100)
		laempchen_dimmer.sendCommand(100)
	 	laempchen_toggle.sendCommand(ON) 
	 	laempchen_alert.sendCommand("LSELECT")
     
     	tAlarm = createTimer(now.plusSeconds(5),[
	 		laempchen_alert.sendCommand("NONE")
 	 		laempchen_color.sendCommand(vL_COLOR)
	 		laempchen_dimmer.sendCommand(vL_DIMMER) 
	 		laempchen_toggle.sendCommand(vL_TOGGLE)
			tAlarm = null
			logInfo("Rule","Alarm vorbei")
			])
		}
end
Die .sendCommand-Befehle konnte ich nicht testen, aber der Rest scheint zu klappen.

Log:

Code: Alles auswählen

2019-08-21 12:54:42.112 [INFO ] [.eclipse.smarthome.model.script.Rule] - Testschalter wurde eingeschaltet.
2019-08-21 12:54:42.117 [INFO ] [.eclipse.smarthome.model.script.Rule] - color.State:OFF
2019-08-21 12:54:42.122 [INFO ] [.eclipse.smarthome.model.script.Rule] - dimmer.State:OFF
2019-08-21 12:54:42.126 [INFO ] [.eclipse.smarthome.model.script.Rule] - toggle.State:OFF
2019-08-21 12:54:42.132 [INFO ] [.eclipse.smarthome.model.script.Rule] - Variable:OFF
2019-08-21 12:54:42.142 [INFO ] [.eclipse.smarthome.model.script.Rule] - Color:  OFF und in Variable: OFF
2019-08-21 12:54:42.148 [INFO ] [.eclipse.smarthome.model.script.Rule] - Dimmer: OFF und in Variable: OFF
2019-08-21 12:54:42.155 [INFO ] [.eclipse.smarthome.model.script.Rule] - Toggle: OFF und in Variable: OFF
2019-08-21 12:54:47.164 [INFO ] [.eclipse.smarthome.model.script.Rule] - Alarm vorbei
2
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

Benutzeravatar
peter-pan
Beiträge: 2568
Registriert: 28. Nov 2018 12:03
Answers: 25
Wohnort: Schwäbisch Gmünd

Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Beitrag von peter-pan »

Hab grad nochmal getestet. Evetl würde es reichen, wenn du die Variablen-Deklaration änderst:

Code: Alles auswählen

var Number vL_DIMMER 
var vL_TOGGLE 
var Number vL_COLOR 
Pi5/8GB(PiOS Lite 64-bit(bookworm)/SSD 120GB - OH4.1.2 openhabian

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

Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück

Beitrag von udo1toni »

Wenn Du die Variablen definierst und keinne Typ angibst, sucht sich openHAB den Typ aus. Nun versuchst Du aber, einfach einen State zu speichern. Du wirst wahrscheinlich nicht drumherum kommen, einen bestimmten Typ zu erzwingen. String bietet sich an, weil Du nicht mit den Zahlen rechnen willst. Wenn Du z.B. einen Dimmer allmählich aufdimmen lassen willst, brauchst Du natürlich echte Zahlen. Dann musst Du den State nach Number casten, aber Obacht! ein Item kann auch leer sein, das musst Du vorher prüfen:

Code: Alles auswählen

rule "testrule"
when
    Item myNumberItem changed
then
    logInfo("test","Die Testrule wurde getriggert! MyNumberItem: {}",myNumberItem.state)
    var Number nMyNumber           // Variable vom Typ Number definieren
    var String stext = "k"              // Variable vom Typ String definieren
    if(myNumberItem.state instanceof Number) {   // Prüfe auf Type Number
        nMyNumber = myNumberItem.state as Number // Schreibe Status als Number
        sText = ""
    }
    logInfo("test","MyNumberItem enthält {}eine gültige Zahl!",sText)
end
myNumberItem kann außer Zahlen auch noch die Werte NULL und UNDEF annehmen (das kann man mit myNumberItem.postUpdate(NULL) auch erzwingen). Deshalb ist es wichtig, immer den Typ zu prüfen.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten