blog.vyoralek.cz

ESP32 a ESPHome jako Xiaomi bluetooth gateway pro HA

Jak propojit Xiaomi bluetooth zařízení s HomeAssistantem pomocí brány postavené na firmware ESPHome a desce ESP32.

V minulém roce jsem napsal hned několik článků o tom jak z HomeAssistanta číst informace z Xiaomi Mi Flora sensoru a jeden z nich byl o řešení pomocí ESP32 a ESPHome.

Od té doby se množina podporovaných bluetooth produktů výrazně rozšířila a dnes už můžeme říct, že ESPHome dokáže být plnou náhradou za Xiaomi Bluetooth Gateway.

Na nějakou dobu byl v ESPHome problém s novými produkty Xiaomi, které začali používat šifrování broadcastovaných zpráv a nebylo úplně jasné jak tyto zprávy dešifrovat. Naštěstí i toto je v poslední DEV verzi ESPHome vyřešeno a můžeme si tak udělat hezký sumář všech zajímavých podporovaných produktů a jak je v ESPHome nastavit.

Jak to celé funguje?

Hodilo by se připomenout proč vůbec něco takového potřebujeme a jak nám to může pomoci. Představme si situaci, že si koupíme například Mi Flora sensor, který se oficiálně páruje v Mi Home aplikaci v telefonu a na tomtéž místě si můžeme přečíst aktuální hodnoty sensoru.

Pokud ale chceme mít alespoň trochu chytrou domácnost, chceme abychom mohli mít všechny sensorová data na jednom místě a z tohoto místa se pak rozhodovat co se má stát – definovat automatizace. Proto potřebujeme nahradit telefon a Mi Home aplikaci něčím, co dokáže bezproblémů komunikovat s HomeAssistantem.

A proto přichází na scénu ESP32 – jakožto náhrada telefonu a ESPHome – jakožto náhrada Mi Home aplikace.

Proč ESP32?

ESP32 jsem vybral z vícero důvodu:

  1. obsahuje všechny potřebné HW části – má čip pro WiFi ale také Bluetooth komunikaci
  2. je univerzální – nic nám nebrání připojit více bluetooth zařízení na jednu desku a zároveň ji použít i k dalším věcem, které mohou být pod stejným firmware
  3. samotná deska je extrémně levná
  4. má velmi malou spotřebu

Já mám dlouhodobě oblíbenou desku Doit ESP32, která obsahuje vše potřebné a je za supr cenu

$4.5 (cca. 100kč)

a nebo jako alternativu ESP32-CAM, která je jen o trochu dražší, ale navíc obsahuje konektor na externí anténu a jako bonus mini kameru:

$6 (cca. 150kč)

💡Existuje i možnost ESP32 jako prostředníka úplně vynechat a použít přímo bluetooth na např. Raspberry Pi, nicméně pak nemůžeme použít ESPHome a jsme vázání nepříliš velkým dosahem bluetooth Raspberry Pi.

S ESP32 můžeme konečné bluetooth zařízení umístit defakto kdekoli kam dosahá signál WiFi – což je zpravidla mnohem dále než bluetooth.

Firmware ESPHome

Nebudu zde zabíhat do detailů k ESPHome, nicméně alespoň ve stručnosti – ESPHome je firmware pro vývojové desky s čipy ESP8266 a ESP32 a poskytuje možnost přípravy vlastního firmware bez nutnosti znalosti programování – vše probíhá formou YAML konfigurace.

Samotný ESPHome je napsán v jazyce Python a lze ho zprovoznit víceméně na jakémkoliv počítači, nicméně já používám a ukážu vám variantu při instalaci jako HomeAssistant addon.

Instalace jako HA Addon

Nejprve pokud ještě v samotném HomeAssistant Add-on storu nemáme speciální repositář pro ESPHome tak ho přidáme pomocí menu Supervisor ▶︎ Add-on store ▶︎ tři tečky vpravo nahoře a do Add repository zadáme adresu:

