Und noch ein Batterie check scipt

Echt klasse was du da machst.
Ich werde es morgen testen.

Danke gringo

Moin Jeep,

hab grad mal das Script getestet. Ich bekomme allerdings keine Mail. Im Debug Fenster werden alle Geräte bis auf den ZME Wallc-s angezeigt.
Ich habe die userID auf 2 gelassen. Ein anderes Batterie Script läuft mit der Einstellung.

Grüße
gringo

Hi,

der Mailversand ist einmal pro Woche eingestellt, Variable checkday = 1 , bedeutet am Sonntag. Willst Du die Mail heute haben, musst du checkday = 6 setzen. Dies damit man nicht bei jedem manuellen Start eine Mail bekommt. Man sieht das Ergebniss ja im Debug-Fenster. Gecheckt wird trotzdem jeden Tag und im Fehlerfall kommt ja die Push-Meldung.
WEnn der ZME WALLc-s nicht angezeigt wird, kannst Du bei dem Gerät eine Softrekonfiguration versuchen, dann sollte es tun.

Ok. Danke.
Werde ich testen.

Grüße
Gringo

so, ich wollte ja zum Wochenende ein eigenes Script zum checken von dead devices liefern, aber
beim genaueren Hinsehen habe ich festgestellt das ich fast zu 90% den gleichen Code brauche.
Also habe ich alles im jetzigen Script reingepackt. Viel größer ist es nicht geworden.
Man könnte das script jetzt schon fast als “Health check” script bezeichnen da ja jetzt alle
devices irgendwie geprüft werden.
Werden “dead devices” erkannt, wird für jedes dead device eine Push Meldung verschickt und
alle als tot erkannten Geräte werden am Ende der Mail zusammengefasst.
Die Beschränkung von einer Mail pro Woche ist aufgehoben. In der Variable “days”, kann man
die gewünschten Tage eintragen an denen eine Mail verschickt werden soll.

Im Ergebnis sieht meine letzte Mail so aus(wenn 20 devices per Mail eingestellt sind):

  1. Garagentor (Garage) 82 % OK
  2. KeyFob1 (Buero) 37 % Warning
  3. BM Buero (Buero) 100 % OK
    Checked on: Sat Jun 24 17:17:40 2017
    23 battery devices were checked.

Alert! device Küchenfenster - Device is dead!
Alert! device ZStecker Bügeleisen - Device is dead!
66 non battery devices checked.

Den Zwischenstecker Bügeleisen hab ich natürlich zur Simulation ausgesteckt.

Changelog für Version 0.8.1
– geänderter Mailversand
– die Variable “checkday” wurde entfernt
– neue Variable(Tabelle) “days” hinzugefügt
– neue Funktion hinzugefügt
– kleinere Codeoptimierungen

Und hier das neue Script:

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

-- file:    Batterystatus.lua 
-- version: 0.8.1
-- purpose: This script checks the batteries and sends reports via 
-- email. Since version 0.6.1 and higher: The script also performs a check on
-- non battery devices and reports all devices marked as dead by HC2.
-- The batterie status is checked daily and several reports per week can be
-- emailed.
-- For batteries that are almost empty, or a dead device is recognized,
-- a push messages will be sent immediately.
-- A manual check is possible at any time. Simply press the Start button.
-- Copyleft 03-2017 {jeep}

local sourceTrigger = fibaro:getSourceTrigger();
local version   = "0.8.2"
local oldnodeId = nil ;
local subject   = "Battery status";
local userId    = 2      -- primary email address
local devpEmail = 20     -- devices per email
local days      = {1,3,6,7} --  1=Sunday, 2=Monday, 3=Tuesday ...7=Saturday
local pushactiv = true;   -- true = sendpush notification
local phoneID   = {13}    -- phone IDs for push notification
local checktime = "19:15" -- At this time the script runs
local full      = 100 --between 50 and 100 the battery status is assumed to be good
local warning   = 50  --between 30 and 50 battery is running low
local critical  = 30  --below 30 battery status is asumed as critical
local empty     = 255 --probably a completely empty battery

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

local function contains(days, val)
   for i=1,#days do
      if days[i] == val then 
         return true
      end
   end
   return false
end

function sendPush(text)
 if (phoneID[1] ~= nil) then
   for i=1, #phoneID do
      if phoneID[i] ~= nil then
        fibaro:debug('Versende Push an ID ' ..phoneID[i])
        fibaro:call(phoneID[i],'sendPush', text)
      end
   end
 end
end

function useremail(userId,subject,status)
  fibaro:call(userId, "sendEmail", subject, status)
  --fibaro:call(5, "sendEmail", subject, status)  
  status = ' ';
    print('Mail gesendet')
end  

devices = fibaro:getDevicesId({visible = true, enabled = true, })
function checkBatteries() 
  status  = '' ;
  vstatus = '';
  local n = 0;
  local v = 0;
  Debug('withe', os.date('%c')..', Version: '.. version );
  for id = 1, #devices do
    local batteryLevel = fibaro:get(devices[id], 'batteryLevel')
    local nodeId       = fibaro:get(devices[id], 'nodeId') 
    local isdead       = fibaro:get(devices[id], 'dead')
    if batteryLevel ~= nil and nodeId ~= nil and batteryLevel ~= '' then
       local name   = fibaro:getName(devices[id]) 
       if oldnodeId ~= nodeId then
          local room = fibaro:getRoomNameByDeviceID(devices[id]) 
          if not(room == "unassigned") then
             n = n+1
             if tonumber(batteryLevel) >= warning and tonumber(batteryLevel) <= full then
        	Debug('green', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' % OK') 
                status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % OK\n';
             elseif
               tonumber(batteryLevel) >= critical and tonumber(batteryLevel) <= warning then
               Debug('yellow', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' % Warning') 
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % Warning\n';
             elseif 
               tonumber(batteryLevel) < critical  then 
               Debug('red', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' %') 
               if pushactiv then           
                  sendPush('Batterie: '.. name ..' in room '.. room ..' '.. batteryLevel..'%.')
               end
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % Critical\n';
             elseif
               tonumber(batteryLevel) > full or tonumber(batteryLevel) == empty then 
               Debug('red', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' % probably empty!') 
               if pushactiv then           
                  sendPush('Batterie: '.. name ..' in room '.. room ..' '.. batteryLevel..'%.')
               end
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % Error\n';
             end
             if tonumber(isdead) == 1 then
                Debug('red', "Battery " ..name..' ('..room..') - Device is dead!') 
                status = status .. 'Alert! ' .. name..' ('..room..') - Device is dead \n';
                vstatus = vstatus .. 'Alert! ' .. 'device '.. name ..' - Device is dead! \n';   
                sendPush(name ..' in room '.. room ..' '.. batteryLevel..'%. Device is dead!')
             end              
             if (n % devpEmail == 0) and oldNodeId == nodeID 
                then
                if contains(days, weekday) then
                   useremail(userId,subject,status)
                   fibaro:debug(status)
                   status = ' '
                   fibaro:sleep(500)
                end
             end  
          end 
       end 
       oldnodeId = nodeId
    else
      v= v+1 
      local name = fibaro:getName(devices[id])  
      local room = fibaro:getRoomNameByDeviceID(devices[id])
      if tonumber(isdead) == 1 then
         Debug('red', "Device " ..name..' ('..room..') - Device is dead!') 
         vstatus = vstatus .. 'Alert! ' .. 'device '.. name ..' - Device is dead! \n';
         sendPush('Device: '.. name ..' in room '.. room .. ' - is dead!')
      end 
    end  
  end  --for
 
  status    = status .. 'Checked on: ' .. os.date('%c') ..'\n'
  status    = status ..n.. ' battery devices were checked.\n' 
  vstatus   = vstatus ..v.. ' non battery devices checked.'
  separator = '------------------------------------------------------------'
  Debug('withe', os.date('%c'));
  Debug('withe', separator)
  Debug('withe', status)
  Debug('withe', separator)
  Debug('white', vstatus)
  status = status..separator..'\n'..vstatus
  if contains(days, weekday) then
     useremail(userId,subject,status)
     status = ' '; 
  end  
end  -- function

function main()
    local currentDate = os.date("*t");
    local currenthour = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
    weekday = currentDate.wday
    local startSource = fibaro:getSourceTrigger();
    if currenthour == checktime then
	checkBatteries()
    end
    setTimeout(main, 60*1000)
end
 
if (sourceTrigger["type"] == "autostart") then
	main()
else
	local currentDate = os.date("*t");
	local startSource = fibaro:getSourceTrigger();
        weekday = currentDate.wday
	if (startSource["type"] == "other")	then
		checkBatteries()
	end
end

Vielen Dank, aber beim Starten kommt eine E-Mail aber auf dem Handy keine Push?

local phoneID = {914;631;971} – phone IDs for push notification

Hi,

hast Du im Debug-Fenster kritische Batterien oder dead devices, wenn ja versuch mal
local phoneID = {914,631,971}

Vielen Dank

Batterien sind alle voll.
55 battery devices were checked.

Aber es existieren 2 dead devices, die zeigt es weder in der Mail noch als Push an.

versuch mal local phoneID = {914,631,971}
-- habe ich gemacht

[DEBUG] 16:07:03: 55 battery devices were

checked.
[DEBUG] 16:07:03:
[DEBUG] 16:07:03: ------------------------------------------------------------
[DEBUG] 16:07:03: 97 non battery devices checked.
[DEBUG] 16:07:03: Mail gesendet

Siehst Du die dead devices im Debug Fenster unter den anderen devices?

Nein die erscheinen nicht im Debug Fenster. Unter Module stehen sie aber da.

OK, ich vermute Du must für diese devices eine Softrekonfiguration machen. Auf dieses Problem sind wir schon ganz am Anfang gestoßen, wenn devices nicht erscheinen. Müsste in einem Beitrag von pblacky beschrieben sein(ca 2 Seite).

EDIT:
Eine Frage habe ich noch, sind diese dead devices Batteriedevices oder andere?

Moin moin,

also bei mir läuft es soweit. Ich habe zwei Strombetriebene Geräte die nicht angeschlossen sind und von denen bekomme ich eine Push Nachricht. Allerdings musste ich die Anzahl der Zeilen pro Mail von 20 auf 24 ändern, in der zweiten Mail fehlte wieder etwas aber es gab keine dritte Mail.

Kurze andere frage, wie macht man von einem Gerät eine Softwarekonfiguration?

Danke und Grüße
Gringo

Die leichte Geräte Neukonfiguration machst du in den Einstellungen des jeweiligen Gerätes. (siehe Anhang)

Danke pblacky

Hi gringo,

Allerdings musste ich die Anzahl der Zeilen pro Mail von 20 auf 24 ändern...
Das kann ich mir ja gar nicht vorstellen, wenn was fehlt, muss man eher die Anzahl der Dev. pro Mails verringern. Die große unbekannte für mich ist wie lang die Geräte- und Raumnamen sind. Vielleicht postet man jemand seinen debug output (ohne Mailversand), also der grüne Bereich am Stück. Ich habe nur 23 Batteriedevices und habe es mit 10,15,20,21,22,23 24 dev. per Mail getestet. Gefehlt hat nie was. Durch diese Fibaro-Beschränkung habe ich aber zur Zeit keine andere Möglichkeit als mehrere Mails zu verschicken.
Kurze andere frage, wie macht man von einem Gerät eine Softwarekonfiguration?
Da ich mein HC2 auf english eingestellt habe, nutze ich lieber die englischen Bezeichnungen Also dort heißt der Button dann: " Soft reconfigure device". Da Fibaro nicht durchgängig alles übersetzt hat und manches auch eher unverständlich ist, bin ich bei english geblieben.

Hallo zusammen,

habe heute festgestellt dass wenn man sich mehrere Mails schicken lassen muss, Fibaro oder mein Mailprovider
sich dafür manchmal unterschiedlich Zeit lässt. Bei 3 Mails kam die

  1. um 12:12, die
  2. um 12:20, und die
  3. um 12:30

Das sind 18 Minuten Unterschied und das finde ich doch recht lange. Damit man weiß wie viele Mails ankommen habe
ich jetzt im Betreff die Nr. der Email hinterlegt. Also z.B. “Batterie Status-1”, “Batterie Status-2” usw.
Auch im Debug-Fenster steht beim Mailversand immer eine Nummer. Wenn in der letzten Zeile, “Mail gesendet-3” steht,
werden 3 Mails erwartet.

Changelog für Version 0.8.3
– Mailnummerierung hinzugefügt.

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

-- file:    Batterystatus.lua 
-- version: 0.8.3
-- purpose: This script checks the batteries and sends reports via 
-- email. Since version 0.6.1 and higher: The script also performs a check on
-- non battery devices and reports all devices marked as dead by HC2.
-- The batterie status is checked daily and several reports per week can be
-- emailed.
-- For batteries that are almost empty, or a dead device is recognized,
-- a push messages will be sent immediately.
-- A manual check is possible at any time. Simply press the Start button.
-- Copyleft 03-2017 {jeep}

local sourceTrigger = fibaro:getSourceTrigger();
local version   = "0.8.3"
local oldnodeId = nil ;
local subject   = "Battery status";
local userId    = 2      -- primary email address
local devpEmail = 20     -- devices per email
local days      = {1,3,6,7} --  1=Sunday, 2=Monday, 3=Tuesday ...7=Saturday
local pushactiv = true;   -- true = sendpush notification
local phoneID   = {13}    -- phone IDs for push notification
local checktime = "19:15" -- At this time the script runs
local full      = 100 --between 50 and 100 the battery status is assumed to be good
local warning   = 50  --between 30 and 50 battery is running low
local critical  = 30  --below 30 battery status is asumed as critical
local empty     = 255 --probably a completely empty battery

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

local function contains(days, val)
   for i=1,#days do
      if days[i] == val then 
         return true
      end
   end
   return false
end

function sendPush(text)
 if (phoneID[1] ~= nil) then
   for i=1, #phoneID do
      if phoneID[i] ~= nil then
        fibaro:debug('Versende Push an ID ' ..phoneID[i])
        fibaro:call(phoneID[i],'sendPush', text)
      end
   end
 end
end

function useremail(userId,subject,status,m)
  local subject = subject..'-'..m
  fibaro:call(userId, "sendEmail", subject, status)
  --fibaro:call(5, "sendEmail", subject, status)  
  status = ' ';
  print('Mail gesendet-'.. m)
end  

devices = fibaro:getDevicesId({visible = true, enabled = true, })
function checkBatteries() 
  status  = '' ;
  vstatus = '';
  local n = 0; -- battery device counter
  local v = 0; -- non battery device counter
  local m = 0; -- mail counter
  Debug('withe', os.date('%c')..', Version: '.. version );
  for id = 1, #devices do
    local batteryLevel = fibaro:get(devices[id], 'batteryLevel')
    local nodeId       = fibaro:get(devices[id], 'nodeId') 
    local isdead       = fibaro:get(devices[id], 'dead')
    if batteryLevel ~= nil and nodeId ~= nil and batteryLevel ~= '' then
       local name   = fibaro:getName(devices[id]) 
       if oldnodeId ~= nodeId then
          local room = fibaro:getRoomNameByDeviceID(devices[id]) 
          if not(room == "unassigned") then
             n = n+1
             if tonumber(batteryLevel) >= warning and tonumber(batteryLevel) <= full then
        	Debug('green', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' % OK') 
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % OK\n';
             elseif
               tonumber(batteryLevel) >= critical and tonumber(batteryLevel) <= warning then
               Debug('yellow', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' % Warning') 
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % Warning\n';
             elseif 
               tonumber(batteryLevel) < critical  then 
               Debug('red', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' %') 
               if pushactiv then           
                  sendPush('Batterie: '.. name ..' in room '.. room ..' '.. batteryLevel..'%.')
               end
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % Critical\n';
             elseif
               tonumber(batteryLevel) > full or tonumber(batteryLevel) == empty then 
               Debug('red', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' % probably empty!') 
               if pushactiv then           
                  sendPush('Batterie: '.. name ..' in room '.. room ..' '.. batteryLevel..'%.')
               end
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % Error\n';
             end
             if tonumber(isdead) == 1 then
                Debug('red', "Battery " ..name..' ('..room..') - Device is dead!') 
                status = status .. 'Alert! ' .. name..' ('..room..') - Device is dead \n';
                vstatus = vstatus .. 'Alert! ' .. 'device '.. name ..' - Device is dead! \n';   
                sendPush(name ..' in room '.. room ..' '.. batteryLevel..'%. Device is dead!')
             end              
             if (n % devpEmail == 0) and oldNodeId == nodeID then
                if contains(days, weekday) then
                   m = m+1
                   useremail(userId,subject,status,m)
                   fibaro:debug(status)
                   status = ' '
                   fibaro:sleep(500)
                end
             end  
          end 
       end 
       oldnodeId = nodeId
    else
          v= v+1 
          local name = fibaro:getName(devices[id])  
          local room = fibaro:getRoomNameByDeviceID(devices[id])
          if tonumber(isdead) == 1 then
             Debug('red', "Device " ..name..' ('..room..') - Device is dead!') 
             vstatus = vstatus .. 'Alert! ' .. 'device '.. name ..' - Device is dead! \n';
             sendPush('Device: '.. name ..' in room '.. room .. ' - is dead!')
          end      
    end  
  end  --for
 
  status    = status .. 'Checked at: ' .. os.date('%c') ..'\n'
  status    = status ..n.. ' battery devices were checked.\n' 
  vstatus   = vstatus ..v.. ' non battery devices checked.'
  separator = '------------------------------------------------------------'
  Debug('withe', os.date('%c'));
  Debug('withe', separator)
  Debug('withe', status)
  Debug('withe', separator)
  Debug('white', vstatus)
  status = status..separator..'\n'..vstatus..'\n'..os.date('%c')
  if contains(days, weekday) then
     m = m+1
     useremail(userId,subject,status,m)
     status = ' '; 
  end  
end  -- function

function main()
    local currentDate = os.date("*t");
    local currenthour = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
    weekday = currentDate.wday
    local startSource = fibaro:getSourceTrigger();
    if currenthour == checktime then
       checkBatteries()
    end
    setTimeout(main, 60*1000)
end
 
if (sourceTrigger["type"] == "autostart") then
    main()
else
    local currentDate = os.date("*t");
    local startSource = fibaro:getSourceTrigger();
    weekday = currentDate.wday
    if (startSource["type"] == "other")	then
       checkBatteries()
    end
end

Hi Jeep,

ich hab auch die Anzahl auf 15 gestellt und drei Mails bekommen. Bei 24 packt er mehr in die erste Mail und die letzten beiden fehlenden Zeilen waren auch in der zweiten mail vorhanden.

Grüße
gringo

Ein super Script, habe es direkt neu mit eingebunden.
Ich bin wirklich sehr begeistert.
Es funktionierte super.

LG
Carsten

Hallo zusammen,

es gibt wieder ein Update. Die Idee kam mir durch einen anderen Thread hier im Forum (https://www.siio.de/board/thema/batterieanzeige-nicht-korrekt/#post-76267).
Der Hintergrund - ein Batteriedevice kann zwischen 2 WakeUp Zyklen ausfallen (das passiert bei Lithium Batterien häufiger als man denkt). In so einem Fall würde das HC2 den alten Batteriewert ewig reporten, obwohl das Gerät längst tot ist und sich nie mehr beim HC2 meldet. Es herrscht also eine trügerische Sicherheit.

Ich schweife mal ein wenig ab. Manuell könnte man Batteriedevices (von Fibaro) folgendermaßen testen:
Rauchsensor - 3 Sekunden auf den B-Button drücken, er wird dann die LED verschiedenfarblich blinken lassen
Wassersensor - kurz mal daran wackeln, der Tamper löst aus und der Sensor piept.
Bewegungsmelder - ebenfalls kurz wackeln, und die LED fängt an zu blinken. Immer in der Hoffnung das sie nicht per Parameter abgeschaltet wurde.
Fernbedienungen - irgendein Knopf drücken, kommt nicht die gewünschte Reaktion, werdet ihr erst mal 'ne neue Batterie versuchen.

Die größere Herausforderung (weil nicht immer in handlicher Reichweite) sind:
Tür- und Fenstersensoren - hier muss der Deckel abgemacht werden, B-Button gedrückt werden oder die Batterie per Messinstrument geprüft werden.
Das neue Script macht sich den Zustand zu nutze, dass eine sich öffnende oder schließende Tür/Fenster einen Eintrag im Controller (HC2) auslöst.
Die Abfrage dieses Eintrag wird mit 2 Variablen gesteuert. Erst ob überhaupt die Prüfung erfolgen soll (checklBreached false oder true) und dann
die Zeitspanne in der man erwartet dass Tür oder Fenster betätigt wurden (nBreacheds=24 Std).
Rauchmelder und Sensoren die noch nie gebreached wurden habe ich aktuell von der Prüfung ausgeschlossen. Denke aber das ich in zukünftigen Updates
mindestens eine jährliche Zeitspanne berücksichtigen werde.
Fazit - es muss die Summe aller denkbaren Faktoren überprüft werden um ein Höchstmass an Sicherheit zu gewährleisten.

Edit: Um also den Status der Batterie eines Kellerfensters das meistens zu ist, zu testen, genügt es das Fenster einmal auf und zu zu machen.

Changelog für Version 0.8.4b
– Prüfung auf lastBreached

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

-- file:    Batterystatus.lua 
-- version: 0.8.4b
-- purpose: This script checks the batteries and sends reports via 
-- email. Since version 0.6.1 and higher: The script also performs a check on
-- non battery devices and reports all devices marked as dead by HC2.
-- The batterie status is checked daily and several reports per week can be
-- emailed.
-- For batteries that are almost empty, or a dead device is recognized,
-- a push messages will be sent immediately.
-- A manual check is possible at any time. Simply press the Start button.
-- Copyleft 03-2017 {jeep}

local sourceTrigger = fibaro:getSourceTrigger();
local version   = "0.8.4b"
local oldnodeId = nil ;
local subject   = "Battery status";
local userId    = 2      -- primary email address
local devpEmail = 20     -- devices per email
local days      = {1,3,7} --  1=Sunday, 2=Monday, 3=Tuesday ...7=Saturday
local pushactiv = true;   -- true - sendpush notification
local teleactiv = true;   -- true - send message via telegram 
local phoneID   = {13}    -- phone IDs for push notification
local checktime = "19:15" -- At this time the script runs
local full      = 100 --between 50 and 100 the battery status is assumed to be good
local warning   = 50  --between 30 and 50 battery is running low
local critical  = 30  --below 30 battery status is asumed as critical
local empty     = 255 --probably a completely empty battery
local nBreacheds= 24  --not Breached since nn hours
local checklBreached = true; -- Should lastBreached be checked 

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

local function contains(days, val)
   for i=1,#days do
      if days[i] == val then 
         return true
      end
   end
   return false
end

function sendPush(text)
 if (phoneID[1] ~= nil) then
   for i=1, #phoneID do
      if phoneID[i] ~= nil then
        fibaro:debug('Versende Push an ID ' ..phoneID[i])
        fibaro:call(phoneID[i],'sendPush', text)
      end
   end
 end
end

function useremail(userId,subject,status,m)
  local subject = subject..'-'..m
  fibaro:call(userId, "sendEmail", subject, status)
  --fibaro:call(5, "sendEmail", subject, status)  
  status = ' ';
    print('Mail gesendet-'.. m)
end  

function checklastBreached(uxtimeStamp, lbreached)
  xseconds = (uxtimeStamp - lbreached)
  xtime    = (xseconds /60) / 60
  xhours   = math.floor(xtime)
  return xhours
end  

devices = fibaro:getDevicesId({visible = true, enabled = true, })
function checkBatteries() 
  uxtimeStamp = os.time(dt);
  status  = '';
  vstatus = '';
  bstatus = ''; 
  local n = 0; -- battery device counter
  local v = 0; -- non battery device counter
  local m = 0; -- mail counter
  Debug('withe', os.date('%c')..', Version: '.. version );
  for id = 1, #devices do
    local batteryLevel = fibaro:get(devices[id], 'batteryLevel')
    local nodeId       = fibaro:get(devices[id], 'nodeId') 
    local isdead       = fibaro:get(devices[id], 'dead')
       if batteryLevel ~= nil and nodeId ~= nil and batteryLevel ~= '' then
       local name   = fibaro:getName(devices[id]) 
       if oldnodeId ~= nodeId then
          local room = fibaro:getRoomNameByDeviceID(devices[id])
          local lbreached = fibaro:get(devices[id], 'lastBreached')
          --print(lbreached) 
          if not(room == "unassigned") then
             n = n+1
             if tonumber(batteryLevel) >= warning and tonumber(batteryLevel) <= full then
       		Debug('green', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' % OK') 
                status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % OK\n';
             elseif
               tonumber(batteryLevel) >= critical and tonumber(batteryLevel) <= warning then
               Debug('yellow', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' % Warning') 
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % Warning\n';
             elseif 
               tonumber(batteryLevel) < critical  then 
               Debug('red', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' %') 
               if pushactiv then           
                  sendPush('Batterie: '.. name ..' in room '.. room ..' '.. batteryLevel..'%.')
               end
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % Critical\n';
             elseif
               tonumber(batteryLevel) > full or tonumber(batteryLevel) == empty then 
               Debug('red', "Battery " ..name..' ('..room..') - Battery: '..batteryLevel..' % probably empty!') 
               if pushactiv then           
                  sendPush('Batterie: '.. name ..' in room '.. room ..' '.. batteryLevel..'%.')
               end
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % Error\n';
             end
          
             if tonumber(isdead) == 1 then
                Debug('red', "Battery " ..name..' ('..room..') - Device is dead!') 
                status = status .. 'Alert! ' .. name..' ('..room..') - Device is dead \n';
                vstatus = vstatus .. 'Alert! ' .. 'device '.. name ..' - Device is dead! \n';   
                sendPush(name ..' in room '.. room ..' '.. batteryLevel..'%. Device is dead!')
               -- if teleactiv then
               --   	fibaro:setGlobal('telegram_text', name.. ' is dead! '.. os.date('%c')) 
               --    fibaro:startScene(61)
               -- end  
              end    
              if lbreached ~= nil and checklBreached and tonumber(lbreached) > 0 then
                 xhours = checklastBreached(uxtimeStamp, lbreached)
                 if xhours > nBreacheds then
                    bstatus = bstatus .. name ..' not breached since: ' ..xhours.. ' hours\n'
                 end
              end    
                              
             if (n % devpEmail == 0) and oldNodeId == nodeID then
                if contains(days, weekday) then
                   m = m+1
                   useremail(userId,subject,status,m)
                   fibaro:debug(status)
                   status = ' '
                   fibaro:sleep(500)
                end
             end  
          end 
       end 
       oldnodeId = nodeId
    else
       v= v+1 
       local name = fibaro:getName(devices[id])  
       local room = fibaro:getRoomNameByDeviceID(devices[id])
       if tonumber(isdead) == 1 then
          Debug('red', "Device " ..name..' ('..room..') - Device is dead!') 
          vstatus = vstatus .. 'Alert! ' .. 'device '.. name ..' - Device is dead! \n';
          sendPush('Device: '.. name ..' in room '.. room .. ' - is dead!')
       end 
    end  
  end  --for
 
  status    = status .. 'Checked at: ' .. os.date('%c') ..'\n'
  status    = status ..n.. ' battery devices were checked.\n' 
  vstatus   = vstatus ..v.. ' non battery devices checked.'
  separator = '------------------------------------------------------------'
  Debug('withe', os.date('%c'));
  Debug('withe', separator)
  Debug('withe', status)
  Debug('withe', separator)
  Debug('white', vstatus)
  Debug('withe', separator)
  Debug('withe', bstatus)
  status = status..separator..'\n'..vstatus..'\n'
  status = status..separator..'\n'..bstatus..'\n'..os.date('%c')
  if contains(days, weekday) then
     m = m+1
     useremail(userId,subject,status,m)
     status = ' '; 
  end  
end  -- function

function main()
    local currentDate = os.date("*t");
    local currenthour = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
    weekday = currentDate.wday
    local startSource = fibaro:getSourceTrigger();
    if currenthour == checktime then
       checkBatteries()
    end
    setTimeout(main, 60*1000)
end
 
if (sourceTrigger["type"] == "autostart") then
    main()
else
    local currentDate = os.date("*t");
    local startSource = fibaro:getSourceTrigger();
    weekday = currentDate.wday
    if (startSource["type"] == "other")	then
       checkBatteries()
    end
end

Hi,

Sehr gute Idee!
Da die Fibaro Rauchmelder und ggf auch Fenstersensoren eine Temperatur liefern, sollte deine Idee dort auch greifen.

Viele Grüße Hoggle