#!/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
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
PL2=8
PL3=12
MESOS=12
Mesos=['Gen', 'Feb', 'Marc', 'Abril', 'Maig', 'Juny', 'Juliol', 'Agost', 'Set', 'Oct', 'Nov', 'Des']
MaxDiari=MaxMensual=0
consum_mensualL1=[[0]*13 for x in range(12)]
consum_mensualL2=[[0]*13 for x in range(12)]
consum_mensualL3=[[0]*13 for x in range(12)]
#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):
#for arduino in 3,2,4,5,6,7:
#for arduino in 3,7:
print "Analitzant dades arduino ",arduino
CAMI="Factura/Dades/"+str(arduino)+"/"
if not os.path.exists('Grafics/'+str(arduino)):
os.makedirs('Grafics/'+str(arduino))
#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 :
line=f.readline()
camps=line.split(' ')
potencia=[float(camps[PL1]),float(camps[PL2]),float(camps[PL3])]
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[PL1]),float(camps[PL2]),float(camps[PL3])]
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
#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]
#Calculem els maxims per poder fer grafiques iguals
for i in range(1,4):
Max=max(eval('valorDiariL'+str(i))[arduino])
if MaxDiari < Max:
MaxDiari=Max*1.1
Max=max(eval('consum_mensualL'+str(i))[arduino])
if MaxMensual < Max :
MaxMensual=Max*1.1
print u"Creant gràfics ..."
Colectiu= [0]*3
for arduino in range(2,8):
#for arduino in 3,7:
left = np.arange(1,DIES+1)
width = 0.95
if arduino == 2:
for i in range(2,4):
valorDiariL1[2][1:int(DIES+1)]+=eval('valorDiariL'+str(i))[2][1:int(DIES+1)]
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):
valorDiariL1[7][1:int(DIES+1)]+=eval('valorDiariL'+str(i))[7][1:int(DIES+1)]
Colectiu[0]=["General de Can Fugarolas","",""]
RANG=2
elif arduino == 6:
for i in range(2,4):
valorDiariL1[6][1:int(DIES+1)]+=eval('valorDiariL'+str(i))[6][1:int(DIES+1)]
Colectiu[0]=["Cronopis","",""]
RANG=2
else:
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+1)]
plt.clf()
plt.axis([1,DIES+1,0,MaxDiari])
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]+' (Arduino '+str(arduino)+' L'+str(i)+')')
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][1:13]
plt.clf()
plt.axis([0,MESOS+1,0,MaxMensual])
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]+' (Arduino '+str(arduino)+' L'+str(i)+')')
plt.xticks(left+width/2,np.roll(Mesos,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:
for i in range(2,4):
valorDiariL1[7][1:int(DIES+1)]+=eval('valorDiariL'+str(i))[7][1:int(DIES+1)]
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(u"1 de Març de 2016"))
doc.append(Command('end','flushright'))
Text=u"Factura del Col·lectiu"+Colectiu[i-1]
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/','ConsumL2Diari_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 any')
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/','ConsumL2Mensual_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 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()