@Martin, Du kannst doch diese Fenster in der Variablen ‘ignoredev’ eintragen. Somit bleiben die Türen geschützt. Auch wenn man im 8-ten Stock wohnt will, man sicher sein das die Tür zu ist. Oder ich hab Dein Anliegen noch nicht verstanden.
Grundsätzlich sollen die Fenstersensoren ja funktionieren, aber ab einer bestimmten Temperatur kein Push senden. Sonst bleibt nur manuell im Sommer die Fenster rauszunehmen, wo ich erst einmal aufgrund der Außentemperatur kein Push will, um sie dann wenn wieder kälter draußen, wieder reinzunehmen.
Oder besteht die Möglichkeit einzustellen, dass ich ab einer bestimmten Temperatur kein Push will, weil Fenster aufgrund der Temperatur sowieso ganzen Tag z.B. offen ist.
@Martin, OK, ich habe fast befürchtet das Du dass meinst. Es gibt da mehrere Sichtweisen. Sinn und Zweck des scripts ist es ja zu alarmieren wenn Fenster oder Türen zu lange auf sind. Viele machen im Sommer auf jeden Fall die Fenster und Rollläden zu, um die Bullenhitze draußen zu halten. Erst ab ca 22:00 - 23:00 Uhr wird dann gelüftet.
Andere kühlen die Räume mit einer Klimaanlage. Für die wäre es kontraproduktiv wenn da keine Push käme.
Du kannst auch einige Fenster in der Variablen ‘excludedev’ setzen. Für die wird im angegebenen Zeitraum keine Push verschickt. Es ist ja schon selten dass hierzulande die Temperaturen nachts über 22° liegen. Eventuell kannst Du damit leben.
Für mich ist es kein Problem Dein Anliegen zu implementieren, dass dauert max. 10 Min. Trotzdem sehe ich darin ein Sicherheitsrisiko wenn man das Haus verlässt und Dutzend Fenster oder Türen offen stehen und keine push kommt.
Kann ich natürlich nachvollziehen. Ich werde am besten erst einmal Sommer abwarten und schauen wie es läuft. Jedoch ist es bei uns keine Seltenheit, dass Fenster über Nacht offen stehen oder bei angenehmen Temperaturen ganzen Tag offen sind. Wenn meine Frau dann ständig Push bekommt, ist das schon wieder koontraproduktiv für den “Nutzen” des Smarthomes. ^^
Gegebenfalls kann ich, denke ich mal, immer noch „local newInterval" auf einen Tag stellen oder ähnlich.
@martin
gute Idee auf den Sommer zu warten und mit newinterval probieren. Damit Deine Frau nicht mit Pushs geflutet wird, kannst Du die Anzahl der push auf 1 stellen und die Wiederholung (pushagain) auf z.B. 10 Std. (10 * 3600) stellen. Das wäre noch einfacher aber nicht sicherer. Vielleicht wird eine Kombination aus allen eine Lösung für Dich ergeben.
Guten Abend/Morgen Jeep, habe heute auch mal kurz vor 24Uh und kurz danach getestet. Dein Skript läuft bei mir sauber bis 24 Uhr und danach scheint die Uhr (die Periodenzeit nicht mehr zu funktionieren)
Ich habe die Zeiten:
local begPeriod = “21:30” – During this period, no check is performed on the
local endPeriod = “6:30” – sensors contained in the variable “excludedev”.
…da ich halt gerne Nachts lüfte. von 21:30 Uhr bis 24Uhr meldet das Fenster auch nicht, aber ab 24Uhr gehts los (siehe Anhang !)
Ich habe dann die Scene um 0:05:24 Uhr nochmals gestartet, aber wie man sehen kann startet der Check.
Vielleicht kannst du daran noch was ändern?
mfg smg2274
Hi Sven,
ja da hast Du recht. Ich hatte es aber auch nicht vorgesehen dass es über die Datumsgrenze hinweg geht. Leider habe ich das nicht dokumentiert.
Aber mit diesem kleinen workaround sollte Dein Problem gelöst werden können.
Ersetze in der function excludecheck (Zeile 65) die if Abfrage durch diese:
if (os.date("%H:%M", os.time())) > begPeriod and (os.date("%H:%M", os.time())) < endPeriod
or (os.date("%H:%M", os.time())) > "00:00" and (os.date("%H:%M", os.time())) < "06:30" then
Kannst ja die Werte für Dich anpassen.
Hier ist eine neue Version die einen Fehler mit der Steuerung der Variablen “newInterval” behebt.
Changelog für Version: 0.2.3
– Bugfix, die Variable newInterval wurde erhöht, der Wert bei gefallenen Temperaturen aber beibehalten. Ist gefixt.
--[[
%% autostart
%% properties
--]]
-- Scene File : CheckDWinterval.lua
-- Purpose : Check doors and windows at the given interval.
-- Version : 0.2.3
-- Release Date : 15 February 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.3'
local manually = false
if manually then
devices = {48, 122, 123, 127} --enter your device IDs here
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 the first 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 = {123,259,360} --This device(s) are exclcuded temporary from check
local ignoredev = {} -- This devices are never checked
local begPeriod = "08:00" -- During this period, no check is performed on the
local endPeriod = "20:15" -- sensors contained in the variable "excludedev".
local TempOutType = 'Temperature' --IMPORTANT 'Temperature' or 'value'
local tThreshold = 17 -- nn° Celsius
local newInterval = 15 -- minutes to increase interval counter
local phoneID = {8, 20} -- mobile-IDs
local debug = false -- 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 allowed!')
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
local 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
local function ignorecheck(ignoredev, devid)
for i=1,#ignoredev do
if ignoredev[i] == devid then
return true
end
end --for
return false
end
local function tempcheck()
local outsideTemp = tonumber( fibaro:getValue(IDtempOut, TempOutType));
local stringTemp = string.format("%.2f", outsideTemp)
if outsideTemp >= tThreshold then
currInterval = newInterval
else
currInterval = interval
end
return stringTemp, currInterval
end
local outsideTemp = tempcheck()
Debug('white', "Check for open doors and windows... Version ".. version)
Debug('white', "Outside temperature is " .. tempcheck() .. '°C')
Debug('green', "Current Interval is: " .. currInterval)
if not debug then print('Debug is disabled.') end;
function checkOpenDW()
local outsideTemp,curInterval = 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
and ignorecheck(ignoredev,devices[id]) ~= true then
devopen = devopen + 1
status = " ACHTUNG! " ..name.. " im Raum " ..room.. " ist offen! Temp. = " .. outsideTemp.."°"
Debug('yellow',datum .. status)
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 > currInterval+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 > currInterval then
if (devopen > 1) then
status = status .. ' Total: '.. devopen
end
if pushMsg <= numPushMsg then
Debug('red',datum .. ' Tür/Fenster seit mehr als '.. curInterval ..' 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
Danke dir, werde es versuchen!
Hallo zusammen,
es gibt eine neuere Version des Scripts. Durch eine kleine Änderung bei der Behandlung der Variablen ‘newInterval’ ist das Verschieben des Meldungsintervalls ein wenig intelligenter geworden. Es wird jetzt automatisch auf steigende oder fallenden Temperaturen reagiert.
Bitte das PDF beachten wo die Variable nochmal mit der neuen Funktion beschrieben ist.
Changelog für Version 0.2.4
– Behandlung der Variablen ‘newInterval’ geändert.
--[[
%% autostart
%% properties
--]]
-- Scene File : CheckDWinterval.lua
-- Purpose : Check doors and windows at the given interval.
-- Version : 0.2.4
-- Release Date : 30 Jul. 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 manually = false
if manually then
devices = {48, 122, 123, 127} --enter your device IDs here
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 the first 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 = {123,202,259,360} --This device(s) are exclcuded temporary from check
local ignoredev = {205} -- This devices are never checked
local begPeriod = "08:00" -- During this period, no check is performed on the
local endPeriod = "20:15" -- sensors contained in the variable "excludedev".
local TempOutType = 'Temperature' --IMPORTANT 'Temperature' or 'value'
local tThreshold = 15 -- nn° Celsius
local newInterval = 5 -- minutes to increase or decrease interval counter
local phoneID = {8, 20} -- mobile-IDs
local debug = false -- Debug messages yes/no
local advdebug = false -- advanced debug
-- No changes needed below this line.
local version = '0.2.4'
local pushMsg = 1
local warning = 1
local counter = 0
local prevwarning = 0
if (fibaro:countScenes()>1) then
fibaro:debug('Only one instance allowed!')
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
local function excludecheck(excludedev, devid)
if (os.date("%H:%M", os.time())) > begPeriod and (os.date("%H:%M", os.time())) < endPeriod then
-- workaround for checking time after midnight
-- or (os.date("%H:%M", os.time())) > "00:00" and (os.date("%H:%M", os.time())) < "06:30" then
for i=1,#excludedev do
if excludedev[i] == devid then
return true
end
end --for
end
return false
end
local function ignorecheck(ignoredev, devid)
for i=1,#ignoredev do
if ignoredev[i] == devid then
return true
end
end --for
return false
end
local function tempcheck()
local outsideTemp = tonumber( fibaro:getValue(IDtempOut, TempOutType));
local stringTemp = string.format("%.2f", outsideTemp)
if outsideTemp > tThreshold then
currInterval = interval + newInterval
elseif outsideTemp < tThreshold then
currInterval = interval - newInterval
else
currInterval = interval
end
if (currInterval < 5) then
currInterval = 5
end
return stringTemp, currInterval
end
local outsideTemp = tempcheck()
Debug('white', "Check for open doors and windows... Version ".. version)
Debug('white', "Outside temperature is " .. tempcheck() .. '°C')
Debug('green', "Current Interval is: " .. currInterval)
if not debug then print('Debug is disabled.') end;
function checkOpenDW()
local outsideTemp,curInterval = 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
and ignorecheck(ignoredev,devices[id]) ~= true then
devopen = devopen + 1
status = " ACHTUNG! " ..name.. " im Raum " ..room.. " ist offen! Temp. = " .. outsideTemp.."°"
Debug('yellow',datum .. status)
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 > currInterval+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 > currInterval then
if (devopen > 1) then
status = status .. ' Total: '.. devopen
end
if pushMsg <= numPushMsg then
Debug('red',datum .. ' Tür/Fenster seit mehr als '.. curInterval ..' 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
Danke dir @Jeep.
Werde auch dieses testen. Kann man auch dieses kleine Programm mit da ein bringen, bzw. die Variablen um Empfindlichkeiten zu steuern? Dieses nutze ich für meine Heiztherme, um einfach andere Heizkurven zu schalten.
--[[
%% autostart
%% properties
%% weather
Temperature
%% events
%% globals
--]]
local sommertemp = 17 --Sommertemperatur >= 18
local wintertemp = 8 --Sommertemperatur <= 13
function Debug( color, message )
fibaro:debug(string.format('<%s style="color:%s;">%s<!--%s-->', "span", color, message, "span"));
end
local startSource = fibaro:getSourceTrigger();
if
(( tonumber(api.get('/weather')['Temperature']) >= tonumber(sommertemp) or
tonumber(fibaro:getValue(250, "value")) >= sommertemp ) or startSource["type"] == "other") then
fibaro:setGlobal("Jahreszeit", "Sommer")
Debug("gold",'setze Jahreszeit auf Sommer')
elseif
(( tonumber(api.get('/weather')['Temperature']) <= tonumber(wintertemp) or
tonumber(fibaro:getValue(250, "value")) <= wintertemp ) or startSource["type"] == "other") then
fibaro:setGlobal("Jahreszeit", "Winter")
Debug("cyan",'setze Jahreszeit auf Winter')
else
fibaro:setGlobal("Jahreszeit", "Herbst");
Debug("orange",'setze Jahreszeit auf Frühling bzw. Herbst')
end
Hi Sven,
habe mir den Code oben angeschaut. Ich weiß nicht ob Du Dir einen eigenen Wetter-Provider erstellt hast, oder ob Du die Temperatur von Yahoo oder Yr-Wetter nimmst. Dein Script wird durch die Temperatur getriggert und meins prüft minütlich eine Veränderung der Fenster- oder Türposition. Daher fände ich es nicht so gut minütlich den gleichen Wert in der globalen Variable zu aktualisieren.
Ich würde an Deiner Stelle so wie so die Abfragen erweitern, also mit fibaro:getGlobalValue(‘Jahreszeit’) abfragen ob der richtige Wert schon drin steht und wenn ja, die Globale Variable nicht mehr aktualisieren.
Hallo Jeep, ich bin aber leider keine so Programmierkanone wie du, aber lerne gerne dazu. Ich nutze die Temperatur vom HC selber (wahrscheinlich von Yahoo ?!? ) und einen Türkontakt im Briefkasten, der vor Sonne geschützt im Norden sitzt. Das Skript triggert so zwischen 5-15 Minuten durch Änderung der Temperatur. Wenn du für mein Skript Erweiterungen hast, nehme ich die gerne…danke Sven
Hi Sven,
hab mal Deinen Code so umgestaltet wie ich es für richtig halte.
Kannst ja mal Testen ob es passt.
EDIT: Natürlich noch die ID des Sensors wieder rauf Deine umstellen.
Hallo,
die Szene (Version: 0.2.4) funktioniert soweit TOP nur… ich bekomme die Puschnachrichten ständig ohne Berücksichtigung von Außentemperatur
Soll die Scene nicht die Nachricht schicken nur wenn kälter als 15° ist?
Danke und Gruß,
Gregor
Hi @Gregor,
die Temperatur wird nur verwendet um das Meldungsinterval zu verlängern oder kürzen. Die Push Nachricht wird immer geschickt wenn ein Fenster über den Intervall hinaus geöffnet ist. Neben der Lüftung für Sommer und Winter, soll ja auch der Sicherheitsaspekt berücksichtigt werden.
Hallo Jeep, ich habe jetzt Deine open Door Ver. 0.2.4 auch bei mir am laufen. Funktioniert einwandfrei.
Mich würde nur mal so von den Usern, nach ca. 1 Jahr testen interessieren, welche Parameter ja von Fall zu Fall anzupassen sind bei den meisten sich als praktikabel ergeben haben.
local interval = XX – Interval after which the first push message is sent.
local numPushMsg = X – number of push messages
local pushAgain = XX – Activate pushMsg again after specified time.
local IDtempOut = XX – IMPORTANT! ID of your outside temperatur sensor (e.g. Yahoo)
local begPeriod = “08:00” – During this period, no check is performed on the
local endPeriod = “20:15” – sensors contained in the variable “excludedev”.
local TempOutType = ‘Temperature’ --IMPORTANT ‘Temperature’ or ‘value’
local tThreshold = XX – nn° Celsius
local newInterval = X – minutes to increase or decrease interval counter
local debug = false – Debug messages yes/no
local advdebug = false – advanced debug
Ich finde Jeep du machst eine sehr gute Programmierarbeit.
Ciao
Hallo Jeep, bin grad immer noch am Testen, dabei ist mir (meiner Frau) aufgefallen, das wenn wir Zuhause sind ( Am WE) sie ja ständig Push Meldungen erhält, wenn Fenster, Türen geöffnet sind.
Könnte man das Programm noch so weit erweitern, das man an Wochentagen, wo man Zuhause ist ( meist eben Sam/Son) keine Pushmeldungen erhält.
Oder habe ich das Türen/Fenster Skript falsch verstanden, für welchen Einsatzzweck dies gedacht ist.
die neueste Version (0.2.5) des Scripts gibt es hier
Bitte beachte auch das angehängte PDF mit der Erklärung der Variablen. Dann verstehst Du auch die Push-Meldungen und wie Du den mehrfachen Erhalt der Meldungen drosseln oder abschalten kannst.
Und wenn Du Dein Haus verlassen willst und trotzdem was offen bleiben soll, dann auch die Variablen ‘excludev’ und ‘ignoredev’ beachten.
Hallo Jeep, danke, habe mir natürlich gleich die neueste 0.2.5 aufgespielt und bin am testen. Gibts die nur in der englischen Version, oder habe ich nur nicht die deutsche Version gefunden?
Ja, die excludev und ignordev habe ich jetzt auch befüllt. Klappt sehr gut.
Hallo Zusammen,
nachdem der Beitrag offensichtlich noch “lebt” (letzter Eintrag 19.8.19) versuch ich mein Glück.
Aber erst mal vielen Dank für das Skript.
Was ich mir vorstelle:
In der neuen als “Fibaro Home Center” bezeichneten App hat man ja im oberen Bereich eine separate Übersicht wie viele Türen und wie viele Fenster (zb offene Türen: 1/4) offen sind. Aber dazu muss ich die App aufrufen und die Icons auswählen.
Mir schwebt jetzt ein Widget vor dass mir auf einen Blick anzeigt ob ein Sensor (von den ausgewählten IDs) offen anzeigt, das Widget wird dann rot bzw, wenn alles zu ist bleibt es grün.
Wäre vermutlich am einfachsten zu lösen wenn das Skript eine öffentlich Variable setzt und diese Variable vom Widget abgefragt wird?
Oder hat jemand eine bessere Idee?
Gruß
Gerhard