Сохранять значения даты и времени для использования с gviz api - PullRequest
0 голосов
/ 24 марта 2020

У меня есть приложение python, которое собирает данные у брокера MQTT и представляет их веб-сайту через API gviz python:


DESCRIPTION= [      \
              ('Zeit', 'datetime'),     \
              ('Temperatur', 'number'),  \
              ('Feuchtigkeit', 'number'),\
              ('Batterie', 'number')    \
              ]

def sendAnswer(conn):
#protect against the data supplier
    Mutex.acquire()
    Trans = deepcopy(DatArr)
    Mutex.release()
#create and populate the DataTable    
    data_table = gviz_api.DataTable(DESCRIPTION)
    data_table.LoadData(Trans)
    Answer = data_table.ToJSon()
#send ti to the webserver
    lng = len(Answer)
    try:
        conn.sendall(bytes("L{:06d};".format(lng),"UTF-8"))
        conn.sendall(bytes(Answer,"UTF-8"))
    except BaseException:
        # if anything goes wrong, try again next time
        pass

def on_message(client, userdata, message):
    global Last, DatArr
#get the data from the broker
    cur = json.loads(str(message.payload, encoding='utf-8'))
    if cur == Last and len(DatArr)>2 : return
    now = datetime.now()
# protect against the webserver
    Mutex.acquire()
#add the data
    DatArr.append([now, cur["temp"], cur["hum"], cur["bat"]])
#cleanup old values
    Last = cur
    for i in range(len(DatArr)):
        if now - DatArr[0][0] > timedelta(days=1): 
            DatArr.pop(0) 
        else:
            break
    Mutex.release()

Это работает, но вместо того, чтобы хранить данные в переменная python, которую я хочу сохранить в файле (предпочтительно JSON). Но я не могу JSON .dump () переменную datetime и не могу .LoadData () строку в таблицу данных gviz. В python gviz также отсутствует функция addRow (). Любые предложения?

Большое спасибо заранее!

1 Ответ

0 голосов
/ 25 марта 2020

На основе ответов на этот вопрос: JSON дата / время между Python и JavaScript Я нашел решение и реализовал его в модуле python:

import json
import datetime

class DateTimeJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return dict(nested_datetime=obj.isoformat())
        else:
            return super(DateTimeJSONEncoder, self).default(obj)

def datetime_decoder(d):
    if len(d) == 1 and 'nested_datetime' in d: 
        return datetime.datetime.strptime(d['nested_datetime'], '%Y-%m-%dT%H:%M:%S.%f')
    result = {}
    for prop in d:
        if isinstance(d[prop], dict):
            result[prop] = datetime_decoder(d[prop])
        else:
            result[prop] = d[prop]
    return result

Класс и функция go в качестве именованных параметров для функций json .dump и json .load, например:

 DatArr = json.load(DatFile, object_hook=djson.datetime_decoder)

и

json.dump(DatArr, DatFile, cls=djson.DateTimeJSONEncoder)

This сохраняется прежняя глобальная переменная DatArr в файле json DatFile. Спасибо всем, кто написал этот вопрос за предоставленную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...