Shelly 3EM: Jak jsem nahradil originální firmware za ESPHome
Shelly 3EM je třífázový měřič energie od Shelly. Originální firmware toho umí dost, přes cloud nebo lokální API. Chtěl jsem víc: přímou integraci s Home Assistantem přes MQTT, vlastní kalibraci, LED signalizaci chyb a žádný cloud.
Tak jsem ho rozebral a přepsal firmware od základu.
Hardware: co je uvnitř
Shelly 3EM je postavený na čipu ESP8266 (Tensilica L106, 80 MHz, 2 MB flash) a měřicím obvodu ADE7880 od Analog Devices. ADE7880 je precizní třífázový energetický měřič s hardwarovými akumulátory energie.
Na desce jsou tři proudové transformátory (CT), napěťové děliče pro měření napětí všech tří fází a relé pro odpojení zátěže.
Záloha originálu a extrakce kalibrace
Než jsem cokoliv měnil, zálohoval jsem originální firmware pomocí esptool.py:
esptool.py --port /dev/ttyUSB0 read_flash 0x0 0x200000 shelly3em_backup.bin
Tohle je zásadní krok. V originálním firmware jsou uloženy kalibrační koeficienty pro každou fázi, hodnoty, které Shelly změřil při výrobní kalibraci. Bez nich by přesnost měření byla špatná.
Koeficienty jsou uloženy v EEPROM oblasti flashe. Extrahoval jsem je binárním parsováním, konkrétně current_gain, voltage_gain a power_gain pro každou ze tří fází.
ESPHome konfigurace
ESPHome podporuje ADE7880 nativně od verze 2023.x. Konfiguraci jsem postavil tak, aby:
- zachovala originální kalibrační koeficienty ze zálohy firmware,
- používala hardwarové akumulátory energie v ADE7880,
- publikovala data přes MQTT každých 15 sekund,
- LED dioda signalizovala stav pomocí dynamických vzorů.
Klíčová část YAML konfigurace pro ADE7880:
sensor:
- platform: ade7880
irq_pin: GPIO13
voltage_a:
name: "Fáze A napětí"
voltage_gain: 7481
current_a:
name: "Fáze A proud"
current_gain: 3442
active_power_a:
name: "Fáze A výkon"
power_gain: 2573
Hardwarové akumulátory energie
ADE7880 má vlastní hardwarové registry pro akumulaci energie. Čip počítá kWh přímo v hardwaru, bez závislosti na tom, jak často ESP8266 hodnoty čte.
Softwarová integrace (výkon × čas) je nepřesná, když ESP8266 přestane číst, třeba při restartu nebo výpadku Wi-Fi. Hardwarové akumulátory počítají dál i bez ESP.
sensor:
- platform: ade7880
energy_a:
name: "Fáze A energie"
LED signalizace chyb
Originální firmware bliká LED jednoduše. Chtěl jsem vědět, která fáze má problém, bez připojení k Home Assistantu. Vzory jsou:
- jedno rychlé bliknutí: problém fáze A,
- dvě rychlá bliknutí: problém fáze B,
- tři rychlá bliknutí: problém fáze C,
- kombinace: více fází.
V ESPHome to řeší komponenta interval s dynamickým vzorem podle stavu senzorů.
Integrace s Home Assistantem
Data jdou přes MQTT do Home Assistantu. Z nich pak počítám odvozené senzory:
sensor.edc_export_15min_maxje export FVE do sítě za 15 minut,sensor.edc_byt_15min_maxje spotřeba bytu za 15 minut.
Tyto hodnoty slouží jako vstup pro EDC Optimalizátor alokace.