ScriptFactura
Salta a la navegació
Salta a la cerca
#!/usr/bin/python
# -*- coding: utf-8 -*-
#Falta
#Posar el nom del colectiu
#L1Ard2 Taller #L2Ard2 Taller #L3Ard2 Taller
#L1Ard3 Coworking #L2Ard3 Fugart #L3Ard3 Comú
#L1Ard4 Comú #L2Ard4 Comú #L3Ard4 Cooperatives
#L1Ard5 General #L2Ard5 General #L3Ard5 General
#L1Ard6 Cronopis #L2Ard6 Cronopis #L3Ard6 Cronopis
#L1Ard7 Estudi i Mig #L2Ard7 Taller de Cosir #L3Ard7 LAC
#Arduino 2,5 i 6 SUMEM
#Arduino 3,4,7 Separat
#Falta controlar si falta un dia les dades!!!
import numpy as np
import matplotlib.pyplot as plt
import os, sys, bz2
from pylatex import Document, Section, Figure, SubFigure, NoEscape, Command
from pylatex.base_classes.command import Options, Arguments
from pylatex.utils import verbatim, bold
from pylatex.package import Package
if __name__ == '__main__':
#Inicialitzem les dades
PL1=4
SL1=5
PL2=8
SL2=9
PL3=12
SL3=13
MESOS=12
Mesos=['Gen', 'Feb', 'Marc', 'Abril', 'Maig', 'Juny', 'Juliol', 'Agost', 'Set', 'Oct', 'Nov', 'Des']
MaxDiari=0
MaxMensual=0
consum_mensualL1=[[0]*12 for x in range(12)]
consum_mensualL2=[[0]*12 for x in range(12)]
consum_mensualL3=[[0]*12 for x in range(12)]
DadesMesos=[0]*8
#Volem saber el mes de la ultima lectura
for root, dirs, files in os.walk('Factura/Dades'):
file=sorted(files)[-1]
mesactual=file.split('-')[1].split('.')[0][:-2]
MesActual=Mesos[int(mesactual[2:])-1]
if (MesActual == 'Gen') or (MesActual == 'Marc') or (MesActual == 'Maig') or (MesActual == 'Juliol') or (MesActual == 'Agost') or (MesActual == 'Oct') or (MesActual == 'Des'):
numdies=31
elif MesActual == ('Abril') or MesActual == ('Juny') or MesActual == ('Set') or MesActual == ('Nov'):
numdies=30
elif (mesactual[0:2] == 16) or (mesactual[0:2] == 20) or (mesactual[0:2] == 24) or (mesactual[0:2] == 28) or (mesactual[0:2] == 32):
numdies=29
else:
numdies=28
DIES=numdies+1
valorDiariL1=[[0]*32 for i in range(8)]
valorDiariL2=[[0]*32 for i in range(8)]
valorDiariL3=[[0]*32 for i in range(8)]
print "Ultim mes que tenim dades: "+Mesos[int(mesactual[2:])-1]+" de l\'any 20"+ mesactual[0:2]
#Creem els directoris on guardarem els grafics si no existeixen
if not os.path.exists('Grafics'):
os.makedirs('Grafics')
for arduino in range(2,8):
print "Analitzant dades arduino ",arduino
CAMI="Factura/Dades/"+str(arduino)+"/"
if not os.path.exists('Grafics/'+str(arduino)):
os.makedirs('Grafics/'+str(arduino))
if (arduino=="2") or (arduino=="4") or (arduino=="7"):
CampL1=SL1
CampL2=SL2
CampL3=SL3
else:
CampL1=PL1
CampL2=PL2
CampL3=PL3
#Ens movem per dins del directori
for root, dirs, files in os.walk(CAMI):
Mes_aux=sorted(files)[0].split('-')[1].split('.')[0][:-2]
aux_mes=0
for file in sorted(files):
if file[0]=="D":
consum=[[],[],[]]
#Obrim el fitxers per llegir
f=bz2.BZ2File('Factura/Dades/'+str(arduino)+'/'+file,'r')
print file
#Mirem el mes i dia que estem analitzant
Mes=file.split('-')[1].split('.')[0][:-2]
dia=int(file.split('-')[1].split('.')[0][4:6])
#Llegim la primera linea i ens quedem amb el temps
line=f.readline()
camps=line.split(' ')
#comprovem si es una linea plena
while (len(camps)<3) and (line!=""):
line=f.readline()
camps=line.split(' ')
if line=="":
consumL1=0
consumL2=0
consumL3=0
else:
potencia=[float(camps[CampL1]),float(camps[CampL2]),float(camps[CampL3])]
hora=camps[1].split(':')
temps_aux=float(hora[2])+float(hora[1])*60+float(hora[0])*3600
tempstotal=temps_aux
data=camps[0]
#Ens movem linea per linea per llegir les dades
for line in f:
camps=line.split(' ')
if 'str' in line:
break
if len(camps)>2:
lecturapotencia=[float(camps[CampL1]),float(camps[CampL2]),float(camps[CampL3])]
Error=0
for x in lecturapotencia:
Error=Error+abs(x)
#Comprovem si no hi ha valors molt grans que considerem erronis
if Error < 10000:
hora=camps[1].split(':')
temps=float(hora[2])+float(hora[1])*60+float(hora[0])*3600
temps_aux=temps-temps_aux
#Si temps_aux es negatiu vol dir que les dades ja son del dia seguent
if temps_aux < 0:
temps_aux=temps_aux+86400
tempstotal=tempstotal+temps_aux
#Multipliquem el valor de la potencia pel temps transcorregut des del ultim cop.
potencia[:]=[x*temps_aux for x in potencia]
#Afegim el valor de la potencia als consums
for i in range(3):
consum[i].append(potencia[i])
temps_aux=temps
potencia=lecturapotencia
#Afegim aixo per si no estem calculant exactament les 24h dun dia
if tempstotal < 86400:
potencia[:]=[x*(86400-tempstotal) for x in potencia]
for i in range(3):
consum[i].append(potencia[i])
#valorx.append(data)
consumL1=sum(consum[0])/3600000
consumL2=sum(consum[1])/3600000
consumL3=sum(consum[2])/3600000
print consumL1, consumL2, consumL3
#Nomes fem els calculs si estem en lultim mes
if Mes == mesactual:
valorDiariL1[arduino][dia]=consumL1
valorDiariL2[arduino][dia]=consumL2
valorDiariL3[arduino][dia]=consumL3
if Mes == Mes_aux:
consum_mensualL1[arduino][aux_mes]+=consumL1
consum_mensualL2[arduino][aux_mes]+=consumL2
consum_mensualL3[arduino][aux_mes]+=consumL3
else :
aux_mes+=1
consum_mensualL1[arduino][aux_mes]=consumL1
consum_mensualL2[arduino][aux_mes]=consumL2
consum_mensualL3[arduino][aux_mes]=consumL3
Mes_aux=file.split('-')[1].split('.')[0][:-2]
DadesMesos[arduino]=aux_mes+1
print u"Creant gràfics ..."
aux_mes+=1
Colectiu= [0]*3
for arduino in range(2,8):
left = np.arange(1,DIES)
width = 0.95
if arduino == 2:
for i in range(2,4):
for index in range(1,int(DIES)):
valorDiariL1[2][index]+=eval('valorDiariL'+str(i))[2][index]
for index in range(1,aux_mes):
consum_mensualL1[2][index]+=consum_mensualL2[2][index]+consum_mensualL3[2][index]
RANG=2
Colectiu=[u"Taller Col·lectiu","",""]
elif arduino == 3:
Colectiu=["Coworking","Fugart",u"Comú 2a Planta"]
RANG=4
elif arduino == 4:
Colectiu=[u"Comú Taller",u"Comú Sotan",u"Cooperatives"]
RANG=4
elif arduino == 5:
for i in range(2,4):
for index in range(1,int(DIES)):
valorDiariL1[5][index]+=eval('valorDiariL'+str(i))[5][index]
for index in range(1,aux_mes):
consum_mensualL1[5][index]+=consum_mensualL2[5][index]+consum_mensualL3[5][index]
Colectiu=["General de Can Fugarolas","",""]
RANG=2
elif arduino == 6:
for i in range(2,4):
for index in range(1,int(DIES)):
valorDiariL1[6][index]+=eval('valorDiariL'+str(i))[6][index]
for index in range(1,aux_mes):
consum_mensualL1[6][index]+=consum_mensualL2[6][index]+consum_mensualL3[6][index]
Colectiu=["Cronopis","",""]
RANG=2
elif arduino == 7:
Colectiu=["Estudi i Mig","Taller de Cosir","LAC"]
RANG=4
for i in range(1,RANG):
valors=eval('valorDiariL'+str(i))[arduino][1:int(DIES)]
plt.clf()
plt.axis([1,DIES,0,max(valors)*1.1])
plt.bar(left, valors, width, bottom=0.01, color='r',alpha=0.8)
plt.xlabel('Dies')
plt.ylabel('Consum en KWh')
plt.title('Consum Diari del mes '+ Mesos[int(mesactual[2:])-1]+' de l\'any 20'+ mesactual[0:2]+' ('+Colectiu[i-1]+')')
plt.xticks(left+width/2,left)
plt.tight_layout()
plt.savefig('Grafics/'+str(arduino)+'/ConsumL'+str(i)+'Diari_Ard'+str(arduino)+'.png')
left = np.arange(1,len(consum_mensualL1)+1)
for i in range(1,RANG):
valors=eval('consum_mensualL'+str(i))[arduino][0:12]
plt.clf()
plt.axis([0,MESOS+1,0,max(valors)*1.1])
plt.bar(left, valors, width, bottom=0.01, color='y',alpha=0.8)
plt.ylabel('Consum en KWh')
plt.title('Consum Mensual')
plt.title('Consum Mensual de tot un any fins '+ Mesos[int(mesactual[2:])-1]+' del 20'+mesactual[0:2]+' ('+Colectiu[i-1]+')')
plt.xticks(left+width/2,np.roll(Mesos,DadesMesos[arduino]-int(mesactual[2:])))
plt.tight_layout()
plt.savefig('Grafics/'+str(arduino)+'/ConsumL'+str(i)+'Mensual_Ard'+str(arduino)+'.png')
Colectiu=[0]*3
print u"Creant factures ..."
for arduino in range(2,8):
if arduino == 2:
RANG=2
Colectiu=[u"Taller Col·lectiu","",""]
elif arduino == 3:
Colectiu=["Coworking","Fugart",u"Comú 2a Planta"]
RANG=4
elif arduino == 4:
Colectiu=[u"Comú Taller",u"Comú Sotan",u"Cooperatives"]
RANG=4
elif arduino == 5:
Colectiu=["General de Can Fugarolas","",""]
RANG=2
elif arduino == 6:
Colectiu=["Cronopis","",""]
RANG=2
else:
Colectiu=["Estudi i Mig","Taller de Cosir","LAC"]
RANG=4
for i in range(1,RANG):
file='FacturaArduino'+str(arduino)+'_'+str(i)
doc = Document(default_filepath=file,documentclass='report',fontenc='T1',inputenc='utf8',lmodern='True')
doc.packages.append(Package('eurosym'))
doc.packages.append(Package('babel',options='catalan'))
args = Arguments(NoEscape(r'\textheight'),'6cm')
doc.preamble.append(Command('addtolength',args))
args = Arguments(NoEscape(r'\textwidth'),'6.5cm')
doc.preamble.append(Command('addtolength',args))
args = Arguments(NoEscape(r'\voffset'),NoEscape(r'-2.5cm'))
doc.preamble.append(Command('addtolength',args))
args = Arguments(NoEscape(r'\hoffset'),NoEscape(r'-3cm'))
doc.preamble.append(Command('addtolength',args))
doc.append(Command('pagestyle','empty'))
doc.append(Command('begin','center'))
doc.append(Command('begin','flushright'))
doc.append(bold(u"Can Fugarolas\n"))
doc.append(bold('1 de '+Mesos[int(mesactual[2:])]+' de 20'+mesactual[0:2]))
doc.append(Command('end','flushright'))
Text=u"Factura del Col·lectiu "+Colectiu[i-1]+"\n"
doc.append(Command('textbf',Command('Large',Text)))
doc.append(Command('textbf',Command('Large','L'+str(i)+u" de l'Arduino "+str(arduino)+"\n")))
doc.append(Command('end','center'))
doc.append(u'Aquesta factura esta generada automàticament a partir de les dades que hem anat obtenint dels Arduinos que tenim instal·lats a la Fàbrica de Can Fugarolas.\n Tota la informació de com han estat generades aquestes factures les pots trobar a')
doc.append(Command('begin','center'))
doc.append(Command('texttt','http://energia.canfugarolas.org'))
doc.append(Command('end','center'))
doc.append(u'Si vols veure en temps real el consum de tots els col·lectius de la fàbrica, pots consultar-ho a')
doc.append(Command('begin','center'))
doc.append(Command('texttt','http://emon.canfugarolas.org'))
doc.append(Command('end','center'))
doc.append(u'Aquí et deixem el teu consum per dies i per mesos en KWh:')
image_filename = os.path.join('Grafics/'+str(arduino)+'/', 'ConsumL'+str(i)+'Diari_Ard'+str(arduino)+'.png')
image_filename2 = os.path.join('Grafics/5/','ConsumL1Diari_Ard5.png')
with doc.create(Figure(position='h!')) as kittens:
with doc.create(SubFigure(
position='b',
width=NoEscape(r'0.5\linewidth'))) as left_kitten:
left_kitten.add_image(image_filename,
width=NoEscape(r'\linewidth'))
left_kitten.add_caption(u'Últim mes')
with doc.create(SubFigure(
position='b',
width=NoEscape(r'0.5\linewidth'))) as right_kitten:
right_kitten.add_image(image_filename2,
width=NoEscape(r'\linewidth'))
right_kitten.add_caption(u'Últim mes')
kittens.add_caption(u'Consum del Col·lectiu')
image_filename = os.path.join('Grafics/'+str(arduino)+'/', 'ConsumL'+str(i)+'Mensual_Ard'+str(arduino)+'.png')
image_filename2 = os.path.join('Grafics/5/','ConsumL1Mensual_Ard5.png')
with doc.create(Figure(position='h!')) as kittens:
with doc.create(SubFigure(
position='b',
width=NoEscape(r'0.5\linewidth'))) as left_kitten:
left_kitten.add_image(image_filename,
width=NoEscape(r'\linewidth'))
left_kitten.add_caption(u'Últim any')
with doc.create(SubFigure(
position='b',
width=NoEscape(r'0.5\linewidth'))) as right_kitten:
right_kitten.add_image(image_filename2,
width=NoEscape(r'\linewidth'))
right_kitten.add_caption(u'Últim any')
kittens.add_caption(u'Consum de Tot Can Fugarolas')
doc.append(Command('begin','flushright'))
doc.append(Command('textsc',u"Comissió d'Energia de Can Fugarolas"))
doc.append(Command('end','flushright'))
doc.generate_pdf()