Power Sensor-Kalibrierung

Posted on Mo 22 August 2022 in Computer & Electronics

Smartplugs sind eine der wichtigsten Stützen in der Heimautomatisierung und so richtig Fahrt aufgenommen hat das mit den WLAN-Steckdosen von SONOFF, die so mit die ersten waren, für die es open source Firmware gab: TASMOTA. Heute gibt es diese Art smarte-Steckdosen wie Sand am Meer und mit Firmware-Alternativen wie ESPeasy, ESPurna und ESPhome stehen dem geneigten Maker jede Menge Optionen offen. Einige Modelle sind nicht nur schaltbar, sondern messen auch gleich den Stromverbrauch.

Und neuerdings habe ich ein paar davon und würde dieses Feature gerne nutzen. Das konkrete Modell heißt NOUS A1T und ist gegen einen kleinen Aufpreis bereits mit TASMOTA Firmware erhältlich, was einem das initiale Flashen erspart. Ja – das klingt unsportlich, aber der chinesische OEM dieser Dinger macht normalerweise seine Tuya Firmware drauf und es gibt ein lustiges Hase und Igel Spiel zwischen Tuya und dem OTA flashing tool, das es ein wenig zum Glücksspiel macht, ob die jeweiligen Smartplugs sich nun umflashen lassen, oder nicht.

Also erstmal einstecken, ins heimische WLAN einbinden und schauen, was das Ding so anzeigt:

Hm – 265V sind ein bisschen viel. Das stimmt nie im Leben. Und tatsächlich sagt mein Multimeter 228V:

Das schreit danach, die angezeigten Werte einmal systematisch zu überprüfen und eine Kalibrierkurve daraus abzuleiten.

Kalibrierkurve erheben

Ähnlich, wie für meinen Rangefinder, wollen wir nun also die Messwerte unseres Smartplugs mit einigermaßen vertrauenswürdigen Referenzwerten vergleichen. Die resultierende Kurve kann dann dazu genutzt werden, richtigere Werte zu bekommen – das nennt man Kalibrierung.

Unsere Referenz ist in diesem Fall ein Voltcraft-Energy-Monitor 4500advanced:

Das ist zwar auch kein Präzisionsinstrument, aber für den Hausgebrauch garnicht nicht übel. D.h. wenn wir unseren Smartplug so kalibieren können, dass er mit diesem Instrument übereinstimmt sind meine Anforderungen erfüllt.

Die folgenden Werte kann ich mit beiden Geräten messen:

  • Spannung [V] (voltage)
  • Strom [A] (current))
  • Leistung [W] (power)
  • Leistungfaktor (Power Factor)

Die wollen wir nun vergleichen und kalibrieren.

Unser Versuchsaufbau sieht so aus, dass wir das Energiemessgerät in die Steckdose stecken, den Smartplug in das Energiemessgerät und dann verschiedene Verbraucher in den Smartplug.

Wie man sieht, zeigt der Energiemonitor hier schon 0.8W an – das ist der Verbrauch des Smartplugs. Allerdings pendelt der sich über ein paar Minuten hinweg irgendwo zwischen 0.3 und 0.8W ein und so niedrige Level sind sicher auch nicht die Stärke meines eher günstigen Energiemonitors.

Damit das Ganze aussagekräftig ist werden wir versuchen, einen möglichst breiten Bereich von Leistung abzudecken und die jeweils angezeigten Werte beider Instrumente aufschreiben. Also habe ich mir einige Haushaltsgeräte geschnappt und deren Leistung vermessen. Hier die Ergebnistabelle:

                        load voltage current  power   pf voltage.sp current.sp  power.sp pf.sp
1            Electric kettle   217.4   8.690 1900.0 0.99        252      7.798      1939  0.99
2         Hairdryer low cold   223.4   1.375  278.0 0.90        259      1.228       284  0.89
3        Hairdryer high cold   222.8   2.417  538.4 0.99        258      2.163       550  0.98
4         Hairdryer low warm   222.2   2.890  585.0 0.91        258      2.583       598  0.90
5        Hairdryer high warm   221.0   5.184 1146.0 0.99        256      4.634      1172  0.99
6          Hairdryer low hot   221.7   4.040  886.0 0.98        257      3.615       906  0.98
7         Hairdryer high hot   220.0   7.810 1719.0 0.99        255      6.991      1758  0.99
8              Kitchen radio   223.8   0.030    2.8 0.42        260      0.023         2  0.42
9                  Mixer low   224.0   0.260   25.0 0.45        260      0.220        22  0.43
10              Mixer medium   223.0   0.240   47.0 0.88        259      0.211        47  0.86
11                Mixer high   223.0   0.330   76.0 0.99        259      0.290        77  0.99
12              Heater1 high   219.2   6.680 1450.0 0.99        254      5.940      1509  0.98
13               Heater1 low   220.3   4.250  931.0 0.99        256      3.811       955  0.98
14              Heater2 high   221.7  12.520 2786.0 0.99        257     11.235      2854  0.99
15 Vacuum cleaner full power   224.0   7.536 1642.0 0.97        260      6.742      1680  0.96

