Array in Szene Türklingel

Hallo zusammen,

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

Hi,

bau Dir zwischen Zeile 19 und 20 einen Debug für “local deviceValue1” ein.
Hast Du Zeile 19 mal ohne “tonumber” versucht ?

VG Hoggle

erst mal das machen was hoggle geschrieben hat :slight_smile:
und dann bitte das – Türklingel – in Zeile 4 löschen und zusätzlich if (deviceValue1 ~= 0) then versuchen

grüße

Hallo ihr beiden,

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?

Würde mich noch einmal über Tipps freuen.

Vielen Dank.

Gruß
Daniel

Wenn Du zwei Scripte machst, bekommst Du das Verzögerungsproblem in den Griff.

So sollte es klappen:

--[[
%% 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.

Hi Leute

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 ?

Viele Güße

Sven

Dazu kannst du, bevor du auf Rot wechselst, die die aktuellen Farbwerte in Globalen Variablen speichern und am ende wieder auslesen.

Zb:

 
---Werte auslesen und in einer GlobalenVar speichern ---
hue = fibaro:getValue(HUEid, "hue") 
brightness = fibaro:getValue(HUEid, "ui.brightness.value") 
saturation = fibaro:getValue(HUEid, "ui.saturation.value") 

fibaro:setGlobal("Hue", hue);
fibaro:setGlobal("Brightness", brightness);
fibaro:setGlobal("Saturation", saturation);

--- HUE auf Rot ---
  fibaro:call(HUEid, "changeHue", 0); -- Rot
  fibaro:call(HUEid, "changeSaturation", 255);
  fibaro:call(HUEid, "changeBrightness", 200);

--- Hier werden die Werte wieder geholt ---
get_hue = fibaro:getGlobal('Hue')
get_brightness = fibaro:getGlobal('Brightness')
get_saturation = fibaro:getGlobal('Saturation')

fibaro:call(HUEid, "changeHue", get_hue); fibaro:sleep(500);
fibaro:call(HUEid, "changeSaturation", get_brightness); fibaro:sleep(500);
fibaro:call(HUEid, "changeBrightness", get_saturation);

Hallo nevv,

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…

Kann da jemand helfen?

Gruß
Daniel

Hi,

wenn Du das deinen Szenen voranstellst, werden die zu viel getriggerten Szenen automatisch abgebrochen:

if fibaro:countScenes() > 1 then
  fibaro:abort();
end

Super, danke. Und dann stelle ich die maximal ausgeführten Instanzen auf 1, oder?

Kannst du auch bei 2 lassen.

Danke!

Hi dwissen , kannst du dein Hue Script mal Posten bitte bekomme nil Fehlercode

Danke

Hallo Sven,

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

Gruß
Daniel