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
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
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.
Hab mal den Vorschlag von @mdietinger umgesetzt, danke für den Tipp!
Hier teile ich gerne ein paar Codeschnipsel mit euch
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