auf meinem rpi läuft openHAB 2.5.5 Release Build.
Ich habe eine abgehängte Decke in der 4 Shelly Dimmer und ein Shelly 2.5 switch verbaut sind. Je einen Dimmer für Spots (großes Licht Warmweiß, kleines Licht Warmweiß, großes Licht Kaltweiß, kleines Licht Kaltweiß) und der Shelly 2.5 schaltet einmal die indirekte Beleuchtung und einmal die zwei Dimmer für das jeweilige "kleine Licht". Der Shelly 2.5 war bisher so eingestellt, dass er bei einem Shortpush die indirekte Beleuchtung ein-/ausschaltet und bei einem Longpush die zwei kleinen Spots an-/ausschaltet (also Strom weg). Die Dimmer werden über einen Serientaster geschalten, jeweils Warmweiß und Kaltweiß. Mittlerweile sind aber die Shelly Dimmer für die kleinen Lichte auf detachted gestellt, d.h. sie erhalten keine Ansteuerung über die Wandtaster.
Nun mein Vorhaben:
1. und wichtigstes
Ich möchte, dass die Spots über die Wandtaster erstmal nur die "großen Spots" einschalten. Der Shelly 2.5 soll über einen Longpush die zwei jeweiligen "kleinen Spots" dazuschalten, dann auch gleich in der richtigen Dimmstärke. (Optional bei einem weiteren Longpush wenn an, wieder aus). Wenn der jeweilige KW oder WW Spot geschalten wird sollen immer zuerst nur die jeweils geschaltenen großen Spots angehen. Die kleinen sollen immer nur zusätzlich aus Unterstützung dazugeschaltet werden können.
2. optional
Wenn die großen Spots aus sind und die indirekte Beleuchtung an, soll über einen Longpush die ind. Beleuchtung gedimmt werden. Da ich nur einen Taster habe soll die Dimmung zuerst ganz runter und wenn das Signal bestehen bleibt wieder hochdimmen dann wieder runter... Der Stripe wird über hue angesteuert. Die Dimmung erfolgt mit Werten zwischen 0 - 100.
Hier meine bisherige Rule. Problem ist derzeit, dass sich die kleinen Spots immer sofort mit einschalten, finde den Fehler nicht. Den Teil mit dem Dimmen habe direkt wieder aus kommentiert, dass gab ein never endig Blinken!

Code: Alles auswählen
var Timer tSpot = null
//var int percent = 0
//var Timer fade_Timer = null
rule "Spotklein WW"
when
Channel "shelly:shelly25-relay:40f5202d5543:relay2#button" triggered LONG_PRESSED
then
if(Shellie_Dimmer_WW_Gross_RelayBrightness.state == 0 /* && Shellie_Dimmer_WW_Klein_RelayBrightness.state == 0*/ ) return;
/*
if (LEDstripe_EG_EsszimmerDH.state instanceof DecimalType) {
percent = ((LEDstripe_EG_EsszimmerDH.state as DecimalType)/5).intValue * 5 //round to 5
fade_Timer = createTimer(now.plusMillis(200)) [|
LEDstripe_EG_EsszimmerDH.sendCommand(percent)
if (percent > 1) {
percent = percent - 5
fade_Timer.reschedule(now.plusMillis(200))
}
else
percent = percent + 5
fade_Timer.reschedule(now.plusMillis(200))
]
}
*/
if(Shellie_Dimmer_WW_Gross_RelayBrightness.state != 0) {
logInfo("Spotklein", "WW Groß war an")
if (Shellie_25_Relay1Output.state !=ON) {
Shellie_25_Relay1Output.sendCommand (ON)}
tSpot = createTimer(now.plusSeconds(5), [
Shellie_Dimmer_WW_Klein_RelayBrightness.sendCommand(Shellie_Dimmer_WW_Gross_RelayBrightness.state)
tSpot = null
])
}
else
logInfo("Spotklein", "TEST2")
Shellie_Dimmer_WW_Klein_RelayBrightness.sendCommand(Shellie_Dimmer_WW_Gross_RelayBrightness.state)
end
rule "Spotklein KW"
when
Channel "shelly:shelly25-relay:40f5202d5543:relay2#button" triggered LONG_PRESSED
then
if(Shellie_Dimmer_KW_Gross_RelayBrightness.state == 0) return;
if(Shellie_Dimmer_KW_Gross_RelayBrightness.state != 0) {
logInfo("Spotklein", "KW war an")
if (Shellie_25_Relay1Output.state !=ON) {
Shellie_25_Relay1Output.sendCommand (ON)}
tSpot = createTimer(now.plusSeconds(5), [
Shellie_Dimmer_KW_Klein_RelayBrightness.sendCommand(Shellie_Dimmer_KW_Gross_RelayBrightness.state)
tSpot = null
])
}
else
logInfo("Spotklein", "TEST1")
Shellie_Dimmer_KW_Klein_RelayBrightness.sendCommand(Shellie_Dimmer_KW_Gross_RelayBrightness.state)
end
rule "spot klein ww synchron"
when
Item Shellie_Dimmer_WW_Gross_RelayBrightness changed
then
if(Shellie_Dimmer_WW_Klein_RelayON.state == ON)
logInfo("Spotklein", "WW synchron")
Shellie_Dimmer_WW_Klein_RelayBrightness.sendCommand(Shellie_Dimmer_WW_Gross_RelayBrightness.state)
end
rule "spot klein kw synchron"
when
Item Shellie_Dimmer_KW_Gross_RelayBrightness changed
then
if(Shellie_Dimmer_KW_Klein_RelayON.state == ON)
logInfo("Spotklein", "KW synchron")
Shellie_Dimmer_KW_Klein_RelayBrightness.sendCommand(Shellie_Dimmer_KW_Gross_RelayBrightness.state)
end
/*
rule "Spot Klein aus"
when
Item Shellie_Dimmer_WW_Gross_RelayON changed from ON to OFF or
Item Shellie_Dimmer_KW_Gross_RelayON changed from ON to OFF
then
if(Shellie_Dimmer_WW_Gross_RelayON == OFF && Shellie_Dimmer_KW_Gross_RelayON == OFF)
logInfo("Spotklein", "Shellie spot klein aus")
if(Shellie_25_Relay1Output.state!= OFF) Shellie_25_Relay1Output.sendCommand(OFF)
end
*/

