Smart HomeをDIYする

Apple HomeKit は対応製品が少なくて高価なのでHomebridgeでがんばります

YeelightのシーリングライトをHomeKitで使う

HomeKit対応と書かれていたシーリングライトAmazonで買って試したところ、実は対応してませんでした。出品担当の方が記述を間違えたようで、今は訂正されてます。返品しても良い案件ですけど、調べてみたらHomebridgeに対応プラグインがありました。設定は簡単で、ホーム.appで快調に動かすことができたので、このまま使うことにしました。

Yeelightの照明器具

今回使ったのは、Amazonで売られているYeelightブランドのシーリングライトYLXD023です。

今は、Alexa/Google対応と訂正されてますが、購入した時は、Alexa/Google/Apple HomeKit対応となってました。YeelightはHomeKitに対応したLED電球やLEDテープも販売しているので、これも対応していると期待してましたが、実際には未対応でした。そのことに気づかず、サクサクと天井に取り付け、設定を進めてしまいました。

製品は、引掛シーリングに対応した照明器具で、引掛シーリング(または引っ掛けローゼット)が天井についていれば簡単に取り付けられます。同様なLED照明としては高めの価格ですが、Alexa/Google対応品としては妥当です。格安LED照明器具と違って、本体とリモコンにPSEマーク技適マークが付いていて安心感があります。リモコンはBluetooth Low Energy方式ですので、Nature Remoのような赤外線リモコンは使えません。照明の電源を入れた直後に、リモコンボタンを長押ししてBLEのペアリングします。タイミングが分かりにくいのですが、ペアリングできれば安定に動いてます。リモコンから設定できる照度間隔が4段階しかない事が気になりました。4の段階の3.5くらいがほしいと思いました。スマホアプリからは細かく設定できます。

スマホアプリで設定

付属のBLEリモコンだけで操作するならばスマホアプリは不要です。それ以上の設定をするならiPhone用もしくはAndroid用のアプリをYeelightのサイトからダウンロードする必要があります。スマホアプリとシーリングライトとはBLE接続、もしくはWiFi接続するようです。WiFiの設定をしなくてもBLE経由でスマホからの操作が可能です。

Alexa, Googleから使用するにはWiFiの設定が必須です。Homebridgeには、BLE接続のプラグインもあるのですが、開発が止まっている様子なので、HomeKitで使う場合もWiFiを設定した方が良いです。WiFiSSIDiPhoneの設定を使うようです。ただ、2.4GHzにしか対応していないので、5GHzのWiFiを使っている場合は、iPhoneの設定を一時的に2.4GHzにする必要があります。この手のデバイスでよくある罠ですね。

Googleでは試していませんが、Alexaでは正しく動作しました。Alexaの設定方法はこちらで説明されています。Echo Showだと明るさ調整スライダーなども表示されます。でもHomeKitでアクセサリを追加しようとしても候補が出ません。そもそも設定コードがどこにも記載されていないので、接続のしようがありません。ここでようやくHomeKitには未対応で、Amazonの説明が訂正されているのに気づきました。

公開プロトコルを有効にする

HomeKitにそのまま対応していない様子なので、Homebridgeで接続することを考えました。Yeelightでは、製品の制御プロトコルを公開して、みんなが試せるようにしているようです。サポートが面倒になるので、昔ながらのメーカはそんなことをしないのが普通だと思います。技術志向で素晴らしいことだと思います。Homebridgeからもこの公開プロトコルを使うようです。

シーリングライトが公開プロトコルを受け付けるための設定は、スマホアプリから行います。メイン画面の右下にある三角形のボタンを押すと、メニューが増えます。その中に、LAN制御という項目があります。

この「LAN制御」をタップした先で現れる設定画面で、右上のスイッチをonにしておきます。

この画面の説明を見ると、この設定により、外部のアプリケーションが照明器具に接続し、操作できるようです。プロトコルの詳しいPDF資料が以下のように公開されてます。中国青島の会社だったのですね。

https://www.yeelight.com/download/Yeelight_Inter-Operation_Spec.pdf

Homebridgeプラグインを設定する

ここまでの準備がスマホアプリで終了したところで、Homebridgeのプラグイン設定をします。HomebridgeのプラグインページでYeelightを検索すると、11個の候補が出てきました。

これらを調べたところ、

の2個のプラグインがどちらも使えました。今回は最終的にはYeelighterを使いました。どちらのプラグインも、設定ボタンを押して、出てくるデフォルトの設定のままで動きます。手元のデバイスの情報を登録する必要はありませんでした。プラグインがネットワーク内にあるYeelight製品を自動的に検出して、必要な機能を設定してくれるようです。Yeelighterのデフォルト設定では、以下のような内容がconfigファイルに追加されます。

{
            "name": "Yeelighter",
            "timeout": 5000,
            "interval": 60000,
            "ctforcolor": true,
            "blocking": false,
            "split": false,
            "manual": [
                {
                    "ignorePower": false
                }
            ],
            "platform": "Yeelighter"
        },

設定を終えてHomebridgeを再起動すると、Yeelight製品の自動検出をしてくれます。最初の1回だけはシーリングライトの電源をoff/onしないと検出されないようでした。一旦検出されると、ホーム.appに照明のアイコンが現れました。名前を「あかり」に変更しました。

コントロールを表示すると、明るさと色温度調整メニューが現れます。

デフォルト設定では1分ごとに照明の状態を更新してくれてます。そのおかげで、リモコンやAlexa経由でon/offしても、1分以内にHomeKitに状態が反映されます。ただこの更新タイミングで警告やエラーが出ているようで、ログに表示されます。でも問題なく動いているので、これは良いことにします。おいおい設定などを見直したいです。

追記:エラーの発生元を探したところ、temperaturelightservice.jsで色温度を設定している箇所でした。HomeKitでの設定値から色温度を計算する処理が仕様と違うのか、範囲外とのエラーが出ているようでした。色温度を4000とか4500とか直接数値で設定するとエラーが出ません。色温度は変更することはほぼないので、リモコンから設定することにして、コメントアウトしておきました。githubのソースを見るとその辺りがだいぶ変更されているようなので、次のアップデートに期待します。

まとめ

Homebridgeと対応プラグインを使って、YeelightシーリングライトをHomeKitに対応させました。Amazonのレビューを見ると、Home Assistantからも使えるようです。(どこかで読んだ内容だなと思ったら購読していたはてなブログの方でした。)

きちんと作られているし、Google/Alexa/Home Assistant/HomeKitのすべての環境で使える最強製品かと思われます。Yeelightの電球やLEDテープはHomeKitに対応しているので、シーリングライトも今後公式対応してくれると嬉しいです。

「へいSiri, Windowsを点けて」でパソコンを起動する

HomeKitをメインに使ってスマートホームしているのは、Appleのエコシステムに取り込まれているからです。なのでmacOSばかり使っていて、Windowsは滅多に使いません。それでもたまにWindowsが必要になることがあります。そんなときは、小型のWindowsデスクトップ機に、MacからMicrosoft Remote Desktop経由で使ってます。仮想マシンWindowsを動かすより高速です。さらに、中古デスクトップなら格安ですし、メーカ品にはWindowsライセンスが付いているので、Windowsを買うより安いです。

ということで、ディスプレイもキーボードも接続していない、小型Windowsデスクトップ機を棚の上に置いてあります。でも必要になった時にそこまで行って電源を入れるのが面倒です。macOSからの操作や、Siriに音声でお願いして電源を入れたいところです。ということで、Windowsマシンの電源投入をHomeKitから可能にすることを考えました。WindowsマシンはEthernetに接続されているので、Wake On LAN (WOL)機能を使って起動するのが簡単そうです。

BIOSWOL対応する

まずはBIOSレベルで、電源off状態でもLANチップに電源供給されるように設定します。BIOSによって色々な名前になってますが、要するにWOLとかWake On LANなどを有効にするという意味の項目を有効にすれば良いです。

WindowsWOL対応する

次に、WindowsWOLに対応させます。「デバイスマネージャ」「ネットワークアダプター」から使用中のEthernetチップを選んで、詳細設定でWake On Magic Packetを有効にします。これ以外はデフォルトのままで良いです。

ただ、手元のマシンでは「Wake On Magic Packet」の項目が現れなくて苦労しました。このマシンには、IntelのI219というチップが搭載されていて、Windowsで最初から用意されているドライバで問題なく動作します。ただ、そのドライバだとWake On Magic Packetの項目が現れないようです。インテルのサイトからWindows用ドライバをダウンロードしてインストールすると、ようやくWake On Magic Packetの項目が現れて設定できました。

Windows 11の高速スタートアップを無効にする

Windows 11のデフォルト設定では、高速スタートアップという機能が有効なのですが、これが動いているとWOLが効かないようです。「コントロールパネル」「ハードウェアとサウンド」「電源オプション」「現在利用可能でない設定を変更します」を選び、「高速スタートアップを有効にする(推奨)」のチェックマークを外します。

Pingに応答させる

後述するHomeKitのWOLプラグインには、pingコマンド応答の有無で電源状態を検出する機能があります。Windowsはデフォルトではpingに応答しないので、応答するように設定しておきます。「コントロールパネル」「システムとセキュリティ」「Windows Defender ファイヤウォール」「詳細設定」「受信の規則」「ファイルとプリンターの共有 (エコー要求 - ICMPv4 受信)」を有効にします。

MACアドレスを調べておく

色々な方法があるとは思いますが、DOS窓からipconfig /allコマンドで調べました。「物理アドレス」の項目に現れる6バイトの16進数です。

WOLを試す

以上でWindows側の準備は整いました。WindowsWOL対応させる手順は面倒で、一つでも欠けているとWOLしません。でも、ネットで調べるとたくさんの記事が見つかり助かります。

準備が完了したので、Windowsマシンの電源を落として、他のマシン(ここではmacOSのターミナル)から起動できるかどうか試します。WOLでは、LAN全体にマジックパケットというデータを流すことで、電源を入れます。マジックパケットは、0xFFが6個の後に、MACアドレスを16回繰り返した内容のデータです。Pythonでプログラムすると以下のようになります。

#!/usr/bin/python3
import socket
s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
s.sendto(b'\xFF'*6+b'\x11\x22\x33\x44\x55\x66'*16, ('192.168.xxx.255', 7))

最近のmacOSではPythonが標準搭載されなくなってしまったので、Homebrewを使ってbrewコマンド

brew install python

でインストールしてあります。その場所が/usr/bin/python3なので、冒頭に書いてあります。sendtoメソッドの引数で、MACアドレス(この例では0x112233445566)と、LANのブロードキャスト用アドレス(最後が255のアドレス)を設定します。これを動かせばWindowsマシンが起動するはずです。pingの応答も確認しました。

% ping 192.168.xxx.xxx
PING 192.168.xxx.xxx (192.168.xxx.xxx): 56 data bytes
64 bytes from 192.168.xxx.xxx: icmp_seq=0 ttl=128 time=0.840 ms
64 bytes from 192.168.xxx.xxx: icmp_seq=1 ttl=128 time=0.606 ms

Homebridgeで設定する

次はHomebridgeの設定です。Homebridgeのインストール方法はこちらに書きました。

diysmarthome.hatenablog.com

Homebridgeのプラグインタグでwolを検索すると8個のプラグインが見つかりました。今回は、Homebridge WoLというプラグインを使いました。

設定ボタンを押して、IPアドレスMACアドレスなどを書き込んでいけば良いです。コンフィグには以下のような内容が追加されました。

        {
            "name": "Windows",
            "ip": "192.168.xxx.xxx",
            "host": "192.168.xxx.xxx",
            "pingInterval": 3,
            "pingsToChange": 3,
            "pingTimeout": 1,
            "pingCommandTimeout": 0,
            "mac": "11:22:33:44:55:66",
            "broadcastAddress": "192.168.xxx.255",
            "startCommandTimeout": 0,
            "wakeGraceTime": 45,
            "wakeCommandTimeout": 0,
            "shutdownGraceTime": 15,
            "shutdownCommandTimeout": 0,
            "log": true,
            "logPinger": false,
            "debugLog": false,
            "returnEarly": true,
            "accessory": "NetworkDevice"
        },

この結果、iPhoneMacのホーム.appに以下のようにWindowsというボタンが現れ、クリックすると電源が投入されました。またpingの応答のある間は、onの状態になります。

Siriにも「ういんどうずを点けて」と話しかけると電源を入れてくれます。Windowsの発音は日本語でokです。HomeKitから電源を切ることはできませんが、Remote Desktop接続などして使用後にシャットダウンすると、pingの応答がなくなるので、ホーム.appの表示もoffになります。

外出先からPCを起動

HomeKitにHomePod, AppleTV, iPadのいずれかが接続されていれば、世界中からHomeKit機器にアクセス可能です。なので外出先からこのWindowsマシンを起動することができます。ルータを設定しておけば、どこからでもRemote Desktop接続を可能な状態にできます。必要な時だけ起動するサーバ、たとえば自分専用のファイルサーバなどとしても活用できます。

SwitchBotをHomebridge / HomeKitで動かす

SwitchBotのBLE搭載製品をHomeKitに接続して、iPhone/MacのホームアプリやSiriから制御できるように設定します。そのために、BLEアダプタを用意して、Homebridgeにプラグインを設定します。

SwitchBot製品

SwitchBotという会社は、その名前の通り、スイッチを押してくれる超小型ロボット製品でお馴染みです。壁のスイッチや電化製品のスイッチにこれを貼り付けておけば、スマホからの操作でサーボモータが動いて、物理的にスイッチを押してくれます。人が指で押すスイッチならなんでも自動化できる、文字通り力技な商品です。今はこれ以外にも、カーテン開閉ロボット、スマートプラグ、赤外線リモコン、掃除ロボットなどいろいろな製品を作ってます。

これらの製品のうち、電池駆動のものは、省電力なBLEで通信しているようです。電力を十分に得られるプラグなどは、BLEとWiFiの両方で通信するようです。BLEではインターネットに直接接続できないので、WiFiに接続するためのSwitchBot Hub Miniという名前のブリッジ製品も用意されてます。SwitchBot Hub Miniには赤外線リモコン機能もついてます。

ネットワーク構成

ハブを使うことで、BLEの接続をLAN/Internetに拡張できます。さらにその先でSwitchBotクラウドサービスに接続し、家の外からのアクセスも可能にします。クラウドサービスは、Google NestやAmazon Echoとも連携する機能を提供してます。

でも残念なことに一部のスマートプラグ以外のSwitchBot製品はHomeKitに未対応です。販売サイトの説明ではSiriに対応していると書かれていることもありますが、これはiPhone用のSwitchBot専用アプリがAppleのショートカットに対応していて、それを音声で操作できるという意味です。

SwitchBot製品は、基本的にはスマートフォン上のSwitchBot専用アプリで操作します。その場合、SwitchBot製品とスマホはBLEもしくはWiFi接続します。どちらかで接続していれば良く、BLE接続しか使わなければハブは不要です。

HomebridgeでHomeKit対応

ボットやカーテンなどの大半のSwitchBot製品はHomeKitをサポートしてくれてませんが、Homebridgeを使うことでHomeKit対応可能です。Homebridgeも、BLE直接で、もしくはハブ経由のWiFiでのどちらかで接続します。

この場合も、BLE接続しかしないのであればハブは不要です。今回は以下のBLE直接接続の構成で設定を進めます。SwitchBot社のクラウドを使用しないので、応答が高速になります。SwitchBotのクラウドが不調になっても、問題なく動き続けるメリットもあります。

BLEを使う場合は、当然ですがHomebridgeサーバーコンピュータにBLEが備わっている必要があります。Raspberry Pi 3や4のBluetooth付きモデルならBLE対応してます。古いコンピュータだとBLE未搭載だったり、搭載していてもLinux非互換だったりしますので、対応したUSBアダプタがあると良いです。前回はLinuxと互換性の高いCSRチップ搭載Bluetooth 4.0 USBアダプタをUbuntuサーバに取り付けました。

diysmarthome.hatenablog.com

プラグインを入れる

HomebridgeをSwitchBot製品に対応させるために、SwitchBot用プラグインを探します。Homebridgeのサイトや、ネット検索でも探せますが、Homebridgeのwebインタフェースから探すのが簡単です。ブラウザからHomebridgeサーバにログインした後、

プラグインのタブを選びます。ここの検索窓にswitchbotと入力すると、関連するプラグインが表示されます。

switchbotで検索すると13個のプラグインが見つかりました。必要なのは一つだけなので、どれかを選ぶ必要があります。右上に「Verified」と書かれているプラグインは、Homebridgeの人たちが動作などを確認したという推奨マークです。選択の目安になります。また右下の矢印アイコンは、それぞれのプラグインの開発ページにリンクしてます。ここで説明を読んで、必要なプラグインかどうかを判断します。開発ページからわかる更新の頻度も目安になります。2-3年前で更新が止まっているプラグインは、デバイスやHomebridgeの仕様が変わるなどの影響があるのか、動かないこともあります。

ここに現れたプラグインから、「Homebridge SwitchBot」を使うことにしました。「Homebridge SwitchBot」は、Verifyマークもついてますし、更新も頻繁で、最適な選択かと思います。BLE接続に限定すれば「Homebridge SwitchBot Ble」も使えました。Homebridgeのプラグインは、導入も簡単で、削除すると設定も消してくれるので、気軽に色々と試せる点が良いです。複数の選択肢があれば、動くプラグインが見つかるまで次々と試すのも良いです。

上のスクリーンショットでは、すでにインストールした後の状態なので、「Homebridge SwitchBot」プラグインが「インストール済」と表示されていますが、未インストールだと「インストール」というボタンが出ます。このボタンはインストールが終了すると「設定」に変わります。

SwitchBot BotをHomeKitで使う

今回は「Homebridge SwitchBot」にSwitchBot Botを1個登録します。SwitchBotのハブは使いません。BotとHomebridgeはBLEで直接接続します。

まずはスマートフォン用のSwitchBot専用アプリで登録して、動作を確認しておきます。

次にHomebridgeでの設定に戻ります。プラグインの画面でのプラグイン導入が終わると「設定」ボタンが押せるようになります。Homebridge SwitchBotプラグインの設定ボタンを押すと、最初は説明の画面が出ます。

それによると、

  1. iPhoneAndroidからSwitchBotの専用アプリを開く
  2. その「プロフィール」ボタンを押す(人のアイコンのボタンです)
  3. 「設定」ボタンを押す(歯車アイコンのボタンです)
  4. 一番下にある「アプリバージョン」の表示を10回タップする(隠しコマンドですね)
  5. すると「開発者向けオプション」のボタンが出るのでこれをタップする
  6. 英数字のトークンが表示されるのでコピーボタンを押してクリップボードにコピーする

と書いてあります。この手順は、SwitchBot社のハブを用意して、SwitchBotのクラウドに接続して使う場合に必要な手順です。今回は、ハブを使用せずに、BLEだけの接続で動作させます。SwitchBotクラウドを使用しないので、トークンも不要です。

