2. Erweiterung Spannungsmessung um Live-Plot

2.1. Einleitung

In unserem vorherigen Projekt (Projekt 1) haben wir eine Spannungsmessung mit Hilfe eines Raspberry Pi Zero 2W und eines INA219 Moduls durchgeführt. Der Fokus lag hierbei auf dem Umgang mit der Hardware und zu lernen, wie derartige Module über Code angesprochen werden und die gelieferten Daten verarbeitet werden können. Ein wichtiger Aspekt, der im letzten Projekt recht statisch umgesetzt wurde, war die Visualisierung der Messungen in einem Graphen. Während zuvor erst bei Abbruch des Skripts ein Graph generiert und direkt auf dem Raspberry Pi gespeichert wurde, lag der Fokus dieses Projekts darin, die Messungen in Echtzeit grafisch darzustellen und diese auch für andere Geräte erreichbar zu machen.
Dies haben wir mittels einer Dash Webanwendung umgesetzt.

2.2. Grundlagen

2.2.1. Frameworks

Für das Visualisieren von Daten in Python gibt es eine Menge Frameworks, die jeder Vor- und Nachteile mit sich bringen. Ein Vergleich der Open Source Frameworks Dash, Streamlit, Bokeh, Panel und Voilà hat folgendes ergeben. Dash ist für komplexe, skalierbare und anpassbare Dashboard, bei denen volle Kontrolle über Layout und Interaktivität bedeutend sind. Streamlit hingegen ist die beste Wahl für schnelle Prototypen, kleinere Apps und Präsentationen bei denen Einfachheit und Geschwindigkeit im Fokus liegen. Bokeh und Panel wiederum sind optimal um große Datenmengen, Streaming oder eine Integration in Jupyter Notebooks benötigt werden. Voilà eignet sich insbesondere um bestehende Jupyter-Notebooks als Web-App zu präsentieren.
Wir haben uns für Dash entschieden, da dieses Framework speziell für interaktive Datenvisualisierung und Dashboards entwickelt wurde und eine tiefe Integration mit Plotly beinhaltet. [Frameworks]

2.2.2. Dash

Dash ist ein Open Source Framework zur Visualisierung von Daten in Python. Es basiert auf Flask für das Backend und auf React und Plotly.js für das Frontend. Mit Dash können mit Python interaktive Webanwendungen erstellt werden, die Daten in Echtzeit grafisch darstellen. Flask ist hierbei ein leichtgewichtiges Webanwendungs-Framework und dient in Dash-Anwendungen als Webserver. React ist eine JavaScript Bibliothek zur Erstellung von Benutzeroberflächen. In Dash sorgt React für die dynamische Darstellung und Aktualisierung der Weboberfläche. In Dash wird Plotly.js genutzt, um Visualisierungen mittels interaktiver Diagramme direkt in die Webanwendung einzubetten.
Ein bedeutender Vorteil von Dash ist die Möglichkeit, Html-Elemente und Plotly-Grafiken in einer einzigen Python-Anwendung zu definieren. So kann das Backend und das Frontend in einer einzigen Datei erstellt werden, was den Entwicklungsaufwand und die Komplexität, vor allem bei kleineren Projekten, deutlich reduziert.
Ein weiterer Vorteil ist die einfache Implementation von Callbacks. Diese ermöglichen es uns, die Messdaten in Echtzeit in der Webanwendung zu aktualisieren.
Außerdem bietet Plotly optisch sehr ansprechende Graphen, die sich leicht anpassen lassen, sowie verschiedene Aktionen wie das Zoomen oder einen direkten Download der Graphen als PNG-Datei.
[Dash]

2.2.2.1. MIT Lizenz

Die MIT-Lizenz ist eine Open-Source-Lizenz, die es erlaubt Software nahezu uneingeschränkt zu nutzen, zu kopieren, zu verändern, weiterzugeben und sogar in nicht offen zugängliche Software zu integrieren. Die wesentliche Bedingung lautet, dass der ursprüngliche Urheberrechtsvermerk und der Lizenztext in allen Kopien oder wesentlichen Teilen der Software enthalten bleiben müssen. Es gibt keine Verpflichtung, abgeleitete Werke ebenfalls als Open Source zu veröffentlichen, und auch die kommerzielle Nutzung ist erlaubt. [MIT Lizenz]

2.2.3. Callbacks

Callbacks sind ein zentrales Konzept in der reaktiven und eventbasierten Programmierung und spielen auch in der asynchronen Programmierung eine wichtige Rolle. Sie werden verwendet, um beim Eintreten eines bestimmten Ereignisses – wie etwa einer Benutzereingabe, einer Zeitverzögerung oder dem Abschluss einer Datenverarbeitung – automatisch eine bestimmte Funktion auszuführen.
In Dash wird eine Funktion zu einer Callback-Funktion, indem man sie mit der Dekoratorfunktion @app.callback registriert.

2.3. Durchführung

2.3.1. Software

Das Skript zur Spannungsmessung aus Projekt 1 wurde um eine Dash Webanwendung erweitert. Es handelt sich dabei um eine simpel gehaltene Seite, auf der nur ein Graph sichtbar ist. Um einen übersichtlichen Graphen zu erhalten, wird die Anzahl der dargestellten Messungen auf 100 begrenzt. Die y-Achse wird automatisch skaliert, um bei geringen Spannungsänderungen eine genaue Darstellung zu bieten, bei großen Spannungsänderungen aber auch nicht zu unübersichtlich zu werden.
Zusätzlich besitzt die Anwendung eine Intervall-Komponente, die einen regelmäßigen Takt bietet, mit dem der Graph über Callbacks aktualisiert wird.

Änderungen an Projekt 1
Grundsätzlich bleibt die Funktionsweise der Spannungsmessung unverändert. Die Werte werden weiterhin aus mehreren Proben berechnet und in einer Liste gespeichert. Dieser Vorgang wird jedoch nun in einem eigenen Thread im Hintergrund ausgeführt. Durch die Einführung einer Webseite muss das Skript nun in der Lage sein, mit mehreren Geräten gleichzeitig zu kommunizieren. Jedoch soll es nicht für jede Person eigene Messungen erstellen, sondern nur die bereits gesammelten Werte darstellen. Deshalb werden die Messungen in einem Dataframe gespeichert, auf den die Webanwendung nur lesend zugreift.

2.3.2. Ausgabe

Plotly.js erlaubt einen schnellen Export des generierten Graphen als PNG-Datei. Ein solches Bild wird im Folgenden dargestellt. Die Grafik zeigt den langsamen Spannungsabfall der Batterie. Auch wird in dieser Grafik direkt der Vorteil der automatischen Y-Achsen-Skalierung deutlich. Die Batteriespannung fällt nur um einige Millivolt ab, was bei einer Spannung von ca. 12V nicht sonderlich ins Gewicht fällt.

Spannungsverlauf Plotly

2.4. Quellen

Dash-Python: https://datascientest.com/de/dash-fuer-python/

MIT-Lizenz: https://www.staemmler.pro/mit-lizenz-rechtssicher-kommerziell-einsetzen/

Framework: https://docs.kanaries.net/articles/open-source-data-visualization-tools/