Aus Raspberry Pi Geek 06/2022

Stromverbrauch messen mit Hardkernels SmartPower 3 (Seite 2)

Abbildung 3: Vom SmartPower 3 abgegriffene Messdaten im CSV-Format (oben) und Menü (unten).

Abbildung 3: Vom SmartPower 3 abgegriffene Messdaten im CSV-Format (oben) und Menü (unten).

Mit der Firmware von Ende Februar 2022 und später klappt die Verbindung über das Netzwerk per UDP zuverlässig, was die Arbeit erleichtert, da das Hantieren mit dem seriellen Kabel wegfällt und man keinen Rechner in der Nähe des zu messenden Geräts benötigt.

Damit das SmartPower 3 weiß, wohin es die Daten senden soll, müssen Sie sich einmal per serieller Schnittstelle mit dem Gerät verbinden und wechseln danach mit [Strg]+[C] ins Menü (Abbildung 3, unten). Dort konfigurieren Sie den WLAN-Zugang sowie die IP-Adresse des UDP-Servers. Hardkernel verwechselte allerdings Server und Client und spricht im Wiki konsequent von Client. Gemeint sind aber der Rechner und Port, auf dem der UDP-Server läuft. Die Firmware behebt diesen Fehler jedoch schon.

Die Daten nehmen Sie auf dem Server mit einem Programm wie Netcat in Empfang. Einfacher klappt das jedoch mit dem Skript sp3-datalogger.py aus dem contrib/-Verzeichnis des SmartPower-Quellcodes [6]. Es implementiert den passenden UDP-Server und speichert die Daten in einer Datei. Alternativ liest das Skript die Daten auch direkt von der serielle Kabelschnittstelle. Ein typischer Aufruf sieht so aus wie in Listing 1. Die Option -t fügt den Daten einen absoluten Zeitstempel hinzu, alle verfügbaren Optionen zeigt -h an.

Listing 1

Datalogger aufrufen

$ sp3-datalogger.py -o meine_daten.csv -t

Daten auswerten

Allerdings lässt der Hersteller den Benutzer mit den Zahlenkolonnen allein und verweist lapidar auf die Auswertung per Tabellenkalkulation. Für eine einzelne Messung mag das akzeptabel erscheinen, denn gängige Programme laden CSV-Daten ohne Murren und erzeugen mit einigen Klicks auch eine Grafik daraus. Wer sich mit Office-Automation auskennt, hinterlegt die manuellen Schritte in einem Makro.

Eine bessere Alternative bietet aber der Einsatz einer sogenannten RRD-Datenbank (Round-Robin Database) zum Speichern der Daten. Das ist gerade für Langzeitmessungen das Mittel der Wahl, denn die Datenbank speichert Daten der näheren Vergangenheit sehr feinkörnig, Daten, die länger zurückliegen, aber ausgedünnt. Der Stromverbrauch eines Geräts im letzten Monat interessiert ja nicht auf Sekundenebene. Das eingangs schon erwähnte Selbstbauprojekt Pi-VA-Meter [2] setzt auf die RRD-Tools, im Artikel [1] dazu lesen Sie bei Interesse die Details nach.

Die dritte Alternative besteht im Auswerten mit einem kleinen Python-Skript. Mit Pandas gibt es ein für Tabellen ein maßgeschneidertes Programm, als Anwendungsfall dient der Vergleich der beiden Pi-Zero-Generationen. Pandas installieren Sie am besten via sudo pip3 install pandas.

Zero W vs. Zero 2W

Zum Messen hängen die zwei Zeros an den beiden Ausgabekanälen des SmartPower 3. Sowohl die Installation als auch die SD-Karte ist bei beiden gleich. Per Systemd startet nach dem Hochfahren ein Skript, das eine CPU-intensive Aufgabe erledigt und danach den Rechner sofort wieder herunterfährt. Dabei handelt es sich um einen typischen Anwendungsfall, wenn der RasPi an einer Batterie hängt.

Ein weiterer Rechner im Netz verwendet den Aufruf aus Listing 1 für das Sammeln der Daten. Die Ausgabekanäle schalten möglichst zeitgleichzeitig ein und nach dem Herunterfahren wieder aus. Die Auswertung erfolgt mit dem Skript aus Listing 2 – hier nur für einen Kanal, der andere funktioniert analog. Die Komplettversion finden Sie ebenfalls im bereits erwähnten Verzeichnis contrib/, das Ergebnis zeigt Abbildung 4.

Abbildung 4: Auswertung: Der RasPi Zero W und 2W im Verbrauchsvergleich.

Abbildung 4: Auswertung: Der RasPi Zero W und 2W im Verbrauchsvergleich.

In Zeile 5 liest Pandas die Eingabedatei ein. Dabei agiert es sehr robust, unvollständige Zeilen bringen das Programm nicht aus dem Tritt. Die Zeilen 7 bis 9 vergeben Namen für die Spalten. Nach dem Zeitstempel ts folgen die Messwerte auf der Eingangsseite, danach die für die beiden Kanäle.

Listing 2

Datenanalyse (Ausschnitte)

import sys, pathlib
import pandas as pd
infile = sys.argv[1]
data = pd.read_csv(infile,header=None,sep=',')
data.columns = ['ts','I_V','I_C','I_P','I_on',
  'CH0_V','CH0_C','CH0_P','CH0_on','CH0_Int',
  'CH1_V','CH1_C','CH1_P','CH1_on','CH1_Int','cs1','cs2']
data['ts']    -= data['ts'][0]
data['ts']    *= 0.001
data['CH0_V'] *= 0.001
data['CH1_V'] *= 0.001
data['CH0_P'] *= 0.001
data['CH1_P'] *= 0.001
t = data['ts']
esum0 = (t.diff()*data['CH0_P']).cumsum()
esum1 = (t.diff()*data['CH1_P']).cumsum()
# print basic statistics (assume sampling is constant for avg)
print("\nmeasurement-duration: %5.1f sec" % t.max())
print("\n------- channel 0 ----------")
print("  min current %6.3f mA" % data['CH0_C'].min())
print("  avg current %6.3f mA" % data[data.CH0_on!=0].CH0_C.mean())
print("  max current %6.3f mA" % data['CH0_C'].max())
print("\n  min voltage %6.3f V" % data['CH0_V'].min())
print("  avg voltage %6.3f V" % data[data.CH0_on!=0].CH0_V.mean())
print("  max voltage %6.3f V" % data['CH0_V'].max())
print("\n  min power %6.3f W" % data['CH0_P'].min())
print("  avg power %6.3f W" % data[data.CH0_on!=0].CH0_P.mean())
print("  max power %6.3f W" % data['CH0_P'].max())
total = esum0.max()/3600
print("  tot energy %6.3f Wh" % total)
print("----------------------------\n")

Die Zeilen 11 bis 16 normalisieren und skalieren die Daten. Pandas operiert immer auf Tabellen oder Spalten. Das ist sehr praktisch, damit entfällt die Programmierung vieler Schleifen. In den Zeilen 18 bis 20 berechnet das Programm den Verbrauch. Die Variable t dient nur als Abkürzung; t.diff() gibt die Differenz zum Vorgänger aus, also die Intervalllänge. Diese wird mit der Leistung multipliziert. Das Ergebnis summiert dann die Variable cumsum() (kumulierte Summe) auf. Analog funktionieren die anderen Auswertungen ab Zeile 26. Einzige Feinheit dabei ist die Durchschnittsberechnung nur für Zeilen, bei denen der Kanal tatsächlich an war (Zeilen 27 und 31).

Visualisieren lassen sich die Daten mit dem Projekt Py-Datamon [7] des Autors. Der Python-Datenmonitor liest Daten aus einer Datei oder live über eine Pipe und stellt sie kontinuierlich dar. Abbildung 5 zeigt, dass der Zero 2W schon wieder herunterfährt, wenn der Zero W gerade den Boot-Vorgang abschliesst und mit der Arbeit beginnt.

Abbildung 5: Zero W und Zero 2W im Vergleich, erstellt mit dem Python-Datenmonitor Py-Datamon des Autors.

Abbildung 5: Zero W und Zero 2W im Vergleich, erstellt mit dem Python-Datenmonitor Py-Datamon des Autors.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben