Variablennamen bei gleichzeitig ausgeführten Scripts, doppeldeutig?

Hallo zusammen,

mir ist etwas aufgefallen und ich wollte einmal fragen ob das ein bekanntest Problem ist oder evlt. sogar ein gewolltes Verhalten.

Ich lasse 2 Scripts laufen welche sich sehr ähnlich sind (eine Lichtsteuerung bei Bewegung) bei beiden werden die ID des Lichtes in der Variable “xled” abgespeichert. Wenn ich beide Variablen gleich benamse mit:


local xled = xyz

läuft das Scripts welches ich als 2. starte nicht korrekt. Es wird zwar angetriggert und ausgeführt aber das Licht bleibt aus da bei einem Debug im zweiten Script in der Variable xled die ID aus dem ersten Script steht. Die Lösung ist einfach, nur die Variablen umbenennen aber die Frage ist ob das Verhalten so gewollt ist und wenn ja warum?

Viele Grüße

Toni

Hi,

nein, das ist nicht gewollt und ich kann mir auch nicht vorstellen, dass das passiert. Habe mehrere Szenen, welche gleiche lokale Variablen nutzen und es gibt keine Probleme. Poste doch mal deinen beiden Szenen.

Gruß

Morgen,

naja bei mir laufen auch viele mit gleichen Variablen aber bei den Beiden Szene ist besonders das diese parallel laufen. Angetriggert werden Sie jeweils durch eine Blockszene. “Wenn Bewegung erkannt dann laufe los”. Hier die zwei Szenen:


--[[
%% properties
%% events
%% globals
--]]
--Ein Script welches das Wickellicht anschaltet und in einer Schleife auf
--Bewegung wartet und wenn nicht nach ca. 1 Minute ausschaltet
--
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort(); 
  fibaro:debug("Szene abgebrochen zu viele Szenen")
end
--
local led       = 164 -- ID LED-Band
local xbcounter = 1
--
--
function LICHTSPEICHERN()
  fibaro:debug("Lichteinstellungen speichern")
     --Steuervariablen setzen
      fibaro:setGlobal("g_kz_farbe", fibaro:getValue(led, "ui.hue.value"))
      fibaro:setGlobal("g_kz_helligkeit", fibaro:getValue(led, "ui.brightness.value"))
      fibaro:setGlobal("g_kz_saettigung", fibaro:getValue(led, "ui.saturation.value"))
      fibaro:setGlobal("g_kz_licht", 0)  
end
--
--
--Lichtfarbe, Sättigung sowie Helligkeit steuern
fibaro:call(led, "changeSaturation", 130)
fibaro:call(led, "changeBrightness", 127)
fibaro:call(led, "changeHue", 65535)
fibaro:call(led, "turnOn")
fibaro:setGlobal("g_kz_licht", 1) 
--
--schleife durchlaufen .. wenn wieder bewegung registriert wird wert auf 1 
--zurück gesetzt
while xbcounter <= 60 do
    fibaro:debug(xbcounter ..' Sekunden')
    fibaro:sleep(1000)
    xbcounter = xbcounter + 1
    --Bewegungsmelder prüfen wenn in der Schleife eine Bewegung auftritt wieder bei 1 anfangen
    if ((tonumber(fibaro:getValue(22, "value")) > 0) or (tonumber(fibaro:getValue(179, "value")) > 0)) then 
        fibaro:debug("Bewegung, Counter wird zurückgesetzt")
      	xbcounter = 1
    else
        fibaro:debug("Keine Bewegung")
    end
end
--Am ende der While wieder ausschalten und Lichtvariablen schreiben
fibaro:call(led, "turnOff")
LICHTSPEICHERN()
--

und hier die Andere:


--[[
%% properties
%% events
%% globals
--]]
--Ein Script welches das Badlicht anschaltet und in einer Schleife auf
--Bewegung wartet und wenn nicht nach ca. 1 Minute ausschaltet
--
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()>1) then
fibaro:abort(); 
  fibaro:debug("Szene abgebrochen zu viele Szenen")
end
--
local led     = 211 -- ID LED-Band
local xbcounter = 1
--
--
function LICHTSPEICHERN()
  fibaro:debug("Lichteinstellungen speichern")
     --Steuervariablen setzen
      fibaro:setGlobal("g_bz_farbe", fibaro:getValue(lbed, "ui.hue.value"))
      fibaro:setGlobal("g_bz_helligkeit", fibaro:getValue(lbed, "ui.brightness.value"))
      fibaro:setGlobal("g_bz_saettigung", fibaro:getValue(lbed, "ui.saturation.value"))
      fibaro:setGlobal("g_bz_licht", 0)  
end
--
--
--Lichtfarbe, Sättigung sowie Helligkeit steuern
fibaro:call(led, "changeSaturation", 180)
fibaro:call(led, "changeBrightness", 200)
fibaro:call(led, "changeHue", 43779)
fibaro:setGlobal("g_bz_licht", 1)
fibaro:call(led, "turnOn")
--
--schleife durchlaufen .. wenn wieder bewegung registriert wird wert auf 1 
--zurückgesetzt
while xbcounter <= 60 do
    fibaro:debug(xbcounter ..' Sekunden')
    fibaro:sleep(1000)
    xbcounter = xbcounter + 1
    --Bewegungsmelder prüfen wenn in der Schleife eine Bewegung auftritt wieder bei 1 anfangen
    if ((tonumber(fibaro:getValue(213, "value")) > 0) or (tonumber(fibaro:getValue(219, "value")) > 0)) then 
        fibaro:debug("Bewegung, Counter wird zurückgesetzt")
      	xbcounter = 1
    else
        fibaro:debug("Keine Bewegung")
    end
end
--Am ende der While wieder ausschalten und Lichtvariablen schreiben
fibaro:call(led, "turnOff")
LICHTSPEICHERN()
--

Ich habe in der zweiten Szene nun die Variable “led” durch “bled” und die Variable “xbcounter” durch “xbbcounter” ersetzt. Seitdem läuft es reibungslos.

Viele Grüße und einen schönen Tag

Toni

Achja mit Parallel laufen, meine ich das das passiern kann. Für sich alleine sind beide immer einwandfrei gelaufen … das Problem tritt nur auf wenn ich z.B. aus dem Kinderzimmer (türöffnen und schliessen wird von Bewegungsmelder erkannt Szene wird wieder auf 1 zurückgesetz und läuft) direkt ins Bad gehe (Tür direkt neben an, Türe öffnen triggert bewegungsmelder im Bad an). Die Badszene läuft dann auch super an die Debugs werden ausgegeben alles gut. nur das licht bleibt aus, bei einem Debug der Badszene stand in der Variable “led” die ID “164” statt der “211” … somit wurde das Licht im Kinderzimmer nochmals angeschaltet …

Das kann ich mir nicht vorstellen. (Kann es aber derzeit nicht wirklich testen) wie bereits geschrieben, habe ich mehrere Szenen, welche gleichzeitig laufen und ich konnte so ein Verhalten nie feststellen. Aber wenn es so klappt wie du beschrieben hast, dann ist es ja kein Problem.

Gruß