Aller au contenu

Module Virtuel "hc2 - Diagnostics"


Messages recommandés

Posté(e)

Bon, voici ma dernière version, rien de très léché mais ça marche depuis deux jours...

Le double click pour reboot déconne (1 click et la box reboote !!) mais je pense que vous préférez l'avoir comme ça ;-)

J'ai aussi ajouté des notifications pour les dépassements

 

Pour la V2, voir ici: http://www.domotique-fibaro.fr/index.php/topic/3719-module-virtuel-hc2-diagnostics/page-4#entry122558

 

28-11-15 22-48-12.png

post-826-0-84610600-1448747419_thumb.png

 

28-11-15 22-53-22.png

post-826-0-97077800-1448747608_thumb.png

 

HC2_Diagnostics.vfib

  • Upvote 2
Posté(e)

Pouir le setup emon cms

1) récupérer votre clef de l'api

2) le VD crée tout seul des inputs.

3) pour mémoriser ces inputs dans emoncms, il faut créer un feed

     SETUP/INPUTS->clef à  molette à  droite de l'input->en haut de la page log to feed/create new/feedengine=fixed interval with average/30s -> add

4) si vous allez dans SETUP/FEED, après quelques minutes vous devriez voir des graphiques en cliquant sur l'oeil de chaque feed

5)pour crée un multigraphe (superposition de plusieurs graphes) allez dans EXTRA/VISUALISATIONS - select visualisation: multigraph - new multigraph - ajouter les feeds sur l'échelle de gauche et le uptime sur l'échelle de droite

6) ensuite SETUP/DASHBOARD - new - editez le - ensuite visualisation/multigraph - selectionnez l'emplacement - selectionnez le - configure - selectionnez le bon - save - save - puis le petit oeil en haut à  droite pour passer en visualisation

 

Et voilà 

  • Upvote 2
Posté(e)

 

 

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

 

 

partie de gauche ? les deux échelles ?

Il faut associer les inputs à  left et le uptime à  right

Posté(e)

note: dans le dernier, j'ai aussi rajouté des notifications pour une valeur X de la ram.

lazer way, as usual -> sms email push

Posté(e)

Voici ce que ça donne sur une petite semaine:

Ce qui m'étonne le plus c'est la constance de la diminution de la mémoire...

Que la box soit utilisée ou non, la nuit, le jour, backup etc, la diminution semble constante...

J'ai rajouté les lignes vert fluo pour bien illustrer cette tendance.

 

03-12-2015 09-29-59.jpg

post-826-0-48289600-1449131799_thumb.jpg

Posté(e)

Je constate la même augmentation régulière sur mon embryon de graphique, et cela ne fait que confirmer ce que je pense: fuite mémoire, on ne peut rien y faire...

Posté(e)

si je ne me trompe pas, faire un backup relance les services fibaro non ?

Apparement ça ne change rien àla ram...

Donc même un watchdog sur les process ne servirait pas àgrand chose, seul un reboot permet de repartir sur des bases saines...

Posté(e)

Le backup ne redémarre pas tous les services, seulement certains.

Un watchdog au niveau de Linux a la possibilité de redémarrer tous les services, et donc de libérer la mémoire. Testé et approuvé ;)

  • Upvote 2
Posté(e)

C'est bien parce que c'est toi je viens de mettre un +1 car je vais jamais chez fibaro ils ne parlent pas français. merci pour avoir ouvert ce ticket 

  • Upvote 1
  • 3 semaines après...
Posté(e)

20 jours plus tard...

Toujours pas planté, mais j'arrive à  30% de ram libre ...

En tout cas, belle constance dans la perte mémoire...

 

23-12-15 15-52-09.png

 

post-826-0-90374200-1450882538_thumb.png

  • 2 mois après...
Posté(e)

Bonjour,

 

si je veux utiliser GEA pour refaire avec le reboot automatiquement la nuit si RAM a moins de 10%. je edevrais inscrire quoi comme commande vu le double click?

 

Merci,

Posté(e)

Je viens de mettre en place ce VD et son pendant sur Emoncms

Bonnes explications et aucune difficulté pour la mise en place.

Merci

 

Concernant la gestion de la RAM, je peux enfin la surveiller au travers d'un graphe, mais la fuite est constatée depuis quelques temps sans cela.

Je suis preneur d'une solution pour mettre en place un reboot auto, une fois atteint un seuil critique de mémoire libre comme 10% ou 5 % via GEA ou autre.

 

Encore une fois merci pour le partage.

Posté(e)

Merci sbcbien pour le VD et le tuto explicatif emoncms ! (car pas évident)

 

Question : Combien de temps pour avoir une remonté de graphs quand ont a jamais utilisé emoncms ?

 

EDIT : En appuyant sur D (day) je commence à  avoir des données.

 

Merci

 

Pouir le setup emon cms

1) récupérer votre clef de l'api

2) le VD crée tout seul des inputs.

3) pour mémoriser ces inputs dans emoncms, il faut créer un feed

     SETUP/INPUTS->clef à  molette à  droite de l'input->en haut de la page log to feed/create new/feedengine=fixed interval with average/30s -> add

4) si vous allez dans SETUP/FEED, après quelques minutes vous devriez voir des graphiques en cliquant sur l'oeil de chaque feed

5)pour crée un multigraphe (superposition de plusieurs graphes) allez dans EXTRA/VISUALISATIONS - select visualisation: multigraph - new multigraph - ajouter les feeds sur l'échelle de gauche et le uptime sur l'échelle de droite

6) ensuite SETUP/DASHBOARD - new - editez le - ensuite visualisation/multigraph - selectionnez l'emplacement - selectionnez le - configure - selectionnez le bon - save - save - puis le petit oeil en haut à  droite pour passer en visualisation

 

Et voilà 

  • Upvote 1
Posté(e)

Bonjour 

L'outil Emoncms stocke et affiche les données sur une semaine

Est-il envisageable d'avoir une mémorisation des valeurs sur une plus longue durée?

Posté(e)

Ben tu clics sur le bouton en haut à  droite non ? (D, W,Y)

 

Cela fait maintenant 4 semaines que j'ai mis en place ce monitoring technique.

Et lorsque je clique sur l'icone W, M, je n'ai que la dernière semaine.

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

Voici la "V2"  avec variable globale ramfree pour utilisation avec GEA entre autres.

 

En plus des instruction de la V1: 

- http://www.domotique-fibaro.fr/index.php/topic/3719-module-virtuel-hc2-diagnostics/page-3#entry98130

- http://www.domotique-fibaro.fr/index.php/topic/3719-module-virtuel-hc2-diagnostics/page-3#entry98131

 

Créez une Variable Globale RamFree

 

et importez le VD V2 attaché à  ce post.

HC2_Diagnostics V2.vfib

 

Code GEA pour reboot automatique:

-------------SURVEILLANCE MEMOIRE--------------
  GEA.add({{"Global-", "RamFree", 35}}, 30, "RAM inférieure à  #value# - Reboot prévu cette nuit à  2h45", {{"Time", "21:00", "21:01"}}) --  Push si Ram faible
  GEA.add({{"Global-", "RamFree", 35}}, 30, "Reboot HC2 car RAM inférieure à  35% (#value#)", {{"Time", "02:45", "02:46"},{"VirtualDevice", id["HC2_DIAGNOSTICS"], 15},{"Function", function() fibaro:sleep(1000) end},{"VirtualDevice", id["HC2_DIAGNOSTICS"], 15}}) --  Reboot HC2 si RAM faible

code du bouton raffraichir:

local thismodule = fibaro:getSelfId();
local HC2 = Net.FHttp("127.0.0.1",11111);
EmonCMS = {}; 
EmonCMS.EmonCMS_Prefix = "HC2_DIAG_";
EmonCMS.PushToEmonCMS = true; -- true = push to emoncms - false = do not push
EmonCMS.get = Net.FHttp("emoncms.org",80);
EmonCMS.emoncms_api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; -- your EMONCMS WRITE api Key
EmonCMS.emoncms_ok = true
HcDiag = {};
-- notifications
	HcDiag.notifications = true;				-- send notifications
	--HcDiag.notificationTypes = {"push", "email"};--notification types {"push", "email", "sms"}
	HcDiag.notificationTypes = {"email"};--notification types {"push", "email", "sms"}
	HcDiag.smartphoneID = {1347};				-- Smartphone Id to send push to. {id1, id2, id3}
	HcDiag.userID = {2};						-- User Id to send email to. {id1, id2, id3}
	HcDiag.sms = {
		["VD_ID"] = 0,							-- Virtual Device ID
		["VD_Button"] = "1",					-- Virtual Device Button
		["VG_Name"] = "SMS"};					-- Global Variable Name
	HcDiag.debug_messages = false;				-- Global Variable Name
local debug_messages = false;					-- Diplay debug for notifications
local ram_treshold = 15 						-- limit of freeram to send notification
Debug = function (color, message)
	if color and color ~= "" then
		fibaro:debug('<span style="color:'..color..';">'..message..'</span>');
	else
		fibaro:debug(message);
	end
end
round = function(num)
     local a = math.floor(num*100 + 0.5)/ 100;
     return a,string.format("%.2f",a);
end
EmonCMS.Push = function(payloademon)
fibaro:debug("Payload: " .. payloademon) ;
if EmonCMS.emoncms_ok then 
	payloademon = "/input/post.json?json={" .. EmonCMS.EmonCMS_Prefix .. payloademon .. "}&apikey=" .. EmonCMS.emoncms_api_key;
	response, status, errorCode = EmonCMS.get:GET(payloademon);
		if status ~= "200" then
			EmonCMS.emoncms_ok = false
			fibaro:debug("error response, aborting all push. - ".."response: " .. response .. " Status: " .. status .. " errorcode: " .. errorCode) ;
		end
	fibaro:sleep(500);
