Variablensteuerung - Änderungen

Hallo Ihr Lieben,
Ich habe seit einiger Zeit ein Anwesenheits Skript in Verwendung. Ich steuere dieses Skript durch das Setzen der Variablen über diverse Schalter.
Manchmal stelle ich fest, dass es nicht funktioniert, wenn der Wert schon gesetzt ist und der selbe Wert nochmal aufgerufen wird.

Praxisbeispiel:
“Bedroom” schaltet alle Lichter im Haus aus. Ich habe “bedroom” bereits gesetzt und danach werden wieder Lichter eingeschaltet.
Ich drücke NOCHMAL den Taster der “Bedroom” setzt und nichts passiert.
Grundsätzlich klar, da ja die Variable sich nicht mehr ändert, weil sie schon gesetzt ist.

Meine Idee wäre nun beim Tastendruck zuerst eine Zwischenvariable wie z.B. “leer” zu setzen, und nach einer Pause erst die tatsächliche Variable.
Damit würde der Inhalt der Variable PresentState JEDENFALLS geändert.

Gibt es dafür eventuell eine elegantere Lösung ??

Hier eine vereinfachte Darstellung meines Skriptes:

--[[
%% properties
%% events
%% globals
PresentState
--]]
if (fibaro:countScenes()>3) then  fibaro:abort() end -- lösche doppelte Szenen
Debug=function (color,message) fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")) end

local gPresentState = fibaro:getGlobal("PresentState")

if gPresentState == "Away" then
--Befehl einfügen
  Debug("green",(os.date("%d.%m.%Y - PresentState:  "..gPresentState.." ")))
elseif gPresentState == "Home" then
--Befehl einfügen
  Debug("green",(os.date("%d.%m.%Y - PresentState:  "..gPresentState.." ")))
elseif gPresentState == "Night" then
--Befehl einfügen
  Debug("green",(os.date("%d.%m.%Y - PresentState:  "..gPresentState.." ")))
elseif gPresentState == "Bedroom" then
--Befehl einfügen
  Debug("green",(os.date("%d.%m.%Y - PresentState:  "..gPresentState.." ")))
else
  Debug("red",(os.date("%d.%m.%Y - Present: "..gPresentState.." ")))
  fibaro:call(2, "sendEmail", "nicht definierter PresentState!", "PresentState geändert in: "..gPresentState.." ")
end

https://marketplace.fibaro.com/items/house-status

ist ein VD mit auch Present State usw.

Danke Sven für den Tipp, Hab mir das VD mal installiert.
Es macht im Prinzip nix anderes als meine Taster, nur dass man dafür das Smartphone braucht :wink:

Im VD ist übrigens keine Lösung für meine Frage drinnen, weil es ja dafür ausgelegt ist die Variablen zu ändern und nicht darauf zu reagieren, zumindest soweit ich das richtig rauslesen konnte …

Die Frage ist wie kann ich das oben gezeigte Skript antriggern auch wenn die Trigger Variable schon auf den Wert gesetzt ist?

Am besten ist beim setzen von Bedroom zu prüfen ob die Variable bereits auf Bedroom ist.
Falls ja setze sie z.b. auf BEDROOM. In deiner Szene dann Anfrage auf Bedroom oder BEDROOM.
Das sollte dann verlässlich immer auslösen wenn die Variable geschrieben wird.

Danke @mdietlinger!
Ist zwar mehr Code als das “blinde” setzen eine Zwischenvariable, aber wesentlich eleganter :wink:
Werde das gleich mal ausprogrammieren…

Hab mal den Vorschlag von @mdietinger umgesetzt, danke für den Tipp!
Hier teile ich gerne ein paar Codeschnipsel mit euch :wink:
Bei den Tastern habe ich nun folgenden Code (nur als Beispiel):

local gPresentState = fibaro:getGlobal("PresentState")
  if not (gPresentState == "Sleep") then
    fibaro:setGlobal("PresentState", "Sleep")
  else fibaro:setGlobal("PresentState", "SLEEP")

Mein Present State Code sieht (auszugsweise) so aus:

--[[
%% globals
PresentState
--]]
if (fibaro:countScenes()>3) then  fibaro:abort() end -- lösche zu viele Szenen
Debug=function (color,message) fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span")) end --Farbe im Debug

local gPresentState = fibaro:getGlobal("PresentState")

if gPresentState == "Away" or gPresentState == "AWAY" then
  fibaro:startScene(176) -- Abwesend
elseif gPresentState == "AwaySecure" or gPresentState == "AWAYSECURE" then
  fibaro:startScene(182) -- AbwesendSecure
elseif gPresentState == "Home" or gPresentState == "HOME" then
  fibaro:startScene(223) -- Anwesend
elseif gPresentState == "Sleep" or gPresentState == "SLEEP" then
  fibaro:startScene(180) -- AUS - Alles
elseif gPresentState == "Bedroom" or gPresentState == "BEDROOM"then
  fibaro:startScene(176) -- AUS - unten
  fibaro:startScene(182) -- AUS - Außenbereich
else
  Debug("red",(os.date("%d.%m.%Y - Present: "..gPresentState.." ")))
  fibaro:call(2, "sendEmail", "PresentState - unzulässiger Wert!", "PresentState geändert in: "..gPresentState.." ")
end

läuft jetzt schon ganz gut!
Falls ihr Tipps oder Verbesserungsvorschläge habt, freu ich micht über eure Anregungen :wink: