ich kämpfe mich immer weiter durch das Forum und lerne dazu, komme jedoch gerade an meine Grenze.
Folgendes Herausforderung:
Wenn jemand klingelt, sollen verschiedene Lampen im Haus, abhängig vom Zustand, ob sie aus oder an sind, ein Signal geben.
Mit einer Lampe funktioniert dies auch gut. Jedoch möchte ich mehrere Lampen einbinden und möchte es elegant per array nutzen, um dort auch flexibel eine Lampe hinzufügen zu können.
Es wird mir jedoch die folgende Fehlermeldung ausgegeben:
line 20: attempt to compare number with nil
Muss die lokale Variable auch für jede Lampe eine neue Bezeichnung haben oder liegt der Fehler woanders?
Und wie wäre die Umsetzung?
--[[
%% autostart
%% properties
78 value -- Türklingel --
%% events
%% globals
--]]
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort()
end
local Lampe = {37, 279}
local Pause = 1000
for i = 1,#Lampe do
local deviceValue1 = tonumber(fibaro:getValue(Lampe[i], "value"));
if (deviceValue1 > 0) then
fibaro:call(Lampe[i], "turnOff");
fibaro:sleep(Pause)
fibaro:call(Lampe[i], "turnOn");
fibaro:sleep(Pause)
fibaro:call(Lampe[i], "turnOff");
fibaro:sleep(Pause)
fibaro:call(Lampe[i], "turnOn");
else
fibaro:call(Lampe[i], "turnOn");
fibaro:sleep(Pause)
fibaro:call(Lampe[i], "turnOff");
fibaro:sleep(Pause)
fibaro:call(Lampe[i], "turnOn");
fibaro:sleep(Pause)
fibaro:call(Lampe[i], "turnOff");
end
end
erst mal das machen was hoggle geschrieben hat
und dann bitte das – Türklingel – in Zeile 4 löschen und zusätzlich if (deviceValue1 ~= 0) then versuchen
vielen Dank für die schnellen Antworten und die super Tipps. Habe beides durchgetestet. Dabei ist mir dann aufgefallen, dass meine Hue Iris den Wert “nil” ausgibt, da sie wohl nicht über “value” abfragbar ist. Das war mir nicht bewusst, mein Fehler. Es scheint aber wohl mit dem Befehl “on” zu gehen.
Dadurch ergibt sich aber eine neue Herausforderung:
ich habe eine zweite lokale Variable local deviceValue2 = tonumber(fibaro:getValue(Lampe[i], “on”)) eingebaut und frage darüber die Hue ab. Die Schleife wird natürlich von allen Lampen durchlaufen, weshalb einmal der Wert 0/1 und dann nil ausgegeben wird. Bei der Hue dann genau umgekehrt.
Bekomme ich das elegant gelöst oder sollte ich einfach für die Hue ein zweites Script schreiben, indem ich diese separat abfrage.
Nächstes “Problem”: Die Lampen leuchten natürlich nicht gleichzeitig, sondern die zweite erst, wenn die erste die Schleife durchlaufen hat (das sind dann durch das Sleep natürlich 2 Sekunden Unterschied).
Wie bekomme ich das mit dem Array geschickt gelöst?
--[[
%% properties
78 value
%% events
%% globals
--]]
local Lampe = {37,279}
-- Scene was triggered, function
SceneTriggered = function()
lightOn();
fibaro:sleep(2000)
lightOff();
fibaro:sleep(2000)
lightOn();
fibaro:sleep(2000)
lightOff();
fibaro:sleep(2000)
end
---- ### lichtan Funktion ### ----
function lightOn(array)
for j=1,#Lampe do
status = fibaro:getValue(Lampe[j], "value")
sensorname = fibaro:getName(Lampe[j])
if status == "0" then
fibaro:call(Lampe[j], "turnOn");
fibaro:debug("Lampe: " ..sensorname .. " eingeschaltet.");
elseif status ~= "0" then
fibaro:call(Lampe[j], "turnOff");
fibaro:debug("Lampe: " ..sensorname .. " ausgeschaltet.");
end
end
end
---- ### lichtaus Funktion ### ----
function lightOff(array)
for j=1,#Lampe do
status = fibaro:getValue(Lampe[j], "value")
if status ~= "0" then
fibaro:call(Lampe[j], "turnOff");
fibaro:debug("Lampe: " ..sensorname .. " ausgeschaltet.");
elseif status == "0" then
fibaro:call(Lampe[j], "turnOn");
fibaro:debug("Lampe: " ..sensorname .. " eingeschaltet.");
end
end
end
----------------- START OF SCENE ----------------------
if tonumber(fibaro:getValue(78, "value")) ~= 0 then
fibaro:debug("DING DONG...");
SceneTriggered();
end
Die Values bei HUEs kannst du mit fibaro:getValue(devID, "ui.onOff.value") abfragen.
Ich hab mir den Code umgelegt auf einen Türkontakt funktioniert eigentlich auch nur das es mir meine RGB Strips runter dimmt … warum auch immer
und die Hue schaltet sich aus und nicht wieder ein
Was muss ich denn einbauen wenn ich die RGB Lampe auf den wert Rot einstellen will wenn der Kontakt auslöst und danach wieder zu seinem alten wert wechselt ?
super, vielen Dank. Echt spitze! Funktioniert perfekt!
Ich habe jetzt zwei Scripte erstellt, eins für normale Lampen und eins für die Hues.
Das Einzige wo ich jetzt noch drüber stolpere, ist die Number of Instances, die ich auf 2 gesetzt habe. Ich habe einen Taster für die Türklingel und sobald der zulange gedrückt wird oder mehrfach schnell hintereinander, fliegt mir die Szene um die Ohren mit “too many instances”. Die Anleitung zu diesem Thema habe ich mir schon mehrfach durchgelesen, ich bekomme es einfach nicht in die Praxis umgesetzt…
sorry, für die späte Reaktion, war die letzten Tage unterwegs…
Hier das Script, aber seltsamerweise habe ich immer noch den Fehler mit “too many instances”.
--[[
%% properties
78 value
%% events
%% globals
--]]
local Lampe = {276,279}
if (fibaro:countScenes()>1) then
fibaro:abort();
fibaro:debug("Doppelte Szene abgebrochen");
end
-- Scene was triggered, function
SceneTriggered = function()
lightOn();
fibaro:sleep(2000)
lightOff();
fibaro:sleep(2000)
lightOn();
fibaro:sleep(2000)
lightOff();
fibaro:sleep(2000)
end
---- ### lichtan Funktion ### ----
function lightOn(array)
for j=1,#Lampe do
status = fibaro:getValue(Lampe[j], "ui.onOff.value")
sensorname = fibaro:getName(Lampe[j])
if status == "0" then
fibaro:call(Lampe[j], "turnOn");
fibaro:debug("Lampe: " ..sensorname .. " eingeschaltet.");
elseif status ~= "0" then
fibaro:debug(status)
fibaro:call(Lampe[j], "turnOff");
fibaro:debug("Lampe: " ..sensorname .. " ausgeschaltet.");
end
end
end
---- ### lichtaus Funktion ### ----
function lightOff(array)
for j=1,#Lampe do
status = fibaro:getValue(Lampe[j], "value")
if status ~= "0" then
fibaro:call(Lampe[j], "turnOff");
fibaro:debug("Lampe: " ..sensorname .. " ausgeschaltet.");
elseif status == "0" then
fibaro:call(Lampe[j], "turnOn");
fibaro:debug("Lampe: " ..sensorname .. " eingeschaltet.");
end
end
end
----------------- START OF SCENE ----------------------
if tonumber(fibaro:getValue(78, "value")) ~= 0 then
fibaro:debug("DING DONG...");
SceneTriggered();
end