#! /usr/bin/python
#
# xpl-nut
# V.1.1 (09 nov. 2011)
# xPL client pour le demon NUT
# Copyright (C) 2011  GuiguiAbloc
# http://blog.guiguiabloc.fr
#
# Base de travail : Python toolkit de John Bent
# Copyright (C) 2004 by John Bent
# http://www.xplproject.org.uk/

import socket, sys, string 
import sched, time 

#############
# variables
#############
upsaddr='192.168.0.10' 
upsport=3493
polltime=10 
nomups = 'mgeups'

xpladdr = ("255.255.255.255",3865)
xplport = 3865
UDPSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
UDPSock.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1)

def xplmsgstat(body):
     msg = "xpl-stat\n{\nhop=1\nsource=guigui-xplnut."+hostname+"\ntarget=*\n}\nsensor.basic\n{\n" + body + "\n}\n"
     UDPSock.sendto(msg,xpladdr)

def xplmsgtrig(body):
     msg = "xpl-trig\n{\nhop=1\nsource=guigui-xplnut."+hostname+"\ntarget=*\n}\nsensor.basic\n{\n" + body + "\n}\n"
     UDPSock.sendto(msg,xpladdr)


#############
# PROGRAMME #
#############
hostname = socket.gethostname()
valeurvoltage=0
valeurbatterie=0
statusbatterie='unknown'

def alerte(msg):
    print >>sys.stderr, msg
    sys.exit(1)

# definition du temps de Polling
temps = sched.scheduler(time.time, time.sleep)
 
#creation de la socket puis connexion
s       = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    s.connect((upsaddr,upsport))
except Exception, e:
    alerte('Une erreur est survenue avec %s:%d. Exception type est %s' % (upsaddr, upsport, `e`))
 
# preparation de la requete
etatonduleur = "get var "+nomups+" ups.status\r\n"
voltage= "get var "+nomups+" input.voltage\r\n"
chargebatterie= "get var "+nomups+" battery.charge\r\n"

 
# envoi puis reception de la reponse toutes les x polltime
def poll_ups(tc):

    s.send(etatonduleur)
    data = s.recv(50)
    resultat = data.split()
    statusbatt = resultat.pop()
    statusbatt = statusbatt.replace('"','')
    statusbatt = statusbatt.replace('OL','mains')
    statusbatt = statusbatt.replace('OB','battery')
    statusbatt = statusbatt.replace('LB','unknown')
    body = 'status='+statusbatt
    global statusbatterie
    if statusbatt != statusbatterie :
        statusbatterie = statusbatt
        body = 'device='+nomups+'\ntype=battery\ncurrent='+statusbatt
        xplmsgtrig(body)

    s.send(voltage)
    voltageresult = s.recv(50)
    resultatvolt = voltageresult.split()
    voltagein = resultatvolt.pop()
    voltagein = voltagein.replace('"','')
    global valeurvoltage
    if voltagein != valeurvoltage :
        valeurvoltage = voltagein
        body = 'device='+nomups+'\ntype=voltage\ncurrent='+voltagein
        xplmsgtrig(body)
    body = 'device='+nomups+'\ntype=voltage\ncurrent='+voltagein
    xplmsgstat(body)

    s.send(chargebatterie)
    batterychargeresult = s.recv(50)
    resultatbatt = batterychargeresult.split()
    chargebatt = resultatbatt.pop()
    chargebatt = chargebatt.replace('"','')
    global valeurbatterie
    if chargebatt != valeurbatterie :
        valeurbatterie = chargebatt
        body = 'device='+nomups+'\ntype=battery\ncurrent='+chargebatt
        xplmsgtrig(body)
    body = 'device='+nomups+'\ntype=battery\ncurrent='+chargebatt
    xplmsgstat(body)

    tc.enter(polltime, 1, poll_ups, (tc,))

temps.enter(polltime, 1, poll_ups, (temps,))
temps.run()

