Sympapaのスマートホーム日記

スマートなんとかはスマートじゃない方法でつくられている

Home Assistant: 電気錠付玄関ドアの制御(2) ~ESP HomeアドオンでESP32を試す~

Sympapaです。

家を建てる計画中ですが、YKK APとかLIXILの電気錠(スマートキー)付きドアをHome Assistantから制御したいと考えています。
Home Assistantと電気錠のインターフェースとして、もともとは日本の住設で使われているプロトコルである"Echonet Lite"を使おうと考えていました。
しかし、電気錠を”Echonet Lite”に対応させるには、電気錠のコントローラに付いているHA端子(JEM-A端子)にIP変換アダプタを繋いで変換をしなくてはならず、このアダプタが高価です。ってか、それ以前に"Echonet Lite"で電気錠をハックしているという実例がググっても見つからず、はたして初心者の私に出来るのかすらわかりません(汗


色々調べたところ電気錠のHA端子(JEM-A端子)は単純な2値でロックの制御とステータスの取得をしており、Raspberry PI ZeroとかESP32といった小さいマイコンを使って電気錠をハックしている例がいくつか見つかりました。
なので私もこの方法で電気錠の制御することにしたというのが前回の記事でのお話でした。


しかしマイコンという類のものはHome Assistantを使うために初めてRaspberry PI 4Bを買ったくらいのもんですし、GPIO(入出力端子)を使った電気工作とかはやったことがありません。
調べた結果、Home AssistantのESP HOMEアドオンを使うと簡単にESP32と連携できそうなので、ESP32を購入しESP HOMEアドオンを試してみることにしたというのが今回のお話になります。

■購入したESP32

ESP32は大きさ54.4×27.9mmでWi-FiBluetoothも使えUSB電源で駆動する小さいマイコンボードです。
1個1000円以下の安価なジェネリック品がたくさんあるみたいですが、ジェネリック品はコンデンサを付けないと書き込みがうまくいかないという情報が多く、右も左もわからない私はEspressif純正のESP-WROOM-32D開発ボード ESP32-DevKitC-32Dを購入することにしました。
AmazonでLEDと抵抗がおまけで付いたものを2,420円で購入しました。ジェネリック品が2つや3つ買えそうな価格ですが、まぁ初めての購入ですしESP32を気に入ったら次はジェネリック品を買うって感じでいいかなと。

ちなみに他に一緒に購入したのは、オスオス,オスメス,メスメスが揃ったジャンパケーブルのセット500円くらい、タクトスイッチ150円くらい、ブレッドボード500円くらい、です。

■Home Assistant ESP HOMEアドオンの導入

ESP HOMEが何なのか良くわかっていませんが、公式ページによると「シンプルでありながら強力な構成ファイルによってESP8266 / ESP32を制御し、ホームオートメーションシステムを介してそれらをリモートで制御するシステムです。」だそうです。
esphome.io
Pythonで動くみたいですが、Home Assistantクラウドを運営している"NabuCasa"が開発しているだけあってHome Assistant用のアドオンが存在します。簡単にHome Assistant上からESP32を制御できるみたいなので今回はこのアドオンをインストールします。
esphome.io


1) 設定>アドオン>+アドオンストアと進みます。
2) 右上の3ドットボタン>リポジトリと進み、https://github.com/esphome/home-assistant-addonを追加します。
3) "ESP"で検索して"ESP Home"が見つかったらインストールしてアドオンを起動します。

5) Home Assistantが動いているRaspberry PIにESP32をUSB接続します。Wi-Fiの設定をしていないので最初はUSB接続しなくてはいけません。
4) WEB UIを開き、"+ NEW DEVICE"を押します。
6) 任意の名前(ESP32の個体を識別するための名前)、Wi-FiSSIDとパスワードを入力して"Next"を押します。今回は名前を"esp32-1"としました。
7)デバイスリストの中からデバイス(今回はESP32)を選んで"Next"を押します。
8)Configuration created!と表示されたら、更にInstallを押します。
9)接続方法を聞かれるので、"plug into the computer running ESPHome Dashboard"を選びます。

