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 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