ScriptFactura

De Comissió Energia Can Fugarolas
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):
     for arduino in 5,7:
     
        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):
     for arduino in 5,7:
  
        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):
     for arduino in 5,7:
  
        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()