import sys
import os
import time
import datetime
from csv import reader
import json
try:
# Intervall in Sekunden für das Prüfen der CSV-Datei:
intvPoll = 10
# Anzahl von Datensätzen, die aus der
# CSV-Datei übernommern werden sollen:
nrData = 10
# Intervall in Sekunden, in dem die CSS-Datei
# aktualisiert wird:
intvCsv = 600 # 10 Minuten
# Parameter in der CSV-Datei
# Schlüssel: Frei wählbarer Name
# Wert: Der Index in der CSV-Zeile
confParams = {
'AIN': 0,
'Spannung': 1,
'Leistung': 2,
'Zaehlerstand': 3,
'Temperatur': 4,
'Datum': 5,
'Zeit': 6
}
# AIN der Steckdose, die gelesen werden soll:
ainToRead = '116570450402'
# Dateiname der CSV-Datei:
filenameInCsv = 'DectRead_test.csv'
filenameOutJson = 'dect-read.json'
# Ab hier braucht nichts mehr geändert zu werden
# Zeitraum, innerhalb dessen Daten übernommen werden sollen
# bzw. maximales Alter der Daten:
maxAge = nrData * intvCsv
# Verzeichnis dieser Skriptdatei ermitteln:
dir = os.path.dirname(os.path.realpath(__file__))
# Wir gehen davon aus,
# dass Skript und CSV-Datei im selben Verzeichnis liegen:
pathIn = dir + '\\' + filenameInCsv
pathOut = dir + '\\' + filenameOutJson
# Merker für Zeitstempel:
tim = 0
# Endlosschleife:
while True:
# Zeit der letzten Änderung der CSV-Datei ermitteln:
mtime = os.path.getmtime(pathIn)
# Hat sich die Zeit geändert?
if(mtime > tim):
# Neue Zeit merken:
tim = mtime
now = datetime.datetime.now()
# CSV-Datei öffnen:
with open(pathIn, 'r') as fileIn:
output = []
# pass the file object to reader() to get the reader object
csv_reader = reader(fileIn)
# Iterate over each row in the csv using reader object
for row in csv_reader:
# row variable is a list that represents a row in csv
# print(row)
# Zeit für die aktuelle Zeile ermitteln:
timeRow = datetime.datetime.strptime(
row[confParams['Datum']] + 'T' + row[confParams['Zeit']], "%Y-%m-%dT%H:%M:%S")
# Alter der Daten ermittteln durch Subtrahieren der Zeit der Zeile
# von der Jetzt-Zeit:
ageRow = (now - timeRow).total_seconds()
# Ist das Alter der Zeile kleiner als das konfigurierte maximale?
if ageRow < maxAge:
# Gilt die Zeile für die Steckdose, die übertragen werden soll?
if row[confParams['AIN']] == ainToRead:
# Alle Parameter zum Ausgabe-Array hinzu fügen:
params = {}
for key in confParams:
params[key] = row[confParams[key]]
output.append(params)
# Ausgabe-Array in JSON kodieren:
with open(pathOut, 'w') as fileOut:
fileOut.write(json.dumps(output))
# Konfigurierte Zeit warten:
time.sleep(intvPoll)
except:
print("Error at line", sys.exc_info()[2].tb_lineno, sys.exc_info())
# Zum testen, damit wir die Fehleranzeigen zu Gesicht bekommen:
input()