Bonjour,
Sur le post du script pour le contrôle du niveau des piles j'ai abordé le sujet nÅ“uds morts pour les détecter et voici un script tip top qui/
- Contrôle les nÅ“uds morts,
- Chercher a les réveiller,
- Envoie des notifications pour avertir
--[[
%% autostart
%% properties
%% globals
--]]
local sourceTrigger = fibaro:getSourceTrigger();
if (sourceTrigger["type"] == "autostart") then
while true do
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
( (tonumber(os.date("%H%M")) >= tonumber(string.format("%02d%02d", "07", "00")) and tonumber(os.date("%H%M")) <= tonumber(string.format("%02d%02d", "23", "00"))) and (math.floor(os.time()/60)-math.floor(1369026000/60))%2 == 0 )
)
then
local i = 1
local TotalDevices = 156 + 1
while i < TotalDevices do
local status = fibaro:getValue(i, 'dead');
if status == "1" then
fibaro:setGlobal('lastDeadNode', i);
-- fibaro:call(30, "pressButton", "6");
fibaro:call(1, "wakeUpDeadDevice",i);
fibaro:debug("Try to wake up node "..i);
fibaro:call(68, "sendPush", "Try to wake up node "..i);
fibaro:sleep(5*1000);
local status = fibaro:getValue(i, 'dead');
if status == "1" then
fibaro:debug("Device "..i.." still dead");
fibaro:call(68, "sendPush", "Device "..i.." still dead");
-- fibaro:call(30, "pressButton", "6");
-- fibaro:call(65, "sendDefinedPushNotification", "9");
-- fibaro:call(2, "sendEmail", "DEAD "..i);
else
-- fibaro:call(30, "pressButton", "7");
fibaro:debug("Device "..i.." fixed");
fibaro:call(68, "sendPush", "Device "..i.." fixed");
end
else end
i = i + 1
end
end
fibaro:sleep(60*1000);
end
else
local currentDate = os.date("*t");
local startSource = fibaro:getSourceTrigger();
if (
startSource["type"] == "other"
)
then
fibaro:debug("send notification");
fibaro:call(68, "sendPush", "start check dead node");
local i = 1
local TotalDevices = 156 + 1
while i < TotalDevices do
local status = fibaro:getValue(i, 'dead');
if status == "1" then
fibaro:setGlobal('lastDeadNode', i);
-- fibaro:call(30, "pressButton", "6");
fibaro:call(1, "wakeUpDeadDevice",i);
fibaro:debug("Try to wake up node "..i);
fibaro:call(68, "sendPush", "Try to wake up node "..i);
fibaro:sleep(5*1000);
local status = fibaro:getValue(i, 'dead');
if status == "1" then
fibaro:debug("Device "..i.." still dead");
fibaro:call(68, "sendPush", "Device "..i.." still dead");
-- fibaro:call(30, "pressButton", "6");
-- fibaro:call(65, "sendDefinedPushNotification", "9");
-- fibaro:call(2, "sendEmail", "DEAD "..i);
else
-- fibaro:call(30, "pressButton", "7");
fibaro:debug("Device "..i.." fixed");
fibaro:call(68, "sendPush", "Device "..i.." fixed");
end
else end
i = i + 1
end
end
end
Voici le script,son auteur est Olivier MALE.
Il faut l'adapter pour le N° d'ID pour le push. Son auteur a aussi mis des "--" devant certaines lignes de notifications push et de virtual device, perso j'ai supprimé ces lignes.
Le script fonctionne nickel chez moi.
Maintenant que je suis en v4.x j'ai trouvé comment tester si le device était sur batterie.
Donc aussi sur batterie, il n'y a pas de tentative de réveil (inutile).
Voici donc la v4.1 du module :
DeadNodesAnalysis_v4.1.vfib
Si vous avez déjà les version précédentes, il suffit de mettre ce code dans le bouton "Dead Nodes Analysis" :
--------------------------
-- User Settings
--------------------------
local IconeDead = 1129
local IconeOk = 1081
local IconeRun = 1083
local push_dev = 2 -- id of the user to send push message to (2 is admin user)
----------------------------------
-- DO not change bellow this line
----------------------------------
local selfID = fibaro:getSelfId()
fibaro:call(selfID, "setProperty", "currentIcon", IconeRun)
-- check if notification to be sned
local SendNotification = "" -- Push / no push notification when a dead node is discovered
local Notification = fibaro:get(selfID,"TCPPort")
Notification = tonumber(Notification)
if Notification == 0
then
SendNotification = "No"
else
SendNotification = "Yes"
end
function SendNotif(msg)
if SendNotification == "Yes" then
fibaro:call(push_dev, "sendEmail", "Dead nodes discovering", msg)
end
end
function DisplLabel(dead, label)
if dead <= 9 then
fibaro:call(selfID, "setProperty", "ui.DeadNode" ..dead.. ".value", label)
end
end
local dead = 0 -- counts # dead nodes
local devices = 0 -- counts # devices discovered
local i = 0
local type = ""
local disabled -- device caché == 1
local Label = ""
-- clear labels
for i = 1, 9 do
DisplLabel(i, Label)
end
-- détermination de la version du firmware
local HC2 = Net.FHttp("127.0.0.1",11111)
version = ""
payload = "/api/settings/info"
response, status, errorCode = HC2:GET(payload)
if tonumber(status) == 200
then
jsonTable = json.decode(response)
if tonumber(jsonTable.softVersion) >= 4
then
version = "4.x"
else
version = "3.x"
end
else
fibaro:log("--- ERROR ---")
fibaro:debug('<span style="color:red;">status='..status..', errorCode='..errorCode..', payload='..payload..', response='..response..'</span>')
end
fibaro:debug('version = ' ..version)
if version == "3.x"
then -- v3.x
-- dead nodes analysis
for i = 2, 1300 do
-- pas de check sur node 1 = box
type = fibaro:getType(i)
disabled = tonumber(fibaro:getValue(i, "disabled"))
-- si type <> "" et visible
if (type ~= "" and disabled == 0 ) then
devices = devices + 1
-- si node i est dead/mort
if tonumber(fibaro:getValue(i, "dead")) == 1 then
-- le node i est dead
dev = fibaro:getName(i)
dead = dead + 1
-- affichage du node qui est dead si <=9
Label = dev.. " (" ..i.. ")"
DisplLabel(dead, Label)
-- wakeup dead node only if not on battery et "parentID" = "1"
if (tonumber(fibaro:getValue(i, "isBatteryOperated")) == 0
and tonumber(fibaro:getValue(i, "parentID")) == 1)
then
fibaro:call(selfID, "setProperty", "currentIcon", IconeDead)
fibaro:call(1, "wakeUpDeadDevice", i)
fibaro:sleep(30*1000) -- attendre 30s pour tester si le node est réveillé
if tonumber(fibaro:getValue(i, "dead")) == 1
then
-- le node i est toujours dead
msg = os.date("%d/%m/%y %H:%M").." : "..type.." "..dev.." ID("..i..") is still dead after unsuccessful wakeup"
else
-- le node i a été réveillé
dead = dead - 1
-- effacer le node qui a été réveillée si <=9
DisplLabel(dead, " ")
msg = os.date("%d/%m/%y %H:%M").." : "..type.." "..dev.." ID("..i..") was awakened successfully"
end
else
msg = os.date("%d/%m/%y %H:%M").." : "..type.." "..dev.." ID("..i..") is on battery and was NOT awakened"
-- fibaro:debug ("device " ..i.. " " ..dev.. "is on battery, no wakeup")
end
-- envoi notification
SendNotif(msg)
end
end
end
else --v4.x
-- Récupération de la liste des modules
reponse = HC2:GET("/api/devices")
jsonResponse = json.decode(reponse)
-- dead nodes analysis
for k, v in ipairs(jsonResponse) do
fibaro:debug("k="..k)
if v.visible == true and v.properties.dead ~= nil then
devices = devices + 1
fibaro:debug("#devices "..devices.. " - devID = "..v.id.. " - devName = " ..v.name.. " - dead = " ..v.properties.dead)
-- si node est dead/mort
if v.properties.dead == "true" then
-- le node k est dead
dev = v.name
devID = tonumber(v.id)
type = v.type
dead = dead + 1
fibaro:debug ("#dead = "..dead)
-- affichage du node qui est dead si <=9
Label = dev.. " (" ..devID.. ")"
DisplLabel(dead, Label)
-- wakeup dead node only if not on battery
-- a voir comment faire en v4.x ??
if v.properties.batteryLevel == nil
then -- il n'est pas sur batteie
fibaro:call(selfID, "setProperty", "currentIcon", IconeDead)
fibaro:call(1, "wakeUpDeadDevice", devID)
fibaro:sleep(30*1000) -- attendre 30s pour tester si le node est réveillé
if v.properties.dead == "true"
then
-- le node est toujours dead
msg = os.date("%d/%m/%y %H:%M").." : "..type.." "..dev.." ID("..devID..") is still dead after unsuccessful wakeup"
else
-- le node i a été réveillé
dead = dead - 1
-- effacer le node qui a été réveillée si <=9
DisplLabel(dead, " ")
msg = os.date("%d/%m/%y %H:%M").." : "..type.." "..dev.." ID("..devID..") was awakened successfully"
end
else -- il est sur batterie
msg = os.date("%d/%m/%y %H:%M").." : "..type.." "..dev.." ID("..devID..") is on battery and was NOT awakened"
end
-- envoi notification
SendNotif(msg)
end
end
end
end
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)
-- affichage du message en bas de l'icône en continu,
-- durant la minute entre chaque test
i=0
while i < 61 do
fibaro:log(dead.. " DeadNodes - Send Notification = " ..SendNotification )
fibaro:sleep(9*1000)
i = i + 9
end
else
fibaro:call(selfID, "setProperty", "currentIcon", IconeOk)
-- affichage du message en bas de l'icône en continu,
-- durant la minute entre chaque test
i=0
while i < 61 do
fibaro:log("No Dead Nodes - Send Notification = " ..SendNotification )
fibaro:sleep(9*1000)
i = i + 9
end
end