Message populaire Lazer Posté(e) le 22 novembre 2015 Message populaire Signaler Posté(e) le 22 novembre 2015 (modifié) Watchdog Version 1.3 Voici une scène permettant de surveiller le fonctionnement des Scènes et Main Loop de Modules Virtuels sur Home Center 2 en version 4.x. Pour ce faire, les messages de la fenêtre de Debug sont analysés. De plus, pour les scènes uniquement, le nombre d'instances est compté. En cas de problème détecté, la scène ou le virtual device considéré est automatiquement redémarré, et une notification peut être envoyée. Copier/coller le script LUA suivant dans une nouvelle scène : --[[ %% autostart %% properties %% globals --]] -------------------------------------------------- -- Scene : Watchdog -- Author : Lazer -- Version : 1.3 -- Date : June 2017 -------------------------------------------------- -- User variables local intervalle = 60 local delay = 15*60 local watchdog = { } local userID = {} -- Email local smartphoneID = {} -- Push local sms = { ["VD_ID"] = 0, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local debug = false -- -- Message function -- function Message(color, message) if color and color ~= "" then fibaro:debug('<span style="color:'..color..';">'..(message or '<nil>')..'</span>') else fibaro:debug(message or '<nil>') end end -- -- Notification function -- function Notification(message, param) local message = message or "<vide>" Message("yellow", "Notification : "..message) if param then for _, notif in ipairs(param) do if debug then Message("grey", notif) end -- Envoi Push if notif == "push" and smartphoneID then for _, id in ipairs(smartphoneID) do if debug then Message("grey", "Send Push smartphone ID : "..id) end fibaro:call(id, "sendPush", message) end -- Envoi Email elseif notif == "email" and userID then for _, id in ipairs(userID) do if debug then Message("grey", "Send Email user ID : "..id) end fibaro:call(id, "sendEmail", "HC2 Watchdog", message) end -- Envoi SMS elseif notif == "sms" and sms then if debug then Message("grey", "Send SMS : VD_ID="..(sms["VD_ID"] or 0).." VD_Button="..(sms["VD_Button"] or "0").." VG_Name="..(sms["VG_Name"] or "")) end fibaro:setGlobal(sms["VG_Name"], message) if sms["VD_ID"] and tonumber(sms["VD_ID"])>0 and sms["VD_Button"] and tonumber(sms["VD_Button"])>0 then fibaro:call(sms["VD_ID"], "pressButton", sms["VD_Button"]) end end end else Message("orange", "Warning : no notification options given") end end -- -- Restart function -- function Restart(type, id, restart, notification, reason) Message("blue", 'Restart '..type..'('..id..')') -- Prepare API URL local getURL = "" local putURL = "" if type:lower() == "scene" then getURL = 'http://127.0.0.1:11111/api/scenes/'..id putURL = 'http://127.0.0.1:11111/api/scenes/'..id elseif type:lower() == "vd" then getURL = 'http://127.0.0.1:11111/api/virtualDevices/'..id putURL = 'http://127.0.0.1:11111/api/virtualDevices/'..id end -- Load VD/Scene local httpClient = net.HTTPClient() httpClient:request(getURL, { success = function(response) if response.status == 200 then local jsonTable = json.decode(response.data) local name = jsonTable.name or "" if restart and restart == true then -- Add new line at end of scene lua code if type:lower() == "scene" and jsonTable.lua then jsonTable.lua = jsonTable.lua .. "\n" response.data = json.encode(jsonTable) end -- Save VD/Scene httpClient:request(putURL, { success = function(response) if response.status == 200 then Message("green", type.."("..id..") successfully restarted") Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") a été redémarré : "..(reason or "???"), notification) else Message("red", type.."("..id..") Error : status="..tostring(response.status)) Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end end, error = function(err) Message("red", type.."("..id..") Error : "..err) Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end, options = { method = 'PUT', -- headers = { -- ["content-type"] = 'application/x-www-form-urlencoded;' -- }, data = response.data } }) else Notification('Watchdog : '..type..' « '..(name or "")..' » ('..id..") doit être redémarré manuellement : "..(reason or "???"), notification) end else Message("red", type.."("..id..") Error : status="..tostring(response.status)) Notification('Watchdog : '..type..' ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end end, error = function(err) Message("red", type.."("..id..") Error : "..err) Notification('Watchdog : '..type..' ('..id..") n'a pas pu être redémarré : "..(reason or "???"), notification) end, options = { method = 'GET' } }) end -- function -- -- Check function -- function Check(interval) Message(nil, "Check") -- Browse VD/Scene list local httpClient = net.HTTPClient() local elements = #watchdog for i = 1, elements do -- Initialization local countscene_found = false if debug then Message(nil, "Check : type="..watchdog[i].type.." id="..watchdog[i].id) end -- Check number of running scene instances if watchdog[i].type:lower() == "scene" and watchdog[i].count and watchdog[i].count > 0 then local countScenes = fibaro:countScenes(watchdog[i].id) if countScenes < watchdog[i].count then Message("orange", watchdog[i].type..'('..watchdog[i].id..') '..countScenes..' running instance') countscene_found = true Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, countScenes..' instance') elseif debug then Message("green", watchdog[i].type..'('..watchdog[i].id..') '..countScenes.." running instance") end end if countscene_found == false then -- Do not enter this loop if scene has already been restarted -- Prepare API URL local getURL = "" if watchdog[i].type:lower() == "scene" then getURL = "http://127.0.0.1:11111/api/scenes/"..watchdog[i].id.."/debugMessages" elseif watchdog[i].type:lower() == "vd" then getURL = "http://127.0.0.1:11111/api/virtualDevices/"..watchdog[i].id.."/debugMessages/0" else Message("red", "Error : unknown type value") end if getURL ~= "" then if debug then Message("grey", getURL) end -- Load VD/Scene debug messages httpClient:request(getURL, { success = function(response) if response.status == 200 then if response.data and response.data ~= "" then local jsonTable = json.decode(response.data) local current_timestamp = os.time() local oldest_timestamp = current_timestamp local match_found = false local no_match_found = false local reason = "" -- Reverse browsing of debug messages for j = #jsonTable, 1, -1 do oldest_timestamp = jsonTable[j].timestamp -- Check if debug message match lookup string within allowed interval if watchdog[i].match.text and watchdog[i].match.text ~= "" and watchdog[i].match.interval > 0 and jsonTable[j].txt:match(watchdog[i].match.text) then if jsonTable[j].timestamp > current_timestamp - watchdog[i].match.interval then if debug then Message("green", watchdog[i].type..'('..watchdog[i].id..') Found string "'..watchdog[i].match.text..'"') end match_found = true end end -- Check if debug message match forbidden string if watchdog[i].no_match.text and watchdog[i].no_match.text ~= "" and jsonTable[j].txt:match(watchdog[i].no_match.text) then Message("orange", watchdog[i].type..'('..watchdog[i].id..') Found string "'..watchdog[i].no_match.text..'"') no_match_found = true reason = os.date('%H:%M:%S', (jsonTable[j].timestamp or 0)) .. " " .. jsonTable[j].type .. " : " .. jsonTable[j].txt break end if watchdog[i].no_match.type and watchdog[i].no_match.type ~= "" and jsonTable[j].type == watchdog[i].no_match.type then Message("orange", watchdog[i].type..'('..watchdog[i].id..') Found type "'..watchdog[i].no_match.type..'"') no_match_found = true reason = os.date('%H:%M:%S', (jsonTable[j].timestamp or 0)) .. " " .. jsonTable[j].type .. " : " .. jsonTable[j].txt break end end -- for if debug and oldest_timestamp > current_timestamp - watchdog[i].match.interval then Message("grey", watchdog[i].type..'('..watchdog[i].id..') oldest debug timestamp more recent than interval') end -- Restart VD/Scene if watchdog[i].match.text and watchdog[i].match.text ~= "" and watchdog[i].match.interval > 0 and match_found == false and oldest_timestamp < current_timestamp - watchdog[i].match.interval then Message("orange", watchdog[i].type..'('..watchdog[i].id..') String "'..watchdog[i].match.text..'" not found') reason = 'Chaine « ' .. watchdog[i].match.text .. ' » non trouvée' if #jsonTable > 0 then reason = reason .. ', dernier message : ' .. os.date('%H:%M:%S', (jsonTable[#jsonTable].timestamp or 0)) .. ' « ' .. (jsonTable[#jsonTable].txt or "<nil>") .. ' »' end Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, reason) --if watchdog[i].no_match.text and watchdog[i].no_match.text ~= "" and no_match_found == true then elseif no_match_found == true then Restart(watchdog[i].type, watchdog[i].id, watchdog[i].restart, watchdog[i].notification, reason) end else Message("red", "Error : empty response") end else Message("red", "Error : status=" .. tostring(response.status)) end end, error = function(err) Message("red", 'Error : ' .. err) end, options = { method = 'GET' } }) end end end -- for -- Wait if interval and interval > 0 then setTimeout(function() Check(interval) end, interval*1000) end end -- function -- -- Main loop -- local trigger = fibaro:getSourceTrigger() if trigger["type"] == "autostart" then Message(nil, "Watchdog instance autostart") -- Check function call delayed to prevent killing all other scenes not already started right after HC2 boot setTimeout(function() Check(intervalle) end, delay*1000) else Message(nil, "Watchdog instance manual launch") -- Call Check function Check(nil) end . Le paramétrage du script s'effectue dans les quelques lignes situées sous le commentaire "User variables" : intervalle : durée entre 2 vérifications delay : délai avant la première vérification. En effet, cette scène ayant la propriété autostart afin de démarrer automatiquement au boot de la box, le risque est de démarrer avant les autres Scène/VD, et de forcer un redémarrage de ceux-ci alors qu'ils n'ont pas encore effectivement démarré. Ce délai laisse donc aux autres Scène/VD le temps de démarrer et de s'initialiser proprement. watchdog : tableau dont chaque ligne représente une Scène ou un Virtual Device à monitorer : type : "Scene" ou "VD" id : valeur numérique représentant l'ID de la Scène ou VD à monitorer match : texte qui doit être trouvé pendant un certain laps de temps afin de confirmer le bon fonctionnement du VD/Scène. Cela correspond typiquement à un message affiché cycliquement à intervalle régulier. Les 2 champs suivants doivent être renseignés pour que la condition soit prise en compte (condition ET) : text : chaine de caractères à trouver interval : durée en secondes no_match : texte qui ne doit pas être trouvé, sous peine de considérer le VD/Scène comme planté. Cela correspond typiquement à un message d'erreur LUA qui entraine le plantage du script. A noter que la condition no_match à priorité sur la condition match, c'est à dire que si le texte recherché par no_match est détecté, le VD/Scène sera redémarrer même si le texte recherché par match a été détecté. L'un ou l'autre des 2 champs suivants peuvent être renseignés pour que la condition soit prise en compte (condition OU) : text : chaine de caractères à trouver type : "ERROR" correspond aux messages affichés en rouge dans la fenêtre de Debug de l'interface HC2. A noter que jusqu'en v4.056, dans une scène une erreur LUA affichait le message en rouge avec le type "ERROR", tandis que depuis les Beta v4.057 et v4.058, cette même erreur s'affiche en blanc sans le type ERROR, par conséquent ce test ne fonctionne plus. En revanche, aucun changement de mode de fonctionnement concernant les Virtual Devices. count : valeur valable pour les scènes uniquement, et indiquant le nombre minimal d'instances qui doivent fonctionner pour confirmer le bon fonctionnement de la scène. Cela correspond typiquement à l'instance de type boucle infinie lancée en autostart. restart : true ou false afin de redémarrer le VD/Scène concerné, ou seulement envoyer une notification signalant qu'il faut le redémarrer manuellement. notification : liste séparée par des virgules des moyens de notifications à employer. userID : liste séparée par des virgules des ID des utilisateurs qui doivent recevoir des notifications par email (le mail est celui configuré pour chaque utilisateur dans le panneau de contrôle d'accès) smartphoneID : liste séparée par des virgules des ID des smartphones qui doivent recevoir des notifications push (à récupérer dans le toolkit de Krikroff ou via l'API : /api/iosDevices) sms : si vous avez une passerelle SMS sous Android avec SMS Gateway (ou équivalent) pilotée par un module virtuel, il faut renseigner ici les informations nécessaires : VD_ID : ID du module virtuel VD_Button : ID du bouton du module virtuel VG_Name : nom de la variable globale debug : true ou false afin d'activer l'affichage étendu dans la fenêtre de débugage de la scène. Exemple de paramètres : -- User variables local intervalle = 60 local delay = 15*60 local watchdog = { {type = "Scene", id = 1, match = {text="", interval=0}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- Présence Lazer {type = "Scene", id = 2, match = {text="Last run", interval=2*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- DomoCharts {type = "Scene", id = 3, match = {text="Durée des traitements", interval=11*60}, no_match = {text=""}, count=1, restart=true, notification = {"push", "email", "sms"}}, -- GEA {type = "VD", id = 1, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Surveillance Station {type = "VD", id = 2, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Clock Sync {type = "VD", id = 3, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- My Batteries {type = "VD", id = 4, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Evénements {type = "VD", id = 5, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Network Monitor {type = "VD", id = 6, match = {text="", interval=0}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- GEA Alarm {type = "VD", id = 7, match = {text=" ", interval=30}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Sonos Player (Tk.isTraceEnabled = true) {type = "VD", id = 8, match = {text="Start main process", interval=31*60}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}} -- Freebox Serveur } local userID = {1} -- Email local smartphoneID = {1, 2} -- Push local sms = { ["VD_ID"] = 99, -- Virtual Device ID ["VD_Button"] = "1", -- Virtual Device Button ["VG_Name"] = "SMS" -- Global Variable Name } local debug = false Modifié le 3 juillet 2017 par Lazer 1 13
Lazer Posté(e) le 22 novembre 2015 Auteur Signaler Posté(e) le 22 novembre 2015 De façon générale, pour surveiller efficacement les main loop de modules virtuels, il faut que chaque main loop affche un message prédéfini à intervalle régulier. En effet, pour une main loop on ne peut pas faire appel à la fonction countScene(), et il n'est donc pas possible de détecter le cas où le module virtuel fait un core-dump au niveau de l'OS Linux.... puisque lorsque cela se produit, aucun message d'erreur spécifique n'est affiché dans la zone de débug de la main loop. Dans le cas particulier du module virtuel Sonos Player de Krikroff, il faut activer l'option Tk.isTraceEnabled = true dans le code de la main loop (qui se trouve vers la fin) Pour les prochains modules virtuels qui seront développés, je suggère d'ajouter ce type de message récurrent si vous souhaitez pouvoir surveiller efficacement les main loop. Quelques captures d'écran : Autostart de la scène, puis 15 minutes plus tard, les Check s'enchainent toutes les minutes : Lancement manuel d'une seule vérification immédiate dans une nouvelle instance de la scène (pour cela, autoriser au minimum 2 instances pour cette scène, puis cliquer sur le bouton Démarrer) : Exemple d'une scène (GEA, ID n°14) dont l'instance qui s’exécute en boucle infinie a planté. Il y a 0 instances, donc redémarrage de GEA : 1
jojo Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 j'installe immédiatement. Merci !
sebcbien Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 Merci ! J'installerai ça tantôt s'il me reste du temps :-) Sent from my Note4
Sakkhho Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 idem - je test de suite merci lazer quelques icônes pour le fun 1
TonyC Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 Popopop !!! Tu ne t'arrêtes donc jamais je vais tester ce joujou tout de suite... Merci m'sieur Lazer!!!
Gazous Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 Excellent ! Je vais tester ça au plus vite ! Merci Lazer, c'est hyper complet !
Sakkhho Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 Bon j'ai lancé le chien sur 3 scenes et 1 VD (car presque aucun de mes VD possède une mainloop) [DEBUG] 22:10:47: Watchdog instance autostart will see :-)
jojo Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 c'est de la haute voltige ! Sans l'exemple, j'aurais difficile (ok, c'est du belge, en français : "j'éprouverais des difficultés") Mais je ne comprends pas bien ceci no_match : texte qui ne doit pas être trouvé, sous peine de considérer le VD/Scène comme planté. Cela correspond typiquement à un message d'erreur LUA qui entraine le plantage du script. A noter que la condition no_match à priorité sur la condition match, c'est à dire que si le texte recherché par no_match est détecté, le VD/Scène sera redémarrer même si le texte recherché par match a été détecté. L'un ou l'autre des 2 champs suivants peuvent être renseignés pour que la condition soit prise en compte (condition OU) : text : chaine de caractères à trouver type : "ERROR" correspond aux messages affichés en rouge dans la fenêtre de Debug de l'interface HC2. A noter que jusqu'en v4.056, dans une scène une erreur LUA affichait le message en rouge avec le type "ERROR", tandis que depuis les Beta v4.057 et v4.058, cette même erreur s'affiche en blanc sans le type ERROR, par conséquent ce test ne fonctionne plus. En revanche, aucun changement de mode de fonctionnement concernant les Virtual Devices. donc à partir de la 4.057b je ne pourrais plus mettre type="ERROR" ? Il faut mettre quoi alors ?
Lazer Posté(e) le 22 novembre 2015 Auteur Signaler Posté(e) le 22 novembre 2015 Jojo, je vais détailler cette histoire d'ERROR dans le 2nd post (d'ailleurs j'ai commencé à y ajouter quelques infos). Tu peux laisser type="ERROR" pour les scènes, mais cela sera sans effet tant que Fibaro ne ré-implémentera pas cette fonctionnalité. Pour le moment, ERROR n'existe plus que pour les Main Loop de VD. Donc, si tu as une Scène dont tu connais précisément le message d'erreur qui apparait aléatoirement, tu peux le mettre dans le paramètre no_match.text. Je sais que c'est le cas de Gazous pour l'une de ses scènes dans le topic "Catcher une erreur LUA" d'où est parti cette idée de watchdog. Et on peut dire que ce changement de comportement tombe au bon moment (enfin, je m'en serais bien passé.... mais il faut faire avec.... Fibaro, développeurs, régression, bug, tout ça quoi....) car j'étais justement en train de développer ce watchdog quand j'ai passé ma box de développement de la v4.057 à v4.058, tandis que ma box de prod est toujours en v4.056. Donc j'ai bien vu la différence. Ceci dit, pour une scène, je considère que le plus fiable est d'utiliser le paramètre count=1, car vous avez certainement 1 instance lancée en autostart avec une boucle infinie qui devrait tourner non-stop (cas connu de GEA). Remarquez que dans mon exemple, on a une double protection pour GEA, car on essaye également de matcher le text "Durée des traitements" qui apparait normalement toutes les 10 minutes.
jojo Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 merci pour ces explications. Serait-il "facile" d'ajouter un paramètre supplémentaire àchaque ligne du watchdog ? : Pouvoir choisir si on veut une simple notification ou également un restart de la scène/VD. Cela me permettrait de vérifier si la condition d'erreur que j'ai mise est bien la bonne. Imaginons que j'ai mis une condition farfelue et que du coup ma scène/VD redémarre en boucle ?
Lazer Posté(e) le 22 novembre 2015 Auteur Signaler Posté(e) le 22 novembre 2015 oui c'est faisable..... déjàce que tu peux faire, c'est activer le mode debug = true qui te permettra de visualiser un peu mieux ce qui se passe. Et dans ta scène/VD àsurveiller, tu crées volontairement l'erreur.
Lazer Posté(e) le 22 novembre 2015 Auteur Signaler Posté(e) le 22 novembre 2015 quelques icônes pour le fun Merci. Je n'avais pas encore pris le temps, mais je viens maintenant de mettre mon icône au début du topic. Pour toutes les scènes, je préfère inclure l'image dans le clap de cinéma, afin de bien différencier dans l'interface web les scènes (sur lesquelles ont n'est pas censé agir) des VD (sur lesquels on peut agir).
sebcbien Posté(e) le 22 novembre 2015 Signaler Posté(e) le 22 novembre 2015 Oki c'est installé.Rien à dire, c'est du beau boulot, merci encore !!!Maintenant je dois dire que chez moi c'est plutôt la box qui plante complètement que des vd ou scènes. Mais bon, peut être que je pourrai détecter des signes avant courtier avec le Watchdog et lancer un reboot avant qu'il ne soit trop tard.
Lazer Posté(e) le 22 novembre 2015 Auteur Signaler Posté(e) le 22 novembre 2015 Pas certain que ce watchdog te permette de détecter des signes avant coureur..... ou alors si tu trouve une piste, faudra partager ! Tu peux utiliser le script de Jojo à faire tourner sur une machine externe type Synology afin de détecter le plantage de la HC2..... et qui envoie un email, car impossible de redémarrer la HC2 sans intervenir directement dessus.
sebcbien Posté(e) le 23 novembre 2015 Signaler Posté(e) le 23 novembre 2015 Donc si j'ai bien compris, en 4.058, pour les VD, il faut mettre le texte qui apparait réglièrement dans le debug. exemple pour le VD meteo YAMS WU: {type = "VD", id = 4, match = {text="Prochaine Mise à jour prévue dans", interval=40}, no_match = {text="", type="ERROR"}, notification = {"push", "email", "sms"}}, Pour des scènes style gea, j'ai un doute, mon gea tourne en boucle infinie comme tout le monde, mais est aussi relancé régulièrement par des trigger (mouvement, VG, value etc...) Est-ce que ça a un sens de surveiller ce genre de scène ?
sebcbien Posté(e) le 23 novembre 2015 Signaler Posté(e) le 23 novembre 2015 Pas certain que ce watchdog te permette de détecter des signes avant coureur..... ou alors si tu trouve une piste, faudra partager ! Tu peux utiliser le script de Jojo à faire tourner sur une machine externe type Synology afin de détecter le plantage de la HC2..... et qui envoie un email, car impossible de redémarrer la HC2 sans intervenir directement dessus. Je suis occupé à chercher un moyen de le faire... Il y a toujours moyen en la coupant et en rallumant l'alimentation, via un simple arduino, ou un vieux gsm android par exemple. Ou alors mieux, en simulant un push sur le bouton shutdown (simple pontage en parallèle), puis power off après 1 min puis power on.
Lazer Posté(e) le 23 novembre 2015 Auteur Signaler Posté(e) le 23 novembre 2015 Ah mon avis, il n'y a aucun intérêt àsurveiller les scènes en déclenchement instantané àbase de trigger. Déjàpar nature, le trigger est aléatoire et n'intervient pas àintervalle régulier. Ensuite, une scène déclenchée par trigger àune durée de vie très courte, elle effectue sa tâche puis meurt. Donc si il y a un bug, c'est une erreur de logique de programmation, et cela plantera àtous les coups, et doit donc être corrigé immédiatement par le développeur. Le watchdog n'est pas un debugguer.
Berale64 Posté(e) le 23 novembre 2015 Signaler Posté(e) le 23 novembre 2015 Mais comment tu fais pour trouver la syntaxe de toutes ces api ??? 5
Lazer Posté(e) le 25 novembre 2015 Auteur Signaler Posté(e) le 25 novembre 2015 A la demande de Jojo, j'ai modifié le premier post avec la version 1.1 du script afin d'ajouter un paramètre restart=true|false afin de redémarrer le VD/Scène concerné, ou seulement envoyer une notification signalant qu'il faut le redémarrer manuellement. Plus quelques modifications mineures. 2
jojo Posté(e) le 26 novembre 2015 Signaler Posté(e) le 26 novembre 2015 Lazer, Merci d'avoir implémenté le restart = true/false. Je DOIS l'utiliser car il trouve que mon VD sonos est mort, et il souhaite le redémarrer. Hors ce n'est pas le VD qui est mort, mais le Sonos qui ne réponds plus au réseau (c'est un autre problème). Comme le sonos n'est plus sur le réseau, le VD détecte le log ne trouve plus de "transport state:" et il veut redémarrer le VD. Mais je pense qqu'il ne faut pas modifier le Watchdog qui fait bien son boulot, mais peut-être le VD Sonos pour que si un ping sur le Sonos ne réponds pas, il envoye un autre message d'erreur style "transport state: NO PING". Je e permet de te dire ça car il semble que tu aurais les capacités de comprendre les codes de Krikroff.
jojo Posté(e) le 26 novembre 2015 Signaler Posté(e) le 26 novembre 2015 mais lorsque le réseau revient, il faut faire un save de la scène. Alors je me pose la question, je laisse le restart àtrue, comme ça le VD se remet sur pate tout seul ? N'est-ce pas "mauvais" de redémarrer continuellement un VD ?
Lazer Posté(e) le 26 novembre 2015 Auteur Signaler Posté(e) le 26 novembre 2015 Hum, je viens de faire le test en coupant le wall plug du sonos, et j'ai entendu une série de notifications et vibreurs autour de moi... ça réveille Je te propose de remplacer la chaine à rechercher par un espace " ", car quel que soit le message affiché par le VD Sonos, le texte comporte toujours au moins un espace. Et si le VD est vraiment planté, il n'y aura plus de message du tout dans le délai imparti, donc pas d'espace, donc le VD sera bien redémarré. Ca donne : {type = "VD", id = 423, match = {text=" ", interval=30}, no_match = {text="", type="ERROR"}, restart=true, notification = {"push", "email", "sms"}}, -- Sonos Player (Tk.isTraceEnabled = true)
jojo Posté(e) le 26 novembre 2015 Signaler Posté(e) le 26 novembre 2015 oui, je vais tester, mais je crois que le VD plante vraiment quand le Sonos n'est plus joignable. As-tu testé ?
Messages recommandés