CONTINUEを押すと設定画面に移ります。

クラウドを使用しないので、最初の項目のSwitchBot Account Infoは未記入で良いです。2番目の、SwitchBot Device Settingsを選択します。すると、新しいデバイスの登録画面になります。

ここで、ADD NEW SWITCHBOT DEVICEをクリックし、Device IDを入力します。これはBluetooth Low EnergyのMACアドレスです。SwitchBotのスマホアプリで「デバイス情報」を見ると6バイトの16進数が書かれているので、これを書き込みます。1バイトごとの区切りのコロンは不要です。IDを書き込むと詳細な選択ができるようになります。ここで、

  • 名前をつける
  • BluetoothMACアドレスを入力する(済み)
  • Device TypeからBotを選ぶ
  • Connection TypeをBLEにする

などの設定をします。MACアドレスを手作業でコピペするのが面倒でしたら、サーバーマシンにsshして、bluetoothctlコマンド+scan onして流れているアドレスからSwitchBotのものをコピペしても良いと思います。ここに現れなければこの先でも動作しないですので、事前の確認にもなります。

$ bluetoothctl
[bluetooth]# scan on

設定ファイルで確認する

GUIで適当に入力した後は、テキストの設定ファイルで確認します。ブラウザのタブから「コンフィグ」を選びます。

これでテキスト編集して設定が可能です。プラグインと同じ名前が、platformに書かれているので、SwitchBotという場所を探します。以下のようでした。

{
    "name": "SwitchBot",
    "credentials": {
        "notice": "Keep your token a secret!"
    },
        "options": {
        "devices": [
            {
                "deviceId": "C71122334455",
                "configDeviceName": "myBot",
                "configDeviceType": "Bot",
                "connectionType": "BLE"
            }
        ]
    },
    "platform": "SwitchBot"
}

ちなみにこの設定ファイルは、サーバの

/var/lib/homebridge/config.json

の場所にありますので、sshして編集しても良いです。確認できたらwebページ右上の電源ボタンアイコンを押して、Homebridgeを再起動します。これでiPhoneMacのホーム.appにSwitchBot Botのボタンが現れるはずです。クリックすると動作しました。

SwitchBotカーテンをHomeKitで使う

次に、SwitchBotカーテンも使ってみました。カーテンレールにぶら下がって移動することで、カーテンを開閉してくれます。カーテンレールの形状によって機種が違うので、合うモデルを選びます。

これも、SwitchBot専用スマホアプリに登録して、カーテン開閉の向きやカーテン幅を調整します。その後、SwitchBot Botと同様にHomebridgeから設定をすることで利用できました。プラグインの設定では、Device TypeとしてCurtainを選びます。カーテン開閉は見た目にもインパクトあって面白いです。

クラウドサービスを使う場合

HomebridgeからSwitchBotのクラウドサービスを使うことも可能です。SwitchBotの赤外線リモコンを使うためにハブ機能のある製品を買ってある場合、HomebridgeサーバがBLEを持っていない場合、BLEの接続が不安定な場合などは、検討しても良いかもしれません。クラウドサービスを使う場合は、上のステップでスキップしたSwitchBotのトークンを設定に書き込みます。SwitchBotアプリの、設定画面のアプリバージョン を10回タップすると、開発者向けオプションというメニューが現れます。これをクリックするとトークンが表示されます。これをHomebridgeの設定ファイルに書き込みます。

Bluetooth 4.0 (BLE) アダプタをUbuntuで使う

スマートホームに欲しい無線規格の一つがBluetooth Low Energy (BLE)です。今回は、Homebridge

diysmarthome.hatenablog.com

をインストールしたUbuntuサーバに、BLE対応USBアダプタを取り付けました。今回は動作確認するところまで行います。この先で設定をすれば、例えばBLEで動作するSwitch BotのアダプタをApple HomeKitから使えるようになります。

Bletooth Low Energy (BLE)

Bluetoothはご存知の通り、マウス、キーボード、スピーカー、ヘッドフォンなどを、スマホやPCに接続する無線規格として誕生しました。USBケーブルを無線化するのが当初の目的だったので、到達距離も10mくらいです。その上、そこそこの転送速度を達成するため、ある程度の電力を使用します。転送データ量が僅少で、ボタン電池で動かすスマートホームのセンサ類、スイッチ類などをコントロールするには不向きでした。そこで、データ転送速度は遅くて構わないけど、ひたすら省電力な無線規格としては、長らくZigBeeが使われてました。ただ、国内ではあまり流行ってない印象です。国内で使えるZigBee製品には、例えばIKEAの無線スイッチ、電球、ロールカーテンなどがあります。

そんな中で、BluetoothにもZigBeeのような用途を担わせるべく、Bluetooth 4.0から追加されたのが、Bluetooth Low Energy (Bluetooth LEもしくはBLE)という規格です。Bluetooth とBLEには互換性は無く、別物と言って良い関係なのですが、名前が紛らわしいです。なので、従来のBluetoothBluetooth Classicと呼んで区別することもあるようです。流行していたJavaにあやかって、JavaScriptという名前をつけてしまった状態に近いかもしれないです。

とはいえ、Bluetoothを搭載したらもれなくBLEが付いてくるわけなので、今後はZigBeeよりも普及していくように思います。これからsmart homeを構成するならば、コンピュータ環境をBLEにも対応させておきたいところです。

サーバーコンピュータ

Homebridgeなどのスマートホームサーバを動かすコンピュータには、小型で省電力なRaspberry Piが適していると思います。BLEに関しても、Raspberry Pi 3以降ならば搭載しているのですぐに利用できます。

普通のパソコン(PC-ATX規格のインテルマシン)にUbuntuなどのLinux OSを入れてスマートホームサーバにするのも良いです。最近はRaspberry Piが極端な品不足なので、破格で入手可能な古い小型省電力デスクトップPCを入手して、Linuxマシンにするのも良いと思います。使っていない古いデスクトップコンピュータならばその辺に転がっている、という人も多いと思います。電気代も、計算してみるとそれほど違いはありません。そこで、捨てられていた初代Intel NUCであるDC3217IYEに、Ubuntu Server 22.04 LTSをインストールした環境で、BLEが使えるようにします。

Ubuntuで使えるBLE

