Serial plotter, logger und log plotter

Du hast eine Idee für ein Projekt?
Antworten
RIN67630
User
Beiträge: 91
Registriert: Sonntag 29. April 2018, 08:07

Hallo,

wir (Gordon999 und ich) sind vielleicht noobs in Python, wir haben jedoch schon größeres erreicht, als es sonst in Python für diese Aufgabe in Github gibt.
https://github.com/Gordon999/Pi-Arduino_Ser_Plotter

wir tüfteln im Moment an eine Python Scriptreihe, die folgendes Ziel hat.

a) von einer serielle Schnittstelle, die im Sekundentakt Daten wie folgt sendet:

Code: Alles auswählen

h time, Avg, Fast, Slow, Min, Max
d 01:00:00 42.46 33.24 33.69 32.56 33.91
d 01:00:01 42.46 33.74 33.72 32.73 37.10
d 01:00:02 42.46 33.74 33.73 33.07 34.58
d 01:00:04 42.46 33.57 33.63 33.24 34.24
....
erzeugen wir einen dynamischen "scrollender" Echtzeit - Maptplotlib Plot wie folgt.
Bild

Gleichzeitig werden die Daten fortlaufend in einem täglichen Log mit Name yy-mm-dd.log protokolliert.
Ein Beispiel hierfür gibt es hier:
https://www.cjoint.com/c/JCmrBtJBWj1

Ein weiterer Python-Skript kann dann aus dieser Logdaten aus der Vergangenheit zu einer bestimmte Uhrzeit/Datum die Daten wieder zurückholen und sie in identischer Weise, wie der Echtzeit - Maptplotlib Plot präsentieren.
Matürlich muss man berücksichtigen, dass der Log kleine und große Lücken, sowie Duplikate enthält.

Unsere Programmierung ist sicherlich "haarsträubend schlecht", alles anderes als zeitlich optimiert, aber die Aufgabe wird erfüllt.

Wir laden jeden ein, der konstruktiv am Code beitragen möchte, und sich in englischer Sprache ausdrücken kann, uns zu helfen.
Vielen Dank im Voraus
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Logplotter19.py, Logplotter22 py und Pi-Arduino_Ser_Plotter.py sehen alle sehr ähnlich aus, wobei letzteres noch sehr roh aussieht. Versionskontrollsysteme sind dazu da, den Überblick über viele Versionen zu behalten. Es sollte also nur eine Datei geben. Im weiteren beziehe ich mich auf die neuste Version Logplotter22.
Kommentare wie "getting libearies" oder "setting variables" sind überflüssig. *-Importe sind schlecht, weil sie unkontrolliert Namen in den eigenen Namensraum schaufeln. Zumal tkinter schon in der passenden Form importiert wird. as ist dazu da, dass man Namen umbenennt, animation wird aber gar nicht umbenannt.
initUI ist unnötig, weil auch alles in __init__ stehen könnte. Zumindest plot params gehören in eine eigene Funktion. Benutze keine Abkürzungen. Und keine durchnummerierten Namen. Die Start- und Endzeiteinfabefelder sind doppelter Code, der am besten durch eine eigene Klasse ersetzt wird, dann ist die init-Funktion auch nicht ganz so lang. Keine magischen Zahlen wie in self.legend.
In `Plot` setzt du erst Stunde und Minute als String zusammen, zum das dann wieder als Stunde und Minute zu parsen? Erzeuge direkt DateTime-Objekte. Datum und Uhrzeit sollten nicht getrennt gespeichert werden. Pfade setzt man nicht mit + zusammen, sondern benutzt das pathlib-Modul.
Dass man Threads und GUI nicht mischen darf, wurde Dir schon gesagt. Locks realisiert man auch nicht mit Zahlen und sleep.
In `read_plot`: das sollte eine eigenständige Funktion sein, weil sie nichts mit der GUI zu tun haben sollte. Auf with und enumerate beim Lesen der Datei wurdest Du auch schon hingewiesen.
Awk hast du ja inzwischen raus, aber sed ist genauso überflüssig. Und nochmal: so benutzt man subprocess nicht. Was soll das mit poll, wenn du eh auf das Ende des Programms wartest, nimm gleich run. Aber nochmal, warum speichert du die gefilterten Zeilen nicht schon beim ersten Lesen?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@RIN67630 Deine Beiträge hier deuten eher darauf hin, dass konstruktive Beiträge zum Code nicht gewünscht sind. Zumindest sind die alle nicht umgesetzt.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit bokeh oder qt charts gibt es doch schon Lösungen dafür. Was macht eure besser?
RIN67630
User
Beiträge: 91
Registriert: Sonntag 29. April 2018, 08:07

