Hallo zusammen,
und erstmal allen ein gesundes Neues Jahr. Es gibt ein Update für das CheckDWIntervall Script. Meine Frau war mit einigen Funktionen noch nicht ganz zufrieden, deshalb habe ich die Zeit genutzt und noch ein paar Dinge hinzugefügt.
Was wurde in dieser Version geändert? Die Temperaturausgabe wird jetzt mit 2 Nachkommastellen angezeigt. Es gibt eine neue Variable ‘pushAgain’ in der man die Pushnachrichten nach einer einstellbaren Zeit wieder aktivieren kann. So geraten offene Fesnter nicht ganz in Vergessenheit.
Außerdem wurde die Variable ‘excludedev’ eingeführt und eine Funktion hinterlegt in der man Geräte von der Prüfung ausnehmen kann.
Und damit auch diese Geräte nicht in Vergessenheit geraten, wurden noch 2 Variablen für einen Zeitraum hinzugefügt. Außerhalb des Zeitraums wird dann wieder geprüft so das nächtens keine Tür oder Fenster offen bleibt.
Und natürlich wurde das Readme für die neuen Variablen aktualisiert.
Changelog für Version 0.2.1
– Temperaturausgabe mit 2 Nachkommastellen
– Neue Variable pushAgain, aktiviert wieder die Pushmeldungen nach einstellbarer Zeit.
– Neue Variable und Function excludedev, hier kann man Geräte von der Prüfung ausnehmen.
– Neue Variablen begPeriod und endPeriod, Zeitraum in dem keine Prüfung der Geräte die in der Variablen ‚excludedev‘ hinterlegt sind erfolgt.
– Den Code an einigen Stellen optimiert.
--[[
%% autostart
%% properties
--]]
-- Scene File : CheckDWinterval.lua
-- Purpose : Check doors and windows at the given interval.
-- Version : 0.2.1
-- Release Date : 03 January 2018
-- Trigger : autostart
-- License : Copyleft {jeep} siio-forum
-- Either you enter all the door / window IDs in line 26, or you
-- let the script run in automatic mode. Save the line 26, 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.2.1'
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 runs in automatic mode.' )
end
local interval = 10 -- Interval after which a push message is sent.
local numPushMsg = 3 -- number of push messages
local pushAgain = 3600 -- Activate pushMsg again after specified time.
local IDtempOut = 243 -- IMPORTANT! ID of your outside temperatur sensor (e.g. Yahoo)
local excludedev = {259,360} --This device(s) are exclcuded from check
local begPeriod = "08:00" -- During this period, no check is performed on
local endPeriod = "18:30" -- the sensors contained in the variable "excludedev".
local TempOutType = 'Temperature' --IMPORTANT 'Temperature' or 'value'
local tThreshold = 15 -- nn° Celsius
local newInterval = 15 -- 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('Run only one instance!')
fibaro:abort();
end
if (fibaro:getValue(IDtempOut, TempOutType)) == nil then
Debug('red', 'No outside temperature detected!')
Debug('red', 'Please correct. Scene is canceled!')
fibaro:abort()
end
function excludecheck(excludedev, devid)
if (os.date("%H:%M", os.time())) > begPeriod and (os.date("%H:%M", os.time())) < endPeriod then
for i=1,#excludedev do
if excludedev[i] == devid then
return true
end
end --for
end
return false
end
function tempcheck()
local outsideTemp = tonumber( fibaro:getValue(IDtempOut, TempOutType));
stringTemp = string.format("%.2f", outsideTemp)
if outsideTemp >= tThreshold then
interval = newInterval
end
return stringTemp
end
local outsideTemp = tempcheck()
Debug('white', "Check for open doors and windows... Version ".. version)
Debug('white', "Outside temperature is " .. stringTemp.. '°C')
Debug('green', "Current Interval is: " .. interval)
if not debug then print('Debug is disabled.') end;
function checkOpenDW()
local outsideTemp = tempcheck()
local currentDate = os.date("*t");
local datum = os.date("%d.%m.%Y")
counter = counter + 1
local devopen = 0
for id = 1, #devices do
if (tonumber(fibaro:getValue(devices[id], 'value')) == 1) then
local name = fibaro:getName(devices[id])
local room = fibaro:getRoomNameByDeviceID(devices[id])
if excludecheck(excludedev, devices[id]) ~= true then
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 = 1;
end
if (warning == 0) then
-- Keine Tür geöffnet, Zähler beginnt von vorn
counter = 1; prevwarning = 0; pushMsg = 1;
end
if (counter > interval+1 and warning > 0) then
-- Tür wurde geöffnet und wieder geschlossen, Warnungen werden zurückgesetzt
counter = 1; warning = 1; prevwarning = 0; pushMsg =1;
end
end --for
if devopen == 0 then
counter = 1; warning = 1; prevwarning = 0; pushMsg =1;
if debug then Debug('green', 'Alle Türen und Fenster geschlossen.') end;
end
prevwarning = prevwarning +1
-- Tür/Fenster mehr als Interval-Min. offen. Meldung schicken
if counter > interval then
if (devopen > 1) then
status = status .. ' Total: '.. devopen
end
if pushMsg <= numPushMsg then
Debug('red',datum .. ' Tür/Fenster seit mehr als '.. interval ..' Minuten geöffnet, sende Push Nr. '..pushMsg)
status = status .. ',Push-Nr.: ' .. pushMsg
if pushMsg == numPushMsg then status = status ..' Letzte!' end
pushMsg = pushMsg + 1
uxtime = os.time(dt);
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
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;
if pushMsg > numPushMsg and (os.time() - uxtime) > pushAgain and pushAgain > 0 then
pushMsg = 1
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