Und noch ein Batterie check scipt

Ich habe nochmal nachgedacht und habe herausgefunden, dass alle Geräte mit dem Fehler (0%) schon SEHR lange in der HC2 angelernt sind.
NEUE Baugleiche Geräte haben das Problem nicht!

Glaubt ihr, dass es sinn macht, mal zum Test eines der Geräte neu anzulernen?
Ich mach das gerne, aber nur wenn es was bringt, denn ich muss dann einige Skripte umschreiben…

Hi,

ich habe mich gar nicht getraut Dir dass vorzuschlagen ;), aber wenn Du es mit einem device probieren willst, wären Dir bestimmt viele Anwender sehr dankbar.

Wenn das so ist dann werd ich das versuchen, vielleicht können wir es ja dadurch gemeinsam lösen!
Lass mir ein paar Tage Zeit, werde das Gerät mit dem geringsten Skriptaufwand suchen und dann melde ich mich :wink:

Hallo
Habe das Script auch ausprobiert und die gleichen Probleme mit 0%…

Mit einem Update auf die letzte Version 4.114 scheint es aber zu passen.

Bitte überprüfen.
MFG

Normalerweise installiere ich keine BETA Updates, aber ich habs nun ausprobiert.
Keine Veränderung mit der 4.114!
Werde nun mal einen der Rauchmelder neu einlernen udn dann berichten!

Hi Leute,
Es ist gelungen!!
Nach dem neuen Anlernen eines Rauchmelders hat das Skript den Batteriezustand richtig angezeigt!
Ich habe daraufhin bei den weiteren Geräten eine “leichte Geräteneukonfiguration” ausprobiert, das hat ebenfalls geklappt.
Ihr braucht die Geräte also NICHT neu anlernen, falls bei euch die Beta 4.114 nicht klappt…

Danke Jeep nochmal für das tolle Skript, wird bei mir ab heute auch jeden Monat laufen :wink:

Und ich danke Dir pblacky für das erfolgreiche Testen und Deine Hilfe bei der Lösung dieses Problems.

Immer gerne!
Hab hier schon so viel Inspiration und Hilfe erhalten daher freue ich mich wenn ich ein kleines bisschen zurückgeben kann …

Hallo jeep,
Da ich den Skript nun ja auch verwenden kann, habe ich es mir mal genauer angesehen.
Dabei habe ich bemerkt, dass du 4 unterschiedliche Batterie Zustände darin verarbeitest, cool!
Ist es damit möglich einen Parameter einzubauen mit dem man definieren kann ab welchem Batteriestand das Skript ein Email verschickt?

Meine Idee wäre das Skript öfter laufen zu lassen (z.B. 1 x die Woche) und nur dann ein Mail zu versenden wenn irgendein Gerät unter 25% ist.
Ist nur so eine Idee, keine Ahnung ob es sinnvoll ist…

Hi pblacky,

natürlich kann man das machen, muss aber jeder für sich entscheiden. Das script checkt die Batterien ja per default wöchentlich. Diesen Zeitraum kann man auch auf täglich einstellen.
Erstmal eine Variable anlegen z.B. “sendmail = false”
In der Abfrage ob Batterie <= 25 % ist, die Variable “sendmail = true” setzen und den Mailversand abhängig davon machen. Also so:


--
if sendmail = true 
  then
  fibaro:call(userId, "sendEmail", subject, status)
  --fibaro:call(5, "sendEmail", subject, status) 
end


Andere Varianten sind denkbar.

Da ich 22 Batterie devices habe möchte ich natürlich die diversen Stände frühzeitig erfahren um meine Batterievorrat rechtzeitig auzufüllen.

Alles klar, danke für die Erklärung!
Das mit dem Batteriestand auffüllen ist ein guter Einwand, denn derzeit habe ich immer Batterien daheim die jeden Monat älter werden.
Das könnte ich mir mit deinem Skript eigentlich ersparen …