https://github.com/esphome/hassio

… a klikneme na tlačítko Add.

Ve storu bychom nyní měli vidět tři nové položky:

Podle toho jaké bluetooth zařízení chceme použít se rozhodneme pro klasickou a nebo dev verzi.

Dev verzi budeme potřebovat (v době psaní článku je klasická verze 1.14.4) pro všechny novější produkty používající šifrování – pokud si nejste jistý, kterou verzi potřebujete nezoufejte a níže si ukážeme seznam produktů s vyznačením zda je potřeba dev verze.

Jakmile víme kterou verzi potřebujeme klikneme jako u jakéhokoliv jiného addonu na install a doporučuji rovnou přidat do postranní lišty HA pomocí volby Show in sidebar.

Základ firmwaru pro ESP32

Jakmile máme ESPHome nainstalovaný připojíme ESP32 pomocí USB konektoru k počítači s ESPHome a klikneme na tlačítko ➕.

V prvním kroku si vybereme nějaký vhodný název – např. něco jako bl_gw_01.

a v závislosti na konkrétním typu vývojové desky vybereme náš model – v případě použití linku výše se jedná o DOIT ESP32 DEVKIT V1.

Nakonec je potřeba ještě vyplnit název a heslo do WiFi sítě:

… a klikneme na Next + Submit.

Novou konfiguraci byste nyní měli vidět na hlavní obrazovce ESPHome:

a pokud se podíváte na vygenerovanou kód tak uvidíte následující:

esphome:
  name: bl_gw_01
  platform: ESP32
  board: esp32doit-devkit-v1

wifi:
  ssid: "wifi_nazev"
  password: "wifi_heslo"

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Bl Gw 01 Fallback Hotspot"
    password: "PiL4fu8AcUW3"

captive_portal:

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:

V případě použití ESP32-CAM bude pak výsledný kód stejný, s jedním rozdílem v podobě jiného typu boardu:

 esphome:
  name: bl_gw_01
  platform: ESP32
  board: nodemcu-32s

Tím máme základ pro WiFi komunikaci hotový. ESP32 nyní můžeme od počítače odpojit a vyzkoušet, že komunikace funguje – poznáte díky tomu, že položka v ESPHome bude zelená.

Přidání Bluetooth do ESPHome pro ESP32

Samotné WiFi nám ale stačit nebude, jelikož my potřebujeme s koncovými zařízeními komunikovat pomocí bluetooth. K tomu se nám bude hodit komponenta esp32_ble_tracker.

Pomocí tlačítka Edit proto konfiguraci upravíme a přidáme do ní víceméně kamkoliv řádek:

esp32_ble_tracker:

Nyní pomocí Upload novou verzi zkompilujeme a nahrajeme pomocí OTA (WiFi aktualizace firmware) přímo do ESP32.

Bluetooth mac adresa koncového zařízení

Pro konfiguraci koncových zařízeních budeme potřebovat jejich mac adresu. K tomu nám pomůže právě výše přidaná komponenta, která periodicky prochází okolí a zjišťuju bluetooth zařízení v dosahu.

Platí, že pokud je zařízení v ESPHome podporované, tak by vždy mělo obsahovat i informaci o názvu, tj. například pokud budeme chtít přidat Xiaomi budík uvidíme v ESPHome logu následující:

[10:50:52][D][esp32_ble_tracker:500]: Found device 58:2D:34:51:5D:17 RSSI=-70
[10:50:52][D][esp32_ble_tracker:521]:   Address Type: PUBLIC
[10:50:52][D][esp32_ble_tracker:523]:   Name: 'Qingping Alarm Clock'

Jak vidíte nejprve je adresa která nás zajímavá a pak pro potvrzení, že máme správné zařízení vidíme i název Quiqping Alarm Clock.

K logu s výpisem nalezených zařízení se dostaneme z hlavní obrazovky ESPHome a v boxíku s naší konfigurací přes tlačítko logs.