どんな周辺機器もWindowsならサポートされてますが、Linuxで使うには互換性に気をつける必要があります。コンピュータにすでにBLEが搭載されていても、それをLinuxで使えるように設定することが困難な場合もあります。今回も実は、手元にあったBluetooth 5.0アダプタを活用しようとしましたが、挫折しました。それで、定評のあるアダプタに買い直すことにしました。CSRのチップを使用したBluetoothアダプタは、Linuxで動作実績が多数報告されてます。そんな中から、安価で入手容易なものを探して、プリンストンのアダプタを選びました。4.0なのでBLEにも対応してます。

Ubuntuとの互換性も高く、箱から出してそのまま(OOB)挿すだけで使えました。

無線USBアダプタは、アンテナが極小で、パソコンの金属筐体で遮蔽されて、さらにはマザーボードなどからの電磁気ノイズの影響を受けやすいです。そこで、USB延長ケーブルを使って、コンピュータ本体から離した場所にBluetoothアダプタを置けるようにしました。

Raspberry PiのBLEも(WiFiもそうですが)基板の上の配線でアンテナを作っているので、感度が悪くノイズを拾いやすいようで、BLEの動作が不安定です。Raspberry Piを使っていた時には、数回に1度くらいの頻度でBLE操作を失敗していました。今回の構成では、USB延長ケーブルを使い30cmくらい離したことで、BLE接続が安定化しました。

動作確認する

Ubuntuから、lsusbするとUSB機器の一覧が出ます。このBluetoothアダプタをUSB端子に接続すると、この一覧の中にCSRのチップが見えるようになりました。

$ lsusb
Bus 002 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

(他にもデバイスが現れましたがここでは省略しました)

Bluetoothドライバが正しく動いていれば、hciconfig -aコマンドで確認できます。

$ hciconfig -a
hci0:	Type: Primary  Bus: USB
	BD Address: XX:XX:XX:XX:XX:XX  ACL MTU: 310:10  SCO MTU: 64:8
	UP RUNNING 
	RX bytes:3144801 acl:16 sco:0 events:108760 errors:0
	TX bytes:37663 acl:13 sco:0 commands:5619 errors:0
	Features: 0xff 0xff 0x8f 0xfe 0xdb 0xff 0x5b 0x87
	Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3 
	Link policy: RSWITCH HOLD SNIFF PARK 
	Link mode: SLAVE ACCEPT 
	Name: ''
	Class: 0x000104
	Service Classes: Unspecified
	Device Class: Computer, Desktop workstation
	HCI Version: 4.0 (0x6)  Revision: 0x22bb
	LMP Version: 4.0 (0x6)  Subversion: 0x22bb
	Manufacturer: Cambridge Silicon Radio (10)

ちゃんと動作していれば、bluetoothctlコマンド(sudo apt -y install bluetooth bluezでインストールしました)の中で、scan onなどすると他のデバイスを探してくれます。

$ bluetoothctl
[bluetooth]# scan on
Discovery started
[CHG] Controller XX:XX:XX:XX:XX:XX Discovering: yes
[NEW] Device XX:XX:XX:XX:XX:XX iPhone

こんな感じで動作を確認できます。もしBluetoothドライバが機能していない状態だと、

No Default controller available

のようなメッセージで止まってしまいます。このリストの中に、使用予定のSwitch BotMACアドレスが見えたので、一安心しました。次回は、Switch BotアダプタをHomeKitから使えるように設定します。

diysmarthome.hatenablog.com

Homebridgeをインストールする

HomebridgeはApple HomeKitのためのブリッジです。サーバーと動かしておけば、HomeKit非対応のデバイスをHomeKitアクセサリとして利用することができます。自作のデバイスや、GoogleAmazonにしか対応していない機器がHomeKitから使えるようになります。

Homebridgeは、Raspberry PiLinuxマシン、QNAPやSynologyなどのNASWindowsマシン、Macなどにインストールできます。サーバーとして24時間動作させるので、Windows版やMac版はあまり使わないと思います。ここでは、Raspberry PiLinuxマシン、QNAPのNASへのインストール方法をメモしておきます。詳しくはHomebridgeのサイトをご覧ください。

homebridge.io

インストールの前に、HomeKitとHomebridgeの関係を整理しておきます。

Apple HomeKit

Apple HomeKitは、iPhone, Mac, HomePod, iPad, Apple Watchなどを使ってスマートホームを実現するためのフレームワーク、ライブラリ一式のようなものです。iOS, macOSなどのApple社OSの一部として組み込まれています。HomeKitは、スマートホームを実現するための枠組・アプリケーションとしてとても良く作られています。iPhoneユーザまたはMacユーザには、HomeKitを強くお薦めします。逆に、Apple製品には興味が無いAndroidユーザの方にとっては、HomeKitは無縁です。

HomeKitに対応した照明、スイッチ、コンセント、センサなどのIoT機器はアクセサリと呼ばれ、HomeKit Accessory Protocol (HAP)というプロトコルで通信します。HAPに対応した製品ならば、iPhoneMacのホーム.appから制御できて、Siriで操作できます。

HAPで通信できるHomeKit対応製品は、そこそこの種類が発売されていますが、GoogleAmazonに対応した製品ほどは多くありません。また価格も高い傾向があります。その中でも、スマートプラグのMeross Plugなどは、比較的お値打ちな製品だと思います。最近はAppleの承認を得ないで販売されている安価なHAP対応製品もネットで見かけるようになりました。さらにはDIYするならば、前の記事で紹介したESP32で動くHomeSpanライブラリを使うことで、HAPに対応したアクセサリを作れます。

Homebridge

Homebridgeは、オープンソースソフトウェアで、Raspberry Piなどの上でサーバとして稼働して、さまざまな機器をHomeKit対応アクセサリとして動作させます。HAPとそれ以外のプロトコルのブリッジとして機能します。これを使えば、HomeKitに対応していない製品、例えばSwitchBotの製品、Nature RemoなどがHomeKitで使えるようになります。HomeKit対応製品が少なく高価なことを補ってくれるありがたいツールです。また、MQTTやZigbee2MQTTなどのIoTでよく使われるプロトコルへの対応や、Raspberry PiのGPIOのコントロールなども可能ですし、自作のスクリプトやプログラムを起動させることも可能です。

Home Assistanceをはじめとする他のオープンソーススマートホーム向けサーバは、スイッチとランプの関係付けとか、センサ情報に対応した自動化などの機能をそれ自体で提供します。一方で、Homebridgeは、HAPへのブリッジ機能だけを提供します。機器のコントロールには関与せず、それはAppleが提供するソリューションに任せています。

