Mit einem Doppeltaster und Fibaro Shutter 2 die Hue Raumbeleuchtung steuern

Hallo

Gerne möchte ich euch mein LUA Script vorstellen und natürlich eure Meinung und Verbesserungsvorschläge dazu hören.

Situation
Ein Raum welcher komplett mit HUE Leuchten ausgerüstet ist, soll mit den “normalen” Lichtschalter gesteuert werden können ohne zusätzliche Schalter. Dazu haben ich den bestehenden Lichtschalter durch einen Doppeltaster mit einem Fibaro Shutter 2 Modul dahinter vom Elektriker einbauen lassen. Die HUE Lampen sind immer am Strom, das Shutter Modul schaltet keinen Storm.

Gewünschtes Verhalten:

Linke Taste (S1)
-> soll das Licht primär ein und ausschalten
-> wenn die Taste lang gedrückt wird, soll das Licht runter dimmen

Rechte Taste (S2)
-> soll zwischen zwei (oder mehr) Lichtstimmungen durchschalten, hier “Relax” und “Work”
-> wenn die Taste lang gedrückt wird, soll das Licht hoch dimmen
-> falls kein Licht an ist, soll das Licht an geben (egal ob ich gedrückt lasse oder nur einmal klicke)


Da ich die Lichtzustände dann auch in anderen Scripts wiederverwenden möchte, habe ich diese in separate Szenen ausgelagert. So müssen diese nur an einem Ort gepflegt werden. Für die einzelen Lichtzustände habe ich simple Szenen erstellt (manueller Start), Beispiel für den Raum “Büro”: LichtBüroAn, LichtBüroAus, LichtBüroRelax, LichtBüroWork, LichtBüroPlus, LichtBüroMinus

Code “LichtBüroRelax”:

--[[
%% properties
%% events
%% globals
--]]
if (fibaro:countScenes()>1) then 
 fibaro:abort(); 
end
fibaro:call(118, "changeBrightness", 90)
fibaro:call(117, "changeBrightness", 90)
fibaro:call(119, "changeBrightness", 90)
fibaro:call(98, "changeBrightness", 90)
fibaro:call(98, "changeHue", 45500)
fibaro:call(98, "changeSaturation", 210)

Code “LichtBüroPlus”:

--[[
%% properties
%% events
%% globals
--]]
if (fibaro:countScenes()>1) then 
 fibaro:abort(); 
end
fibaro:call(118, "changeBrightness", tonumber(fibaro:getValue(118, "bri"))+30)
fibaro:call(117, "changeBrightness", tonumber(fibaro:getValue(117, "bri"))+30)
fibaro:call(119, "changeBrightness", tonumber(fibaro:getValue(119, "bri"))+30)
fibaro:call(98, "changeBrightness", tonumber(fibaro:getValue(98, "bri"))+30)

Nun die Hauptszene für den Doppeltaster:

--[[
%% properties
116 sceneActivation
%% events
%% globals
--]]

-- VARIABLEN (Trigger Device muss oben unter %% properties aufgeführt sein)
--local Scene = 17 -- ID dieser Szene
local Switch = 116 -- Schalter ID des Fibaro Shutter 2 Moduls
local LightOn = 20  -- Raumszene für Licht AN
local LightOff = 21  -- Raumszene für Licht AUS
local LightRelax = 23  -- Raumszene für Lichtstimmung "Relax"
local LightWork = 24 -- Raumszene für Lichtstimmung "Work"
local LightPlus = 25 -- Raumszene für Licht heller 
local LightMinus = 26 -- Raumszene für Licht dunkler
local HueRef = 118 -- Referenzlampe für Check ob das Licht an oder aus ist

--[[
Scene Activation IDs Roller Shutter 2
Momentary Switches (parameter 14 = 0, parameter 10 = 0,1,2)

Scene ID: S1 input	Scene ID: S2 input
12 : hold			22 : hold
13 : release		23 : release
14 : 2 x click		24 : 2 x click
16 : 1 x click		25 : 3 x click
					26 : 1 x click
--]]

-- Lösche doppelte Szene(n)
fibaro:sleep(50); 
if (fibaro:countScenes() > 1)
  then fibaro:abort();
end

-- Aktion für Drücken der entsprechenden Taste
if tonumber(fibaro:getValue(Switch, "sceneActivation")) == 16
  then goto Scene16
elseif tonumber(fibaro:getValue(Switch, "sceneActivation")) == 26
  then goto Scene26
elseif tonumber(fibaro:getValue(Switch, "sceneActivation")) == 12
  then goto Scene12
