73 lines
2.8 KiB
Python
73 lines
2.8 KiB
Python
import json
|
|
import os
|
|
import serverrequests as serverrequests
|
|
import JsonHandling
|
|
import energymeter
|
|
import energyproducer
|
|
import energyuser
|
|
import datetime
|
|
|
|
class JsonHandling:
|
|
|
|
@staticmethod
|
|
def check_config_has_changed(json_data):
|
|
data = json.loads(json_data)
|
|
return data["metadata"]["config_has_changed"] == "1"
|
|
|
|
|
|
|
|
class DataCollector:
|
|
def __init__(self):
|
|
self.data = {}
|
|
self.now = datetime.datetime.now()
|
|
|
|
def collect_and_store_data(self, producer_values, meter_values, user_values, last_data=None):
|
|
# Überprüfe, ob die Minute gleich geblieben ist, um Daten zu sammeln
|
|
if self.now.minute == datetime.datetime.now().minute:
|
|
return
|
|
self.now = datetime.datetime.now()
|
|
|
|
# Aktuellen Zeitstempel holen
|
|
timestamp = self.now.strftime("%Y-%m-%d %H:%M")
|
|
self.data[timestamp] = {
|
|
"producer_values": {},
|
|
"meter_values": {},
|
|
"user_values": {}
|
|
}
|
|
|
|
# Alle Werte in ein einzelnes Dictionary zusammenführen
|
|
all_values = {"producer_values": producer_values, "meter_values": meter_values, "user_values": user_values}
|
|
|
|
# Alle Werte aktualisieren
|
|
for key, values in all_values.items():
|
|
self.update_values(self.data[timestamp][key], values)
|
|
|
|
# Filtere Werte basierend auf dem letzten mitgegebenen Zeitstempel
|
|
if last_data:
|
|
# Konvertiere den letzten Zeitstempel in ein datetime-Objekt
|
|
last_data = datetime.datetime.strptime(last_data, "%Y-%m-%d %H:%M")
|
|
# Entferne alle Einträge in self.data, die vor dem letzten Zeitstempel liegen
|
|
self.data = {ts: values for ts, values in self.data.items() if datetime.datetime.strptime(ts, "%Y-%m-%d %H:%M") > last_data}
|
|
|
|
# Begrenze die Daten auf die letzten 24 Stunden (1440 Minuten)
|
|
timestamps_sorted = sorted(self.data.keys(), reverse=True)
|
|
if len(timestamps_sorted) > 1440:
|
|
timestamps_to_remove = timestamps_sorted[1440:]
|
|
for timestamp_to_remove in timestamps_to_remove:
|
|
del self.data[timestamp_to_remove]
|
|
|
|
# Daten als JSON speichern
|
|
with open("data.json", "w") as file:
|
|
json.dump(self.data, file)
|
|
|
|
def update_values(self, current_values, new_values):
|
|
for key, value in new_values.items():
|
|
if key not in current_values:
|
|
current_values[key] = value
|
|
else:
|
|
# Überprüfen, ob der Wert bereits eine Liste ist
|
|
if not isinstance(current_values[key], list):
|
|
# Wenn nicht, konvertieren Sie ihn in eine Liste
|
|
current_values[key] = [current_values[key]]
|
|
# Füge den neuen Wert der Liste hinzu
|
|
current_values[key].append(value) |