[OpenHAB] Công tơ điện tử với PZEM004T và ESPHome trên ESP32-C3.
Nghia Phan
Mục Lục Bài Viết
Thông tin và yêu cầu
- OpenHAB version: 4.3.3
- Đã cài đặt MQTT binding
- PZEM004T v1 (bản xuất khẩu) or V3 nội địa - tham khảo giá trên shopee
- ESP32, ESP32-C3 SuperMini … nếu là ESP32-C3 SuperMini thì nên mua bản có anten (tham khảo ở shopee)

Tham khảo thêm phần cứng
Nếu mẫu PZEM004T đang dùng không phù hợp hoặc cần so sánh phiên bản khác, có thể tham khảo thêm một mẫu PZEM004T khác trên Shopee. Trước khi đấu nối, mình vẫn cần kiểm tra đúng phiên bản, sơ đồ chân và điện áp của module.
Hướng dẫn build sử dụng ESPHome
- Tham khảo dự án ESPHome ở đây
- Cài đặt ESPHome vào PC theo hướng dẫn ở đây
- Dưới đây là code mình đang sử dụng để gửi MQTT đến server (MQTT Broker) mỗi 2s
esphome: name: pzem004t-mqtt friendly_name: PZEM004T to MQTT min_version: 2025.3.2 name_add_mac_suffix: true platformio_options: board_build.f_flash: 40000000L board_build.flash_mode: dio board_build.flash_size: 4MB esp32: board: esp32-c3-devkitm-1 framework: type: esp-idf uart: rx_pin: 8 tx_pin: 9 baud_rate: 9600modbus:mqtt: broker: "192.168.0.4" username: "user" password: "password" discovery: false discover_ip: falsewifi: ssid: "WIFI SSID" password: "********"ota: - platform: esphome password: "******"logger: level: INFOsensor: - platform: pzemac current: name: "PZEM-004T Current" voltage: name: "PZEM-004T Voltage" energy: # Nhân Energy với 0.001 để quy đổi đơn vị từ Wh sang kWh name: "PZEM-004T Energy" filters: - multiply: 0.001 power: name: "PZEM-004T Power" frequency: name: "PZEM-004T Frequency" power_factor: name: "PZEM-004T Power Factor" update_interval: 2s - platform: wifi_signal name: "WiFi Signal dB" id: wifi_signal_db update_interval: 300s - platform: copy source_id: wifi_signal_db name: "WiFi Signal Percent" filters: - lambda: return min(max(2 * (x + 100.0), 0.0), 100.0); unit_of_measurement: "Signal %"
- Dòng 17-18 cấu hình chân RX-TX trên ESP32-C3
- Dòng 24-26 cấu hình MQTT Broker
- Dòng 31-32 cấu hình WIFI
- Dòng 36 cấu hình mật khẩu khi update OTA
- Dòng 58 tần suất cập nhật số liệu lên MQTT Broker
Kiểm tra MQTT Broker xem đã nhận số liệu chưa

Cấu hình Things trên OpenHAB
UID: mqtt:topic:17653025f5:3574a13d85label: PZEM004T Power MonitorthingTypeUID: mqtt:topicconfiguration: {}bridgeUID: mqtt:broker:17653025f5location: Housechannels: - id: PZEM004T_House_Voltage channelTypeUID: mqtt:number label: PZEM004T House Voltage description: "" configuration: stateTopic: pzem004t-mqtt-be5d84/sensor/pzem-004t_voltage/state - id: PZEM004T_House_Power channelTypeUID: mqtt:number label: PZEM004T House Power description: "" configuration: stateTopic: pzem004t-mqtt-be5d84/sensor/pzem-004t_power/state - id: PZEM004T_House_Current channelTypeUID: mqtt:number label: PZEM004T House Current description: "" configuration: stateTopic: pzem004t-mqtt-be5d84/sensor/pzem-004t_current/state - id: PZEM004T_House_Energy channelTypeUID: mqtt:number label: PZEM004T House Energy description: "" configuration: stateTopic: pzem004t-mqtt-be5d84/sensor/pzem-004t_energy/state - id: PZEM004T_House_Freq channelTypeUID: mqtt:number label: PZEM004T House Frequency description: "" configuration: stateTopic: pzem004t-mqtt-be5d84/sensor/pzem-004t_frequency/state - id: PZEM004T_House_PowerFactor channelTypeUID: mqtt:number label: PZEM004T House PowerFactor description: "" configuration: stateTopic: pzem004t-mqtt-be5d84/sensor/pzem-004t_power_factor/state - id: PZEM004T_House_Sensor_Status channelTypeUID: mqtt:string label: PZEM004T House Sensor Status description: "" configuration: stateTopic: pzem004t-mqtt/status - id: PZEM004T_House_Wifi_Sginal_Level_dB channelTypeUID: mqtt:number label: PZEM004T House Wifi Sginal Level dB description: "" configuration: stateTopic: pzem004t-mqtt-be5d84/sensor/wifi_signal_db/state - id: PZEM004T_House_Wifi_Sginal_Level_Percent channelTypeUID: mqtt:number label: PZEM004T House Wifi Sginal Level Percent description: "" configuration: stateTopic: pzem004t-mqtt-be5d84/sensor/wifi_signal_percent/state
- BONUS DSL Script tính số điện sử dụng trong ngày,tháng, khoảng thời gian
- Dữ liệu sẽ update vào 3 item là:
Energy_Consumption_Day,Energy_Consumption_Month,Energy_Consumption_Period.
- Dữ liệu sẽ update vào 3 item là:
logInfo("EnergyConsumption", "Current Energy: " + PZEM004T_House_Energy.state.toString + " - " + now.toString) val startOfDay = now.with(LocalTime.MIDNIGHT) val startOfMonth = now.withDayOfMonth(1).with(LocalTime.MIDNIGHT) val startOfPeriod = now.withMonth(4).withDayOfMonth(1).with(LocalTime.MIDNIGHT) // Bắt đầu vào 1 tháng 4 val dayAgoValue = PZEM004T_House_Energy.persistedState(startOfDay) val monthAgoValue = PZEM004T_House_Energy.persistedState(startOfMonth) val periodAgoValue = PZEM004T_House_Energy.persistedState(startOfPeriod) val currentEnergy = PZEM004T_House_Energy.state as QuantityType<Number> val dayEnergy = dayAgoValue.state as QuantityType<Number> val monthEnergy = monthAgoValue.state as QuantityType<Number> val periodEnergy = periodAgoValue.state as QuantityType<Number> val dailyConsumption = (currentEnergy.subtract(dayEnergy)).doubleValue val monthlyConsumption = (currentEnergy.subtract(monthEnergy)).doubleValue val periodConsumption = (currentEnergy.subtract(periodEnergy)).doubleValue // Update Items with calculated values Energy_Consumption_Day.postUpdate(dailyConsumption) Energy_Consumption_Month.postUpdate(monthlyConsumption) Energy_Consumption_Period.postUpdate(periodConsumption) Thẻ:
#openhab
Bình Luận & Thảo Luận
Góp ý, hỏi đáp và chia sẻ suy nghĩ của bạn