Hallo Ihr Lieben,
Ich tüftle nun schon fast 1 Woche an einem Skript für meinen Abstellraum.
Eigentlich ist es recht einfach, aber es kommen immer wieder Dinge dazu
Folgende Funktionen hab ich bereits eingebaut:
1.) Tür auf -> Licht an
2.) Tür zu -> Licht aus
3.) Tür auf und bleibt offen -> Licht nach 180 Sekunden aus
Das funktioniert mit dem unten ersichtlichen Skript schon recht gut, wobei ich nicht sicher bin ob es wirklich sauber programmiert ist.
Nun hat meine Frau eine zusätzliche Komponente dazugebracht.
4.) Tür ist beim letzten Mal offen geblieben und Licht wird händisch aufgedreht. Tür wird wieder nicht geschlossen und das Licht bleibt ewig an!!
Das einzubauen hat bis jetzt nicht funktioniert, obwohl es eigentlich einfach sein sollte.
Vielleicht hat jemand einen Tipp für mich??
Dann kann ich den WAF etwas erhöhen (WAF=Womans acception factor)
Anbei das Skript in dem Punkt 1-3 bereits funktionieren!
--[[
%% properties
206 value
%% globals
--]]
if (fibaro:countScenes()>2) then fibaro:debug("zu viele Szenen, gelöscht!!") fibaro:abort() end
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
TriggerID = 206 -- ID des Türkontaktes
DeviceID = 302-- ID des Relay Switches
if (tonumber(fibaro:getValue(TriggerID, "value")) == 1 ) then
local timer = 180
fibaro:call(DeviceID, "turnOn")
Debug("yellow",(os.date("%d.%m.%Y - Schalte Licht ein")))
repeat
fibaro:sleep(1000)
if (tonumber(fibaro:getValue(TriggerID, "value")) == 0 ) then
break
end
timer = timer -1
Debug("grey",(os.date("%d.%m.%Y - Timer: "..timer.." ")))
until timer < 1
if timer == 0 and (tonumber(fibaro:getValue(TriggerID, "value")) == 1 ) then
Debug("magenta",(os.date("%d.%m.%Y - Schalte Licht nach Zeit AUS")))
fibaro:call(DeviceID, "turnOff")
elseif (tonumber(fibaro:getValue(TriggerID, "value")) == 0 ) then
fibaro:call(DeviceID, "turnOff")
Debug("green",(os.date("%d.%m.%Y - Schalte Licht über Türkontakt AUS")))
end
am einfachsten ist es wenn du eine zweite Scene anlegst: Die ist dann zeitgesteuert also wird z.b. alle Minute gestartet das kannst du mit einer LUA Function machen oder mit einem Cronjob.
In dieser zweiten Scene prüfst du einfach nur Mit fibaro:getModificationTime() ob das Licht länger als x Sekunden an ist (und das Licht noch an ist!) und wenn ja mache es aus.
if(os.time()-tonumber(fibaro:getModificationTime(IDvomLicht,'value')) >= 180 and (tonumber(fibaro:getValue(idvom Licht, 'value')) > 0)
then
fibaro:debug('Licht ist länger wie '..os.time()-tonumber(fibaro:getModificationTime(IDvomLicht,'value'))..' Sekunden an');
fibaro:call(ID des Lichts,'turnOff');
end
Lua Code ist ungetestet sollte noch ein Syntax Fehler drin sein dann sorry Logik sollte aber passen
Es gibt auch die Möglichkeit das direkt in deiner Scene mit einzubauen -> du müsstest dann immer den source trigger auswerten und wenn es Time ist und nicht die Türöffnung die Scene startet dann unten stehenden code ausführen -> das bekomme ich aber jetzt ohne Home Center nicht schnell runter getippt wenn da noch fragen sind kann ich mir das ggf. nochmal anschauen und ein Beispiel machen.
Danke Nico90 für dein Codeschnipsel!
Ich bin allerdings bestrebt diese Anforderung in EINEM Script zu haben.
Werde also noch weiter rumprobieren, vielleicht kann ich ja deinen Code irgendwie einbauen
So habs nun doch mit EINEM Skript geschafft!
Hab einfach einen 2. Trigger für das Licht eingebaut.
Timer läuft zwar lt. Debugg nicht 100% sauber, aber funktioniert bestens
Hier das Skript, falls es jemanden intzeressiert:
--[[
%% properties
206 value
302 value
%% globals
--]]
if (fibaro:countScenes()>2) then fibaro:debug("zu viele Szenen, gelöscht!!") fibaro:abort() end
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
Trigger = fibaro:getSourceTrigger()
TriggerID = tonumber(Trigger['deviceID'])
LightID = 302-- ID des Licht Relay
DoorID = 206--ID des Türkontaktes
timer = 180
if (tonumber(fibaro:getValue(TriggerID, "value")) == 1 ) then
fibaro:call(LightID, "turnOn")
Debug("yellow",(os.date("%d.%m.%Y - Schalte Licht ein")))
repeat
fibaro:sleep(1000)
if (tonumber(fibaro:getValue(TriggerID, "value")) == 0 ) then
fibaro:call(LightID, "turnOff")
break
end
timer = timer -1
Debug("grey",(os.date("%d.%m.%Y - "..timer)))
until timer == 0
fibaro:call(LightID,'turnOff')
if timer == 0 then Debug("magenta",(os.date("%d.%m.%Y - Timer: "..timer.." Schalte Licht nach Zeit AUS"))) end
if timer ~= 0 then Debug("green",(os.date("%d.%m.%Y - Schalte Licht über Türkontakt AUS (Timer)"))) end
timer = 0
end
Habe übrigens dein CronJob Skript etwas verbessert bereits sein eingier Zeit im Einsatz, funktioniert gut!
Würde mich nächstes mal über eine Info freuen und ggf. über einen kurzen Verweiß - ich schaue mir dein Script morgen mal an und werde meins ggf. anpassen bzw. ggf. kontaktiere ich dir auch nochmal - wenn das dann okay ist würden wir mit deinem weiterarbeiten (natürlich mit verweiß) -> denn eigentlich macht es wenig sinn so „kleine“ Funktionen an 10 stellen zu entwicklen.
Hatte hier soetwas nicht gefunden und deshalb hier geteilt.
daraufhin haben mir einige personen, wie mdietlinger gute Tipps zur Verbesserung gegeben, die ich eingebaut und getestet habe.
Ich finde es toll dass es hier so viele Tipps und Erfahrungen gibt, die geteilt werden.
Ich hoffe das war ok ??
TriggerID = tonumber(Trigger[‘deviceID’])
-> aber die object steht nicht zur verfügung wenn man auf Start klickt du musst es durch ein Gerät starten - in dem fall wohl die Tür
Scripts interpretieren sollte man können… danke für den Hinweis, läuft soweit OK.
Bin gerade am Umsetzen deiner Rollladensteuerung mit Temperatursteuerung anhand deines Video’s.
Werde dann berichten.
Danke für die tollen Vorschläge auf deiner Seite. Top!
hättest das ganze auch ohne Script lösen können.
Beim Fibaro switch gibt es einen Parameter für auto Aus.
Bei meinem double switch ist es parameter 4. (Mit 3. kannst Override definieren.
Egal wie der Switch getriggert wird nach vorgegebener Zeit ist immer aus.
vielen Dank @mdietinger für den Tipp!!
Die Grundfunktionen der Fibaro Komponeten habe ich mir noch nicht so genau angesehen, offensichtlich muss ich das noch nachholen
Hallo @mdietinger,
Hab jetzt mal die Ausschaltefunktion nach 10 Min in den Switch reinkonfiguriert, coole Idee
Hab nun das Skript nun um den Trigger erweitert und nun klappt es perfekt, danke für die Inspiration!
--[[
%% properties
206 value
302 value
%% globals
--]]
if (fibaro:countScenes()>3) then fibaro:debug("zu viele Szenen, gelöscht!!") fibaro:abort() end
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
trigger = fibaro:getSourceTrigger()
DeviceID = tonumber(trigger['deviceID'])
DeviceValue = tonumber(fibaro:getValue(DeviceID, "value"))
DeviceName = fibaro:getName(DeviceID)
DeviceRoom = fibaro:getRoomNameByDeviceID(DeviceID)
LightID = 302-- ID des Licht Relais
DoorID = 206--ID des Türkontaktes
if DeviceID == LightID then
if DeviceValue == 0 then Debug("blue",(os.date("%d.%m.%Y - Licht ausgeschaltet - "..DeviceID.."/"..DeviceValue))) end
if DeviceValue == 1 then Debug("yellow",(os.date("%d.%m.%Y - Licht eingeschaltet - "..DeviceID.."/"..DeviceValue))) end
elseif DeviceID == DoorID then
if DeviceValue == 0 and (tonumber(fibaro:getValue(LightID, "value")) == 1 ) then
Debug("grey",(os.date("%d.%m.%Y - Türkontakt geschlossen, Licht wird ausgeschaltet - "..DeviceID.."/"..DeviceValue)))
fibaro:call(LightID, "turnOff")
elseif DeviceValue == 1 and (tonumber(fibaro:getValue(LightID, "value")) == 0 ) then
Debug("grey",(os.date("%d.%m.%Y - Türkontakt geöffnet, Licht wird eingeschaltet - "..DeviceID.."/"..DeviceValue)))
fibaro:call(LightID, "turnOn")
end
end