Power Sensor-Kalibrierung Teil 2

Posted on So 02 Oktober 2022 in Computer & Electronics

In einem kürzlichen Post hatten wir uns mit der Kalibrierung von Smartplugs mit Energiemessfunktion befasst. Heute wollen wir dem noch ein bisschen weiter auf den Grund gehen indem wir uns die Hardware des Smartplugs mal genauer ansehen und versuchen, die Messung von Strom, Spannung und Leistung genau nachzuvollziehen.

Also Schraubenzieher, Lupenbrille und Energiemessgerät gezückt und los geht's.

Smartplug Hardware

Als erstes wollen wir uns mal das Innenleben des Smartplugs genauer ansehen. Dazu müssen wir den Aufkleber in der Dose abziehen und eine kleine Schraube lösen (natürlich "Tamper-proof"/dreieckig, haha).

Sobald wir die obere Abdeckung entfernt haben bekommen wir freien Blick ins Innere:

Interessant finde ich das kleine schwarze Kabel und den lustigen Aufkleber an der Gehäusewand – das ist die WLAN-Antenne des ESP Chips. Die knibbeln wir vorsichtig ab und drücken dann kräftig auf die Kontaktstifte, um die Schaltung aus dem Gehäuse zu bekommen – ich habe dazu einen Schraubstock benutzt.

Als nächstes versuchen wir mal, die diversen Komponenten zu identifizieren. Dabei beschränken wir uns erstmal auf ICs und ignorieren den Kleinkram. Also habe ich die Lupe rausgeholt und die Augen zusammen gekniffen und die so entzifferten Typencodes in die Suchmaschine meiner Wahl getippt. Und dies habe ich gefunden:

IC Funktion
ESP8266ex Microcontroller
P25080H Flash Memory
FT8440A step-down constant voltage supply
BL0937 Energy Metering IC

Ich würde sagen, das ist alles wenig überraschend. ESP-Micro wussten wir eh schon und Flash Memory braucht der halt, wenn es nicht gerade eine der Versionen mit onboard Flash ist. Spannungsversorgung macht natürlich ebenfalls Sinn. Das spannendste Element ist der BL0937 – das ist unser Energiemonitor. Der scheint weitgehend kompatibel mit dem HLW8012 Zu sein, nach dem die entsprechende Sensor-Komponente in ESPhome benannt ist, die beide Chips unterstützt.

Hier noch die Übersichtskarte zur Orientierung:

Hintergrund: BL0937 / HLW8012

Als erstes besorgen wir uns mal ein Datenblatt. Und der Vollständigeit halber auch das für den HLW8012 – das ist allerdings nur in Chinesisch zu finden und so habe ich es mit Deep-L übersetzt und außer ein paar sehr amüsanten Stilblüten ist diese Englische Version nun eigentlich ganz gut verständlich.

Der Schaltplan im Datenblatt sieht so aus:

Das Pendant aus dem Datenblatt des HLW8012 sieht so aus (leicht von mir bearbeitet):

Also tatsächlich die gleiche Schaltung mit minimalen Detailunterschieden. Die Messwerte überträgt der Chip indem er Impulse auf den Ausgängen CF bzw. CF1 sendet – die Frequenz der Impulse ist dann proportional zum Messwert.

  • CF: active Power [W]
  • CF1:
    • SEL=0: Spannung [V]
    • SEL=1: Strom [A]

Achtung: Der SEL Pin verhält sich beim BL0937 exakt invers zum HLW8012. Und auch in der Referenzspannung \(R_\text{ref}\) unterscheiden sich die beiden Chips:

  • BL0937: \(U_\text{ref} = 1.218\text{V}\)
  • HLW8012: \(U_\text{ref} = 2.43\text{V}\)

Spannungsmessung

Die Spannung wird im Plug über einen Spannungsteiler gemessen. Im Schaltbild des BL0937 sind \(6 \cdot 330\text{Ω} = 1980\text{Ω}\) und 1kΩ angegeben. D.h. Unser Spannungsteiler hat das Verhältnis:

$$ F_\text{div} = \frac{R_1 + R_2}{R_2} = \frac{1980\text{kΩ} + 1\text{kΩ}}{1\text{kΩ}} = \frac{1981}{1} $$

Und für die Spannungen gilt dann:

$$ U_U = \frac{U}{F_\text{div}} $$

Bei \(U = 230\text{V}\) fallen also \(U_U = \frac{230V}{1981} = 116\text{mV}\) an \(R_2\) ab.

Schauen wir nun aber mit der Lupe auf die Platine unseres Smartplugs finden sich dort drei Widerstände á 680kΩ, sowie einer mit 1kΩ. Also

$$ F_\text{div} = \frac{3 \cdot 680\text{kΩ} + 1\text{kΩ}}{1\text{kΩ}} = \frac{2041}{1} $$

Also sehr ähnlich, aber nicht identisch. Bei 230V: \(U_U = \frac{230V}{2041} = 112.7\text{mV}\)

Das Datenblatt des BL0937 sagt, dass der Pin VP ±141mV (RMS) verträgt. D.h. die Werte sind gut gewählt, denn wir liegen nicht über dem Limit, aber auch nicht zu weit darunter. Schließlich wird die Spannung dann mit einem ADC konvertiert und es wäre ungünstig nur einen kleinen Teil des Messbereichs zu nutzen.

Laut Datenblatt errechnet sich die Frequenz \(f_\text{U}\) des Signals auf Pin CF1 in Abhängigkeit der Spannung \(V_2\) über dem Widerstand \(R_2\) des Spannungsteilers wie folgt:

$$ f_U = 15397 \frac{U_U}{U_\text{ref}} $$

Also ist die Spannung am Pin VP:

$$ U_U = f_U \cdot \frac{U_\text{ref}}{15397} $$

D.h. die Netzspannung \(U\) beträgt

$$ U = f_U \cdot \frac{U_\text{ref}}{15397} \cdot F_\text{div}$$

Strommessung

Im Schaltplan ist der Shunt Widerstand schön zu erkennen und auch, wie über ihm die Spannung \(U_I\) abgegriffen wird (Pins IP/IN bzw. V1P/V1N). Aus diesem Spannungsabfall berechnet der Smartplug den Strom dann mit dem Ohm'schen Gesetz:

$$I = \frac{U_I}{R_\text{shunt}}$$

Also haben wir bei \(I = 16\text{A}\) Strom:

$$ U_I = R_\text{shunt} \cdot I = 1\text{mΩ} \cdot 16\text{A} = 16\text{mV} $$

Zulässig sind laut Datenblatt ±35mV (RMS). Und auch hier wird in eine Frequenz konvertiert. Laut Datenblatt so:

$$ f_I = 94638 \frac{U_I}{U_\text{ref}} $$

Also beträgt die Spannung über den Pins IN und IP:

$$ U_I = f_I \cdot \frac{U_\text{ref}}{94638} $$

Und das bedeutet für den Strom durch den Shunt:

$$ I = \frac{U_I}{R_\text{shunt}} = f_I \cdot \frac{U_\text{ref}}{94638 \cdot R_\text{shunt}}$$

Leistungsmessung

Die Wirkleistung wird vom Chip aus Strom und Spannung berechnet und wiederum als Frequenzsignal ausgegeben:

$$ f_P = 1721506 \frac{U_U \cdot U_I}{U_\text{ref}^2}$$

Und in der anderen Richtung:

$$ U_U \cdot U_I = f_P \cdot \frac{U_\text{ref}^2}{1721506} $$
$$ \frac{U}{F_\text{div}} \cdot I \cdot R_\text{shunt} = f_P \cdot \frac{U_\text{ref}^2}{1721506} $$
$$ P = U \cdot I = f_P \cdot \frac{U_\text{ref}^2 \cdot F_\text{div}}{1721506 \cdot R_\text{shunt}} $$

Umsetzung in ESPhome

In ESPhome haben wir drei Variable zur Konfiguration von Chip und Beschaltung:

model = "BL0937" / "HLW8012" / "CSE7759"

voltage_divider = \(F_\text{div}\)

current_resistor = \(R_\text{shunt}\)

Diese müssen korrekt gesetzt sein, sonst bekommen wir lustige Messwerte. In unserem YAML File für ESPhome setzen wir also:

sensor:
  - platform: hlw8012   
    model: "BL0927"
    voltage_divider: "2041"
    current_resistor: "0.001"

Und gehen mal eine Runde messen. Zunächst aber ohne Last, um den Verbrauch des Smartplugs zu bestimmen:

Referenz Smartplug
Spannung 223.9 V 269.5V
Strom 0.01 A 0.00 A
Leistung 0.7 W 0.00 W

Und dann mit dem großen Heizlüfter als Last:

Referenz Smartplug
Spannung 219.0 V 263.4 V
Strom 12.97 A 13.303 A
Leistung 2831 W 3191 W

Nun den Verbrauch des Smartplugs rausrechnen und die Kalibrierfaktoren (\(X_\text{ref} / X_\text{Smartplug}\)) ausrechnen:

Referenz Smartplug Kalibrierfaktor
Spannung 219.0 V 263.4 V 0.8314351
Strom 12.96 A 13.303 A 0.9742163
Leistung 2830.3 W 3191 W 0.8869633

Diese Kalibrierfaktoren bauen wir nun in unser yaml file ein:

Sensor:
  - platform: hlw8012
    model: ${hlw_model}
    sel_pin:
      number: GPIO12
      inverted: True
    cf_pin: GPIO04
    cf1_pin: GPIO05
    change_mode_every: 4
    current_resistor: ${current_res}
    voltage_divider: ${voltage_div}
    update_interval: 3s

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

Wer keine Lust hat, den Faktor auszurechnen, kann auch einfach Wertepaare für gemessenen und wahren Wert nehmen:

    voltage:
      name: "${devicename} - Voltage"
      unit_of_measurement: V
      accuracy_decimals: 1
      icon: mdi:flash-outline
      filters:
        - calibrate_linear:
            # measured -> true
            0.0 -> 0.0
            263.4 -> 219.0

Das 0.0 -> 0.0 legt den Nullpunkt fest.

Stunde der Wahrheit

Nun sollte alles passen und das testen wir jetzt. Also wieder Heizlüfter anwerfen, Verbrauch des Plugs abziehen und:

Referenz Smartplug Abweichung
Spannung 215.4 V 215.5 V 0.046 %
Leistung 2768 W 2768.8 W 0.029 %
Strom 13.05 A 13.031 A -0.146 %

Sehr schön – das passt doch ganz hervorragend. In der Realität ist es garnicht so einfach, beide Geräte gleichzeitig abzulesen – am besten geht es zu zweit. Insofern sind obige Abweichungen jedes mal ein bisschen anders.

Es gibt ein Template für den Plug zum Download, das ich als Ausgangsbasis verwendet habe, um mein eigenes Config-File zusammen zu bauen.