Türen und Fenster im gegebenen Intervall prüfen

Eventuell gibt es so ein Script schon hier, (hab vielleicht falsch gesucht) aber aus gegebenen Anlass stell ich mal meins hier rein. Hintergrund - ich oder meine Frau vergessen regelmäßig Fenster nach dem Lüften diverser Räume zu schließen. In dieser kalten Jahreszeit wirft man so das Geld für’s Heizen zum Fenster raus. Ich denke dass nicht nur wir so vergesslich sind.

Die Besonderheit des Scripts ist, dass man die IDs der Sensoren manuell im arraylocal devices ={} eintragen kann, (im Sommer hat man ja gern des Nachts Fenster gekippt) oder das script füllt das array automatisch mit den IDs der Sensoren in der nächsten Zeile, gut für die kalte Jahreszeit.
Nach eingestellter Zeit gibt’s eine Pushmitteilung auf den mobilen Geräten.

--[[
%% autostart
%% properties
--]]
-- Check doors and windows at the given interval.
-- Entweder man traegt alle Tuer/Fensters IDs in Zeile 11 ein, und 
-- kommentiert Zeile 12 aus. Das ist mehr fuer den Sommerbetrieb gedacht, wenn 
-- man einige Sensoren aus der Pruefung herausnehmen will. Oder man kommentiert
-- Zeile 11 aus und laesst das Script selber die Sensoren herausfinden.

--local devices = {48, 122, 123, 127} --device IDs
local devices = fibaro:getDevicesId({ enabled = true, visible = true, baseType = "com.fibaro.doorWindowSensor" })
local phoneID = {8, 20} -- mobile-IDs
local interval= 10      -- Zeitspanne nach der eine Warnung verschickt wird.
local debug   = false   -- Debugausgaben ja/nein 
-- Don't change anything below this line.
local warning = 1
local counter = 0  
local prevwarning = 0

Debug = function ( color, message )  
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span") )
end
 
local sourceTrigger = fibaro:getSourceTrigger();
Debug('white', "Check for open doors and windows")

function checkOpenDW()
  local currentDate = os.date("*t");
  local datum = os.date("%d.%m.%Y")
  counter = counter + 1
  local devopen = 0
  for id = 1, #devices do
     local deviceType = fibaro:getType(devices[id] )
     if (deviceType == 'com.fibaro.windowSensor' or deviceType == 'com.fibaro.doorSensor') then
       if (tonumber(fibaro:getValue(devices[id], 'value')) == 1) then
          local name  = fibaro:getName(devices[id])
          local room  = fibaro:getRoomNameByDeviceID(devices[id])
          devopen = devopen + 1
          status  = " ACHTUNG! " ..name.. " im Raum " ..room.. " ist offen!"
          if debug then Debug('red',datum .. status) end;
          warning = warning + 1
       end
     end
          
     if (warning == prevwarning and warning > 0) then
         -- Tür wurde geschlossen
         warning = 1
         counter = 1
         prevwarning = 0
     end     
     -- Keine Tür geöffnet, Zähler beginnt von vorn 
     if (warning == 0) then 
         counter = 1;
         prevwarning = 0;
     end
      
     -- Tür wurde geöffnet und wieder geschlossen, Warnungen werden zurückgesetzt   
     if (counter > interval+1 and warning > 0) then 
         counter = 1;
         warning = 1;
         prevwarning = 0;
     end 
  end --for
    
  prevwarning = prevwarning +1  
  -- Tür/Fenster mehr als Interval (Min.) offen. Meldung schicken 
  if counter >= interval  then
     Debug('red', 'Mehr als '.. minutes..' Minuten, sende Push')
     if (devopen > 1) then
        status = status .. ' und '.. devopen .. 'andere.'
     end
     for k=1, #phoneID do
       if phoneID[k] ~= nil then
          fibaro:call(phoneID[k], 'sendPush', status)
       end
     end
     warning = 1
     counter = 1
     prevwarning = 0
  end 
  
  if debug then Debug('withe', 'Counter: '.. counter) end;
  if debug then Debug('withe', 'Warning: '.. warning) end;
  if debug then Debug('withe', 'PreWarning: '.. prevwarning) end;
    
  setTimeout(checkOpenDW, 60*1000)
end --function

if (sourceTrigger["type"] == "autostart") then
  checkOpenDW()
else
  local currentDate = os.date("*t");
  local startSource = fibaro:getSourceTrigger();
end

So kanns gehen wenn man während dem posten noch Änderungen am Code macht. Bitte Zeile 69 mit dieser ersetzen.
Debug('red', 'Mehr als '… interval …' Minuten, sende Push')
Danke und sorry.

Danke dir für das Script…ist direkt zum Einsatz gekommen, da mein Weibchen und ich auch an alles andere denke :wink: Habe mir auch direkt ein Icon umgebaut

Icon-Fenster-auf-Zeit.png

Hallo Jeep,
So ein Script hab ich auch schon vermisst… Und mir eins vor ein paar Wochen programmiert :slight_smile: Ist bei weitem nicht so sauber strukturiert allerdings hab ich zusätzlich noch eine Temperaturabfrage eingebaut. Wenn es warm ist, dürfen die Fenster ruhig auch mal länger aufstehen. Unter 15°C wird nach dem Timeout gewarnt.
Trotzdem danke fürs Teilen.
Gruß

Ps: Mal ein Danke auf diesem Weg für das Inventar- und Batteriecheckscript

Hallo Ändy,
Gute Idee mit der Temperatur. Werde es bei nächster Gelegenheit umsetzen.
Danke für den Hinweis.

… bei mir schließen die Rollos noch, wenn es Draußen kalt ist und die Fenster „zu lange“ (temperaturabhängig) geöffnet sind…

Moin, Danke fürs Teilen. Ich habe einige Sensative Strips als Tür und Fenstersensor, die werden vermutlich nicht automatisch abgefragt wenn Zeile 11 so bleibt wie es gerade im Script steht? Kann Zeile 11 und 12 gleichzeitig aktiviert werde damit ich die Sensative IDs dort eintragen kann und diese dann auch abgefragt werden?

@Christian, ich will doch hoffen das sich die Stripes genauso verhalten wie ein Fibaro Türsensor. Hast Du es schon getestet?
Wenn beide Zeilen (11 und 12) aktiv sind, wird die letzte Zeile genommen, da die Variable in beiden Zeilen den gleichen Namen hat.
Ich werde mir da was eleganteres einfallen lassen. Im Prinzip geht es im Winter ja hauptsächlich um kurzes Lüften und natürlich auch um die Sicherheit des Heims. Im Sommer spielt natürlich die Sicherheit eine größere Rolle. Falls jemand sein Haus verläßt, und nicht mit einer Alarmanlage scharf geschaltet hat, bekommt dann immerhin nach dem Intervall eine Pushmeldung.

Hi, ja klappt 1a, hätte erst testen sollen und dann schreiben :slight_smile: nochmals Danke fürs teilen.

Hallo,

super Script und funktioniert sehr gut. Danke dafür.

Würde gerne die Meldungen, dass die Fenster offen sind nur 2 oder 3mal per Push auf mein Handy bekommen. Kann mir jemand sagen was ich dafür ändern muss !

Grüße

@Guido,
werde es in der nächsten Version eine einstellbare Anzahl an Push Meldungen einbauen.

ja, das wäre super.

Danke

@jeep

bitte auch eine Variable, um es nur bei einer Temperatur unter XY ausführen zu lassen :smiley:

So, ich hab mal versucht ein paar Vorschläge umzusetzen. Ich denke die meisten Probleme wird die Temperaturabfrage machen. Sollte sich das Bewahrheiten, werde ich eine Version ohne Temperaturabfrage bereitstellen. Aus diesem Grund habe ich auch ein ReadMe PDF angehängt, dass man bitte beachten möge. Dort sind auch alle einstellbaren Variablen beschrieben. Falls Ihr das Script im manuellen Modus laufen lässt, notiert vor dem überschreiben Eure Sensor IDs.
Auf alle Fälle freue ich mich über jedes feedback.

--[[
%% autostart
%% properties
--]]

-- Scene File    : CheckDWinterval.lua
-- Purpose       : Check doors and windows at the given interval.
-- Version       : 0.1.2
-- Release Date  : 16 December 2017
-- Trigger       : autostart
-- License       : Copyleft {jeep} siio-forum
--

-- Either you enter all the door / window IDs in line 25, or you
-- let the script run in automatic mode. Save the line 25, so
-- you do not have to pick all the IDs again,

local sourceTrigger = fibaro:getSourceTrigger();
local Debug = function ( color, message )  
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span") )
end

local manually = false
if manually then
   devices = {48, 122, 123, 127} --device IDs
   Debug('green', 'Checking is in manual mode.')
else  
   devices = fibaro:getDevicesId({ enabled = true, visible = true, baseType = "com.fibaro.doorWindowSensor" })
   Debug('green', 'Checking is in automatic mode.')
end 

local interval    = 10   -- Interval after which a push message is sent.
local numPushMsg  = 5    -- number of push messages
local IDtempOut   = 243  -- IMPORTANT! ID of your outside temperatur sensor (e.g. Yahoo)
local tThreshold  = 15   -- nn° Celsius
local newInterval = 20   -- increase interval counter  
local phoneID     = {8, 20} -- mobile-IDs
local debug       = true    -- Debug messages yes/no 
local advdebug    = false   -- advanced debug

-- Don't change anything below this line.
local pushMsg = 0
local warning = 1
local counter = 0  
local prevwarning = 0
local outsideTemp = math.floor(fibaro:getValue(IDtempOut, "Temperature"));
if outsideTemp >= tThreshold then
   interval = newInterval -- increase checking interval 
end  

function tempcheck()
  local outsideTemp = math.floor(fibaro:getValue(IDtempOut, "Temperature"));
  if outsideTemp >= tThreshold then
     interval = newInterval
  end  
  return interval
end

Debug('white', "Check for open doors and windows...")
Debug('white', "Outside temperature is " .. outsideTemp.. '°C')
Debug('green', "Current Interval is: " .. interval) 
if not debug then print('Debug is disabled.') end;

function checkOpenDW()
  local outsideTemp = math.floor(fibaro:getValue(IDtempOut, "Temperature"));
  local currentDate = os.date("*t");
  local datum = os.date("%d.%m.%Y")
  counter = counter + 1
  local devopen = 0
  for id = 1, #devices do
     local deviceType = fibaro:getType(devices[id] )
     if (deviceType == 'com.fibaro.windowSensor' or deviceType == 'com.fibaro.doorSensor') then
       if (tonumber(fibaro:getValue(devices[id], 'value')) == 1) then
          local name  = fibaro:getName(devices[id])
          local room  = fibaro:getRoomNameByDeviceID(devices[id])
          devopen = devopen + 1
          status  = " ACHTUNG! " ..name.. " im Raum " ..room.. " ist offen! Temp. = " .. outsideTemp.."°"
          if debug then Debug('yellow',datum .. status) end;
          warning = warning + 1
       end
     end
          
     if (warning == prevwarning and warning > 0) then
         -- Tür wurde geschlossen
         warning = 1
         counter = 1
         prevwarning = 0
         pushMsg = 0; 
         if debug then Debug('green', 'Alle Türen und Fenster sind geschlossen.') end;
     end     
     -- Keine Tür geöffnet, Zähler beginnt von vorn 
     if (warning == 0) then 
         counter = 1;
         prevwarning = 0;
         pushMsg = 0; 
     end
      
     -- Tür wurde geöffnet und wieder geschlossen, Warnungen werden zurückgesetzt   
     if (counter > interval+1 and warning > 0) then 
         counter = 1;
         warning = 1;
         prevwarning = 0;
     end 
  end --for
    
  prevwarning = prevwarning +1  
  -- Tür/Fenster mehr als Interval-Min. offen. Meldung schicken 
  if counter >= interval then
     if (devopen > 1) then
        status = status .. ' und '.. devopen .. 'andere.'
     end
     if pushMsg <= numPushMsg then
        pushMsg = pushMsg + 1
        Debug('red',datum .. ' Tür/Fenster seit mehr als '.. interval ..' Minuten geöffnet, sende Push Nr. '..pushMsg)
        for k=1, #phoneID do
          if phoneID[k] ~= nil then
             fibaro:call(phoneID[k], 'sendPush', status )
          end
        end --for
     end
     
     warning = 1
     counter = 1
     prevwarning = 0
     interval = tempcheck()
  end 
  
  if advdebug then Debug('withe', 'Counter: '.. counter) end;
  if advdebug then Debug('withe', 'Warning: '.. warning) end;
  if advdebug then Debug('withe', 'PreWarning: '.. prevwarning) end;
  if advdebug then Debug('withe', 'PushMsg : '.. pushMsg) end;
     
  setTimeout(checkOpenDW, 60*1000)
  
end --function

if (sourceTrigger["type"] == "autostart") then
  checkOpenDW()
else
  local currentDate = os.date("*t");
  local startSource = fibaro:getSourceTrigger();
end

Muss gleich ein kleines update nachliefern. Damit das Script bei ungültiger Außensensor ID, nicht sofort auf die Schnauze fliegt, wird es jetzt kontrolliert beendet. Somit weiss der Benutzer eher was zu tun ist.

Changelog für Version 0.1.3:
– Prüfung auf valide Außentemperatur

--[[
%% autostart
%% properties
--]]

-- Scene File    : CheckDWinterval.lua
-- Purpose       : Check doors and windows at the given interval.
-- Version       : 0.1.3
-- Release Date  : 17 December 2017
-- Trigger       : autostart
-- License       : Copyleft {jeep} siio-forum

-- Either you enter all the door / window IDs in line 25, or you
-- let the script run in automatic mode. Save the line 25, so
-- you do not have to pick all the IDs again,

local sourceTrigger = fibaro:getSourceTrigger();
local Debug = function ( color, message )  
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span") )
end
local version  = '0.1.3' 
local manually = false

if manually then
   devices = {48, 122, 123, 127} --device IDs
   Debug('green', 'Checking is in manual mode.')
else  
   devices = fibaro:getDevicesId({ enabled = true, visible = true, baseType = "com.fibaro.doorWindowSensor" })
   Debug('green', 'Checking is in automatic mode.')
end 

local interval    = 10   -- Interval after which a push message is sent.
local numPushMsg  = 5    -- number of push messages
local IDtempOut   = 243  -- IMPORTANT! ID of your outside temperatur sensor (e.g. Yahoo)
local tThreshold  = 15   -- nn° Celsius
local newInterval = 20   -- increase interval counter  
local phoneID     = {8, 20} -- mobile-IDs
local manually    = false   -- automatic/manually check
local debug       = true    -- Debug messages yes/no 
local advdebug    = false   -- advanced debug

-- Don't change anything below this line.
local pushMsg = 0
local warning = 1
local counter = 0  
local prevwarning = 0

if (fibaro:getValue(IDtempOut, "Temperature")) == nil then
   Debug('red', 'No outside temperature detected!')
   Debug('red', 'Please correct. Scene is canceled!') 
   fibaro:abort() 
end    

local outsideTemp = math.floor(fibaro:getValue(IDtempOut, "Temperature"));
if outsideTemp >= tThreshold then
   interval = newInterval -- increase checking interval 
end  

function tempcheck()
  local outsideTemp = math.floor(fibaro:getValue(IDtempOut, "Temperature"));
  if outsideTemp >= tThreshold then
     interval = newInterval
  end  
  return interval
end

Debug('white', "Check for open doors and windows...")
Debug('white', "Outside temperature is " .. outsideTemp.. '°C')
Debug('green', "Current Interval is: " .. interval) 
if not debug then print('Debug is disabled.') end;

function checkOpenDW()
  local outsideTemp = math.floor(fibaro:getValue(IDtempOut, "Temperature"));
  local currentDate = os.date("*t");
  local datum = os.date("%d.%m.%Y")
  counter = counter + 1
  local devopen = 0
  for id = 1, #devices do
     local deviceType = fibaro:getType(devices[id] )
     if (deviceType == 'com.fibaro.windowSensor' or deviceType == 'com.fibaro.doorSensor') then
       if (tonumber(fibaro:getValue(devices[id], 'value')) == 1) then
          local name  = fibaro:getName(devices[id])
          local room  = fibaro:getRoomNameByDeviceID(devices[id])
          devopen = devopen + 1
          status  = " ACHTUNG! " ..name.. " im Raum " ..room.. " ist offen! Temp. = " .. outsideTemp.."°"
          if debug then Debug('yellow',datum .. status) end;
          warning = warning + 1
       end
     end
          
     if (warning == prevwarning and warning > 0) then
         -- Tür wurde geschlossen
         warning = 1
         counter = 1
         prevwarning = 0
         pushMsg = 0; 
         if debug then Debug('green', 'Alle Türen und Fenster sind geschlossen.') end;
     end     
     -- Keine Tür geöffnet, Zähler beginnt von vorn 
     if (warning == 0) then 
         counter = 1;
         prevwarning = 0;
         pushMsg = 0; 
     end
      
     -- Tür wurde geöffnet und wieder geschlossen, Warnungen werden zurückgesetzt   
     if (counter > interval+1 and warning > 0) then 
         counter = 1;
         warning = 1;
         prevwarning = 0;
     end 
  end --for
    
  prevwarning = prevwarning +1  
  -- Tür/Fenster mehr als Interval-Min. offen. Meldung schicken 
  if counter >= interval then
     if (devopen > 1) then
        status = status .. ' und '.. devopen .. 'andere.'
     end
     if pushMsg <= numPushMsg then
        pushMsg = pushMsg + 1
        Debug('red',datum .. ' Tür/Fenster seit mehr als '.. interval ..' Minuten geöffnet, sende Push Nr. '..pushMsg)
        for k=1, #phoneID do
          if phoneID[k] ~= nil then
             fibaro:call(phoneID[k], 'sendPush', status )
          end
        end --for
     end
     
     warning = 1
     counter = 1
     prevwarning = 0
     interval = tempcheck()
  end 
  
  if advdebug then Debug('withe', 'Counter: '.. counter) end;
  if advdebug then Debug('withe', 'Warning: '.. warning) end;
  if advdebug then Debug('withe', 'PreWarning: '.. prevwarning) end;
  if advdebug then Debug('withe', 'PushMsg : '.. pushMsg) end;
     
  setTimeout(checkOpenDW, 60*1000)
  
end --function

if (sourceTrigger["type"] == "autostart") then
  checkOpenDW()
else
  local currentDate = os.date("*t");
  local startSource = fibaro:getSourceTrigger();
end

Sehr cool! Vielen Dank dafür!

Hallo Jeep,

erstmal vielen Dank für das Script und die ganze Mühe die du dir machst. Und einen schönen 3. Advent.

Bin immer fleißig am testen ob es schon funktioniert. Bei dem 2.Update ist mir aufgefallen, das die Push Nachrichten einmal ausgelöst werden. Wenn man ein 2.Fenster öffnet kommen Sie nicht mehr. Nach Neustart der Szene wir dann keine Sensor mehr erkannt !

Bei deiner Version 0.1.3 bricht er gleich die Szene ab bei Erkennung des Außentemperatursensors ! Da will er die ID des Außentemperatursensor nicht !

Vielleicht kannst du nochmal darüber schauen. Gerne Teste ich es und gebe dir Feedback.

Hier ist die Meldung :

[DEBUG] 12:13:56: Checking is in automatic mode.
[DEBUG] 12:13:56: No outside temperature detected!
[DEBUG] 12:13:56: Please correct. Scene is canceled!

Grüße

Hallo Guido,

ich denke das Du die Temperatur nicht aus dem “Yahoo” oder “Yr” Plugin ziehst. Ist das korrekt?
Wenn ja schau dir mal im ReadMe den unteren Hinweis an. Du müsstest dann in den betreffenden Zeilen
“Temperature” mit “value” ersetzen.
Zur Zeit kann ich das nicht automatisch feststellen. Ansonsten bräuchte ich ein Auszug des Sensors
aus der api oder Typ des Sensors.

So, nächster Test ist erfolgt. Stimmt, ich hatte nicht mehr dran gedacht die “Temperature” in “value” zu setzen.

Wenn ich nun ein Fenster öffne und nicht alle Push abfrage dann kann ich nach schliessen des ersten Fensters auch gleich ein Push bekommen für das nächste Fenster. Aber wenn alle Push auf das Handy erfolgt sind, dann funktioniert es nicht mehr. Sieh dir mal mein Debug´s an.
Ein Fehler gibt es noch, wenn man bei numPushMsg = 5 einträgt, kommen nur 4.

