Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/01/2013, à 01:09

DonutMan75

[Tuto] Recuperer la puissance consommée par le matos informatique

Bonsoir à tous,

voilà j'ai depuis quelques temps un onduleur sur lequel est branché tout mon matériel informatique, à savoir :

  • mes pcs

  • un NAS

  • ma box internet

  • imprimante, HP, etc...

L'onduleur disposant d'une sortie USB, je l'ai connecté sur mon Ubuntu pour jouer un peu avec. J'ai eu des résultats assez sympa, donc je me suis dit que j'allais partager ça avec vous wink

C'est mon premier post de cette catégorie, alors n'hésitez pas si vous avez des suggestions, questions, remarques etc... tongue


I - Objectif

- Recuperer les données de l'onduleur relatives à la consommation électrique
- Voir l'évolution de la puissance consommée en fonction du temps
- Mesurer la consommation des équipements de base (box, NAS)
- Estimer l'impact sur la facture EDF


II - Matériel

- un PC sous Ubuntu
- un onduleur APC BACK UPS Pro USB


III - Logiciel

J'utilise ici les logiciels suivant (on les supposera déjà installés) :
   - NUT (Network UPS Tools) pour dialoguer avec l'onduleur
   - Cron pour récuperer régulièrement les valeurs de puissance
   - Octave pour le tracé des courbes

IV - Liens

Ce "tutorial" (le mot est ambitieux ^^) est un exemple d'application basé sur les deux pages suivantes :
http://doc.ubuntu-fr.org/nut
http://ovanhoof.developpez.com/upsusb/

Indispensable également, la lecture du manuel de Nut m'a beaucoup aidé :
http://www.networkupstools.org/docs/user-manual.pdf


V - C'est parti ^^

        - ETAPE 1 : Communiquer avec l'onduleur

Je commence par brancher l'onduleur sur un port USB de mon PC.

Comme indiqué dans la doc ubuntu, on fait un lsusb pour connaître le busUSB utilisé

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 0951:168a Kingston Technology
Bus 001 Device 005: ID 051d:0002 American Power Conversion Uninterruptible Power Supply

Notre onduleur est ici sur le bus 001 et est détecté comme Device 005. On vérifie les droits du périphérique :

$ ll /dev/bus/usb/001/
total 0
crw-rw-r-T 1 root root 189, 0 Jan  1  1970 001
crw-rw-r-T 1 root root 189, 1 Jan  1  1970 002
crw-rw-r-T 1 root root 189, 2 Jan  1  1970 003
crw-rw-r-T 1 root root 189, 3 Jan  1  1970 004
crw-rw-r-T 1 root nut  189, 4 Jan 31 00:15 005

Tout va bien, il appartient bien au groupe nut !

La prochaine étape est de configurer Nut.
Nut remplit deux fonctions essentielles :
  1 - communiquer avec l'onduleur
  2 - diffuser l'information à tous les postes concernés via une relation client/serveur

Pour ma part, je me suis concentré ici uniquement sur ce premier point..

Nut se décompose en plusieurs parties :
  - upsdrvctl : le driver, c'est lui qui communique avec l'onduleur via le port USB
  - upsd : le serveur, c'est lui qui communique avec upsdrvctl
  - upsc : un client minimaliste pour récupérer les informations de l'onduleur via le serveur upsd (c'est lui qui nous intéresse ici !)
  - upsmon : un client qui intégre en plus des possibilités d'action ("si panne de courant, alors éteins correctement la machine")

Editons le fichier /etc/nut/nut.conf (attention il faut faire un sudo avant !) et mettons-le en mode standalone

MODE=standalone

Cela signifie que client, serveur et driver tournent sur une seule et même machine (cas le plus simple)

Configurons maintenant de la même façon le fichier /etc/nut/ups.conf. C'est ce fichier qui va dire au driver où se trouve(nt) le ou les UPS et comment communiquer avec eux.

La page http://www.networkupstools.org/stable-hcl.html permet de connaître quel driver utiliser en fonction de son matériel. Pour moi, c'était usbhid-ups.
Dans le cas d'une connection USB, le port doit être mis en "auto" (la doc officielle indique cependant que n'importe quelle valeur est acceptée dans ce cas là). Voici donc à quoi ressemble mon fichier ups.conf :

[donutsave]
        driver = usbhid-ups
        port = auto
        desc = "Back UPS Pro"

