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:
Und für die Spannungen gilt dann:
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
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:
Also ist die Spannung am Pin VP
:
D.h. die Netzspannung \(U\) beträgt
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:
Also haben wir bei \(I = 16\text{A}\) Strom:
Zulässig sind laut Datenblatt ±35mV (RMS). Und auch hier wird in eine Frequenz konvertiert. Laut Datenblatt so:
Also beträgt die Spannung über den Pins IN
und IP
:
Und das bedeutet für den Strom durch den Shunt:
Leistungsmessung
Die Wirkleistung wird vom Chip aus Strom und Spannung berechnet und wiederum als Frequenzsignal ausgegeben:
Und in der anderen Richtung:
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.