- Informatique
- Arduino
- Projets
- Mécanique
PyNUT est une classe d'abstraction écrite en Python permettant de se connecter à un serveur NUT (Network UPS Tools) et d'exécuter différentes commandes sans avoir à connaître le protocole de communication.
L'idée de cette classe vient d'un autre projet que je voulais réaliser. Avoir un outil graphique pour visualiser et gérer mes onduleurs connectées à NUT. Le projet graphique étant réalisé en Python également, j'ai opté pour la séparation (classe PyNUT + application graphique → modèle + vue) afin que les deux parties restent indépendantes.
L'application graphique se trouve ici : NUT-Monitor
Le projet PyNUT est amené a évoluer et plus tard proposera d'autres classes. Pour cette raison la classe 'PyNUT' à été renomée en 'PyNUTClient' à partir de la version 1.1
class PyNUTClient : def __init__( self, host='127.0.0.1', port=3493, login=None, password=None, debug=False, timeout=5 ) : def GetRWVars( self, ups='' ) : def GetUPSCommands( self, ups='' ) : def GetUPSList( self ) : def GetUPSVars( self, ups='' ) : def RunUPSCommand( self, ups='', command='' ) : def SetRWVar( self, ups='', var='', value='' ) :
Pour des besoins de distribution, l'intégralité du code de PyNUT est commenté en anglais. Vous trouverez donc dans ce chapitre la documentation des méthodes de la classe en français.
La classe PyNUTClient est compatible avec le module PyDOC de Python. Il vous suffit donc de taper 'pydoc PyNUT' pour obtenir une documentation succincte de PyNUTClient.
Renvoi une liste des variables modifiables sur l'onduleur spécifié. Le format est un dictionnaire de type 'clé'⇒'valeur'.
import PyNUT ups = PyNUT.PyNUTClient( host='serveur', login='upsadmin', password='upspass' ) result = ups.GetRWVars( ups='ups1' ) print( result ) >> {'battery.date': '10/25/07', 'ups.id': 'test'}
Renvoi une liste des commandes supportées par l'onduleur spécifié. A noter que certaines de ces commandes ne seront utilisables qu'avec les droits nécessaires. Le résultat est présenté sous la forme d'un dictionnaire du type 'commande'⇒'description en anglais'.
import PyNUT ups = PyNUT.PyNUTClient( host='serveur', login='upsadmin', password='upspass' ) result = ups.GetRWVars( ups='ups1' ) print( result ) >> {'test.battery.start' : 'Start a battery test', 'calibrate.stop' : 'Stop run time calibration', 'shutdown.stayoff' : 'Turn off the load and remain off', 'test.battery.stop' : 'Stop the battery test', 'test.panel.start' : 'Start testing the UPS panel', 'calibrate.start' : 'Start run time calibration', 'load.off' : 'Turn off the load immediately', 'test.failure.start' : 'Start a simulated power failure', 'shutdown.return' : 'Turn off the load and return when power is back'}
Renvoi la liste des onduleurs gérés sur le serveur NUT. Le résultat est présenté sous la forme d'un dictionnaire contenant 'Nom'⇒'Description'.
import PyNUT ups = PyNUT.PyNUTClient( host='serveur', login='upsadmin', password='upspass' ) result = ups.GetUPSList() print( result ) >> {'UPS1': 'Smart UPS 3000 Serveur de fichiers', 'UPS2': 'Smart UPS 1000 Serveur de mail'}
Renvoi la liste de toutes les variables disponibles pour l'onduleur spécifié. Le résultat est présenté sous la forme d'un dictionnaire du type 'Variable'⇒'Valeur'.
import PyNUT ups = PyNUT.PyNUTClient( host='serveur', login='upsadmin', password='upspass' ) result = ups.GetUPSVars( ups='UPS1' ) print( result ) >> {'input.transfer.high' : '253', 'battery.charge' : '100.0', 'ups.mfr' : 'APC', 'battery.voltage.nominal' : '024', 'input.transfer.reason' : 'S', 'ups.test.interval' : '1209600', 'input.transfer.low' : '208', 'output.voltage' : '234.0', 'driver.version' : '2.2.1-', 'battery.charge.restart' : '00', 'ups.id' : 'test', 'driver.parameter.pollinterval' : '2', 'driver.parameter.port' : '/dev/ttyS0', 'battery.voltage' : '27.10', 'ups.test.result' : 'NO', 'ups.status' : 'OL', 'battery.date' : '10/25/07', 'ups.model' : 'Smart-UPS SC1000', 'ups.serial' : 'XXXXXXXXXXXX', 'output.voltage.nominal' : '230', 'ups.mfr.date' : '10/25/07', 'driver.version.internal' : '1.99.8', 'input.voltage' : '234.0', 'battery.runtime.low' : '120', 'input.sensitivity' : 'H', 'ups.load' : '001.9', 'driver.name' : 'apcsmart', 'input.voltage.maximum' : '234.0', 'input.frequency' : '50.00', 'ups.delay.shutdown' : '060', 'ups.delay.start' : '000', 'input.voltage.minimum' : '232.0', 'input.quality' : 'FF', 'battery.runtime' : '29040', 'ups.firmware' : '737.3.I', 'battery.alarm.threshold' : '0'}
Execute la commande spécifiée sur l'onduleur spécifié. La commande renvoi 'OK' si tout c'est bien passé ou lève une exception en cas de soucis. La commande doit être une des commandes renvoyés par la fonction 'GetUPSCommands'.
import PyNUT ups = PyNUT.PyNUTClient( host='serveur', login='upsadmin', password='upspass' ) result = ups.RunUPSCommand( ups='UPS1', command='test.panel.start' ) print( result ) >> OK
Cette fonction ajuste la valeur d'une variable sur l'onduleur spécifié. La variable doit faire partie des variables renvoyées par la commande GetRWVars(). Le résultat est 'OK' ou une exception est levée en cas d'échec.
import PyNUT ups = PyNUT.PyNUTClient( host='serveur', login='upsadmin', password='upspass' ) result = ups.SetRWVar( ups='UPS1', var='battery.date', value='06/17/08' ) print( result ) >> OK
PyNUT est disponible sous deux formes, une archive TAR contenant les fichiers nécessaires, et un paquet Debian qui fonctionne sous Ubuntu. Il ne devrait pas poser de soucis sur d'autres distributions de type Debian.