De la même façon, on configure les options du serveur upsd pour savoir sur quelle interface écouter. Ca se passe dans le fichier /etc/nut/upsd.conf

Voici l'extrait significatif de mon fichier :

# =======================================================================
# LISTEN <address> [<port>]
LISTEN 127.0.0.1 3493

Remarque : la notion d'utilisateur ne concerne qu'upsmon, le client upsc peut toujours se connecter. Je passe donc cet aspect là sous silence...

Tout est maintenant configuré pour une utilisation sommaire !!
Démarrons le driver :

$ upsdrvctl start

Tentons de récupérer les informations de l'onduleur :

$ upsc donutsave
battery.charge: 100
battery.charge.low: 10
battery.charge.warning: 50
battery.date: 
battery.mfr.date: 
battery.runtime: 2300
battery.runtime.low: 120
battery.type: 
battery.voltage: 27.3
battery.voltage.nominal: 24.0
device.mfr: American Power Conversion
device.model: 
device.serial: 
device.type: ups
driver.name: usbhid-ups
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 2
driver.parameter.port: auto
driver.version: 2.6.4
driver.version.data: APC HID 0.95
driver.version.internal: 
input.sensitivity: medium
input.transfer.high: 294
input.transfer.low: 176
input.voltage: 235.0
input.voltage.nominal: 230
ups.beeper.status: enabled
ups.delay.shutdown: 20
ups.firmware: 
ups.firmware.aux: L1d
ups.load: 27
ups.mfr: American Power Conversion
ups.mfr.date: 
ups.model: Back-UPS
ups.productid: 
ups.realpower.nominal: 540
ups.serial:
ups.status: OL
ups.test.result: No test initiated
ups.timer.reboot: 0
ups.timer.shutdown:  -1
ups.vendorid: 

Super ça marche !!!!
Jusqu'ici nous n'avons fait que suivre les indications des pages citées au début du document.... Voyons maintenant comment nous pouvons exploiter ça pour remonter à la puissance consommée et au coût EDF.


        - ETAPE 2 : Récupérer la puissance en Watt

Alors arrivé à ce stade, on se rend compte que, selon les modèles d'onduleur, les marques et les possibilités du driver, nous n'obtiendrons pas du tout le même nombre de champs lorsqu'on tape upsc donutsave....

La documentation officielle de Nut en donne une liste exhaustive ici : http://www.networkupstools.org/docs/use … pcs01.html

Dans mon cas,les champs qui m'intéressent sont la puissance nominale réelle (en Watt) ups.realpower.nominal et la charge ups.load (en %).

La puissance nominale réelle est une constante, c'est la valeur maximale que peut fournir mon onduleur.

Pour avoir la puissance utilisée au moment de la mesure, il suffit de faire (à mon avis) : P = ups.realpower.nominal * ups.load

Notons que la charge en pourcentage est un entier..... C'est pas super terrible, ça conduit à une imprécision d'environ 5W sur le calcul de P sad



        - ETAPE 3 : Automatisons tout ça

Voici mon script getPower.sh.
Quand on le lance, il va noter l'heure et la puissance utilisée au moment de la mesure dans un fichier de sortie.
Notons l'utilisation de bc pour les calculs en flottant.

getPower.sh

#!/bin/sh

# Author        : Donut
# Date          : 29 Jan. 2013
# Descritpion   : This script computes the actual power used by all the computers

OUTPUT='/home/donut/Scripts/power.log'
UPS='donutsave'
HOST='localhost'

VARPERC='ups.load'
VARNOMINAL='ups.realpower.nominal'

MJD=$(date '+%s')
HEURE=$(date '+%H')
MINUTE=$(date '+%M')

PERC=$(upsc ${UPS}@${HOST} $VARPERC)
NOMINAL=$(upsc ${UPS}@${HOST} $VARNOMINAL)
LOAD=$(echo "scale=3; $PERC*$NOMINAL/100" | bc -l)


echo "$MJD \t $HEURE \t $MINUTE \t $PERC \t $LOAD" >> $OUTPUT

Et c'est cool, ça fonctionne pas mal smile
Il suffit maintenant de l'ajouter dans la crontab (par exemple toutes les 5 minutes) et j'ai le suivi de ma consommation électrique smile

        - ETAPE 4 : Et la facture EDF alors ?