Der erste Satz Werte stammt vom Energie-Monitor, der zweite (*.sp) vom Smartplug. Um die Daten besser zu verstehen plotten wir sie erstmal – Referenzwerte auf der x-Achse und Smartplug-Werte auf der y-Achse. Die blaue Line ist die Regressionsgerade, das graue Band das 95% Konfidenzintervall für die Gerade und die rote gestrichelte Line kennzeichnet optimale Übereinstimmung:

Wie man sieht, korrelieren die Messwerte sehr gut. Teils stimmen auch die absoluten Werte schon gut überein. Aber in manchen Fällen gibt es eine deutliche systematische Abweichung – v.a. die Spannungswerte sind völlig daneben. Naturgemäß decken wir hier nur einen recht kleinen Spannungsbereich ab, da die Netzspannung einigermaßen stabil ist und sich durch die Belastung mit einem Verbraucher auch nur minimal verändert. Wenn wir das genauer untersuchen wollten müssten wir einen regelbaren Trafo (Variac) verwenden, um von den bei uns üblichen 230V ernsthaft weg zu kommen. Ich würde vermuten, dass der Plug mindestens bis runter auf 100V funktioniert, denn 120V sind in den USA gebräuchlich.

Die Korrelationskoeffizienten lauten:

  • Leistung (P): \(r = 0.9999684\)
  • Strom (I): \(r = 0.9999922\)
  • Spannung (U): \(r = 0.9934328\)
  • Power Factor (λ): \(r = 0.9993514\)

Und die Gleichungen der Regressionsgeraden lauten:

  • \(P_{sp} = 1.0253 \cdot P - 0.8815\)
  • \(I_{sp} = 0.896767 \cdot I - 0.009003\)
  • \(U_{sp} = 1.221 \cdot U - 13.484\)
  • \(λ_{sp} = 1.01067 \cdot \lambda - 0.01622\)

Es fällt auf, dass alle Geraden fast exakt durch den Nullpunkt gehen. Und das macht auch Sinn: Außer für die Spannung wissen wir, dass bei fehlendem Verbraucher auch 0W und 0A angezeigt werden. Ohne Spannung funktioniert der Plug natürlich nicht, aber ich denke, wir können davon ausgehen, dass auch die Spannungskurve durch Null geht.

Ohne Intercept

D.h. wir sollten unsere Regressionsgerade ohne Intercept berechnen. So sehen dann die Plots aus:

Und die dazugehörigen Geradengleichungen:

  • \(P_{sp} = 1.025 \cdot P\)
  • \(I_{sp} = 0.8955 \cdot I\)
  • \(U_{sp} = 1.160 \cdot U\)
  • \(λ_{sp} = 0.9933 \cdot \lambda\)

Für ganz pedantische habe ich zudem die beiden Modelle (mit und ohne Intercept) auch getestet (F-test) und der Unterschied war in keinem Fall signifikant (P = 0.7569, 0.1263, 0.1431, 0.1025).

Insgesammt gibt es also keinen Grund, den Intercept zu berücksichtigen.

Kalibriergleichung

Zur Kalibrierung brauchen wir aber die umgekehrte Richtung der obigen Gleichungen – d.h. wir haben \(P_{sp}\) gemessen und möchten wissen, was \(P\) ist. Also die Umkehrfunktion:

  • \(P = 0.97561 \cdot P_{sp}\)
  • \(I = 1.1167 \cdot I_{sp}\)
  • \(U = 0.86207 \cdot U_{sp}\)
  • \(λ = 1.0068 \cdot \lambda_{sp}\)

Ein kleines bisschen falsch ist das aber noch, weil wir ja auf dem Energie-Monitor auch immer den Verbrauch des Smartplugs mitmessen. Diese 0.3-0.8W, die eingangs erwähnt wurden. Analog beim Strom. D.h. streng genommen hätten wir vor der Berechnung der Kalibriergeraden diese Werte von den Referenzwerten abziehen müssen. Bei der Spannung spielt das keine Rolle und beim Leistungsfaktor bin ich mir nicht so sicher, aber der ist mir eh wurscht.

Spannung die Zweite

Vorhin hatte ich gesagt, dass man einen Variac bräuchte, um eine vernünftige Spannungsreihe zu generieren. Nun – ich habe zufällig einen...

