Encore merci JoeKer,
c'est génial une fois remplacé false par true sur la ligne précédente
chartCursor: {
fullWidth:true,
categoryBalloonEnabled: true,
categoryBalloonDateFormat: 'JJ:NN:SS',
cursorAlpha:0.1
},
A+
Hors ligne
Euh.... j'ai l'heure dans la fenêtre du haut et du bas, c'est pas faisable de garder la date en haut et l'heure en bas ?
Oui, je sais, je suis fromage ET dessert
A+
Edit
Je viens de comprendre mon erreur
Le true active la fenêtre du bas, mais avec les mêmes infos que celle du haut
Dernière modification par AlphaZoulou (23-09-2015 21:41:46)
Hors ligne
Je suppose que, quand tu parles "du haut et du bas", tu parles des "bulles" qui suivent la souris ...
Hélas, à ma connaissance, non, ce n'est pas séparable (mais je n'ai pas lu toute la doc !)
Je n'ai modifié que la ligne en cause, et ça met à jour les deux "bulles".
La date, on la connaît, elle est dans le titre, et comme on ne prend (sauf "bidouille") que la journée, ça n'apporterait pas grand chose de l'avoir ...
Et l'heure en haut correspond au "ruban de zoom", en bas, c'est fonction de ce que tu as "zoomé".
Perso, en laissant "categoryBalloonEnabled: false", je trouve que c'est pas mal, mais ce n'est que mon point de vue ...
Ca permet de faire la relation avec un "incident" à la seconde près dans la maison, par exemple.
[Edit]
Croisement de réponses ...
[/Edit]
Dernière modification par JoeKer (23-09-2015 21:56:04)
Hors ligne
Oui, tu as raison pour la date, puisqu'on a un fichier par jour.
J'étais resté avec mon fichier horodaté de l'heure du lancement et pouvant être à cheval sur un changement de jour.
A+
Hors ligne
Pour ce cas là, il y a une possibilité (et même plusieurs ) :
Essaye avec "categoryBalloonDateFormat: 'YYYY/MM/DD JJ:NN:SS',"
Ca te mettra, dans la dite "bulle", la date sous la forme "2015/09/23 22:54:47" ...
Hors ligne
Bonjour à tous,
Je viens d'essayer la dernière version de ce bel outils . J'ai une anomalie sur l'heure qui est en avance de 2 heures, je suis déjà demain....mais la date sur le titre est bien du 23 .
C'est pas si souvent que je suis en avance !
Hors ligne
JoeKer a écrit:
Essaye avec "categoryBalloonDateFormat: 'YYYY/MM/DD JJ:NN:SS',"
Oui, effectivement c'est une alternative, Merci
@Denys03
Vérifie le fuseau horaire dans la Livebox
A+
Hors ligne
Bonsoir Denys.
Si tu es sous Chrome, le problème est connu
@AlphaZoulou : C'est la seule alternative que j'ai pu trouver
Ceci dit, Amcharts est vraiment très puissant (il faut fouiller la doc sur leur site pour s'en rendre compte ...)
Ce qui serait top, maintenant, c'est d'envoyer plusieurs infos (CRCErrors et DownstreamAttenuation et DownstreamMaxRate, par exemple ) pour pouvoir faire des corrélations entre les données.
L'idéal serait de pouvoir prendre toutes les données en entrée, et les désélectionner sur le graphique, mais ça, je crains fort que ça ne soit pas possible
Hors ligne
De la lecture en perspective...
A+
Hors ligne
Bonjour à tous,
La box est bien réglée sur Paris (j'ignorais qu'il y avait un reglage fuseau horiare)
J'utilise IE9, Vista oblige pas de version plus recente .
Ceci dit ca reste sans consequence puisque je connais le decalage, ca reste un bel outils, je suis avec plaisir vos échanges .
Hors ligne
Moi j'ai testé avec IE11 et Firefox 40 et 41, aucun souci.
Je vous conseille de trouver une alternative a IE9, si ce n'est rien que pour la sécurité...Firefox devrait faire l'affaire.
J'ai vraiment un doute concernant ce problème d'incompatibilité entre les navigateurs, car avec les samples fournis j'ai l'impression que tout fonctionne...je me demande si le format date/heure qu'on envoie est bien le bon, je n'en suis pas convaincu pour le moment.
Je pense que la solution au problème se trouve la dedans:
http://www.amcharts.com/tutorials/formatting-dates/
http://docs.amcharts.com/3/javascriptcharts/AmCharts
Dernière modification par shdf (24-09-2015 13:04:43)
Hors ligne
IE9 et Chrome même erreur, par contre Firefox
http://www.cjoint.com/c/EIymiDTIaet
Ca marche
Jamais sans ce logiciel je n'aurais cru à autant de variations, pas fameuse la ligne !
Dernière modification par Denys03 (24-09-2015 14:12:55)
Hors ligne
Bonsoir.
Un petit bug :
Si on fait un échantillonnage à 30 minutes, par exemple, la session ouverte par le logiciel sur la LiveBox est "expirée" à la mesure suivante, et le programme se plante avec un joli message d'erreur (correspondant à un manque de données).
Dans la boucle "while", on a :
auth_livebox() ; connexion à la LiveBox
_GetData() ; On récupère les données
En déplaçant "auth_livebox() ; connexion à la LiveBox" au début de la fonction "_GetData", on résout le problème (ce n'est pas forcément la méthode la plus propre, mais elle a le mérite de fonctionner avec peu de modifications )
Dernière modification par JoeKer (24-09-2015 19:37:05)
Hors ligne
C'est exactement ce qu'il fallait faire et c'est tout à fait propre de le faire comme ça
Mise à jour effectuée.
PS:
le bon lien à mettre dans le Template.html pour le stylesheet c'est :
<link rel="stylesheet" href="../amcharts/samples/style.css" type="text/css">
C'est à jour dans le ZIP de la 2.3
Dernière modification par shdf (24-09-2015 20:10:26)
Hors ligne
Pour faire plus propre, il faudrait fermer la session après chaque récupération de données, je ne sais pas ce que ça peut donner à la longue (même si le timer de session n'est pas très long).
Exemple, on décide d'interroger la LiveBox toutes les 5 secondes, et le timer de session est de 10 minutes.
A raison de 12 sessions par minute, ça va faire 120 sessions potentiellement actives au bout de 10 minutes (et je ne suis pas certain que la LiveBox nettoie bien ses données périmées).
En ouvrant la session à chaque interrogation, et en la fermant à la fin de la récupération, on peut espérer que la box "souffrira" moins
Hors ligne
Bonjour,
Tout à fait d'accord avec toi JoeKer sur le principe d'ouverture/fermeture.
Mais dans le cas de mesures très courtes, par exemple toutes les secondes, vu le temps de réaction de la box, n'y a t-il pas un risque qu'elle perde les pédales ?
Lors de mes essais, une mesure toutes les 5 minutes sur 24h passait sans perte de la connexion.
Pour ne pas trop perturber la box, on pourrait, par exemple, dire de 0 à 5 mn une ouverture permanente, et au delà une ouverture/fermeture par lecture.
A+
Hors ligne
Bonsoir.
Ta remarque est justifiée, quoiqu'il n'est pas possible de descendre en dessous de la minute sans modification du code (il faudrait échantillonner sur un multiple de secondes au lieu de minutes).
J'ai donc adapté le code de la dernière version pour fermer la session si l'échantillonnage est proche de 10 minutes (j'ai mis 595 secondes - 595000 ms - , mais rien n'empêche de descendre cette valeur à 300000 ms (5 minutes).
Ca donne le code qui suit :
#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=LBMonitor.ico #AutoIt3Wrapper_UseUpx=y #AutoIt3Wrapper_Res_Fileversion=2.3 #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <ButtonConstants.au3> #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include<File.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("LBMonitor V2.3", 268, 129, 316, 176) $Combo1 = GUICtrlCreateCombo("", 16, 88, 145, 25) GUICtrlSetData(-1, "ErroredSecs|SeverelyErroredSecs|FECErrors|ATUCFECErrors|HECErrors|ATUCHECErrors|CRCErrors|ATUCCRCErrors|UpstreamNoiseMargin|DownstreamNoiseMargin|UpstreamAttenuation|DownstreamAttenuation","ErroredSecs") $Button1 = GUICtrlCreateButton("Graph", 176, 88, 67, 22) $Input1 = GUICtrlCreateInput("1", 16, 24, 65, 21, $ES_NUMBER) ; on autorise que les chiffres $Label1 = GUICtrlCreateLabel("Cycle de lecture des données en Minutes:", 16, 8, 202, 16) $Button2 = GUICtrlCreateButton("Lancer", 96, 24, 67, 22) $Button3 = GUICtrlCreateButton("Arrêter", 176, 24, 67, 22) GUICtrlSetState($Button3,$GUI_DISABLE) $Input2 = GUICtrlCreateInput("", 16, 56, 145, 21) GUICtrlSetState($Input2,$GUI_DISABLE) $Button4 = GUICtrlCreateButton("Fichier", 176, 56, 67, 25) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### Opt("TrayIconHide", 1) ;0=show, 1=hide tray icon Global $USER = "admin" Global $LIVEBOX = "livebox" Global $sContextID = "" Global $PASSWORD = "" Global $bDisconnect = False ; On vérifie que le fichier INI est bien présent $sFilePath = @scriptDir & "\config.ini" $iFileExists = FileExists($sFilePath) if $iFileExists Then Global $LIVEBOX = IniRead (@scriptDir & "\config.ini","setting","LiveboxIP","192.168.1.1") Global $PASSWORD = IniRead (@scriptDir & "\config.ini","setting","password","") Else $Filepath = @ScriptDir & "\config.ini" FileOpen($Filepath, 1) FileWriteLine($Filepath,"[setting]") FileWriteLine($Filepath,"LiveboxIP=192.168.1.1") FileWriteLine($Filepath,"password=XXXXXXXX") msgbox(48,"ERREUR","Veuillez indiquer votre mot de passe Livebox dans le fichier CONFIG.INI") Exit EndIf ; On vérifie que les étourdis ont bien mis leur mot de passe if ($PASSWORD ="" or $PASSWORD="XXXXXXXX") Then msgbox(48,"ERREUR","Veuillez indiquer votre mot de passe Livebox dans le fichier CONFIG.INI") Exit EndIf $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE ; Fermeture application _Logout() Exit Case $Button1 ; Affichage du Graph _GetChart() Case $Button2 ; Execution du cycle de lecture des données GUICtrlSetState($Button3,$GUI_ENABLE) ; on active le bouton ARRETER GUICtrlSetState($Button2,$GUI_DISABLE) ; on désactive le bouton LANCER $cycle = GUICtrlRead($Input1) _GetData() ; On récupère les données $cycle = $cycle * 60000 ; conversion en minutes If $cycle > 595000 Then $bDisconnect = True Else $bDisconnect = False EndIf AdlibRegister("_GetData",$cycle) ; execute la fonction _GetData toutes les x minutes Case $Button3 ; ARRET de l'execution du cycle de lecture des données GUICtrlSetState($Button2,$GUI_ENABLE) ; on active le bouton LANCER GUICtrlSetState($Button3,$GUI_DISABLE) ; on désactive le bouton ARRETER AdlibUnRegister("_GetData") ; on arrete le cycle de lecture Case $Button4 Local $sFileOpenDialog = FileOpenDialog("Choisir un fichier de données", @ScriptDir & "\data", "TXT (*.txt)", $FD_FILEMUSTEXIST) if $sFileOpenDialog <>"" then guictrlsetdata($input2,$sFileOpenDialog) EndIf EndSwitch WEnd Func _GetData() If $bDisconnect = True or $cycle < 1000 Then auth_livebox() ; connexion à la LiveBox EndIf ; Recuperation des donnees DSLStats $oHTTP.Open("POST", "http://" & $LIVEBOX & "/sysbus/NeMo/Intf/dsl0:getDSLStats", False) $oHTTP.SetRequestHeader("X-Context", $sContextID) $oHTTP.Send('{"parameters":{}}') $getDSLStats = $oHTTP.ResponseText ; Recuperation des donnees MIBs $oHTTP.Open("POST", "http://" & $LIVEBOX & "/sysbus/NeMo/Intf/data:getMIBs", False) $oHTTP.SetRequestHeader("X-Context", $sContextID) $oHTTP.Send('{"parameters":{"mibs":"dsl","flag":"","traverse":"down"}}') $getMIBs = $oHTTP.ResponseText $ErroredSecs = StringRegExp($getDSLStats, 'ErroredSecs":(.*),"SeverelyErroredSecs', 3) $SeverelyErroredSecs = StringRegExp($getDSLStats, 'SeverelyErroredSecs":(.*),"FECErrors', 3) $FECErrors = StringRegExp($getDSLStats, 'FECErrors":(.*),"ATUCFECErrors', 3) $ATUCFECErrors = StringRegExp($getDSLStats, 'ATUCFECErrors":(.*),"HECErrors', 3) $HECErrors = StringRegExp($getDSLStats, 'HECErrors":(.*),"ATUCHECErrors', 3) $ATUCHECErrors = StringRegExp($getDSLStats, 'ATUCHECErrors":(.*),"CRCErrors', 3) $CRCErrors = StringRegExp($getDSLStats, 'CRCErrors":(.*),"ATUCCRCErrors', 3) $ATUCCRCErrors = StringRegExp($getDSLStats, 'ATUCCRCErrors":(.*)}}', 3) $UpstreamNoiseMargin = StringRegExp($getMIBs, 'UpstreamNoiseMargin":(.*),"DownstreamNoiseMargin', 3) $DownstreamNoiseMargin = StringRegExp($getMIBs, 'DownstreamNoiseMargin":(.*),"UpstreamAttenuation', 3) $UpstreamAttenuation = StringRegExp($getMIBs, 'UpstreamAttenuation":(.*),"DownstreamAttenuation', 3) $DownstreamAttenuation = StringRegExp($getMIBs, 'DownstreamAttenuation":(.*),"UpstreamPower', 3) ; format date = 2015-08-22T18:29:44 $data = @YEAR & "-" & @MON & "-" & @MDAY & "T" & @HOUR & ":" & @MIN & ":" & @SEC & "," & _ $ErroredSecs[0] & "," & _ $SeverelyErroredSecs[0] & "," & _ $FECErrors[0] & "," & _ $ATUCFECErrors[0] & "," & _ $HECErrors[0] & "," & _ $ATUCHECErrors[0] & "," & _ $CRCErrors[0] & "," & _ $ATUCCRCErrors[0] & "," & _ $UpstreamNoiseMargin[0] & "," & _ $DownstreamNoiseMargin[0] & "," & _ $UpstreamAttenuation[0] & "," & _ $DownstreamAttenuation[0] $date = @YEAR & @MON & @MDAY $filename = $date & ".txt" $Filepath = fileopen(@SCRIPTDIR & "\data\" & $filename,9) FileWriteLine($Filepath,$data) Fileclose($Filepath) guictrlsetdata($input2, @ScriptDir & "\data\" & $filename) If $bDisconnect = True Then _Logout() EndIf Endfunc ;==>_GetData Func _GetChart() $fichierdata = GUICtrlRead($input2) $choix = GUICtrlRead($Combo1) select Case $choix = "ErroredSecs" Local $c=2, $ytitle="&ytitle=Erreurs" Case $choix = "SeverelyErroredSecs" Local $c=3, $ytitle="&ytitle=Erreurs" Case $choix = "FECErrors" Local $c=4, $ytitle="&ytitle=Erreurs" Case $choix = "ATUCFECErrors" Local $c=5, $ytitle="&ytitle=Erreurs" Case $choix = "HECErrors" Local $c=6, $ytitle="&ytitle=Erreurs" Case $choix = "ATUCHECErrors" Local $c=7, $ytitle="&ytitle=Erreurs" Case $choix = "CRCErrors" Local $c=8, $ytitle="&ytitle=Erreurs" Case $choix = "ATUCCRCErrors" Local $c=9, $ytitle="&ytitle=Erreurs" Case $choix = "UpstreamNoiseMargin" Local $c=10, $ytitle="&ytitle=dB" Case $choix = "DownstreamNoiseMargin" Local $c=11, $ytitle="&ytitle=dB" Case $choix = "UpstreamAttenuation" Local $c=12, $ytitle="&ytitle=dB" Case $choix = "DownstreamAttenuation" Local $c=13, $ytitle="&ytitle=dB" EndSelect if $fichierdata = "" Then $filename = @SCRIPTDIR & "\data\" & @YEAR & @MON & @MDAY & ".txt" else $filename = $fichierdata EndIf $lines = _FileCountLines($filename) $Filepath = fileopen($filename,0) Local $x="", $y = "" For $i = 1 to $lines $line = FileReadLine($Filepath) $data = StringSplit($line,",") if $c>9 Then ; on affiche les dB correctement $data[$c] = $data[$c] / 10 EndIf if $i = $lines Then ; on ne met pas de "," après la dernière valeur $x = $x & '{"date":"' & $data[1] & '","visits":' & $data[$c] & '}' Else $x = $x & '{"date":"' & $data[1] & '","visits":' & $data[$c] & '},' Endif Next Fileclose($Filepath) ;récupération de la date du fichier...Bonjour l'usine a gaz ! $g = StringSplit($filename,"\") $h = ubound($g) - 1 $i = StringSplit($g[$h],".") $year = StringLeft($i[1],4) ; l'année c'est les 4 caractères de gauche du fichier txt $day = stringright($i[1],2) ; le jour: les 2 de droite $mon = StringMid($i[1],5,2) ; et le mois: les 2 caractères à partir du 5eme de la gauche... $template = fileopen(@SCRIPTDIR & "\" & "template.html",0) $html = fileread($template) $html = stringreplace($html,"XXXXXXXX",$x) $html = stringreplace($html,"TITRE",$choix & " - " & $day & "-" & $mon & "-" & $year) $graph = fileopen(@SCRIPTDIR & "\graph\" & $choix & ".html",10) FileWrite($graph, $html) fileclose($graph) fileclose($template) shellexecute(@ScriptDir & "\graph\" & $choix & ".html") EndFunc ;==>_GetChart Func _Logout() $oHTTP.Open("POST", "http://" & $LIVEBOX & "/logout", False) ; $oHTTP.Open("POST", "http://" & $LIVEBOX, False) $oHTTP.Send() ;$oHTTP = 0 EndFunc ;==>_Logout Func auth_livebox() $str = "/authenticate?username=" & $USER & "&password=" & $PASSWORD $oHTTP.Open("POST", "http://" & $LIVEBOX & $str, False) $oHTTP.SetRequestHeader("Content-Type", "application/json") $oHTTP.Send() $oReceived = $oHTTP.ResponseText $sContextID = StringRegExp($oReceived, 'contextID":"([^"]+)"|()$', 1)[0] If $sContextID = "" Then MsgBox(48, "ERREUR", " Mot de passe incorrect : ") Return "NOLOGIN" EndIf EndFunc ;==>auth_livebox
J'ai modifié aussi l'URL de "logout" pour la mettre en conformité avec ce qui est fait lors d'une session normale.
Dans la fonction "_logout", il faut absolument supprimer (commenter) la ligne "$oHttp = 0" qui détruit le canal de communication avec la LiveBox.
Pour le reste, j'ai un peu feinté pour déterminer s'il faut ou pas fermer la session.
A l'initialisation, avant le premier "_getData", le cycle est à la valeur tapée, et après il est à sa valeur précédente multipliée par 60000 (millisecondes), donc, si on a une valeur inférieure à 60000, on suppose que c'est avant multiplication, et qu'il faut donc ouvrir la connexion.
Ce n'est pas strictement bon, dans la mesure où on pourrait mettre la périodicité de mesure à 59999 secondes (juste en dessous de 1000 minutes), mais avec une telle périodicité, ça n'a pas beaucoup d'intérêt d'aller analyser les stats de la LiveBox
Après le premier "_getData" on change le flag "$bDisconnect" si la périodicité est proche de 10 minutes ou plus, et on fermera la connexion après chaque mesure si le flag est positionné (et on la rouvrira à chaque appel à "_getData").
Il y aura donc une session "fantôme" au second cycle, car la première n'aura pas été fermée (on pourrait faire un "_logout()" lorsqu'on passe ce flag à "True" pour être puriste).
Comme toujours, il y a certainement d'autres solutions plus propres, j'ai voulu minimiser les modifications sur le code original ...
Hors ligne
@joeker
attention tu as un problème avec l'éditeur Scite, tes caractères accentués sont corompus.
Dans le fichier SciTEUser.properties ajoute ces lignes:
NewFileEncoding=UTF8
utf8.auto.check=4
Ensuite va dans FILE>ENCODING> et choisi UTF-8
Puis sauve ton fichier au3
Hors ligne
Salut shdf, Petite Info, quand on va sur ton site et qu'on clique pour télécharger, c'est l'ancienne version qui se télécharge, tu as du oublier de modifier le lien ^^
Hors ligne
Bonsoir.
shdf a écrit:
@joeker
attention tu as un problème avec l'éditeur Scite, tes caractères accentués sont corompus.
Dans le fichier SciTEUser.properties ajoute ces lignes:NewFileEncoding=UTF8
utf8.auto.check=4Ensuite va dans FILE>ENCODING> et choisi UTF-8
Puis sauve ton fichier au3
Oui, j'ai vu après avoir posté, et rectifié ...
C'est peut-être un peu idiot de s'imposer de l'UTF-8 alors que c'est pas l'encodage par défaut sous Windows, non ?
J'ai retravaillé un petit peu sur le script, de façon à ce que le changement de périodicité soit pris en dynamique (à la prochaine lecture de compteurs), ça évite d'arrêter et lancer pour changer la valeur.
Ca donne donc ce qui suit :
#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=LBMonitor.ico #AutoIt3Wrapper_UseUpx=y #AutoIt3Wrapper_Res_Fileversion=2.3f #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <ButtonConstants.au3> #include <ComboConstants.au3> #include <GUIConstantsEx.au3> #include <WindowsConstants.au3> #include <EditConstants.au3> #include<File.au3> #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("LBMonitor V2.3f", 268, 129, 316, 176) $Combo1 = GUICtrlCreateCombo("", 16, 88, 145, 25) GUICtrlSetData(-1, "ErroredSecs|SeverelyErroredSecs|FECErrors|ATUCFECErrors|HECErrors|ATUCHECErrors|CRCErrors|ATUCCRCErrors|UpstreamNoiseMargin|DownstreamNoiseMargin|UpstreamAttenuation|DownstreamAttenuation","ErroredSecs") $Button1 = GUICtrlCreateButton("Graph", 176, 88, 67, 22) $Input1 = GUICtrlCreateInput("1", 16, 24, 65, 21, $ES_NUMBER) ; on autorise que les chiffres $Label1 = GUICtrlCreateLabel("Cycle de lecture des données en Minutes:", 16, 8, 202, 16) $Button2 = GUICtrlCreateButton("Lancer", 96, 24, 67, 22) $Button3 = GUICtrlCreateButton("Arrêter", 176, 24, 67, 22) GUICtrlSetState($Button3,$GUI_DISABLE) $Input2 = GUICtrlCreateInput("", 16, 56, 145, 21) GUICtrlSetState($Input2,$GUI_DISABLE) $Button4 = GUICtrlCreateButton("Fichier", 176, 56, 67, 25) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### Opt("TrayIconHide", 1) ;0=show, 1=hide tray icon Global $USER = "admin" Global $LIVEBOX = "livebox" Global $sContextID = "" Global $PASSWORD = "" Global $bDisconnect = False ; On vérifie que le fichier INI est bien présent $sFilePath = @scriptDir & "\config.ini" $iFileExists = FileExists($sFilePath) if $iFileExists Then Global $LIVEBOX = IniRead (@scriptDir & "\config.ini","setting","LiveboxIP","192.168.1.1") Global $PASSWORD = IniRead (@scriptDir & "\config.ini","setting","password","") Else $Filepath = @ScriptDir & "\config.ini" FileOpen($Filepath, 1) FileWriteLine($Filepath,"[setting]") FileWriteLine($Filepath,"LiveboxIP=192.168.1.1") FileWriteLine($Filepath,"password=XXXXXXXX") msgbox(48,"ERREUR","Veuillez indiquer votre mot de passe Livebox dans le fichier CONFIG.INI") Exit EndIf ; On vérifie que les étourdis ont bien mis leur mot de passe if ($PASSWORD ="" or $PASSWORD="XXXXXXXX") Then msgbox(48,"ERREUR","Veuillez indiquer votre mot de passe Livebox dans le fichier CONFIG.INI") Exit EndIf $oHTTP = ObjCreate("winhttp.winhttprequest.5.1") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE ; Fermeture application _Logout() Exit Case $Button1 ; Affichage du Graph _GetChart() Case $Button2 ; Execution du cycle de lecture des données GUICtrlSetState($Button3,$GUI_ENABLE) ; on active le bouton ARRETER GUICtrlSetState($Button2,$GUI_DISABLE) ; on désactive le bouton LANCER $cycle = 1 _GetData() ; On récupère les données Case $Button3 ; ARRET de l'execution du cycle de lecture des données GUICtrlSetState($Button2,$GUI_ENABLE) ; on active le bouton LANCER GUICtrlSetState($Button3,$GUI_DISABLE) ; on désactive le bouton ARRETER AdlibUnRegister("_GetData") ; on arrete le cycle de lecture Case $Button4 Local $sFileOpenDialog = FileOpenDialog("Choisir un fichier de données", @ScriptDir & "\data", "TXT (*.txt)", $FD_FILEMUSTEXIST) if $sFileOpenDialog <>"" then guictrlsetdata($input2,$sFileOpenDialog) EndIf EndSwitch WEnd Func _GetData() If $bDisconnect = True or $cycle < 1000 Then auth_livebox() ; connexion à la LiveBox EndIf $oldcycle = $cycle $cycle = GUICtrlRead($Input1) $cycle = $cycle * 60000 ; conversion en minutes If $cycle > 595000 Then $bDisconnect = True Else $bDisconnect = False EndIf ; Recuperation des donnees DSLStats $oHTTP.Open("POST", "http://" & $LIVEBOX & "/sysbus/NeMo/Intf/dsl0:getDSLStats", False) $oHTTP.SetRequestHeader("X-Context", $sContextID) $oHTTP.Send('{"parameters":{}}') $getDSLStats = $oHTTP.ResponseText ; Recuperation des donnees MIBs $oHTTP.Open("POST", "http://" & $LIVEBOX & "/sysbus/NeMo/Intf/data:getMIBs", False) $oHTTP.SetRequestHeader("X-Context", $sContextID) $oHTTP.Send('{"parameters":{"mibs":"dsl","flag":"","traverse":"down"}}') $getMIBs = $oHTTP.ResponseText $ErroredSecs = StringRegExp($getDSLStats, 'ErroredSecs":(.*),"SeverelyErroredSecs', 3) $SeverelyErroredSecs = StringRegExp($getDSLStats, 'SeverelyErroredSecs":(.*),"FECErrors', 3) $FECErrors = StringRegExp($getDSLStats, 'FECErrors":(.*),"ATUCFECErrors', 3) $ATUCFECErrors = StringRegExp($getDSLStats, 'ATUCFECErrors":(.*),"HECErrors', 3) $HECErrors = StringRegExp($getDSLStats, 'HECErrors":(.*),"ATUCHECErrors', 3) $ATUCHECErrors = StringRegExp($getDSLStats, 'ATUCHECErrors":(.*),"CRCErrors', 3) $CRCErrors = StringRegExp($getDSLStats, 'CRCErrors":(.*),"ATUCCRCErrors', 3) $ATUCCRCErrors = StringRegExp($getDSLStats, 'ATUCCRCErrors":(.*)}}', 3) $UpstreamNoiseMargin = StringRegExp($getMIBs, 'UpstreamNoiseMargin":(.*),"DownstreamNoiseMargin', 3) $DownstreamNoiseMargin = StringRegExp($getMIBs, 'DownstreamNoiseMargin":(.*),"UpstreamAttenuation', 3) $UpstreamAttenuation = StringRegExp($getMIBs, 'UpstreamAttenuation":(.*),"DownstreamAttenuation', 3) $DownstreamAttenuation = StringRegExp($getMIBs, 'DownstreamAttenuation":(.*),"UpstreamPower', 3) ; format date = 2015-08-22T18:29:44 $data = @YEAR & "-" & @MON & "-" & @MDAY & "T" & @HOUR & ":" & @MIN & ":" & @SEC & "," & _ $ErroredSecs[0] & "," & _ $SeverelyErroredSecs[0] & "," & _ $FECErrors[0] & "," & _ $ATUCFECErrors[0] & "," & _ $HECErrors[0] & "," & _ $ATUCHECErrors[0] & "," & _ $CRCErrors[0] & "," & _ $ATUCCRCErrors[0] & "," & _ $UpstreamNoiseMargin[0] & "," & _ $DownstreamNoiseMargin[0] & "," & _ $UpstreamAttenuation[0] & "," & _ $DownstreamAttenuation[0] $date = @YEAR & @MON & @MDAY $filename = $date & ".txt" $Filepath = fileopen(@SCRIPTDIR & "\data\" & $filename,9) FileWriteLine($Filepath,$data) Fileclose($Filepath) guictrlsetdata($input2, @ScriptDir & "\data\" & $filename) If $oldcycle <> $cycle Then AdlibRegister("_GetData",$cycle) ; execute la fonction _GetData toutes les x minutes EndIf If $bDisconnect = True Then _Logout() EndIf Endfunc ;==>_GetData Func _GetChart() $fichierdata = GUICtrlRead($input2) $choix = GUICtrlRead($Combo1) select Case $choix = "ErroredSecs" Local $c=2, $ytitle="&ytitle=Erreurs" Case $choix = "SeverelyErroredSecs" Local $c=3, $ytitle="&ytitle=Erreurs" Case $choix = "FECErrors" Local $c=4, $ytitle="&ytitle=Erreurs" Case $choix = "ATUCFECErrors" Local $c=5, $ytitle="&ytitle=Erreurs" Case $choix = "HECErrors" Local $c=6, $ytitle="&ytitle=Erreurs" Case $choix = "ATUCHECErrors" Local $c=7, $ytitle="&ytitle=Erreurs" Case $choix = "CRCErrors" Local $c=8, $ytitle="&ytitle=Erreurs" Case $choix = "ATUCCRCErrors" Local $c=9, $ytitle="&ytitle=Erreurs" Case $choix = "UpstreamNoiseMargin" Local $c=10, $ytitle="&ytitle=dB" Case $choix = "DownstreamNoiseMargin" Local $c=11, $ytitle="&ytitle=dB" Case $choix = "UpstreamAttenuation" Local $c=12, $ytitle="&ytitle=dB" Case $choix = "DownstreamAttenuation" Local $c=13, $ytitle="&ytitle=dB" EndSelect if $fichierdata = "" Then $filename = @SCRIPTDIR & "\data\" & @YEAR & @MON & @MDAY & ".txt" else $filename = $fichierdata EndIf $lines = _FileCountLines($filename) $Filepath = fileopen($filename,0) Local $x="", $y = "" For $i = 1 to $lines $line = FileReadLine($Filepath) $data = StringSplit($line,",") if $c>9 Then ; on affiche les dB correctement $data[$c] = $data[$c] / 10 EndIf if $i = $lines Then ; on ne met pas de "," après la dernière valeur $x = $x & '{"date":"' & $data[1] & '","visits":' & $data[$c] & '}' Else $x = $x & '{"date":"' & $data[1] & '","visits":' & $data[$c] & '},' Endif Next Fileclose($Filepath) ;récupération de la date du fichier...Bonjour l'usine a gaz ! $g = StringSplit($filename,"\") $h = ubound($g) - 1 $i = StringSplit($g[$h],".") $year = StringLeft($i[1],4) ; l'année c'est les 4 caractères de gauche du fichier txt $day = stringright($i[1],2) ; le jour: les 2 de droite $mon = StringMid($i[1],5,2) ; et le mois: les 2 caractères à partir du 5eme de la gauche... $template = fileopen(@SCRIPTDIR & "\" & "template.html",0) $html = fileread($template) $html = stringreplace($html,"XXXXXXXX",$x) $html = stringreplace($html,"TITRE",$choix & " - " & $day & "-" & $mon & "-" & $year) $graph = fileopen(@SCRIPTDIR & "\graph\" & $choix & ".html",10) FileWrite($graph, $html) fileclose($graph) fileclose($template) shellexecute(@ScriptDir & "\graph\" & $choix & ".html") EndFunc ;==>_GetChart Func _Logout() $oHTTP.Open("POST", "http://" & $LIVEBOX & "/logout", False) $oHTTP.Send() EndFunc ;==>_Logout Func auth_livebox() $str = "/authenticate?username=" & $USER & "&password=" & $PASSWORD $oHTTP.Open("POST", "http://" & $LIVEBOX & $str, False) $oHTTP.SetRequestHeader("Content-Type", "application/json") $oHTTP.Send() $oReceived = $oHTTP.ResponseText $sContextID = StringRegExp($oReceived, 'contextID":"([^"]+)"|()$', 1)[0] If $sContextID = "" Then MsgBox(48, "ERREUR", " Mot de passe incorrect : ") Return "NOLOGIN" EndIf EndFunc ;==>auth_livebox
J'ai également ajouté une lettre à l'indice de version (2.3f au lieu de 2.3), ça évitera peut-être de se mélanger les pinceaux dans les versions ...
Hors ligne
Bonsoir.
JoeKer a écrit:
Dans une phase ultérieure, il sera peut-être intéressant (voire utile) de faire cohabiter sur le même graphique deux ou plusieurs données ...
Ghizmo38 a écrit:
Bonjour,
Super boulot que tu fais là, shdf...
Des données qu'il serait aussi intéressant de monitorer, ce sont les débits atteignables, up et down.
J'ai commencé à regarder, sur la base de ta remarque (message #67), et des miennes (cf message #49) pour d'une part inclure les données de débit max (up et down), et surtout, pour afficher plusieurs courbes en même temps.
J'ai déjà une mouture qui sait afficher les débits par famille (Erreurs, Debit, Attenuation, Up, Down), mais ce qui serait intéressant, si on part sur des profils de données, serait d'afficher des données qui peuvent être liées dans un même profil.
Dans cette version, on peut changer la périodicité de "capture" des compteurs à la volée (modification prise en compte à la lecture suivante).
Il reste maintenant, a mon avis :
- Pourquoi pas, envisager de récupérer les compteurs à une fréquence plus haute que la minute (par exemple toutes les 5 secondes).
- A trouver les familles de compteurs à afficher simultanément.
- A adapter les échelles (par la gauche et par la droite, par exemple), pour visualiser correctement les variations.
Exemple : Si le compteur d'erreur(s) est à 4000, il ne fera qu'augmenter, pas la peine d'afficher ce qui est en-dessous, mais parallèlement, la marge au bruit peut augmenter ou diminuer (et la valeur va varier entre quelques dB et quelques dizaines de dB au maximum). Il faut donc que l'ensemble soit cohérent ...
Hors ligne
Bonsoir à tous,
Pour les compteurs d'erreurs, je trouve visuellement très bien le delta (l'augmentation du compteur) par échantillon (entre deux échantillons successifs) et par minute (voire par heure), par exemple CRC/échantillon (ou ES/échantillon ou par min ou par heure). Cela devrait limiter le max sur l'axe Y à ~1000 pour les CRC (voire moins, normalement je roule à 10-20 comme max), si Vous allez à une fréquence de l'ordre de 1 échantillon tous les 10 secondes. Pour les ES et SES ce sera moins. Penser aussi à une option pour changer le max sur l'axe Y si nécessaire.
En cas de forte perturbation qui fait chuter la synchro on peut avoir des centaines de CRC en 10 secondes.
Cela donnerait une séquence de pics au lieu d'une montée en "escalier". Plus facile à voir, à mon avis.
Penser aussi à une option pour changer le max Y et/ou passer l'axe Y en échelle Log10 si le max est si haut que l'on ne verrait plus les autre pics plus petits.
Bonne nuit.
Hors ligne
Bonjour,
@JoeKer
Il y a une erreur ligne 222 pour l'affichage des infos Down :
La bulle affiche UpstreamAttenuation au lieu de DownstreamNoiseMargin, la valeur est bonne
Local $refs = '"visits11":' & $data[11] & ',"visits13":' & $data[13] & ',"visits16":' & $data[15]/10; & ',"visits17":' & $data[17]/10
doit être
Local $refs = '"visits11":' & $data[11] & ',"visits13":' & $data[13] & ',"visits15":' & $data[15]/10; & ',"visits17":' & $data[17]/10
A+
Dernière modification par AlphaZoulou (28-09-2015 01:36:02)
Hors ligne
moi j'ai décroché... après avoir tenté un système de visualisation combiné des courbes, je laisse joeker mener la barque.
Hors ligne