Kana-chan Posté(e) le 4 avril 2015 Signaler Posté(e) le 4 avril 2015 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.
Kana-chan Posté(e) le 5 avril 2015 Signaler Posté(e) le 5 avril 2015 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à !! 2
megabubu Posté(e) le 5 avril 2015 Signaler Posté(e) le 5 avril 2015 nikel, ca marche merci à toi edit: cependant, je trouve que les valeurs ne sont pas représentatives de ce qu il y a dans diagnostique
megabubu Posté(e) le 5 avril 2015 Signaler Posté(e) le 5 avril 2015 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)
Plap3014 Posté(e) le 6 avril 2015 Signaler Posté(e) le 6 avril 2015 Bonsoir Megabubu, meme chose que le poste a Kana-Chan, remplacer la ligne 13 par: local ramused = tonumber(result.memory.used) Patrick
Kana-chan Posté(e) le 6 avril 2015 Signaler Posté(e) le 6 avril 2015 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! Voilà !!
megabubu Posté(e) le 6 avril 2015 Signaler Posté(e) le 6 avril 2015 merci les gars, un vrai travail d équipe 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?
Sakkhho Posté(e) le 31 mai 2015 Signaler Posté(e) le 31 mai 2015 la RAM libre correspond àlibre + Cache + Buffer, chez moi c'est ok
sebcbien Posté(e) le 25 novembre 2015 Signaler Posté(e) le 25 novembre 2015 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 :-)
Lazer Posté(e) le 25 novembre 2015 Signaler Posté(e) le 25 novembre 2015 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.
sebcbien Posté(e) le 25 novembre 2015 Signaler Posté(e) le 25 novembre 2015 Donc on pourrait programmer un reboot à4h du matin si la RAM > 75% ? Sent from my Note4
mprinfo Posté(e) le 25 novembre 2015 Signaler Posté(e) le 25 novembre 2015 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
sebcbien Posté(e) le 25 novembre 2015 Signaler Posté(e) le 25 novembre 2015 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 ?
sebcbien Posté(e) le 27 novembre 2015 Signaler Posté(e) le 27 novembre 2015 c parti mon kiki :-) btw, une idée de la syntaxe pour récupérer le nombre d'heures "up" de la hc2 ? 2
Nikko Posté(e) le 27 novembre 2015 Signaler Posté(e) le 27 novembre 2015 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)) Nicolas
sebcbien Posté(e) le 27 novembre 2015 Signaler Posté(e) le 27 novembre 2015 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
sebcbien Posté(e) le 28 novembre 2015 Signaler Posté(e) le 28 novembre 2015 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.
Plap3014 Posté(e) le 28 novembre 2015 Signaler Posté(e) le 28 novembre 2015 Sebcbien: pour la config sur Emoncms, les inputs on les configure comment? pour avoir le meme genre de tableau? Merci,
sebcbien Posté(e) le 28 novembre 2015 Signaler Posté(e) le 28 novembre 2015 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
Plap3014 Posté(e) le 28 novembre 2015 Signaler Posté(e) le 28 novembre 2015 (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é le 28 novembre 2015 par Plap3014
Plap3014 Posté(e) le 28 novembre 2015 Signaler Posté(e) le 28 novembre 2015 (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é le 28 novembre 2015 par Plap3014
sebcbien Posté(e) le 28 novembre 2015 Signaler Posté(e) le 28 novembre 2015 Je posterai le vd ce soir et deux trois mots sur emoncms. Làje suis encore àla bourre :+/ Sent from my Note4 1
mprinfo Posté(e) le 28 novembre 2015 Signaler Posté(e) le 28 novembre 2015 Plus vite seb ma hc2 àplanter ce matin grr Envoyé de mon SM-G900F en utilisant Tapatalk
Messages recommandés