__deets__ hat geschrieben: Montag 16. März 2020, 09:13 Mit bokeh oder qt charts gibt es doch schon Lösungen dafür. Was macht eure besser?
das ist doch nicht dein Ernstes? :shock:
hast du überhaupt gemerkt,
  • dass hinter Bokeh absolut nichts steht, das Projekt ist seit fünf Jahren tot
  • dass qtcharts ein in c# geschriebenes Programm für Windows ist?
am ehesten käme noch
https://github.com/patou01/py_serialPlot
infrage,
aber hier gibt es -außer ein schlicht gehaltenen Plot- nichts anderes.
- keine Uhrzeiten in der X-Achse
- Kein Log
- und dann erst recht nicht ein Log-Plotter.

Wir haben aus diesem Projekt paar Zeilen code geborgen, aber das war's auch schon, der Autor interessiert sich auch nicht mehr dafür.
RIN67630
User
Beiträge: 91
Registriert: Sonntag 29. April 2018, 08:07

sparrow hat geschrieben: Montag 16. März 2020, 09:09 @RIN67630 Deine Beiträge hier deuten eher darauf hin, dass konstruktive Beiträge zum Code nicht gewünscht sind. Zumindest sind die alle nicht umgesetzt.
Das ist der falschen Eindruck. Wir sind keine Python experte, und müssen uns erst mal durch die für uns nicht immer verständlichen Hinweise durcharbeiten.
Das dauert halt. Außerdem, arbeite ich mit Gordon999 schon länger zusammen, mit Frontalangriffe auf seine Arbeit würde ich den nur vergrämen.
Mit klaren Code-Beispiele wie es Sirius getan hat, kommen wir schneller zum Ziel.
...und lernen auch schneller, es richtig zu tun.
Zuletzt geändert von RIN67630 am Montag 16. März 2020, 15:44, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Doch, das ist mein Ernst. Und du hast leider komplett daneben gegriffen mit deinen doch recht starken Aussagen, wenn ich das mal so anmerken darf.

Changelog von Bokeh, https://github.com/bokeh/bokeh/blob/2.0.0/CHANGELOG, letzter Eintrag 2.3.2020. Du kennst dich jetzt ja ein bisschen aus mit Datumsberechnung, ist 16.3.2020 - 2.3.2020 >= 5 Jahre?

Und Qt ist in C++, nicht C# geschrieben. Hat eigene Charting-Komponenten, die ich aber nicht meinte, sondern das hier: https://github.com/pyqtgraph/pyqtgraph/ ... /CHANGELOG

Und Qt kann man natuerlich mit PyQt oder PySide benutzen.

Letztes Release im Dezember 2019.

Beides sind konzeptionell Echtzeit-Rendering-unterstuezende Charting Loesungen. Matplotlib war und ist das nie gewesen. Und darum auch meine Frage, wie ihr auf diese doch eher wenig geeignete Wahl kamt. Aber offensichtlich weisst du's besser... mindestens seit 5 Jahren!
RIN67630
User
Beiträge: 91
Registriert: Sonntag 29. April 2018, 08:07

