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経由でプログラムを更新できるので便利です。
コメント