xPL et NUT, récupérer les données de votre onduleur

Comme la majorité des passionnés qui touche à la domotique, j’utilise le protocole xPL pour centraliser les informations de mes équipements.

Si vous ne connaissez pas encore le principe, je vous invite à lire les excellents billets de Thibault et Mickael à ce sujet :

http://www.poulpy.com/2010/02/xpl-one-protocol-to-rule-them-all/

http://www.planete-domotique.com/blog/2011/05/18/le-protocole-xpl/

Et bien sûr, le site du projet lui-même :

http://xplproject.org.uk/wiki/index.php?title=Main_Page

C’est un protocole fiable, performant et acté par les plus fervents agitateurs de la domotique (par exemple Domogik, un des projets français les plus prometteurs actuellement dans la mise à disposition d’une solution « tout-en-un » (et libre surtout !) ou RFXCOM, un des leaders des équipements domotique RF qui intègre désormais nativement le xPL dans ses produits).

Moi, comme beaucoup de mes confrères passionnés, je suis absolument convaincu du fait qu’il faille définir un protocole standard pour l’interaction des équipements de domotique, bien évidemment, ouvert, et bien évidemment, xPL répond à cette attente.

Jusqu’a maintenant, j’utilisais beaucoup les scripts de la communauté, et surtout ceux de l’excellentissime Mark Hindess connu sous le pseudo de beanz et auteur du framework xpl-perl.

Et puis vient le moment où l’on a un besoin précis qui n’existe pas…

En l’occurence, je voulais récuperer les données et l’état de mon onduleur et bien sûr en xPL.

Je fais le tour des solutions et il existe xpl-apcups du même Mark pré-cité mais, mince, flûte, sacrebleu, il ne fonctionne qu’avec apcupsd.

Bon, tant pis, je me dis que je vais revoir le code pour le faire fonctionner et là, forcément, je sèche comme une blonde décolorée aux attributs siliconés  sur une plage méditerranéenne en plein mois d’août.

Parce que bon, Perl et moi… Comment dire… Autant expliquer le principe du cum-swapping à une none ayant fait voeu d’isolement… (avouez que vouliez un lien !!!!)

Donc je me dis que je vais tenter de l’écrire moi-même mon client, ayant aborder Python du coin de l’oeil je regarde ce qu’il existe et je trouve un petit exemple de John Bent sur le site du projet xPL.

Quelques litres de café plus tard (s/café/bière/), je vous propose donc xpl-nut.

Vous pouvez bien sûr le télécharger ICI
Ou sur le projet GoogleCode :
http://code.google.com/p/guiguiabloc/

J’ai essayé de suivre les recommandations du projet xPL.

Les schémas utilisés sont UPS.BASIC et SENSOR.BASIC

Concernant les recommandations TRIGGER, il est demandé de n’émettre une trame que lors d’un changement d’état mais personnellement, j’ai passé outre, préférant avoir une remontée constante des informations.

EDIT : Suite aux discussions avec l’équipe Domogik, j’ai revu mon code pour être « aux normes » et donc le format de message est donc de type STAT désormais et TRIG en cas de changement d’état (version 1.1 du script)

Comme donner un script python comme ça ne sert pas à progresser, et comme j’ai pris du plaisir à l’écrire (et oui :p), je vous propose d’en voir les parties intéressantes, au cas, où, comme moi, vous décidez d’écrire vos propres clients xPL

#############
# variables
#############
upsaddr='127.0.0.1'
upsport=3493
polltime=10
nomups = 'mononduleur'
 
xpladdr = ("255.255.255.255",3865)
UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
UDPSock.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)

Ici rien de compliqué, on définit les variables essentielles, a savoir :
- upsaddr : l’adresse IP du démon NUT
- upsport : le port du démon NUT
- polltime : la fréquence d’interrogationdu démon NUT en secondes
- nomups : le nom de votre onduleur, tel que définit dans votre /etc/ups.conf
- xpladdr : l’adresse et le port de broadcast pour les messages

