Aller au contenu

Module Virtuel "hc2 - Diagnostics"


razowski

Messages recommandés

Bonjour,

 

Vu l'erreur que j'ai dans le débogueur de la HC2, je dirais que non.

[ERROR] 09:22:46: line 13: attempt to perform arithmetic on local 'ramused' (a nil value)

Voilà  !! :(

 

[Edit]

J'ai trouvé, en analysant le code retour de /api/diagnostics, la ligne 12 du bouton rafraichir est fausse :

local ramused = tonumber(result.memory)

J'ai remplacé en ajoutant le ".used" pour la ram utilisée :

local ramused = tonumber(result.memory.used)

Donc là  cela fonctionne de nouveau.

Voilà  !! :)

  • Upvote 2
Lien vers le commentaire
Partager sur d’autres sites

:huh:

en fait ya aussi une erreur dans la boucle principale ligne 15

function round(num)
     local a = math.floor(num*100 + 0.5)/ 100
     return a,string.format("%.2f",a)
end
local vId = fibaro:getSelfId();
local HC2 = Net.FHttp("127.0.0.1",11111)
local response, status, errorCode = HC2:GET("/api/diagnostics")
if tonumber(status) == 200 then
	local result = json.decode(response);

	--Utilisation de la RAM  
	local ramused = tonumber(result.memory)
  	local ramfree = 100 - ramused;
	ramused = ramused .. "%";
  	ramfree = ramfree .. "%";
	fibaro:call(vId,"setProperty","ui.vlRAM1.value", "RAM Utilisé : " .. ramfree) 
	fibaro:call(vId,"setProperty","ui.vlRAM0.value", "RAM Disponible : " .. ramused)
Lien vers le commentaire
Partager sur d’autres sites

merci les gars, un vrai travail d équipe :)

:60:

 

edit: plus d erreur en effet dans le debug, cependant la Ram utilisé ne correspond pas a ce que j ai ds diagnostique, dois je redémarrer ou autre pour la prise en compte? Chez vous ça fonctionne bien?

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...
  • 5 mois après...

Bonjour,

Je compte utiliser la base de ce vd et de faire un push vers un service de graphes externe.

Si j'ai des plantages, j'irai regarder les graphes et j'essayerai de voir si c'est lié à  la ram.

 

J'ai deux petites questions

 - Avec votre recul, ça ne sert à  quelque-chose de monitorer la ram pour prévenir des plantages ?

 - est-ce que le vd du post 1 inclus les quelques modifications de code ci-dessus ?

 

Merci :-)

Lien vers le commentaire
Partager sur d’autres sites

D'après ce que j'ai constaté :

- quand la RAM est pleine (>80% environ) => plantage du process principal de la HC2, donc Erreur 503, interface Web indisponible, on ne peut plus rien faire àpart rebooter physiquement la box

- tout le reste du temps => plantage aléatoire de certains process (scènes ou modules virtuels) sans aucun message d'erreur apparent dans la fenêtre de debug car il s'agit d'un core-dump au niveau de l'OS Linux. On ne peut pas les prévenir, et on peut les redémarrer en faisant une sauvegarde du VD/Scène planté => mon watchdog est làpour ça.

Lien vers le commentaire
Partager sur d’autres sites

Pourquoi à4h du matin ? Moi je préfère 2h lol

Plus sérieusement il serait bien de faire une surveillance de la ram avec un envoi de push lorsque cela devient critique et pourquoi pas faire un graphique qui permettrait de voir la charge sur plusieurs jours

Envoyé de mon SM-G900F en utilisant Tapatalk

Lien vers le commentaire
Partager sur d’autres sites

le graphique, je peux m'en charger, fastoche !

Le push idem, il suffit d'inclure la fonction push de Lazer... fastoche bis

 

Il faudra d'abord ne rien faire et attendre que ça plante pour essayer de dégager un "patern", qui ne sera probablement pas le même d'une box à  l'autre.

Ensuite mettre un paramètre treshold et time qui rebootera, fastoche aussi !

 

Quelqu'un a un vfib "patché" à  partager ?

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

 

@sebcbien: Tu peux récupérer le timestamp de reboot de la box (que l'on voit sur l'interface web / diagnostique):

 

http://hc2_ip/api/settings/info ; le timestamp est l'entree serverStatus.

--[[
%% properties
%% globals
--]]


-- ---------------------------------------------
-- Convertit un Timestamp en date lisible
-- ---------------------------------------------
function timestampToDate(nTimestamp)
	return os.date("%d/%m/%y à  %X", nTimestamp)
end

-- ---------------------------------------------
-- Convertit un Timestamp en durée (code krikoff)
-- ---------------------------------------------
function SecondsToClock(sSeconds)
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
    return "00:00:00";
  else
    nHours = string.format("%02.f", math.floor(nSeconds/3600));
    nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
    nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
    return nHours.." H "..nMins.." Min et "..nSecs.. " s"
  end
end


---------------------------------------------------------------


local hc2 = api.get('/settings/info')

fibaro:debug('Timestamp de boot: ' .. hc2.serverStatus)
fibaro:debug('Date de boot: ' .. timestampToDate(hc2.serverStatus))
fibaro:debug('Allumé depuis ' ..SecondsToClock(os.time()-hc2.serverStatus))

post-376-0-17831800-1448612739_thumb.png

 

Nicolas

Lien vers le commentaire
Partager sur d’autres sites

Merci Nikko, c'est implémenté, un peu différemment car api.get ne fonctionne pas en vd apparemment.

 

Ceci dit, première conclusion: emoncms était down pendant 2h... ça a fait monter la ram utilisée de quelques %, quand emoncms a de nouveau répondu, la ram est retombée à  son niveau de départ...

Pour tant il y a une gestion d'erreur dans mes scripts...

 

Voici le code de mon vd diagnostic avec push vers emoncms:

Y'a plus beau comme code mais je n'ai pas de temps pour fignoler.

 

bouton refresh:

local thismodule = fibaro:getSelfId();
local EmonCMS_Prefix = "HC2_DIAG_";
local PushToEmonCMS = true; -- true = push to emoncms - false = do not push
local emoncms = Net.FHttp("emoncms.org",80);
local emoncms_api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; -- your EMONCMS WRITE api Key
local emoncms_ok = true

EmonCMS = {}; 
function EmonCMS:Push(payloademon)
fibaro:debug("Payload: " .. payloademon) ;
if emoncms_ok then 
	payloademon = "/input/post.json?json={" .. EmonCMS_Prefix .. payloademon .. "}&apikey=" .. emoncms_api_key;
	response, status, errorCode = emoncms:GET(payloademon);
		if status ~= "200" then
			emoncms_ok = false
			fibaro:debug("error response, oborting all push. - ".."response: " .. response .. " Status: " .. status .. " errorcode: " .. errorCode) ;
		end
	fibaro:sleep(500);
end
end

function timestampToDate(nTimestamp) -- Convertit un Timestamp en date lisible
	return os.date("%d/%m/%y à  %X", nTimestamp)
end
 
function SecondsToClock(sSeconds) -- Convertit un Timestamp en durée (code krikoff)
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
    return "00:00:00";
  else
    nHours = string.format("%02.f", math.floor(nSeconds/3600));
    nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60)));
    nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60));
    return nHours.." H "..nMins.." Min et "..nSecs.. " s"
  end
end
function Minutes(sSeconds) -- Convertit un Timestamp en durée (code krikoff)
  local nSeconds = tonumber(sSeconds)
  if nSeconds == 0 then
    return "00";
  else
    nMinutes = string.format("%02.f", math.floor(nSeconds/60));
    return nMinutes
end
end

local HC2 = Net.FHttp("127.0.0.1",11111);
local response, status, errorCode = HC2:GET("/api/settings/info");
if tonumber(status) == 200 then
	local result = json.decode(response);
	fibaro:debug("HC2 allumée depuis " .. Minutes(os.time()-result.serverStatus).." minutes. Soit "..SecondsToClock(os.time()-result.serverStatus))
end

function round(num)
     local a = math.floor(num*100 + 0.5)/ 100;
     return a,string.format("%.2f",a);
end
local vId = fibaro:getSelfId();
local HC2 = Net.FHttp("127.0.0.1",11111);
local response, status, errorCode = HC2:GET("/api/diagnostics");
if tonumber(status) == 200 then
	local result = json.decode(response);

	--Utilisation de la RAM  
	local ramused = tonumber(result.memory.used);
	local ramfree = 100 - ramused;
	ramused_pct = ramused .. "%";
	ramfree_pct = ramfree .. "%";
	fibaro:call(vId,"setProperty","ui.vlRAM0.value", "Utilisé : " .. ramused_pct);
	fibaro:call(vId,"setProperty","ui.vlRAM1.value", "Disponible : " .. ramfree_pct);


	--Partition système
	local sused = tonumber(result.storage.internal[1].used);
	local sfree = 100 - sused;
	sused = sused .. "%";
	sfree = sfree .. "%";
	fibaro:call(vId,"setProperty","ui.vlSystem0.value", "Utilisé : " .. sused);
	fibaro:call(vId,"setProperty","ui.vlSystem1.value", "Disponible : " .. sfree);

	--Partition recovery  
	local rused = tonumber(result.storage.internal[2].used);
	local rfree = 100 - rused;
	rused = rused .. "%";
	rfree = rfree .. "%";
	fibaro:call(vId,"setProperty","ui.vlRecovery0.value", "Utilisé : " .. rused);
	fibaro:call(vId,"setProperty","ui.vlRecovery1.value", "Disponible : " .. rfree);
	
	--Charge CPU
	local cpu0_puser = tonumber(result.cpuLoad[1].cpu0.user);
	local cpu1_puser = tonumber(result.cpuLoad[2].cpu1.user);
	local cpu0_pnice = tonumber(result.cpuLoad[1].cpu0.nice);
	local cpu1_pnice = tonumber(result.cpuLoad[2].cpu1.nice);
	local cpu0_psystem = tonumber(result.cpuLoad[1].cpu0.system);
	local cpu1_psystem = tonumber(result.cpuLoad[2].cpu1.system);
	local cpu0_pidle = tonumber(result.cpuLoad[1].cpu0.idle);
	local cpu1_pidle = tonumber(result.cpuLoad[2].cpu1.idle);
	local cpu0_PREVTOTAL = (cpu0_puser + cpu0_pnice + cpu0_psystem + cpu0_pidle);
	local cpu1_PREVTOTAL = (cpu1_puser + cpu1_pnice + cpu1_psystem + cpu1_pidle);
	
	
	  fibaro:sleep(1000);
	local HC21 = Net.FHttp("127.0.0.1",11111);
	local response1, status1, errorCode1 = HC2:GET("/api/diagnostics");
	if tonumber(status1) == 200 then
		local result1 = json.decode(response1);
		local cpu0_user = tonumber(result1.cpuLoad[1].cpu0.user);
		local cpu1_user = tonumber(result1.cpuLoad[2].cpu1.user);
		local cpu0_nice = tonumber(result1.cpuLoad[1].cpu0.nice);
		local cpu1_nice = tonumber(result1.cpuLoad[2].cpu1.nice);
		local cpu0_system = tonumber(result1.cpuLoad[1].cpu0.system);
		local cpu1_system = tonumber(result1.cpuLoad[2].cpu1.system);
		local cpu0_idle = tonumber(result1.cpuLoad[1].cpu0.idle);
		local cpu1_idle = tonumber(result1.cpuLoad[2].cpu1.idle);
		local cpu0_TOTAL = (cpu0_user + cpu0_nice + cpu0_system + cpu0_idle);
		local cpu1_TOTAL = (cpu1_user + cpu1_nice + cpu1_system + cpu1_idle);
		

		local cpu0_Percentage = ( ( (cpu0_TOTAL - cpu0_PREVTOTAL) - (cpu0_idle - cpu0_pidle) ) / (cpu0_TOTAL - cpu0_PREVTOTAL) ) * 100;
		local cpu1_Percentage = ( ( (cpu1_TOTAL - cpu1_PREVTOTAL) - (cpu1_idle - cpu1_pidle) ) / (cpu1_TOTAL - cpu1_PREVTOTAL) ) * 100;
		
		cpu0_Percentage = round(cpu0_Percentage);
		cpu1_Percentage = round(cpu1_Percentage);
		
		cpu0_Percentage_pct = cpu0_Percentage .. "%";
		cpu1_Percentage_pct = cpu1_Percentage .. "%";
		
		fibaro:call(vId,"setProperty","ui.vlCPU0.value", "Coeur 1 : " .. cpu0_Percentage_pct);
		fibaro:call(vId,"setProperty","ui.vlCPU1.value", "Coeur 2 : " .. cpu1_Percentage_pct);

		if PushToEmonCMS then
				payloademon = "CPU_0:" .. cpu0_Percentage; -- /1000 = convert to m3
					EmonCMS:Push(payloademon);
				payloademon = "CPU_1:" .. cpu1_Percentage; -- /1000 = convert to m3
					EmonCMS:Push(payloademon);
				payloademon = "RAM_USED:" .. ramused;
					EmonCMS:Push(payloademon);
				payloademon = "RAM_FREE:" .. ramfree;
					EmonCMS:Push(payloademon);
				payloademon = "MINUTES_UP:" .. nMinutes;
					EmonCMS:Push(payloademon);
		end
	end
else
	fibaro:debug("Try again "..deviceID.. " "..status)
end

mainloop:

-- 1ère fois que le main loop s'exécute, on crée une variable nommée "instance" car elle n'existe pas. Elle existera au 2ème passage donc ne sera pas recrée.
if (not instance) then
    -- on indique la fréquence d'execution souhaitée (en minutes)
    instance = { lastrun = 0, every = 1 }
    fibaro:debug("first run")
end
 
-- on vérifie la différence entre cette exéction et la dernière (stocké dans instance.lastrun)
diff = os.date("*t", os.difftime(os.time(), instance.lastrun))
 
-- si la différence en minutes et supérieure ou égale à  la fréquence souhaitée (instance.every)
if (diff.min >= instance.every) then
        fibaro:sleep(1*240) -- delay to smooth the charge (same for netatmo & vmc)
   -- TON CODE ---
		local selfId = fibaro:getSelfId();
        fibaro:call(selfId, "pressButton", "13")
   -- FIN DE TON CODE ---
   -- on stock l'heure de la nouvelle exécution
   instance.lastrun = os.time()
   fibaro:debug("executed")
end
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

le Push ne ce fait pas toute seul a partir du main loop

 

local selfId = fibaro:getSelfId();
        fibaro:call(selfId, "pressButton", "bouton11")

 

je dois mettre le meme nom que le ID du bouton refresh, dans mon id j'ai: bouton11

 

Merci,

 

j'ai trouver! le id était 1.

Modifié par Plap3014
Lien vers le commentaire
Partager sur d’autres sites

Sebcbien: pour le tableau j,ai bien créer un log dans la section input avec 30s intervalle

 

- Log to feed, fix interval with averaging et 30 sec

 

dans le feed, je vois bien le données, la data type est a Real time?

 

quand je créer le multigraph, pas de donné a l'intérieur?

 

tu vois ce que j'ai fais de pas correct?

 

Merci

 

Sa fonctionne, j'ai un tableau avec des données, mais comment faire pour changer la partie de gauche comme toi?

 

Merci,

Modifié par Plap3014
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...