Aller au contenu
lolomail

Script Contrôle des noeuds mort et leur réveil

Recommended Posts

Je confirme depuis la version 3.5xx le HC2 s'occupe de tout cela, il y a la possibilité de les afficher ou non dans l'interface. Pour la résolution complète des dead nodes attendez la sortie de la V4.xx dans quelques semaines / mois ou installez des wall plugs partout :D

Hello,

 

Je comprends plus, HC2 gère tout seul de réveiller les noeuds dead ou pas ?

 

Merci

Zozotte

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour,

Depuis que je suis passé en V 4.081 , [DeadNodesAnalysis est bloqué et j'ai ce message en debug : 

[ERROR] 11:07:07: line 48: attempt to call global 'type' (a string value)

. cela n'a peut être rien à  voir avec la MAJ et j'ai mis le correctif de Steven?

 

:07: true

Partager ce message


Lien à poster
Partager sur d’autres sites

tu as mis le correctif de Steven dans le code de ce VD ? Car le correctif de Steven est dans le code de GEA.

Partager ce message


Lien à poster
Partager sur d’autres sites

Non, effectivement cela n'a pas de rapport!

Partager ce message


Lien à poster
Partager sur d’autres sites

En fait c'est la date qui ne s'actualise plus! 

Partager ce message


Lien à poster
Partager sur d’autres sites

Je comprends plus rien. Sorry, tu me connais, je comprends vite, mais il faut m'expliquer longtemps.

Comme ce VD est loin dans ma méloire, il faut m'ider. Et comme je ne suis pas en 4.081b je ne peut pas reproduire l'erreur.

Alors dis mois de quel bouton il s'agit et donne le code entourant l'erreur.

Partager ce message


Lien à poster
Partager sur d’autres sites

La 4.081 génère un plantage au bout d'un temps x des mainloop, donc normal. Il faut retourner en 4.080, laisse tomber cette 4.081.

Partager ce message


Lien à poster
Partager sur d’autres sites

depuis la version 4.082( ?) le VD ne fonctionne plus.

Voici donc le code qui fonctionne pour le bouton "DeadNodesAnalysis"

--------------------------
-- User Settings
--------------------------
local IconeDead = 44
local IconeOk = 45
local IconeRun = 46
local push_dev = 2 -- id of the user to send push message to (2 is admin user)
local exclude = {} -- les des id des devices àne pas tester si dead
local wakeup = false -- true / false si on veut / ne veut pas de tentative de réveil des noeuds morts
FreqNotif = 12 -- fréquence de notification [h] si un noeud est mort
-- entrez la fréquence [s] de vérification dans le champ IP Address de ce VD

----------------------------------
-- DO not change bellow this line
----------------------------------
local now = os.time()
local selfID = fibaro:getSelfId()
local HC2 = Net.FHttp("127.0.0.1",11111)

fibaro:call(selfID, "setProperty", "currentIcon", IconeRun)
fibaro:call(selfID, "setProperty", "ui.Excluded.value", #exclude)

-- display FreqNotif
fibaro:call(selfID, "setProperty", "ui.FreqNotif.value", FreqNotif.." h")

-- display wakeup
if wakeup == true
  then
    fibaro:call(selfID, "setProperty", "ui.wakeup.value", "Oui")
  else
    fibaro:call(selfID, "setProperty", "ui.wakeup.value", "Non")
end 

-- check if notification to be send
SendNotification = fibaro:get(selfID,"IPAddress")
if SendNotification ~= "Oui" then SendNotification = "Non" end
fibaro:call(selfID, "setProperty", "ui.Notification.value", SendNotification)

-- fréquence de vérification ?
local Frequence = fibaro:get(fibaro:getSelfId(),"TCPPort")
Frequence = tonumber(Frequence)
-- si TCPPort est vide, la valeur par défaut retournée est 80 => fréquence = 60s
if Frequence == 80 or Frequence <= 10 then Frequence = 60 end
fibaro:call(selfID, "setProperty", "ui.FreqAnal.value", Frequence.." sec")

-- vérification si variable "DeadNodes" existe
local response, status, error = HC2:GET("/api/globalVariables/")
Variables = json.decode(response)
local Exist = false
for  _, v in pairs(Variables) do
  if v.name == "DeadNodes" then Exist = true end
end
fibaro:debug("La variable DeadNodes exite : "..tostring(Exist))
-- création de la variable "DeadNodes" si elle n'existe pas
if Exist == false then
  temp = '{"name":"DeadNodes", "isEnum":0, "value":"NaN"}'
  fibaro:debug(temp)
  HC2:POST("/api/globalVariables", temp)
end

-- chargement de la VG DeadNodes
fibaro:debug("Chargement de la VG DeadNodes")
local DeadNodes = {}
DeadNodes = fibaro:getGlobal("DeadNodes")
if DeadNodes ~= "NaN" or DeadNodes ~= ""
  then DeadNodes = json.decode(DeadNodes)
end
if type(DeadNodes) ~= "table" then DeadNodes = {} end
fibaro:debug("VG DeadNodes chargée")

---------------------
-- FUNCTIONS
---------------------

-- envoie mails notification
function SendNotif(msg)
  if SendNotification == "Oui" then
    fibaro:call(push_dev, "sendEmail", "Dead nodes discovering", msg) 
  end 
end

-- affichage des noeuds morts
function DisplLabel(dead, label)
  if dead <= 9 then
    fibaro:call(selfID, "setProperty", "ui.DeadNode" ..dead.. ".value", label)
  end  
end

-- affichage du status
function Status(status)
  fibaro:call(selfID, "setProperty", "ui.Status.value", status)
end

-- affichage du log
function Log(log)
  fibaro:log(log)
end

-- vérifier si noeud dans la table
function InTable(Device)
  if DeadNodes["DV"..Device] == nil
    then return false
    else return true
  end
end

-- wakeup function
function WakeUp(Device)
  fibaro:call(1, "wakeUpDeadDevice", Device)
  Status ("Réveil de " ..devID)
  Log(dead.. " DeadNodes - Send Notif = " ..SendNotification.. "/" ..FreqNotif.. "h - Réveil de " ..Device)
  fibaro:sleep(30*1000) -- attendre 30s pour tester si le node est réveillé
end
---------------------
-- END FUNCTIONS
---------------------

Status ("Analyse")

dead = 0     -- counts # dead nodes
local devices = 0  -- counts # devices discovered
local i = 0 

-- clear labels
for i = 1, 9 do
  DisplLabel(i, " ")
end

-- Récupération de la liste des modules
reponse = HC2:GET("/api/devices")
jsonResponse = json.decode(reponse)
fibaro:debug("Liste des modules chargée")

-- dead nodes analysis
for _, v in ipairs(jsonResponse) do
  -- vérification si device dans la liste des devices exclus
  local found = false
  for e = 1, #exclude do
    if v.id == exclude[e] then found = true end
  end
  if found == false and v.visible == true and v.properties.dead ~= nil then 
    devices = devices + 1
    Status ("Analyse")
    fibaro:debug("Analyse - #Devices = "..devices)
    Log(dead.. " DeadNodes - Send Notif = " ..SendNotification.. "/" ..FreqNotif.. "h - Analyse en cours")
    dev = v.name
    dtype = v.type
    devID = tonumber(v.id)
 
    -- si node est dead/mort
    if v.properties.dead == "true"
      then -- le node est dead
        dead = dead + 1
        fibaro:debug("Device "..devID.." mort- total = "..dead)
        -- affichage du node qui est dead si <=9
        DisplLabel(dead, dev.. " (" ..devID.. ")")

        -- vérification si device est dans la table des noeuds morts
        if InTable(devID) == true
          then -- dans table
            -- vérification si > fréquence de notification
            if (DeadNodes["DV"..devID] + (FreqNotif*60*60)) < now
              then -- fréq notif : notif ok
                DeadNodes["DV"..devID] = now

                -- check si sur batterie
                if v.properties.batteryLevel ~= nil or wakeup == false
                  then -- sur batterie
                    SendNotif(os.date("%d/%m/%y %H:%M").." : "..dtype.." "..dev.." ID("..devID..") is on battery and was NOT awakened (or wakeup = false). Next notification at "..os.date("%X", DeadNodes["DV"..devID]+FreqNotif*60*60))
                  else -- sur secteur
                    -- wakeup process with mail
                    WakeUp(devID)
                    if v.properties.dead == "true" 
                      then
                        -- le node est toujours dead
                        SendNotif(os.date("%d/%m/%y %H:%M").." : "..dtype.." "..dev.." ID("..devID..") is still dead after unsuccessful wakeup. Next notification at "..os.date("%X", DeadNodes["DV"..devID]+FreqNotif*60*60))
                      else
                        -- le node i a été réveillé
                        dead = dead - 1
                        -- effacer le node qui a été réveillée si <=9
                        DisplLabel(dead, " ")
                        SendNotif(os.date("%d/%m/%y %H:%M").." : "..dtype.." "..dev.." ID("..devID..") was awakened successfully.")
                    end -- still dead
                end -- batterie
              else -- fréq notif : pas notif
                -- check si sur batterie
                if v.properties.batteryLevel ~= nil or wakeup == false
                  then -- sur batterie
                    -- check next node
                  else -- sur secteur
                    -- wakeup process without mail
                    WakeUp(devID)
                    if v.properties.dead == "true" 
                      then
                        -- le node est toujours dead
                      else
                        -- le node i a été réveillé
                        dead = dead - 1
                        -- effacer le node qui a été réveillée si <=9
                        DisplLabel(dead, " ")
                        SendNotif(os.date("%d/%m/%y %H:%M").." : "..dtype.." "..dev.." ID("..devID..") was awakened successfully" )
                    end -- still dead          
                end -- batterie
            end -- < fréq notif
          else -- pas dans table
            DeadNodes["DV"..devID] = now
            -- check si sur batterie
            if v.properties.batteryLevel ~= nil or wakeup == false
              then -- sur batterie
                SendNotif(os.date("%d/%m/%y %H:%M").." : "..dtype.." "..dev.." ID("..devID..") is on battery and was NOT awakened (or wakeup = false). Next notification at "..os.date("%X", DeadNodes["DV"..devID]+FreqNotif*60*60))
              else -- sur secteur
                -- wakeup process with mail
                WakeUp(devID)
                if v.properties.dead == "true" 
                  then
                    -- le node est toujours dead
                    SendNotif(os.date("%d/%m/%y %H:%M").." : "..dtype.." "..dev.." ID("..devID..") is still dead after unsuccessful wakeup. Next notification at "..os.date("%X", DeadNodes["DV"..devID]+FreqNotif*60*60))
                  else
                    -- le node i a été réveillé
                    dead = dead - 1
                    -- effacer le node qui a été réveillée si <=9
                    DisplLabel(dead, " ")
                    SendNotif(os.date("%d/%m/%y %H:%M").." : "..dtype.." "..dev.." ID("..devID..") was awakened successfully" )
                end -- still dead
            end -- batterie
        end -- InTable
      else  -- not dead
        -- vérification si device est dans la table des noeuds morts
        if InTable(devID) == true
          then -- dans table
            SendNotif(os.date("%d/%m/%y %H:%M").." : "..dtype.." "..dev.." ID("..devID..") is no more dead")
            DeadNodes["DV"..devID] = nil
          else -- pas dans table
            -- check next node
        end -- InTable
    end -- is dead ?
  end -- not in exclude table
end -- for

Status ("Fin")
fibaro:debug("Status = Fin")
fibaro:call(selfID, "setProperty", "ui.DeadNodes.value", dead)
fibaro:call(selfID, "setProperty", "ui.DateCheck.value", os.date("%d/%m/%y %H:%M"))
fibaro:call(selfID, "setProperty", "ui.Devices.value", devices)

if dead >= 1 
  then
    fibaro:call(selfID, "setProperty", "currentIcon", IconeDead)
  else
    fibaro:call(selfID, "setProperty", "currentIcon", IconeOk)
end

-- sauvegarde de la table dans la VG
DeadNodes = json.encode(DeadNodes)
fibaro:setGlobal("DeadNodes", DeadNodes)

-- affichage du message en bas de l'icône en continu,
Log(dead.. " DeadNodes - Send Notif = " ..SendNotification.. "/" ..FreqNotif.. "h - " ..#exclude.. " excluded devices")

et la version complète (v5.1) pour ceux qui ne l'utilisent pas encore

DeadNodesAnalysis_v5.1.vfib

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

merci jojo au top par contre tu as les icônes qui va avec ce VD merci  ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

j'utilise ces icônes

post-1320-0-68486000-1467920246_thumb.png

post-1320-0-15719500-1467920259_thumb.png

Partager ce message


Lien à poster
Partager sur d’autres sites

salut @jojo

 

une petit question

 

quel différence entre les deux code .

Partager ce message


Lien à poster
Partager sur d’autres sites

un qui fonctionne, l'autre pas ....

Partager ce message


Lien à poster
Partager sur d’autres sites

plus sérieusement:

ligne 48, j'avais une variable locale "type", que j'ai renommée en "dtype" car apparemment "type" serait un nom réservé maintenant

Partager ce message


Lien à poster
Partager sur d’autres sites

salut a tous

 

le 5.1  fonctionne-t-elle sur la HC2 4.100 ?

 

 

si oui, je souhaite changer une chose, la temps de fréquence de notification  en minute

 

la modification serait elle a la ligne 162

if (DeadNodes["DV"..devID] + (FreqNotif*60*60)) < now

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai une autre question 

 

je souhaite savoir si le script  DeadNodesAnalysis_v5.1 peut détecter un module qui est hors secteur.

 

Quand t’ont coupe l’alimentation du module il est censé passer pour mort, mai visiblement le script ne le trouve pas,  sauf pour une Walplug.

 

 La seule manier de déclarer pour mort est de réaliser une action (on, off, .....)

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut à  tous

 

voila j'ai trouver un début de solution

 

lorsque que je coupe l’alimentation du module, la valeur "dead" reste à  0 donc toujours vivant et impossible pour le script Contrôle des noeuds mort et leur réveil de le trouver pour mort.

 

j'ai créé un petit script qui envois une pulsion, c'est la seul manier pour le rendre mort

 

la seul chose qui manque a mon script c'est un changement de valeur  une foi le module déconnecté du secteur.

alors si vous avez une idée 

local dead = fibaro:getValue(174, "dead")
fibaro:debug('dead ' .. dead .. " " )

if dead == "0" then
fibaro:call(174, "turnOn")  
fibaro:call(174, "turnOff")    
end

 

xx

Partager ce message


Lien à poster
Partager sur d’autres sites

dans ton script tu dois détecter la position du FGS. Car làtu pars du principe qu'il était éteint.

Mais s'il était allumé, il sera éteint àla fin.

D plus faire ce test àla fréquence de vérification des noeuds morts, tu vas transformer ta maison en sapin de Noël. C'est un peut tôt ...

Regarde plutôt pour lui envoyer un json d'une autre propriété qui n'affecte pas directement la fonctionnalité du module

Partager ce message


Lien à poster
Partager sur d’autres sites

salut @jojo

 

oui c'est bientôt Noel :D

 

non blague appart, je vais essayer une autre fonction  json 

le truc il faut trouve une json qui pousse la HC2 a trouver le module et surtout une fonction si secteur ou pas.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bien sur je trouve ou pas json  si Secteur ou pas j'aurai tout trouver  ;)

Partager ce message


Lien à poster
Partager sur d’autres sites

pour la propriété qui n'a aucun effet :

useTemplate : true/false

 

pour savoir s'il est sur secteur, le VD vérifie déjà  s'il est sur batterie

Partager ce message


Lien à poster
Partager sur d’autres sites

Une autre approche : as-tu testé de faire un polling du device (comme quand tu cliques sur le bouton "interroger maintenant" dans les propriétés avancées du module, dans l'interface Web) ?

 

Exemple de code dans une scène (avec HTTPClient(), donc en asynchrone) :

local postURL = 'http://127.0.0.1:11111/api/devices/' .. id .. '/action/poll'
local httpClient = net.HTTPClient()
httpClient:request(postURL, {
	success = function(response)
		if response.status == 200 or response.status == 202 then
			fibaro:debug("Poll device OK")
		else
			fibaro:debug("Error : status="..tostring(response.status))
		end
	end,
	error = function(err)
		fibaro:debug("Error : "..err)
	end,
	options = {
		method = 'POST'
	}
})

Partager ce message


Lien à poster
Partager sur d’autres sites

×