Podporované zařízení

Už víme jak najít mac adresu a až na výjimku u pár produktů máme vše co potřebujeme, takže se můžeme podívat na seznam produktů, které jsou aktuálně podporovány a jejich konfiguraci, kterou je potřeba do ESPHome přidat.

Mijia MiFlora – HHCCJCY01

Měření teploty, půdní vlhkosti, množství dopadajícího světla a množství živin v půdě.

sensor: 
  - platform: xiaomi_hhccjcy01
    mac_address: '94:2B:FF:5C:91:61'
    temperature:
      name: "Xiaomi HHCCJCY01 Temperature"
    moisture:
      name: "Xiaomi HHCCJCY01 Moisture"
    illuminance:
      name: "Xiaomi HHCCJCY01 Illuminance"
    conductivity:
      name: "Xiaomi HHCCJCY01 Soil Conductivity"

 $18 / 12€

Mijia Bluetooth Temperature Humidity Sensor – LYWSDCGQ

LCD dislej s měřenín teploty a vhlkosti a poskytuje i informaci o stavu baterie.

sensor:  
  - platform: xiaomi_lywsdcgq
    mac_address: "7A:80:8E:19:36:BA"
    temperature:
      name: "LYWSDCGQ Temperature"
    humidity:
      name: "LYWSDCGQ Humidity"
    battery_level:
      name: "LYWSDCGQ Battery Level"

 $13 / 13€ / 500Kč

ClearGrass Bluetooth Thermometer and hygrometer – CGG1

Alternativní model výše uvedeného – s velmi podobným vzhledem, který je vyráběný ekologickou odnoží Xiaomi. Namísto LCD displeje obsahuje e-ink displej. Slouží pro měření teploty a vlhkosti a poskytuje i informaci o stavu baterie.

sensor:  
  - platform: xiaomi_cgg1
    mac_address: "7A:80:8E:19:36:BA"
    temperature:
      name: "CGG1 Temperature"
    humidity:
      name: "CGG1 Humidity"
    battery_level:
      name: "CGG1 Battery Level"

 $15 / 30€

Mijia Bluetooth Temperature Humidity Sensor 2 – LYWSD03MMC

Druhá generace Mijia verze bluetooth teploměru a vlhkoměru, která doznala velkých změn ve vzhledu a je i poměrně menší. Displej zůstal ve verzi LCD. Kromě teploty a vlhkosti poskytuje informaci i o stavu baterie.

⚠️ Pro komunikaci je nutné získat tzv. bindkey. Ukážeme si níže. Dostupné pouze v ESPHome 1.15 > (aktuálně verze dev).

sensor:
  - platform: xiaomi_lywsd03mmc
    mac_address: "A4:C1:38:B1:CD:7F"
    bindkey: "eef418daf699a0c188f3bfd17e4565d9"
    temperature:
      name: "LYWSD03MMC Temperature"
    humidity:
      name: "LYWSD03MMC Humidity"
    battery_level:
      name: "LYWSD03MMC Battery Level"

 $8 za 2ks / 8€ za 2ks

ClearGrass Alarm Clock – CGD1

Teplota a vlhkost. Poskytuje i informaci o stavu baterie. Pokud chcete vědět více koukněte na moji recenzi.

⚠️ Pro komunikaci je nutné získat tzv. bindkey. Ukážeme si níže. Dostupné pouze v ESPHome 1.15 > (aktuálně verze dev).

sensor:
  - platform: xiaomi_cgd1
    mac_address: "A4:C1:38:8C:34:B7"
    bindkey: "fe39106baeedb7c801e3d63c4396f97e"
    temperature:
      name: "CGD1 Temperature"
    humidity:
      name: "CGD1 Humidity"
    battery_level:
      name: "CGD1 Battery Level"

 $13 / 18€

Získání bindkey pro nová Xiaomi zařízení

