ScriptFactura

De Comissió Energia Can Fugarolas
La revisió el 18:20, 10 abr 2016 per Admin (discussió | contribucions) (Es crea la pàgina amb « #!/usr/bin/python # -*- coding: utf-8 -*- #Falta #Posar el nom del colectiu #L1Ard2 Taller #L2Ard2 Taller #L3Ard2 Taller #L1Ard3 Coworking #L2Ard...».)
(dif.) ← Versió més antiga | Versió actual (dif.) | Versió més nova → (dif.)
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 
  
  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()