HLW8012: Add calibration instructions and calculator (#3253)

* HLW8012: Add calibration instructions and calculator

* Add example config

* Clarify where to find the calibration values
This commit is contained in:
Mat931 2023-10-25 14:46:48 +00:00 committed by GitHub
parent d8517d13df
commit f5d86c33c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 142 additions and 0 deletions

View File

@ -124,6 +124,148 @@ when SEL=1 voltage is measured. To accommodate this change use the following con
name: "BL0937 Power"
update_interval: 60s
Calibration
-----------
What you need:
- Your ESPHome power measurement plug
- A calibrated power meter that can measure voltage, current, power and power factor
- A large resistive load like an electric heater or kettle, ideally over 1000W
Steps:
- Find the currently used calibration values for ``current_resistor`` and ``voltage_divider`` in your device's YAML configuration or upload a new firmware with some known calibration values to the ESP.
- Plug the ESP power measurement plug into the calibrated power meter.
- Plug the load into the ESP plug.
- Turn on the load and make sure the power factor (PF) displayed on the power meter is 1.0. If it's not, you need to pick a different load.
- Wait for the readings to settle on both the power meter and the ESP.
- Write down the voltage reading of the power meter and the ESP at the same time.
- Write down the power reading of the power meter and the ESP at the same time.
- Write down the current reading of the power meter and the ESP at the same time.
- Use the calculator below to calculate the new calibration values for the ESP. These values will help it accurately measure power, voltage and current in the future.
- Upload the new values to the ESP.
Calibration values on the ESP:
.. raw:: html
<table>
<tr><td>voltage_divider:</td><td><input type="text" inputmode="numeric" value="2351" id="voltage-divider" onchange="calc()" onkeypress="calc()" onpaste="calc()" oninput="calc()" style="width: 100px; max-width: 75vw;"></td></tr>
<tr><td>current_resistor:</td><td><input type="text" inputmode="numeric" value="0.001" id="current-resistor" onchange="calc()" onkeypress="calc()" onpaste="calc()" oninput="calc()" style="width: 100px; max-width: 75vw;"></td></tr>
<tr><td>current_multiply:</td><td><input type="text" inputmode="numeric" value="1" id="current-multiply" onchange="calc()" onkeypress="calc()" onpaste="calc()" oninput="calc()" style="width: 100px; max-width: 75vw;"></td></tr>
</table>
ESP measurements:
.. raw:: html
<table>
<tr><td>Voltage:</td><td><input type="text" inputmode="numeric" id="sensor-voltage" onchange="calc()" onkeypress="calc()" onpaste="calc()" oninput="calc()" style="width: 100px; max-width: 75vw;"> V</td></tr>
<tr><td>Power:</td><td><input type="text" inputmode="numeric" id="sensor-power" onchange="calc()" onkeypress="calc()" onpaste="calc()" oninput="calc()" style="width: 100px; max-width: 75vw;"> W</td></tr>
<tr><td>Current:</td><td><input type="text" inputmode="numeric" id="sensor-current" onchange="calc()" onkeypress="calc()" onpaste="calc()" oninput="calc()" style="width: 100px; max-width: 75vw;"> A</td></tr>
</table>
Power meter measurements:
.. raw:: html
<table>
<tr><td>Voltage:</td><td><input type="text" inputmode="numeric" id="real-voltage" onchange="calc()" onkeypress="calc()" onpaste="calc()" oninput="calc()" style="width: 100px; max-width: 75vw;"> V</td></tr>
<tr><td>Power:</td><td><input type="text" inputmode="numeric" id="real-power" onchange="calc()" onkeypress="calc()" onpaste="calc()" oninput="calc()" style="width: 100px; max-width: 75vw;"> W</td></tr>
<tr><td>Current:</td><td><input type="text" inputmode="numeric" id="real-current" onchange="calc()" onkeypress="calc()" onpaste="calc()" oninput="calc()" style="width: 100px; max-width: 75vw;"> A</td></tr>
</table>
New calibration values:
.. raw:: html
<table>
<tr><td>voltage_divider:</td><td><input type="text" id="voltage-divider-new" onclick="this.focus();this.select()" style="width: 100px; max-width: 75vw;" readonly="readonly"></td></tr>
<tr><td>current_resistor:</td><td><input type="text" id="current-resistor-new" onclick="this.focus();this.select()" style="width: 100px; max-width: 75vw;" readonly="readonly"></td></tr>
<tr><td>current_multiply:</td><td><input type="text" id="current-multiply-new" onclick="this.focus();this.select()" style="width: 100px; max-width: 75vw;" readonly="readonly"></td></tr>
</table>
New ESP measurements:
.. raw:: html
<table>
<tr><td>Voltage:</td><td><input type="text" id="sensor-voltage-new" style="width: 100px; max-width: 75vw;" readonly="readonly"> V</td></tr>
<tr><td>Power:</td><td><input type="text" id="sensor-power-new" style="width: 100px; max-width: 75vw;" readonly="readonly"> W</td></tr>
<tr><td>Current:</td><td><input type="text" id="sensor-current-new" style="width: 100px; max-width: 75vw;" readonly="readonly"> A</td></tr>
</table>
<script>
function calc() {
let voltage_divider = parseFloat(document.getElementById("voltage-divider").value.replace(",", "."))
let current_resistor = parseFloat(document.getElementById("current-resistor").value.replace(",", "."))
let current_multiply = parseFloat(document.getElementById("current-multiply").value.replace(",", "."))
let real_voltage = parseFloat(document.getElementById("real-voltage").value.replace(",", "."))
let real_power = parseFloat(document.getElementById("real-power").value.replace(",", "."))
let real_current = parseFloat(document.getElementById("real-current").value.replace(",", "."))
let sensor_voltage = parseFloat(document.getElementById("sensor-voltage").value.replace(",", "."))
let sensor_power = parseFloat(document.getElementById("sensor-power").value.replace(",", "."))
let sensor_current = parseFloat(document.getElementById("sensor-current").value.replace(",", "."))
let calc_voltage = (document.getElementById("real-voltage").value !== "" || document.getElementById("sensor-voltage").value !== "")
let calc_power = (document.getElementById("real-power").value !== "" || document.getElementById("sensor-power").value !== "")
let calc_current = (document.getElementById("real-current").value !== "" || document.getElementById("sensor-current").value !== "")
let voltage_divider_new = voltage_divider;
let current_resistor_new = current_resistor;
let current_multiply_new = current_multiply;
if (calc_voltage) {
voltage_divider_new *= real_voltage / sensor_voltage;
}
if (calc_power) {
if (calc_voltage) {
current_resistor_new *= (sensor_power / sensor_voltage) / (real_power / real_voltage);
} else {
current_resistor_new *= sensor_power / real_power;
}
}
if (calc_current) {
if (calc_power) {
current_multiply_new *= (real_current / sensor_current) * (current_resistor_new / current_resistor);
} else {
current_resistor_new *= sensor_current / real_current;
}
}
document.getElementById("voltage-divider-new").value = voltage_divider_new;
document.getElementById("current-resistor-new").value = current_resistor_new;
document.getElementById("current-multiply-new").value = current_multiply_new;
let sensor_voltage_new = sensor_voltage * voltage_divider_new / voltage_divider
let sensor_power_new = sensor_power * (voltage_divider_new / current_resistor_new) / (voltage_divider / current_resistor)
let sensor_current_new = sensor_current * (current_multiply_new / current_resistor_new) / (current_multiply / current_resistor)
document.getElementById("sensor-voltage-new").value = Number(sensor_voltage_new.toFixed(8));
document.getElementById("sensor-power-new").value = Number(sensor_power_new.toFixed(8));
document.getElementById("sensor-current-new").value = Number(sensor_current_new.toFixed(8));
}
</script>
Example Config:
.. code-block:: yaml
substitutions:
voltage_divider: "2351"
current_resistor: "0.001"
current_multiply: "1.0"
sensor:
- platform: hlw8012
current_resistor: ${current_resistor}
voltage_divider: ${voltage_divider}
current:
name: "HLW8012 Current"
filters:
- multiply: ${current_multiply}
voltage:
name: "HLW8012 Voltage"
power:
name: "HLW8012 Power"
energy:
name: "HLW8012 Energy"
update_interval: 60s
See Also
--------