Der Vollständigkeit halber, habe ich noch ein Batterie Icon für das Script hinzugefügt.

batterie.png

Hallo Jeep,
Habe gerade ausprobiert dein Skript so abzuändern, dass es nur die Devices Mailt, die unter 50% Akku haben.
Habe dazu versucht dein Codeschnipsel von oben einzubauen.
Leider habe ich das (noch) nicht geschafft!

Das Skript schickt zwar ein Mail, aber ich habe immer Gecheckt wurden 0 devices drinnen!
Hast du einen Tipp?
Hier das Skript:

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

-- file: Batteriestatus.lua 
-- Batteriestatus checken und mailen
-- Copyleft 03-2017 {jeep}

local sourceTrigger = fibaro:getSourceTrigger()
local oldnodeId = nil
local status = ' '
local n = 0
local subject = "Batterien Status"
local userId  = 2
sendmail = true
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})
--print(json.encode(devices))

function checkBatteries()
  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) >= 50 and tonumber(batteryLevel) <=100 then
        		Debug('green', "Batterie " ..name..' ('..room..') - Batterie: '..batteryLevel..' % OK') 
                status = status .. n .. ") " ..name..' ('..room..') - Batterie: '..batteryLevel..' % OK\n'
				sendmail = false
             elseif
               tonumber(batteryLevel) >= 25 and tonumber(batteryLevel) <= 50 then
               Debug('yellow', "Batterie " ..name..' ('..room..') - Batterie: '..batteryLevel..' % Warnung') 
               status = status .. n .. ") " ..name..' ('..room..') - Batterie: '..batteryLevel..' % Warnung\n'
             elseif 
               tonumber(batteryLevel) < 25  then 
               Debug('red', "Batterie " ..name..' ('..room..') - Batterie: '..batteryLevel..' % Kritisch') 
               status = status .. n .. ") " ..name..' ('..room..') - Batterie: '..batteryLevel..' % Kritisch\n'
             elseif
               tonumber(batteryLevel) > 100  then 
               Debug('red', "Batterie " ..name..' ('..room..') - Batterie: '..batteryLevel..' % vermutlich leer!') 
               status = status .. n .. ") " ..name..' ('..room..') - Batterie: '..batteryLevel..' % Fehler\n'
             end
          end 
       end
       oldnodeId = nodeId
     end
  end 
end
status = status .. 'Am :' .. os.date('%c') ..'\n'
status = status .. 'Gecheckt wurden ' ..n.. ' devices.' 

Debug('withe', os.date('%c'))
Debug('withe', '------------------------------------------------------------')
Debug('withe', status)

Debug('yellow', sendmail)
if sendmail then
	fibaro:call(userId, "sendEmail", subject, status)
end

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 == 1) and currenthour == "18:00") 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

Ich glaube mein Ansatz stimmt nicht ganz, denn das Mail soll ja immer verschickt werden!

Soweit ich das Skript verstanden habe müsste ich nur das befüllen der Variable im obersten “if” Segment verhindern, oder?
Habe DAS probiert

      	     if tonumber(batteryLevel) >= 50 and tonumber(batteryLevel) <=100 then
        		Debug('green', "Batterie " ..name..' ('..room..') - Batterie: '..batteryLevel..' % OK') 
                --status = status .. n .. ") " ..name..' ('..room..') - Batterie: '..batteryLevel..' % OK\n'
             elseif

funktioniert aber auch nicht ;-(

Hi pblacky,

mit dem letzten Beispiel bist Du auf dem richtigen Weg gewesen. Habe noch kleine Anpassungen gemacht. Hier das komplette Script:

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

-- file: Batteriestatus.lua 
-- v.0.02
-- Batteriestatus checken und mailen
-- Copyleft 03-2017 {jeep}

local sourceTrigger = fibaro:getSourceTrigger();
local oldnodeId = nil ;

local subject = "Batterien Status";
local userId  = 2
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})
--print(json.encode(devices))

function checkBatteries()
  local 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) >= 50 and tonumber(batteryLevel) <=100 then
        	Debug('green', "Batterie " ..name..' ('..room..') - Batterie: '..batteryLevel..' % OK') 
                status = status .. n .. ") " ..name..' ('..room..') Bat.: '..batteryLevel..' % OK\n';
             elseif
               tonumber(batteryLevel) >= 30 and tonumber(batteryLevel) <= 50 then
               Debug('yellow', "Batterie " ..name..' ('..room..') - Batterie: '..batteryLevel..' % Warnung') 
               status = status .. n .. ") " ..name..' ('..room..') Bat.: '..batteryLevel..' % Warnung\n';
             elseif 
               tonumber(batteryLevel) < 30  then 
               Debug('red', "Batterie " ..name..' ('..room..') - Batterie: '..batteryLevel..' %') 
               status = status .. n .. ") " ..name..' ('..room..') Bat.: '..batteryLevel..' % Kritisch\n';
             elseif
               tonumber(batteryLevel) > 100  then 
               Debug('red', "Batterie " ..name..' ('..room..') - Batterie: '..batteryLevel..' % vermutlich leer!') 
               status = status .. n .. ") " ..name..' ('..room..') Bat.: '..batteryLevel..' % Fehler\n';
             end
          end 
       end
       oldnodeId = nodeId
     end
  end 
  status = status .. 'Am :' .. os.date('%c') ..'\n'
  status = status .. 'Gecheckt wurden ' ..n.. ' devices.' 

  Debug('withe', os.date('%c'));
  Debug('withe', '------------------------------------------------------------')
  Debug('withe', status)

  fibaro:call(userId, "sendEmail", subject, status)
  --fibaro:call(5, "sendEmail", subject, status)
  local 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 == 1) and currenthour == "19:45") 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

Versuche mal das, habe es eben getestet


 if tonumber(batteryLevel) >= 50 and tonumber(batteryLevel) <=100 then
        --Debug('green', "Batterie " ..name..' ('..room..') - Batterie: '..batteryLevel..' % OK') 
        --status = status .. n .. ") " ..name..' ('..room..') Bat.: '..batteryLevel..' % OK\n';
        n = n-1 
elseif


und habe dieses Ergebnis bei mir von 22 devices:

[DEBUG] 08:49:48: Wed May 10 08:49:48 2017
[DEBUG] 08:49:48: Batterie Flood1 WK (Heizungsraum) - Batterie: 44 % Warnung
[DEBUG] 08:49:49: Batterie KeyFob1 (Buero) - Batterie: 37 % Warnung
[DEBUG] 08:49:49: Wed May 10 08:49:49 2017
[DEBUG] 08:49:49: ------------------------------------------------------------
[DEBUG] 08:49:49: 1) Flood1 WK (Heizungsraum) Bat.: 44 % Warnung
[DEBUG] 08:49:49: 2) KeyFob1 (Buero) Bat.: 37 % Warnung
[DEBUG] 08:49:49: Am :Wed May 10 08:49:49 2017
[DEBUG] 08:49:49: Gecheckt wurden 2 devices.

Hallo Jeep,
Danke für dein letztes Skript
Ich habe es (für mich) noch etwas adaptiert und folgendes geändert:

.) die Texte verkürzt, da ich auch dieses Problem hatte, dass die Mail ab Device 20 abgeschnitten wurde!
.) % Akku ganz am Anfang, somit besser erkennbar
.) In der Mail kommen nur Geräte deren Akkustand unter 50% ist, Sonst kommt eine kurze OK meldung.

Wie gesagt für mich passt es jetzt, denn solange alle Geräte über 50 % sind kommt nur ein leeres Mail mit der OK meldung.
Ansonsten werden die entsprechenden Aktoren gelistet.

Danke für die Idee und deine Unterstützung!
Das Ergebnis, falls Interesse:

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

-- file: Batteriestatus.lua 
-- v.0.02a
-- Batteriestatus checken und mailen
-- Copyleft 03-2017 {jeep}

local sourceTrigger = fibaro:getSourceTrigger()
local oldnodeId = nil 
local subject = ' ' 
local userId  = 2
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})
--print(json.encode(devices))

function checkBatteries()
  local status = ' ' 
  local n = 0
  Debug('white', os.date('Batteriecheck gestartet ...%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) >= 50 and tonumber(batteryLevel) <=100 then
               Debug('green', "" ..name..' ('..room..') - Batterie: '..batteryLevel..' % OK!') 
             elseif 
               tonumber(batteryLevel) >= 30 and tonumber(batteryLevel) <= 50 then
               Debug('yellow', "" ..name..' ('..room..') - Batterie: '..batteryLevel..' % Warnung') 
               status = status ..batteryLevel..' % - '..name..' - '..room..'  \n'
             elseif 
               tonumber(batteryLevel) < 30  then 
               Debug('red',"" ..name..' ('..room..') - Batterie: '..batteryLevel..' Kritisch!!%') 
               status = status ..batteryLevel..' % - '..name..' - '..room..' - Kritisch!\n'
             elseif
               tonumber(batteryLevel) > 100  then 
               Debug('red', "" ..name..' ('..room..') - Batterie: '..batteryLevel..' % vermutlich leer!') 
               status = status ..batteryLevel..' % - '..name..' - '..room..' - LEER!!\n'
             end
          end 
       end
       oldnodeId = nodeId
     end
  end 
  subject = 'Fibaro HC2 - Batterietest von ' ..n.. ' Geräten' 
  status = status .. '\nalles OK' 
  fibaro:call(userId, "sendEmail", subject, status)
  Debug('white', os.date('Batterieteste geendet - Email versendet am %c'))
  local 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 == 1) and currenthour == "19:45") 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

Hab übrigens auch getestet wie man statt “50%” eine andere Warnschwelle einstellen kann.
Einfach in dem Bereich

 if tonumber(batteryLevel) >= 50 and tonumber(batteryLevel) <=100 then
               Debug('green', "" ..name..' ('..room..') - Batterie: '..batteryLevel..' % OK!') 
             elseif 
               tonumber(batteryLevel) >= 30 and tonumber(batteryLevel) <= 50 then
               Debug('yellow', "" ..name..' ('..room..') - Batterie: '..batteryLevel..' % Warnung') 
               status = status ..batteryLevel..' % - '..name..' - '..room..'  \n'
             elseif 

den Wert “50” (kommt 2 x vor) gegen einen höheren Wert (z.B. “70”) tauschen.
Vielleicht reitet mich mal die Langeweile, dann bau ich da eine Trigger Variable ein :wink:

Vielen Dank euch für das tolle Script.
Werde ich bei mir auch einrichten. Dann hat man mal eine tolle Übersicht.

Gruß
Carsten :slight_smile:

Hallo zusammen,

da das script scheinbar doch von mehreren benutzt wird, habe ich ein einige Werte in Variablen gepackt, so das man es leichter an eigene Bedürfnisse anpassen kann. Da hier auf SiiO auch nicht deutschsprachige Mitglieder mitlesen und da Programiersprachen (auch LUA) meistens Englisch sind, habe ich die paar Variablen und Ausgaben entsprechend übersetzt. Kann ja jeder für sich wieder eindeutschen. :wink:


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

-- file:    Batterystatus.lua 
-- version: 0.03
-- 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 checkBatteries()
  local 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..' % Warnung\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
          end 
       end
       oldnodeId = nodeId
     end
  end 
  status = status .. 'Checked on: ' .. os.date('%c') ..'\n'
  status = status ..n.. ' devices were checked. ' 

  Debug('withe', os.date('%c'));
  Debug('withe', '------------------------------------------------------------')
  Debug('withe', status)

  fibaro:call(userId, "sendEmail", subject, status)
  --fibaro:call(5, "sendEmail", subject, status)  
  local 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 

Danke, nun ist es MEHR als perfekt!!