Hallo zusammen, gerne möchte ich die Öffnungszeiten der Tür- Fenstersensoren protokollieren. Weil es ab und zu vorkommt das ein Sensor „hängen bleibt“. Vorgesehen ist wenn die Öffnungszeiten grösser als 30 Min. sind, dass dies per Mail und im Debug erscheint.
Habe ein Script geschrieben, finde aber nicht heraus warum die Protokollierten Zeiten angegeben werden! Vielleicht könnte sich jemand das beigelegte Script mal zur Brust nehmen Vielen Dank…
--[[
%% properties
260 value
263 value
275 value
605 value
608 value
611 value
614 value
617 value
%% globals
--]]
-- Öffnungszeiten werden falsch angezeit!!
if (fibaro:countScenes()>1) then fibaro:abort() end -- lösche doppelte Szenen
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
SceneID = __fibaroSceneId
local currentDate = os.date("*t");
local currentTime = os.clock()
local trigger = fibaro:getSourceTrigger()
local DeviceID = tonumber(trigger['deviceID'])
local DeviceValue = tonumber(fibaro:getValue(DeviceID, "value"))
local DeviceName = fibaro:getName(DeviceID)
local DeviceRoom = fibaro:getRoomNameByDeviceID(DeviceID)
local windowOpenTime = 0
--fibaro:sleep(20000) -- 20 Sekunden
--local DeviceValue = tonumber(fibaro:getValue(DeviceID, "value"))
-- Lösche doppelte Szene(n)
if (fibaro:countScenes()> 1)
then
--fibaro:debug("Es läuft mehr als eine Instanz");
fibaro:abort();
end
if (DeviceValue > 0)
then
windowOpenTime = os.time()
Debug("lightblue",(os.date("%d.%m.%Y - "..DeviceRoom.." - "..DeviceName.." wurde geöffnet")))
--fibaro:call(2, "sendEmail", "Fenster und Türen Status ("..SceneID..")",""..DeviceRoom.." "..DeviceName.." wurde geöffnet")
elseif
(DeviceValue < 1) --and windowOpenTime > 0)
then
local windowCloseTime = os.time()
local windowOpenDuration = windowCloseTime - windowOpenTime
local hours = math.floor(windowOpenDuration / 3600)
local minutes = math.floor((windowOpenDuration % 3600) / 60)
local seconds = windowOpenDuration % 60
local closeTimeFormatted = os.date("%d.%m.%Y %H:%M:%S", windowCloseTime) -- Formatierung der Schließzeit
Debug("grey",(os.date("%d.%m.%Y - "..DeviceRoom.." - "..DeviceName.." wurde geschlossen. Fenster war für "..hours.." Stunden, "..minutes.." Minuten und "..seconds.." Sekunden geöffnet bis "..closeTimeFormatted)))
--fibaro:call(2, "sendEmail", "Fenster und Türen Status ("..SceneID..")",""..DeviceRoom.." "..DeviceName.." wurde geschlossen. Fenster war für "..hours.." Stunden, "..minutes.." Minuten und "..seconds.." Sekunden geöffnet bis "..closeTimeFormatted)
windowOpenTime = 0 -- Zurücksetzen der Zeitmarke
end
man müsste diese Zeit im then-Teil irgendwo (in einer globalen Var. oder in einem Label eines VD’s) aufschreiben und dann wieder auslesen,
und das für jeden der Sensoren, da bietet sich eine Tabelle an.
Hallo pblacky
Das Ziel sollte sein: Fenster Öffnungszeiten im Debug ausgeben, wenn Fenster / Tür länger als 30 Min offen dann Mail vom jeweiligen Fenster / Tür und der Öffnungszeit an mich. Danke pblacky, LG fastsnake
In deinem Beispiel ist mir aufgefallen, dass du eine Schleife mit
if
then
elsif
then
drinnen hast, ich bin zwar nicht sicher aber das letzte „then“ müsste eigentlich als „else“ in der schleife sein, wenn ich das richtig verstanden hab!
Aber vielleicht hat jemand von den LUA Spezialisten da einen Tipp für dich…
Ich habe mir ein ähnliches Skript gebaut, allerdings OHNE Zeitschleife.
Habs dir angehängt, vielleicht hilft es…
--[[
%% properties
354 value
357 value
865 value
%% globals
--]]
if (fibaro:countScenes()>5) then fibaro:abort() end -- lösche doppelte Szenen
Debug = function ( color, message ) fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span")) end
SceneID = __fibaroSceneId
local trigger = fibaro:getSourceTrigger()
local DeviceID = tonumber(trigger['deviceID'])
local DeviceValue = tonumber(fibaro:getValue(DeviceID, "value"))
local DeviceName = fibaro:getName(DeviceID)
local DeviceRoom = fibaro:getRoomNameByDeviceID(DeviceID)
fibaro:sleep(20000) -- 20 Sekunden
local DeviceValue = tonumber(fibaro:getValue(DeviceID, "value"))
if (DeviceValue > 98) then
Debug("lightblue",(os.date("%d.%m.%Y - "..DeviceRoom.." - "..DeviceName.." wurde geöffnet")))
fibaro:call(2, "sendEmail", "Fenster und Jalousien Status ("..SceneID..")",""..DeviceRoom.." "..DeviceName.." wurde geöffnet")
elseif (DeviceValue < 12) then
Debug("grey",(os.date("%d.%m.%Y - "..DeviceRoom.." - "..DeviceName.." wurde geschlossen")))
fibaro:call(2, "sendEmail", "Fenster und Jalousien Status ("..SceneID..")",""..DeviceRoom.." "..DeviceName.." wurde geschlossen")
else
Debug("orange",(os.date("%d.%m.%Y - "..DeviceRoom.." - "..DeviceName.." ist auf " ..DeviceValue.." Prozent")))
fibaro:call(2, "sendEmail", "Fenster und Jalousien Status ("..SceneID..")",""..DeviceRoom.." "..DeviceName.." ist auf "..DeviceValue.." Prozent")
end
für LUA-Fans: ISBN 978-3-95539-020-4 Programmieren in LUA von Herrn Jerusalimschy
(so steht’s in meiner 3, Auflage von 2013)
es steht viel zu viel drin, aber ich schaue immer wieder nach, man kann viel entdecken
LUA ist eine sehr schöne Programmiersprache,
aber es braucht Zeit und viele ‚Versuche‘ …
Vielen Dank, die Basis habe ich einmal kopiert und von da aus weiter bearbeitet! Wusste nicht das diese von Dir ist, vielen Dank. Die Endlösung scheint komplizierter zu sein. Vielleicht ergibt sich doch noch eine funktionierende Variante eines LUA Spezis. Allen einen schönen 1. Advent. LG fastsnake