Sirius3 hat geschrieben: Montag 16. März 2020, 06:51 Logplotter19.py, Logplotter22 py und Pi-Arduino_Ser_Plotter.py sehen alle sehr ähnlich aus, wobei letzteres noch sehr roh aussieht. Versionskontrollsysteme sind dazu da, den Überblick über viele Versionen zu behalten. Es sollte also nur eine Datei geben. Im weiteren beziehe ich mich auf die neuste Version Logplotter22.
Logplotter19.py, Logplotter22 py wird Gordon wahrscheinlich wieder zusammenführen. das ist der Log-Plotter.
Pi-Arduino_Ser_Plotter.py hat eine ganz andere Funktion, das ist der Serial Plotter.
Kommentare wie "getting libearies" oder "setting variables" sind überflüssig. *-Importe sind schlecht, weil sie unkontrolliert Namen in den eigenen Namensraum schaufeln. Zumal tkinter schon in der passenden Form importiert wird. as ist dazu da, dass man Namen umbenennt, animation wird aber gar nicht umbenannt.
initUI ist unnötig, weil auch alles in __init__ stehen könnte. Zumindest plot params gehören in eine eigene Funktion. Benutze keine Abkürzungen. Und keine durchnummerierten Namen. Die Start- und Endzeiteinfabefelder sind doppelter Code, der am besten durch eine eigene Klasse ersetzt wird, dann ist die init-Funktion auch nicht ganz so lang. Keine magischen Zahlen wie in self.legend.
Das kommt alles noch, lass uns noch etwas Zeit.
In `Plot` setzt du erst Stunde und Minute als String zusammen, zum das dann wieder als Stunde und Minute zu parsen? Erzeuge direkt DateTime-Objekte. Datum und Uhrzeit sollten nicht getrennt gespeichert werden. Pfade setzt man nicht mit + zusammen, sondern benutzt das pathlib-Modul.
Die Idee war dabei, die Suche im Log mit reiner Text zu machen, das sollte schneller sein.
Der Log ist auch (noch) voller Lücken und Dubletten. Auch das ist eine Baustelle
Dass man Threads und GUI nicht mischen darf, wurde Dir schon gesagt. Locks realisiert man auch nicht mit Zahlen und sleep.
In `read_plot`: das sollte eine eigenständige Funktion sein, weil sie nichts mit der GUI zu tun haben sollte. Auf with und enumerate beim Lesen der Datei wurdest Du auch schon hingewiesen.
Awk hast du ja inzwischen raus, aber sed ist genauso überflüssig. Und nochmal: so benutzt man subprocess nicht. Was soll das mit poll, wenn du eh auf das Ende des Programms wartest, nimm gleich run. Aber nochmal, warum speichert du die gefilterten Zeilen nicht schon beim ersten Lesen?
Das Ganze ist historisch gewachsen, das erste Programm ist Pi-Arduino_Ser_Plotter.py, das die Daten Zeile für Zeile aus einer serielle Schnittstelle bekommt.
Es war vielleicht nicht so glücklich, den nachgelagerten Log-Plotter auf dieser Basis aufzubauen, statt es komplett neu zu schreiben.

Eigentlich braucht Pi-Arduino_Ser_Plotter.py, unbedingt threading und animate(), Logplotter22 py könnte im Gegenteil wahrscheinlich viel effizienter sein, wenn es flach geschrieben ist und nur den statischen Anteil von Matplotlib verwendet.
Ich weiß, das ganze ist für mich eine Nummer zu groß, aber daran wächst man ja.
Das versuche ich jetzt gerade, kann aber auch nicht in Gordons code so rumfuschen, wie ich es möchte, zumeist sein Programm ziemlich konfus ist und ich es noch nicht immer vollständig verstanden habe.
[/quote]
Zuletzt geändert von RIN67630 am Montag 16. März 2020, 16:16, insgesamt 1-mal geändert.
RIN67630
User
Beiträge: 91
Registriert: Sonntag 29. April 2018, 08:07

