LUA / Finder

Recherche un ID / Texte dans toutes les scènes / VD de la HC2

--[[
%% autostart
--]]
 
-- ===========================================
-- FINDER ...
-- Recherche dans tous le code de la HC2
-- ===========================================
 
local checkDisabled = false -- true pour vérifier aussi les scènes et VD désactivés
 
-- Tableau contenant les mots à trouvé dans le code de la HC2
local findWhat = {"127"}
 
 
--[[ ===========================================
NE PAS TOUCHER
--=========================================== ]]
-- toolbox c.f. https://gea.piccand.me/doku.php/minifier
if not tools then tools={log=function(a,b,c)a=tools.tostring(a) mailmsg = mailmsg .. a .. "\n" for d,e in string.gmatch(a,"(#spaces(%d+)#)")do local f=""for g=1,e do f=f.."."end;a=string.gsub(a,d,"<span style=\"color:black;\">"..f.."</span>")end;if debug or c then fibaro:debug("<span style=\"color:"..(b or"white")..";\">"..a.."</span>")end end,error=function(a,b)tools.log(a,b or"red",true)end,warning=function(a,b)tools.log(a,b or"orange",true)end,info=function(a,b)tools.log(a,b or"white",true)end,debug=function(a,b)tools.log(a,b or"gray",false)end,tostring=function(h)if type(h)=="boolean"then if h then return"true"else return"false"end elseif type(h)=="table"then if json then return json.encode(h)else return"table found"end else return tostring(h)end end,split=function(i,j)local j,k=j or":",{}local l=string.format("([^%s]+)",j)i:gsub(l,function(m)k[#k+1]=m end)return k end,trim=function(n)return n:gsub("^%s*(.-)%s*$","%1")end,deep_print=function(o)for g,p in pairs(o)do if type(p)=="table"then deep_print(p)else print(g,p)end end end,getStringTime=function(q)if q then return os.date("%H:%M:%S")end;return os.date("%H:%M")end,toTime=function(r)local s,t=string.match(r,"(%d+):(%d+)")local u=os.date("*t")local v=os.time{year=u.year,month=u.month,day=u.day,hour=s,min=t,sec=0}if v<os.time()then v=os.time{year=u.year,month=u.month,day=u.day+1,hour=s,min=t,sec=0}end;return v end,getStringDate=function()return os.date("%d/%m/%Y")end,isNil=function(w)return type(w)=="nil"end,isNotNil=function(w)return not tools.isNil(w)end}end
 
local version = "1.0"
 
--[[ ===========================================
      Parcours les mots à chercher
		w : mot à comparer
      ===========================================]]
function isSearched(w) 
  for _,v in ipairs(findWhat) do
    if (string.lower(w) == string.lower(v) ) then
      return true
    end
  end
  return false
end
 
--[[ ===========================================
      Cherche un mot dans le header d'une scène
	paramètres :
		scene : la scène à analyser
      ===========================================]]
function checkheader(scene)
  local found = false
  for header in string.gmatch(scene.lua, "%-%-%[%[(.-)%-%-%]%]") do
    for w, device in string.gmatch(header, "(%a+) (%d+)") do
      if (isSearched(w)) then
        tools.warning(w .. " trouvé")
        found = true
      end
      if (isSearched(device)) then
        tools.warning(device .. " trouvé")
        found = true
      end
    end
  end
  return found
end
 
 
--[[ ===========================================
      Cherche un mot dans le code
	paramètres :
		code : le code a analyser
		part : la partie analysée (pour le log)
      ===========================================]]
function checkWords(code, part)
  local found = false
  local position = 0
  if (findWhat) then
    for _,v in ipairs(findWhat) do
      if string.match(code, v) then
        tools.warning(" found " .. v .. " in ".. part)
        found = true
      end
    end
  end
  return found
end
 
--[[ ===========================================
      Analyse les scénarios
      ===========================================]]
function findWordsInScenes() 
  local found = false
  tools.log("--------------------------------------------", "lightblue", true)
  tools.log("Checking scenes ... ", "lightblue", true)
  tools.log("--------------------------------------------", "lightblue", true)
  local scenes = api.get("/scenes")
  for k,v in ipairs(scenes) do
    local scene = __fibaro_get_scene(v.id)
    if (tools.isNotNil(scene) and (scene.runConfig ~= "DISABLED" or checkDisabled)) then
      tools.log("checking scene : [" .. scene.id .. "] " .. scene.name, "gray", true)
      if (string.find(scene.lua, "findWordsInScenes()")) then
        -- on ignore car il s'agit de cette même scène
      else 
        if (checkheader(scene)) then found = true end
        if (checkWords(scene.lua, "code")) then found = true end
      end
    end
  end
  tools.log("... done ", "lightblue", true)
  return problem
end
 
--[[ ===========================================
      Analyse les virtual devices
      ===========================================]]
function findWordsInVirtual() 
  local found = false
  tools.log("--------------------------------------------", "lightblue", true)
  tools.log("Checking virtual devices ... ", "lightblue", true)
  tools.log("--------------------------------------------", "lightblue", true)
  local filter = {type="virtual_device", enabled = true}
  if (checkDisabled) then
    filter = {type="virtual_device"}
  end
  local ids = fibaro:getDevicesId(filter)
  for k,v in ipairs(ids) do
    vd = __fibaro_get_device(v)
    if (tools.isNotNil(vd)) then
      tools.log("checking vd : [" .. vd.id .. "] " .. vd.name, "gray", true)
      if (tools.isNotNil(vd.properties.mainLoop)) then 
        tools.log(" --> checking mainLoop", "gray")
        if (checkWords(vd.properties.mainLoop, "mainloop")) then found = true end
        for l,w in ipairs(vd.properties.rows) do
          if (w.type=="button") then
            for m,x in ipairs(w.elements) do
              if (x.lua) then
                tools.log(" --> checking " .. x.caption .. " ["..x.name.."]", "gray")
                if (checkWords(x.msg, x.caption .. " ["..x.name.."]") ) then found = true end
              end
            end
          end
        end
      end
    end
  end
  tools.log("... done ", "lightblue", true)
  return found
end
 
--[[ ===========================================
   	  Lancement du code
   	===========================================]]
function run()
  mailmsg = ""
  tools.log("======================", "lightblue", true)
  tools.log(" Starting FINDER v."..version, "lightblue", true)
  tools.log(" Cet outil ESSAIE de trouver des mots dans le code LUA", "lightblue", true)
  tools.log("======================", "lightblue", true)
  tools.log("", "gray", true)
 
  findWordsInScenes()
  findWordsInVirtual()
  tools.log("--- Terminé ---", "lightblue", true)
end
run()