Licht Automatik mit Tür & Zeit

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 :wink:
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 :wink: (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

Hallo,

am einfachsten ist es wenn du eine zweite Scene anlegst: Die ist dann zeitgesteuert :wink: also wird z.b. alle Minute gestartet das kannst du mit einer LUA Function machen oder mit einem Cronjob.

Wenn du die Zeitsteuerung direkt in der Scene machen willst schau mal hier -> https://www.siio.de/board/thema/zeiteinstellung-falsch/ da habe ich das heute vormittag beantwortet
Ich empfehle aber Cronjobs -> da dann alles zentral organisiert ist. https://www.intelligentes-haus.de/tutorials/fibaro-tutorials/cronjobs-im-fibaro-home-center-meine-losung-fur-wiederkehrende-aufgaben/

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 :slight_smile: Logik sollte aber passen :slight_smile:

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.

Liebe Grüße,
Nico

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 :wink:

Habe übrigens dein CronJob Skript etwas verbessert bereits sein eingier Zeit im Einsatz, funktioniert gut!
Näheres dazu hier:
https://www.siio.de/board/thema/cronjob-skript-fuer-automatische-ausfuehrung/

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 :wink:
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

Hallo,

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ß :wink: - 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.

Zu deinem Lösungsansatz:

schön das es jetzt läuft :slight_smile:

Hallo Nico90,

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 ??

Hallo

Wenn ich das Script in der 2. Version starte erscheint folgende Meldung:

[DEBUG] 13:22:08: [1;31m2018-08-27 13:22:08.653106 [ fatal] Unknown exception: /opt/fibaro/FibaroSceneAPI.lua:115: attempt to concatenate local ‘deviceId’ (a nil value)

ID’s wurden entsprechend im Script angepasst.
Kann jemand weiterhelfen?

Danke im Voraus

Hallo,

das Script kann nicht manuell gestartet werden:

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 :wink: - in dem fall wohl die Tür :wink:

Hallo Nico

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!

Hallo Ihr Lieben,
Ich habe den CronJob, den ich hier geteilt habe übrigens ohne Quelle gepostet.
Ist NICHT meine Erfindung, sondern von hier:
https://www.intelligentes-haus.de/tutorials/fibaro-tutorials/cronjobs-im-fibaro-home-center-meine-losung-fur-wiederkehrende-aufgaben
sorry @nico90 !

Pblacky,

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 :wink:

Hallo @mdietinger,
Hab jetzt mal die Ausschaltefunktion nach 10 Min in den Switch reinkonfiguriert, coole Idee :wink:
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