[R] Coupure PC suite à inactivité de débit via FreeMeter

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
cortx
Niveau 5
Niveau 5
Messages : 115
Enregistré le : dim. 04 mai 2008 16:10
Status : Hors ligne

[R] Coupure PC suite à inactivité de débit via FreeMeter

#1

Message par cortx »

Après résolution, changement du titre de "PixelSearch spécifique à une fenetre" à "Coupure PC suite à inactivité de débit via FreeMeter"

Bonjour;

J'ai une connexion pourrie à la maison et comme je joue beaucoup, je laisse souvent mon PC allumé la nuit pour que les mises à jours se fassent afin de ne pas avoir à les faire quand j'en ai besoin.
Je dispose déjà d'un petit logiciel qui s’appelle FreeMeter et qui m'affiche un graphe en temps réel de ma bande passante et je souhaite donc m'appuyer dessus pour savoir dans quel état est mon téléchargement, couleur verte sur le logiciel)

Je souhaite mettre en place une détection de couleur afin de savoir dans quel état est ma bande passante avant d'effectuer une coupure de mon ordinateur, en effet si il n'y a pas de mise à jours, aucun intérêt à ce que mon PC reste allumé toute la nuit.

Sachant que cette fenêtre n'ai jamais précisément au même endroit tout le temps sur mon second écran, j'aimerai savoir comment je peux dire à Autoit de prendre les coordonnées spécifiques à cette fenêtre. D'habitude pour un balayage avec détection de couleur, j'utilise les coordonnées de l'écran et non pas de la fenêtre à analyser précisément mais pour le coup ça ne va pas m'aider.

Je n'ai pas l'impression que ce soit possible lorsque l'on regarde les arguments de la fonction PixelSearch mais dans le doute je préfère demander.
Peut être avez vous une astuce.

***************************************

J'ai également besoin de votre aide pour une seconde phase. La détection d'un pixel pur et simple ne peux pas suffire car un pic de bande passante est toujours possible pour une raison inconnue. Pour faire cela bien j'ai besoin non pas de détecter un seul pixel mais une suite de pixel. Dans l'idée si je pouvais détecter une bande de verte de 50*50 ça serrait l'idéal.
Ça serait suffisamment significatif en hauteur pour indiquer qu'il y a beaucoup de débit et en longueur pour indiquer que ça dure sur le temps.

A votre avis comment je peux faire pour tester toute une portion de zone après une détection d'un pixel ?
Je pense à détecter x+1, x+2 jusqu'a 50 et idem pour Y mais ca ferai une boucle énorme de 2500 possibilités, certes je ne suis pas obligés de toutes les tester car si c'est à 49 ca veux dire que c'est aussi à 40 et 30 etc.
Avec vous dans vos cartons quelque chose pour simplifier la chose ?
PixelChecksum semble pas mal, mais je ne sais pas l'utiliser. De plus comme le fond de la fenêtre est noire si pas de débit et verte si débit, est ce que le checksum ne sera pas le même quelque soit la couleur ?

Voici les propriétés de la fenêtre et un aperçu de ce que donne la fenêtre. Lorsqu'il y a du vert c'est qu'il y a eu un téléchargement de donnée.
Le plafond de ma bande passante, se trouve en haut de la fenêtre.

Img01.png
Et voici la même fenêtre lors d'un gros téléchargement à pleine bande passante.

Img02.png
Img02.png (1.66 Kio) Vu 1612 fois
Merci d'avance pour les conseils que vous pourriez me fournir.


*****

Voici les tests que j'ai fait avec CheckSum, j'ai repris le script de base de la fonction pour l'adapter à la détection dans ma fenêtre.
Pour cela j'ai rajouter le WinGetHandle mais ça ne semble pas marcher. Il me fait une détection sur l'écran et non pas sur la fenêtre indiqué.
Le script se déclenche lorsque je passe une fenêtre sur mon écran de gauche, alors que la fenêtre de Freemeter est sur mon écran de droite.
; Obtient une somme de contrôle initiale
$hWnd = WinGetHandle("[CLASS:WindowsForms10.Window.8.app.0.33c0d9d]")
Local $iCheckSum = PixelChecksum(380, 7, 409, 18, 1, $hWnd)

; Attend que la région change, la région est contrôlée toutes les 100 ms pour réduire la charge du CPU
$i = 0
While $iCheckSum = PixelChecksum(380, 7, 409, 18, 1, $hWnd)
    Sleep(100)
$i = $i + 1
   ToolTip("Test n°: " & $i & " - ChkSum: " & $iCheckSum, 100, 100, "", 0, 2)
WEnd

MsgBox($MB_SYSTEMMODAL, "", "Quelque chose a changé dans la région!")
Modifié en dernier par cortx le lun. 25 sept. 2017 13:47, modifié 2 fois.
Avatar du membre
TomAijerrie
Niveau 5
Niveau 5
Messages : 192
Enregistré le : lun. 02 juin 2014 09:55
Localisation : Lyon
Status : Hors ligne

Re: [..] PixelSearch spécifique à une fenetre

#2

Message par TomAijerrie »

Je te propose de lire la valeur des textes sous le graphique (9,7 kB/s et 2,9 kB/s), comme ça tu n'as pas besoin de chercher les coordonnées et les valeurs.
Ensuite, tu peux vérifier si plusieurs mesures de suites sont pus grande qu'une certaine valeur.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] PixelSearch spécifique à une fenetre

#3

Message par mikell »

Je n'ai pas l'impression que ce soit possible lorsque l'on regarde les arguments de la fonction PixelSearch
...
j'ai rajouter le WinGetHandle mais ça ne semble pas marcher
Il faut utiliser en plus l'option Opt("PixelCoordMode", 2)
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
cortx
Niveau 5
Niveau 5
Messages : 115
Enregistré le : dim. 04 mai 2008 16:10
Status : Hors ligne

Re: [..] PixelSearch spécifique à une fenetre

#4

Message par cortx »

TomAijerrie a écrit : mer. 20 sept. 2017 12:22 Je te propose de lire la valeur des textes sous le graphique (9,7 kB/s et 2,9 kB/s), comme ça tu n'as pas besoin de chercher les coordonnées et les valeurs.
Ensuite, tu peux vérifier si plusieurs mesures de suites sont pus grande qu'une certaine valeur.
Bonjour;
C'est carrément une bonne idée, tu peux me confirmer que c'est bien avec WinGetText() et du String* que je dois travailler ?

@mikell
Merci pour le tuyau, je n'avais pas vu ça.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] PixelSearch spécifique à une fenetre

#5

Message par orax »

L'inconvénient est de devoir utiliser un logiciel externe, ça pourrait être un problème pour certains. On peut aussi récupérer ces informations avec le WMI.

Code : Tout sélectionner

$wbemFlagReturnImmediately = 0x10
$wbemFlagForwardOnly = 0x20
$objWMIService = ObjGet("winmgmts:\\.\root\CIMV2")

$strQuery = "SELECT name,BytesReceivedPersec FROM Win32_PerfFormattedData_Tcpip_NetworkInterface"
; s'il y a plusieurs cartes, on peut filtrer la requête avec "WHERE"
; par exemple, si le nom de la carte à surveiller est "Broadcom NetLink Gigabit Ethernet", alors il faudra faire :
;    $strQuery = "SELECT BytesReceivedPersec FROM Win32_PerfFormattedData_Tcpip_NetworkInterface WHERE name = 'Broadcom NetLink Gigabit Ethernet'"
; le nom des cartes est retourné par $objItem.Name

$colItems = $objWMIService.ExecQuery($strQuery, "WQL", $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

For $objItem In $colItems
	ConsoleWrite($objItem.Name & @CRLF)
	ConsoleWrite($objItem.BytesReceivedPersec & @CRLF)
Next
Voir aussi typeperf (en ligne de commande) : https://technet.microsoft.com/en-us/lib ... 90960.aspx et https://jpsoft.com/forums/threads/perfo ... data.5835/
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
cortx
Niveau 5
Niveau 5
Messages : 115
Enregistré le : dim. 04 mai 2008 16:10
Status : Hors ligne

Re: [..] PixelSearch spécifique à une fenetre

#6

Message par cortx »

Bonjour;

Voici ce à quoi je suis arrivé aujourd'hui, ça semble fonctionné en test je verrai ce soir.
Si j'ai un débit exprimé en B/s ou alors un débit exprimé en kB/s mais inférieur à 50 alors je coupe le PC.
Je met également un pause de 5 minutes entre deux tests afin d'etre sur qu'il ne s'agit pas juste d'une simple chute de débit.

J'ai eu un problème sur le StringSplit et le traitement du tableau par la suite car le dernier élément du tableau, au lieu de ne contenir que l'élément kbs/s ou b/s contenait aussi des retours à la ligne ou je ne sais quoi qui me parasitait.
Cela m'a pris un peu de temps et m'a obligé à faire des StringLeft pour ne garder que les unités de débits car sans cela, mes vérifications d'égalités ne fonctionnaient pas.
Voici trois images pour vous faire voir ce dont je parle.

Version intégrale des données:
Img1.png
Img1.png (8.65 Kio) Vu 1611 fois
Version OK en milieu de tableau:
Img2.png
Img2.png (7.62 Kio) Vu 1611 fois
Version NOK à la fin du tableau:
Img3.png
Img3.png (8.64 Kio) Vu 1611 fois
Demain je m'attaque à une petite option en plus, c'est récupéré l'heure de la machine pour dire au script de se couper à partir d'une certaine heure ou je suis sur d'être devant mon PC afin que le script ne soit pas oublié et me coupe durant une utilisation classique de mon PC.
#include <MsgBoxConstants.au3>

While 1

$unitebs = 0

detect_debit()

If $unitebs = "B/s" Then
   ToolTip( "Débit de : " & $debit["4"] & $unitebs & " - En attente d'un nouveau test.",0,0)
   sleep (300000) ; Attente de 5 minutes
   detect_debit()
   If $unitebs = "B/s" Then
     Shutdown(28)
   EndIf
EndIf

If $debit["4"] < 50 And $unitekbs = "kB/s" Then
   ToolTip( "Débit de : " & $debit["4"] & $unitekbs & " - En attente d'un nouveau test.",0,0)
   sleep (300000) ; Attente de 5 minutes
   detect_debit()
   If $debit["4"] < 50 And $unitekbs = "kB/s" Then
     Shutdown(28)
   EndIf
EndIf

ToolTip( "",0,0)

WEnd

Func detect_debit()
$conf_fenetre_FreeMeter = "[TITLE:FreeMeter]"
$existance_FreeMeter = WinExists($conf_fenetre_FreeMeter)
if $existance_FreeMeter = 1 Then
   Local $donnees_FreeMeter = WinGetText($conf_fenetre_FreeMeter) ; Récupére le texte de la fenêtre de la fenêtre active.
EndIf

Global $debit= StringSplit($donnees_FreeMeter, " ") ;Diviser la chaîne de valeur en utilisant le délimiteur " " et la valeur de flag par défaut.
Global $unitebs = StringLeft($debit["5"], 3) ; Récupére 3 caractères à gauche de la chaîne.
Global $unitekbs = StringLeft($debit["5"], 4) ; Récupére 4 caractères à gauche de la chaîne.

EndFunc

*********************************

Voila, script terminé, je le met à disposition de ceux qui pourrait passer par là.
J'ai rajouté l'heure de détection d'alerte ainsi que la consignation dans un fichier texte pour le suivi.
#include <MsgBoxConstants.au3>
#include <FileConstants.au3>
#include <Date.au3>

While 1

$unitebs = 0
detect_debit()

If $unitebs = "B/s" Then
   ToolTip( "Débit de : " & $debit["4"] & $unitebs & " - En attente d'un nouveau test.",0,0)
   Ecriture_Attente_avant_arret_bs()
   sleep (300000) ; Attente de 5 minutes
   detect_debit()
   If $unitebs = "B/s" Then
     Ecriture_arret_bs()
     Shutdown(28)
     Exit
   EndIf
EndIf

If $debit["4"] < 50 And $unitekbs = "kB/s" Then
   ToolTip( "Débit de : " & $debit["4"] & $unitekbs & " - En attente d'un nouveau test.",0,0)
   Ecriture_Attente_avant_arret_kbs()
   sleep (300000) ; Attente de 5 minutes
   detect_debit()
   If $debit["4"] < 50 And $unitekbs = "kB/s" Then
     Ecriture_arret_kbs()
     Shutdown(28)
     Exit
   EndIf
EndIf

ToolTip( "",0,0)

Ecriture_Attente_nouveau_test()
sleep (300000) ;attente 5 minutes

WEnd

Func detect_debit()
$conf_fenetre_FreeMeter = "[TITLE:FreeMeter]"
$existance_FreeMeter = WinExists($conf_fenetre_FreeMeter)
if $existance_FreeMeter = 1 Then
   Local $donnees_FreeMeter = WinGetText($conf_fenetre_FreeMeter) ; Récupére le texte de la fenêtre de la fenêtre active.
EndIf

Global $debit= StringSplit($donnees_FreeMeter, " ") ;Diviser la chaîne de valeur en utilisant le délimiteur " " et la valeur de flag par défaut.
Global $unitebs = StringLeft($debit["5"], 3) ; Récupére 3 caractères à gauche de la chaîne.
Global $unitekbs = StringLeft($debit["5"], 4) ; Récupére 4 caractères à gauche de la chaîne.

EndFunc

Func Ecriture_arret_bs()
   Global $date = _Now()
   Global $hFileOpen = FileOpen("D:\Mes installs\Restauration\Script Auto IT\OS\liste.txt", $FO_APPEND)
   FileWrite($hFileOpen, $date & " - Débit de : " & $debit["4"] & $unitebs & " - Arret machine" & @CRLF)
   FileClose($hFileOpen)
EndFunc

Func Ecriture_arret_kbs()
   Global $date = _Now()
   Global $hFileOpen = FileOpen("D:\Mes installs\Restauration\Script Auto IT\OS\liste.txt", $FO_APPEND)
   FileWrite($hFileOpen, $date & " - Débit de : " & $debit["4"] & $unitekbs & " - Arret machine" & @CRLF)
   FileClose($hFileOpen)
EndFunc

Func Ecriture_Attente_avant_arret_bs()
   Global $date = _Now()
   Global $hFileOpen = FileOpen("D:\Mes installs\Restauration\Script Auto IT\OS\liste.txt", $FO_APPEND)
   FileWrite($hFileOpen, $date & " - Débit de : " & $debit["4"] & $unitebs & " - Mise en attente d'un nouveau test" & @CRLF)
   FileClose($hFileOpen)
EndFunc

Func Ecriture_Attente_avant_arret_kbs()
   Global $date = _Now()
   Global $hFileOpen = FileOpen("D:\Mes installs\Restauration\Script Auto IT\OS\liste.txt", $FO_APPEND)
   FileWrite($hFileOpen, $date & " - Débit de : " & $debit["4"] & $unitekbs & " - Mise en attente d'un nouveau test" & @CRLF)
   FileClose($hFileOpen)
EndFunc

Func Ecriture_Attente_nouveau_test()
   Global $date = _Now()
   Global $hFileOpen = FileOpen("D:\Mes installs\Restauration\Script Auto IT\OS\liste.txt", $FO_APPEND)
   FileWrite($hFileOpen, $date & " - Débit trop important pour arret : " & $debit["4"] & $unitekbs & " - Mise en attente d'un nouveau test" & @CRLF) ; si débit important alors pas en B/s
   FileClose($hFileOpen)
EndFunc
Répondre