Und so habe ich damit mal eine größere Spannbreite von Spannungswerten untersucht. Unter ≈100V steigt mein Energiemonitor aus und so habe ich diesmal das Multimeter als Referenz verwendet. Alle Werte wurden mit einer Last gemessen – dazu musste ein ungeregelter 80W Lötkolben herhalten.

Hier erstmal die Daten:

  voltage voltage.sp
1    60.0         69
2    75.0         86
3    97.8        113
4   126.0        145
5   170.4        197
6   206.3        238
7   221.8        256
8   234.3        271
9   242.6        281

Und wie vorhin habe ich einen Plot gemacht und ein lineares Modell ohne Intercept gefittet:

\(U_{sp} = 1.155 \cdot U\)

Lässt man einen Intercept zu beträgt dieser -0.7246V. Also vernachlässigbar.

Kalibrierung in der Praxis

Wie man anhand der Graphen und auch der Korrelationskoeffizienten sehen kann, ist unsere Kalibrierfunktion eine Gerade. D.h. wir haben nur zwei Parameter: Intercept und Steigung und wie wir gerade gesehen haben können wir den Intercept vernachlässigen und brauchen somit nur die Steigung.

In der Praxis bedeutet das, dass wir uns nicht jedes mal die Mühe machen müssen einen Haufen verschiedene Leistungen zu messen, um das Gerät zu kalibrieren. Eine einfache Einpunkt-Kalibrierung ist völlig ausreichend. D.h.:

  1. Last anschließen (Wasserkocher) und einschalten
  2. Refererenzwert am Energiemonitor ablesen (und ggf. 0.5W abziehen).
  3. Steigung ausrechnen (\(x/x_{sp}\)) oder von der jeweiligen Firmware ausrechnen lassen

Das macht man für Spannung, Strom und Leistung.

Nach erfolgter Kalibrierung zur Sicherheit eine Testmessung machen und schauen, ob alles passt.

Wer kein Energiemessgerät hat braucht eine Last mit bekannter Leistung. Die Spannung wird mit dem Multimeter gemessen und der Stom ergibt sich aus der Definition der elektrischen Leistung: \(I = P/U\).

Achung: das gilt nur, wenn der Leistungsfaktor mehr oder weniger bei 1 liegt! Deswegen nimmt man den Wasserkocher und keine Motoren oder elektronischen Geräte.

In eigener Software

Wenn man die Software in der die Messdaten verarbeitet werden sollen selbst geschrieben oder unter Kontrolle hat ist die Sache trivial. Einfach die Werte (v) anhand der obigen Kalibrierfunktion umrechnen:

v = a * v_sp

In TASMOTA

Das Vorgehen ist ausführlich in der original Doku von Tasmota beschrieben, aber ich gebe hier die essentiellen Schritte wieder.

In der verlinkten Anleitung steht "Adjust the power offset". Das ist falsch! Der Offset ist das was im linearen Modell Intercept (Deutsch: Achsenabschnitt) heißt – also ein Wert der auf den Messwert addiert wird. Was wir aber tatsächlich tun, ist die Steigung der Gerade anpassen. Die Durchführung ist aber völlig richtig erklärt.

Also:

  1. Last anschließen (Wasserkocher) und einschalten
  2. Refererenzwert am Energiemonitor ablesen (und ggf. 0.5W abziehen).
  3. PowerSet xx.x in die Tasmota-Konsole eingeben. Dabei ist xx.x der korrekte (Referenz-) Wert.

Analog für Spannung (VoltageSet) und Strom (CurrentSet).

In ESPhome

Bei ESPhome muss der Kalibrierfaktor direkt in das YAML File des entsprechenden Geräts. Im Netz finden sich verschiedene Anleitungen, die dazu einen calibrate_linear Filter verwenden. Dabei übergibt man einen Haufen Messwert-Paare für den jeweiligen Parameter – so wie wir es ganz oben selbst gemacht hatten. Wie wir aber gelernt haben ist das nicht nötig. Eine Einpunkt-Kalibrierung ist völlig ausreichend, solange sie sorgfältig gemacht wird.

Was wir hier wirklich verwenden wollen ist der multiply Filter.

Bei anderen Sensoren mag es jedoch durchaus sinnvoll sein, calibrate_linear zu verwenden, oder eine Kombination von multiply und offset.

Ein YAML Template für meinen Smartplug gibt es hier. Und die Kalibrierung macht man dann so (Beispiel für Spannung):

sensor:

 [...]

 - platform: hlw8012

    [...]

    voltage:
      name: "${devicename} - Voltage"
      unit_of_measurement: V
      accuracy_decimals: 1
      icon: mdi:flash-outline
      filters:
        - multiply: 0.8658

    [...]

Man kann sich aber auch noch viel tiefgehender damit befassen – Fortsetzung folgt...