10)ESP32を接続しているUSBポートを選択します。”CP2102N”がESP32のUSBインターフェースです。
11)コンパイルと書き込みが始まります。数分かかるので待ちます。書き込み完了を明示的にお知らせしてくれませんが[api.connection:827]: Home Assistant xxxxx: Connected successfullyと表示されたら完了です。Connection closedと表示された場合はWi-Fiが接続されていませんが、たぶんESP32を再起動すればWi-Fiに接続されます。次回以降はWi-Fi経由でも書き込みが可能です。
12)設定>インテグレーション>+インテグレーションを追加 と進んで"ESP"で検索し"ESP Home"を選びます。ESP32のIPアドレスを入力し送信を押すとESP32がHome Assistantのデバイスとして登録されます。
これでESP Homeの導入とESP32の登録は完了しました。

Wi-Fiなどの基本設定だけが書かれた設定ファイル"/config/esphome/esp32-1.yaml"が出来上がっていて中身は以下のようなものです。
Wi-Fiの設定は"/config/esphome/secrets.yaml"の中に書かれています。

esphome:
  name: esp32-1

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: "xxxxxxx"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32-1 Fallback Hotspot"
    password: "xxxxxxx"

captive_portal:

■GPIO出力を試す

HA端子(JEM-A端子)とコントローラ(今回の場合ESP32)の間はフォトカプラを介して繋ぐということになっています。
下図はHA端子(JEM-A端子)とテレコントローラを繋ぐインターフェースユニット(=単にフォトカプラと抵抗やらを組み合わせたもの)の回路図ですが、TC1-TC2に電圧をかけることで電気錠の解施錠(トグル)が出来、TM1-TM2が短絡していることを何らかの方法で検出すれば「施錠」していることを知ることができるようです。


ということでまずは電気錠の制御の方を想定してESP32から出力する方法を試してみます。
電気工作の世界ではLEDを点灯、点滅させるLチカってやつが最初の第一歩らしいので私もLEDを点灯させてみます。
回路は(というほどのものではないけど)下図のような感じ。

ESP HomeのWeb UIを開くと登録したESP32が表示され、EDITを押すと設定のyaml編集画面に入ります。
とりあえずここに書かれていた"output"と"switch"を組み合わせた例のyamlを追加します。"Generic Output"という名前のスイッチで、GPIO32への出力をオンオフするというものです。
esphome.io

output:
  - platform: gpio
    pin: 32
    id: 'generic_out'
switch:
  - platform: output
    name: 'Generic Output'
    output: 'generic_out'


SAVEを押してINSTALLを押しESP32に書き込みします。接続方法は"Wirelessly"を選べばOKです。
Home Assistantのエンティティリストを確認すると”switch.generic_output”というswitchエンティティが出来上がっています。


このスイッチをオンにすると。。。

成功!LEDが光りました!
これを使いフォトカプラを介してHA端子(JEM-A端子)のC1とC2を短絡させれば、電気錠を解施錠できるはずです。

■GPIO入力を試す

次は電気錠をモニターすることを想定して、ESP32で入力する方法を試してみます。
電気錠がロックされている間はフォトカプラに印加されているので、上の回路図のTM1とTM2は短絡します。
これをESP32で検出するためこちらのページに載っていたESP HomeのGPIO Binary Sensorの例を試してみます。
内部プルアップ抵抗も有効にしています。
esphome.io

binary_sensor:
  - platform: gpio
    pin:
      number: 33
      mode:
        input: true
        pullup: true
    name: 'test_input'


Home Assistantに”binary_sensor.test_input"というバイナリセンサーエンティティが出来ました。


GPIO33とGNDの間に入れたタクトスイッチを押すと”binary_sensor.test_input"はオフになり、開放すると”binary_sensor.test_input"はオンになります。


オンとオフが逆のように感じますが、これはプルアップ回路を使っているからだそうです。プルダウンも試してみたのですが何故かうまくいきません(汗
まぁそこはこだわらなくても目的は果たせているし、"inverted: true"を追記すればプルアップのまま表示上のオンとオフを入れ替えることが出来るので深く考えないことにします(笑)
プルダウンとプルアップについても調べたのですが、そこも本題と関係ないので割愛します。

■まとめ

今回はHome AssistantのESP Homeアドオンを導入しESP32のGPIO出力と入力を試すという電子工作チックなことを試してみましたが、ESP Homeアドオンは初心者の私でもなんとかなりそうなすばらしい親切設計でした。

ESP32もいいですね!これでボタン電池で数カ月以上駆動したりしたら完全に無線でセンサーとか作れるのに・・・さすがに無理か。。。
実際にHA端子(JEM-A端子)と接続するにはフォトカプラー周りの回路を作らなくてはいけませんが、まぁここらへんは家を建ててからですかね。

それでは。