Tengo este código donde leo los resultados de otros scripts y luego los ingreso en una base de datos. Además, se agrega una marca de tiempo.

    import time
    import os
    import subprocess
    import sys
    from time import sleep
    import datetime
    import sqlite3
    import fnmatch, shutil

    sensorID = "1"
    dbname = 'sensorsData.db'

    t = time.localtime()
    timestamp = time.strftime('%Y-%m-%d %H:%M:%S', t)


    refresh = 300 #time in seconds , getting new data from sensors

    #get data from sensor
    def gettemp():
        temp = subprocess.check_output("sudo python /home/pi/AIRQMONITOR/temp.py", shell=True)
        print(timestamp)
        return(temp)
    def getpm25():
        pm25 = subprocess.check_output("sudo python /home/pi/AIRQMONITOR/pm2.py", shell=True)
        return (pm25)
    def getpm10():
        pm10 = subprocess.check_output("sudo python /home/pi/AIRQMONITOR/pm10.py", shell=True)
        return (pm10)
    def getco():
        co = subprocess.check_output("sudo python /home/pi/AIRQMONITOR/co.py", shell=True)
        return(co)
#log data
    def logdata(temp,co,pm25,pm10):
        conn = sqlite3.connect(dbname)
        curs=conn.cursor()
        curs.execute("INSERT INTO sensors values(?,?,?,?,?)", (timestamp, temp, co, pm25, pm10))
        curs.execute("INSERT INTO temperatures values(?,?,?)", (timestamp, sensorID, temp ))
        curs.execute("INSERT INTO co values(?,?,?)", (timestamp, sensorID, co ))
        curs.execute("INSERT INTO pm25 values(?,?,?)", (timestamp, sensorID, pm25 ))
        curs.execute("INSERT INTO pm10 values(?,?,?)", (timestamp, sensorID, pm10 ))
        conn.commit()
        conn.close()

#main
    def main():
        while True:
            temp = gettemp()
            pm25 = getpm25()
            pm10 = getpm10()
            co = getco()
            logdata(temp, co, pm25, pm10)
            time.sleep(refresh)

#-----execute program... gooo!
main()

Pero, en cada bucle, se genera la misma marca de tiempo de la primera ejecución:

terminal outputs showing same timestamp after 3 loops

¿Cómo puede ser esto? ¡Gracias por adelantado!

1
ROLDXR 7 oct. 2019 a las 14:29

4 respuestas

La mejor respuesta

Ejecutas estas líneas al comienzo de tu código:

t = time.localtime()
timestamp = time.strftime('%Y-%m-%d %H:%M:%S', t)

Estos solo se ejecutan una vez (no en un bucle) y la marca de tiempo en ellos nunca cambia. Si desea actualizar la marca de tiempo, debe hacer que esas líneas formen parte de su ciclo, o mejor aún, use una función:

def get_timestamp():
    t = time.localtime()
    return time.strftime('%Y-%m-%d %H:%M:%S', t)

Y reemplácelo cada vez que intente usar timestamp con get_timestamp()

3
Ofer Sadan 7 oct. 2019 a las 11:33

Supongo que el problema es que deberías llamar a la función utilizada

timestamp = time.strftime('%Y-%m-%d %H:%M:%S', t)    

Cada vez que se llama a la función externa, pero simplemente guarde el valor de este punto específico en el tiempo e imprímalo repetidamente.

def gettemp():
    temp = subprocess.check_output("sudo python /home/pi/AIRQMONITOR/temp.py", shell=True)
    print(time.strftime('%Y-%m-%d %H:%M:%S', t) )
    return(temp)

Esto debería funcionar.

1
rokuda 7 oct. 2019 a las 11:34

timestamp se usa en varios métodos, así que defínalo como una variable global en el método main para poder actualizar su valor y Restablecer timestamp dentro del ciclo while en cada iteración :

def main():
    global timestamp 
    while True:
       timestamp = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
       temp = gettemp()
       pm25 = getpm25()
       pm10 = getpm10()
       ...
       ...

Pero mantenga las primeras líneas en la parte superior del archivo para mantener timestamp una variable global:

sensorID = "1"
dbname = 'sensorsData.db'

# temestamp should stay a global variable
timestamp = None
1
Charif DZ 7 oct. 2019 a las 11:40

Debe crear una función para calcular la marca de tiempo, digamos get_timestamp():

def get_timestamp():
    t = time.localtime()
    return time.strftime('%Y-%m-%d %H:%M:%S', t)

Después de eso, debe llamar a get_timestamp en su función main:

def main():
    while True:
        temp = gettemp()
        pm25 = getpm25()
        pm10 = getpm10()
        co = getco()
        timestamp = get_timestamp()
        logdata(temp, co, pm25, pm10,timestamp)
        time.sleep(refresh)

Todo lo que necesita ahora es cambiar el logdata para que tome la marca de tiempo como entrada:

def logdata(temp,co,pm25,pm10,timestamp):
    conn = sqlite3.connect(dbname)
    curs=conn.cursor()
    curs.execute("INSERT INTO sensors values(?,?,?,?,?)", (timestamp, temp, co, pm25, pm10))
    curs.execute("INSERT INTO temperatures values(?,?,?)", (timestamp, sensorID, temp ))
    curs.execute("INSERT INTO co values(?,?,?)", (timestamp, sensorID, co ))
    curs.execute("INSERT INTO pm25 values(?,?,?)", (timestamp, sensorID, pm25 ))
    curs.execute("INSERT INTO pm10 values(?,?,?)", (timestamp, sensorID, pm10 ))
    conn.commit()
    conn.close()

Y elimine las siguientes líneas de su código:

t = time.localtime()
timestamp = time.strftime('%Y-%m-%d %H:%M:%S', t)
1
Mohsen_Fatemi 7 oct. 2019 a las 11:39
58268688