Mesh Konfiguration auslesen HC3

Hi, so wie jedes andere LUA File, copy und paste.
Auf Szenen gehen, Szene hinzufügen, LUA-Szene , Name vergeben und die Version 0.1.8 von hier reinkopieren. Speichern, Fertig.

Das ist für die Neulinge etwas schwierig, die sind gewöhnt das alles mit der Maus funktioniert (rechte und linke Maustaste).
Bei einigen Sachen und Eingaben fiunktioniert das mit der Maus aber nicht.
Die Alten tastenkombinationen funktionieren aber fast immer.
strg-c strg-v werden oft vergessen oder sind teilweise unbekannt.
Tastenkombinationen in Windows (microsoft.com)
Das ist mir jetzt Hier und auch in anderen Foren aufgefallen.
Gruss Frank

Unter Windows hat es funktioniert, danke. Ich hatte zuvor den Browser des IPAD benutzt, hier hat die Funktion Copy/Paste nicht ausgelöst.
Ich weiß nun, das ich für diese Aktionen einen PC nutzen sollte.

Danke für die Hilfe
Norbert

Hallo Norbert

Auch mit einem Android Tablett kannst du kopieren und einfügen.
Das geht bestimmt auch mit einem IPAD nur leider kenne ich Apple-Produkte nicht und kann damit nicht umgehen.
Sorry da habe ich nicht richtig gelesen.
Gruss Frank

Muss mal ein kleines Update nachschieben, da ich einiges am Script geändert habe.

  1. Bei zu vielen Nachbarn wird die Zeile in der Debug-Console umbrochen was dann sehr unschön aussieht.
    Deshalb habe ich die Zeile der Nachbarn auf ca. 100. Zeichen gekürzt.
  2. Wer vom HC2 zum HC3 gewechselt ist und die automatische Migration der Module gemacht hat, hat zwangsweise keine laufenden IDs bei den Device-childs. Dadurch kann das Script die Sections nicht mehr auslesen und bleibt mit einem LUA- Fehler hängen.
    Aus diesem Grund gibt es jetzt die Variable „checksection“. Wird sie auf false gesetzt, ignoriert das Script die Section und macht weiter.
    Da ich bei mir alle Geräte einzeln ex- und im HC3 includiert habe gibt es bei mir nur absteigende IDs ohne Löcher.
    Somit kann ich das Script nicht so ändern, das ich es im Fehlerfall mit einem protected call weiterlaufen lassen kann.
    Eigentlich ist die Zusammenfassung am Ende das wichtigste.

-- File    : RoutingInfo.lua
-- Version : 0.1.9 -  {06.04.2021}
-- Copyleft: {jwi} 
-- Abkürzung : working route respose time = WRRT
-- 
-- Please note the local variables, "html" and "checksection". 
-- 
local function printf(...) fibaro.debug(tag, string.format(...)) end
local function getSNamebyID(sectionID)
  --fibaro.debug (sectionID)
      if tonumber(sectionID) > 0 then
        local section = api.get("/sections/" .. tostring(sectionID))
        return string.sub(tostring(section.name),1, 10)
     end
   return 'No section'  
end
 
local function getSectionNameByDeviceID(DevID)
  	if DevID == nil then 
    	return 'nil'
    else
		local sectionID = fibaro.getSectionID(DevID)
    	if sectionID == nil then
      		return 'nil'
      	else
  			return getSNamebyID(sectionID)
      	end
    end
end

local function countc(s,c)
  local n = 0 
  local _,n = s:gsub(c,"")
  if (n==1) then r1h = r1h +1 
     elseif n==2 then r2h = r2h +1
     elseif n==3 then r3h = r3h +1 
     elseif n==4 then r4h = r4h +1 
     
  end
  return n
end
 
local filter = '/devices/?enabled=true&isPlugin=false'
local allDevices = api.get(filter)
local html = false
local checksection = false --if False no section is displayed
local output = ''
if (html == false) then d = true 
  elseif ( html == true) then d = false;
end
local nn,r,nr=0,0,0
r1h,r2h,r3h,r4h=0,0,0,0
local n=0 --nur Geräte mit parentId = 1
-- Ab hier Ausgabe
if html then 
   print('<font size="2"><font color="green">---------------Starte Ausgabe---------------------</font>' )
    printf('<font color="cyan">Daten werden im HTML Format ausgegeben - Bitte warten...')
 else 
   print("----------------Starte Ausgabe---------------------")  
end  
for id = 1, #allDevices do
  if (allDevices[id].parentId == 1 )  then
     local mDevID = allDevices[id].id
     if mDevID ~= nil then
        local name = fibaro.getName(mDevID+1) 
        if name == nil then 
           name = "No Name"
        end 
 
        if(tonumber(allDevices[id+1].roomID) == 0) then
          room = 'No room';
        else
          room = fibaro.getRoomNameByDeviceID(allDevices[id+1].id)
        end
   
        local section = getSectionNameByDeviceID(mDevID+1)
        if section == nil then
           section = "No Name"
        end 

        n= n+1
        if checksection then
           thisDev = "Neighbours of device " .. mDevID ..') '..name ..' (' .. room .. '|' .. section .. ') : ' .. json.encode(fibaro.getValue(mDevID, "neighborList"))
        else
           thisDev = "Neighbours of device " .. mDevID ..') '..name ..' (' .. room .. ') : ' .. json.encode(fibaro.getValue(mDevID, "neighborList"))
        end
        if thisDev:find("%p[%p]") then 
           print('Device '.. name..'('..mDevID..')'.. ' hat keine Nachbarn')
           nn = nn + 1 
         else 
            thisDev=string.sub(thisDev,1,150).."</br>"
            if html then thisDev = "<br>"..thisDev end  
        end 
        if html then output = '<font size="2"><font color="yellow">'..output..thisDev.."</font>" end
        if d then print(thisDev) end
 
        local lwr = json.encode(fibaro.getValue(mDevID, "lastWorkingRoute"))      
        thisDevRoute = "Last working route used by device " .. mDevID .. " : " .. lwr
        if thisDevRoute:find("%p[%p]") then 
           print('Device ' ..name..'('..mDevID..')'.. ' hat keine Routen') 
           nr = nr +1
        end    
        if string.len(lwr) == 3 then 
           r = r +1 
           hops = " "
        else
           hops=countc(lwr,',')
        end
        if (hops == nil or hops==0) then hops = " " end
        if html then output = '<font size="2"><font color="yellow">'..output..thisDevRoute..' - hops: '..hops.."</font></br>" end  
        if d then print( thisDevRoute.." - hops: "..hops) end
  
        thisDevTimeStamp = tonumber(fibaro.getValue(mDevID, "lastWorkingRouteResponseTimestamp"))  
        thisDevLWRRTime  = "Last WRRT for device ".. mDevID .. ': '.. (os.date("%X  - %d %b. %y", thisDevTimeStamp ))
        
        if html then output = '<font size="2"><font color="yellow">'..output..thisDevLWRRTime.."</font> </br>" ..n..'-- <br />' end
        if d then print( thisDevLWRRTime) end
        
        if d then print( n..'--') end
        --n =n+1 
        if d then print ('--------------------------------------') end
        fibaro.sleep(100)  
     end
  end
end --for
print(output)
fibaro.trace("SCENE"..sceneId, 'Ausgabe vom '..os.date('%d.%m.%Y')..' über '..n.. ' devices.')
printf('<font color="green">Direkte routen, [1] zum HC3: '..r)
printf('<font color="yellow">Routen über 1 hop, zum HC3: '..r1h)
printf('<font color="orange">Routen über 2 hops zum HC3: '..r2h)
printf('<font color="red">Routen über 3 hops zum HC3: '..r3h)
printf('<font color="darkred">Routen über 4 hops zum HC3: '..r4h)
printf("-------------------------------")
printf("Devices ohne Nachbarn [] : "..nn)
printf("Devices ohne routen [] : "..nr)

Ich habe jetzt alle meine Geräte und Szenen vom HC2 nach HC3 migriert. Bei fast 100 devices habe ich jetzt festgestellt das die html Ausgabe des Scripts, vermutlich wegen Umlauten und/oder Sonderzeichen in den Namen nicht immer optimal aussieht. Deshalb habe ich html per default auf false gestellt.
Die Anzahl der hops in der Ausgabe wird jetzt wie in der Zusammenfassung mit der gleichen Farbe hinterlegt. Erleichtert das Auffinden der Geräte.
Noch eine Besonderheit - setzt man local html = nil , erhält die Ausgabe nur die Zusammenfassung.


-- File    : RoutingInfo.lua
-- Version : 0.2.1 -  {30.04.2021}
-- Copyleft: {jwi} 
-- Abkürzung : working route respose time = WRRT
-- 
-- Please note the local variables, "html" and "checksection". 
-- 
local function printf(...) fibaro.debug(tag, string.format(...)) end
local function getSNamebyID(sectionID)
  --fibaro.debug (sectionID)
      if tonumber(sectionID) > 0 then
        local section = api.get("/sections/" .. tostring(sectionID))
        return string.sub(tostring(section.name),1, 10)
     end
   return 'No section'  
end
 
local function getSectionNameByDeviceID(DevID)
  	if DevID == nil then 
    	return 'nil'
    else
		local sectionID = fibaro.getSectionID(DevID)
    	if sectionID == nil then
      		return 'nil'
      	else
  			return getSNamebyID(sectionID)
      	end
    end
end

local function countc(s,c)
  local n = 0 
  local _,n = s:gsub(c,"")
  if (n==1) then r1h = r1h +1 
       return '<font color="yellow">'..n..'</font>'
     elseif n==2 then r2h = r2h +1
       return '<font color="orange">'..n..'</font>'
     elseif n==3 then r3h = r3h +1 
       return '<font color="red">'..n..'</font>'
     elseif n==4 then r4h = r4h +1 
  end
  return '<font color="darkred">'..n..'</font>'
end
 
local filter = '/devices/?enabled=true&isPlugin=false'
local allDevices = api.get(filter)
local html = false --Kann true, false oder nil sein, nil = nur Zusammnfassung
local checksection = false --if False no section is displayed
local output = ''
if (html == false) then d = true 
  elseif ( html == true) then d = false;
end
local nn,r,nr=0,0,0
r1h,r2h,r3h,r4h=0,0,0,0
local n=0 --nur Geräte mit parentId = 1
-- Ab hier Ausgabe
if html then 
   print('<font size="2"><font color="green">---------------Starte Ausgabe---------------------</font>' )
    printf('<font color="cyan">Daten werden im HTML Format ausgegeben - Bitte warten...</font>')
 else 
   print("----------------Starte Ausgabe---------------------")  
end  
for id = 1, #allDevices do
  if (allDevices[id].parentId == 1 )  then
     local mDevID = allDevices[id].id
     if mDevID ~= nil then
        local name = fibaro.getName(mDevID+1) 
        if name == nil then 
           name = "No Name"
        end 
 
        if(tonumber(allDevices[id+1].roomID) == 0) then
          room = 'No room';
        else
          room = fibaro.getRoomNameByDeviceID(allDevices[id+1].id)
        end
   
        local section = getSectionNameByDeviceID(mDevID+1)
        if section == nil then
           section = "No Name"
        end 

        n= n+1
        if checksection then
           thisDev = "Neighbours of device " .. mDevID ..') '..name ..' (' .. room .. '|' .. section .. ') : ' .. json.encode(fibaro.getValue(mDevID, "neighborList"))
        else
           thisDev = "Neighbours of device " .. mDevID ..') '..name ..' (' .. room .. ') : ' .. json.encode(fibaro.getValue(mDevID, "neighborList"))
        end
        if thisDev:find("%p[%p]") then 
           print('Device '.. name..'('..mDevID..')'.. ' hat keine Nachbarn')
           nn = nn + 1 
         else 
            thisDev=string.sub(thisDev,1,150).."</br>"
            if html then thisDev = "<br>"..thisDev  end   
        end 
        if html then output = '<font size="2"><font color="yellow">'..output..thisDev.."</font>" end
        if d then print(thisDev) end
 
        local lwr = json.encode(fibaro.getValue(mDevID, "lastWorkingRoute"))      
        thisDevRoute = "Last working route used by device " .. mDevID .. " : " .. lwr
        if thisDevRoute:find("%p[%p]") then 
           print('Device ' ..name..'('..mDevID..')'.. ' hat keine Routen') 
           nr = nr +1
        end    
        if string.len(lwr) == 3 then 
           r = r +1 
           hops = " "
        else
           hops=countc(lwr,',')
        end
        if (hops == nil or hops==0) then hops = " " end
        if html then output = '<font size="2"><font color="yellow">'..output..thisDevRoute..' - hops: '..hops.."</font></br>" end  
        if d then print( thisDevRoute.." - hops: "..hops) end
  
        thisDevTimeStamp = tonumber(fibaro.getValue(mDevID, "lastWorkingRouteResponseTimestamp"))  
        thisDevLWRRTime  = "Last WRRT for device ".. mDevID .. ': '.. (os.date("%X  - %d %b. %y", thisDevTimeStamp ))
        
        if html then output = '<font size="2"><font color="yellow">'..output..thisDevLWRRTime.."</font> </br>" ..n..'-- <br />' end
        if d then print( thisDevLWRRTime) end
        
        if d then print( n..'--') end
        --n =n+1 
        if d then print ('--------------------------------------') end
        fibaro.sleep(100)  
     end
  end
end --for
print(output)
fibaro.trace("SCENE"..sceneId, 'Ausgabe vom '..os.date('%d.%m.%Y')..' über '..n.. ' devices.')
printf('<font color="green">Direkte routen, [1] zum HC3: '..r)
printf('<font color="yellow">Routen über 1 hop, zum HC3: '..r1h)
printf('<font color="orange">Routen über 2 hops zum HC3: '..r2h)
printf('<font color="red">Routen über 3 hops zum HC3: '..r3h)
printf('<font color="darkred">Routen über 4 hops zum HC3: '..r4h)
printf("-------------------------------")
printf("Devices ohne Nachbarn [] : "..nn)
printf("Devices ohne routen [] : "..nr)