elseif tonumber(fibaro:getValue(Switch, "sceneActivation")) == 22
  then goto Scene22
end
fibaro:abort()

-- Aktion Taste S1 1xClick (Scene ID 16)
-- Ein/Aus
::Scene16::
if
  tonumber(fibaro:getValue(HueRef, "on")) == 0
  then fibaro:startScene(LightOn);  
elseif
  tonumber(fibaro:getValue(HueRef, "on")) == 1
  then fibaro:startScene(LightOff)  
end
fibaro:abort()

-- Aktion Taste S2 1xClick (Scene ID 26)
-- Wechsel zwischen Relax und Work Lichtstimmung
::Scene26::
if
  tonumber(fibaro:getValue(HueRef, "on")) == 1
  then
  if tonumber(fibaro:getValue(HueRef, "bri")) < 100
    then fibaro:startScene(LightWork)
  elseif tonumber(fibaro:getValue(HueRef, "bri")) > 100
    then fibaro:startScene(LightRelax)
  end
else fibaro:startScene(LightOn)
end
fibaro:abort()

-- Aktion Taste S1 "Hold" und "Release" (Scene ID 12 & 13)
-- Licht runter Dimmen - Falls kein Licht, Licht an
::Scene12::
if
tonumber(fibaro:getValue(HueRef, "on")) == 1
then repeat fibaro:startScene(LightMinus)
  fibaro:sleep(300)
  until(tonumber(fibaro:getValue(Switch, "sceneActivation")) == 13)
  fibaro:abort()
  else fibaro:startScene(LightOn)
  fibaro:abort()
end
  
-- Aktion Taste S2 "Hold" und "Release" (Scene ID 22 & 23)
-- Licht hoch Dimmen - Falls kein Licht, Licht an
::Scene22::
if
  tonumber(fibaro:getValue(HueRef, "on")) == 1
  then repeat fibaro:startScene(LightPlus)
    fibaro:sleep(300)
  until(tonumber(fibaro:getValue(Switch, "sceneActivation")) == 23)
  fibaro:abort()
else fibaro:startScene(LightOn)
  fibaro:abort()
end

Das Setup funktioniert soweit :slight_smile: Bevor ich mich nun an die anderen Räume mache, würde ich gerne wissen was ihr davon haltet? Kann man was optimieren?

Danke!
Gruss
azid

Hi,

habe gerade mit Deinem Script gespielt und es etwas auf meine Umgebung angepasst um es auszuprobieren
Wenn ich hoch und runter dimme, gibt es irgendwie keine Bremse, mein HC2 zuckt immer noch und will dimmen, obwohl ich nur kurz gedrückt habe.
Da wäre ein Stop bei 0 und 255 sinnvoll.
Sonst eine gute Idee, sehr hilfreich! Vllt anstatt der Extra-Szenen functions einbauen?

LG TT

Die LUA Functions checke ich (noch) nicht, muss ich mich mal einlesen, Anfänger halt :stuck_out_tongue: . Was für ein Vorteil hätte ich wenn ich Functions einsetze würde anstatt die Szenen?
Das Problem mit dem Dimmen hatte ich nicht, denke es liegt an den irgendeinem Paramter des Shutter Moduls selbst.

Aber inzwischen habe ich das Shutter Modul rausgeschmissen… Das Licht soll auch geschaltet werden können wenn die Philips HUE Bridge bzw das Heimnetzwerk mal weg ist.
Also ist jetzt ein Dimmer 2 drin mit normalen dimmbare LED Leuchten für die Hauptbeleuchtung des Raumes. Die Akzentbeleuchtung ist aber immernoch Hue welche über die Scene Activation des Dimmer 2 dazugeschaltet und gedimmt wird.

Hi,

mit Funktionen kannst du Code definieren, welcher dann außerhalb der Funktion aufgerufen werden kann. So spart man sich Code mehrmals im Skript zu verwenden.

Gruß

Ah, alles klar, danke. Habe das bis anhin mit goto-Befehlen bewältigt wenn ich einen Codeblock innerhalb einer Szene nicht mehrfach wollte. Aber jenachdem ist eine Funktion auch besser geeignet wenn der “Codefluss” nicht gestört werden soll.

Falls ich aber eine Reihe von Befehlen von verschiedenen Szenen aus starten möchte, wie Beispielsweise Lichtstimmung “Relax” (Helligkeit, Farbe, etc), ist der Schritt über ausgelagerte Szenen wohl der sinnvollste?