HUE Lampen kurzzeitig auf andere Werte setzen und zurück
-
- Beiträge: 44
- Registriert: 3. Jul 2019 10:30
HUE Lampen kurzzeitig auf andere Werte setzen und zurück
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.
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.
- udo1toni
- Beiträge: 13951
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück
Das ist eigentlich ganz einfach:
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)
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
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet
-
- Beiträge: 44
- Registriert: 3. Jul 2019 10:30
Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück
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:
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.
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
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.
- udo1toni
- Beiträge: 13951
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück
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.
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
-
- Beiträge: 44
- Registriert: 3. Jul 2019 10:30
Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück
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)?
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)?
- udo1toni
- Beiträge: 13951
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück
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:
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.
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
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
-
- Beiträge: 44
- Registriert: 3. Jul 2019 10:30
Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück
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:
und die Rule:
Was ist falsch an den Variablen?
Wäre nett, wenn mir auch noch für den letzten Rest jemand hilft.
Tausend Dank.
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
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
Wäre nett, wenn mir auch noch für den letzten Rest jemand hilft.
Tausend Dank.
- peter-pan
- Beiträge: 2568
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück
Habe dein Regel etwas modifiziert. Sollte jetzt klappen:
Die .sendCommand-Befehle konnte ich nicht testen, aber der Rest scheint zu klappen.
Log:
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
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
- peter-pan
- Beiträge: 2568
- Registriert: 28. Nov 2018 12:03
- Wohnort: Schwäbisch Gmünd
Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück
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
- udo1toni
- Beiträge: 13951
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: HUE Lampen kurzzeitig auf andere Werte setzen und zurück
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:
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.
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
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet