Aller au contenu

Module Virtuel "hc2 - Diagnostics"


Messages recommandés

Posté(e)

Bonjour,

 

J'ai un souci de "ramused has a nil value" dans ce virtual device. Savez-vous comment faire pour ne plus avoir le problème ?

Je suis en v4.040.

 

Merci d'avance.

Posté(e)

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
Posté(e)

nikel, ca marche  :60:

 

merci à  toi  :13:

 

edit:

cependant, je trouve que les valeurs ne sont pas représentatives de ce qu il y a dans diagnostique  :rolleyes:

Posté(e)

: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)
Posté(e)

Bonsoir Megabubu,

 

meme chose que le poste a Kana-Chan, remplacer la ligne 13 par: local ramused = tonumber(result.memory.used)

 

Patrick

Posté(e)

Bonjour,

 

Oui en effet, la même erreur est à  modifier dans la boucle principale sur la ligne 13.

Je l'avais fait mais j'ai oublié de préciser. En même temps, c'est nouveau pour moi tout ça! :P

 

Voilà  !! :)

Posté(e)

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?

  • 1 mois après...
  • 5 mois après...
Posté(e)

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

Posté(e)

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.

Posté(e)

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

Posté(e)

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 ?

Posté(e)

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

Posté(e)

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
Posté(e)

ca avance.

Ici on voit un reboot.

Avant le reboot, on voit que la HC2 peut aussi libérer de la ram...

je peux avec ce vd rebooter à  une valeur X de la ram.

 

28-11-15 02-28-12.png

post-826-0-31068700-1448674138_thumb.png

Posté(e)

De mémoire.

Tu dois créer un feed simple avec un intervalle de +-30s.

Ensuite tu dois créer un graphe type multigraph.

Sent from my Note4

Posté(e) (modifié)

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
Posté(e) (modifié)

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
Posté(e)

Je posterai le vd ce soir et deux trois mots sur emoncms.

Làje suis encore àla bourre :+/

Sent from my Note4

  • Upvote 1
×
×
  • Créer...