Le code suivant est la préparation de l’ouverture d’un socket UDP.

etatonduleur = "get var "+nomups+" ups.status\r\n"
voltage= "get var "+nomups+" input.voltage\r\n"
batterycharge= "get var "+nomups+" battery.charge\r\n"

Ici on définit les requètes que nous allons passer au démon NUT.
Si vous faites un « telnet ip_du_nut_demon 3493″ par defaut, vous avez accès a une console qui vous permet d’interroger le démon NUT.
HELP donne l’aide (nan ????)
GET VAR nomdelonduleur input.voltage donne le voltage en entrée
etc…
Pour avoir la liste des variables, il vous suffit de taper : upsc nomonduleur.

Voici par exemple ce que cela retourne chez moi :

srv-guiguiabloc:/etc/nut# upsc mgeups
battery.charge: 100.0
battery.charge.low: 30
battery.runtime: 02655
battery.voltage: 055.2
battery.voltage.nominal: 048.0
device.mfr: MGE UPS SYSTEMS
device.model: Pulsar ESV22+
device.type: ups
driver.name: mge-utalk
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ttyS0
driver.version: 2.4.3
driver.version.internal: 0.89
input.frequency: 50.00
input.transfer.boost.high: 212.0
input.transfer.boost.low: 204.0
input.transfer.high: 248.0
input.transfer.low: 204.0
input.transfer.trim.high: 248.0
input.transfer.trim.low: 240.0
input.voltage: 227.0
output.current: 002.9
output.voltage: 224.1
ups.delay.shutdown: 020
ups.delay.start: 001
ups.firmware: 2
ups.id: Pulsar ESV22+ 2
ups.load: 027.0
ups.mfr: MGE UPS SYSTEMS
ups.model: Pulsar ESV22+
ups.status: OL
ups.test.interval: 10080

A vous de forger les requètes en conséquence ;)

s.send(etatonduleur)
    data = s.recv(50)
    resultat = data.split()
    statusbatt = resultat.pop()
    statusbatt = statusbatt.replace('"','')
    statusbatt = statusbatt.replace('OL','onmains')
    statusbatt = statusbatt.replace('OB','onbattery')
    statusbatt = statusbatt.replace('LB','lowbattery')
    body = 'status=battery\nevent='+statusbatt
    msg = "xpl-trig\n{\nhop=1\nsource=guigui-xplnut."+hostname+"\ntarget=*\n}\nups.basic\n{\n" + body + "\n}\n"
    UDPSock.sendto(msg,xpladdr)
    print msg

J’envois la requète au démon NUT et je récupère le résultat que je traite (salement je l’avoue).
Je forge ensuite le message xPL que j’envois dans le réseau.

Le reste du code est assez basique et vous devriez en comprendre le fonctionnement avec ses quelques explications.
soyez indulgent, je suppose que mon code n’est pas très propre et si vous êtes un pro du python, je suis ouvert à vos recommandations ! :D

En tout cas, cela marche très bien et pour un premier script xPL j’en suis plutôt fier :)

Une fois lancé, vous devriez voir les remontées dans votre bus xPL:

[xpl-trig/ups.basic: guigui-xplnut.Thanatos -> * - battery onmains]
[xpl-trig/sensor.basic: guigui-xplnut.Thanatos -> * - mgeups[voltage]=225.7]
[xpl-trig/sensor.basic: guigui-xplnut.Thanatos -> * - mgeups[battery]=100.0]

En espérant que cela vous serve,

Amusez vous bien :D

Ce billet a été posté dans domotique et taggé , , , . Bookmark ce permalink.

4 commentaires sur “xPL et NUT, récupérer les données de votre onduleur

  1. juste pour faire coucou, une lectrice qui ne comprend pas grand chose a tout ça mais qui aime venir lire ce site.
    Une Blonde sans silicone qui vit a coté de la mer méditerranée :p

  2. Pingback: Installation Domotique de GuiguiAbloc