#!/usr/bin/python # Releve des mesures du regulateur Epsolar Tracer par un Raspberry Pi # # Appele depuis crontab toutes les 5mn # # Liens : # # http://blog.lekermeur.net/?p=2595 # # http://www.lekermeur.org/lndktracer/ # # Marc Dilasser, Le Net du Kermeur, Juin 2015 # ######################################################################## import sys import ConfigParser, os import serial import MySQLdb as mdb import time from datetime import datetime device = "/dev/ttyAMA0" sequen = "\xeb\x90\xeb\x90\xeb\x90\x01\xa0\x00\x6f\x52\x7f" verbose = 0 # Valeurs par defaut et lecture du fichier de config s'il existe config = ConfigParser.ConfigParser() config = ConfigParser.RawConfigParser() config.add_section('Mysql') config.set('Mysql', 'sqlhost', 'localhost') config.set('Mysql', 'database', 'reseau') config.set('Mysql', 'sqltable', 'mesures') config.set('Mysql', 'sqluser', 'user') config.set('Mysql', 'password', 'password') # Fichier de config : ${HOME}/.lndksolar config.read([os.path.expanduser('~/.lndksolar')]) sqlhost = config.get('Mysql', 'sqlhost') sqlbase = config.get('Mysql', 'database') sqluser = config.get('Mysql', 'sqluser') sqlpass = config.get('Mysql', 'password') sqltabl = config.get('Mysql', 'sqltable') # Tableau de nbm mesures pour faire une moyenne # et ecarter les valeurs aberrantes (statistical outliers) nbm = 6 mesures = [[0 for j in range(nbm)] for i in range(15)] valeurs = [0 for i in range(15)] for ij in range(0,nbm) : # Ecriture sequence et lecture du port serie port = serial.Serial(device, baudrate=9600, timeout=2.0) port.write(sequen) port.read(6) # Synchro port.read(3) # Header rcv = port.read(24) # Datas ################################################################ # Detail des donnees recues, 24 octets # # Les tensions en dizaine de mV, les courants en dizaine de mA # # Tension batterie E4 04 # # Tension panneaux 14 06 # # Reserve ? 00 00 # # Consommation 00 00 # # Batterie faible 4C 04 # # Batterie pleine B3 05 # # Indicateur utilisation connectee 00 # # Indicateur surcharge 000 # # Indicateur de court-circuit 00 # # Etat de charge (SOC) 29 # # Indicateur Battery Over Load 00 # # Indicateur Battery Over Discharge 00 # # Indicateur Battery Full 00 # # Indicateur de charge 01 # # Temperature (degre + 30) 2B # # Courant de charge 03 00 # # Reserve ? 00 # ################################################################ port.read(3) # Checksum and Stop for ik in range(0,2) : # VBAT,VPAN mesures[ik][ij] = ((ord(rcv[(ik * 2) + 1]) * 256) + ord(rcv[ik * 2]) ) * 10 ik = ik + 1 mesures[2][ij] = ((ord(rcv[7]) * 256) + ord(rcv[6]) ) * 10 # ICON mesures[3][ij] = ((ord(rcv[9]) * 256) + ord(rcv[8]) ) * 10 # BLOW mesures[4][ij] = ((ord(rcv[11]) * 256) + ord(rcv[10])) * 10 # BHIG mesures[5][ij] = ((ord(rcv[22]) * 256) + ord(rcv[21])) * 10 # ICHG for ik in range(6,15) : # FUTI,FOVL,FSHT,ISOC,BOVL,BOVD,BFUL,FCHG,TEMP mesures[ik][ij] = ord(rcv[ik + 6]) ik = ik + 1 if verbose: print "Datas: " + repr(rcv) print "Tension batterie : " + str(mesures[0][ij]) + "mV" print "Tension panneaux : " + str(mesures[1][ij]) + "mV" print "Consommation : " + str(mesures[2][ij]) + "mA" print "Courant de charge : " + str(mesures[5][ij]) + "mA" ij =ij + 1 time.sleep(2) # Ecarter valeurs minimale et maximale, et faire la moyenne du reste for ik in range(0,15) : total = 0 maxi = 0 mini = 1000000 for il in range(0,nbm) : total += mesures[ik][il] if mesures[ik][il] > maxi : maxi = mesures[ik][il] if mesures[ik][il] < mini : mini = mesures[ik][il] il = il + 1 valeurs[ik] = (total - (mini + maxi)) / (nbm - 2) ik = ik + 1 # Date d'insertion dans la base MySQL datei = int(time.time()) # Mise a jour table MySQL try: con = mdb.connect(sqlhost, sqluser, sqlpass, sqlbase); with con: cur = con.cursor() mcmd = "INSERT INTO " + sqltabl + " VALUES(1," mcmd += str(datei) + "," + str(datei) for ik in range(0,15) : mcmd += "," + str(valeurs[ik]) ik = ik + 1 mcmd += ",'Raspb')" cur.execute(mcmd) if verbose: print "SQL : " + mcmd except mdb.Error, e: print "Error %d: %s" % (e.args[0],e.args[1]) sys.exit(1) finally: if con: con.close() ########## End of lndksolar.py ######### That's All, Folks ##########