Puissance moyenne et consommation d’énergie : notre protocole de mesures
Merci Python
Le 22 janvier 2021 à 09h20
12 min
Hardware
Hardware
Lorsque nous analysons des composants, nous prenons en compte l'effet qu'ils ont sur la consommation globale d'une machine. Pour cela nous utilisons depuis quelques mois une méthode spécifique, exploitant une prise connectée et un script Python maison.
Lorsque nous réfléchissions au contenu de notre second magazine en général, puis à son dossier domotique en particulier, nous avions imaginé le compléter par l'analyse de nombreuses prises connectées. Une série qui nous a demandé plusieurs semaines de recherche et de travail, dont nous avons commencé la publication.
Il nous a permis de prendre conscience de l'ampleur des disparités entre les différents produits disponibles sur le marché. L'intérêt des uns, l'inutilité des autres. Puis, il y avait une fonctionnalité qui revenait régulièrement : le relevé de la consommation électrique. Un sujet d'importance, dont nous vous avons aussi parlé en détail.
Il nous intéressait d'autant plus qu'il pouvait avoir une utilité pour nos propres tests en intégrant notre protocole afin de le renforcer. Comme beaucoup, nous nous sommes longtemps reposé sur des méthodes classiques comme les prises à écran intégré, qui ont de nombreuses limites. Nous n'avions ainsi pas de solution pour générer des graphiques, relever la consommation moyenne précise, l'énergie consommée même sur de courts tests, etc.
Il nous fallait donc trouver une prise connectée donnant accès à de telles données tout en nous permettant de les exploiter comme bon nous semble. Cela n'a pas été simple, mais nous avons fini par trouver notre bonheur.
Watts, Joules et compagnie
Commençons par quelques rappels et un peu de terminologie. La puissance dont on parle de manière courante est la puissance dite active et s'exprime en watts. C'est le produit d'une tension (Volt) et d'une intensité (Ampere) nécessaires à l'alimentation d'un appareil, mais aussi d'un déphasage (Cos Φ) dans le cas d'un système alternatif.
Avec un PC, cette puissance nécessaire à son fonctionnement varie sans cesse. On ne peut donc pas dire que telle ou telle machine nécessite 200 ou 300 watts et ce n'est pas une bonne valeur à relever lorsque l'on veut comparer l'efficacité énergétique de deux machines pour réaliser une tâche donnée (rendu 3D, compression, etc.). C'est tout le problème des prises à écran, qui l'affichent de manière « instantanée ».
Elles permettent néanmoins d'obtenir un autre résultat : la quantité d'énergie consommée sur une période donnée, bien plus intéressante lorsqu'il s'agit de faire des comparaisons. Car si l'on représente par une courbe l'évolution de la tension, du courant et de la puissance d'un système alternatif sinusoïdal (230 V à 50 Hz en France), relever la puissance revient à noter la valeur d'un point. L'énergie représente l'aire entre la courbe et l’axe des abscisses (voir ci-dessus).
Elle est le produit d'une puissance et d'un temps. Elle s'exprime en watt-heure (Wh) ou en Joules (J) lorsque l'unité de temps est la seconde. C'est ce que vous facture votre fournisseur d'électricité par tranches de 1 000 Wh.
Ainsi, une machine ayant consommé 3,5 kWh sur une période de 8 heures aura peut-être parfois nécessité 200 watts pour fonctionner, parfois 600 watts. Dans tous les cas, la puissance moyenne sur la période aura été de 437,5 watts. Ce sont ces valeurs que nous chercherons à relever et calculer, sur de courtes ou longues périodes.
Relever un point n'a aucun intérêt. Mais on peut calculer la consommation : environ 12 Wh en 1h30... et comparer
La prise connectée : une solution efficace et pratique
Dans l'idéal, il nous faudrait un équipement digne d'un laboratoire d'électronicien pour effectuer de tels relevés avec précision. Mais cela complexifierait alors grandement notre installation, son coût et son entretien.
Les prises à écran ne relevant la consommation d'énergie qu'avec une granularité d'1 Wh (3 600 J) sans nous fournir les résultats de manière exploitable (fichier CSV par exemple), nous avons cherché d'autres solutions. Nous nous sommes rapidement tournés vers les prises connectées afin de trouver un modèle convenant à nos besoins.
Dans un premier temps, nous avions monté une solution exploitant des prises Z-Wave/Zigbee avec un Raspberry Pi 3/4 où était installé Jeedom. Via les API de certains plugins nous pouvions effectuer des relevés de puissance puis déterminer la consommation d'énergie. Mais cette fois encore, ce n'était pas très pratique.
Car il fallait maintenir un système Jeedom à jour, avec la dépendance aux évolutions de l'OS et de ses plugins. Nous avons donc cherché des solutions sans box domotique pour simplifier encore le processus. C'est là que nous avons trouvé l'API officieuse de la prise HS110 de TP-Link et les modules communautaires pour de nombreux langages.
Notez que si vous préférez opter pour une solution similaire, mais avec une prise Wi-Fi disposant d'une API officielle, la marque Shelly propose de tels produits pour une 20/30 euros environ, comme ses Plug (S).
Détection et gestion de la prise via un module Python
Il existe des solutions clé en main construites autour des HS110 comme TPLink Energy Monitor basé sur Node.js. Mais il nous fallait quelque chose de plus « bas niveau ». Nous voulions en effet un outil sans interface graphique, nous permettant d'obtenir un relevé à l'écran et éventuellement un export au format CSV.
Nous nous sommes donc tournés vers la multitude de modules Python existant pour les produits TP-Link. Dans un premier temps nous avions utilisé pyHS100, qui est toujours parfaitement fonctionnel mais n'est plus maintenu. Un développeur a néanmoins repris la suite avec un fork, plus stable : python-kasa. Sa documentation est ici.
Il permet tant de configurer une nouvelle prise sans application, que d'utiliser celles déjà configurées. On note d'ailleurs que ses possibilités sont plus complètes que l'application officielle de TP-Link.
Pour l'utiliser, il faut disposer d'une machine avec Python 3.7 + et le gestionnaire de paquet PiPy (qui l'accompagne par défaut). Pour rappel, Python peut désormais officiellement être installé sous Windows 10 via le Microsoft Store en complément de la méthode à l'ancienne). Sinon, vous pouvez toujours passer par le sous-système Linux.
Dans ce dernier cas, l'installation nécessite de taper la commande suivante :
sudo apt update && sudo apt install python3 python3-pip
Il faut ensuite installer le module python-kasa sur le système :
pip install python-kasa --pre
Ou si votre système distingue Python 2.x et 3.x :
pip3 install python-kasa --pre
Le flag --pre
est ici nécessaire car l'outil est encore en développement. Les seules versions disponibles sont pour le moment toutes des pre-release, nécessitant cet élément pour être prises en compte par l'installeur.
Une fois l'installation terminée, vous aurez certainement une alerte vous indiquant que le dossier où sont installés les modules ne sont pas dans la variable d'environnement $PATH
. Il faut l'y ajouter afin de pouvoir les lancer directement, si vous voulez utiliser le module sous forme de script uniquement, vous pouvez passer cette étape.
Pour vérifier que tout fonctionne, lancez une découverte des prises connectées au réseau local :
kasa discover
Dans notre cas, on obtient bien un résultat pour notre prise nommée « Benchs » :
== Benchs - HS110(FR)==
Host: 192.168.1.34
Device state: ON
== Generic information ==
Time: 2021-01-15 13:37:42
Hardware: 2.0
Software: 1.5.5 Build 191125 Rel.114303
MAC (rssi): ###
Location: ###
== Device specific information ==
LED state: True
On since: 2021-01-01 13:37:42.421337
== Current State ==
{'voltage_mv': 236010, 'current_ma': 12, 'power_mw': 0, 'total_wh': 1, 'err_code': 0}
Si vous voulez obtenir uniquement les informations de consommation de la prise :
kasa --host 192.168.1.34 --plug emeter
Qui donne le résultat suivant :
== Emeter ==
Current: 0.012 A
Voltage: 232.062 V
Power: 0.0 W
Total consumption: 0.001 kWh
Today: 0.0 kWh
This month: 0.0 kWh
Bien entendu, il faut lancer le script sur une machine présente sur le même réseau local que les prises HS110. Comme vous pouvez le constater, elles ne nécessitent aucune authentification particulière, connaître leur adresse IP suffit à les interroger pour obtenir des informations et faire changer leur état.
Pratique, mais dangereux sur un réseau trop ouvert à des tiers.
Un premier script de relevé en continu
Passons maintenant à la création de notre script, dans un fichier nommé energy.py. Nous allons y intégrer le module python-kasa et l'utiliser pour afficher la puissance fournie en continu. Ici, nous cherchons surtout à nous familiariser avec le module, ses concepts de base et ses possibilités :
import asyncio
from kasa import SmartPlug
from time import sleep
P = SmartPlug("192.168.1.34")
async def check():
while True:
await P.update()
watts = await P.current_consumption()
print(f"Puissance : {watts:.2f} W")
sleep(1)
asyncio.run(check())
Pour lancer le script, tapez :
python energy.py
Ou si votre système distingue Python 2.x et 3.x :
python3 energy.py
Cet exemple, basé sur la documentation, commence par une spécificité de python-kasa par rapport à pyHS100, il ne fonctionne pas toujours de manière synchrone, nécessitant asyncio et la syntaxe de type async/await (que nous ne détaillerons pas ici). Sachez seulement que cela permet de lancer une tâche en parallèle du reste du code puis ensuite de préciser lorsqu'il faut attendre qu'elle soit complétée pour passer à la suite.
Nous importons ensuite les différents modules nécessaires : celui de gestion des prises, puis sleep
qui nous permettra de marquer une pause, d'un temps indiqué en secondes. On désigne la prise qui recevra les requêtes par son adresse IP, nommée P (en majuscule, une convention indiquant que cette valeur ne changera pas).
On définit alors une fonction asynchrone nommée check()
, comportant une boucle infinie. Dans celle-ci, on lit les informations depuis la prise avec P.update()
puis on attribue la valeur de la puissance consommée à la variable watts
. Dans les deux cas, on attend d'obtenir le résultat avant de passer à la suite en ajoutant le mot clé await
.
On affiche ensuite la valeur de puissance sous la forme d'un nombre flottant avec deux chiffres après la virgule (:.2f
). Pour une meilleure lisibilité, on utilise les chaînes de caractères formatées litérales. Cela permet, en ajoutant un « f » avant une chaîne de caractères, d'y introduire des variables en indiquant leur nom/format entre accolades.
On termine par une pause d'une seconde. Plus ce temps sera court, plus vous aurez de relevés et donc un résultat précis. Mais attention : le résultat est obtenu de la prise en quelques centaines de millisecondes en général. Il est donc déconseillé de passer sous une valeur de 0.5, et d'augmenter ce chiffre si les résultats se répètent trop.
Pour interrompre la boucle, pressez sur les touches CTRL+C.
On calcule l'énergie consommée et la dépense que cela engendre
Corsons maintenant un peu le jeu, en ajoutant quelques relevés et calculs avec le script suivant :
import asyncio
from kasa import SmartPlug
from time import time, sleep
# On déclare l'IP de la prise
P = SmartPlug("192.168.1.34")
async def check():
# On initialise les variables qui seront utilisées
count = total = 0
price_1 kWh = 15.58
time_start = time()
while True:
# On lit les données de la prise et on récupère la consommation actuelle
await P.update()
watts = await P.current_consumption()
# On met à jour les différentes variables
count += 1
total += watts
# On effectue les calculs des valeurs à afficher
average = total/count
elapsed = time()- time_start
energy_J = average * elapsed
energy_Wh = energy_J / 3600
price_total = energy_Wh / 1000 * price_1 kWh
# On affiche le résultat et on attend 1 seconde avant de recommencer
print(f"{count}. "
f"Relevé : {watts:.2f} W -"
f"Moyenne : {average:.2f} W -"
f"Temps : {elapsed:.2f} s -"
f"Energie : {energy_J:.2f} J ou {energy_Wh:.2f} Wh -"
f"Coût : {price_total:.10f} cts€")
sleep(1)
asyncio.run(check())
Nous l'avons directement commenté pour en simplifier la lisibilité pour les débutants. On retrouve l'import des différents modules en début de fichier, avec un ajout : time
qui nous permet de relever l'heure courante pour définir le temps écoulé, ce qui sera nécessaire pour le calcul de l'énergie consommée.
Dans la fonction check()
, avant e lancer la boucle infinie, on initialise d'ailleurs les différentes variables qui seront utilisées : count
pour le nombre de relevés, total
pour le cumul des valeurs relevées, price_1 kWh
pour le prix du kWh selon les tarifs bleus d'EDF (6 kVA dans notre exemple) et time_start
pour l'heure de lancement du script.
Dans la boucle, une fois les valeurs récupérées depuis la prise, on ajoute le résultat à count et total. On calcule ensuite la puissance moyenne, le temps écoulé puis l'énergie consommée. Celle-ci est simplement le produit des deux précédentes valeurs. On obtient alors un résultat en joules (ou watt-seconde). On le divise par 3 600 pour obtenir des Wh. Ce dernier résultat est lui-même divisé par 1 000 pour obtenir le nombre de kWh consommés puis multiplié par le prix d'1 kWh. On peut alors connaître le coût d'une tâche réalisée sur une période donnée.
Toutes les valeurs utiles sont ensuite affichées. Ici, nous avons opté pour une chaîne de caractères construite sur plusieurs lignes, là encore pour simplifier la lecture du code et faciliter les modifications. On pourrait ensuite ajouter de quoi écrire les résultats dans un fichier csv ou optimiser le lancement du script en permettant à l'utilisateur de définir certains éléments par des arguments/flags via le module argparse par exemple. Libre à vous !
Puissance moyenne et consommation d’énergie : notre protocole de mesures
-
Watts, Joules et compagnie
-
La prise connectée : une solution efficace et pratique
-
Détection et gestion de la prise via un module Python
-
Un premier script de relevé en continu
-
On calcule l'énergie consommée et la dépense que cela engendre
Commentaires (21)
Vous devez être abonné pour pouvoir commenter.
Déjà abonné ? Se connecter
Abonnez-vousLe 22/01/2021 à 10h05
Vous ne manquez pas d’air pour mesurer l’aire d’une courbe
(C’est signalé)
Sinon, article intéressant.
De la domotique pour étudier la domotique, inception…
(Et je crois que la double affectation (i=j=0) n’est pas recommandée en python (ça pose des problèmes avec les mutables).)
Le 22/01/2021 à 13h57
Même constat ici, il est finalement plus simple de s’en tenir à des bons vieux scripts/modules dédiés plutôt que passer par une machine à gaz difficile à maintenir.
Sympa ces p’tits articles techniques, merci.
Le 22/01/2021 à 18h45
Petite question, j’ai utilisé ces bestioles au boulot il y a quelques années:
https://www.fluke.com/fr-fr/produit/test-electrique/qualite-du-reseau-electrique/434-435
Ce ne serait pas plus simple et précis ? Ca permettrai en plus de voir les perturbations engendrées sur le réseau électrique, ce qui peut être intéressant pour comparer des alims par exemple.
Par contre c’est pas donné, mais en location ça devrait se trouver…
Le 22/01/2021 à 19h20
Comme dit dans l’article, on peut s’équiper avec du Fluke et autres appareils du genre. On sera loin des 30 euros ;) Et sans avoir tous les avantages de maitriser ce que l’on mesure/calcule exactement.
Le 22/01/2021 à 19h59
Chouette article, mais ce serait encore mieux avec de la coloration syntaxique pour le code :p
À moins que ça ne soit pas sur tous les thèmes ?
Le 23/01/2021 à 10h10
C’est juste, mais justement ici il s’agit d’int donc aucun problème pour une double affectation.
Mais effectivement avec un mutable, une liste par exemple, les deux variables sont initialisées avec le même objet, donc quand l’on modifie l’un on modifie l’autre.
Bon pas réussi à formatter le code sur plusieurs lignes..
Le 23/01/2021 à 17h49
Oui, il faut aussi pouvoir interpréter correctement les résultats.
Par contre, quand EDF va facturer le réactif càd la puissance en VA et non pas en Watts il sera intéressant d’utiliser ce type de matériel, il se pourrait qu’il y ait de belles surprises 😁
Le 24/01/2021 à 16h33
La puissance en VA ? Peux tu détailler ?
Merci.
Le 25/01/2021 à 11h55
De ce que j’ai compris (à corriger si d’autre me lise):
En alternatif, les bobines des appareils électronique génèrent un déphasage entre l’appel et de courant et le moment où le courant est là, appelé “cos fi” (désolé, j’ai pas le symbole fi sur mon clavier). Lors de de déphasage, l’objet va tirer très fort et donc surconsommer.
En gros:
En courant continue (DC): Puissance en (W)att = (V)olt x (A)mpere
En courant alternatif (AC): Puissance en (W)att = (V)olt x (A)mpere x cos fi
La conso en W (Watt), qui est la conso facturée par ton fournisseur d’électricité ne prend pas en compte le cos fi, et donc c’est du cadeau pour toi. Maintenant les Linky relèvent à la fois la consomation en W et en VA (Volt-Ampere), c’est donc qu’une question de temps avant qu’on passe à la conso réelle.
Maintenant, je me pose une question. Est-ce qu’il est possible de diminuer le cos fi? En concevant les équipements différement? Composant de meilleur qualité? Est-ce qu’avoir un réseau genre 12-48V en courant continue à la maison avec un transfo de qualité réduirait ce cos fi?
Le 25/01/2021 à 12h50
Oui, ça s’appelle le PFC power factor compensation et ça sert justement à rapprocher le cos phi de 1.
C’est obligatoire sur les blocs d’alimentation des PC depuis des années maintenant
Le 25/01/2021 à 12h55
Au contraire on veut avoir un cosPhi le plus élevé possible pour éviter de surconsommer et avoir un meilleur rendement. Si ton équipement a un mauvais cosphi ta puissance apparente (VA), celle facturée par EDF, va augmenter et donc tu vas payer plus cher. “Il suffit” de rajouter des condensateurs ou des bobines (selon les sens du déphasage à corriger) pour diminuer le déphasage.
Le 25/01/2021 à 12h57
il me semble qu’au contraire, le cos fi (j’aurai pensé “phy” mais bon) donne “l’impression” qu’on consomme plus, alors que c’est “moins” en réalité (les VA sont la puissance dite “apparente”, donc j’en déduit que les W restent la conso “réelle), du moins c’est que j’en comprend
par contre en instantané ça provoque des pointes qui peuvent dépasser le contrat (on peut bouffer 6kw en continu avec des grille pains et être dans les clous, mais avec 5kw de transfos on se retrouve avec une puissance apparente de 7kVA et pouf ça disjoncte par exemple)
sur les alim de PC on voit régulièrement “correcteur de facteur de puissance”, je sais pas comment ce composant (ou ensemble de composant) fonctionne, mais visiblement on sait corriger le déphasage, mais si c’est pas obligatoire (j’imagine que c’est pas obligatoire du coup, ça serait pas un argument de vente qu’il y en ait un) on se retrouve avec des équipements qui perturbent le réseau et ça aboutit à la situation actuelle
erf largement grillé
Le 25/01/2021 à 13h14
A priori pour les gros consommateurs industriels au tarif vert, la puissance réactive (induite par un cosPhi peu élevé) est facturée si elle représente plus de 40% de la puissance active (utile). Si ils sont en dessous des 40% je crois qu’ils ne payent pas plus…
Le 25/01/2021 à 13h26
Perdu, c’est phi ou φ
Et sinon, oui, la vraie puissance consommée c’est la la puissance active (en W), la puissance apparente (en VA) la surestime.
Le problème du déphasage, c’est que ça génère un retour de puissance dans le réseau et ça créé des perturbations…
Facturer cette puissance « virtuelle » supplémentaire, c’est un moyen d’inciter à améliorer le cosφ et donc la qualité de la distribution électrique.
En effet, pendant les heures pleines des mois d’hiver.
Le 25/01/2021 à 16h44
merci pour la correction et les explications :)
Le 25/01/2021 à 20h23
Bravo pour les explications, je n’aurais pas fait mieux
Comme dit plus haut, les industriels sont sanctionnés par EDF si leur cos phi passe en dessous de 0.8 si mes souvenirs sont bon.
La solution la moins chère utilisée par les industriels consiste à ajouter des batteries de condensateurs, mais cette technique n’est pas sans faille car l’électronique de puissance présente sur les sites industriels génère des harmoniques, ce qui engendre des échauffements et usure prématurée…
Il faut garder à l’esprit que tous les équipements modernes génèrent de la puissance réactive, ce qui dégrade le cos phi. La seule chose qui présente un cos phi neutre dans nos habitations est le chauffage électrique.
Tout ça pour dire qu’on a pas mal dévié du sujet, mais j’aurais bien aimé avoir une idée du réactif engendré par un PC moderne.
Je pense qu’avec la généralisation du linky EDF risque de nous facturer le réactif, ce qui risque de faire au doigt mouillé +10% sur la facturation.
J’ajoute une représentation vectorielle bien connue pour représenter les relations entre les différentes puissances ou Q est en VAR, S en VA et P en Watts:
https://2.bp.blogspot.com/-wWV1ucqtVt0/XLYXC5NC7QI/AAAAAAAACEc/OE3IbWd5bhs1ylXBzfL7ReQIdV0FIStVgCLcBGAs/s1600/triangle_puissance.jpg
Le 25/01/2021 à 20h29
Le PFC est obligatoire depuis bien 15 ans me semble.
Cet article paru dans je ne sais quel revue en ligne est un des plus complets et meilleurs que j’ai trouvé, je vous invite à le lire (il manque les images car il a été repris, peut-être via webarchive) :
Partie 1⁄2 : https://www.tomshardware.fr/fonctionnement-dune-alimentation-1ere-partie-2/
Partie 2⁄2 avec l’explication du PFC : https://www.tomshardware.fr/fonctionnement-dune-alimentation-2eme-partie-2/
Le 26/01/2021 à 07h21
je suis pas convaincu de la facturation “brute” du réactif, par contre actuellement certains se retrouvent à devoir passer au contrat au-dessus car ça disjoncte avec le linky (qui compte le max en VA) alors qu’avant les disjoncteur électromécanique 1) était peut-être pas aussi précis donc calibré un peu plus haut, 2) n’était visiblement pas sensible à la puissance réactive
j’avais probablement lu ça a l’époque, mais oublié depuis, je vais relire ça :)
erf extrait rapide :
“Depuis 2001, les standards européens et japonais notamment (IEC1000-3-2) imposent que tous les nouveaux appareils consommant plus de 75 W doivent comporter une correction du facteur de puissance pour respecter l’environnement.”
ça a peut-être évolué depuis, mais donc y’a peu de chance d’avoir un PFC sur les transfo de (téléphone) portables (à part sur les “charges rapide 100w” qui arrivent), les transfos des box ou des disques durs externes
y’a que les alim pc qui vont vraiment avoir un PFC (et les gros électroménagers) :s
Le 26/01/2021 à 08h41
Je ne vois pas trop en quoi Linky changerai quelque chose là dedans, il n’y a rien qui va dans le sens de la facturation de la consommation en kVA, ni aucune raison particulière de le faire (si EDF veut augmenter ses facturations de xx % ils savent le faire sans ça). Le niveau de puissance du contrat est par contre exprimé en kVA.
Il y a toujours eu une facturation du réactif dans les contrats pro selon le niveau de déphasage de mémoire, pour éviter que certains ne s’en préoccupent pas. Dans le grand public, c’est effectivement “by design” dans pas mal de produits (même si on pourrait améliorer).
Pour le disjonctage de Linky, c’est effectivement surtout parce que les anciens compteurs étaient parfois mal calibrés, certains en profitant pour rester sur un niveau de contrat inférieur à leur consommation réelle. En général, ça grogne au redressement, mais sur le fond, pas mal ont déjà de la chance que les fournisseurs d’électricité ne viennent pas demander un rattrapage sur xx années
Le 27/01/2021 à 10h21
Tu voulais dire, si on veut imposer à EDF d’augmenter ses tarifs, on sait faire sans ça.
Le 27/01/2021 à 20h52
Je ne vois pas pourquoi Enedis s’amuserait à implémenter une fonction qui permet de mesurer le réactif pour le plaisir. C’est mon sentiment perso, mais bon comme on dit : “qui vivra verra” ;-)