end
end
HcDiag.notification = function(message, subject, param)
	local message = message or "<vide>";
	if HcDiag.debug_messages then
		Debug("yellow", "Notification : "..message);
	end
	if param then
		for _, notif in ipairs(param) do
			if HcDiag.debug_messages then
				Debug("grey", notif);
			end
			-- Envoi Push
			if notif == "push" and HcDiag.smartphoneID then
				for _, id in ipairs(HcDiag.smartphoneID) do
					if HcDiag.debug_messages then
						Debug("grey", "Send Push smartphone ID : "..id);
					end
					fibaro:call(id, "sendPush", message);
				end
			-- Envoi Email
			elseif notif == "email" and HcDiag.userID then
				for _, id in ipairs(HcDiag.userID) do
					if HcDiag.debug_messages then
						Debug("grey", "Send Email user ID : "..id);
					end
					fibaro:call(id, "sendEmail", subject, message);
				end
			-- Envoi SMS
			elseif notif == "sms" and HcDiag.sms then
				if HcDiag.debug_messages then
					Debug("grey", "Send SMS : VD_ID="..(HcDiag.sms["VD_ID"] or 0).." VD_Button="..(HcDiag.sms["VD_Button"] or "0").." VG_Name="..(HcDiag.sms["VG_Name"] or ""));
				end
				fibaro:setGlobal(HcDiag.sms["VG_Name"], message);
				if HcDiag.sms["VD_ID"] and tonumber(HcDiag.sms["VD_ID"])>0 and HcDiag.sms["VD_Button"] and tonumber(HcDiag.sms["VD_Button"])>0 then
					fibaro:call(HcDiag.sms["VD_ID"], "pressButton", HcDiag.sms["VD_Button"]);
				end
			end
		end
	else
		Debug("orange", "Warning : no notification options given");
	end
end
timestampToDate = function(nTimestamp) -- Convertit un Timestamp en date lisible
	return os.date("%d/%m/%y à  %X", nTimestamp)
end
SecondsToClock = function(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 "..nSecs.. "s"
  end
end
Minutes = function(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 response, status, errorCode = HC2:GET("/api/settings/info");
	if tonumber(status) == 200 then
		local result = json.decode(response);
		--fibaro:debug("Timestamp de boot: " .. result.serverStatus)
		--fibaro:debug("Date de boot: " .. timestampToDate(result.serverStatus))
		--fibaro:debug("HC2 allumée depuis " ..SecondsToClock(os.time()-result.serverStatus))
		fibaro:debug("HC2 allumée depuis " .. Minutes(os.time()-result.serverStatus).." minutes. Soit "..SecondsToClock(os.time()-result.serverStatus))
		fibaro:call(thismodule,"setProperty","ui.time.value", "Up: ".. SecondsToClock(os.time()-result.serverStatus).." (at " .. os.date("%H:%M", os.time())..")");
	end

--fibaro:call(thismodule,"setProperty","currentIcon","1267");
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 ramused = tonumber(result.memory.used);
	local ramfree = 100 - ramused;
	ramused_pct = ramused .. "%";
	ramfree_pct = ramfree .. "%";
	fibaro:call(thismodule,"setProperty","ui.vlRAM0.value", "Utilisé : " .. ramused_pct);
	fibaro:call(thismodule,"setProperty","ui.vlRAM1.value", "Disponible : " .. ramfree_pct);
	if ramfree <= ram_treshold then 
		HcDiag.notification("Ram used: ".. ramused_pct.. "Ram free: ".. ramfree_pct, "HC2 Ram Usage High !", HcDiag.notificationTypes); -- Send Alert
	end
	--Partition système
	local sused = tonumber(result.storage.internal[1].used);
	local sfree = 100 - sused;
	sused = sused .. "%";
	sfree = sfree .. "%";
	fibaro:call(thismodule,"setProperty","ui.vlSystem0.value", "Utilisé : " .. sused);
	fibaro:call(thismodule,"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(thismodule,"setProperty","ui.vlRecovery0.value", "Utilisé : " .. rused);
	fibaro:call(thismodule,"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:debug("PREV TOTAL cpu_0: " .. cpu0_PREVTOTAL);
	--fibaro:debug("PREV TOTAL cpu_1: " .. cpu1_PREVTOTAL);

	  fibaro:sleep(1000);
	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);
		
		--fibaro:debug("TOTAL cpu_0 : " .. cpu0_TOTAL);
		--fibaro:debug("TOTAL cpu_1 : " .. cpu1_TOTAL);
		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(thismodule,"setProperty","ui.vlCPU0.value", "Coeur 1 : " .. cpu0_Percentage_pct);
		fibaro:call(thismodule,"setProperty","ui.vlCPU1.value", "Coeur 2 : " .. cpu1_Percentage_pct);
		--fibaro:debug(cpu0_Percentage_pct);
		--fibaro:debug(cpu1_Percentage_pct);
		if EmonCMS.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
		fibaro:setGlobal("RamFree", ramfree);
	end
else
	fibaro:debug("Try again "..deviceID.. " "..status)
end
  • Upvote 1
Posté(e)

merci pour l'amélioration de ce VD j'ai juste un petit souci avec le GEA, le chiffre après "HC2 Diagnostics" c'est le numéro de ton VD ? 

×
×
  • Créer...