ESPHome を Apple HomeKit で使う

DIYする

ESPHomeは、ESP8266/ESP32に接続した各種センサ・アクチュエータ類などを、WiFi経由でHome Assistantから使えるようにするプログラムです。Home Assistantのための開発ツールですが、がんばってHomeKitから使ってみます。そのためにHomebridgeとMosquittoを使います。

ESPHome

こちらのブログで読ませていただいて、ESPHomeを知りました。yaml形式のテキストファイルに、以下のような記述(他にも書く必要はありますが)で、Home Assistant上にスイッチを表示して、GPIO 13番ピンに接続したLEDを点滅させることができるようです。

 
switch:
  - platform: gpio
    pin: 13
    name: 'blue_led'

とても便利そうなので、是非ともApple HomeKitでも使ってみたいと思い、調べた結果が今回の内容です。

Homebridge用ESPHomeプラグインを試す(失敗)

ESPHomeはApple HomeKit (HAP) をサポートしてないですし、多分これからもサポートしないでしょう。でもHomebridge経由ならなんとかなりそうかと思いました。実際にHomebridgeのプラグインを探してみると、ESPHomeをサポートするものがいくつかありました。それを一通り調べたり試したりしました。

その結果、うまく動きませんでした。開発が止まっているプラグインも多かったです。ESPHomeを使いたいならHome Assistantを使い、そこからHomeKitにブリッジするのが一般的のようでした。そのうち試したいと思います。

ESPHomeからMQTTを使う

ESPHomeのサイトのチュートリアルを見ていたら、MQTTでも機能するようです。通信プロトコルには、Home AssistantのAPIと、MQTTのどちらか、または両方が選べるようでした。これならHomebridgeからすぐに使えそうです。MQTTならデータの流れを簡単にモニターでいるので、動作確認も楽そうです。YAMLの中に

api:

と書けば、Home Assistantが使うAPIが有効になり、

mqtt:
  broker: 192.168.xxx.xxx

などと書けば、MQTTブローカーが使えるようです。 なお、api:を指定したのに接続が無い場合は、15分ごとに再起動するらしいので、 Home Assistantを使わない場合はapi:の行を削除するかコメントアウトしておいてくださいとのことです。

MQTTを選択することで、以下で説明するように、HomebridgeのMQTTThingプラグインで使用することができました。

ESPHomeを手動インストール

ESPHomeはPythonで書かれたプログラムですが、Home Assistantからはアドインとして使えるようです。なのでインストールもGUIベースで簡単です。Home Assistantを使わない場合は、コマンドラインでインストールします。以下、macOSで作業しました。

Pythonが必要です。Linuxはそのまま使えますが、MacやWindowsの場合は、まずはPythonの環境を整えます。以下はMacの場合の手順です。

macOSには昔からpythonがインストール済みで、最近のmacOSにもpython3がすでにあってパスが通ってます。でもそのままでは動きません。Xcodeに含まれるコマンドライン開発ツールが必要です。

% which python3
/usr/bin/python3
% python3 --version
xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.

開発ツールをインストールを促すダイアログが現れるかもしれませんが、それではうまくインストールできません。Xcode本体を入れておくと良いです。


XcodeはApp Storeから無料でダウンロードできますし(Apple IDが必要ですが)、プログラミングには必須なので入れておきましょう。また、PythonからXcodeにアクセスする前にライセンスに同意しておく必要があります。コマンドラインからも可能ですが、Xcodeから同意する方が簡単です。単にXcodeを起動して、最初に現れるウィンドウで「同意する」ボタンを押すだけです。Xcodeがインストールされてライセンス同意されていればが、以下のように動作します。

% python3 --version
Python 3.8.9

pipが古いと後のESPHomeインストール時にエラーが出るので、これは更新しておきます。

% pip3 --version
pip 20.2.3
% pip3 install --upgrade pip
% pip3 --version
pip 22.2.1

いよいよesphomeをインストールします。pip3を使いました。

% pip3 install --user esphome

esphomeは~/Library/Python/3.8/bin/にインストールされます (3.8はPythonのバージョン番号です)。以下のように動作確認できます。

% ~/Library/Python/3.8/bin/esphome version
Version: 2022.6.2

フルパスをタイプしたくない場合は、以下のようにしてパスを貼っておくと良いです。

echo 'export PATH=$PATH:$HOME/Library/Python/3.8/bin' >> $HOME/.zshrc

ターミナルを一旦閉じて、再度開きます。そうすれば、esphomeがフルパスなしで実行できます。

% esphome version
Version: 2022.6.2

YAMLファイルを作る

YAMLファイルの簡単な雛形はwizardコマンドで作れます。以下のように入力します。

esphome wizard led.yaml

対話的に質問されるので適当に回答していくと、以下のようなled.yamlというファイルが出来上がりました。デバイスの名前はblueledにして、boardはesp32devを選択しました。

esphome:
  name: blueled
esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
api:
  password: ""

ota:
  password: ""

wifi:
  ssid: "XXXXXXXX"
  password: "xxxxxxxx"
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32 Fallback Hotspot"
    password: "0e0VcHVTRV6K"

captive_portal:

