Большущее спасибо @serg_42 за схему! На моём экземпляре устройства наименования микросхем были затёрты, я не мог опознать измеритель тока и напряжения.
Благодаря этой схеме мне успешно удалось установить на мою розетку свободную прошивку ESPHome. ESPHome портирован с помощтю рантайма libretiny, сайт (англоязычный) находится здесь:
https://docs.libretiny.eu/
Итак, инструкция.
1. Разбираем розетку полностью. Да-да, полностью. Нам нужен доступ к отладочному порту UART2, который выведен на две тестовые площадки сзади модуля WR2. Для этого нужно отпаять сам модуль. Я подпаял к нему трёхконтактный разъём
2. Для ввода в режим программирования необходимо при подаче питания замкнуть TX (модуля) на корпус. Я соорудил для этого небольшой адаптер
3. Не любой USB-Serial адаптер подойдёт для программирования. Связь осуществляется на не очень стандартной скорости 1.5Mbps. PL2303 не сработал (под Windows). FT232 работает на ура.
4. В принципе это и так очевидно, но ***
ВНИМАНИЕ *** !!! НЕ ВЗДУМАЙТЕ ЗАПИТЫВАТЬ РОЗЕТКУ, ВОТКНУВ ЕЁ В 220 ВОЛЬТ!!! Устройство имеет бестрансформаторный источник питания, соединение с компьютером в таком случае подаст на него 220 вольт и выведет его из строя!!! А возможно и вас самого!!! Можно использовать лабораторный блок питания (или другой безопасный, имеющийся в наличии), подключив его к контактам вторичного питания 5В.
5. Запитать модуль от самого USB-Serial адаптера также не представляется возможным. У адаптера есть выход 3.3В, но он очень слаб. На моей практике его хватило для собственно программирования, но когда прошивка запускается и хочет поднять радио, питания резко перестаёт хватать, и вы наблюдаете рандомные креши. Поэтому вам точно нужен БП.
А это конфигурация ESPHome:
Код:
|
esphome:
name: yndx-0007
libretiny:
board: generic-rtl8710bn-2mb-788k
framework:
version: latest
# verbose/trace/debug/info/warn/error/fatal
loglevel: info
# suppress chip's SDK log messages
# (same as LT_UART_SILENT_ALL above)
sdk_silent: false
# disable SWD/JTAG so that all GPIOs can be used
# set to false if you want to attach a debugger
gpio_recover: true
logger:
hardware_uart: "SERIAL2"
api:
password: ""
ota:
password: ""
wifi:
ssid: "XXX"
password: "XXX"
ap:
ssid: "yndx-0007"
password: ""
captive_portal:
web_server:
switch:
- platform: gpio
name: "Relay"
pin: GPIOA00
id: relay
restore_mode: RESTORE_DEFAULT_OFF
light:
- platform: status_led
id: statusled
pin:
number: PA23
inverted: true
binary_sensor:
- platform: gpio
pin:
number: PA18
inverted: true
mode:
input: true
pullup: false
filters:
- delayed_off: 10ms
name: "Button"
on_click:
- switch.toggle: relay
sensor:
- platform: hlw8012
model: BL0937
# Resistor values are 2M and 1K, however this value gives readings significantly higher than normal
# I calibrated this value using my official (used for billing) energy meter readings as a reference
# voltage_divider: 2001
voltage_divider: 1790
sel_pin:
number: PA15
inverted: true
cf_pin:
number: PA05
inverted: true
cf1_pin:
number: PA12
inverted: true
current:
name: "Current"
voltage:
name: "Voltage"
power:
name: "Power"
energy:
name: "Energy"
update_interval: 5s
change_mode_every: 4 |
Как написано в комментариях, коэффициент делителя я калибровал по следующей процедуре:
1. Ставим 2001 и смотрим измеренное значение.
2. Определяем коэффициент: K = Div/Vизм
3. Для лучшей точности надо повторить пункт 1 с другим значением. В результате например у меня получилось K = 7.6
4. Определяем правильное значение делителя как Div = Vref * K, где Vref - значение от эталонного прибора. Я использовал счётчик Меркурий, который у меня подключен к умному дому и выдаёт напряжение.
5. Пункт 4 даёт хорошее значение с небольшим отклонением от эталона (поскольку измеренное напряжение плавает в пределах 1В), его можно покрутить для получения желаемой точности. Мне удалось добиться разницы в 0.5В с эталоном, дальше я просто не стал.