Hier die Meldungen :
[DEBUG] 14:07:18: Checking is in automatic mode.
[DEBUG] 14:07:18: Check for open doors and windows…
[DEBUG] 14:07:18: Outside temperature is 3°C
[DEBUG] 14:07:18: Current Interval is: 1
[DEBUG] 14:07:18: 17.12.2017 Tür/Fenster seit mehr als 1 Minuten geöffnet, sende Push Nr. 1
[DEBUG] 14:08:18: 17.12.2017 ACHTUNG! Fenstersensor_Küche im Raum Wohnzimmer ist offen! Temp. = 3°
[DEBUG] 14:08:18: 17.12.2017 Tür/Fenster seit mehr als 1 Minuten geöffnet, sende Push Nr. 2
[DEBUG] 14:09:18: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:09:19: 17.12.2017 Tür/Fenster seit mehr als 1 Minuten geöffnet, sende Push Nr. 3
[DEBUG] 14:10:19: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:10:19: 17.12.2017 Tür/Fenster seit mehr als 1 Minuten geöffnet, sende Push Nr. 4
[DEBUG] 14:11:19: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:11:19: 17.12.2017 Tür/Fenster seit mehr als 1 Minuten geöffnet, sende Push Nr. 5
[DEBUG] 14:12:19: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:12:19: 17.12.2017 Tür/Fenster seit mehr als 1 Minuten geöffnet, sende Push Nr. 6
[DEBUG] 14:13:19: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:14:19: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:15:20: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:16:20: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:17:20: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:18:20: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:19:20: 17.12.2017 ACHTUNG! Fensterkontakt im Raum Arbeitszimmer Guido ist offen! Temp. = 3°
[DEBUG] 14:20:20: 17.12.2017 ACHTUNG! Terrassentürsensor_M im Raum Wohnzimmer ist offen! Temp. = 3°
[DEBUG] 14:21:20: 17.12.2017 ACHTUNG! Terrassentürsensor_M im Raum Wohnzimmer ist offen! Temp. = 3°
[DEBUG] 14:22:20: 17.12.2017 ACHTUNG! Terrassentürsensor_M im Raum Wohnzimmer ist offen! Temp. = 3°
[DEBUG] 14:23:20: 17.12.2017 ACHTUNG! Terrassentürsensor_M im Raum Wohnzimmer ist offen! Temp. = 3°
[DEBUG] 14:24:21: 17.12.2017 ACHTUNG! Terrassentürsensor_M im Raum Wohnzimmer ist offen! Temp. = 3°
[DEBUG] 14:25:21: 17.12.2017 ACHTUNG! Terrassentürsensor_M im Raum Wohnzimmer ist offen! Temp. = 3

Grüße

Gut ein Problem hätten wir geklärt - die Temperatur ist da. Hatte es vorhin vergessen,
wegen “Nach Neustart werden keine Sensoren erkannt”. Das stimmt so nicht nur ein Neustart
war nicht vorgesehen, der Trigger ist “autostart”, ergo wurde die Hauptfunktion nicht
mehr ausgeführt. Habs geändert, jetzt geht auch “other” und doppelte Szenen musste ich
jetzt abfangen also, kann man Stop und Start klicken.
Die im letzten Post gemeldeten Ungereimtheiten habe ich jetzt (hoffentlich) auch gefixt.
Vielen Dank für’s Testen und auch Dir einen schönen 3.ten Advent. Und als vorweihnachtliches
Geschenk bekommst Du gleich die Version 0.1.4 zum testen. :wink:

Changelog für Version 0.1.4:
– Kleinere Fehler im Code behoben
– Manuelles triggern erlaubt

--[[
%% autostart
%% properties
--]]

-- Scene File    : CheckDWinterval.lua
-- Purpose       : Check doors and windows at the given interval.
-- Version       : 0.1.4
-- Release Date  : 17 December 2017
-- Trigger       : autostart
-- License       : Copyleft {jeep} siio-forum

-- Either you enter all the door / window IDs in line 25, or you
-- let the script run in automatic mode. Save the line 25, so
-- you do not have to pick all the IDs again,

local sourceTrigger = fibaro:getSourceTrigger();
local Debug = function ( color, message )  
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span") )
end

local version  = '0.1.4' 
local manually = false

if manually then
   devices = {48, 122, 123, 127} --device IDs
   Debug('green', 'Checking is in manual mode.')
else  
   devices = fibaro:getDevicesId({ enabled = true, visible = true, baseType = "com.fibaro.doorWindowSensor" })
   Debug('green', 'Checking is in automatic mode.')
end 

local interval    = 10   -- Interval after which a push message  is sent.
local numPushMsg  = 5    -- number of push messages
local IDtempOut   = 243  -- IMPORTANT! ID of your outside temperatur sensor (e.g. Yahoo)
local tThreshold  = 15   -- nn° Celsius
local newInterval = 20   -- increase interval counter  
local phoneID     = {8, 20} -- mobile-IDs
local debug       = true    -- Debug messages yes/no 
local advdebug    = false   -- advanced debug

-- Don't change anything below this line.
local pushMsg = 1
local warning = 1
local counter = 0  
local prevwarning = 0

if (fibaro:countScenes()>1) then
   fibaro:debug('Only one instance!')
   fibaro:abort(); 
end

if (fibaro:getValue(IDtempOut, "Temperature")) == nil then
   Debug('red', 'No outside temperature detected!')
   Debug('red', 'Please correct. Scene is canceled!') 
   fibaro:abort() 
end    

local outsideTemp = math.floor(fibaro:getValue(IDtempOut, "Temperature"));
if outsideTemp >= tThreshold then
   interval = newInterval -- increase checking interval 
end  

function tempcheck()
  local outsideTemp = math.floor(fibaro:getValue(IDtempOut, "Temperature"));
  if outsideTemp >= tThreshold then
     interval = newInterval
  end  
  return interval
end

Debug('white', "Check for open doors and windows...")
Debug('white', "Outside temperature is " .. outsideTemp.. '°C')
Debug('green', "Current Interval is: " .. interval) 
if not debug then print('Debug is disabled.') end;

function checkOpenDW()
  local outsideTemp = math.floor(fibaro:getValue(IDtempOut, "Temperature"));
  local currentDate = os.date("*t");
  local datum = os.date("%d.%m.%Y")
  counter = counter + 1
  local devopen = 0
  for id = 1, #devices do
     local deviceType = fibaro:getType(devices[id] )
     if (deviceType == 'com.fibaro.windowSensor' or deviceType == 'com.fibaro.doorSensor') then
       if (tonumber(fibaro:getValue(devices[id], 'value')) == 1) then
          local name  = fibaro:getName(devices[id])
          local room  = fibaro:getRoomNameByDeviceID(devices[id])
          devopen = devopen + 1
          status  = " ACHTUNG! " ..name.. " im Raum " ..room.. " ist offen! Temp. = " .. outsideTemp.."°"
          if debug then Debug('yellow',datum .. status) end;
          warning = warning + 1
       end
     end
          
     if (warning == prevwarning and warning > 0) then
         -- Tür wurde geschlossen
         warning = 1
         counter = 1
         prevwarning = 0
         pushMsg = 0; 
         if debug then Debug('green', 'Alle Türen und Fenster sind geschlossen.') end;
     end     
     -- Keine Tür geöffnet, Zähler beginnt von vorn 
     if (warning == 0) then 
         counter = 1;
         prevwarning = 0;
         pushMsg = 0; 
     end
      
     -- Tür wurde geöffnet und wieder geschlossen, Warnungen werden zurückgesetzt   
     if (counter > interval+1 and warning > 0) then 
         counter = 1;
         warning = 1;
         prevwarning = 0;
     end 
  end --for
    
  prevwarning = prevwarning +1  
  -- Tür/Fenster mehr als Interval-Min. offen. Meldung schicken 
  if counter > interval then
     if (devopen > 1) then
        status = status .. ' und '.. devopen .. 'andere.'
     end
     if pushMsg <= numPushMsg then
        Debug('red',datum .. ' Tür/Fenster seit mehr als '.. interval ..' Minuten geöffnet, sende Push Nr. '..pushMsg)
        pushMsg = pushMsg + 1
      for k=1, #phoneID do
          if phoneID[k] ~= nil then
             fibaro:call(phoneID[k], 'sendPush', status )
          end
        end --for
     end
     
     warning = 1
     counter = 1
     prevwarning = 0
     interval = tempcheck()
  end 
  
  if advdebug then Debug('withe', 'Counter: '.. counter) end;
  if advdebug then Debug('withe', 'Warning: '.. warning) end;
  if advdebug then Debug('withe', 'PreWarning: '.. prevwarning) end;
  if advdebug then Debug('withe', 'PushMsg : '.. pushMsg) end;
     
  setTimeout(checkOpenDW, 60*1000)
  
end --function

if (sourceTrigger["type"] == "autostart") then
  checkOpenDW()
else
  local currentDate = os.date("*t");
  local startSource = fibaro:getSourceTrigger();
  checkOpenDW()
end