Forum Programmation.python Faire 2 bases de données

Posté par . Licence CC by-sa
Tags : aucun
1
15
avr.
2015

Bonjour , je reviens vers vous pour un probleme de base de donnée, avec mon fichier Python je récupère les valeurs de température et d’hygrométrie d'une sonde DHT 22 branché sur un raspberry ,Actuellement je récupère ces 2 informations th et hm sur une BD, je voudrais avoir la température dans une BD (DHT22.rrd) et l’hygrométrie dans une autre BD (DHT22Y.rrd). comment faire ? merci d'avance

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import locale
import datetime
import time
import subprocess
import os
import sys
import shlex
from re import search


pin = "27"

#fonction pour changer le language de la date en anglais

def get_c_locale_abbrev():
  lc = locale.setlocale(locale.LC_TIME)
  try:
    locale.setlocale(locale.LC_TIME, "C")
    return time.strftime("%a %b %d %H:%M:%S %Y")
  finally:
    locale.setlocale(locale.LC_TIME, lc)





#Fonction pour lecture DHT22
def get_outputs(typ,pin):
    i=0
    Hmax=100
    for test_output in range(5):
        i=i+1
        outputs_raw = subprocess.check_output(["/root/Adafruit_DHT", typ, pin])
        if len(outputs_raw)==44:
            return None,None
        OK = search("Temp", outputs_raw) and search("Hum", outputs_raw)
        if (OK):
            result_humid = search("Hum =\s+([0-9.]+)", outputs_raw)
            humidity = result_humid.group(1)
            if float(humidity)<=Hmax:
                result_temp = search("Temp =\s+([0-9.]+|-[0-9]+)", outputs_raw)
                temperature = result_temp.group(1)
                if float(temperature)!=-3276:
                    return humidity,temperature
    return None,None


humidity,temperature = get_outputs("22",pin)

#print("H:{} t:{}".format(humidity,temperature))

#if the value is None  just put ---
def validatePrint(value):
  if value == None:
     return "---"
  else:
     return "{:.1f}".format(float(value))

#if the value is None tell rrdtool that the value is unknown
def validateRRD(value):
  if value == None:
     return ":U"
  else:
     return ":{}".format(value)


''' **********
 Ici c'est le fichier hist-EXT
 ce fichier est créé avec un modulus % 5 de la minute.
 Donc 5 fichier en alternance et le dernier sera un link sur hist-EXT
 pour permettre d'utiliser hist-EXT sans avoir de problème
 de lecture lorsque le fichier ce fait écrire '''

#current time
current_time= datetime.datetime.now()
histEXT = "/home/www/logs/hist-EXT"

#Nom des fichier
Temp_histEXT= histEXT + "{}".format(current_time.minute % 5) + ".txt"
Link_histEXT= histEXT + ".txt"

#creation du fichier modulus
#try:
if True:
   sfile = open(Temp_histEXT,'w')
   sfile.write(get_c_locale_abbrev() + " /" +  validatePrint(temperature) + "/" + validatePrint(humidity) + "/1\n")
   sfile.close()
   #creation du link  os.symlink ne marche pas si le fichier est déja linké
   #os.symlink(Temp_histEXT,Link_histEXT)
   subprocess.Popen(["/bin/ln","-fs",Temp_histEXT,Link_histEXT])



#except:
#   print("unable to create {}".format(Temp_histEXT))




webdata = "/home/www/Graph/webdata/"
currentStatus = webdata + "DHT22Status.txt"

try:

  sfile = open(currentStatus,'w')
  sfile.write(validatePrint(humidity) + "," + validatePrint(temperature) + "\n")
  sfile.close()
except:
  print("unable to create '/home/www/Graph/webdata/DHT22Status.txt'")


#now let's insert the result into rrdtool database

fileRrdTool = "/home/www/Graph/data_DHT22.rrd"

#let's fill the command line with the

#Current time (Right now), temperature and humidity
rdata = "N" + validateRRD(temperature) + validateRRD(humidity)


subprocess.Popen(["/usr/bin/rrdtool","update",fileRrdTool,rdata])


