Dùng mạch Pzem-004T v3 làm công tơ điện tử, tích hợp vào Home Assistant

499
17

Giới thiệu

Chào các bạn, bài viết này hướng dẫn cách sử dụng module pzem-004T tích hợp vào hass để làm 1 công tơ điện tử thông minh.
Những việc bạn có thể làm với nó đó là đo volt nguồn điện, đo dòng điện, công suất tiêu thụ, lượng điện tiêu thụ hôm nay, hôm qua và tổng lượng điện tiêu thụ hàng tháng.

Khi tích hợp vào Home Assistant thì các bạn có thể làm được nhiều điều hơn như lập biểu đồ thống kê lượng điện tiêu thụ hàng giờ, hàng ngày, hàng tháng…

Chuẩn bị

Trong bài viết này, mình dùng mạch pzem-004T V3, kết nối với sonoff basic qua giao tiếp TTL
Các bạn có thể mua mạch pzem 004T tại đây
Sonoff basic đã được nạp tasmota 6.5
Home Assistant đã được cài đặt MQTT

Để làm được như trong bài viết này các bạn phải biết một số kiến thức cơ bản về mqtt, sensor, lovelace trong hass.

Các bạn có thể xem hướng dẫn cách tải và nạp tasmota tại đây

Kết nối

 

Các bạn Kết nối như trên hình, Pzem-004T hoạt động ở điện áp 5v, vì vậy để nó hoạt động được ở điện áp 3v3 cùng với esp8266 các bạn phải nối thêm điện trở ở vị trí sau:

Gắn thêm điện trở để pzem 004t hoạt động tốt ở điện áp 3v3

  1. nối GND của Pzem-004T với GND của Sonoff basic, VCC của pzem-004T với 3.3V của Sonoff basic
  2. TX và RX của Pzem-004T nối lần lượt với RX và TX của Sonoff basic
  3. Luồn cuộn dây vào 1 sợ dây điện lưới ngay phía sau cầu dao tổng.
  4. Cấp nguồn cho Pzem-004T và sonoff basic

Cài đặt Tasmota trên sonoff

Để Sonoff lấy được dữ liệu của pzem-004T và hoạt động đúng các bạn phải cài đặt module như sau:

Cài đặt cổng GPIO:

Gõ địa chỉ IP để vào giao diện của tasmota, chọn configuration -> configure module:

  1. GPIO1 Serial Out: chọn PZEM0XX Tx (62)
  2. GPIO3 Serial In: chọn PZEM016 Rx (98)

Giao diện khi cài đặt thành công

Cài đặt độ trễ tín hiệu

Mặc định thì tasmota sẽ lấy dữ liệu 5 phút 1 lần, các bạn có thể giảm thời gian này xuống 1 phút bằng cách gõ lệnh trong console:

TelePeriod 60

Cài đặt múi giờ.

Tasmota tự động đồng bộ hóa giờ qua internet, tuy nhiên múi giờ mặc định là GMT-1
Tasmota sai giờ dẫn đến thời gian reset bộ đếm điện năng tiêu thụ hàng ngày không đúng, với múi giờ mặc định thì nó sẽ reset bộ đếm = 0 vào lúc 6:00

Cách chỉnh lại múi giờ rất đơn giản, chỉ cần vào console gõ lệnh sau:

Timezone +7

Các bạn xem giờ trong console xem đúng chưa nhé.

Cài đặt MQTT

Các bạn cài đặt MQTT trên sonoff cho đúng để kết nối với home assistant nhé.

Cài đặt trên Home Assistant

Bước kết nối, và cài đặt trên tasmota đã hoàn tất, tuy nhiên qua giao diện của tasmota chúng ta chỉ thấy được thông số của ngày hôm nay, hôm qua và tổng hàng tháng.
Để làm được nhiều việc hơn thì chúng ta phải kết nối hệ thống này với home assistant.

Lấy dữ liệu từ sonoff

Dữ liệu của Pzem-004T trả về dưới định dạng JSON, bạn có thể xem dữ liệu sensor trong phần console,
đây là ví dụ 1 đoạn dữ liệu JSON mà tasmota trả về:

{  
   "Time":"2019-07-08T15:48:44",
   "ENERGY":{  
      "TotalStartTime":"2019-06-29T10:34:48",
      "Total":95.325,
      "Yesterday":16.842,
      "Today":11.621,
      "Period":27,
      "Power":1639,
      "ApparentPower":1658,
      "ReactivePower":248,
      "Factor":0.99,
      "Frequency":50,
      "Voltage":210,
      "Current":7.899
   }
}

Để hiển thị dữ liệu này trên home assistant thì chúng ta phải tạo 1 sensor mqtt
Trong configuration.yaml thêm dòng sau:

sensor:
  - platform: mqtt
    name: "Voltage"
    state_topic: "tele/powermeter/SENSOR"
    value_template: "{{ value_json['ENERGY'].Voltage }}"
    unit_of_measurement: "V"
    icon: mdi:flash
  - platform: mqtt
    name: "Power"
    state_topic: "tele/powermeter/SENSOR"
    value_template: "{{ value_json['ENERGY'].Power }}"
    unit_of_measurement: "W"
    icon: mdi:power-plug
  - platform: mqtt
    name: "Energy Today"
    state_topic: "tele/powermeter/SENSOR"
    value_template: "{{ value_json['ENERGY'].Today }}"
    unit_of_measurement: "kWh"
    icon: mdi:calendar-today
  - platform: mqtt
    name: "Energy Yesterday"
    state_topic: "tele/powermeter/SENSOR"
    value_template: "{{ value_json['ENERGY'].Yesterday }}"
    unit_of_measurement: "kWh"
    icon: mdi:calendar-today
  - platform: mqtt
    name: "Energy Total"
    state_topic: "tele/powermeter/SENSOR"
    value_template: "{{ value_json['ENERGY'].Total }}"
    unit_of_measurement: "kWh"
    icon: mdi:calendar-blank

Như dòng code trên, mình đã tạo 5 sensors để lưu 5 thông số.

Dùng Utility Meter để theo dõi thông số chính xác hơn

Mình dùng hệ thống này được vài hôm và phát hiện ra khi mất điện thì lượng điện tiêu thụ ngày hôm nay ([‘ENERGY’].Today) sẽ bị sai,
ngoài ra, tổng điện tiêu thụ hàng tháng được reset vào ngày 1 của đầu tháng, tuy nhiên điện lực lại chốt số công tơ vào ngày khác.

Vì vậy mình sẽ dùng 1 component có sẵn của home assistant là Utility Meter.
Component tạo ra biến đếm có chức năng là theo dõi giá trị tăng dần của 1 sensor khác.
Biến đếm này có thể reset hàng ngày vào giờ nào đó, hoặc hàng tháng vào 1 ngày/giờ nào đó theo thiết lập sẵn.

Việc dùng Utility Meter sẽ khắc phục được nhược điểm của của pzem-004T.

Mình tạo ra 2 sensors, để lưu trữ lượng điện tiêu thụ hàng ngày, hàng tháng như sau:

utility_meter:
  daily_energy:
    source:  sensor.energy_today
    cycle: daily
  monthly_energy:
    source:  sensor.energy_today
    cycle: monthly
    offset:
      days: 14

Các bạn chú ý phần offset days: 14 tức là nó sẽ reset về 0 vào 0:00 ngày 14 hàng tháng.

Hiển thị dữ liệu sensor lên Home Asssitant

Trong bài viết này, mình sử dụng custom card để hiển thị biểu đồ dữ liệu tên là Mini Graph Card,
Các bạn có thể cài đặt theo hướng dẫn ở đây https://github.com/kalkih/mini-graph-card

Sau khi cài đặt hãy thử thêm 1 custom card như sau để thống kê lượng điện hàng giờ:

entities:
  - sensor.power
name: Power
points_per_hour: 1
show:
  graph: bar
type: 'custom:mini-graph-card'

Dùng Influxdb để lưu và thống kê dữ liệu hiệu quả hơn

Home assistant sử dụng SQLlite để lưu trữ dữ liệu của sensor, switch, …
Việc lưu hết thông số của Home Assistant lên đó sẽ làm dữ liệu ngày một tăng lên, làm giảm tốc độ khởi động. Vì vậy mình khuyên các bạn nên để giới hạn lưu dữ liệu thấp xuống, không lưu các trạng thái, sensor không cần thiết để có 1 hệ thống hoạt động tối ưu.

Influxdb là cơ sở dữ liệu được tối ưu cho việc lưu dữ liệu theo chuỗi thời gian, nó được tích hợp sẵn vào Home Assistant dưới dạng Addon, các bạn có thể cài thêm.

Sau khi cài đặt influxdb các bạn có thể lập biểu đồ thống kê năng lượng điện tiêu thụ hàng ngày như sau:

Mở rộng

Công thức tính tiền điện hàng tháng dùng Template sensor trong home assistant

Công thức tính theo bảng giá điện sinh hoạt, các bạn có thể thêm vào hass như 1 sensor:

sensor:
  - platform: template
    sensors:
      tiendien:
        friendly_name: "Tiền điện"
        unit_of_measurement: 'đ'
        value_template: >-
          {% set watt = states('sensor.monthly_energy')|float %}
          {%- if(watt >= 400) -%}
          {% set money = 83900 + 173400 + 201400 + 253600 + 283400 + (watt-400)*2927 %}
          {%- elif(watt >= 300) -%}
          {% set money = 83900 + 173400 + 201400 + 253600 + (watt-300)*2834 %}
          {%- elif(watt >= 200) -%}
          {% set money = 83900 + 173400 + 201400 + (watt-200)*2536 %}
          {%- elif(watt >= 100) -%}
          {% set money = 83900 + 173400 + (watt-100)*2014 %}
          {%- elif(watt >= 50) -%}
          {% set money = 83900 + (watt-50)*1734 %}
          {%- else -%}
          {% set money = watt*1678 %}
          {%- endif-%}
          {% set money = money*1.1 %}
          {{ "{0:,.0f}".format(money| int) }}

 

Cách calibrate module pzem-004T

Thiết bị được bán ra đã được calibrate ít nhất 2 lần bằng thiết bị chuyên dụng (theo lời NSX).

Trong trường hợp module của bạn không chính xác thì bạn có thể calibrate nó bằng phần mềm đi theo của nxs,
việc calibrate module cần có thiết bị chuyên dụng, điều kiện hiệu chuẩn là điện 220v, dòng 10A

Mật khẩu để calibrate là pzem014/6