Aller au contenu
Lazer

Watchdog Pour Scènes Et Modules Virtuels

Recommended Posts

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.

 

gallery_133_289_8359.png

 

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é par Lazer
  • Like 1
  • Upvote 13

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :

gallery_133_289_2121.png

  • 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) :

gallery_133_289_1165.png

  • 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 :

gallery_133_289_559.png

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

j'installe immédiatement. Merci !

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci !

J'installerai ça tantôt s'il me reste du temps :-)

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

idem - je test de suite 

merci lazer

 

quelques icônes pour le fun

 

post-1196-0-20011100-1448216537_thumb.png

post-1196-0-59283000-1448216544_thumb.png

post-1196-0-00117300-1448216684_thumb.png

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Popopop !!! Tu ne t'arrêtes donc jamais :) je vais tester ce joujou tout de suite...

Merci m'sieur Lazer!!!

Partager ce message


Lien à poster
Partager sur d’autres sites

Excellent !

Je vais tester ça au plus vite !

Merci Lazer, c'est hyper complet !

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :-)

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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).

Partager ce message


Lien à poster
Partager sur d’autres sites

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.
 

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

 

Mais comment tu fais pour trouver la syntaxe de toutes ces api ???

 

 

 

  • Upvote 5

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

  • Upvote 2

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ?

Partager ce message


Lien à poster
Partager sur d’autres sites

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 :2:

 

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)

Partager ce message


Lien à poster
Partager sur d’autres sites

oui, je vais tester, mais je crois que le VD plante vraiment quand le Sonos n'est plus joignable. As-tu testé ?

Partager ce message


Lien à poster
Partager sur d’autres sites

×