Licht bei Bewegung aber nur eines geht an

Ich möchte das 2 Lampen bei Bewegung angehen. Es geht aber nur die “local switch = 836 – ID des Relay Switches” an. Die “local switch = 785 – ID des Relay Switches” bleibt dunkel.

--[[ 
%% properties
748 value
%% globals 
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 114 -- ID dieser Szene
local motion = 748 -- ID des Bewegungssensors
local switch = 785 -- ID des Relay Switches
local switch = 836 -- ID des Relay Switches
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort(); 
end
-- SCHALTE LICHT EIN & AUS
if (tonumber(fibaro:getValue(motion, "value")) > 0 ) and (tonumber(fibaro:getValue(switch, "value"))) < 1 then
fibaro:call(switch, "turnOn");
fibaro:debug("Schalte Licht ein");
end
-- Verzögerung in Sekunden nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
if (tonumber(fibaro:getValue(switch, "value"))) > 0 then
local starttimer = 15;
local timer = (starttimer); 
fibaro:debug("Starte Timer");
repeat
fibaro:sleep(1000); 
-- Schalte Licht aus, wenn Schalter manuell betätigt wird und warte 10 Sekunden, um ein 
-- versehentliches (erneutes) Aktivieren der Szene zu verhindern
if (tonumber(fibaro:getValue(switch, "value"))) < 1 then
timer=1; 
fibaro:call(switch, "turnOff"); 
fibaro:sleep(10000); 
break 
end
timer=timer-1; 
-- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if (tonumber(fibaro:getValue(motion, "value"))) > 0 then
timer=starttimer; 
fibaro:debug("Resete Time, Bewegung erkannt bzw. Motionsensor sendet noch nicht (vgl. Parameter 6)");
end
until (timer<1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(switch, "turnOff");
fibaro:debug("Timer abgelaufen/Schalte Licht aus");
fibaro:killScenes(scene); 
end

Hi,

du schaltest auch nur ein Modul. Eine Variable darf in einem Skript nicht 2x vergeben werden, die wird dann ersetzt.

Hier musst du mit Arrays programmieren… Beispiele dafür gibt es hier genug, schau dir mal das Rauchalarm-Skript an.

Gruß

Vielen dank für die Info.

Ich verwende das Rauchalarm-Skript von Dir, nur finde ich da keinen Anhaltspunkt zu meinem Problem.

--[[
%% properties
136 value
779 value
140 value
576 value
180 value
170 value
192 value
174 value
%% globals
--]]
local sireneID = 77 -- ID der Sirene
local handyID = 646 -- ID des Handys
local handyID2 = 632 -- ID des Handys

local trigger = fibaro:getSourceTrigger()
local smokeID = tonumber(trigger['deviceID'])
local smoke = tonumber(fibaro:getValue(smokeID, "value"))

if (smoke == 1) then
  	local room = fibaro:getRoomNameByDeviceID(smokeID)
  	fibaro:debug('Rauch im Raum: ' .. room .. ' erkannt.')
      fibaro:call(sireneID, 'turnOn')
  	fibaro:call(handyID, 'sendPush', 'ACHTUNG! Rauch im Raum: ' .. room .. ' erkannt!', 'smoke')
  else
  	fibaro:debug('Kein Rauch erkannt. Fehlalarm');
        end

Ich habe es nun mal so wie hier (https://www.siio.de/board/thema/deviceids-als-array/) beschrieben probiert aber da kommt auch ein Fehler.

local switch = {836, 785} – ID des Relay Switches

[DEBUG] 20:26:36: line 111: attempt to concatenate local ‘deviceId’ (a table value)

Hi,

du musst die Lampen dann mit einer for-schleife einschalten. Ich meinte das neue Rauchmelder-Skript, da gibt es eine solche for-Schleife :wink:

https://www.siio.de/sicherheitalarm/rauchalarm_hotfix/

Gruß

Vielen Dank. Egal was ich mache, es klappt nicht. Gibt es evtl. noch einen Tipp. Danke

Das:

local switch = {836, 785} -- ID des Relay Switches

for j=1, 10 do  --max 10 Leuchten, ansonsten erhöhen
  if switch[j] ~= nil then
    fibaro:call(switch[j], "turnOn");
    fibaro:debug("Schalte "..switch[j] .." ein");
  end
 end

funktioniert nicht?

Vielen Dank für die Hife. Die Lampen gehen nun bei Bewegung an aber nicht mehr aus.


[DEBUG] 17:27:46: Schalte 836 ein
[DEBUG] 17:27:46: Schalte 785 ein
[DEBUG] 17:27:46: line 111: attempt to concatenate local 'deviceId' (a table value)

Das ganze nun auch fürs ausschalten einfügen :wink:

for j=1, 10 do  --max 10 Leuchten, ansonsten erhöhen
  if switch[j] ~= nil then
    fibaro:call(switch[j], "turnOff");
    fibaro:debug("Schalte "..switch[j] .." aus");
  end
 end

Die Variable nur einmal befüllen. (Ganz am Anfang wo sie mal war)

Hi Oliver,

das ist jetzt nicht ganz so elegant, aber mach es doch so wie in deinem Beispiel vom 8.10.

local handyID = 646 – ID des Handys
local handyID2 = 632 – ID des Handys


local switch = 785 – ID des Relay Switches
local switch = 836 – ID des Relay Switches

hiermit weist du der Variablen “switch” erst den Wert 785 zu, dann überschreibst du ihn mit dem Wert 836 - also wird auch nur 836 geschaltet.
Benne den 2. Switch z.b. switch2 und schalte dann switch und switch2.

Wenn du jetzt 10 Switche hättest wäre ein array schon angebrachter, aber so…

Viel erfolg damit

Vielen Dank, aber nun wird wieder nur eine Lampe geschalten:

--[[ 
%% properties
748 value
%% globals 
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 114 -- ID dieser Szene
local motion = 748 -- ID des Bewegungssensors
local switch1 = 785 -- ID des Relay Switches
local switch = 836 -- ID des Relay Switches
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort(); 
end
-- SCHALTE LICHT EIN & AUS
if (tonumber(fibaro:getValue(motion, "value")) > 0 ) and (tonumber(fibaro:getValue(switch, "value"))) < 1 then
fibaro:call(switch, "turnOn");
fibaro:debug("Schalte Licht ein");
end
-- Verzögerung in Sekunden nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
if (tonumber(fibaro:getValue(switch, "value"))) > 0 then
local starttimer = 15;
local timer = (starttimer); 
fibaro:debug("Starte Timer");
repeat
fibaro:sleep(1000); 
-- Schalte Licht aus, wenn Schalter manuell betätigt wird und warte 10 Sekunden, um ein 
-- versehentliches (erneutes) Aktivieren der Szene zu verhindern
if (tonumber(fibaro:getValue(switch, "value"))) < 1 then
timer=1; 
fibaro:call(switch, "turnOff"); 
fibaro:sleep(10000); 
break 
end
timer=timer-1; 
-- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if (tonumber(fibaro:getValue(motion, "value"))) > 0 then
timer=starttimer; 
fibaro:debug("Resete Time, Bewegung erkannt bzw. Motionsensor sendet noch nicht (vgl. Parameter 6)");
end
until (timer<1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(switch, "turnOff");
fibaro:debug("Timer abgelaufen/Schalte Licht aus");
fibaro:killScenes(scene); 
end

Wieder das alte Skript genommen?

Zeile 9 löschen!
Zeile 10 durch:
local switch = {836, 785} – ID des Relay Switches
ersetzen.

17 & 18 durch:

for j=1, 10 do  --max 10 Leuchten, ansonsten erhöhen
  if switch[j] ~= nil then
    fibaro:call(switch[j], "turnOn");
    fibaro:debug("Schalte "..switch[j] .." ein");
  end
 end

ersetzen.

31 durch:



for j=1, 10 do  --max 10 Leuchten, ansonsten erhöhen
  if switch[j] ~= nil then
    fibaro:call(switch[j], "turnOff");
    fibaro:debug("Schalte "..switch[j] .." aus");
  end
 end

ersetzen
43 & 44 durch:



for j=1, 10 do  --max 10 Leuchten, ansonsten erhöhen
  if switch[j] ~= nil then
    fibaro:call(switch[j], "turnOff");
    fibaro:debug("Schalte "..switch[j] .." aus");
  end
 end

ersetzen

Dann müsste es passen.

OK nun geht es.

--[[ 
%% properties
748 value
%% globals 
--]]
-- VARIABLEN (Bewegungsmelder muss oben unter %% properties aufgeführt sein)
local scene = 114 -- ID dieser Szene
local motion = 748 -- ID des Bewegungssensors
local switch1 = 785 -- ID des Relay Switches
local switch = 836 -- ID des Relay Switches
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort(); 
end
-- SCHALTE LICHT EIN & AUS
if (tonumber(fibaro:getValue(motion, "value")) > 0 ) and (tonumber(fibaro:getValue(switch, "value"))) < 1 then
fibaro:call(switch1, "turnOn");
fibaro:call(switch, "turnOn");
fibaro:debug("Schalte Licht ein");
end
-- Verzögerung in Sekunden nach der letzten erkannten Bewegung, bevor das Licht ausgeschaltet wird
if (tonumber(fibaro:getValue(switch, "value"))) > 0 then
local starttimer = 15;
local timer = (starttimer); 
fibaro:debug("Starte Timer");
repeat
fibaro:sleep(1000); 
-- Schalte Licht aus, wenn Schalter manuell betätigt wird und warte 10 Sekunden, um ein 
-- versehentliches (erneutes) Aktivieren der Szene zu verhindern
if (tonumber(fibaro:getValue(switch, "value"))) < 1 then
timer=1; 
fibaro:call(switch1, "turnOff"); 
fibaro:call(switch, "turnOff"); 
fibaro:sleep(10000); 
break 
end
timer=timer-1; 
-- Timer zurücksetzen, wenn neue Bewegung erkannt wird innherhalb der Verzögerungszeit
if (tonumber(fibaro:getValue(motion, "value"))) > 0 then
timer=starttimer; 
fibaro:debug("Resete Time, Bewegung erkannt bzw. Motionsensor sendet noch nicht (vgl. Parameter 6)");
end
until (timer<1)
-- Schalte Licht aus, wenn Timer vollständig abgelaufen ist
fibaro:call(switch1, "turnOff");
fibaro:call(switch, "turnOff");
fibaro:debug("Timer abgelaufen/Schalte Licht aus");
fibaro:killScenes(scene); 
end

Vielen Dank!!!

Ganz Übersehen dass du die Lösung von gerald umgesetzt hast.
Hat mich ein wenig verwirrt !!!