Pokud máte jeden z posledních bluetooth produktů od Xiaomi pak vidíte, že v konfiguraci kromě mac adresy potřebujeme i jakýsi bindkey. Jedná se o novinku, která šifruje veškerou komunikaci – což vlastně není vůbec špatně – ale přináší nám nutnost tento klíče získat.

Obecně je tento klíč dostupný pouze v kroku párování nového zařízení v Mi Home Aplikaci, kdy je na servery Xiaomi poslána zpráva typu POST:

/app/device/bltbind

obsahující data:

{ 
  "did":"blt.3.129q4nasgeg00",
  "token":"20c665a7ff82a5bfb5eefc36",
  "props":[{
     "type":"prop",
     "key":"bind_key",
     "value":"cfc7cc892f4e32f7a733086cf3443cb0"
     },{
      "type":"prop",
      "key":"smac",
      "value":"A4:C1:38:8C:34:B7"
     }
   ]}

a právě hodnota pro klíč bind_key je ta která nás zajímá.

Bohužel pro nás je zpráva poslána jako HTTPS a je tedy zašifrována pomocí SSL. Naneštěstí existující způsoby jak zachytit tuto zprávu i v nezaširované podobě.

Budeme potřebovat telefon s nainstalovanou aplikací Mi Home, přes kterou nové Xiaomi zařízení přidáváme a v tomto telefonu bude potřeba pár dalších úprav v závislosti na použitém operačním systému.

Postup pro Android telefon

Jelikož nemám k dispozici žádný Android telefon nemohu vám zde uvést prověřený návod krok-za-krokem pro tuto platformu a podle všeho je potřeba použít aplikaci Remote PCAP v kombinaci s WireShark. Podrobnější popis je pak anglicky k dispozici zde.

🤷‍♂️ Poprosím čtenáře pokud někdo už tohle na Androidu absolvoval zda by mi poslal postup s obrázky a já sem do článku přidám.

Postup pro iPhone s iOS

Při použití telefonu iPhonu s iOS je potřeba si nejprve nainstalovat aplikaci Stream – Network Debug Tool, která je k dispozici zdarma.

Po spuštění bude potřeba nejprve v menu Settings kliknout na HTTPS Sniffing a vybrat volbu Install CA … – nejsem si úplně jistý, ale měla by tam být jedna položka. Neudělal jsem si screenshot a nyní už vidím jen položku což by měl být stav, kterého chcete docílit.

Volba by vás měla přesměrovat na internet kde se stáhne certifikát do telefonu, které je potřeba přidat mezi důvěryhodné.

To uděláme pomocí menu telefonu Obecné ▶︎ Informace ▶︎ Důvěryhodnost certifikátu a povolíme Stream certifikát.

Zároveň byste měli mít mezi VPN připojeními nové pojmenované Stream.

Toto se úplně všímat nemusíte – nastartuje se automaticky s aplikace Stream pokud je potřeba.

Nejprve doporučuju shodit aplikaci Mi Home pokud jste ji měli spuštěnou a v aplikaci Stream kliknout na volbu Sniff Now – měla by se automaticky spustit i VPN.

Nyní už můžeme opět Mi Home spustit a začít s párováním nového zařízení. To dokončíme celým procesem, přepneme se zpět do aplikace Stream a zastavíme Sniffování.

Otevřeme si Sniff history, klikneme na položku v history sessions, klikneme na lupu a zadáme do keyword bltbind.

Pokud jsme vše udělali správně měli bychom nyní vidět pouze jednu položku, u které si v záložce Request klikneme na Preview form z Request Body a klikneme ještě na Format a položku Form Deserialize. V sekci data bychom pak měli čitelně už vidět bind_key.

Musím se přiznat, že jsem získáváním klíče strávil snad hodinu, možná částečně i proto, že jsem měl bluetooth zařízení už přidané a bylo potřeba ho nejprve odstranit a dostupné návody v angličtině nejsou zrovna nejdetailnější. Věřím tak, že podle mého návodu to zvládnete mnohem rychleji 🙂