Pour ma part, j'ai un contrat EDF heures pleines / heures creuses :
Si heure < 6 ou heure > 22, alors le prix du kWh est de 0.0964 € (heures creuses)
Sinon, le prix du kWh est de 0.1391 €

Modifions donc le script pour rajouter une colonne "coût" (on supposera que la mesure est faite toutes les 5 minutes et que la puissance consommée est constante sur cet intervalle de temps) >> il suffit alors de faire une simple règle de 3...

Ca donne alors ça :

getPower.sh

#!/bin/sh

# Author        : Donut
# Date          : 29 Jan. 2013
# Descritpion   : This script computes the actual power used by all the computers

# Output fields are the following
# "MJD" "HOUR"  "MINUTES"       "LOAD (in %)"   "LOAD (in W)"   "KOEF (€/kWh)"   "PRICE (€)"
#
# Important :   PERC is an integer value...
#               that means that the total computed load in W is know within +/- 1/100*NOMINAL = +/- 5.4 W...


OUTPUT='/home/donut/Scripts/power.log'
UPS='donutsave'
HOST='localhost'

VARPERC='ups.load'
VARNOMINAL='ups.realpower.nominal'

# Prix du kWh selon heures pleines / heures creuses (en €/kWh)
KHIGH='0.1391'
KLOW='0.0964'

# Heures limites
HMIN=6
HMAX=22

# Pas de temps entre deux mesures (en minutes)
DELTA=5

MJD=$(date '+%s')
HEURE=$(date '+%H')
MINUTE=$(date '+%M')

if [ $HEURE -lt $HMIN -o $HEURE -ge $HMAX ]
then
        KOEF=$KLOW
else
        KOEF=$KHIGH
fi



PERC=$(upsc ${UPS}@${HOST} $VARPERC)
NOMINAL=$(upsc ${UPS}@${HOST} $VARNOMINAL)

LOAD=$(echo "scale=3; $PERC*$NOMINAL/100" | bc -l)

PRICE=$(echo "scale=6; $LOAD*$DELTA*$KOEF / (1000*60)" | bc -l)


echo "$MJD \t $HEURE \t $MINUTE \t $PERC \t $LOAD \t $KOEF \t $PRICE" >> $OUTPUT

Si je somme la dernière colonne, j'obtiens le prix dépensé depuis le début du cron, en euros. Si je ramène ça sur 30 jours, j'ai mon estimation mensuelle smile

        - ETAPE 5 : Un peu d'octave pour terminer

Mon fichier power.log s'étoffe petit à petit. Un petit peu d'Octave permettra de synthétiser tout ça...


getGraphe.m

#!/usr/bin/octave -q

clear all
close all

input   =       './power.log';
output  =       './power.png';

M=load(input);

t_mjd   =       M(:,1)/(3600*24) + datenum([1970, 1, 1, 0, 0])+1/24; % day
heure   =       M(:,2);
minute  =       M(:,3);
percent =       M(:,4);
power   =       M(:,5);
coef    =       M(:,6);
prix    =       M(:,7);

clear('M');

errP = 5.4; % Erreur en Watt


h=figure('Visible', 'off');

errorbar(heure+minute/60, power,errP, 'r+')
xlabel('Time (hours)')
ylabel('Power (Watt)')
grid on

print(h,output,'-dpng')
clear('h')

VI - Conclusion

Voilà, c'était comme je vous l'avais déjà dit, mon tout premier post "explicatif" ^^
J'espère que ça vous a plus. N'hésitez pas à me faire part de vos remarques smile

Bonne soirée smile)

Hors ligne

#2 Le 31/01/2013, à 19:42

Maisondouf

Re : [Tuto] Recuperer la puissance consommée par le matos informatique

C'est très bien, mais je te signale que la partie que tu payes c'est celle consommée par ton onduleur, pas celle consommée par tes PC, etc, etc.

LOAD=$(echo "scale=3; $NOMINAL" | bc -l)

ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#3 Le 31/01/2013, à 21:37

DonutMan75

Re : [Tuto] Recuperer la puissance consommée par le matos informatique

Bonsoir Maisondouf,
Remarque pertinente, j'y avais déjà songé.
Mais les deux puissances sont liées et il me semble que le rendement d'un onduleur est plutôt bon (de l'ordre de 98%).
Dans l'idéal j'avais vu qu'on pouvait trouver des wattmètres qui se branchent sur les prises électriques pour 10/20€, il faudrait que je fasse une mesure "avant" l'onduleur pour comparer.

