Anwesenheitssimulation

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

Die Zeit “Nachtstart bzw. Nachtende” funktioniert nicht wie gewünscht…-:frowning: Vielen Dank, Gruss fastsnake

Hallo fastsnake, hast Du da eine Lösung gefunden bzgl der Endzeit?

Hallo fs1997
Ja ich habe eine Hilfsszene geschrieben die mir per Autostart jeden Tag eine Variable von 16:00 - 02:00 Uhr schaltet. Variable heisst: Licht_ABW (Bereit) oder (Ausgeschaltet)Dann in der Lichtszene eine weitere Bedingung: Licht ein wenn weniger als 50 LUX und Variable Licht_ABW (Bereit) umgekehrt wenn Variable (Ausgeschaltet) dann beende die Szene. Dies schien mir die einfachste Lösung und funktioniert schon seit längerem sehr gut. Gruss fastsnake

Vielen Dank. Meinst Du, Du könntest die umgebaute Szene hier noch mal posten?
Das mit der Hilfsszene ist mir klar und kriege ich hin. Aber in Deine Szene oben eine weitere Bedingung einzufügen, darauf reicht mein LUA Verständnis leider nicht.

Ja klar, hier schonmal das Hilfstool

--[[
%% autostart
%% properties
%% weather
%% events
%% globals
--]]

local sourceTrigger = fibaro:getSourceTrigger();
function tempFunc()
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
--local deviceValue1 = tonumber(fibaro:getValue(10, "value"));
------------------------------------------   
local einschalten = 1600 --0900 = 09:00
local ausschalten = 0200 --1000 = 10:00
------------------------------------------   
-- Ist erste Zeit grösser als zweite dann "OR" sonst "AND"
  
local separator   = ("------------------------------------------------------------------------------------------")   
 
  
if  (fibaro:countScenes()>1)   
then
	fibaro:debug("Es läuft mehr als eine Instanz");
	fibaro:abort();
end    
      
      Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
 
  
      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 
  
  
  
if    (currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7)
and   (tonumber(os.date("%H%M")) > einschalten or tonumber(os.date("%H%M")) < ausschalten)
and   fibaro:getGlobalValue("LichtAbwesenheit") == "Ausgeschaltet"  --> Variable machen
and   fibaro:getGlobalValue("Tageslicht") == "Dunkel"--> Variable machen und mit LUX Sensor ansteuern
and   fibaro:getGlobalValue("AnwesenheitsCheck") == "Abwesend"  --> Variable machen
    
then
      x= DT(os.date())
      fibaro:debug (x) 
	  fibaro:setGlobal("LichtAbwesenheit", "Bereit")
      Debug('gray','Tageslicht Check meldet '..fibaro:getGlobalValue('Tageslicht')..'');
      Debug('gray','Abwesenheits Check meldet '..fibaro:getGlobalValue('AnwesenheitsCheck')..''); 
      Debug('gray','Status Licht Abwesenheit meldet '..fibaro:getGlobalValue('LichtAbwesenheit')..''); 
      Debug("lime",(os.date("Licht Abwesenheit gemäss Vorgaben bereit zum einschalten!")));
      Debug("lime",(separator))           

elseif
    
      (currentDate.wday == 1 or currentDate.wday == 2 or currentDate.wday == 3 or currentDate.wday == 4 or currentDate.wday == 5 or currentDate.wday == 6 or currentDate.wday == 7)
and   (tonumber(os.date("%H%M")) >= ausschalten and tonumber(os.date("%H%M")) <= einschalten)
and   fibaro:getGlobalValue("LichtAbwesenheit") == "Bereit"   
  
then
      x= DT(os.date())
      fibaro:debug (x) 
      fibaro:setGlobal("LichtAbwesenheit", "Ausgeschaltet")
      Debug('gray','Tageslicht meldet '..fibaro:getGlobalValue('Tageslicht')..'');
      Debug('gray','Abwesenheits Check meldet '..fibaro:getGlobalValue('AnwesenheitsCheck')..'');   
      Debug("red",(os.date("Licht Abwesenheit wird gemäss Vorgaben ausgeschaltet!")));
      Debug('gray','Licht Abwesenheit meldet '..fibaro:getGlobalValue('LichtAbwesenheit')..''); 
      Debug("red",(separator))         
end

      setTimeout(tempFunc, 60*1000)
end

      tempFunc()


Ist vielleicht etwas verwirrend, ich habe für jeden Sensor eine Variable gemacht somit brauche ich beim ersetzen des jeweiligen Gerätes
die dazugehörige Nummer nicht in jeder Szene zu ändern, sondern nur in der Variable.
Das sieht in LUA so aus
local licht_wz = tonumber(fibaro:getGlobalValue("licht_wz", "value")) so kann ich in der Programmierung mit Namen statt mit Nr. arbeiten.
Braucht Du aber nicht zu machen!
Beispiel:
Bei mir
local simDevices = {<strong>licht_wz</strong>,14, {}, {},} – Geräteauswahl (Mitte Virtuell)
Bei Dir
local simDevices = {<strong>12</strong>,14, {}, {},} – Geräteauswahl (Mitte Virtuell)
Hoffe Du weisst von was ich rede?
Viel Spass mit der Anwesenheitssimulation…
Gruss fastsnake

--[[
%% properties
%% globals
AnwesenheitsCheck
--]]
 
local currentDate   = os.date("*t");
local handy_willi   = tonumber(fibaro:getGlobalValue("handy_willi", "value"))
local licht_wz      = tonumber(fibaro:getGlobalValue("licht_wz", "value"))
 -- Ist erste Zeit grösser als zweite dann "OR" sonst "AND"
---------------------------------------------------
--------- 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       = 'LichtAbwesenheit'  -- Name der globalen Variable für Tageslicht
local gVarLightOfDayValues = {'Bereit'}    -- 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...");
    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!'); 
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');
 
    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
    fibaro:call(handy_willi, "sendPush",os.date("(%d.%m.%Y) Licht Abwesenheit um %H:%M Uhr AKTIVIERT!"));
    debug('green','Starte Simulation...')
    
    while fibaro:getGlobal(gVarPresentState) == 'Abwesend'  do
    gVarDaytime = checkDaytime(gVarLightOfDayValues, fibaro:getGlobalValue('LichtAbwesenheit'))
    if gVarDaytime   
    then
    --fibaro:setGlobal("LichtAbwesenheit", "Eingeschaltet")
    waitFunction(secondsNext, 'bis zum nächsten Schaltvorgang')
    switchRandDevice()
else
    x= DT(os.date())
    fibaro:debug (x)
    debug('gray','Tageszeit = '..fibaro:getGlobalValue('Tageszeit')..'')
    debug('gray','Lichtsensor meldet '..fibaro:getGlobalValue('Tageslicht')..'')
    debug('gray','Licht Abwesenheit meldet '..fibaro:getGlobalValue('LichtAbwesenheit')..'')        
    debug('tan',(os.date('Es ist %H:%M 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 
    x= DT(os.date())
    fibaro:debug (x)
    fibaro:setGlobal("LichtAbwesenheit", "Ausgeschaltet")
    fibaro:call(handy_willi, "sendPush",os.date("(%d.%m.%Y) Licht Abwesenheit um %H:%M Uhr DEAKTIVIERT!"));  
    debug('red','Simulation beendet.')
else 
    x= DT(os.date())
    fibaro:debug (x)    
    --Stop PresentSim
    debug('orange','Anwesenheit festgestellt!')
    fibaro:call(handy_willi, "sendPush",os.date("(%d.%m.%Y) Licht Abwesewnheit um %H:%M Uhr DEAKTIVIERT!"));  
    fibaro:setGlobal("LichtAbwesenheit", "Ausgeschaltet")
    debug('red','Ende der Simulation...')
end
elseif  
    sourceTrigger["type"] == "other" then
    debug('yellow','Szene manuell gestartet')
end


1 „Gefällt mir“

Die Zeilen wie oben beschrieben sollten so aussehen (ist mit der Fettschsrift ein Fehler passiert)
Meine:
local simDevices = {licht_wz,14, {}, {},} – Geräteauswahl (Mitte Virtuell)
Deine:
local simDevices = {12,14, {}, {},} – Geräteauswahl (Mitte Virtuell)

Gruss fastsnake

Noch eine kleine Ergänzung!
Es hat mich immer gestört wenn das Wohnzimmerlicht bei Abwesenheit an war und ich nach Hause gekommen bin, also die Variable auf “Anwesend” schaltete, ging das Wohnzimmerlicht aus, was ja eigentlich richtig ist und dann per Bewegungsmelder wieder an.
Das habe ich unterbunden in der Programmierung, sollte das Wohnzimmerlicht per Zufall an sein wenn ich nach Hause komme löscht es nicht mehr aus wenn sich die Anwesenheitsschaltung beendet.
So nun viel Spass…

Super, vielen Dank.
Dann mache ich mal an die Arbeit.
Das mit dem Wohnzimmerlicht werde ich auskommentieren. Ich brauche das nur für die Urlaubszeit, aber vielen Dank für die Hinweise und Erklärungen. Hilft mir sehr.

Hallo zusammen,

hat jemand von euch ein LUA-Skript wo ich start und endzeit angebe und dann ein Array an IDs übergebe welche dann Randomweise AN bzw. AUS geschaltet werden.

LG