(volitelné) Webový server v ESPHome

Občas se může hodit mít podobně jako například v Tasmotě přístup na hodnoty senzorů přímo na ESP32 a ač webové rozhraní není tak bohaté jako u Tasmoty tak ESPHome přeci jen nějaký základ obsahuje.

Aktivujete jej přidáním následujícího do konfigurace:

web_server:
  port: 80  

Například v mém případě mám k ESP32 připojené aktuálně hned tři bluetooth produkty a všechny hodnoty lze přehled pomocí tohoto rozhraní vidět:

Přidání do HomeAssistanta

ESPHome integrace je nyní plně konfigurovatelné přes UI HA, takže stačí v menu Nastavení ▶︎ Integrace kliknout na tlačítko ➕ a vyhledat ESPHome:

.. a do pole adresa uzlu zadejte název z konfigurace, popř. IP adresu.

Všechny dostupné senzory pak budou dostupné pod tímto jedním zařízením a můžete je začít rovnou z vesela používat v HA 🙂

Někdy v blízké budoucnosti si ještě ukážeme způsob pomocí Xiaomi Gateway, který by mohl být snad i jednodušší a rád bych se podíval i na alternativu v podobě OpenMQTTGateway.

Zatím se jeví způsob přes ESPHome v případě nových produktů poněkud složitý tak uvidíme zda najdeme i jednodušší způsob.

13 komentářů

Napsat komentář

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..

  • Na získání Bindkey stačí použít Modifikovanou MiHome záležitost na 5 sekund. 🙂

      • Tak už se mi to zřejmě podařilo najít. Existuje skutečně modifikovaná verze aplikace MiHome pro Android, která má nějaká vylepšení – kompletní přehled a stažení je např. zde: https://apkvision.com/app/modified-mi-home-by-vevs-38331/. Bindkey jsou pak uloženy do souboru na kartu. Nicméně mějte na paměti, že se jedná o aplikaci mimo Google Play, a nebyla tedy nikým zkontrolována. Autoři jsou navíc z Ruska a není to úplně způsob, který bych doporučil každému. Zřejmě i proto tento způsob není u ESPHome ani zmiňován.

        • Tak, kdo se bojí, stačí načíst čidla a po zjisteni kodu zase smazat. 🙂 Hlavne je to rychle a bezproblemu

  • Mám na tebe dotaz, jak rychle se ti obnovuji cidla CGD a lywsd03mmc? Me jednou za 3 hodiny, nebo vubec. Dokud jsem to mel na BLE Rpi, tak vse bylo v podstate okamzite. Ted na ESP32 strasne pomalu. Mohlo by to byt tim, ze je tam ten encryptors? Dik za odpo

    • Hmm zajímavý dotaz. Předtím jsem na to nekoukal, jelikož hodnoty jsem po restartu ESP tak do 20 minut podle mě dostal všechny, ale teď když se dívám na graf tak pravda oproti teploměru, který nemá to šifrování jsou ty intervaly mnohem větší. Vychází to na cca. 10-20 minut pro většinu, ale jsou tam i větší bloky. Aktuálně mám tedy jen ten budík CGD1 s tím že teploměr CGG1 je ještě na cestě. Ty mále teploměry zatím nemám ani objednané. Zkusím o tom ještě něco pohledat a brzy bych měl mít doma i tu Xiaomi Gateway bránu tak bude hned jasné jestli jsou ty intervaly i přes ní podobné.

    • Jo a ještě mě napadlo jestli to nemůže být tím, že to ESP32 dá jen někdy a jinak se restartne, ale co jsem koukal, tak žádný restart neproběhl a běží to celou dobu bez výpadku.

  • Možná by se mohlo někomu hodit, použil jsem desku ESP32CAM, která má možnost připojení externí antény, BT má pak větší dosah.

%d blogerům se to líbí: