Und noch ein Batterie check scipt

hallo zusammen,

ich habe das script nun auch laufen. super sache und ein danl für das erstellen.

ich habe 39 batterie devices die mir im debug fenster angezeigt werden. in der mail sind allerdings nur 25 erhalten.
wie kann ich das ändern das alle devices die gechsckt wurden auch in der mail aufgelistet werden?

läßt sich die schriftfarbe der mail auch ändern?

dank und grüße
gringo

Das Problem hatte ich auch.
Habe daraufhin die Texte (im Email) alle gekürzt, seither klapps.
Allerdings habe ich nur 21 Geräte!

Ich vermute das ist irgendein Variablenspeicher der da begrenzt ist, aber vielleicht kann Jeep das genauer erklären.
Er ist der Erfinder dieses genialen Skriptes …

Hi,

es liegt nicht am Script, ich vermute es ist der Fibaro Mailserver der eine Begrenzung der Zeichen macht.
Es ist mir auch nicht bekannt zu diesem Zweck eine Variable zu ändern. Im Output ist ja alles da, nur in
der Mail kopmmt nicht alles an.
Ich werde mal ein paar Test mit dem Notification Panel machen und eventuell dann Fibaro fragen ob man die
Begrenzung erhöhen kann.
Aber wie pblacky schon angedeutet hat, kannst Du es vielleicht kürzen in dem Du den Raumnamen (’…room…’) in den
Statusvariablen weglässt.
Viel Erfolg.

So, ich bin ein wenig schlauer. Über das Notification Panel, konnte ich Mails mit 1200 Zeichen verschicken,
(also ist der Fibaro Server unschuldig), über das Batterie Check Script ist bei 980 Zeichen Schluß.
Zwei Sachen fallen mir dazu ein. Entweder es ist eine LUA Begrenzung, aber nicht in der Variable, denn
die ist im Debug-Fenster mit 1200 Zeichen gefüllt.
Oder, was ich aber unschön fände, ich könnte das Script so umbauen das es z.B. ab 25 devices eine zweite
und dritte Mail verschickt.
Bekanntlich werden Variablen in LUA nicht explizit deklariert und sind typenlos. Da komm ich so nicht weiter.
Ich bleibe auf jedem Fall dran, vielleicht finde ich die eine Lösung.

Danke @jeep für die gewissenhafte Prüfung!! Man sieht schon, dass du dich sehr gut auskennst :wink:

Ich denke dass es auch weniger Zeichen sind wenn man nur die Geräte in die Variable schreibt, die einen gewissen Batterielevel unterschreiten.
Ich habe das Skript so in Verwendung dass nur Geräte berücksichtigt werden, die unter 60% Batterielevel sind.
Das sollte sich eigentlich immer ausgehen…

Ich habe ein Gerät das mit 60% nun schon mehr als 2 Monate läuft und unlängst gerade auf 50% gefallen ist.
Es ist also in diesem Bereich noch genug Zeit zum Batterien kaufen :wink:

Danke ihr beiden.

ich werde das mal testen.

Grüße
gringo

ich lass jetzt das script von pblacky laufen. das finde ich gut so. so werden auch nur die geräte angezeigt die bald keine ladung mehr in der batterie haben.

ich würde aber gerne in der mail ein datum stehen haben wann gechecjt wurde.

das sieht jetzt im moment so aus:

Gecheckt wurden 39 Geräte am: Tue Jun 6 15:15:36 2017

wie bekommt man das in ein vernünftige format? z.b. so.
am: 06 Juni 2017 um 15:15:36

danke schon mal
grüße
gringo

Hier mal einige Datumsformate aus meiner Eigenen Erfahrung:

-- Datum Formate
Debug("green",(os.date("Datum: %A %d.%B %Y"))) --Wednesday 21.Dezember 2016
Debug("green",(os.date("%d.%B %Y"))) --21.December 2016
Debug("green",(os.date("%d.%b %Y"))) --21.Dec 2016
Debug("green",(os.date("%d.%m.%Y"))) --21.12.2016
Debug("violet",(os.date("Zeit: %X"))) -- 10:46:48
Debug("green",(os.date("%d.%B %Y um %X Uhr"))) --21.December 2016 um 10:46:48 Uhr

Damit solltest du weiterkommen …

Dank dir

Hi,

ja dass mit den Batteriebetriebenen devices ist so eine Sache. Ich habe sehr unterschiedliche Erfahrungen gemacht.
Zum Beispiel Rauchmelder gehen bei einer Qualitätsbatterie fast liniar nach unten. Das funktioniert dann noch
bei 25%. Aber ich habe auch Geräte gesehen die beim vorletzten Test über 60% hatten und eine Woche später war die Batterie
komplett leer und Gerät tot.
Was ich damit sagen will, dass es sehr trügerisch ist nur Geräte zu testen die unter 60% haben. Ich finde es sehr gut wenn
Geräte die Monate lang 100% anzeigen, dann rapide nach unten gehen, überwacht werden. Zum Beispiel können ältere Batterien
in einem Türsensor FGK-10x von knapp 80% innerhalb einer Woche leer sein. Hängt alles vom wakeup und betätigen der Tür ab.
Nur so als kleine Anregung. Deshalb ist es mir sehr wichtig sämtliche Batterien einem wöchentlichen Check zu unterziehen.

EDIT: Zum Beispiel Geräte mit denen die Sicherheit (Alarmanlage) des Hauses überwacht wird, würde ich immer im wöchentlichen
Turnus checken.

@jeep

da gebe ich dir recht. Bis dato habe ich meine Batterie Geräte nicht überwacht und bin somit schon einen Schritt weiter als gestern.

Wenn alle Sensoren in einer Mail dargestellt werden können würde ich auch alle anzeigen lassen.

Zur Not kann man die Szene ja auch manuell starten.

Grüße
gringo

Da ich bis jetzt aus dem Fibaro Forum auch keine Hinweise für das Abschneiden der Variablen nach 980 Zeichen bekommen habe,
habe ich jetzt die Version 0.4 hier reingestellt die nach jeden 20 devices eine Neue Mail verschickt. Hat jemand 60 und 80
Batteriedevices bekommt er 4 Mails.
Eine andere Lösung habe ich zur Zeit nicht. Wenn jemand 25 Geräte pro Mail haben will, einfach die Zahl 20 in Zeile 66 ändern.
Ich werde weiter nach einer Möglichkeit mit einer einzigen Mail suchen.

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

-- file:    Batterystatus.lua 
-- version: 0.4
-- purpose: Check the batteries and email status.
-- Batteries are checked once per week (Sunday on checktime)
-- Copyleft 03-2017 {jeep}

local sourceTrigger = fibaro:getSourceTrigger();
local oldnodeId = nil ;
local subject   = "Battery status";
local userId    = 2 -- primary email address
local checkday  = 1 -- 1=Sunday 2=Monday ...
local checktime = "19:15"
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  = 25  --below 25 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

devices = fibaro:getDevicesId({interfaces = {"battery"}, visible = true, enabled = true})

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

function checkBatteries()
  status = ' ' ;
  local n = 0;
  Debug('withe', os.date('%c'));
  for id = 1, #devices do 
    local batteryLevel = fibaro:get(devices[id], 'batteryLevel')
    local nodeId       = fibaro:get(devices[id], 'nodeId')   
	if batteryLevel ~= nil and nodeId ~= nil
       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..' %') 
               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!') 
               status = status .. n .. ") " ..name..' ('..room..') ' ..batteryLevel..' % Error\n';
             end
             if (n % 20 == 0) and oldNodeId == nodeID then 
                useremail(useriD,subject,status)
                fibaro:debug(status)
                status = ' '
             end 
          end 
       end
       oldnodeId = nodeId
     end
     
  end  --for
    
  status = status .. 'Checked on: ' .. os.date('%c') ..'\n'
  status = status ..n.. ' devices were checked. ' 
  
  Debug('withe', os.date('%c'));
  Debug('withe', '------------------------------------------------------------')
  Debug('withe', status)
  
  useremail(useriD,subject,status)
  status = ' '; 
end  -- function

function main()
	local currentDate = os.date("*t");
    local currenthour = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
    local weekday     = currentDate.wday
	local startSource = fibaro:getSourceTrigger();
    if (weekday == checkday) and 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();
	if (startSource["type"] == "other")	then
		checkBatteries()
	end
end

Super danke @jeep!
Ich brauche es zwar noch nicht, hab es aber bei Gelegenheit einbauen, denn ich denke die Anzahl der Geräe erhöht sich schneller als ich erwarte :wink:

@jeep

Super. Ich werde es testen. Danke schön

Grüße
Gringo

Hallo zusammen,

da ja bekanntlich Batterien oft unberechenbar sind, :wink: habe ich das script folgendermaßen noch ein wenig verfeinert
und die Versionsnummer auf v0.05 angepasst:

  1. Der Check läuft jetzt täglich.
  2. Für Geräte deren Batterie im kritischen Zustand (also <30%) angelangt ist, oder leer sind, wird sofort eine Push Nachricht verschickt.
  3. Die Mail(s) werden wie üblich einmal in der Woche verschickt.

So kann man noch effizienter auf langsam zur Neige gehende Batterien reagieren.
Setzt man die Variable ‘pushactiv’ auf false, wird keine Pushnachricht verschickt.
In dem Variablen Array phoneID, können die IDs der Handys oder Tablets eingetragen werden, die die Push Nachricht erhalten sollen.
Und zu guter Letzt, in der Variablen ‘devpEmail’, kann man die Anzahl der Geräte pro Mail einstellen.

Und wer das obige script V 0.4 nutzt, da hat sich ein Tippfehler in Zeile 67 eingeschlichen. Das “useremail(useriD,…)”, sollte in “useremail(userId,…)” abgeändert werden.

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

-- file:    Batterystatus.lua 
-- version: 0.05
-- purpose: Check the batteries and email status.
-- Batteries are checked daily and once per week the status is emailed (Sunday on checktime)
-- For batteries that are almost empty, a push messages will be send.
-- Copyleft 03-2017 {jeep}

local sourceTrigger = fibaro:getSourceTrigger();
local oldnodeId = nil ;
local subject   = "Battery status";
local userId    = 2      -- primary email address
local devpEmail = 20     -- devices per email
local checkday  = 1      -- 1=Sunday 2=Monday ...
local pushactiv = true;  -- true = sendpush notification
local phoneID   = {n1,n2,n3,..}   -- phone IDs for push notification
local checktime = "19:15"
local full      = 100 --between 50 and 100 the battery status is assumed to be good
local warning   = 60  --between 30 and 50 battery is running low
local critical  = 30  --below 25 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

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)
  if (weekday == checkday) then
     fibaro:call(userId, "sendEmail", subject, status)
     --fibaro:call(5, "sendEmail", subject, status)  
     status = ' ';
  end    
end  

devices = fibaro:getDevicesId({interfaces = {"battery"}, visible = true, enabled = true})

function checkBatteries()
  status = ' ' ;
  local n = 0;
  Debug('withe', os.date('%c'));
  for id = 1, #devices do 
    local batteryLevel = fibaro:get(devices[id], 'batteryLevel')
    local nodeId       = fibaro:get(devices[id], 'nodeId')   
	if batteryLevel ~= nil and nodeId ~= nil
       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..'%.')
                  fibaro:sleep(500)
               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 (n % devpEmail == 0) and oldNodeId == nodeID then
                useremail(userId,subject,status)
                fibaro:debug(status)
                status = ' '
                fibaro:sleep(500)
             end 
          end 
       end
       oldnodeId = nodeId
     end
     
  end  --for
    
  status = status .. 'Checked on: ' .. os.date('%c') ..'\n'
  status = status ..n.. ' devices were checked. ' 
  
  Debug('withe', os.date('%c'));
  Debug('withe', '------------------------------------------------------------')
  Debug('withe', status)
  if (weekday == checkday) 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

So, ich hoffe dass das script auch bei Euch funktioniert und wünsche immer volle Batterien.

Hallo Jeep,

grad hab ich das neue Script gesehen und muss sagen das sich das klasse anhört.

Jetzt hab ich noch eine Frage.
Lassen sich die Batterie betriebenen Geräte auch dahingehend abfragen wenn sie tot sind?
Das hatte ich jetzt bei drei Geräten,obwohl die Batterie noch nicht auffällig war.
Wenn das Gerät im Netzwerk nicht mehr verfügbar, dann Push Nachricht versenden.

Das ganze ist mir eher durch Zufall aufgefallen, ich guck ja nicht immer nach :wink:

Grüße
gringo

Hallo Gringo,

Batterie betriebene Geräte befinden sich ja die meiste Zeit in einem “deep sleep” Status. Deshalb werden sie auch nicht vom Controller gepollt. Sie würden eh nicht antworten. Deshalb kann man Batteriedevices nie direkt abfragen, sondern man frägt den Status ab der dem Controller beim letzten WakeUp übermittelt wurde. Ja, und die WakeUp Time ist je nach devicedefault oder vom Benutzer geändert recht unterschiedlich.
Wird dem Controller ein Wert über 100% gemeldet ist was faul.

EDIT:
Aber es gibt noch andere Situationen in denen ein device kurzfristig und unbemerkt den Geist aufgeben kann. Die Hitze der letzten Tage hat einen Motion Sensor der außen unter der Dachschräge montiert war, von 70% am Sonntag auf Batteriespannung 0,6 Volt (nach 2 Tagen) abfallen ließ, also device DEAD. Wenn mann jetzt nicht zufällig das Webinterface des HC2 anschaut und feststellt (siehe screenshot),das dass Gerät tot ist, bleibt der Batteriestatus ewig oder bis zum Batterietausch auf den 70% stehen.
Aus diesen Gründen habe ich das Script jetzt so gestrickt, dass zumindest eine zeitnahe Push Meldung kommt wenn was faul ist, denn in einer Woche oder einem Tag kann viel passieren.
Es wird also auch auf tote Batteriedevices getestet acu wenn der Batteriestatus 80% meldet. Denn genau in
einem WakeUp Intervall kann die Batterie total ausfallen.

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

-- file:    Batterystatus.lua 
-- version: 0.5.1
-- purpose: Check the batteries and email status.
-- Batteries are checked daily and once per week the status is emailed (Sunday on checktime)
-- For batteries that are almost empty, a push messages will be send.
-- Copyleft 03-2017 {jeep}

local sourceTrigger = fibaro:getSourceTrigger();
local version   = "0.6.1"
local oldnodeId = nil ;
local subject   = "Battery status";
local userId    = 2      -- primary email address
local devpEmail = 20     -- devices per email
local checkday  = 1      -- email on - 1=Sunday 2=Monday ...
local pushactiv = true;  -- true = sendpush notification
local phoneID   = {13}   -- phone IDs for push notification
local checktime = "19:15"
local full      = 100 --between 50 and 100 the battery status is assumed to be good
local warning   = 60  --between 30 and 50 battery is running low
local critical  = 30  --below 25 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

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)
  if (weekday == checkday) then
     fibaro:call(userId, "sendEmail", subject, status)
     --fibaro:call(5, "sendEmail", subject, status)  
     status = ' ';
  end    
end  

devices = fibaro:getDevicesId({interfaces = {"battery"}, visible = true, enabled = true, })

function checkBatteries()
  status = ' ' ;
  local n = 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 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
                sendPush('Batterie: '.. name ..' in room '.. room ..' '.. batteryLevel..'%. Device is dead!')
             end              
             if (n % devpEmail == 0) and oldNodeId == nodeID and (weekday == checkday) then
                useremail(userId,subject,status)
                fibaro:debug(status)
                status = ' '
                fibaro:sleep(500)
             end 
          end 
       end
       oldnodeId = nodeId
     end 
  end  --for
    
  status = status .. 'Checked on: ' .. os.date('%c') ..'\n'
  status = status ..n.. ' devices were checked. ' 
  
  Debug('withe', os.date('%c'));
  Debug('withe', '------------------------------------------------------------')
  Debug('withe', status)
  if (weekday == checkday) 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

Das hat mich dann auf die Idee für ein neues kleineres Script gebracht dass alle Geräte auf “tot” prüft und eine Push Meldung verschickt. Das kommt dann am Wochenende.

ComProblem.jpg

Hey Jeep,

das ist genau das was ich meinte. Super. Bau doch das “tote modul” Script mit in das Batterie Script.

Grüße
Gringo

Hi,

ein paar kosmetische Änderungen sind in dieser Version 0.6.2 noch eingeflossen. Zusätzlich werden tote Geräte jetzt auch per Email und im Status gemeldet.
Noch ein Hinweis - tote Geräte bedürfen auf jedem Fall einer Prüfung. Kann sein dass man sie über “Wake Up Dead Nodes In Section” wieder zum Leben erwecken kann, weil das HC2 zufällig keine Kommunikation aufbauen konnte. Es muss also nicht immer eine leere Batterie sein.
Ganz unten gibt es noch einen screenshot von meinem letzten Lauf. Das Gerät in rot (das sich tot stellte) verliert manchmal die Verbindung, aber Fenster auf und wieder zu und es lebt wieder. Das Gerät Bedarf einer “Soft reconfiguration” weil ein Nachbardevice ausgetauscht wurde und das vermutlich das primäre Routingziel war.

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

-- file:    Batterystatus.lua 
-- version: 0.6.2
-- purpose: This script checks the batteries and sends a weekly report via 
-- email. Since version 0.6.1 and higher: The script also checks devices 
-- marked as dead by HC2.
-- The batterie status is checked daily and once per week the
-- status is emailed (Sunday at checktime).
-- 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.6.2"
local oldnodeId = nil ;
local subject   = "Battery status";
local userId    = 2      -- primary email address
local devpEmail = 20     -- devices per email
local checkday  = 1      -- email on - 1=Sunday 2=Monday ...
local pushactiv = true;  -- true = sendpush notification
local phoneID   = {13}   -- phone IDs for push notification
local checktime = "19:15"
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

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)
  if (weekday == checkday) then
     fibaro:call(userId, "sendEmail", subject, status)
     --fibaro:call(5, "sendEmail", subject, status)  
     status = ' ';
  end    
end  

devices = fibaro:getDevicesId({interfaces = {"battery"}, visible = true, enabled = true, })

function checkBatteries()
  status = ' ' ;
  local n = 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 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';
                sendPush('Batterie: '.. name ..' in room '.. room ..' '.. batteryLevel..'%. Device is dead!')
             end              
             if (n % devpEmail == 0) and oldNodeId == nodeID and (weekday == checkday) then
                useremail(userId,subject,status)
                fibaro:debug(status)
                status = ' '
                fibaro:sleep(500)
             end 
          end 
       end
       oldnodeId = nodeId
     end   
  end  --for
    
  status = status .. 'Checked on: ' .. os.date('%c') ..'\n'
  status = status ..n.. ' devices were checked. ' 
  
  Debug('withe', os.date('%c'));
  Debug('withe', '------------------------------------------------------------')
  Debug('withe', status)
  if (weekday == checkday) 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

output.png

Vielen Dank Jeep,

dein Skript funktioniert jetzt 1 A. Lasse mir das Ganze auf 2 Email’s schicken und habe somit nicht mehr das Problem mit den abgeschnittenen Wörtern :slight_smile:

/André