Прошиваем PZEM-004T на ESPHome и добавляем в Home Assistant (MQTT-API)

Пока модуль PZEM-004T v3 до меня едет для экспериментов … попробуем прошить его на альтернативную прошивку ESPHome. Я это никогда не делал … так как был фанатом Tasmota. Есть еще прошивки от ESPEasy, но там тестовый вариант работы с PZEM-004T данными был. У меня стоит задача также добавить все сенсоры мониторинга PZEM-004T в HomeAssistant через MQTT брокер, либо через API.  Прошивать будем через аддон Home Assistant (ESPHome). Установить его не проблема … поэтому детально его рассматривать нет необходимости.

Запускаем плагин и открываем его домашнюю страницу. При первом запуске он предложит нам создать ноду (назовем ее попроще: конфигурацию какой-то отдельной железки) для конткретного устройства. У меня такое устройство NodeMCU ESP8266MOD.

WIFI-SSID: это SSID нашей домашней сети Wifi

На этом завершена 1ая часть. Устройство пока у нас Offline, так как физически к Raspberry мы еще ничего не подключили. Далее создаем конфигурацию в ESPHome для нашего модуля wifi ESP8266MOD  (я привожу полный конфиг), которую запишем с прошивкой. В данном случае я буду подключать данные (PZEM) с ESP8266MOD в HomeAsisitant через MQTT брокер (через API у меня не получилось, об этом читайте в конце). Конфиг для MQTT

esphome:
  name: pzem
  platform: ESP8266
  board: nodemcuv2
  
uart:
  id: PZEM
  rx_pin: D1
  tx_pin: D2
  baud_rate: 9600
  stop_bits: 1

# Enable logging
logger:

mqtt:
  broker: 192.168.1.30
  username: "ha"
  password: "password"

ota:
  password: "72206ae32a16d6963bafd08afba6d99b"

wifi:
  ssid: "INHIBITZ-NET"
  password: "password"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Pzem AP Hotspot"
    password: "pass123456"

captive_portal:

web_server:
  port: 80

sensor:
  - platform: pzemac
    current:
      name: "PZEM-004T 220V Current"
    voltage:
      name: "PZEM-004T 220V Voltage"
    energy:
      name: "PZEM-004T 220V Energy"
    power:
      name: "PZEM-004T 220V Power"
      id: power_monitor
    frequency:
      name: "PZEM-004T 220V Frequency"
    power_factor:
      name: "PZEM-004T 220V Power Factor"
    update_interval: 10s  
#   address: 1
    
  - platform: total_daily_energy
    name: "PZEM-004T 220V Total Daily Energy"
    power_id: power_monitor
    filters:
      - multiply: 0.001
    accuracy_decimals: 2
    unit_of_measurement: kW
    icon: mdi:counter 
    
  - platform: integration
    name: "PZEM-004T 220V Energy Meter" 
    sensor: power_monitor
    time_unit: h
    filters:
     # Multiplication factor from W to kW is 0.001
      - lambda: return x * (0.001);
    unit_of_measurement: kWh
    icon: mdi:counter
    restore: true 
    
switch:
  - platform: uart
    uart_id: PZEM
    name: "PZEM-004T 220V Energy Reset"
    data: [0x01, 0x42, 0x80, 0x11]
    
time:
  - platform: homeassistant
    id: hass_time

контакты D1/D2 резервируем на модуле ESP8266, куда будем подключать данные с PZEM-004T (TX/RX), можно выбирать и другие D3/D4 … все равно.

Теперь что касается физики. Подключать мы будем старым провереннем способом через USB-прошиватель на чипе CH340. Что это за прошиватель … гуглим постами ранее.

Т.е. сначала подключаем все проводки от ESP8266 к CH340, далее CH340 вставляем в USB порт нашего Raspberry. Схема следующая : (все контакты не модулях подписаны и ошибиться сложно)

 

ESP8266MOD USB CH340
3V3 3V3
GND GND
TX RX
RX TX

Далее вставляем в порт USB Raspberry наш прошивальщик., и выполняем команду в Linux

pi@ihome:~ $ lsusb
Bus 002 Device 002: ID 174c:55aa ASMedia Technology Inc. Name: ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 0665:5161 Cypress Semiconductor USB to Serial
Bus 001 Device 005: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 007: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

ну в системе у меня оказалось для USB чипа 340 идентичных … у вас скорее он будет один.

Начинается самое интересное. Выходим на рубеж в ESPHome страницу и выполняем нажатие VALIDATE (проверка конфигурации)

проверяем безошибочность нашей конфигурации. Конфигурация должны быть без ошибок (INFO Configuration is valid!)

Если все правильно подключили то статус OFFLINE смениться на ONLINE

если нет … не так страшно (никаких драйверов устанавливать не надо). Выбираем LOG

далее должны увидеть список всех устройство USB в нашей системе Raspberry. У меня это USB1 это прошивальщик, а USB0 как оказалось USB стик Zigbee

Ну что начинаем прошивать. Процесс прошивки простой. Выключаем модуль ESP8266MOD от сети (можно просто тупо снять проводок питания с 3.3V). Далее на модуле ESP8266MOD нажимаем на кнопку Flash и подключаем питание красного кабеля к 3.3V и уже в самом интерфейсе ESPHome нажимает на INSTALL

далее выбираем наше ttyUSB1 устройство (у вас оно может быть другим)

и начинается сам процесс прошивки

окончанием процесса является строка

на этом все остановится. далее нужно нажать 1 раз на кнопку Reset на нашем модуле ESP8266MOD

ну на этом все. Осталось понять … что у нас получилось. 🙂 У нас должны быть в MQTT куча сенсоров, должен быть Web портал счетчика с данными.

Web морда (данных пока так как нет самого PZEM-004T у меня)

в HomeAssistant наши сенсоры

Теперь о проблемах.

ОШИБКА 1

В какой-то момент я решил полностью отказаться от подключения по API к HA, так как каждые 15 минут модуль перезагружался (ну так заложено … что поделаешь) и получил ошибку

Component time.homeassistant requires component api.
  platform: homeassistant
  id: hass_time

Что-ж это хреново … так как у нас планируется отключение синхронизации времени с HA и модулем ESP … а этого нам не надо для показаний счетчиков. Будем копать далее …

смотрим в документацию

reboot_timeout (Optional, time): The amount of time to wait before rebooting when no client connects to the API. This is needed because sometimes the low level ESP functions report that the ESP is connected to the network, when in fact it is not - only a full reboot fixes it. Can be disabled by setting this to 0s. Defaults to 15min.

дополняем конфиг

 

# Enable Home Assistant API 
api: 
  password: password 
  reboot_timeout: 0s

прошиваем по новой и видим в VALIDATE reboot_timeout: 0s, то что нужно. Конфиг исправен.

ОШИБКА 2

Собственно это и связано с тем, что я не мог подключиться по API (пока не покурил документацию). Для подключения к данным ESP8266 через HA по API необходимо войти в Home Assistant -> Intergration и найти интеграцию pzem (ESPHOME), здесь будут собираться все сенсоры от ESP’шек наших конфигураций … Вообщем стандартный сценарий активации интеграций, Семён Семёныч 🙂

Необходимо будет ввести пароль указанный в конфигурации прошивки ESP8266MOD (параметр api_password: password), и подключиться с Home Assistant к модулю ESP8266MOD (к сожалению здесь я скринов не сделал). Результат таков после ввода пароля :

,

Таким образом появились следующие сущности (они все идут с индексом _2 так как ранее выше мы с вами подключали такие же сенсоры через MQTT, вообщем выбирайте либо сенсоры через API, либо через MQTT конфигурацию)

Ну на этом все … будет что-то новое … материал дополню. 🙂

Рабочий конфиг получился следующим

esphome:
  name: pzem
  platform: ESP8266
  board: nodemcuv2
  
uart:
  id: PZEM
  rx_pin: D1
  tx_pin: D2
  baud_rate: 9600
  stop_bits: 1

# Enable logging
logger:
#  level: VERBOSE

# Enable Home Assistant API
api:
  password: password
  reboot_timeout: 0s

# раскомментируйте если хотите данные брать через MQTT
#mqtt:
#  broker: 192.168.1.30
#  username: "ha"
#  password: "password"

ota:
  password: "72206ae32a16d6963bafd08afba6d99b"

wifi:
  ssid: "INHIBITZ-NET"
  password: "klkm34n116"
  reboot_timeout: 0s

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Pzem AP Hotspot"
    password: "pass1234567"

captive_portal:

web_server:
  port: 80

sensor:
  - platform: pzemac
    current:
      name: "PZEM-004T 220V Current"
    voltage:
      name: "PZEM-004T 220V Voltage"
    energy:
      name: "PZEM-004T 220V Energy"
    power:
      name: "PZEM-004T 220V Power"
      id: power_monitor
    frequency:
      name: "PZEM-004T 220V Frequency"
    power_factor:
      name: "PZEM-004T 220V Power Factor"
    update_interval: 10s  
#   address: 1
    
  - platform: total_daily_energy
    name: "PZEM-004T 220V Total Daily Energy"
    power_id: power_monitor
    filters:
      - multiply: 0.001
    accuracy_decimals: 2
    unit_of_measurement: kW
    icon: mdi:counter 
    
  - platform: integration
    name: "PZEM-004T 220V Energy Meter" 
    sensor: power_monitor
    time_unit: h
    filters:
     # Multiplication factor from W to kW is 0.001
      - lambda: return x * (0.001);
    unit_of_measurement: kWh
    icon: mdi:counter
    restore: true 
    
switch:
  - platform: uart
    uart_id: PZEM
    name: "PZEM-004T 220V Energy Reset"
    data: [0x01, 0x42, 0x80, 0x11]
    
time:
  - platform: homeassistant
    id: hass_time
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
2 комментариев
Популярные
Новые Старые
Межтекстовые Отзывы
Посмотреть все комментарии
виталий
виталий
07.10.2021 11:32

а как сделать сенсор чтобы показывал общие показания счетчика, ну тоесть то что на счетчике

mstsc
mstsc
20.10.2021 14:21

безумно тебе благодарен!!!

2
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x