python - цикл выводит одну и ту же метку времени каждый раз - PullRequest
1 голос
/ 07 октября 2019

У меня есть этот код, где я читаю выходные данные из других сценариев, а затем вводю их в базу данных. Кроме того, добавляется временная метка.

    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()

Но в каждом цикле выводится одна и та же временная метка из первого цикла:

terminal outputs showing same timestamp after 3 loops

Как это может быть? Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 07 октября 2019

Вы запускаете эти строки в начале вашего кода:

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

Они запускаются только один раз (не в цикле), а отметка времени в них никогда не изменяется. Если вы хотите обновить временную метку, вы должны сделать эти строки частью вашего цикла или, что еще лучше, использовать функцию:

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

И заменять каждый раз, когда вы пытаетесь использовать timestamp с get_timestamp()

1 голос
/ 07 октября 2019

Вам нужно создать функцию для вычисления метки времени, скажем, get_timestamp():

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

, после чего вам нужно вызвать get_timestamp в вашей функции 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)

все, что вам сейчас нужно, это изменить logdata так, чтобы в качестве входных данных использовалась метка времени:

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()

и удалить из кода следующие строки:

t = time.localtime()
timestamp = time.strftime('%Y-%m-%d %H:%M:%S', t)
1 голос
/ 07 октября 2019

Я думаю, проблема в том, что вам нужно будет вызывать используемую функцию

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

каждый раз, когда вызывается внешняя функция, но вы просто сохраняете значение этого конкретного момента времени и печатаетеэто неоднократно.

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)

Это должно сработать.

1 голос
/ 07 октября 2019

timestamp используется в нескольких методах, поэтому определите его как переменную global в методе main, чтобы иметь возможность обновлять его значение и сбрасывать timestamp внутри цикла while на каждой итерации:

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

Но оставьте первые строки в верхней части файла, чтобы оставить timestamp глобальной переменной:

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

# temestamp should stay a global variable
timestamp = None
...