apiとotaのパスワードを指定しなかったので””になってます。この行を丸ごと消しても大丈夫のようです。また、「Enable fallback hotspot」以下の行は、起動後1分以上WiFiに接続できない場合に、WiFi基地局として機能ための記述です。これに接続して、設定を変更することが可能です。わかりやすくするために、その部分を省略して、上で書いたMQTTとGPIOの設定を追加すると以下のようになります。

esphome:
  name: blueled

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:

# Enable Home Assistant API
#api:

ota:

wifi:
  ssid: "XXXXXXXX"
  password: "xxxxxxxx"

mqtt: 
 broker: 192.168.xxx.xxx

switch:
  - platform: gpio 
    pin: 13 
    name: 'blue_led'

水色が追加した部分です。また、Home Assistantは使わないのでapi:をコメントアウトしました。

YMLAファイルを動かす

このファイルの設定で良いかどうかはconfigコマンドでチェックできます。

esphome config led.yaml

問題なければ、コンパイルして、ESP32にダウンロードして、起動させます。 以下のコマンドで全部やってくれます。

esphome run led.yaml

最初のコンパイルでは、ESP32の開発環境をダウンロードするので時間がかかります。コンパイルが終了すると、ダウンロード方法を質問されます。USBシリアルポート経由か、WiFi経由かを選択します。初めてダウンロードする場合はUSBシリアルポート経由を選択します。次回以降は、WiFi経由でもアップロード可能になります。OTA (On The Air)という機能です。有線で接続する必要がないので、どこかに組み込んでしまったESP32のプログラム更新するときに便利です。

=============== [SUCCESS] Took 13.92 seconds ===============
INFO Successfully compiled program.
Found multiple options, please choose one:
[1] /dev/cu.usbserial-0001 (CP2102 USB to UART Bridge Controller - CP2102 USB to UART Bridge Controller)
[2] Over The Air (blueled.local)
(number): 1

1を指定します。するとダウンロード・実行されます。ESP32が稼働してます。ログのコメントが現れています。ログからMQTTが動作しているトピックがわかります。

[15:07:55][C][mqtt:074]:   Topic Prefix: 'blueled'
[15:07:55][C][mqtt:076]:   Log Topic: 'blueled/debug'
[15:07:55][C][mqtt:079]:   Availability: 'blueled/status'
[15:07:55][C][mqtt.switch:041]: MQTT Switch 'blue_led':
[15:07:55][C][mqtt.switch:042]:   State Topic: 'blueled/switch/blue_led/state'
[15:07:55][C][mqtt.switch:042]:   Command Topic: 'blueled/switch/blue_led/command'

別のシェルウィンドウ(ターミナル)からmosquitto_subコマンドを動かしておくと、MQTTメッセージをチェックできます。

% mosquitto_sub -h 192.168.xxx.xxx -t blueled/# -v
blueled/light/blue_led/state {"color_mode":"onoff","state":"OFF","color":{}}
blueled/status online
blueled/debug [C][mqtt.switch:042]:   Command Topic: 'blueled/switch/blue_led/command'
blueled/switch/blue_led/state OFF

これから、blueled/switch/blue_led/commandトピックに、ONかOFFを遅れば良さそうだとわかります。トピックの名前は、YAMLファイルに書かれた名前です。mosquitto_pubコマンドで試してみます。

% mosquitto_pub -h 192.168.xxx.xxx -t blueled/switch/blue_led/command -m ON
% mosquitto_pub -h 192.168.xxx.xxx -t blueled/switch/blue_led/command -m OFF

これで13番に接続したLEDが点灯、消灯します。

mosquitto_subコマンドの方にも結果が現れれています。

blueled/switch/blue_led/command ON
blueled/debug [D][switch:013]: 'blue_led' Turning ON.
blueled/debug [D][switch:037]: 'blue_led': Sending state ON
blueled/switch/blue_led/state ON
blueled/switch/blue_led/command OFF
blueled/debug [D][switch:017]: 'blue_led' Turning OFF.
blueled/debug [D][switch:037]: 'blue_led': Sending state OFF
blueled/switch/blue_led/state OFF

Homebridgeから使う

HomebridgeからMQTTを使うHomebridge Mqttthingプラグインを使用します。コンフィグに、以下のように追記します。

{
  "type": "switch",
  "name": "Blue LED",
  "url": "mqtt://localhost:1883",
  "topics": {
    "getOn": "blueled/switch/blue_led/state",
    "setOn": "blueled/switch/blue_led/command"
  },
  "onValue": "on",
  "offValue": "off",
  "accessory": "mqttthing"
},

MQTTブローカーがHomebridgeと同じマシンで動いているので、urlはlocalhostになってます。Mqttthingのデフォルトのメッセージがtrueとfalseなので、これをESPHomeに合わせてonとoffに定義し直しています。これでiPhoneやMacのホーム.appから操作できます。

   

まとめ

ESPHomeをApple HomeKitで使ってみました。MQTTプロトコルで使えば、Homebridgeのプラグインから使えました。YAMLの数行の記述でプログラミングが完成するので、簡単で良いです。またOTAの機能を使えばWiFi経由でプログラムを更新できるので便利です。

コメント

タイトルとURLをコピーしました