Hallo zusammen, wäre es auch möglich hier eine endzeit einzubauen, damit die Szene nicht die ganze Nacht läuft?
Gruss fastsnake
--[[
%% properties
%% globals
AnwesenheitsCheck
--]]
local currentDate = os.date("*t");
local nachtstart = 1600
local nachtende = 0200
local handy_willi = tonumber(fibaro:getGlobalValue("handy_willi", "value"))
local licht_wz = tonumber(fibaro:getGlobalValue("licht_wz", "value"))
---------------------------------------------------
--------- Schleifenschutz -------------------------
if (fibaro:countScenes()>1) then
--fibaro:debug('Kill the second scene!');
fibaro:abort();
end
-----------------------------------
---------- Einstellungen ----------
local varDebug = true -- Debug logs true oder false
local gVarPresentState = 'AnwesenheitsCheck' -- Name der globalen Variable für An- und Abwesenheit
local gVarLightOfDay = 'Tageslicht' -- Name der globalen Variable für Tageslicht
local gVarLightOfDayValues = {'Dunkel'} -- Zu welchen Tageszeiten sollen Lichtquellen geschaltet werden
local randomTimeMin = {10,120} -- Zufallsminuten von bis {1,2} min, max
local secondsNext = 60 -- x Sekunden warten bis das nächste Gerät geschaltet wird
local simDevices = {licht_wz,14, {}, {},} -- Geräteauswahl (Mitte Virtuell)
local version = '1.1'
---------- Funktionen ----------
---------------------------------------------------
--------- Farbiges Debug --------------------------
local function debug(color, message)
if (varDebug) then
--fibaro:debug(message)
fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", color, message, "span"));
end
end
local function DT(DATETIME)
local WD = {'Sonntag','Montag','Dienstag','Mittwoch','Donnerstag','Freitag','Samstag'}
local M = {'Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'}
local tableDT= (os.date('*t', tonumber(DATETIME)))
tableDT.month = M[tonumber(tableDT.month)]
tableDT.wday = WD[tonumber(tableDT.wday)]
return ""..tableDT.wday ..', ' ..tableDT.day ..'. ' ..tableDT.month ..' ' ..tableDT.year ..' '..os.date " / %H:%M Uhr"
end
---------------------------------------------------
------- waitFunction - Warte x Sekunden -----------
---------------------------------------------------
local function waitFunction(sec, text)
while sec > 0 do
if sec % 10 == 0 then debug('cyan','Noch '..sec..' Sekunden '..text) end
sec = sec -1
if fibaro:getGlobal(gVarPresentState) ~= 'Abwesend' then
break;
end
fibaro:sleep(1000)
end
end
------------- radomDevice -------------------------
-- Zufallsgerät ermitteln
---------------------------------------------------
local function switchRandDevice() --Zufallsgerät aus deviceIDs ermitteln
math.randomseed(os.time ())
randomLight = math.random(1,#simDevices)
randomTime = math.random(randomTimeMin[1],randomTimeMin[2]) * 60
deviceID = simDevices[randomLight]
if type(deviceID) == 'table' then
if #deviceID == 3 then
debug('green','Virtuelles Device: '..fibaro:getName(deviceID[1])..' in '..fibaro:getRoomNameByDeviceID(deviceID[1])..'. Drücke Button für '..randomTime..' Sekunden.')
fibaro:call(deviceID[1], "pressButton", deviceID[2])
waitFunction(randomTime, 'bis '..fibaro:getName(deviceID[1])..' ausgeschaltet wird')
fibaro:call(deviceID[1], "pressButton", deviceID[3])
elseif
#deviceID == 4 then
debug('green','Virtuelles Device: '..fibaro:getName(deviceID[1])..' in '..fibaro:getRoomNameByDeviceID(deviceID[1])..'. Setze Slider für '..randomTime..' Sekunden.')
fibaro:call(deviceID[1], "setSlider", deviceID[2], deviceID[3])
waitFunction(randomTime, 'bis '..fibaro:getName(deviceID[1])..' ausgeschaltet wird')
fibaro:call(deviceID[1], "setSlider", deviceID[2], deviceID[4])
end
else
x= DT(os.date())
fibaro:debug (x)
debug('yellow','Schalte '..fibaro:getName(deviceID)..' für '..randomTime..' Sekunden ein.')
fibaro:call(deviceID, "turnOn")
fibaro:setGlobal("Licht", "Eingeschaltet");
debug("yellow","Licht eingeschaltet...");
fibaro:call(handy_willi, "sendPush",os.date("(%d.%m.%Y) "..fibaro:getName(deviceID).." um %H:%M Uhr AKTIVIERT!"));
waitFunction(randomTime, 'bis '..fibaro:getName(deviceID)..' ausgeschaltet wird')
x= DT(os.date())
fibaro:debug (x)
if fibaro:getGlobal(gVarPresentState) ~= 'Abwesend'
and (tonumber(fibaro:getValue(licht_wz,'value')) > 0)
then
debug('tan','Ankunft zu Hause...')
debug('yellow',''..fibaro:getName(deviceID)..' ist bereits eingeschaltet');
debug('yellow',''..fibaro:getName(deviceID)..' wird NICHT ausgeschaltet!');
else
fibaro:call(deviceID, "turnOff") -- Alle Lichter aus
fibaro:setGlobal("Licht", "Ausgeschaltet");
debug('gray',''..fibaro:getName(deviceID)..' ausgeschaltet!');
fibaro:call(handy_willi, "sendPush",os.date("(%d.%m.%Y) "..fibaro:getName(deviceID).." um %H:%M Uhr AUSGESCHALTET!"));
end
end
end
------------- Funktion checkDaytime ---------------
local function checkDaytime(tab, val)
for index, value in ipairs (tab) do
if value == val then
return true
end
end
return false
end
------------- START -----------------------------
sourceTrigger = fibaro:getSourceTrigger()
PresentState = fibaro:getGlobalValue(gVarPresentState)
x= DT(os.date())
fibaro:debug (x)
debug("green","--------------------START--------------------------------")
debug('green','Anwesenheitssimulator');
--fibaro:call(handy_willi, "sendPush",os.date("(%d.%m.%Y) Zufallslicht Abwesenheit um %H:%M Uhr AKTIVIERT!"));
if sourceTrigger["type"] == "autostart" then
debug('red','Dies ist keine Autostart-Szene. Bitte Autostart entfernen')
elseif
sourceTrigger["type"] == "global" then
debug('orange','Getriggert durch '..sourceTrigger['name'])
if PresentState == 'Abwesend' then --or PresentState == 'Holiday' then
--Start PresentSim
debug('green','Starte Simulation...')
while fibaro:getGlobal(gVarPresentState) == 'Abwesend' do
gVarDaytime = checkDaytime(gVarLightOfDayValues, fibaro:getGlobalValue('Tageslicht'))
if gVarDaytime
and (tonumber(os.date("%H%M")) >= nachtstart or tonumber(os.date("%H%M")) <= nachtende) then
waitFunction(secondsNext, 'bis zum nächsten Schaltvorgang')
switchRandDevice()
else
debug('skyblue','Tageszeit = '..fibaro:getGlobalValue('Tageszeit')..'')
debug('gray','Lichtsensor meldet '..fibaro:getGlobalValue('Tageslicht')..'')
debug('tan',(os.date('Es ist %H:%M Uhr... Zeit nach Vorgabe = 16:00 Uhr.')))
debug('tan','Nicht alle Bedingungen erfüllt, Szene gestoppt!')
debug('red','Abwesenheitsimulation wird NICHT aktiviert!')
waitFunction(secondsNext, 'bis zum nächsten Check')
end
end
debug('red','Simulation beendet.')
else
x= DT(os.date())
fibaro:debug (x)
--Stop PresentSim
debug('orange','Anwesenheit festgestellt!')
debug('red','Ende der Simulation...')
end
elseif
sourceTrigger["type"] == "other" then
debug('yellow','Szene manuell gestartet')
end