__deets__ hat geschrieben: Montag 16. März 2020, 15:39 Changelog von Bokeh, https://github.com/bokeh/bokeh/blob/2.0.0/CHANGELOG, letzter Eintrag 2.3.2020. Du kennst dich jetzt ja ein bisschen aus mit Datumsberechnung, ist 16.3.2020 - 2.3.2020 >= 5 Jahre?
Upss!, Verzeihung, "Bokeh" gibt es bei Github zweimal und ich war auf dem falschen Pfad.
ich muss mir das noch anschauen, danke für den Hinweis.

P.S. die Funktion habe ich jetzt gerade überflogen. Habe ich es falsch verstanden, dass Bokeh auf der gleicher Ebene wie MatPlotlib steht?
Gibt es hier eine Funktion um serielle Daten dynamisch in einem fließenden Plot darzustellen?
Gleichzeitig auch ein Protokoll erstellen und
aus diesem Protokoll wiederum ein Plot zu generieren? (wahrscheinlich dieses Letzte schon, wenn auch nicht mit Datum und Zeitselektion)
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

@RIN67630: Ihr wisst wie Versionsverwaltungssysteme funktionieren? Dass sie genau dazu da sind die Versionen und die Entwicklung einer Datei zu dokumentieren? Das, was ihr da macht, dieses Durchnummerieren von Dateien, macht alle Vorteile zunichte. Github ist nämlich nicht nur dazu da, Zeilennummern vor den Code zu schreiben.

Und jetzt mal bei all den anderen Sachen im Code, die da kaputtt sind:

Ihr öffnet eine Datei (und schließt sie potentiell nicht, weil ihr hier vergesst, dass es with gibt, was ihr aber andererors verwendet).
Dann lest ihr daraus jede einzelne Zeile um sie auf einen Inhalt zu prüfen.
Dann ruft ihr völlig falsch ein externes Programm auf, um das noch einmal alle Zeilen lesen zu lassen und einen Teil davon unverändert in eine Datei zu schreiben zu lassen.
Dann öffnet ihr diese externe Datei um sie erneut Zeile für Zeile durchzugehen.

Da muss euch doch beim Ansehen schon auffallen, dass der Vorgang absolut unsinnig ist.
Wenn ihr das nicht aus dem Code lesen könnt (was ich verstehen kann, denn der ist nicht einfach zu lesen), dann muss euch das doch auffallen, wenn ihr versucht zu erklären, was der Code macht. Und da kommt euch das nicht völlig kaputt vor?
RIN67630
User
Beiträge: 91
Registriert: Sonntag 29. April 2018, 08:07

sparrow hat geschrieben: Montag 16. März 2020, 16:43 Und da kommt euch das nicht völlig kaputt vor?
hier werde ich nicht widersprechen.
Es ist blöd geschrieben, es gibt dringend Handlungsbedarf, um es besser zu machen.
Es ist wahrscheinlich so schlimm, dass es am besten komplett neu geschrieben werden sollte.

Nur:

1) ich brauche es.
2) es funktioniert, zwar langsam und total suboptimal, aber es erfüllt die Funktion komplett.
3) ich kann es (noch) nicht besser schreiben und brauche für jeden Schritt Stunden, weil mir die Erfahrung fehlt und die Python Dokumentation teilweise so verständlich geschrieben ist, wie das deutsche Einkommensteuergesetz.
4) ich habe auch nichts gefunden, das über einen anderen Weg mich besser zum Ziel bringen würde.

P.S. meinen neuen -ganz flachen- Ansatz habe ich auch als Mock-up in Gordons Github eingestellt. Es dient mir zuerst mit sehr viele Print-Anweisungen um das Schritt für Schritt Verstehen...
es endet im Moment mit dem Aufruf von sed. Das soll aber nicht so bleiben...
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Juhu, jetzt gibt es eine Version 23!
RIN67630
User
Beiträge: 91
Registriert: Sonntag 29. April 2018, 08:07

Das haben wir jetzt auch bereinigt. Wie schon angekündigt: wir lernen und coden langsam...
Ich werde die Diskussion im Wissenschaftlichen Rechnen-Forum fortsetzen, weil die Thematik sich doch jetzt sehr auf Matplotlib konzentriert.
viewtopic.php?f=30&t=47998
Antworten