Device inventory script

Danke dir Jeep…sehr schönes Tool

Hallo zusammen,

das Script läuft jetzt fehlerfrei bis zur Version 4.150.

--[[
%% properties
--]]

-- file: Device-inventory.lua 
-- version: 0.1.7
-- Works with version up to 4.150
-- purpose:This script shows the device inventory and prints the output to 
-- the debug window.
-- Click the Start button tu run the script.
-- Copyleft 08-2017 - 2018  {jeep}
-- 
local sourceTrigger = fibaro:getSourceTrigger();
local version   = "0.1.7"
local oldnodeId = nil ;
local colour1   = 'lightgreen'
local colour2   = 'orange'

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

devices = fibaro:getDevicesId({parentId = 1, enabled = true, isPlugin = false })
function checkDevices() 
  local vdev, bdev, users, iosdev, nbdev, cam = 0,0,0,0,0,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') 
     if batteryLevel ~= nil and batteryLevel ~= '' then  
         if oldnodeId ~= nodeId then
            bdev = bdev+1;
         end 
        oldnodeId = nodeId
     else
        nbdev = nbdev+1
     end  
  end  --for
  -- Count other devices 
  devices = fibaro:getDevicesId({visible = true, enabled = true, isPlugin = false }) 
  for id = 1, #devices do
      local dtype  = fibaro:getType(devices[id])
      if (dtype == 'iOS_device') then
          iosdev = iosdev+1;
        elseif (dtype == "com.fibaro.ipCamera") then
          cam = cam +1;
      end  
  end --for
  
 plugins  = fibaro:getDevicesId({ enabled = true, visible = true, isPlugin = true })
 vdevices = fibaro:getDevicesId({ enabled = true, visible = true, type="virtual_device" })
 scenes   = api.get("/scenes")
 gvars    = api.get("/globalVariables") 
 rooms    = api.get("/rooms") 
 sections = api.get("/sections")
 users    = api.get("/users") 
  separator = '------------------------------------------------'
  Debug('green','Here is your HC2 device list:')
  Debug(colour1, separator)
  Debug(colour1, bdev + nbdev .. ' Total physical Z-Wave devices.')
  Debug(colour2, nbdev ..' Non batterie devices.')
  Debug(colour2, bdev ..' Batterie devices.')
  Debug(colour2, #users ..' HC2 Users.')
  Debug(colour2, iosdev ..' iOS/Android devices.')
  Debug(colour2, cam ..' ip Cameras.')  
  Debug(colour2, #plugins .. ' Plugins in use.')
  Debug(colour2, #vdevices .. ' VDs in use.' )
  Debug(colour2, #scenes .. ' Scenes, including hidden scenes.')
  Debug(colour2, #gvars .. ' Global variables.')
  Debug(colour2, 'There are '..#rooms ..' rooms  in '..#sections.. ' sections.')   
  Debug(colour1, separator)
 
end  --function

local startSource = fibaro:getSourceTrigger(); 
if (startSource["type"] == "other")	then
   checkDevices()
end

Hallo Jeep, Habs gerade mit der 4.5.10 probiert, dort bekomm ich leider einige Fehler:

[DEBUG] 15:08:54: Sun Aug 5 15:08:54 2018, Version: 0.1.6
[DEBUG] 15:08:54: [1;31m2018-08-05 15:08:54.954867 [ error] API: Not found
[DEBUG] 15:08:54: [1;31m2018-08-05 15:08:54.960705 [ error] API: Not found
[DEBUG] 15:08:54: [1;31m2018-08-05 15:08:54.963422 [ error] API: Not found
[DEBUG] 15:08:54: [1;31m2018-08-05 15:08:54.972440 [ error] API: Not found

Ist das nur bei mir so??
Eigenartig ist, dass die Debug Meldungen danach trotzdem ausgegeben werden !?

Hab mir übrigens schon vor dem Update in der letzten Version eine Funktion eingebaut die zusätzlich ein Email schickt!
Vielleicht magst du es in die aktuelle Version einbauen :wink:

einfach in Zeile 72 (deines aktuellen Skriptes)
fibaro:call(2, "sendEmail", "Fibaro-Info - Geräte Inventur",""…#rooms …" - Räume in "…#sections…" Bereichen \n"…bdev + nbdev…" - Geräte sind insgesamt installiert\n"…nbdev…" - Geräte mit Stromversorgung und\n"…bdev…" - batteriebetriebene Geräte\n"…#scenes…" - Szenen (auch versteckte)\n"…users…" - Benutzer\n"…iosdev… " - Samartphones\n"…cam… " - Kameras\n"…#plugins… " - Plugins\n"…#vdevices… " - virtuelle Geräte\n"…#gvars… " - globale Variablen\n\n")
einbauen …

@pblacky
2 Posts weiter oben, ist die 0.1.7, die sollte diesem Fehler mit der FW 4.510 nicht mehr aufweisen. :wink:

Hi pblacky,
habe Deinen Vorschlag (fast) 1 zu 1 umgesetzt. Hab nur noch eine Variable eingefügt für den Fall das jemand keine E-Mail haben will.

Changelog für Version 0.1.8
– Möglichkeit die Ausgabe an der Admin Email Adresse zu senden.

  --[[
%% properties
--]]

-- file: Device-inventory.lua 
-- version: 0.1.8
-- Works with version up to 4.150
-- purpose:This script shows the device inventory and prints the output to 
-- the debug window.
-- Click the Start button tu run the script.
-- Copyleft 08-2017 - 2018  {jeep}
-- 
local sourceTrigger = fibaro:getSourceTrigger();
local version   = "0.1.8"
local oldnodeId = nil ;
local colour1   = 'lightgreen'
local colour2   = 'orange'
local adminmail = false -- | true   
Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

devices = fibaro:getDevicesId({parentId = 1, enabled = true, isPlugin = false })
function checkDevices() 
  local vdev, bdev, users, iosdev, nbdev, cam = 0,0,0,0,0,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') 
     if batteryLevel ~= nil and batteryLevel ~= '' then  
         if oldnodeId ~= nodeId then
            bdev = bdev+1;
         end 
        oldnodeId = nodeId
     else
        nbdev = nbdev+1
     end  
  end  --for
  -- Count other devices 
  devices = fibaro:getDevicesId({visible = true, enabled = true, isPlugin = false }) 
  for id = 1, #devices do
      local dtype  = fibaro:getType(devices[id])
      if (dtype == 'iOS_device') then
          iosdev = iosdev+1;
        elseif (dtype == "com.fibaro.ipCamera") then
          cam = cam +1;
      end  
  end --for
  
 plugins  = fibaro:getDevicesId({ enabled = true, visible = true, isPlugin = true })
 vdevices = fibaro:getDevicesId({ enabled = true, visible = true, type="virtual_device" })
 scenes   = api.get("/scenes")
 gvars    = api.get("/globalVariables") 
 rooms    = api.get("/rooms") 
 sections = api.get("/sections")
 users    = api.get("/users") 
  separator = '------------------------------------------------'
  Debug('green','Here is your HC2 device list:')
  Debug(colour1, separator)
  Debug(colour1, bdev + nbdev .. ' Total physical Z-Wave devices.')
  Debug(colour2, nbdev ..' Non batterie devices.')
  Debug(colour2, bdev ..' Batterie devices.')
  Debug(colour2, #users ..' HC2 Users.')
  Debug(colour2, iosdev ..' iOS/Android devices.')
  Debug(colour2, cam ..' ip Cameras.')  
  Debug(colour2, #plugins .. ' Plugins in use.')
  Debug(colour2, #vdevices .. ' VDs in use.' )
  Debug(colour2, #scenes .. ' Scenes, including hidden scenes.')
  Debug(colour2, #gvars .. ' Global variables.')
  Debug(colour2, 'There are '..#rooms ..' rooms  in '..#sections.. ' sections.')   
  Debug(colour1, separator)
  if adminmail then 
     fibaro:call(2, "sendEmail", "Fibaro-Info - Geräte Inventur",""
       ..#rooms .." - Räume in "..#sections.." Bereichen \n"
       ..bdev + nbdev.." - Geräte sind insgesamt installiert\n"
       ..nbdev.." - Geräte mit Stromversorgung und\n"
       ..bdev.." - batteriebetriebene Geräte\n"
       ..#scenes.." - Szenen (auch versteckte)\n"
       ..#users.." - Benutzer\n"..iosdev.. " - Samartphones\n"
       ..cam.. " - Kameras\n"
       ..#plugins.. " - Plugins\n"
       ..#vdevices.. " - virtuelle Geräte\n"
       ..#gvars.. " - globale Variablen\n\n")
   end 
end  --function

local startSource = fibaro:getSourceTrigger(); 
if (startSource["type"] == "other")	then
   checkDevices()
end

Hi Jeep,

Hatte vorher eh die 0.1.7 probiert, diese Version machte die API Fehler!
Ich habe die 0.1.8 nun versucht, auch dort habe ich die API-Fehler, bei der FW 4.510.

Vielleicht kann das jemand außer mir mit der aktuellen Firmware Version nachvollziehen?

laut forum von fibaro selber ist das ein Fehler im System.
das script läuft zwar durch aber es kommt trotzdem immer wieder die API-Fehler meldung

@pblacky,
kein Stress, habe auf meinem Testsystem nur ein paar devices, konnte den Fehler deshalb nicht vollständig erkennen. Eigentlich warten wir alle das Fibaro diesen BUG (den es ist einer seit den 4.5xx betas) fixt.
Die Leute im Fibaro Forum (incl. me) sind schon stinksauer wegen diesem Fehler ohne Zeilenangabe und das ist nicht mal der schlimmste Fehler in dieser Version.

Hi pblacky,
da ich vermute das Fibaro so schnell keinen Fix für “API: not found” liefern wird, habe ich einen Teil des Scripts umgebaut. Ich hoffe der Fehler ist weg.
Bitte Testen.

 --[[
%% properties
--]]

-- file: Device-inventory.lua 
-- version: 0.1.9
-- Works with version up to 4.150
-- purpose:This script shows the device inventory and prints the output to 
-- the debug window.
-- Click the Start button tu run the script.
-- Copyleft 08-2017 - 2018  {jeep}
-- 
local sourceTrigger = fibaro:getSourceTrigger();
local version   = "0.1.9"
local oldnodeId = nil ;
local colour1   = 'lightgreen'
local colour2   = 'orange'
local adminmail = false -- | true 
Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

devices = fibaro:getDevicesId({interfaces ={"battery"},parentId = 1, enabled = true, isPlugin = false })

function checkDevices() 
  local vdev, bdev, users, iosdev, nbdev, cam = 0,0,0,0,0,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') 
     if batteryLevel ~= nil and batteryLevel ~= '' then  
         if oldnodeId ~= nodeId then
            bdev = bdev+1;
         end 
        oldnodeId = nodeId
     end  
  end  --for
  
  local alldev = 0
  local dev = api.get('/devices')
  for _,p in pairs(dev) do
     if p.parentId == 1 then
        alldev = alldev +1
     end
  end  
  nbdev = alldev - bdev
  -- Count other devices 
  devices = fibaro:getDevicesId({visible = true, enabled = true, isPlugin = false }) 
  for id = 1, #devices do
      local dtype  = fibaro:getType(devices[id])
      if (dtype == 'iOS_device') then
          iosdev = iosdev+1;
        elseif (dtype == "com.fibaro.ipCamera") then
          cam = cam +1;
      end  
  end --for
  
 plugins  = fibaro:getDevicesId({ enabled = true, visible = true, isPlugin = true })
 vdevices = fibaro:getDevicesId({ enabled = true, visible = true, type="virtual_device" })
 scenes   = api.get("/scenes")
 gvars    = api.get("/globalVariables") 
 rooms    = api.get("/rooms") 
 sections = api.get("/sections")
 users    = api.get("/users") 
  separator = '------------------------------------------------'
  Debug('green','Here is your HC2 device list:')
  Debug(colour1, separator)
  Debug(colour1, alldev .. ' Total physical Z-Wave devices.')
  Debug(colour2, nbdev ..' Non batterie devices.')
  Debug(colour2, bdev ..' Batterie devices.')
  Debug(colour2, #users ..' HC2 Users.')
  Debug(colour2, iosdev ..' iOS/Android devices.')
  Debug(colour2, cam ..' ip Cameras.')  
  Debug(colour2, #plugins .. ' Plugins in use.')
  Debug(colour2, #vdevices .. ' VDs in use.' )
  Debug(colour2, #scenes .. ' Scenes, including hidden scenes.')
  Debug(colour2, #gvars .. ' Global variables.')
  Debug(colour2, 'There are '..#rooms ..' rooms  in '..#sections.. ' sections.')   
  Debug(colour1, separator)
  if adminmail then 
     fibaro:call(2, "sendEmail", "Fibaro-Info - Geräte Inventur",""
       ..#rooms .." - Räume in "..#sections.." Bereichen \n"
       ..bdev + nbdev.." - Geräte sind insgesamt installiert\n"
       ..nbdev.." - Geräte mit Stromversorgung und\n"
       ..bdev.." - batteriebetriebene Geräte\n"
       ..#scenes.." - Szenen (auch versteckte)\n"
       ..#users.." - Benutzer\n"..iosdev.. " - Samartphones\n"
       ..cam.. " - Kameras\n"
       ..#plugins.. " - Plugins\n"
       ..#vdevices.. " - virtuelle Geräte\n"
       ..#gvars.. " - globale Variablen\n\n")
  end 
end  --function

local startSource = fibaro:getSourceTrigger(); 
if (startSource["type"] == "other")	then
   checkDevices()
end

Hallo zusammen,

hatte in der letzen Version die Mailausgabe nicht berücksichtigt. Durch die massive Änderung am script musste das auch angepasst werden. Beim Batteriecheck script wird es noch ein wenig dauern, oder Fibaro ist schneller. :wink:

Changelog für Version 0.2.0
– Keine API Fehler mehr
– Bug beim Mailversand gefixt.

--[[
%% properties
--]]

-- file: Device-inventory.lua 
-- version: 0.2.0
-- Works with version up to 4.150
-- purpose:This script shows the device inventory and prints the output to 
-- the debug window.
-- Click the Start button tu run the script.
-- Copyleft 08-2017 - 2018  {jeep}
-- 
local sourceTrigger = fibaro:getSourceTrigger();
local version   = "0.2.0"
local oldnodeId = nil ;
local colour1   = 'lightgreen'
local colour2   = 'orange'
local adminmail = true -- | Wenn true wird eine Mail an den admin Benutzer geschickt
Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

devices = fibaro:getDevicesId({interfaces ={"battery"},parentId = 1, enabled = true, isPlugin = false })

function checkDevices() 
  local vdev, bdev, users, iosdev, nbdev, cam = 0,0,0,0,0,0;
  Debug('withe', os.date('%c')..', Version: '.. version );
  Debug('cyan', 'Gathering device data...')
  for id = 1, #devices do
     local batteryLevel = fibaro:get(devices[id], 'batteryLevel')
     local nodeId       = fibaro:get(devices[id], 'nodeId') 
     if batteryLevel ~= nil and batteryLevel ~= '' then  
         if oldnodeId ~= nodeId then
            bdev = bdev+1;
         end 
        oldnodeId = nodeId
     end  
  end  --for
  
  local alldev = 0
  local dev = api.get('/devices')
  for _,p in pairs(dev) do
     if p.parentId == 1 then
        alldev = alldev +1
     end
  end  
  nbdev = alldev - bdev
  -- Count other devices 
  devices = fibaro:getDevicesId({visible = true, enabled = true, isPlugin = false }) 
  for id = 1, #devices do
      local dtype  = fibaro:getType(devices[id])
      if (dtype == 'iOS_device') then
          iosdev = iosdev+1;
        elseif (dtype == "com.fibaro.ipCamera") then
          cam = cam +1;
      end  
  end --for
  
 plugins  = fibaro:getDevicesId({ enabled = true, visible = true, isPlugin = true })
 vdevices = fibaro:getDevicesId({ enabled = true, visible = true, type="virtual_device" })
 scenes   = api.get("/scenes")
 gvars    = api.get("/globalVariables") 
 rooms    = api.get("/rooms") 
 sections = api.get("/sections")
 users    = api.get("/users") 
  separator = '------------------------------------------------'
  Debug('green','Here is your HC2 device list:')
  Debug(colour1, separator)
  Debug(colour1, alldev .. ' Total physical Z-Wave devices.')
  Debug(colour2, nbdev ..' Non batterie devices.')
  Debug(colour2, bdev ..' Batterie devices.')
  Debug(colour2, #users ..' HC2 Users.')
  Debug(colour2, iosdev ..' iOS/Android devices.')
  Debug(colour2, cam ..' ip Cameras.')  
  Debug(colour2, #plugins .. ' Plugins in use.')
  Debug(colour2, #vdevices .. ' VDs in use.' )
  Debug(colour2, #scenes .. ' Scenes, including hidden scenes.')
  Debug(colour2, #gvars .. ' Global variables.')
  Debug(colour2, 'There are '..#rooms ..' rooms  in '..#sections.. ' sections.')   
  Debug(colour1, separator)
  if adminmail then 
     fibaro:call(2, "sendEmail", "Fibaro-Info - Geräte Inventur",""
       ..#rooms .." - Räume in "..#sections.." Bereichen \n"
       ..alldev.." - Geräte sind insgesamt installiert\n"
       ..nbdev.." - Geräte mit Stromversorgung und\n"
       ..bdev.." - batteriebetriebene Geräte\n"
       ..#scenes.." - Szenen (auch versteckte)\n"
       ..#users.." - Benutzer\n"..iosdev.. " - Samartphones\n"
       ..cam.. " - Kameras\n"
       ..#plugins.. " - Plugins\n"
       ..#vdevices.. " - virtuelle Geräte\n"
       ..#gvars.. " - globale Variablen\n\n")
  end 
end  --function

local startSource = fibaro:getSourceTrigger(); 
if (startSource["type"] == "other")	then
   checkDevices()
end

Hi @jeep
Dankle für die rasche Problemlösung, dein Skript V 0.2.0 funktioniert hervorragend mit der 4.5.x Firmware!

Hi Jeep,

Ich hatte heute mal wieder das Problem, dass ein Türsensor sich ohne - mir ersichtlichen-Grund verabschiedet hatte. Kein großes Problem, neu eingebunden, Szenen angepasst, läuft.
Also habe ich mich auf die Suche nach einem VD/Script gemacht, das regelmässig alle Devices etc listet und mich warnt wenn es Veränderungen gegeben hat. Hab noch nichts passendes gefunden und dachte mir das man Deine Szene hier entsprechend weiterentwickeln könnte. Meine Idee wäre den Output Deiner Szene in einer globalen Variablen abzulegen und bei der nächsten Ausführung der Szene die Ergebnisse zu vergleichen. Leider sind meine eigenen Fähigkeiten im Umgang mit Arrays sehr bescheiden, aber vielleicht hat ja jemand hier im Forum Lust das umzusetzen… oder kennt eine schon vorhandene Lösung zur Prüfung der Vollständigkeit von Devices.
Grüße
Lodi

Hi Lodi,

Das battery check script von jeep müsste eigentlich das sein was du brauchts. Dort wird auch der “last breached” gelistet also letzte Reaktion. Teste es mal an.

Hi Ändy,

Danke für den Tipp. Manchmal sieht man den wald vor lauter Bäumen nicht. Den battery check habe ich schon seit einiger Zeit laufen und das “last breached” Attribut ist natürlich genau das was ich brauche. Einzig würde ich die komplett verlorenen Devices dort nicht so schnell erkennen. Aber das kommt zum Glück ja nicht allzu häufig vor.
Grüße
Lodi

…habs gerade noch mal laufen lassen und gleich noch einen anderen Übeltäter gefunden. Window Sensor im Gästebad hatte seit Tagen keinen breach. Kurz Batterie raus und wieder rein und siehe da nun hat es 255% --> also leer.
Ich denke ich muss mir also meinen täglichen Batterie Report etwas genauer ansehen. Hab seit ein paar Wochen alles nett mit InfluxDB und Grafan grafisch aufbereitet und dachte darüber geht mir nix mehr durch die Lappen…
Hier noch mal ein herzliches “Danke Schön” an Jeep für seine tollen Skripte.
Gruß
Alex