#data Extraction to create data point for the charts.

#create a function with start and step parameters
#this way we could create chart with different timing



def rrdExport(start, step, XMLfile):
  texte = "rrdtool xport -s {0} -e now --step {1} ".format(start, step)
  #let's populate for temperature, humidity
  texte += "DEF:{}={}:{}:AVERAGE ".format('a',fileRrdTool,'th_dht22')
  texte += "XPORT:{}:""{}"" ".format('a','th_dht22')
  texte += "DEF:{}={}:{}:AVERAGE ".format('b',fileRrdTool,'hm_dht22')
  texte += "XPORT:{}:""{}"" ".format('b','hm_dht22')

  fileout = open(webdata+XMLfile,"w")
  args = shlex.split(texte)
  subprocess.Popen(args,stdout=fileout)
  fileout.close()


# ok extact 3 hours data
rrdExport("now-3h",300, "DHT22_3h.xml")

#ok 24 hours
rrdExport("now-24h",900, "DHT22_24h.xml")

#ok 48 hours
rrdExport("now-48h",1800, "DHT22_48h.xml")

#ok 1 week
rrdExport("now-8d",3600, "DHT22_1w.xml")

#ok 1 month
rrdExport("now-1month",14400, "DHT22_1m.xml")

#ok 3 month
rrdExport("now-3month",28800, "DHT22_3m.xml")

#ok 1 year
rrdExport("now-1y",43200, "DHT22_1y.xml")

#ok just print on the screen what we have

print("DHT22:{}Celsius, {}%".format(validatePrint(temperature),validatePrint(humidity)))

