Smart Home Automation Forum
m16v2 energy meter - calibration issues - Printable Version

+- Smart Home Automation Forum (https://www.kincony.com/forum)
+-- Forum: Technical Support (https://www.kincony.com/forum/forumdisplay.php?fid=20)
+--- Forum: KC868-M16 / M1 / MB / M30 (https://www.kincony.com/forum/forumdisplay.php?fid=50)
+--- Thread: m16v2 energy meter - calibration issues (/showthread.php?tid=9245)



m16v2 energy meter - calibration issues - PapaC - 04-17-2026

Hi, hopefully someone can help where I'm having issues calibrating the m16v2 energy meter in the UK which is on 240v with 1 phase.

Currently I am only focusing on CT_15 which is the Grid, I have a Shelly EM using a 120a1v CT clamp which is on the same line as CT_15.

When attempting to calibrate with 2 resistive loads (not at the same time) it just simply falls out of line when then seeing real world usage after, for example I had turned on a 3000w kettle, the Shelly shown the correct load so I then calibrated the figures as recommended in Kincony code, then I tried a 1500w electric heater but instead of the load being somewhat close to the expected reading, it was instead 1900w.

Additionally, when on normal realworld load where the house has typical appliances on which would bring it to about 300w on the Shelly, the m16 instead reports that its 600w.

I can confirm that I have connected the m16 to the consumer unit as recommended so then it shows what the voltage is, which I can confirm is accurate when compared against the Shelly which reports basically the exact same voltage.

All clamps are 1v, and are shown in order of what they're used for along with the amp:
  • 1 - Shower - 50a
  • 2 - Cooker - 50a
  • 3 - Kithcen Ring - 30a
  • 4 - Dish Washer - 30a
  • 5 - Washing Machine - 20a
  • 6 - Tumble Dryer -  30a
  • 7 - Reserved
  • 8 - Reserved
  • 9 - Fridge - 20a
  • 10 - Reserved
  • 11 - Reserved
  • 12 - Reserved
  • 13 - Reserved
  • 14 - General Ring - 30a
  • 15 - Grid - 100a
  • 16 - Reserved


I've attached code currently being used.

Code:
esphome:
  name: m16v2

esp32:
  board: esp32dev
  framework:
    type: arduino

ota:
  - platform: esphome

external_components:
  - source:
      type: git
      url: https://github.com/hzkincony/esphome-zmpt101b
      ref: v2.1.0

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "D69bY/GXlmjYkovak6WIhgmbOH8vwyqvMxIHBriYoaY="

# Wifi Configuration
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  fast_connect: true

i2c:
  sda: 4
  scl: 5
  scan: true
  id: bus_a

cd74hc4067:
  - id: cd74hc4067_1
    pin_s0: 32
    pin_s1: 33
    pin_s2: 13
    pin_s3: 16

web_server:
  port: 80

font:

  - file: "gfonts://Roboto"
    id: roboto
    size: 16

sensor:
  - platform: adc
    pin: 34
    id: adc34
    update_interval: never
    attenuation: 12db

  - platform: adc
    pin: 36
    id: adc36
    update_interval: never
    attenuation: 12db

  - platform: adc
    pin: 39
    id: adc39
    update_interval: never
    attenuation: 12db

  - platform: zmpt101b
    name: "L1 Voltage"
    # name: "m16--AI zmpt 34"
    sensor: adc34
    id: voltage_1
    sensitivity: 538

  - platform: adc
    pin: 35
    id: adc35
    update_interval: never
    attenuation: 12db

  - platform: cd74hc4067
    id: ai1
    number: 0
    sensor: adc35
    update_interval: 5s

  - platform: cd74hc4067
    id: ai2
    number: 1
    sensor: adc35
    update_interval: 5s

  - platform: cd74hc4067
    id: ai3
    number: 2
    sensor: adc35
    update_interval: 5s

  - platform: cd74hc4067
    id: ai4
    number: 3
    sensor: adc35
    update_interval: 5s

  - platform: cd74hc4067
    id: ai5
    number: 4
    sensor: adc35
    update_interval: 5s

  - platform: cd74hc4067
    id: ai6
    number: 5
    sensor: adc35
    update_interval: 5s

  - platform: cd74hc4067
    id: ai9
    number: 8
    sensor: adc35
    update_interval: 5s

  - platform: cd74hc4067
    id: ai14
    number: 13
    sensor: adc35
    update_interval: 5s

  - platform: cd74hc4067
    id: ai15
    number: 14
    sensor: adc35
    update_interval: 5s

  - platform: ct_clamp
    sensor: ai1
    id: CT_1_Current
    name: "CT 1 Current"
    update_interval: 5s
    filters:
      # 50a 1v CT clamp on a known 8.5kw shower
      - calibrate_linear:
          - 0 -> 0
          - 1 -> 50
      - lambda: if(x < 0.2) return 0; else return x;

  - platform: template
    id: CT_1_Power
    name: "CT 1 Power"
    lambda: return id(CT_1_Current).state * id(voltage_1).state;
    device_class: power
    unit_of_measurement: "W"
    update_interval: 5s

  - platform: ct_clamp
    sensor: ai2
    id: CT_2_Current
    name: "CT 2 Current"
    update_interval: 5s
    filters:
      # 50a 1v CT clamp on a cooker
      - calibrate_linear:
          - 0 -> 0
          - 1 -> 50
      - lambda: if(x < 0.25) return 0; else return x;

  - platform: template
    id: CT_2_Power
    name: "CT 2 Power"
    lambda: return id(CT_2_Current).state * id(voltage_1).state;
    device_class: power
    unit_of_measurement: "W"
    update_interval: 5s

  - platform: ct_clamp
    sensor: ai3
    id: CT_3_Current
    name: "CT 3 Current"
    update_interval: 5s
    filters:
      - calibrate_linear:
          - 0 -> 0
          - 8.24 -> 11.68
      - lambda: if(x < 0.05) return 0; else return x;

  - platform: template
    id: CT_3_Power
    name: "CT 3 Power"
    lambda: return id(CT_3_Current).state * id(voltage_1).state;
    device_class: power
    unit_of_measurement: "W"
    update_interval: 5s

  - platform: ct_clamp
    sensor: ai4
    id: CT_4_Current
    name: "CT 4 Current"
    update_interval: 5s
    filters:
      # 30a 1v CT clamp - Dish Washer
      - calibrate_linear:
          - 0 -> 0
          - 1 -> 30
      - lambda: if(x < 0.1) return 0; else return x;

  - platform: template
    id: CT_4_Power
    name: "CT 4 Power"
    lambda: return id(CT_4_Current).state * id(voltage_1).state;
    device_class: power
    unit_of_measurement: "W"
    update_interval: 5s

  - platform: ct_clamp
    sensor: ai5
    id: CT_5_Current
    name: "CT 5 Current"
    update_interval: 5s
    filters:
      # 20a 1v CT clamp - washing machine
      - calibrate_linear:
          - 0 -> 0
          - 1 -> 20
      - lambda: if(x < 0.1) return 0; else return x;

  - platform: template
    id: CT_5_Power
    name: "CT 5 Power"
    lambda: return id(CT_5_Current).state * id(voltage_1).state;
    device_class: power
    unit_of_measurement: "W"
    update_interval: 5s

  - platform: ct_clamp
    sensor: ai6
    id: CT_6_Current
    name: "CT 6 Current"
    update_interval: 5s
    filters:
      # 30a 1v CT clamp - tumble dryer
      - calibrate_linear:
          - 0 -> 0
          - 1 -> 30
      - lambda: if(x < 0.1) return 0; else return x;

  - platform: template
    id: CT_6_Power
    name: "CT 6 Power"
    lambda: return id(CT_6_Current).state * id(voltage_1).state;
    device_class: power
    unit_of_measurement: "W"
    update_interval: 5s

  - platform: ct_clamp
    sensor: ai9
    id: CT_9_Current
    name: "CT 9 Current"
    update_interval: 5s
    filters:
      # 20a 1v CT clamp - Fridge
      - calibrate_linear:
          - 0 -> 0
          - 1 -> 20
      - lambda: if(x < 0.05) return 0; else return x;

  - platform: template
    id: CT_9_Power
    name: "CT 9 Power"
    lambda: return id(CT_9_Current).state * id(voltage_1).state;
    device_class: power
    unit_of_measurement: "W"
    update_interval: 5s

  - platform: ct_clamp
    sensor: ai14
    id: CT_14_Current
    name: "CT 14 Current"
    update_interval: 5s
    filters:
      # 30a 1v CT clamp - General ring
      - calibrate_linear:
          - 0 -> 0
          - 1 -> 30
      - lambda: if(x < 0.05) return 0; else return x;

  - platform: template
    id: CT_14_Power
    name: "CT 14 Power"
    lambda: return id(CT_14_Current).state * id(voltage_1).state;
    device_class: power
    unit_of_measurement: "W"
    update_interval: 5s

  - platform: ct_clamp
    sensor: ai15
    id: CT_15_Current
    name: "CT 15 Current"
    update_interval: 5s
    filters:
      - calibrate_linear:
          method: exact
          datapoints:
            - 0.0 -> 0.0
            - 0.016 -> 1.62
            - 4.85 -> 5.88
            - 8.26 -> 13.58
 
  - platform: template
    id: CT_15_Power
    name: "CT 15 Power"
    lambda: return id(CT_15_Current).state * id(voltage_1).state;
    device_class: power
    unit_of_measurement: "W"
    update_interval: 5s
 
  - platform: total_daily_energy
    name: "CT 15 Total Daily Energy"
    power_id: CT_15_Power
    unit_of_measurement: kWh
    accuracy_decimals: 3
    device_class: energy
    state_class: total_increasing
    filters:
      - multiply: 0.001

time:
  - platform: sntp
    id: my_time



RE: m16v2 energy meter - calibration issues - admin - 04-18-2026

Add more calibrations
different current data, Because it's not a linear relationship. The more calibration data, the more accurate it is.


RE: m16v2 energy meter - calibration issues - PapaC - 04-21-2026

(04-18-2026, 12:59 AM)admin Wrote: Add more calibrations
different current data, Because it's not a linear relationship. The more calibration data, the more accurate it is.

So am I expected to have for example 10 different data points as if so then the product in my opinion is considered useless considering getting that many data points while trying to use a resistive load is insane x 9

Surely there has to be another option?

... if this is literally the only way to get it to work then I'll have to open a return and refund request.


RE: m16v2 energy meter - calibration issues - admin - 04-21-2026

If you want to obtain high-precision data, please choose N30. if you want, we can re send you one N30 board freely. it's better, use by KCS v3 and ESP32S3, more powerful, use BL0910 energy chip manager all data.


RE: m16v2 energy meter - calibration issues - PapaC - 04-22-2026

Does the N30 board have the ability to connect via for example Esphome is it only via MQTT?

If the N30 board is better, why not discontinue the m16v2 board?

I understand calibration with the m16 was needed but not to the degree it sounds like

I would be happy to accept the N30 board, please let me know what details you need.

Additionally, on the N30, can all CT clamps be used on single phase?


RE: m16v2 energy meter - calibration issues - admin - 04-23-2026

N30 support ESPHome yaml or download KCS v3 firmware, auto discovery by MQTT. it's very easy integrate to home assistant. it also support home assisatnt energy dashboard.

here is KCS v3 about N series board: https://www.kincony.com/how-to-use-kcsv3-firmware-energy-meter.html

M16v2 is a low cost solution. N series is new , it will instead of old M series.

M16v2 and N30 use by same CT sensor, just chose 2000:1 "CURRENT" type is better.

if you want N30, tell us your order number and where shop link you bought from.


RE: m16v2 energy meter - calibration issues - PapaC - 04-23-2026

My order was from Aliexpress - 3070197323285033

When you mention 2000:1 for CT clamp, what does this mean exactly as my current clamps as shown from original post are 1v and whatever the suitable amp was for specific applications?


RE: m16v2 energy meter - calibration issues - admin - 04-24-2026

1: i can't find your order number, are you sure order from kincony official aliexpress shop? it's https://kincony.aliexpress.com/store/1100463977
maybe you have bought from our agent. if YES, you need tell us your address or you can contact with aliexpress seller, ask him to send you one N30 board.
2: how to chose CT sensor, here is explained in details: https://www.kincony.com/forum/showthread.php?tid=8488


RE: m16v2 energy meter - calibration issues - PapaC - 04-24-2026

I have attached screenshot of AliExpress store I purchased from, please confirm.

Thank you for info on CT clamp


RE: m16v2 energy meter - calibration issues - admin - 04-24-2026

this is our agent.