Hallo zusammen,
vielleicht kann mit jemand hier weiterhelfen, ich möchte eingehende
UDP-Daten (4Bytes je Minute) zusammen mit der aktuellen Systemzeit in
eine Datei speichern. Aus dieser Datei sollen z.b. alle 3 Stunden die
Einträge der letzten 2 Tage ausgelesen und dann grafisch als Bild
angezeigt werden.
Hier habe ich das Problem, die Systemzeit wohl nicht korrekt in die
Datei Speichern zu können. Bei den 4 Eingangsbytes gibt es das Problem
nicht.
Dazu hier der Code, welcher die Zeit in die Datei speichern soll:
1
importtime
2
importsocket
3
importstruct
4
port=80
5
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
6
s.bind(("",port))
7
print("waiting on port:",port)
8
is_negative=0
9
temp=0
10
temp_float=1.0
11
datatype='ff'
12
while(1):
13
14
data,addr=s.recvfrom(1024)
15
temp=int.from_bytes(data,"big",signed=False)
16
temp_float=temp/10.0
17
wr=struct.pack('ff',time.time(),temp_float)
18
print("Type of wr : "+str(type(wr)))
19
print("wr: "+str(wr))
20
print("Original value of time.time() : "+str(time.time()))
21
print("Type of time.time() : "+str(type(time.time())))
22
local=time.localtime(time.time())
23
#print("Read entry[0].localtime : " + str(local))
24
print("Decoded Time entry[0].localtime.asciitime: "+str(time.asctime(local)))
Wie man sieht sind die gelsenen Bytes z.b. jB\xc1N33\xafA mit den
geschriebenen identisch.
Im letzten Eintrag wird die Zeit: 1621177600.0 gelesen, jedoch war die
wahre Sytemzeit: 1621177554.720464
Dies führt dazu, dass demnach Sun May 16 17:05:54 2021 geschrieben
wurde, jedoch immer eine zeit zu Beginn der Computerzeit: Thu Jan 1
01:01:46 1970
gelesen wird.
Zumindest denke ich dass es so ist.
Hat jeman vielleicht eine Idee, wie man das beheben kann, oder an was es
sonst liegt?
Schöne Grüße,
Michael
Schreiben/Lesen ist nicht dein Problem, der Unix timestamp taucht ja
beim Lesen wieder auf.
'entry' ist nicht das, was du erwartest (du unpackst nur für die eine
Log-Ausgabe).
entry[0] ist deshalb das 'j' (ASCII 106).
Damit landest du 106 Sekunden (1 min 46 sec) nach Unix timestamp 0.
Moskito schrieb:> Schreiben/Lesen ist nicht dein Problem, der Unix timestamp taucht ja> beim Lesen wieder auf.>> 'entry' ist nicht das, was du erwartest (du unpackst nur für die eine> Log-Ausgabe).> entry[0] ist deshalb das 'j' (ASCII 106).> Damit landest du 106 Sekunden (1 min 46 sec) nach Unix timestamp 0.
Vielen Dank für den Hinweis, nun kommen keine völlig falschen Zeiten
mehr heraus.
Ein Problem besteht jedoch noch, es wird immer eine ganze Zahl an
Einträgen mit zwar unterschiedlichen und korrekten 4Bytes, jedoch mit
falschem (gruppiertem) Zeitstempel ausgelesen. Also haben z.b. 20 Werte
eine identische Zeit, die nächsten 20 Werte wieder eine identische Zeit,
in meinem aktuellen Fall mit 10Sec/Nachricht ca. 2Min später haben.
Hier sehe ich noch ein Problem mit der Wandlung/Packung der Zeit durch
das Struct beim Schreiben.
Prinzipiell sind lese+schreibbytes identisch, jedoch sind die
Eingabezeiten immer mit Nachkommastellen, die Ausgabezeiten immer mit
xxxx.0 sozusagen abgeschnitten. Ich denke daher kommt das, werde ich mir
morgen ansehen.
Oder, wenn jemand da mehr wüsste wäre das auch schon toll :)
Grüße,
Matthias
Michael schrieb:> vielleicht kann mit jemand hier weiterhelfen, ich möchte eingehende> UDP-Daten (4Bytes je Minute) zusammen mit der aktuellen Systemzeit in> eine Datei speichern. Aus dieser Datei sollen z.b. alle 3 Stunden die> Einträge der letzten 2 Tage ausgelesen und dann grafisch als Bild> angezeigt werden.
Auch wenn die Antwort, vielleicht ein wenig OT ist, warum willst du das
selbst machen? Influxdb, ist genau für solche Einsätze erfunden worden
und es gibt schöne Frontends um die Daten hübsch darzustellen. Grafana
zum Beispiel (auch wenn das mit Kanonen auf Spatzen schießen ist, wenn
es nur um diese Messreihe geht)
Im Besten fall musst du nur ein kleines Pythonscript schrieben, was die
UDP Daten empfängt und an die Influxdb sendet, welche sich um den
Zeitstempel und die passenden Bilder für dich kümmert.