Aller au contenu
razowski

Module Virtuel "hc2 - Diagnostics"

Recommended Posts

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

 

 

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

lazer way, as usual -> sms email push

Partager ce message


Lien à poster
Partager sur d’autres sites

super. Possible d avoir le code du VD? Je voudrais pas forcément le réimporter.

Merci!

Partager ce message


Lien à poster
Partager sur d’autres sites

Le code àbesoin du vd car les noms et nombre de boutons àchangé...

Sent from my Note4

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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,

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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?

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

haaaa ok !

Moi ça fait depuis hier seulement ;)

Je pensais que ces boutons fonctionnaient.

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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 ? 

Partager ce message


Lien à poster
Partager sur d’autres sites

salut domo,

 

non, c'est le numéro du bouton du VD pour lancer le Reboot ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pepite pour la réponse , bon GEA sa fonctionne pas chez moi

Partager ce message


Lien à poster
Partager sur d’autres sites

×