他のオープンソースサーバと同じく、Homebridgeもプラグインにより機能拡張する仕組みを取り入れてます。色々な人たちがプラグインを開発して公開しているので、それを組み込むことで、多彩な機器をHAP対応させることが可能です。Homebridgeを活用するためには、本体をインストールするだけでなく、目的に合ったプラグインを探してくる必要があります。

多数の便利なプラグインが提供されていますが、お薦めしたい一つはMQTTをサポートするプラグイン類です。MQTTを導入することで、ESP32で色々なDIYが可能になります。また、Zigbee2MQTTを導入することで、多数のZigbeeバイスがHomeKitから使えるようになります。

 

という便利なHomebridgeを、以下でインストールします。

Raspberry Piへのインストール

Raspberry Piを使い始めるには、WindowsMacからRaspberry Pi Imagerを使うのが便利です。これを使えば、起動用のSDカードやUSBメモリを作ることができます。ちなみに最近のRaspberry Pi 4ならば、設定を頑張らなくてもUSBメモリやUSB接続SSD/HDDからの起動が可能になりました。USB 3.0のUSBメモリを使えばSDカードより高速ですし、SSD/HDDを使えば耐久性が上がります。サーバーとして使うのならUSB起動が良いです。

Raspberry Pi Imagerで、「OSを選ぶ」を選んで選択していくとHomebridgeが選択肢に現れます。これを選んで、「ストレージを選ぶ」からSDカードやUSBメモリを選び、「書き込む」ボタンを押せば、起動ストレージが完成します。

また、OSの選択が終わると、右下に歯車アイコンが出ます。これをクリックすると、WiFiの設定ができるようになります。Macならばキーチェーンから読み込んでくれます。ここで設定しておけば、起動後にネットワーク越しに操作できるので、Raspberry Piにディスプレイもキーボードも接続する必要がありません。

Raspberry Piへのインストールは、こちらの記事でも紹介しました。参考にしてください。

diysmarthome.hatenablog.com

Linuxマシンへのインストール

このところRaspberry Piが品不足で入手困難なので、PC-ATX互換の普通のインテルCPUのデスクトップPCにLinuxを入れてサーバにするのも良いと思います。使わない古いデスクトップを抱え込んでいる人も多いと思いますし、その辺りに捨てられていることもあると思います。ハードオフなどでジャンク品を二束三文で買ってきても良いと思います。私も、Raspberry Piが買えないので、放置していた初代Intel NUCであるDC3217IYEに、Ubuntu Server 22.04 LTSをインストールして使ってます。

Linuxマシンへのインストールも、簡単になっているようです。レポジトリを設定して、apt-getするだけで完成します。こちらに書いてあるコマンドをコピペして実行しました。

curl -sSfL https://repo.homebridge.io/KEY.gpg | sudo gpg --dearmor | sudo tee /usr/share/keyrings/homebridge.gpg  > /dev/null
echo "deb [signed-by=/usr/share/keyrings/homebridge.gpg] https://repo.homebridge.io stable main" | sudo tee /etc/apt/sources.list.d/homebridge.list > /dev/null
sudo apt-get update
sudo apt-get install homebridge

QNAPのNASへのインストール

すでにNASを動かしている場合でしたら、そこにインストールしてしまえば、追加の電気代もかからなくて良いです。QNAPやSynologyなどのNASで動かせます。その場合、簡易的な仮想マシンのような環境の、Dockerというのを使います。なお、古いQNAP製品だと性能が足らなくてDockerがサポートされていないこともあります。

QNAPの場合、Container StationというツールからDockerとHomebridgeをインストールします。Dockerが使うIPアドレスは、NASと共有することもできますし(同じポート番号は使えない)、NASとは別にDocker独自で持つこともできます。NASとは別にするのが良いと思います。また、Dockerで使う設定ファイルやデータをファイルサーバからも見えるように設定しておけば、管理も楽です。

Homebridgeの設定

設定が終われば(もしかしたらサーバーの再起動が必要かもしれませんが)Homebridgeは動いてます。設定したIPアドレスにポート番号8581を付けて、Webブラウザからアクセスすれば、設定画面が現れます。例えばIPアドレスが192.168.0.10だったら、

http://192.168.0.10:8581/

で以下のような画面が現れます。

ログインのユーザ名と初期パスワードは、どちらもadminです。このWebインタフェースから、ほぼ全ての設定が可能です。プラグインを探して、導入し、設定する操作もWebページから行えます。

HomeKitに登録する

これで出来上がったのがApple HomeKitのプロトコルHAPに対応したブリッジです。これをiPhoneMacのホーム.appから使用するためには、ブリッジとして追加します。ブリッジとアクセサリは同じような扱いらしく、メニューとしては画面の+マークを押して出てくる「アクセサリを追加」を選べば良いです。ちなみにアクセサリとブリッジの追加・削除は、iPhoneのホーム.appからのみ可能です。Macからは追加・削除できません。

アクセサリの追加を選ぶと、カメラが起動します。上でインストールしたHomebridgeのWebページに表示されているQRコードを読み込ませると、登録できます。

https://homebridge.io/assets/images/homebridge-ui.png

( https://homebridge.io/ から引用)

まとめ

Homebridgeサーバを用意することで、メーカー独自規格の機器や、自作機器をHomeKitから使えるようになります。このブログでも色々なIoTデバイスを利用する様子を紹介していきます。

diysmarthome.hatenablog.com

HomeKitプログラミングしてSiriにLEDを点けてもらう

ESP32は技適マーク付き無線モジュール搭載で数百円で買えるマイコン開発ボードです。これに、Apple社のHomeKit対応プログラムを書き込み、iPhone, Mac, Apple Watchのホームアプリ

の画面からLEDを点灯できるようにします。HomePod, iPhone, Apple Watch, Macに向かって「Hey Siri, LEDを点けて」と言えばSiriがLEDを点けてくれます。

ESP32プログラミングにはArduino IDEを使用します。こちらの記事で、LED点滅(Lチカ)プログラミングができる準備をしましたのでご覧ください。

diysmarthome.hatenablog.com

HomeKitとHAP

巨大IT企業のGoogle, Apple, Amazonは、それぞれスマートホームのためのフレームワークを大々的に売り出してます。どれを選ぶか難しいところですが、Appleのエコシステムに深く取り込まれている人なら、Apple HomeKitが便利です。Google, Amazonに比べて対応製品が少なくて割高ですが、OS標準装備なので使える機能が豊富です。対応製品が少ない問題は、DIYして補っていきましょう。

HomeKitはApple社のスマートホーム向けのフレームワークで、iOS, macOS, tvOS, watchOSなどと連携します。音声エージェントSiriとも連携します。IoT機器・製品(HomeKitではアクセサリと呼びます)がHomeKitに接続するためのプロトコルが、HomeKit Accessory Protocol (HAP) です。

HomeKitに直接接続するアクセサリを自作する際には、このHAPに対応したプログラムを書かなければなりません。ソケット通信のプログラムとか、httpとかMQTTに対応したプログラムとか比べて、ハードルが格段に高そうな感じです。なので、ずっと諦めていたのですが、お手軽に対応できるライブラリがありそうなことに最近気づきました。ESP32などを対象に、Arduino IDE用のライブラリとして提供されています。これを使ってみることにしました。

Arduino IDEにHAPを導入する

Arduino IDEの「ツール」「ライブラリを管理...」メニューを開くと、追加可能なライブラリの一覧が表示されます。

この検索窓にhomekitと打ち込んでみたところ、4件がヒットしました。More Infoを見て、ESP32がサポートされていて、プログラミングが簡単そうなことから、HomeSpanというライブラリを選びました。これのインストールボタンを押します。

一番簡単そうなサンプルプログラム

HomeSpanのgithubにあるサンプルから、一番簡単そうなプログラムを探しました。簡単な電球プログラムのようです。

github.com

コメントがたくさん書いてあって、親切なソースコードです。実質は10行くらいの短いプログラムでした。このプログラムは、HomeKitアクセサリとしてちゃんと動いて、アクセサリがiPhoneMacのホームアプリ上に現れて、on/offの操作が可能です。でもLEDを点けたりなどの機能は全く無い、ダミーのプログラムです。

#include "HomeSpan.h" 

void setup() { 
  Serial.begin(115200);
  homeSpan.begin(Category::Lighting,"HomeSpan LightBulb");
  new SpanAccessory();
    new Service::AccessoryInformation();
  new Characteristic::Identify();
new Service::LightBulb(); new Characteristic::On(); } void loop(){ homeSpan.poll(); }

説明を付けると、以下のようになります。

#include "HomeSpan.h" //ライブラリの読み込み

void setup() { 
  Serial.begin(115200);//動作確認と設定のためのシリアルを用意
//HomeSpanライブラリはhomeSpanという名前のグローバルインスタンス
//用意するので、それを始動します。引数はカテゴリと初期名前です。 homeSpan.begin(Category::Lighting,"HomeSpan LightBulb");
//次にHAPアクセサリを作ります。 new SpanAccessory();
//AccessoryInformationは必須のサービスです。 new Service::AccessoryInformation();
//AccessoryInformationサービスにはIndentifyが必須
  new Characteristic::Identify();
//Identifyの他に、メーカ名、シリアル番号なども設定可能

//次に電球のサービスを定義します。 new Service::LightBulb();
//このサービスはOnキャラクタリスティックが必要です。 new Characteristic::On(); } void loop(){ homeSpan.poll();//homeSpanを機能し続けます。 }

コンパイルもできて、ダウンロードできました。でも、何かが動いている様子はありません。この段階ではiPhoneのホームアプリにも応答がありません。

シリアルモニターで設定する

プログラムの冒頭でシリアルポートの設定をしていることから推測できるように、シリアル経由で動作確認や設定ができます。Arduino IDEからシリアルモニターを開けると、色々とメッセージが出ていました。

************************************************************
Welcome to HomeSpan!
Apple HomeKit for the Espressif ESP-32 WROOM and Arduino IDE
************************************************************

** Please ensure serial monitor is set to transmit 

Message Logs:     Level 0
Status LED:       Pin -  *** WARNING: Status LED Pin is UNDEFINED
Device Control:   Pin -  *** WARNING: Device Control Pin is UNDEFINED
Sketch Version:   n/a
HomeSpan Version: 1.5.1
Arduino-ESP Ver.: 2.0.3
ESP-IDF Version:  4.4.1
ESP32 Chip:       ESP32-D0WDQ6 Rev 1 dual-core 4MB Flash
ESP32 Board:      esp32
PWM Resources:    16 channels, 8 timers, max 20-bit duty resolution
Sodium Version:   1.0.12-idf  Lib 9.4
MbedTLS Version:  mbed TLS 2.28.0
Sketch Compiled:  Jun 27 2022 12:46:53
Partition:        app0

Device Name:      HomeSpan LightBulb

(略) 
     
*** WIFI CREDENTIALS DATA NOT FOUND. 
YOU MAY CONFIGURE BY TYPING 'W (return)'. 

HomeSpan LightBulb is READY!

最後に、Wを押してWiFi設定せよと出ているので、設定しました。2.4GHzのWiFi一覧が表示されて、該当を選んでパスワードを送ると、接続できたようです。また、?やもしくは単に改行だけを送ると、ヘルプが出てきました。

*** HomeSpan Commands ***

  s - print connection status
  i - print summary information about the HAP Database
  d - print the full HAP Accessory Attributes Database in JSON format

  W - configure WiFi Credentials and restart
  X - delete WiFi Credentials and restart
  S  - change the HomeKit Pairing Setup Code to 
  Q  - change the HomeKit Setup ID for QR Codes to 
  O - change the OTA password
  A - start the HomeSpan Setup Access Point

  V - delete value settings for all saved Characteristics
  U - unpair device by deleting all Controller data
  H - delete HomeKit Device ID as well as all Controller data and restart

  R - restart device
  F - factory reset and restart
  E - erase ALL stored data and restart

  L  - change the Log Level setting to 

  ? - print this list of commands

*** End Commands ***

これによるとSコマンドでペアリングのための8桁の数字を設定できるようです。12345678などの簡単な組み合わせは拒否されてしまうので、31415926のような数字にしました。S31415926とタイプします。

WiFiとペアリングコードを設定し終われば、ホームアプリケーションに現れるようです。最初のうちは応答が悪かったのですが(HomeKit製品のペアリングではよくあることです)、シリアルモニタでVとかUとかのコマンドを打っているうちに、ホームアプリに現れるようになりました。

該当するアクセサリをタップすると、設定コードを質問されます。Sコマンドで設定した8桁の数字を入力します。これでESP32がホームアプリの上にタイルとして現れました。これをタップすると画面上の状態がon/offします。ただし、それに対応するプログラミングをしていないので、何も起こりません。

LEDを点ける

LEDを点灯するには、setup()の次の2行の部分を書き換えます。ここでは、電球のサービスを定義しています。

  //次に電球のサービスを定義します。
  new Service::LightBulb();
  //このサービスはOnキャラクタリスティックが必要です。
  new Characteristic::On();

HomeSpanのサイトには、マニュアルやチュートリアルがたくさん用意されています。そのサンプルプログラムなどを読むと、Service::LightBulbクラスのサブクラスを作って、そこにLED点滅機能を作り込むと良いようです。また、そのクラスのコンストラクタで、Characteristic::Onクラスもインスタンス化しておきます。その際にインスタンスへの参照を残しておくと、現在の電球の状態を知ることができるようです。

全体のプログラムは以下になります。

#include "HomeSpan.h"

class LEDtester : Service::LightBulb {//定義したクラス
private:
  int LEDpin;//LEDピン番号
  SpanCharacteristic *LEDstatus;
public:
  LEDtester(int thePin) : Service::LightBulb() {
    LEDstatus = new Characteristic::On();
    LEDpin=thePin;//引数をLEDのピン番号にする
    pinMode(LEDpin,OUTPUT);
  } // end constructor()

  boolean update(){
    digitalWrite(LEDpin, LEDstatus->getNewVal());
    return(true);
  } // end update()  
};//クラス定義はここまで

void setup() { 
  Serial.begin(115200);
  homeSpan.begin(Category::Lighting,"HomeSpan LightBulb");
  new SpanAccessory();
  new Service::AccessoryInformation();
  new Characteristic::Identify();
  new LEDtester(13);//電球機能を別クラスにした
} 

void loop(){
  homeSpan.poll();
}

前のバージョンのsetup()にあった電球サービス関係のインスタンス化の部分

  new Service::LightBulb();
  new Characteristic::On();

が、LEDtesterというクラスのインスタンス

  new LEDtester(13);

に変わってます。LEDtesterは、Service::LightBulbのサブクラスとして定義しました。このクラスのコンストラクタの中で、Characteristic::Onのインスタンス化も行ってます。Characteristic::Onのインスタンスメソッドには、getNewValというメソッドがあって、新たに設定された値を返してくれるようです。1か0の値を持つon/offタイプの電球なので、次の値である1か0を返してくれるもののようです。

これでホームアプリからLEDを点灯・消灯できるようになりました。(写真はLチカのと同じです)「へいSiri、Home Span Light Bulbを点けて」と言えば、LEDを点けてくれます。消してといえば消してくれます。デフォルトの名前は長いですが、「LED」でも「あかり」でも好きな名前に、ホームアプリからいつでも書き換えられます。

まとめ

ESP32にHomeKitアクセサリのプログラムを組み込んで、ホームアプリやSiriからLEDを点灯できるようにしました。思ってたより簡単で、DIYも色々できそうです。

Arduino IDEでEPS32をプログラミング

ESP32開発用モジュール

スマートホームで使える賢いIoT機器といえば、WiFiBluetoothなどで無線接続できる製品が一般的です。Arduinoを使えば賢い機器を安価に作れますが、無線接続が不得手です。とはいえRaspberry Piでは役不足な場面が多いです。無線接続できてちょっとしたプログラムが簡単にできるお手軽なマイコンボードが欲しいところです。そこでESP-WROOM-32 (ESP32)というチップに目をつけました。このチップに、USBシリアル変換回路、5V-3.3V変換回路などを追加した開発ボードが、送料込み数百円で入手可能です。スマートホームDIYするのにうってつけだと思います。

ESP32は、色々な方法でプログラミングができるようですが、お手軽なArduino IDEを使いました。この記事では、Arduino IDEでLEDを点滅させるLチカプログラムが書けるところまで試します。

Arduino IDEをESP32対応させる

まずは、通常のArduino IDEをESP32対応させます。ArduinoのサイトからダウンロードしたばかりのArduino IDEは、Arduinoにしか対応していません。「ツール」「ボード」メニューを選んでもArduinoシリーズしか出てきません。

このメニューから「ボードマネージャ...」を選ぶと対応ボードを増やすことができます。でも、検索窓にespと入れてもESP32関係のものは現れません。

そこで、こちらのサイトを開きます。ここでは、ESP32をArduinoで開発するためのライブラリを紹介しています。

docs.espressif.com

ここにある、URLが重要です。安定版の配布リンクには、

https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

と書かれてます。この文字列をコピーします(横にコピーボタンがあります)。

次に、Arduino IDEのPreferences...メニューを選びます。すると設定ウィンドウが開きますが、その中に「追加のボードマネージャのURL 」という項目があります。ここに先ほどのURLをペーストします。

これでボードマネージャにesp32の選択肢が現れます。インストールボタンを押して、これをインストールします。

すると、「ツール」「ボード」メニューにESP32 Arduinoという項目が現れます。

たくさん選択肢があって迷うところです。実は、ESP32で始まるメニューのいくつかで開発可能ですが、おそらくはESP32 Dev Moduleが一番適切な選択だと思います。これを選んでおきます。

Lチカプログラムを書く

次に、LEDをチカチカ点滅させるプログラム(Lチカ)を書きます。13番ピンにLEDを接続して使うことにしました。以下のプログラムをArduino IDEに書き込みます。解説の必要も無いプログラムだとは思いますが、setup()で13番ピンを出力に設定し、loop()で13番ピンを1秒ごとにHIGH, LOWに設定しています。

const int LED=13;

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
 digitalWrite(LED, HIGH);
 delay(1000);
 digitalWrite(LED, LOW);
 delay(1000); 
}

コンパイルしてダウンロードすると、13番に接続したLEDが点滅しました。

ESP32開発ボードはどこで買える

国内ならばスイッチサイエンスで売ってます。送料別2,200円くらいです。今時のType-Cになっていてなかなか良いです。

www.switch-science.com

AliExpressなら送料込みで700円以下です。海外製品ですが技適マークが刻印されているので安心です。

ja.aliexpress.com

Amazonでも1000円程度で売ってました。翌日配送なのでこちらの方が良いかもです。今回実験したボードはAliExpressで購入したのですが、写真を見る限り同じ部品配置なので、問題なく使えると思います。