#done
  • # en changeant la destination des ecritures

    Posté par . Évalué à 2.

    actuellement tu as

    #now let's insert the result into rrdtool database
    
    fileRrdTool = "/home/www/Graph/data_DHT22.rrd"
    
    #let's fill the command line with the
    #Current time (Right now), temperature and humidity
    rdata = "N" + validateRRD(temperature) + validateRRD(humidity)
    subprocess.Popen(["/usr/bin/rrdtool","update",fileRrdTool,rdata])

    qui indique que le fichier sera data_DHT22.rrd
    que les rdata seront "N"TemperatureHumidité
    pour ensuite l'ecrire dans le fichier.

    en reecrivant le code ainsi, ca doit le faire

    #now let's insert the result into rrdtool database
    
    fileRrdTEMP = "/home/www/Graph/data_DHT22.rrd"
    fileRrdHUM = "/home/www/Graph/data_DHT22Y.rrd"
    
    #let's fill the command line with the
    
    #Current time (Right now), temperature and humidity
    rdata-temp = "N" + validateRRD(temperature)
    rdata-hum = "N" + validateRRD(humidity)
    
    
    subprocess.Popen(["/usr/bin/rrdtool","update",fileRrdTEMP,rdata-temp])
    subprocess.Popen(["/usr/bin/rrdtool","update",fileRrdHUM,rdata-hum])

    et probablement, plus bas, adapter, dans la fonction rrdExport pour gerer cela

      texte += "DEF:{}={}:{}:AVERAGE ".format('a',fileRrdTool,'th_dht22')
      texte += "XPORT:{}:""{}"" ".format('a','th_dht22')
      texte += "DEF:{}={}:{}:AVERAGE ".format('b',fileRrdTool,'hm_dht22')
      texte += "XPORT:{}:""{}"" ".format('b','hm_dht22')

    qui devient

      texte += "DEF:{}={}:{}:AVERAGE ".format('a',fileRrdTEMP,'th_dht22')
      texte += "XPORT:{}:""{}"" ".format('a','th_dht22')
      texte += "DEF:{}={}:{}:AVERAGE ".format('b',fileRrdHUM,'hm_dht22')
      texte += "XPORT:{}:""{}"" ".format('b','hm_dht22')
    • [^] # Re: en changeant la destination des ecritures

      Posté par . Évalué à 1.

      Bonsoir et Mreci Néox pour ton aide , j'ai testé , mais j'ai encore un petit probleme

      File "readDHT22Test.py", line 123
      rdata-temp = "N" + validateRRD(temperature)
      SyntaxError: can't assign to operator

      • [^] # Re: en changeant la destination des ecritures

        Posté par . Évalué à 1.

        J'ai remplacé rdata-temp par rdatatemp
        et rdata-hum par rdatahum c'est passé mais il y a encore une erreur

        ERROR: /home/www/Graph/data_DHT22.rrd: expected 2 data source readings (got 1) from N

        • [^] # Re: en changeant la destination des ecritures

          Posté par . Évalué à 1.

          Merci néox ça a l'air de fonctionner affaire a suivre !!

          • [^] # Re: en changeant la destination des ecritures

            Posté par . Évalué à 1. Dernière modification le 15/04/15 à 23:14.

            Aille ! j'ai parlé trop vite j'ai bien les 2 BD avec 1 valeurs dans chaque par contre dans les fichiers XML j'ai les 2 valeurs.

            <?xml version="1.0" encoding="ISO-8859-1"?>
            
            <xport>
              <meta>
                <start>1429121400</start>
                <step>300</step>
                <end>1429121400</end>
                <rows>37</rows>
                <columns>2</columns>
                <legend>
                  <entry>th_dht22</entry>
                  <entry>hm_dht22</entry>
                </legend>
              </meta>
              <data>
            • [^] # Re: en changeant la destination des ecritures

              Posté par . Évalué à 2.

              tu as bien retouché les lignes de texte+=... ?

              • [^] # Re: en changeant la destination des ecritures

                Posté par . Évalué à 1.

                Oui oui

                def rrdExport(start, step, XMLfile):
                  texte = "rrdtool xport -s {0} -e now --step {1} ".format(start, step)
                  #let's populate for temperature, humidity
                  texte += "DEF:{}={}:{}:AVERAGE ".format('a',fileRrdTEMP,'th_dht22')
                  texte += "XPORT:{}:""{}"" ".format('a','th_dht22')
                  texte += "DEF:{}={}:{}:AVERAGE ".format('b',fileRrdHUM,'hm_dht22')
                  texte += "XPORT:{}:""{}"" ".format('b','hm_dht22')
                
                  fileout = open(webdata+XMLfile,"w")
                  args = shlex.split(texte)
                  subprocess.Popen(args,stdout=fileout)
                  fileout.close()
                
                
                # ok extact 3 hours data
                rrdExport("now-3h",300, "DHT22_3h.xml")
                rrdExport("now-3h",300, "DHT22Y_3h.xml")
                #ok 24 hours
                rrdExport("now-24h",900, "DHT22_24h.xml")
                rrdExport("now-24h",900, "DHT22Y_24h.xml")
                • [^] # Re: en changeant la destination des ecritures

                  Posté par . Évalué à 2.

                  ah ben c'est normal en fait,
                  le file export prend les deux données et les mets dans le XML

                  ce qu'il faut c'est preciser à rrdExport quelle donnée il doit traiter.

                  on ajoute donc un parametre (RRDfile) à la fonction rrdExport afin de preciser le fichier qui devra etre traiter
                  cela devient donc

                  def rrdExport(start, step, RRDfile, XMLfile):
                    texte = "rrdtool xport -s {0} -e now --step {1} ".format(start, step)
                    #let's populate for temperature, humidity
                    texte += "DEF:{}={}:{}:AVERAGE ".format('a',RRDfile,'dht22')
                    texte += "XPORT:{}:""{}"" ".format('a','dht22')
                  
                    fileout = open(webdata+XMLfile,"w")
                    args = shlex.split(texte)
                    subprocess.Popen(args,stdout=fileout)
                    fileout.close()
                  
                  
                  # ok extact 3 hours data
                  rrdExport("now-3h",300,"fileRrdTEMP", "DHT22_3h.xml")
                  rrdExport("now-3h",300,"fileRrdHUM", "DHT22Y_3h.xml")
                  #ok 24 hours
                  rrdExport("now-24h",900,"fileRrdTEMP", "DHT22_24h.xml")
                  rrdExport("now-24h",900,"fileRrdHUM", "DHT22Y_24h.xml")
                  • [^] # Re: en changeant la destination des ecritures

                    Posté par . Évalué à 1.

                    GGGGGGrrrrrrrrr

                    ERROR: opening 'fileRrdTEMP': Aucun fichier ou dossier de ce type
                    ERROR: opening 'fileRrdHUM': Aucun fichier ou dossier de ce type
                    ERROR: opening 'fileRrdTEMP': Aucun fichier ou dossier de ce type
                    ERROR: opening 'fileRrdHUM': Aucun fichier ou dossier de ce type
                    ERROR: opening 'fileRrdTEMP': Aucun fichier ou dossier de ce type
                    ERROR: opening 'fileRrdHUM': Aucun fichier ou dossier de ce type
                    ERROR: opening 'fileRrdTEMP': Aucun fichier ou dossier de ce type
                    ERROR: opening 'fileRrdHUM': Aucun fichier ou dossier de ce type
                    ERROR: opening 'fileRrdTEMP': Aucun fichier ou dossier de ce type
                    ERROR: opening 'fileRrdHUM': Aucun fichier ou dossier de ce type

                  • [^] # Re: en changeant la destination des ecritures

                    Posté par . Évalué à 1.

                    Oups  !!! je pense être sur une piste ,On dirait que l'on cherche fileRrdTEMP ou fileRrdHUM alors qu'il faut chercher DHT22_3h.xml et DHT22Y_3h.xml

                    CA doit être ici mon probleme , il n'y a pas un probleme de "

                    # ok extact 3 hours data
                    rrdExport("now-3h",300,"fileRrdTEMP", "DHT22_3h.xml")
                    rrdExport("now-3h",300,"fileRrdHUM", "DHT22Y_3h.xml")
                    #ok 24 hours
                    rrdExport("now-24h",900,"fileRrdTEMP", "DHT22_24h.xml")
                    rrdExport("now-24h",900,"fileRrdHUM", "DHT22Y_24h.xml")
                    • [^] # Re: en changeant la destination des ecritures

                      Posté par . Évalué à 2. Dernière modification le 16/04/15 à 20:52.

                      c'est bien pour cela qu'on a reecrit rrdExport pour qu'il prenne 4 parametres au lieu de 3,

                      def rrdExport(start, step, XMLfile):

                      devient

                      def rrdExport(start, step, RRDfile, XMLfile):

                      le 3e champs devient le fichier source,
                      le 4e devient le XML

                      ca aurait du marcher…

                      va falloir ressortir les "debug" et "print" afin de savoir à quel moment il cherche ca

                      • [^] # Re: en changeant la destination des ecritures

                        Posté par . Évalué à 1.

                        Bonsoir Néox , En supprimant les " de la ligne Temperature

                        rrdExport("now-3h",300,fileRrdTEMP , "DHT22T_3h.xml")

                        les fichiers xml se remplissent

                        Avec la ligne de l'Hygrometrie ,les fichiers xml ne se remplissent pas.

                        rdExport("now-3h",300,fileRrdHUM, "DHT22Y_3h.xml")

                        Et j'ai cette erreur .

                        ERROR: No DS called 'th_dht22' in '/home/www/Graph/data_DHT22Y.rrd'

                        Ce que je ne comprend pas dans tout mes fichiers xml j'ai th_dht22 et hm_dht22. ??

                        <?xml version="1.0" encoding="ISO-8859-1"?>
                        
                        <xport>
                          <meta>
                            <start>1429284300</start>
                            <step>300</step>
                            <end>1429284300</end>
                            <rows>37</rows>
                            <columns>2</columns>
                            <legend>
                              <entry>th_dht22</entry>
                              <entry>hm_dht22</entry>
                            </legend>
                          </meta>
                          <data>
                            <row><t>1429284300</t><v>NaN</v><v>NaN</v></row>
                            <row><t>1429284600</t><v>NaN</v><v>NaN</v></row>
                            <row><t>1429284900</t><v>NaN</v><v>NaN</v></row>
                        
                        
                        • [^] # Re: en changeant la destination des ecritures

                          Posté par . Évalué à 2.

                          Ce que je ne comprend pas dans tout mes fichiers xml j'ai th_dht22 et hm_dht22. ??

                          ca ne devrait plus avec la version de rrdExport avec un seul texte+=...RRDFile

                          tu es sur que les fichiers xml avec encore 2 lignes ne sont pas les vieux fichiers d'avant la modification de rrdExport

                          • [^] # Re: en changeant la destination des ecritures

                            Posté par . Évalué à 1. Dernière modification le 17/04/15 à 21:09.

                            Non non je suis sur j'ai recréer 2 BD data_DHT22T.rrd et data_DHT22Y.rrd , tous les fichiers Xml dont dans webdata dossier virtuel donc je les ai effacé et au lancement de ReadDht22.py il se recréent.
                            Voila avec quoi je crées ma BD

                            #!/usr/bin/env python
                            
                            ''' this routine will create the rrdtool data base 
                                database =>  data_DHT22Y.rrd
                                The data base is used to create chronologic Hygrometrie chart
                            '''
                            
                            import datetime
                            import subprocess
                            
                            
                            
                            
                            #let's create the command for rrdtool
                            #first the rrdtool itself
                            theCMD=['rrdtool','create','data_DHT22Y.rrd']
                            
                            #start the table from first day of this year
                            theCMD.append("--start")
                            theCMD.append("01/01/"+str(datetime.datetime.now().year))
                            theCMD.append("--step")
                            theCMD.append("5")
                            
                            #now let's add all sensors
                            
                            
                            theCMD.append("DS:{}:GAUGE:1200:-40:125".format('hm_dht22'))
                            
                            #and now the AVERAGE,MIN,MAX
                            
                            # last hour  5 seconds  720 points
                            theCMD.append("RRA:AVERAGE:0.5:1:721")
                            theCMD.append("RRA:MIN:0.5:1:720")
                            theCMD.append("RRA:MAX:0.5:1:720")
                            #last 3 hours  30 seconds 360 points
                            theCMD.append("RRA:AVERAGE:0.5:6:360")
                            theCMD.append("RRA:MIN:0.5:6:360")
                            theCMD.append("RRA:MAX:0.5:6:360")
                            #last 48 hours 5 mins  576 points
                            theCMD.append("RRA:AVERAGE:0.5:60:576")
                            theCMD.append("RRA:MIN:0.5:60:576")
                            theCMD.append("RRA:MAX:0.5:60:576")
                            #last week  15 mins  672 points
                            theCMD.append("RRA:AVERAGE:0.5:180:672")
                            theCMD.append("RRA:MIN:0.5:180:672")
                            theCMD.append("RRA:MAX:0.5:180:672")
                            #last month  90 mins   496 points
                            theCMD.append("RRA:AVERAGE:0.5:5400:496")
                            theCMD.append("RRA:MIN:0.5:5400:496")
                            theCMD.append("RRA:MAX:0.5:5400:496")
                            #last year   24Hours  730 points
                            theCMD.append("RRA:AVERAGE:0.5:17280:730")
                            theCMD.append("RRA:MIN:0.5:17280:730")
                            theCMD.append("RRA:MAX:0.5:17280:730")
                            
                            
                            subprocess.call(theCMD)
                            
                            #transfer rrdtool to /webdata
                            
                            theCMD = ['cp', 'data_DHT22Y.rrd', '/webdata/data_DHT22Y.rrd'] 
                            subprocess.call(theCMD)
                            • [^] # Re: en changeant la destination des ecritures

                              Posté par . Évalué à 2.

                              ce programme ne gere que data_DHT22*Y*.rrd

                              tu dois en avoir un autre pour gerer data_DHT22.rrd

                              • [^] # Re: en changeant la destination des ecritures

                                Posté par . Évalué à 1.

                                c'est le même que j'ai adapter pour faire la BD data_DHT22T.rrd dans l'original j'ai les 2 valeurs .

                                #now let's add all sensors
                                
                                theCMD.append("DS:{}:GAUGE:1200:-40:125".format('th_dht22'))
                                theCMD.append("DS:{}:GAUGE:1200:-40:125".format('hm_dht22'))

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.