Merci pour ton commentaire et bonne soirée smile

Donut

Hors ligne

#4 Le 31/01/2013, à 21:39

DonutMan75

Re : [Tuto] Recuperer la puissance consommée par le matos informatique

En fait à supposer que le rendement ne dépend pas de la charge (ce dont je doute mais bon ça simplifie), il suffirait de multiplier tous les résultats par un coefficient correctif et on aurait une meilleure estimation de l'impact sur la facture EDF... Je vous tiens au courant si j'ai du nouveau smile

Hors ligne

#5 Le 31/01/2013, à 22:00

Maisondouf

Re : [Tuto] Recuperer la puissance consommée par le matos informatique

Le rendement d'un onduleur, enfin celui donné par le constructeur, est toujours bon parce qu'il est mesuré avec 90-95% de charge.
C'est un peu comme une Clio qui ne consomme que 3,2L/100Kms, c'est marqué sur la pub, mais personne n'y arrive.
J'ai un onduleur Powerware 9125 2000VA (un peu vieux je te l'accorde) qui consomme à vide entre 1,2 et 1,4 A, ce qui fait au alentour de 300W en entrée.
Le calcul est simple, à vide le rendement est nul.
Après avec mon modem ADSL+, mon routeur, mon serveur (1vieux mini PC), ses disques externes(4 disques USB 3,5"), 1 PC bureautique(uc+ecran LCD), il annonce 50-55% de charge mais il consomme 6-7A et voire plus.
Donc pour 1000-1100VA restitué(calculé avec la charge annoncée), il consomme plus de 1500W ce qui fait que 71% de rendement.

Par contre, si tu pouvais regarder dans les options de ce logiciel NUT si il est capable de gérer une UPS via un port RS232 (COM1, ttyS0,...), ça m'intéresse.
Mon onduleur n'a que ça pour communiquer....


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#6 Le 31/01/2013, à 23:25

DonutMan75

Re : [Tuto] Recuperer la puissance consommée par le matos informatique

Ah oui quand même oO'
Je m'attendais bien à une légère surconsommation mais pas autant que ça.
Une investigation plus poussée s'impose donc ^^
Sinon NUT gère effectivement le port série, mais je ne l'ai jamais testé.

Merci pour cet échange, bonne soirée smile

Hors ligne

#7 Le 31/01/2013, à 23:39

Maisondouf

Re : [Tuto] Recuperer la puissance consommée par le matos informatique

Bye A+


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#8 Le 05/02/2013, à 09:22

DonutMan75

Re : [Tuto] Recuperer la puissance consommée par le matos informatique

Bonjour,
bon j'ai investi dans un petit wattmètre qui se branche sur une prise de courant (moins de 15€ dans un magasin de bricolage). Je l'ai branché en entrée de l'onduleur.
Si on note Pe, la puissance consommée par l'onduleur (i.e. celle qui est lue par le wattmètre) et Ps la puissance restituée par l'onduleur (i.e. celle à laquelle j'accède dans mon script), on peut relier ces deux puissances par une loi de la forme :
Pe = P0 + a*Ps + b*Ps²

P0 = charge à vide (i.e. ce qui est consommé par l'onduleur quand Ps = 0)

J'ai pris différent points de mesure (pour différentes charges) et j'arrive à bien les fitter.

Du coup, une fois P0, a et b connus, je peux remonter à Pe connaissant Ps. Ce qui me permet d'affiner mon estimation de la consommation EDF.

L'onduleur a un petit impact sur la facture totale, on se rend compte de l'importance de bien le dimensionner par rapport à la consommation estimée ! S'il est surdimmensionné, il va fonctionner en sous charge (P0 >> Ps) ce qui n'est pas bon....

Merci à Maisondouf pour cette suggestion, je pense maintenant être arrivé à quelque chose de pas mal.

Bonne journée à tous smile

Dernière modification par DonutMan75 (Le 05/02/2013, à 09:24)

Hors ligne

#9 Le 05/02/2013, à 10:17

Maisondouf

Re : [Tuto] Recuperer la puissance consommée par le matos informatique

Si je me rappelle mes cours d'électrotechnique d'il y a 30 ans, plus tu montes la charge plus a grandit et  b grandit vite au début pour se stabiliser, décroître jusqu'à presque être négatif.
Mais c'est loin tout ça...


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne