Shelly 3EM je třífázový měřič energie od Shelly. Originální firmware toho umí dost – přes cloud nebo lokální API. Jenže já chtěl víc: přímou integraci s Home Assistantem přes MQTT, vlastní kalibraci, LED signalizaci chyb a hlavně – žá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 obvodem ADE7880 od Analog Devices. ADE7880 je precizní třífázový energetický měřič s hardwarovými akumulátory energie – to je důležité detail, ke kterému se vrátím.

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 samozřejmě 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 pomocí binárního parsování – konkrétně hodnoty 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:

Klíčová část YAML konfigurace pro ADE7880:

sensor:
  - platform: ade7880
    irq_pin: GPIO13
    voltage_a:
      name: "Fáze A napětí"
      voltage_gain: 7481  # z originální kalibrace
    current_a:
      name: "Fáze A proud"
      current_gain: 3442  # z originální kalibrace
    active_power_a:
      name: "Fáze A výkon"
      power_gain: 2573    # z originální kalibrace

Hardwarové akumulátory energie

Tohle byl jeden z nejdůležitějších rozhodnutí. ADE7880 má vlastní hardwarové registry pro akumulaci energie – čip počítá kWh přímo v hardwaru, bez závislosti na frekvenci čtení z ESP8266.

Softwarová integrace (výkon × čas) je nepřesná pokud ESP8266 přestane číst – třeba při restartu nebo WiFi výpadku. Hardwarové akumulátory počítají dál i bez ESP.

V ESPHome to vypadá takto:

sensor:
  - platform: ade7880
    energy_a:
      name: "Fáze A energie"
      # Čte se z hardwarového akumulátoru AWATTHR registru

LED signalizace chyb

Originální firmware bliká LED jednoduše. Já chtěl vědět která fáze má problém bez připojení k HA. Implementoval jsem Morse-like vzory:

V ESPHome přes interval komponentu s dynamickým vzorem podle stavu senzorů.

Integrace s Home Assistantem

Data jdou přes MQTT na Home Assistant. Z nich pak počítám odvozené senzory:

Tyto hodnoty pak slouží jako vstup pro EDC Optimalizátor alokace.

Výsledek

Měřič funguje přesně, data vidím v HA v reálném čase, žádný cloud, žádné předplatné. Kalibrační koeficienty z výroby jsou zachovány, takže přesnost je stejná jako u originálního firmware.

Celý projekt ukázal, že i uzavřené IoT zařízení jde rozumně otevřít – stačí záloha před flashováním a trocha trpělivosti s binárními formáty.