Hier noch meine Rule für die ind. Beleuchtung, sollte aber für o.g. keine Bedeutung haben:
Code: Alles auswählen
var int iFarbtemperatur = 80
var int iHelligkeit = 75
rule "Esszimmer"
when
Channel "shelly:shelly25-relay:40f5202d5543:relay2#button" triggered SHORT_PRESSED
then
logInfo("dimmer", "Shelly wurde ausgelöst")
if(LEDstripe_EG_EsszimmerDH.state != 0) {
logInfo("dimmer", "Stripe war an")
//sendCommand(LEDstripe_EG_EsszimmerDH, 1)
LEDstripe_EG_EsszimmerDH.sendCommand (0)
logInfo("dimmer", "Stripe geht aus")
return;
} else {
sendCommand(Shellie_25_Relay2Output, ON)
logInfo("dimmer", "LED Stripe geht an")
}
if(Besuch_anwesend.state != ON) {
if(now.getMinuteOfDay < 5 * 60 +29) {iHelligkeit = 20 iFarbtemperatur = 80}
else if(now.getMinuteOfDay < 7 * 60) {iHelligkeit = 60 iFarbtemperatur = 20}
else if(now.getMinuteOfDay < 10 * 60) {iHelligkeit = 80 iFarbtemperatur = 20}
else if(now.getMinuteOfDay < 14 * 60) {iHelligkeit = 80 iFarbtemperatur = 10}
else if(now.getMinuteOfDay < 18 * 60) {iHelligkeit = 80 iFarbtemperatur = 20}
else if(now.getMinuteOfDay < 20 * 60) {iHelligkeit = 60 iFarbtemperatur = 30}
else {iHelligkeit = 60 iFarbtemperatur = 70}
}
else {iHelligkeit = 80 iFarbtemperatur = 80}
LEDstripe_EG_EsszimmerDH.sendCommand(iHelligkeit)
LEDstripe_EG_EsszimmerDF.sendCommand(iFarbtemperatur)
end
rule "Abwesend"
when
Item Handy_Gerhard changed from OPEN to CLOSED or
Item Handy_Tanja changed from OPEN to CLOSED or
Item Handy_Gabriel changed from OPEN to CLOSED or
Time cron "0 0 0 * * ?"// täglich 0 Uhr
then
if((Handy_Gerhard.state == CLOSED && Handy_Tanja.state == CLOSED && Handy_Raphael.state == CLOSED) || now.getMinuteOfDay < 5 * 60 +28) {
if(LEDstripe_EG_EsszimmerDH.state != OFF) LEDstripe_EG_EsszimmerDH.sendCommand(OFF)
if(Shellie_25_Relay2Input.state!= OFF) Shellie_25_Relay2Output.sendCommand(OFF)
}
end
Gerhard