Smart HomeをDIYする

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

PoE IPカメラ (2,059円) をHomeKitから使う

Ethernetに接続する安価な有線IPカメラを、Raspberry Pi4にインストールしたFFmpegとHomebridgeを使って、HomeKitに接続しました。Power over Ethernet接続の機種を選べば、カメラへの配線は1本で済みます。

IPカメラが安い

セキュリティ目的のカメラにはいろいろなタイプのものがあります。その中でもIP接続するカメラは、柔軟に接続できるので使いやすいです。これらのカメラは、一般的にはWiFiEthernetで接続して、RTSP (Real Time Streaming Protocol) で動画データを配信します。

WiFi接続のIPカメラは、配線が楽ですが、WiFiの帯域に動画データが負荷をかけます。また、WiFiであっても、電源ケーブルが必要な場合が一般的なので、配線が全く不要というわけではないです。

一方、Ethernet方式のIPカメラの中には、PoE (Power over Ethernet) に対応したものもあります。これならばEthernetだけの配線で、電力も供給できるので配線が楽です。 ということで、今回はPoE対応有線IPカメラを使いました。

PoEハブを揃える

PoE機器を使用するためには、Ethernetに電力を供給するデバイスが必要です。Ethernetはもともと通信データを送る配線の規格で、電力を供給する配線は含まれていませんでした。でも、電力も送れると便利なので、使われない配線を電力線に使うPoE規格が作られてます。いくつか規格があるようですが、基本的なもの (IEEE 802.3af) は48V15Wを供給する方式です。IPカメラは消費電力が少ないので、この規格のPoEで機能します。

Ethernetで使われるケーブルの中には、2本ずつ捻り合わされた4対の銅線(合計8本)が使われてます。

( http://www.aim-ele.co.jp/tech/metal-tech6/ )

100Base-Tではこのうちの2対が使われるので、2対が余ります。上の図でPin 4, 5, 7, 8が余ります。その余った2対(合計4本)の線を電力供給に使ってしまおうというのがPoE (IEEE 802.3af) の規格です。余った配線に48Vの電圧をかけて、電力を送ります。一方で、現在一般的に使われている1000Base-TEthernetでは、転送速度を稼ぐために4対全部の配線を通信に使用してます。なので、この規格のPoE機器は、必然的に100Base-Tで機能します。

PoEを使う場合は、PoEハブを用意すると簡単です。PoEハブは上流から1000Base-TEthernetを受けて、これを下流100Base-TのPoEに流します。PoEに必要な電力はハブから供給されます。また、PoEのコネクタに、PoE非対応の1000Base-T機器が接続された場合は、自動判定して1000Base-Tでの接続をします。

PoEハブは、以前は日本で買うと高価でしたが(AliExpressなどでは安かった)、最近は日本のAmazonでも手頃な価格で買えるようになりました。

IPカメラを選ぶ

ネット通販でPoE接続のIPカメラを探しました。これも少し前はAliExpressの品揃えが豊富でしたが、最近は日本のAmazonでもそこそこの価格で買えるようになりました。でもやはりAliExpressの方が安くて豊富です。ということで、この機種を選びました。

品定ポイントの第一は、PoE対応かどうかです。48V PoEと書いてあれば、規格に沿っていると思われるのでより安心です。

素数が1M画素の機種は1280x720の標準HDで、2M画素が1920x1080のフルHDです。あまり高画素だとデータが大きくて負担になるので、1M画素にしました。またレンズの焦点距離が、2.8mm, 3.6mm, 6mmとあるのは、広角・標準・望遠のような位置付けです。これは使用目的次第ですが、セキュリティカメラとしては広角の方が何かと使いやすいです。なので2.8mmにしました。

IPカメラを選択する際に、RTSPの仕様がわかっている機種が望ましいです。RTPSはHTTPと同様に、IPアドレスディレクトリ構造、ファイル名などを指定してアクセスします。その詳細が不明でも、色々と試せば発見できるのですが(それはそれで謎解きのようで楽しいのですが)、すでにわかっているメーカならば手間が省けます。それには、こちらのサイトが役立ちます。

www.ispyconnect.com

ここに、いろいろなブランドがアルファベット順に記載されてます。ここにURLが掲載されたブランドの該当機種ならば、ほぼ問題なくFFmegから接続可能です。今回の製品は、Xmeyeというブランドのようで、上記のサイトにも掲載されています。なので、安心して購入できました。

分解してみる

1M画素のPoEモデルの価格は送料無料で2,059円でした。人感センサと同じくらいの価格で、カメラが買えてしまうのはすごいかと思います。

品物は、適切に梱包されていて問題なく到着しました。全体に肉薄の軽いプラスチックで作られていて、コストダウンされている感じです。でも角度調整(雲台)の部分は、3軸の回転が可能で、調整後はネジで固定できるようになってます。堅牢ではないですが、価格を考えたらよく作られていると思いました。

カメラを傾けると、カサカサと音がするので、プラスチック片でも混入しているのかなと思って蓋を開けました。背面のネジ3個で裏蓋を開けることができます。中の基盤は綺麗に作られてます。

蓋はゴムでパッキングされていて、ケーブルの入り口はホットボンドでしっかり固めてあります。一応の防水はできているようです。傾けると音が出る正体は、乾燥剤でした。接着剤で止めてありました。湿気対策のようです。

全体に高級感はありませんがしっかりと作られてます。この基板の裏側には、レンズ、撮像素子、照明用赤外LEDがあるわけで、これらが2,000円ちょっとで販売されているのは驚きです。コスパがすごいです。

Webインタフェースは使えない

PoEハブに接続すると、青いLEDが点灯して、しばらく経つとリレー音が聞こえます。赤外線照明LEDのon/offだと思われます。動作しているようです。

製品と一緒に入っていた説明書によると、工場出荷時には192.168.1.10にアドレス設定されているようです。LANのネットワークアドレスは別の値だったので、コンピュータの方を手動で192.168.1.XXXに設定して、webブラウザでアクセスします。こんなページが現れました。

ユーザ名admin、パスワードなしでログインできるのですが、カメラ画像の表示は出ません。Macなのでダメなのかと思い、Windowsで試しても「このプラグインはサポートされていません」という表示が出るだけです。説明書によるとActiveXが必要とのことです。今更ActiveXに対応させる気にはならないです。さらに説明書によると、webからは映像が確認できるだけで、設定はできないようです。Webインタフェースは、カメラのアドレス、ユーザ名、パスワードが正しく設定できたかどうかの確認用に使うのが良いと思いました。

設定アプリが必要

このwebページが現れるタイプのIPカメラは、今までも使ったことがあります。格安の製品に多いです。おそらくは、昔に開発された仕組みを使った部品が出回っていて、複数の会社がそれを使ってカメラを商品化しているのだと思います。

このタイプのカメラは、設定に専用のWindowsアプリが必要です。MacLinuxスマホからは設定できません。Windowsを起動し、説明書に書いてあるURLからVMSという名前のアプリをダウンロードしました。こんな画面のアプリです。

上のDevice Managerというボタン

から現れるページで、IPアドレスを使ってカメラを登録します。ここでIPアドレスとパスワードが変更できます。IPアドレスをLANで使っている範囲に書き換えた後、Windowsのアドレスも元に戻して、再びVMSで接続します。

この後は、Device Configのボタンを押して、タイムゾーンとかNTPの設定をします。設定項目としては、

の設定くらいをしておけば良いと思います。他にも細かい設定が可能なので、一通り見ておくのも良いと思います。ちなみに、このVMSアプリでも、カメラの映像は表示されませんでした。今のWindowsでは使われていない古い仕組みを使っているのかと思われます。

FFmpegを使う

ネットワーク関係の設定が終了したら、Macから(Windows, Linuxでも良いですが)FFmpegでIPカメラ映像取得のテストをします。以前の記事で、FFmpegを使ってUSBカメラの映像を利用しました。今回も同様です。FFmpegの説明は、こちらの記事を見てください。

diysmarthome.hatenablog.com

FFmpegのコマンドの一つであるffplayを使って、IPカメラの映像を確認します。

ffplay -i rtsp://192.168.xxx.xxx/ ...

のようにして、IPカメラのRTSPのURLを指定すると、映像が表示されるはずです。問題は、このURLが何かという点です。この辺りの規格化はされていないらしく、カメラによってバラバラです。それを調べ上げてまとめてくれているのが、上で紹介したサイトです。今回使用したXmeyeというブランドのURLは、こちらのページに書かれてます。

www.ispyconnect.com

このページでは、URL雛形リストをクリックすると、環境に合わせたURLを自動生成するダイアログパネルが現れます。ここのアドレス、パスワードなどの項目に使用中の値を入れて、「Generate URL」ボタンを押します。生成されたURLをターミナルにコピペすれば、すぐに動作確認できます。&などが含まれるURLをffplayの引数に使う場合は、その前に逆スラッシュを入れておく必要はあります。この生成結果をいろいろ試して、動作するURLを探します。

このページのURLを試したところ、

ffplay -i rtsp://192.168.x.x/user=admin_password=xxx_channel=1_stream=0.sdp

で720pのHD画像が、また、

ffplay -i ffplay -i rtsp://192.168.x.x/user=admin_password=xxx_channel=1_stream=1.sdp

でその半分のサイズの画像が表示されました。以下のようなウィンドウです。

Homebridgeの設定

見つかったURLを使って、HomeKit対応カメラとして設定します。前回の記事と同様に、HomebridgeにHomebridge Camera FFmpegプラグインを使用しました。今回は、Raspberry Pi4で動かしているサーバにインストールしました。前回の記事のUbuntuで行ったのと全く同じ手順ですので、詳しくはこちらをご覧ください。

Homebridgeのコンフィグでカメラの名前をSky Cameraとしました。"source"の設定には、上で動作確認できたハーフサイズの映像のURLを使いました。

{
    "name": "Camera FFmpeg",
    "cameras": [
        {
            "name": "Sky Camera",
            "videoConfig": {
                "source": "-i rtsp://192.168.x.x/user=admin_password=xxx_channel=1_stream=1.sdp"             
} } ], "platform": "Camera-ffmpeg" }

その結果、iPhoneMacのホーム.appにカメラ映像が表示されます。以下はiPhoneスクリーンショットです。

映像の部分をタップすると、拡大表示されます。

Homebridge Camera FFmpegプラグインのデフォルトは、音声を伝えない設定です。これを伝える設定にしてみましたが、音声は伝わりませんでした。このカメラにはマイクロフォンやスピーカが搭載されていないようです。監視カメラとしては一般的な仕様だと思います。

Amazonで買えるIPカメラ

Amazonで見つけたPoE IPカメラのうち、RTSP URLが特定されているブランドの1万円未満の製品を以下にまとめておきます。AliExpressほど安くは無いですが、お試しするのに適当ではないかと思います。

Amazonでは、有線接続よりも、WiFi接続のカメラの方が豊富でした。PoEハブが不要なことを考えると、有線よりも安く導入できます。ペットや子供の見守りが目的の製品のようで、音声を伝える機能もついています。以下は、RTSP URLが判明しているとされている型番のWiFi IP カメラです。型番末尾が1番違いくらいでしたら、おそらくは旧製品のバージョンアップなので使えると思います(この一覧からは外してあります)。

これらはFFmpegとHomebridgeの組み合わせでHomeKitから使用できると考えられます。

まとめ

送料込み2,000円ほどのIPカメラを入手して、HomeKitカメラとして使用しました。他にも安価なIPカメラをいくつか使ったことがありますが、今回使用した製品は、さらにコスパが高いです。Webインタフェースや設定ソフトがしょぼいのも許せます。

PoE IPカメラは、この他にも、AliExpressやAmazonでいろいろな製品が揃ってます。RTSPのURLがわかっているブランドや品番を選べば、大体はFFmpegとHomebridgeで使用可能だと思います。また、今回の製品では厄介だった初期設定ですが、製品によってはwebインタフェースから全ての設定ができる製品もあります。ただ、雲台部分の作りがあまり良くなかった印象があります。

HomeKitアクセサリシミュレータで遊ぶ

HomeKit Accessory Simulator (以下HAS) は、Appleが無料で配布しているツールです。Macの上でHomeKitアクセサリをシミュレーションで作ってくれます。ここで動かしたバーチャルなアクセサリは、iPhoneMacのホームから通常のアクセサリと同じように利用できます。各種アクセサリがどのように動くのか、確認するのに便利なツールです。IP Cameraのアクセサリをシミュレーションしたところ、MacのカメラやUSB接続のwebカメラを通して映像をホームで見られました。

HASを入手する

HASは以下のサイトから無料で入手できます。ただし、Apple Developer Program (ADP) のアカウントが必要です。ADP アカウントには有料と無料のアカウントがあります。有料アカウントだとApp Storeでプログラムを配布できるようになります。無料アカウントでも、さまざまな情報にアクセスできて、ツール類をダウンロードできます。macOSiOSのパブリックベータ版を試用することも可能になります。無料で色々な特典がありますので、登録をお勧めします。

developer.apple.comt

このページからは、Additional Tools for Xcodeというアプリ群をダウンロードできます。その中に、HomeKit Accessory Simulator (HAS) が入ってます。

Xcode 14.1はmacOS最新版のVentura用の開発ツールなので、Xcode本体は古いmacOSで起動しません。しかしAdditional Tools類は、古いバージョンのmacOSでも動きました。

起動する

ダウンロードしたフォルダの中からHASアイコン

を見つけたら、わかりやすい場所(アプリケーションフォルダなど)にコピーして起動します。起動するとすでに何かのアクセサリができています。BLE接続のアクセサリのようですが、うまく使用できませんでした。

電球アクセサリを作る

気を取り直して、左下の+マークをクリックしたところ、新規アクセサリを追加できました。

次に現れるダイアログパネルで、カテゴリとしてシンプルなLightbulbを選んでみました。名前はLight Simにしてみます。

出来上がってQRコードが表示されました。

このままですと、まだ何もできません。HomeKitアクセサリには、キャラクタリスティックとサービスという2種類の属性があります。よく理解できていないので間違っているかもしれませんが、キャラクタリスティックはそのアクセサリの状態変数(on/offとか明るさ)を表すもので、サービスは1個または複数のキャラクタリスティックスを取得したり設定する機能です。ここでは、ウィンドウの下にある「Add Service...」ボタン

を押して、LightBulbというサービスを追加します。

on/offキャラクタリスティックや明るさキャラクタリスティックを変更するなどの機能があるサービスです。

その結果、ウィンドウに電球サービスが追加されました。現在の電球の状態も表示されています。初期値では、OnのところがNo(消灯)になってます。

電球アクセサリを使う

これでネットワーク上のHomeKit環境から、この電球アクセサリが利用できるようになっています。iPhoneのホームから、アクセサリの追加を選びます。次に表示されるカメラ画面を使って、このQRコードを読み取ります。するとホームに電球が現れます。

クリックしてみます。ホームの表示がonになり、

MacのHASの画面のOnの場所がNo(消灯)だったところがYes(点灯)になります。

さらに、iPhoneの画面で色を選択すると、

HASの画面でも色合いが更新されます。

今回は一番シンプルな電球を選びましたが、もっと複雑な動作をするガレージドアとか、セキュリティシステムなどを選べば、HomeKitでの挙動が確認できて便利だと思います。

カメラアクセサリを作る

このようにHASは、アクセサリ動作の確認や、HomeKitソフトウェアのデバッグなどに便利なツールです。それ以外にも色々遊べるツールでした。

例えば、HASでカメラアクセサリを作ると、Macのカメラや、USB接続webカメラが取得する映像を、別のiPhone/Macのホームで見られるようになります。さらに、音声も送受信できます。Macをサーバとして稼働させる場合に、USBにwebカメラを接続しておけば、遠隔地からサーバ周辺の様子を確認できます。

カメラアクセサリをシミュレートする場合も、上の例と同様に、アクセサリの追加を選びます。ダイアログパネルの一番下にある「IP Camera」ボタンを押します。名前はCameraにしておきました。Finishボタンを押すとすぐにカメラアクセサリとして動作開始します。

カメラアクセサリを使う

先の電球の例と同様に、iPhoneのホームから「アクセサリを追加」を選択し、HASに表示されたQRコードを読み取ります。すると、ホーム画面にカメラが追加されました。Mac内蔵のカメラが撮影している映像が表示されます。ホームを開いている間は、この映像が10数秒ごとに更新されます。映像の左下に表示される秒数(10秒と表示されてます)は、前回の映像更新から経過した時間です。

カメラ画像の場所をクリックすると、ライブ画像になります。HASが動いているMacのマイクロフォンに接続して、音声を聞くことができます。また「通話」ボタンを押すと、iPhone側からの音声をMacのスピーカーで出すことができます。

今回はMacBookの内蔵カメラでテストしましたが、一般的なUSB接続webカメラでも動作を確認しました。

また、古いバージョンのmacOSや、古いMac miniでもHASは動作しました。中古の安いMac miniをサーバにして、USBカメラをつければ、ビデオドアベルのようなアクセサリが簡単に作れそうです。こちらでやったようなことが簡単にできてしまいました。

diysmarthome.hatenablog.com

まとめ

無償の開発者向けツール、HomeKit Accessory Simulatorを使ってみました。各種アクセサリの動作確認や、HomeKitプログラムのデバッグに役立つツールです。これを使って遠隔地のMacに接続したカメラ、マイク、スピーカにアクセスすることもできます。

TuyaのZigbee磁気接触センサ(1200円くらい)

以前、格安のWiFi接触センサを紹介しました。

diysmarthome.hatenablog.com

今度はZigbee版です。WiFiに比べるとそこそこ高いです。こちらの商品です。買った時は送料込み1200円くらいでした。今は1300円くらいでしょうか。たくさん買うと安くなり、8個で単価900円くらいです。このセンサはZigbee2MQTTでサポートされているので、Homebridge経由でHomeKitから使用できます。

www.zigbee2mqtt.io

開封して中身を見る

外箱はこんな感じでした。Smart Life(家のアイコン), Tuya smart(tの文字), Zigbeeのロゴが入ってます。ただ、製造している会社の名前はありません。Tuyaのエコシステムで動くけど、Tuyaが製造している様子ではないみたいです。

開けると本体とマグネットが入っています。WiFiの磁気接触センサと比べるとかなり小型です。あちらは単3電池が2本でしたが、こちらはCR2032のボタン電池が1個です。

分解すると、中にはZTUと書かれた無線ユニットが入ってました。写真下端の黒い部分が磁気接触スイッチです。これは単純なリードスイッチが使われているようです。改造が楽そうです。

無線ユニットのことを調べてみたところ、Tuyaが開発しているZigbee対応のワンチップコンピュータでした。

developer.tuya.com

他にもいろいろなバリエーションのチップを開発しているようです。メーカは、このチップを仕入れてくれば、簡単にIoTデバイスを商品化できるようです。部品としてTuyaから買ってきて、組み込むだけで、自社製品が作れるようです。クラウドやアプリの開発、サポート、カスタマーサービスは全部Tuyaがやってくれる仕組みです。これがTuyaの強みなのかなと思いました。

アプリは使わない

WiFiセンサの時はWiFiの設定をするためにTuyaのスマホアプリを使用しました。今回は使用しません。それ以前に、Tuya SmartやSmart Lifeアプリを使うためには、TuyaのZigbee-LANブリッジが必要です。今回は、Zigbee2MQTTに接続するので、アプリもブリッジも使用しません。

ペアリングする

こちらで設定したZigbee2MQTTにペアリングします。

diysmarthome.hatenablog.com

設定の時に、webインタフェースをonにしてあったので、webブラウザで操作できます。ペアリングはoffに設定してありましたので、webページ右上のボタンをクリックして一時的にペアリングonにします。一回クリックすると5分間ペアリング可能状態になります。

接触センサの方をペアリングモードにするためには、付属のピンなどでリセット穴の中のスイッチを長押しします。マニュアルには6秒長押しすると書いてありましたが、実際には4秒くらいでリセットモードになりました。するとまもなくペアリングが完了して動作開始しました。Ziegbee2MQTTのwebページでは以下のように見えます。

Homebridgeにはz2mプラグインが入っているので、iPhoneMacのホームに、以下のように現れました。(名前は変更しました)

     

WiFi接触センサに比べて応答速度は速いです。HomeKitのオートメーションを作って、磁石の接触NanoleafのThread電球をon/offさせてみました。開放も閉鎖も一瞬で応答します。ストップウォッチも間に合いません。0.5秒未満くらいの感じです。ただ、開放から閉鎖の時は、10回に1回くらい、応答が3秒くらい待たされることもありました。でもWiFiのセンサが30秒くらいかかったのに比べると早いです。

まとめ

TuyaのZigbee接続接触センサをHomeKitから使いました。磁石と併用して、ドアや窓の開閉を検出するスイッチです。以前使ったWiFiのセンサに比べて3倍くらい高価ですが、サイズは小さく応答速度が早かったです。HomeKitで使える磁気接触センサは数種類あるようですが(Thread接続やBLE接続のようです)、国内で販売されている製品は皆無です。早くMatter over Threadが一般的になって、こういう基本的なセンサ・スイッチが誰にでも使えるようになると良いと思います。

HomeKitでZigbeeを使う:Zigbee2MQTTを導入する

Zigbeeバイスは省電力でメッシュも構成するし応答も早くて、スマートホームに欠かせません。AmazonやAliExpressでは、お値打ちなZigbeeバイスが豊富に揃ってます。今回は、Zigbee機器をHomeKitから使えるようにするため、Zigbee2MQTTなどをインストールして設定しました。

ZigbeeバイスをHomeKitで使う2通りの方法

国内で簡単に入手できて、HomeKitでも使えるZigbee製品として、Philips HueまたはIKEAの製品があります。

Zigbee接続デバイスをLAN側から使う第一の方法は、それぞれの会社が提供するハブを買うことです。Zigbeeハブは、Zigbee無線ネットワークとLANを接続します。さらに、HomeKitに対応したIKEA/Philipsのハブには、ZigbeeバイスをHAP対応デバイスに見せてくれるブリッジ機能が備わってます。これによりHomeKitからZigbeeバイスが使えるようになります。こんな順番の接続です。

[HueとIkeaのデバイス]---[HueとIkeaのハブ]--(HAP)--[HomeKit]

2番目の方法は、メーカが提供しているハブを利用せずに、Zigbee2MQTTとHomebridgeを使う方法です。

[Zigbee]---[Zigbee2MQTT]--[Homebridgeなど]--(HAP)--[HomeKit]

ただ、ZigbeeバイスをHomebridgeで使うためには、プラグインに加えてハードウェア、ソフトウェアが必要です。Zigbeeの側から情報の流れに従って書くと、以下のユニットが必要です。

  1. USB送受信器:Zigbeeバイスと無線送受信するUSBアダプター
  2. Zigbee2MQTT:Zigbeeバイスと通信してMQTTブローカに伝えるデーモン
  3. Mosquitto:MQTTブローカーです
  4. Homebridgeとプラグイン:MQTT経由でZigbee2MQTTとやりとりするプラグイン

1, 2, 3までのユニットは、Home AssistantでZigbeeバイスを制御する場合にも使われるものです。また、2, 3, 4の部分は、WindowsmacOSNASなどでも動かせますが、通常はLinux系のサーバーで動かします。処理能力も要求されないので、Raspberry Piがよく使われます。

下の図に、必要なユニットを信号の流れる順番に示しました。左端のZigbee機器(たとえば電球)を右端のHomeKitに接続するためには、いろいろ用意する必要があります。

このうち、HomebridgeとMosquittoについては、以前の記事で詳しく説明してあります。

diysmarthome.hatenablog.com

diysmarthome.hatenablog.com

これらがすでに設定されている前提で、USBトランシーバ、Zigbee2MQTT、Homebridgeプラグインを追加する方法を説明します。なお、Zigbee2MQTTに関しては、プロジェクトのホームページに詳細な情報があります。これを参考にしました。

www.zigbee2mqtt.io

Zigbee2MQTTを使う理由

上で述べたように、メーカーが用意してくれるハブを買えば、ZigbeeバイスをHomeKitから使えます。しかし、Zigbee2MQTTを使えば、使えるZigbeeバイスが圧倒的に増えます。メーカーハブを買ってくるだけの方法に比べて、いろいろ揃えてインストールする手間は面倒ですが、その価値はあります。

Zigbeeは、情報のやり取りは決まってますが、上位のプロトコルまでは統一されていないようです。なので、たとえば同じ電球でも各社で互換性がありません。メーカのハブは、基本的に自社製品しかサポートしていないので、メーカーごとにハブを用意する必要があります。それに国内で買えるHomeKit対応Zigbeeハブは、IKEAのTRÅDFRIゲートウェイPhilips Hueブリッジだけです。

それに対して、Zigbee2MQTTのコミュニティでは、自分たちが入手したZigbee製品のデータを持ち寄って、対応デバイスを増やし続けています。なので、ある程度知られたデバイスなら、ほぼ使用可能です。もちろんIKEAPhilipsZigbee製品も使えます。またIKEAの場合、Zigbeeスイッチや人感センサは電球とペアリングして使うことになっていて、スイッチ・センサの情報をHomeKit側には公開していません。でもZigbee2MQTTを使えばこれらもHomeKit側から利用可能になります。

Zigbee2MQTTの対応デバイスこちらから確認できます

USBトランシーバ

WiFi, BLEはどのスマホにもノートPCにも搭載されていますが、Zigbeeは搭載されてません。なので、Zigbee電波を送受信するアダプターが必要です。ただそのアダプタも、WiFiやBLEのように豊富には出回ってません。

Zigbee2MQTTで使えるおすすめアダプターはこちらで紹介されてます。それによるとTexas Instruments社のCC2652というチップを使用した製品が推奨されてます。実際に購入して、Raspberry PiUbuntuマシンのUSBポートに挿すだけで、Zigbee2MQTTで使えた製品を2種類ご紹介します。

一つは、こちらの製品です。CC2652Pの方を買いましたが、CC2652Rでも動くのではと思います。検索してみたらPとRの違いはGPIOの数が違うくらいのようです。Zigbee2MQTT対応と書かれてます。

もう一つは、こちらのSonoffの製品です。上の製品よりも造りがしっかりしていて、価格も安くおすすめです。

ただし、Sonoff社には、別のSilicon Labs社チップを使った新製品があり、名前が紛らわしくて注意が必要です。失敗談はこちらをご覧ください。

diysmarthome.hatenablog.com

ちなみにSonoffのアダプタはAmazonでも売っているようですが、価格が高いです。

これらのUSBトランシーバを、Raspberry PiLinuxマシンのUSBポートに差し込むと認識されます。手元のRaspberry Pi 4でlsusbコマンドを発行すると、こんなふうに見えました。

$ lsusb
Bus 001 Device 003: ID 1a86:7523 QinHeng Electronics CH340 serial converter

シリアル変換のチップが入っているのでそれが認識されてます。シリアルチップは、特別にドライバをインストールしなくても、そのまま/dev/tty*に見えました。

$ ls /dev/tty*
/dev/tty    /dev/tty0  /dev/tty1  (略)  /dev/ttyUSB0

今まで使ったところでは、/dev/ttyUSB0もしくは/dev/ttyACM0という名前で現れることが多いです。macOSでもこの名前で現れました。USBトランシーバーを抜き差しすると、消えたり出現したりしますので、その挙動でも確認できます。この名前はZigbee2MQTTの設定で必要なので、メモしておきます。

Mosquittoのインストール

Zigbee2MQTTにはMQTTブローカーが必須なので、簡単に説明しておきます。こちらに書いた手順で、MQTTブローカであるMosquittoをインストールします。

diysmarthome.hatenablog.com

基本的には、aptコマンドでインストールするだけです。

sudo apt install mosquitto mosquitto-clients

また、OS起動時に自動的にMQTTブローカが立ち上がるように以下の設定をしました。

sudo systemctl enable mosquitto.service

Zigbee2MQTTをインストール

ではいよいよ、Zigbee2MQTTを公式ページの手順に従ってインストールします。色々なハードウェアにインストール可能ですが、Raspberry PiLinuxマシンにインストールするには、以下の公式ページのガイドが参考になります。

www.zigbee2mqtt.io

それによると、

# nodejsなどをインストールします。すでに入っているかもしれません。
# 公式ガイドのページではapt-getを使ってますが、aptに統一したいと思っているのでaptでインストールしました

sudo curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt install -y nodejs git make g++ gcc

# nodeとnpmのバージョンを確認します
node --version  # Should output v14.X, V16.x, V17.x or V18.X
npm --version  # Should output 6.X, 7.X or 8.X

# zigbee2mqtt用のディレクトリを作ります
sudo mkdir /opt/zigbee2mqtt
sudo chown -R ${USER}: /opt/zigbee2mqtt

# Zigbee2MQTT リポジトリをクローンします(よくわかってないです)
git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt

# ディペンデンシーをインストールします(同上)
# ユーザを"pi"にしてますが、いつもログインするユーザが良いです
cd /opt/zigbee2mqtt
npm ci

これでエラーらしい表示が出なければokです。

次に設定ファイルを用意します。/opt/zigbee2mqtt/data/configuration.yamlにあるテキストファイルです。公式ページの設定例は以下です。

# MQTTの設定
mqtt:
  # MQTT base topic、なんでも良いです
  base_topic: zigbee2mqtt
  # MQTT server URL、ブローカーのアドレスです
  server: 'mqtt://localhost'
  # MQTT のユーザ、パスワードを設定している場合は以下を記入
  # user: my_user
  # password: my_password

# Serial の設定
serial:
  # USBトランシーバの接続場所です。今までの経験ではttyUSB0かttyACM0です。
  port: /dev/ttyUSB0
  # 以下の設定はおすすめらしいです
  advanced:
    network_key: GENERATE
  # 以下を指定しておくとwebから操作できます。とても簡単なのでお勧めです
  frontend: true

Zigbee2MQTTを起動する

起動させるには、

cd /opt/zigbee2mqtt
npm start

とします。いろいろメッセージが出ますが、エラーらしきものが出なければ成功です。止めるにはコントロールCを押します。

このコマンドで起動すると、自動起動などが面倒なので、systemctlを使います。まずは、/etc/systemd/system/zigbee2mqtt.serviceというファイルを作って、内容を、

[Unit]
Description=zigbee2mqtt
After=network.target

[Service]
ExecStart=/usr/bin/npm start
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=null
StandardError=inherit
Restart=always
RestartSec=10s
User=pi

[Install]
WantedBy=multi-user.target

とします。ユーザ名piで起動することになってますので、別の名前を使う場合は書き換えます。これで、

sudo systemctl enable zigbee2mqtt.service

とすれば、以後、自動的に起動します。とりあえず起動しておきたいので、

sudo systemctl start zigbee2mqtt.service

としておきます。startの代わりに、stop, restart, statusなどのコマンドが使えます。

プラグインを入れる

ここまでの作業で、

のほとんどが用意できました。Zigbee2MQTTは結果をMosquittoにパブリッシュしますので、HomebridgeはMosquittoとやりとりします。Mosquittoとのやりとりには、以前こちら

diysmarthome.hatenablog.com

で紹介したMqttthingを使うことも可能です。ただ、Zigbee2MQTTが出すMQTTメッセージに特化したプラグインがあるので、それを使ったほうが楽です。Homebridge z2mというプラグインで、Mqttthingを元に、Zigbee2MQTT向けに機能拡張されたプラグインだそうです。

z2m.dev

このプラグインの設定項目はほとんどありません。上で設定したMQTTブローカーのアドレスやbase topicなどを設定するだけです。他は全部未設定でokです。あとはZigbee2MQTTが検出したデバイスが自動的にHomeKitアクセサリとして現れるようになります。

以前に紹介したZigbeeバイスに関しては以下をご覧ください。いずれも今回の設定で、HomeKitから動かしています。

diysmarthome.hatenablog.com

diysmarthome.hatenablog.com

diysmarthome.hatenablog.com

diysmarthome.hatenablog.com

MQTTで設定する

Zigbee2MQTTは、MQTT経由で、いろいろな機能を提供しています。たとえば動作のすべての情報が、MQTTに流されているので、これをmosquitto_subコマンドでサブスクライブすれば確認できます。

mosquitto_sub -h localhost -t zigbee2mqtt/# -v

これにより、Zigbeeバイスをペアリングする場合、Zigbeeスイッチをon/offする場合など、その都度メッセージが表示されるので、動作確認ができます。

Zigbee2MQTTに対する命令も、mosquitto_pubで指示できます。たとえば、とあるidのZigbeeバイスのペアリングを外したい場合は、以下のようにします。

mosquitto_pub -h localhost -t zigbee2mqtt/bridge/request/device/remove -m '{"id":"0x9999999999999999"}'

ただ、次に説明するwebインタフェースの方が簡単です。MQTT経由での確認や操作は、あまり必要ないかもしれません。

Webで設定する

先のconfiguration.yamlファイルでfrontend: trueと設定しました。この設定により、webからの操作が可能になってます。デフォルトではポートが8080です。Webブラウザから、Zigbee2MQTTが稼働しているIPアドレスを指定して、http://192.168.xxx.xxx:8080/でアクセスします。するとZigbee2MQTTの動作確認、操作のためのページが以下のように表示されます。

いろいろな機能がありますが、GUIなので、操作を試して理解できます。

たとえば、上で、MQTT経由で試みたデバイス削除操作は、この画面のゴミ箱ボタンから可能です。ゴミ箱ボタンを押すと、下のようなダイアログパネルが出ます。

オプションのスイッチ、Force removeとBlock from joining againは重要です。まず、Zigbee2MQTTでのデバイス削除操作は、デフォルトでは、デバイスが接続している時のみ可能です。接続していないデバイスも、強制的にペアリング解消するスイッチがForce removeです。Force removeしても、またそのデバイスからの電波が届くと、通常はペアリング再開します。それも阻止するのがBlock from joining againボタンです。これらのスイッチを使ってペアリング解除したデバイスは、デバイスをリセットする操作(ボタンを長押しするとか、何回かon/offを繰り返すなど)をして、ペアリングモードに戻してから、他のシステムで再利用することになります。

また、右上のPermit join (All)のメニューは、ペアリングを開始するメニューです。先のconfiguration.yamlで、permit_join: trueという指定をすると、Zigbee2MQTTが常時ペアリングする設定になります。デフォルトではpermit_join: falseで、ペアリングしません。それを一時的にペアリング可能状態にするのがこのメニューです。クリックすると5分間有効になります。その状態で、ペアリングモードにしたデバイスを近づければ、ペアリングされます。 

Dashboardメニューを選べば、それぞれのデバイスの状態を見て、操作が可能です。

また、Mapメニューを使うとデバイスの接続状態を見ることができます。

この例では、デバイスが少なく、end deviceしかありません。routerになるデバイスがあるとZigbeeのメッシュ接続の様子がわかって面白いです。電球などの消費電力に制約のないデバイスが電波を中継するルータになってくれます。

Zigbee2MQTTを更新する

対応するZigbee製品は増え続けているので、時々アップデートしたいところです。手順は公式ページのここに書いてあります。

# Zigbee2MQTTを停止する
sudo systemctl stop zigbee2mqtt
cd /opt/zigbee2mqtt

# 設定情報をバックアップする
cp -R data data-backup

# 更新する
git pull
npm ci

# 設定情報を復帰する
cp -R data-backup/* data
rm -rf data-backup

# Zigbee2MQTTを始動する
sudo systemctl start zigbee2mqtt

data以下をバックアップしておけば、ペアリング情報や設定状態は保存しておけるようです。

まとめ

Zigbee2MQTTを使って、市販のZigbeeバイスをHomeKitから使うための設定手順をまとめました。これで、市販されている大半のZigbee対応製品を、HomeKitから使用できるようになります。

Zigbeeは、WiFiと比較すると省電力にもかかわらず、メッシュネットワークを構成するので、広い範囲をカバーできます。BLEも似た特徴を持ちますが、安定性や応答速度などでZigbeeの方が優れているような印象があります。これからはZigbeeはThreadに移行していくらしいですが、物理層データリンク層Zigbeeと共通なので、低電力で応答の良いという特長は引き継がれると思います。

Nature RemoをHomebridge / HomeKitから使う

ネットから操作できる赤外線リモコンNature RemoをHomeKitから使えるように設定します。クラウド経由の設定と、ローカルAPIを使った設定の2種類の方法があります。

Nature Remo製品案内

Natureは日本(横浜市)の会社で、ネットからコントロールする赤外線リモコンユニットNature Remoを作ってます。いくつか製品がありますが、Nature Remo mini 2が一番安価で良いかと思います。

類似のネット接続リモコンはこの他にも多数出回ってます。Tuyaのソフトで動く廉価な製品もあります。

diysmarthome.hatenablog.com

これに比べるとNature Remoは高価ですが、日本の製品にきめ細かに対応しているとのことです。今回試したところでは、Tuyaの格安リモコンでも家のエアコンは操作できました。でも、場合によってはNature Remoじゃないと操作できないこともあるらしいです。また、Nature Remo mini 2には温度センサがついていますが、格安リモコンにはついていません。

赤外線制御の照明器具は絶滅危惧

今回、HomeKitから操作できるようにした器具は、シーリングライト(天井照明)とエアコンです。天井照明は、Amazonで売っている格安のLEDシーリングライトです。赤外線リモコンを使用する製品です。

確認したところ、今回使用した照明器具は、もはや販売されてませんでした。他に赤外線を使用しているらしい製品は、たとえばこんな製品です。

     

最近の照明器具では、赤外線リモコンがBLEに置き換わりつつあるようです。 BLEにしておけば、スマホからの操作が可能になり、スマホ用のリモコンアプリも簡単に提供できます。

Nature Remoは赤外線を送出する製品なので、電波を使うBLEリモコンは使用できません。なので、赤外線リモコンを使用する製品を選ぶ必要があります。困ったことにほとんどの販売ページでは、リモコンが赤外線式なのかBLE方式なのか記載がありません。リモコンにLEDらしきものが付いていても、それは動作確認用のLEDで、実際の通信はBLEという場合もあります。注意が必要です。

ちなみに、上位機種のNature Remo 3はBLEにも対応しているらしいです。ただし赤外線学習リモコンのようにどんなBLE製品でも登録できるわけではなく、対応している少数の製品だけが対象です。BLEで接続できても、上位のプロトコルが各社でバラバラなのですね。近い将来には、Matter + Threadで統一されていくのかと思います。

スマホアプリでリモコンを登録

HomeKitの設定をする前に、まずは、Nature Remoを通常通り設定します。スマホアプリ、Nature Remoをダウンロードして、手持ちの赤外線リモコンを登録します。今回は、以下の2個のリモコンを登録しました。

  • 天井照明リモコンのon/offボタン
  • エアコン

天井照明は、照明器具付属のリモコンをNature Remoに向けて、on/offボタンを学習させました。エアコンは、アプリの指示に従って赤外線リモコンを操作すると、メーカを自動検出してくれました。これで問題なく登録できました。

バイス登録の結果、Nature Remoアプリの画面は以下のようになりました。照明ボタンをタップすると、シーリングライトがon/offを繰り返します。エアコンをタップすると、on/off、動作切り替え、温度設定、風量調整、風向調整が可能になります。

クラウドの役割

Nature Remoの機能は、ほぼクラウドが担当してます。Nature Remoは、クラウドから送られたパターンの赤外線信号を送出していると思われます。エアコンを赤外リモコンで操作する場合は、登録したメーカに合わせて、温度、風量、風向などを総合した長い赤外線信号を組み立てる必要があります。おそらくそれはクラウドが全てやってくれて、最終的に発信すべき赤外線信号がNature Remoに伝えられるのだと想像してます。

Amazon AlexaGoogleのスマートスピーカとの連携もクラウドが担当しているようです。HomeKitは、基本的にクラウドに依存しないプロトコル(HAP)なので、連携が難しいのかサポートされてません。NatureのiPhoneアプリはショートカット対応しているので、Siriからショートカット経由でコントロールすることは可能です。HomeKitで使えないのは残念です。

Cloudからトークンを取得する

そこでHomebridgeの出番です。HAPで受け取った指示に従って、Natureのクラウドにアクセスするプラグインを用意すれば、HomeKitからNature Remoをコントロールできます。

そのためにはまずNatureクラウドへアクセスするためのトークンを入手します。Tuyaのリモコンで行ったように、Natureの特別なページにアクセスします。そこでトークンを生成してもらいます。アクセスするページは以下です。

home.nature.global

このページのLoginボタンを押して、

スマホアプリに登録したメールアドレスを入力すると、メールが来ます。

メールに書かれたアドレスにアクセスし、「許可する」ボタンを押します。

そうすると、アクセストークンを新たに作成したり、消去したりできるページが現れます。生成したアクセストークンは二度と表示されないので、必ずコピーしておきます。

使わなくなったトークンはRevokeボタンを押して消すこともできます。以下のサンプルではこの長いトークンを$TOKENとして表記します。あとはNature社のwebサーバにアクセスすることで、必要なすべての処理が可能です。まずは登録情報を確認します。以下の長いcurlコマンドを発行します。

% curl -H "Authorization: Bearer $TOKEN" -H "accept: application/json" "https://api.nature.global/1/appliances"

すると長いjson形式のテキストが返ってきます。このままでは読みにくいので、jqコマンドに渡して、さらにlessして表示を止めておきます。jqコマンドは、ベタ書きされたjsonテキストを、見やすくフォーマットして表示します。macOSには入っていないのでbrewコマンドなどでインストールします。Raspberry Piには入ってました。何かと一緒にいれたのかもしれません。

% curl -H "Authorization: Bearer $TOKEN" -H "accept: application/json" "https://api.nature.global/1/appliances" | jq | less

Cloudに信号IDを送る

上のcurlコマンドで得た情報の中から、照明のボタンに割り当てた信号のIDを探します。器具の名前を「照明」として、照明のアイコンをつけて、ボタンには「オン」という名前がついてました。それらしきところを見ると、「オン」のボタンに割り当てられたIDがわかります。下のxxxxで書いた部分です。

    "model": null,
    "type": "IR",
    "nickname": "照明",
    "image": "ico_light",
    "settings": null,
    "aircon": null,
    "signals": [
      {
        "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "name": "オン",
        "image": "ico_on"
      }
    ]

このIDを利用して、curlコマンドでクラウドに依頼して、Nature Remoから赤外線信号を送出させることができます。

% curl -H "accept: application/json" -H "Authorization: Bearer $TOKEN" -X POST "https://api.nature.global/1/signals/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/send"

これでシーリングライトがon/offします。

CloudからデバイスIDを得る

上のスマホ画面スクショで示したように、現在「Myhouse Office」という場所に照明とエアコンの2個のデバイスを登録しています。先のcurlコマンドで得たjson情報の最上位の部分を見ると、登録されたデバイスが要素になった配列になっています。

[ {照明の情報}, {エアコンの情報} ]

それぞれの情報の部分にidという変数名があります。エアコンのidは、エアコン情報が書かれた部分の最初の方に見つかります。

  {
    "id": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy",
    "device": {
      "name": "Myhouse Office",

このidは、次のセクションで、Homebridgeを使用するために必要になります。

照明をHomebridgeに追加する

まずは「照明」をHomeKitに追加します。Homebridgeのプラグインのタブで、natureという名前で検索すると、Nature Remo用のプラグインが多数表示されます。現時点で24個ありました。日本の製品なので日本の方が作ってくれているプラグインがほとんどです。皆さんに感謝です。

「照明」を使用するために、この中からhomebridge-nature-airconを使わせていただくことにしました。

github.com

他にも、シーリングライトのためのプラグインが多数あります。シーリングライトによっては、リモコンボタンを押すと明るい点灯-->暗い点灯-->消灯と変化するものもあります。その場合、消灯-->明るい点灯には1回押し、明るい点灯-->消灯には2回押しする必要があります。その回数を設定できるプラグインもありました。また点灯・消灯をNature Remo 3の照度センサで判定するプラグインもあります。今回のプラグインは、一番シンプルなものです。

インストールするとaccessoryとnameの設定項目だけ追加されますので、これに、access_tokenとsignal_IDの項目を追加して設定します。access_tokenは、上記で調べた$TOKENの値です。signal_IDも、上で調べたxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxの値です。

設定を保存して、Homebridgeを再起動するとiPhone, Macのホームに照明が現れます。

   

クリックするとシーリングライトがon/offします。ただ、on/off状態を把握できていないので、逆の動作になっている場合もあります。そのような場合は、リモコンから一回on/offすれば同期します。もちろん、またズレるかもしれません。

エアコンをHomeKitに追加する

今度はエアコンを追加します。Homebridgeのプラグインの中から、homebridge-nature-airconを使わせていただくことにしました。

www.npmjs.com

ここまで準備が終わっていれば、プラグインの設定は簡単です。accessTokenの場所に、上で説明した$TOKENの文字列を書き、airconIDの場所に、これも先ほど入手したid(yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyyの部分)を書きます。

これを保存し、Homebridgeを再起動すれば、iPhoneMacのホームにエアコンが現れます。

これをクリックするとon/offします。詳細を開ければ、運転切り替え、温度設定が可能です。Nature Remoには温度センサが搭載されているので、現在の室温も表示されます。

ローカルAPIを使う

ここまではNatureのクラウドを利用していました。NatureはNature RemoのローカルAPIを公開しています。ローカルAPIを利用すれば、LAN内からNature Remoにhttpで接続して操作可能です。インターネット上のクラウドを使用しないので、Natureのサイトが止まってもリモコンを動かすことができます。応答速度も速いはずです。公式の案内ページは以下です。

local-swagger.nature.global

これによると、Bonjourの仕組みを使ってIPアドレスを取得できるようです。まずはdns-sd -BコマンドでInstance Nameを取得します。次にその名前を使ってdns-sd -Gコマンドで数値のIPアドレスを取得します。以下の太字の部分が入力するコマンドです。

% dns-sd -B _remo._tcp
Browsing for _remo._tcp
DATE: ---Fri 28 Oct 2022---
20:15:44.225  ...STARTING...
Timestamp     A/R    Flags  if Domain           Service Type         Instance Name
20:15:45.450  Add        3   4 local.           _remo._tcp.          Remo-XXXXXX
^C
% dns-sd -G v4 Remo-XXXXXX.local
DATE: ---Fri 28 Oct 2022---
20:16:13.033  ...STARTING...
Timestamp     A/R  Flags         IF  Hostname               Address                 TTL
20:16:13.034  Add  40000003       4  Remo-XXXXXX.local.     192.168.xxx.xxx         120
^C

これで、アドレス名がRemo-XXXXXX.localで、数字のIPアドレスは192.168.xxx.xxxであることがわかりました。このアドレスに、赤外線の信号パターンを送れば、それを発信してくれます。問題は、信号パターンをどうやって知るかです。

方法の一つが、Nature Remoの学習リモコン機能を使う方法です。まずは、赤外線リモコンをNature Remoに向けて学習させます。ここでは、シーリングライトのリモコンをNature Remoに向けて、そのon/offボタンを押しました。学習完了するとNature Remoの青いリングが点滅します。その直後に、ターミナルから以下のコマンドを発行します(太字部分です)。その結果、赤外線パターンを示す情報が得られます。

% curl http://Remo-XXXXXX.local/messages -H "X-Requested-With: local" 
{"format":"us","freq":40,"data":[6830,4629,283,573,283,1409,286,569,286,1426,259,573,291,1399,259,597,283,1409,258,597,285,1408,282,573,281,579,285,1401,280,1407,283,1405,281,1409,310]}

アドレス部分には文字の名前を使いましたが、数字のアドレスでもokです。文字の名前は応答が悪いことがありました。数字のアドレスの方が確実です。

リモコンのデータが判明したので、次にこれを送信してみます。以下のコマンドです。

% curl -XPOST http://Remo-XXXXXX.local/messages -H "X-Requested-With: local" -d '{"format":"us","freq":40,"data":[6830,4629,283,573,283,1409,286,569,286,1426,259,573,291,1399,259,597,283,1409,258,597,285,1408,282,573,281,579,285,1401,280,1407,283,1405,281,1409,310]}'

この結果、点灯しているシーリングライトが消灯します。もう一度発行すれば点灯します。

リモコンコードを解析する

リモコンコードを解析してみました。ただ、これは手元のシーリングライトのリモコンのコードなので、他の方には何の参考にもならないです。

数字の配列部分は、おそらくは信号パターンの1, 0の持続時間を列挙していると思われます。データの部分を、試しに280の倍数にして、以下のようにしてみたのですが、同様に動作しました。

% curl -XPOST http://Remo-XXXXXX.local/messages -H "X-Requested-With: local" -d '{"format":"us","freq":40,"data":[7000,4760,280,560,280,1400,280,560,280,1400,280,560,280,1400,280,560,280,1400,280,560,280,1400,280,560,280,560,280,1400,280,1400,280,1400,280,1400,280]}' 

280,560が0で、280,1400が1の位相変調だと考えると、0101010101001111というビット列にも見えます。ちょうど16ビットなので正しそうです。ちなみに、リモコンにはCH1とCH2というボタンがあって長押しするとチャンネルが切り替わるのですが、現在はCH2でした。CH1に切り替えると、on/offボタンのビット列が1010101010011111となりました。チャンネルを切り替えると、時系列で最初の8ビットが全部反転するようです。

リモコンには他に、常夜灯、明るく、暗くというボタンがあるのですが、それぞれの後半8ビットのビット列は、11011111, 01100111, 11001101でした。

まとめると、ビット列がMSBから流されるとして、16進数で表した場合

  • 0xAA4F: CH1のon/off
  • 0xAADF: CH1の常夜灯
  • 0xAA67: CH1の「明るく」
  • 0xAACD: CH1の「暗く」
  • 0x554F: CH2のon/off
  • 0x55DF: CH2の常夜灯
  • 0x5567: CH2の「明るく」
  • 0x55CD: CH2の「暗く」

でした。

ローカルAPIをHomeKitで使う

次にローカルAPIをHomeKitから使えるように設定します。ローカルAPIを使うプラグインがあったのでそちらを使ってみました。このプラグインです。

www.npmjs.com

でも、[NatureRemo] No Nature Remo device foundというエラーメッセージが出てしまいました。Bonjourに失敗しているのかもしれません。

HomeKitのプラグインにはシェルコマンドを実行するプラグインもあります。次善の策としてそれを利用して、上記のcurlコマンドを実行すれば良いと考えました。homebridge-shell-switchという名前のプラグインです。

github.com

インストールして、configの部分に以下のように設定しました。

{
    "accessory": "ShellSwitch",
    "name": "ShellSwitch",
    "onCmd": "myswitch.sh",
    "offCmd": "myswitch.sh",
    "stateful": true
}

onCmdとoffCmdには、onとoffを行うときに実行すべきシェルコマンドを書きます。トグルスイッチなので同じmyswitch.shというシェルスクリプを名を書きました。ここにcurlコマンドを直接書いても良いかと思いましたが、うまく実行できませんでした。シェルの実行環境などの関係かと思います。引用記号を逆スラッシュで無効にすることに失敗しているのかもしれません。そこで、以下のようなシェルスクリプトを書いて、これを/usr/local/bin/myswitch.shにおきました。それをconfigに書いたonCmdとoffCmdで実行します。

#!/bin/sh
curl -XPOST http://192.168.xxx.xxx/messages -H "X-Requested-With: local" -d '{"format":"us","freq":40,"data":[7000,4760,280,560,280,1400,280,560,280,1400,280,560,280,1400,280,560,280,1400,280,560,280,1400,280,560,280,560,280,1400,280,1400,280,1400,280,1400,280]}'

 Homebridgeを再起動すると、PhoneとMacのホームに以下のように現れます。

   

(追記) ローカルAPIを使う他のプラグイン

追記です。上で紹介したhomebridge-nature-remo-localがうまく動かなかったと書きました。デバイスが発見できなかったようです。探したところ、IPアドレスを直接各方式の、ローカルAPI対応プラグインがありました。こちらです。

github.com

これも日本の方が作ってくれているようで、gitの説明も日本語です。複数の機器のコントロールマルチタスクで行うような機能もあるようです。一番シンプルに使うなら、

{
  "accessory": "remo",
"name": "Light", "host": "192.168.xxx.xxx", "command": { "power": { "format": "us", "freq": 40, "data": [7000,4760,280,560,280,1400,280,560,280,1400,280,560, 280,1400,280,560,280,1400,280,560,280,1400,280,560,280,560,280,1400,280,1400,280,1400,280,1400,280] } }, "on": [ "power" ], "off": [ "power" ] }

のような設定で良いようでした。

クラウドとローカル

これでローカルAPIを使ってシーリングライトをon/offできます。クラウドを使用しないので、クラウドやネットワークが不調でも動作しますし、応答速度も高速なはずです。また、クラウド仕様には、5分間に30回までの制限があります。デバッグなどで何度も使っていると、しばらく応答しなくなってしまいます。ローカルで使用する場合は、この制約は無関係です。

ただ、ローカルAPIを使用するためには、上記のように赤外線信号タイミングを用意する必要があります。エアコンのように、設定温度や風量・風向なども含めてコマンドが複雑になる場合は簡単ではありません。複雑な赤外線タイミングが必要な操作はクラウドの任せるのが良いと思います。ローカルAPIは、シンプルなリモコン操作に適していると思います。

リモコンの限界

赤外線リモコンはコマンドを送出しているだけで、機器の状態を把握できていません。なので、HomeKit側では、赤外線信号が正しく受信されたと仮定して、現在の状態を推定することしかできません。なので、他のリモコンで操作されたり、シーリングライトのように壁スイッチで操作されると、実際の状態と乖離してしまいます。エアコンリモコンのコマンドに、設定温度・風量・風向などの情報が全て含まれているのも、リモコン上の表示を実際エアコンの状態にできる限り合わせたいためです。

さらには、今回使用したシーリングライトのリモコンのように、on/offがトグルで動作するタイプもあります。この場合は、ライトが点灯しているか、消灯しているかを推定することもできません。

HomeKitが正しく状態把握するためには、機器と双方向に通信して、現在の状態を問い合わせできる仕組みが理想です。その点で赤外線リモコンは不完全です。エアコンならば、WiFiで通信するような仕組みを利用したいところです。シーリングライトは、壁スイッチをスマートスイッチにして、人手による壁スイッチ操作もシステムで把握できるようにするのが良いです。壁スイッチを自動化する記事はこちらをご覧ください。

diysmarthome.hatenablog.com

まとめ

Nature RemoをHomeKitで使う方法を説明しました。Natureのクラウドを使う方法と、ローカルAPIを使う方法があります。クラウドを使う場合は、NatureのサーバからトークンやID情報を入手して設定します。ローカルAPIを使う場合は、赤外線パターンを学習昨日により取得し、Nature Remoにhttp送信します。赤外線リモコンを使えば機器の操作が容易ですが、実際の状態を把握できない欠点もあります。

追記

この後、スマート赤外線リモコンをDIYしました。赤外線LEDを取り付けたESP32で動作して、HomebridgeとはMQTT経由で通信します。以下の記事をご覧ください。

diysmarthome.hatenablog.com

diysmarthome.hatenablog.com

diysmarthome.hatenablog.com

diysmarthome.hatenablog.com

iPhoneのロック画面にHomeKitウィジットを取付ける

9月にiOS 16に更新されたことで、iPhoneのロック画面にウィジェットを表示できるようになりました。これでロックされたiPhoneから1回のタップでホーム.appに移動できます。Androidスマホには類似の機能がすでにあったらしいです。これでHomeKitデバイスをすぐに操作できるようになりました。

ロック画面のウィジェット

下の写真は、ロック画面にホームの「概要」と「気象センサー」ウィジェットを取り付けた様子です。左の「概要」をタップするとホームアプリに移動します。すでに起動してあれば、前回操作した状態が表示されます。実はこのとき顔認証をしているので、所有者がタップしないとホームアプリは起動しません。顔認証ができない場合はパスコード入力画面になります。

右の温度計アイコンは「気象センサー」です。これをタップすると、ホームの「気候」のカテゴリが表示されます。

手元の設定だと、SwitchBotのカーテンと、Nature Remo経由でコントロールしているエアコンが表示されます。

     

追記:HomePod 16.3になってHomePod miniの温度・湿度センサも読めるようになり、表示に反映されるようになりました。

diysmarthome.hatenablog.com

エアコンをタップすると、エアコンのon/off、冷房、暖房の切り替え、温度設定が可能になります。

カーテンもエアコンもHomebridge経由でコントロールしているデバイスで、HomeKit対応製品ではありません。これらに相当する国内入手可能なHomeKit製品はありませんので、Homebridgeを導入して設定する作業が必須です。

diysmarthome.hatenablog.com

diysmarthome.hatenablog.com

誰でも使えるMatter対応デバイスが早く揃って欲しいところです。

ウィジェットの設定

ウィジェットは、「設定」「壁紙」「カスタマイズ」から設定します。またロック画面を長押ししても設定画面に入れます。下は、ロック画面を長押しした状態です。ここでカスタマイズをタップします。

すると、ロック画面とホーム画面のどちらをカスタマイズするかを選択できるので、ロック画面をタップします。

これでウィジェットを追加編集できます。大小2種類のウィジェットがあり、大なら2個、小なら4個使用できます。ここでは、ホームの「照明」と「気象センサー」を選択してます。

ウィジェットを追加」の上にはおすすめが並んでますが、ここに無ければ、下のアプリ一覧から選択します。

ウィジェットの準備が終わったら、右上の「完了」ボタンをタップすれば完了です。

まとめ

iPhoneのロック画面に、ホーム.appへとすぐに切り替えられるウィジェットを追加しました。スマートホームでは、玄関の鍵を開けたいとか、照明をつけたいとか、とにかく手っ取り早く操作したい場面が多いので、ロック画面から起動できるようになって便利です。ウィジェットを提供しているサードパーティアプリは、手元の環境ではGoogle Maps, Messenger, PayPayなどでした。Google Home, Amazon Alexa, Tuya Smartなどのスマートホーム関連アプリは今のところ未対応です。iPhoneスマートホームを使う際には、HomeKitがチートなくらい有利なのは当然かなと思います。

macOS VenturaでPython 3を動かす

年に1回のmacOSメジャーアップデートが昨日 (2022年10月25日) 公開されたので、最新版のmacOS Ventura 13.0にクリーンインストールしました。それでPython 3もインストールし直しました。

秋の大アップデート祭

Appleエコシステムで暮らすユーザにとって、秋は毎年恒例のメジャーアップデートの季節です。昨日 (2022年10月25日) 、macOSがVentura 13.0にアップデートされたのと同時に、先月16.0にアップデートされたiOSも16.1にアップデートされました。なので昨日は、

  1. MacmacOS Ventura 13.0にアップデートして、
  2. iPhoneiOS 16.1にアップデートして、
  3. iPadをiPadOS 16.1にアップデートして、
  4. AppleWatchをwatchOS 9.1にアップデートして、
  5. AppleTVをtvOS 16.1にアップデートして、
  6. HomePodソフトウェアバージョン16.1にアップデート

しました。このうち、iOSのホームとHomePodがMatter対応しました。ただMatter対応デバイスがないのでいずれにしても確認できないです。HomePodのThreadは、応答が良くなった気がしなくもないです。NanoleafのThread接続電球が前よりもスムーズに応答するようになりました。パフォーマンスと安定性が改善されたらしいので、関係あるかもしれません。

Macのアップデートでは、元のボリュームを消去してクリーンインストールしました。とはいえ/Users以下は別ドライブに置いているので、ユーザデータは残ってます。また/Applicationsもバックアップとってあるので、アプリアイコンをドラッグ&ドロップで元に戻すだけです。ただターミナルから操作するUNIX系コマンド類は、初期状態に戻ってしまいました。そこでスマートホームに欠かせない(個人の感想です)Pythonを復活させます。

macOSのプログラミング環境

macOSは元々がFreeBSD系のOSなので、UNIX系の開発環境が最初から整ってます。cc, gcc, swift, java, perl, rubyなど主要はプログラミング言語はほとんど揃ってます。もちろんPython 3もあります。イケてるUNIX環境なのでPython 2はありません。

% which python
python not found
% which python3
/usr/bin/python3
% ls -lh /usr/bin/python3
-rwxr-xr-x 76 root wheel  163K 10 18 21:36 /usr/bin/python3

ただ、最近ではライセンスの関係なのか、初期状態では言語系ツールがすぐには動きません。Python 3を動かそうとすると、

% python3      
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.

 というようなメッセージが出て、ダイアログが出ます。

ここでインストールボタンを押せば、インストールされることもありますが、失敗することもあります。ccコマンドではこれでインストールできたのですが、python3コマンドでは失敗します。

Xcodeをインストールする

ここで要求されている「コマンドラインデベロッパツール」というのは、Xcodeの一部です。なのでXcodeをインストールすれば確実に対応できます。Xcodeには色々なツールもついてますし、これだけの開発環境が無料ですし、簡単に入手できるので、macOSとセットでインストールすべきアプリです(個人の感想です)。

Xcodeは、App Storeにあります。そこでXcodeを検索するとすぐに出てきます。

Xcodeのダウンロード終了後に起動すると、同意を求められます。コマンドラインからプログラム言語を使う場合に必要だったのは、この同意でした。

この後に、開発に必要なツールがインストールされます。

これでXcodeでプログラム開発できる状態になりました。

でも今回はXcodeは使わないので、ここで終了します。

Python 3を起動する

これでpython3が動くようになってます。以下、太字が入力した部分です。

% python3 --version
Python 3.9.6

Python 3の最新バージョンは3.10.4らしく、Raspberry Piにもそれが入っています。ネットを見ると「macOSに入っているPythonは古い」と言われてますが、それは昔の話で、現在はそこそこ最新バージョンが用意されていると思います。pip3もあります。

% pip3 --version
pip 21.2.4 from /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/site-packages/pip (python 3.9)

MQTTライブラリをインストールする

次にPythonにライブラリを追加してみます。MQTTは使いたいので、paho-mqttをインストールします。

% pip3 install paho-mqtt
Defaulting to user installation because normal site-packages is not writeable
Collecting paho-mqtt
  Downloading paho-mqtt-1.6.1.tar.gz (99 kB)
     |████████████████████████████████| 99 kB 8.2 MB/s 
Building wheels for collected packages: paho-mqtt
  Building wheel for paho-mqtt (setup.py) ... done
  Created wheel for paho-mqtt: filename=paho_mqtt-1.6.1-py3-none-any.whl size=62133 sha256=514dad7...
  Stored in directory: /Users/xxxxx/Library/Caches/pip/wheels/0f/90/29/db29...
Successfully built paho-mqtt
Installing collected packages: paho-mqtt
Successfully installed paho-mqtt-1.6.1
WARNING: You are using pip version 21.2.4; however, version 22.3 is available.
You should consider upgrading via the '/Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip' command.

無事インストールできました。pipを使うたびにバージョンが古いというWARNINGが出るので、指示に従ってアップデートしておきました。pip3のバージョンが上がりました。

% /Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: pip in /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.9/lib/python3.9/site-packages (21.2.4)
Collecting pip
  Downloading pip-22.3-py3-none-any.whl (2.1 MB)
     |████████████████████████████████| 2.1 MB 7.4 MB/s 
Installing collected packages: pip
% pip3 --version
pip 22.3 from /Volumes/home/xxxxx/Library/Python/3.9/lib/python/site-packages/pip (python 3.9)

Pythonから公衆MQTTブローカを使う

paho-mqttを使った簡単なプログラムを作りました。broker.hivemq.comというパブリックなMQTTブローカーに接続するテストです。公衆のブローカーは、ボランティアで動かしてくれているので、止まっているかもしれません。LAN内にMosquittoなどのMQTTブローカを用意してある方はそちらを使うのが確実です。

#!/usr/bin/python3
from paho.mqtt import client as mqtt_client
address='broker.hivemq.com'
port=1883
sub_topic='pythontest/set'
pub_topic='pythontest/get'
client_id=f'python_856389663' #something random

def on_connect(client, userdata, flags, rc):
    if rc==0:
        print("Connection established.")
        client.publish(pub_topic,"Python client connected.")
    else:
        print("Failed to connect: %d\n",rc)

def on_message(client, userdata, msg):
    print(msg.payload.decode())

client=mqtt_client.Client(client_id)
client.on_connect=on_connect
client.connect(address,port)
client.subscribe(sub_topic)
client.on_message=on_message

client.loop_forever()

MQTTの動作をモニターするために、このMQTTブローカーをサブスクライブします。mosquittoをインストール済みのコンピュータから以下のコマンドを入力します。

$ mosquitto_sub -h broker.hivemq.com  -t pythontest/# -v

別のターミナルウィンドウから、上記のPythonプログラムを以下

% ./mqtttest.py
Connection established.

のように動かすと、MQTTをサブスクライブしたウィンドウにも、

$ mosquitto_sub -h broker.hivemq.com  -t pythontest/# -v
pythontest/get Python client connected.

というメッセージが出るはずです。また、別のターミナルウィンドウから、

$ mosquitto_pub -h broker.hivemq.com  -t pythontest/set -m 'hello'

というコマンドを動かして、helloというメッセージを送れば、pythonを動かしているウィンドウには、

% ./mqtttest.py
Connection established. hello

というようにhelloの文字が表示されるはずです。

まとめ

まっさらな状態のmacOSPython 3を動かす手順を紹介しました。Xcodeをダウンロードして、一回だけ起動してライセンス許諾すれば使用できます。macOSpythonをインストールする方法は、他にも複数あります。それぞれ長所・短所がありますが、Appleによって初めからインストールされているpythonを活かすのがシンプルで良いと思います。

話題のThreadを使ってみた

スマートホーム機器を統一すると期待されているMatterは、有線LAN/WiFiに加えて、Threadの上で動くことになってます。そのためThreadが注目されています。聞きなれない名前なので、ごく最新の規格なのかと思っていたら、昔からある規格でした。対応製品がいくつもあり、なんと目の前にあるHomePod miniにもThreadが搭載されていました。色々調べた結果をまとめておきます。また、Threadを採用したLED電球を買って、HomePod miniに接続し、動作確認しました。

Personal Area Network (PAN)

まずはThread, Zigbee, BLEが対象とするPANという用語の説明です。

PANって言葉を最初に使ったのは多分IBM研究所のZimmermanさんで1996年ころのことです。人体の接触で通信して、例えば握手すると名刺交換できたり、ドアノブに触ると解錠される仕組みを提案してました。その後、近距離の低消費電力微弱電波によるネットワークのことがPANと呼ばれるようになりました。キーボードやヘッドフォンを無線で繋げたり、超消費電力のセンサーネットワークなどで使われるネットワークがPANと呼ばれてます。

Thread

Matterで話題になるまでThreadの事を知りませんでした。調べてみました。

Threadは、IEEE 802.15.4という規格の物理層データリンク層の上に、IPv6UDP/IPを実装したものです。IEEE 802.15.4は、Zigbeeで使われている規格です。Threadが実装されていれば、EthernetWiFiで動いているIPベースのプログラムが動きます。コンピュータネットワークの世界から見たら、理想的なPANの実装と言えます。

( https://www.threadgroup.org/ )

でもThreadはあまり流行っている印象がないです。スマートホームで使うPANといえば、ZigbeeかBLEです(海外にはこれらに加えてZ-Waveってのもあるらしいです)。Threadは新しい規格ということで認知されていないのかもしれません。検索して時期を調べてみました。確かに、他と比べると新しいですね。

  1. Zigbeeは2004年から (IEEE 802.15.4-2003)
  2. BLEは2009年末から (Bluetooth 4.0)
  3. Threadは2014年から (Thread Group)

認知度の低かったThreadですが、Matter (2019~)のおかげで急に脚光を浴びている印象があります。MatterはもともとConnected Home over IP(CHIP)と呼ばれていて、デバイスを全部IPで接続したいという方針です。なので、PANの規格としてIPが動くThreadが採用されるのは当然の流れだったと思われます。

IPのPANと非IPのPAN

上のThreadの階層図のネットワーク層に6LoWPANという名前があります。IPv6 over Low-Power Wireless Personal Area Networksの略で、「しっくすろうぱん」と発音します。最初のRFCは2007年らしく、その頃は話題になってました。その後、ZigbeeやBLEの影に隠れて、忘れられて(いたと思って)いました。Threadではこの6LoWPANを活かしているようです。調べていたらこちらにわかりやすい解説がありました。PANはデータ量が少ない上に、ノイズでデータを失う可能性も高いので、MACフレームサイズが小さい(127バイト)そうです。それに対して、IPv6のサイズは大きい (1280バイト以上)ので、分割したり圧縮したりという地道な工夫が必要です。6LoWPANはそれをやっているそうです。

これに対してZigbeeやBLEでは、IP接続ではなく、独自のプロトコルを採用してます。電力やバンド幅をふんだんに使えて、S/N比の高い通信環境を対象としたIPを、PANに持ち込むのは非効率的だとの考えだと思います。でもそのかわり、ZigbeeやBLEをIPネットワークから利用するためには、橋渡しをするブリッジ(ゲートウェイ)が必ず必要になります。それも、プロトコルが違うので、ネットワーク階層の上のレベルで、データの意味を判断して橋渡しすることになります。なので、例えばA社のゲートウェイはB社のデータ構造を知らないので橋渡しできない、という状況を招きやすく、互換性が無いのが現状です。TuyaのセンサにはTuyaのゲートウェイが必要ですし、SwitchBotのデバイスにはSwitchBotのゲートウェイが必要です。

Matterは、多少非効率でも互換性が高い方が良いという判断で、IPで動くPAN規格であるThreadを採用したのかと思います。下の図はThreadネットワーク構成例の図です。それぞれのデバイスまでIPが到達していることが記されてます。物理層が違うのでその橋渡しをするThread Border Routerというユニットは必要ですが、UDP/IPレベルのパケットをそのまま通過させるだけです。データの詳細を解読する必要がないので、デバイスのメーカに関係なく機能する互換性の高いシステムになります。また、パケットの中まで解析する必要がないので、暗号化されているデータを解読する必要がなく、セキュリティとしても有利です。

( https://www.threadgroup.org/ )

Zigbee, BLEとThreadの関係

ZigbeeもBLEも、IPではない、独自のプロトコルなので、Threadとは互換性がありません。今まで構築されたスマートホームの環境なら、引き続き使用可能ですが、Matterのネットワークで使用するには、Matterのデータ構造とプロトコルに対応したゲートウェイが必要になるはずです。

ただ、Zigbeeに関しては、ネットワーク階層の物理層データリンク層がThreadと同じIEEE 802.15.4です。Zigbeeが先に作られていて、6LoWPANとThreadがそれを利用したという順番です。Zigbee用チップのデータリンク層以下は使い回しできると思われます。Matterを作っている組織であるConnectivity Standards Alliance (CSA)は、その前の名前がZigbee Allianceでした。BLEをベースにしてIPv6を実装するのではなくて(そういう仕掛けもあるらしいです)、IEEE 802.15.4を採用したことには多少の政治的理由もあるのかもしれません。

Threadを使う上で、BLEにも役割が与えられてはいます。上の図にも少し出てますが、セキュリティや設定の部分でBLEを使うこともあるとのことです。機器の設定を行う場合に、スマートフォンに搭載されているBLEを利用することを想定しているのでしょう。今のHomeKitのように、QRコードを読んで設定するような方式では、おそらくBLEは使わないと思います。

すぐに買えるThread製品

国内で買えるThread製品を探してみたところ、AmazonでNanoleafという会社の製品を見つけました。Threadに対応した照明器具を何種類か販売しているようです。その中でも、LED電球が一番安かったです。

NanoleafのThread使用方法を説明したwebページを見ると、Thread Border Routerになるデバイスを別途入手して、それ経由でGoogle Home, Amazon Alexa, Apple HomeKitなどからアクセスするようです。Nanoleaf社以外のThread Border Routerとしては、eeroという会社の製品または、Apple HomePod mini, Apple TV 4Kがあるとのことです!なんと、目の前にあるHomePod miniがThread Border Routerだとは知りませんでした。

ちなみに、eeeroの製品をAmazonで探したところ、専用の取り付けブラケットが数千円から1万円くらいで売られているだけでした。あまりに高価なので、本体かと思いました。本体は販売されていないようです。

ということで、現時点で国内で入手できるThread Border Routerは、調べた範囲では、AppleのHomePod miniとAppleTV 4Kだけのようです。

Thread対応のApple製品

まずはHomePod miniです。サイトのスペック表には、確かにThread搭載していると書いてあります。

ただ、

との注が付いていました。Threadには対応しているものの、HAP関係のパケットのみを中継しているようです。年内には、HomePodのOSがバージョンアップによりMatter対応するとのことなので、その時にはMatter関係のパケットも中継するようになるのだと思います。

追記:現在は、Matterにも対応しています (2023/1/21) 。

もう一つはApple TV 4Kです。2021年発売のApple TV 4K (第2世代)と、先日発売になったばかりの2022年版のApple TV 4K(第3世代)でThread対応しています。

ただし、Apple TV 4K 第3世代は、Ethernet搭載モデルだけがThread対応です。WiFiモデルはThread Border Routerにならないようです。

Apple TV 4K 第3世代の注意書きを見ると、こちらはHomeKitとMatterに対応しているようです。またThread Border Routerに相当しているという説明もありました。

一方で、GoogleAmazonスマートスピーカー類をいろいろ調べてみたのですが、Threadに対応しているという記述は見つかりませんでした。Amazon Echoの上位機種にはZigbeeが搭載されているのですが、Threadには対応していないようです。Amazon, Google, Appleの中では、Appleが一番Threadに力を入れていたようです。Thread対応のデバイスを探してみると、HomeKit対応製品が多かったのですが、これも、HomePod mini, Apple TV 4KにThreadが搭載されている関係なのでしょう。

Nanoleafの電球

ならば、NanoleafのThread電球を買って、HomePod miniで試すべきかと思いました。ゴツゴツした特徴のある形の電球です。

以前買った格安フルカラーLED電球と比べたら高価ですが、他のブランド品と比べたら普通の価格です。明るく発色も良い製品かと思います。HomeKit対応と書いてあり、本体にもコードが印刷されています。

          

また箱には、Thread Border RouterがあればThreadによって信頼性が向上するという説明も書いてありました。

Google Homeでも動作すると書いてあります。箱には書いて無いですがAmazon Alexaからも動作するはずです。Bluetoothロゴがあるので、Threadが無い環境ではBLEで動作するのかもしれません。

電球を通電し、iPhoneのホームから「アクセサリの追加」を選び、QRコードを読み取りました。このように、通常のHomeKitデバイスと同様の方法で追加した結果、ホームに表示されました。

工場出荷時設定リセットの方法

ホームに表示されている下向き矢印マークは、新しいファームウェアがあるのでダウンロードせよという案内です。NanoleafのiOSアプリが必要とのことで、まずはアプリをダウンロードしました。アプリの中から「ファームウェア更新」というメニューを選び更新しました。しかし更新したところ、今度はHomeKitでの応答が悪くなりました。登録しなおそうと思い、ホームから削除したら、再登録できなくなりました。

そこで、Nanoleafのサイトに書いてあった工場出荷時状態へのリセットを試しました。3秒間隔でon/offすると5回目に電球が点滅しフル点灯になりリセットされます。この結果、再びHomeKitに登録できるようになりました。ファームウェアアップデートをした後は、リセットしないといけないようでした。

ただ、これ以降も時々応答が悪くなったり、「アップデート中」になったり「応答なし」状態になることがあります。ファームウェアアップデートとは関係なかったのかもしれません。ネットワーク環境のせいかもしれませんが、同じくHomeKit対応のMerossのスマートプラグは問題なく安定して動作してます。NanoleafのHomeKit実装の問題なのか、Threadの問題なのか不明です。しばらくすると回復しますが、待ちきれない場合はまたリセットしてます。とはいえ1個しかないThread対応デバイスなので、引き続き使用して様子を見ます。

     

追記:HomePodソフトウェアを16.1にバージョンアップしたら、「アップデート中」とか「応答なし」となる状況がほぼ解消しました。バージョンアップが効いたのかと思います。(2022/10/25))

Thread接続になっているのか

いろいろ試して電球の接続方式を確認したところ、確かにThread接続のようでした。

まず、HomePod miniの電源を抜いてoffにしました。すると電球は反応しなくなりました。電源を戻すと、しばらくして復旧しました。HomePod miniを経由して接続されていることは間違いないようです。BLE接続の可能性はなくは無いですが、Threadで接続されていると思われます。

NanoleafのiOSアプリには、Threadネットワークという項目がありました。Threadの一部として動いているように読み取れます。Threadのメッシュを構成するデバイスはThread Routerというらしいので、ここもルーターと表示されているのかと思います。Zigbeeでも電球はルーターになるので同じ扱いなのでしょう。

さらにNanoleafのiOSアプリから電球を選択し、設定画面を開いたところ、

接続タイプが「糸」になってました。直訳がキツイですが、Thread接続になっていました。

まとめ

Threadについて調べました。Appleは昔からThreadを応援しているようで、HomePod miniとApple TV 4KがThread対応していることを知りました。またThread対応のNanoleafの電球をHomeKitにThread接続して、動作確認しました。

クラウドが止まった時のスマートホーム

インターネット接続しているケーブルを引き抜いて、外部接続が停止した時のHomeKit動作を確認しました。外部接続が遮断されても、HAPで接続するHomeKitアクセサリ類は動きます。また、MQTT・Zigbee・BLEで接続するアクセサリも動作しました。クラウドサービスを参照するアクセサリは動かなくなりました。

クラウドの利点・欠点

スマートホームの機器には、インターネット上のサーバで動いているクラウドサービスを利用するもの、利用しないもの、どちらも可能なものがあります。家の外から機器をコントロールすることを考えると、クラウドを利用する方が設定が楽で安全です。また自社のエコシステムへの囲い込みも容易になります。なので多くの機器が、メーカが用意したクラウドサービスを利用する方式で設計されてます。

Home Assistantを作った人たちは、これに異を唱えて、自分の家の機器は自分の家のサーバで制御すべきだと言ってます。実際に、クラウドサービスが終了してしまい、機器が使用できなくなる事例が多数あることから、クラウドを避けたい気持ちには共感します。

wired.jp

kaden.watch.impress.co.jp

クラウドが終了する事態にならなくても、不調だったり、遅延することも多いので、全部自前で揃えるメリットは大きいです。

ただ、家の外から安全にアクセスできる段階まで自前で設定するのは大変です。できる限りローカルに動作させつつ、外部からの接続に関してだけは信頼できるクラウドサービスを使うのが最適解ではないかと思います。Home Assistantも関連会社が有料のクラウドサービスを運営しています。

HomeKitを使っている場合は、Appleの信頼できるクラウドサービスを無料で使用できます。HomeKitでは、家庭内からの機器制御はローカルに実行可能で、外からの制御にはクラウドを使用する使い分けがうまく取り込まれています。

今回はインターネットへの接続を一時的に切断して、スマートホームのどの部分がクラウドに依存しているか、実感したいと思いました。

HomeKit実験環境

クラウド依存を実験した機器の構成は以下です。

「ホームサーバ」(HomeKitで外部接続を担当するサーバ)としてHomePod miniを使用しています。HomeKit対応デバイスは、Merossのスマートプラグだけです。HomeKit非対応機器をHAP (HomeKit Accessory Protocol)接続するために、Homebridgeを稼働させています。同じマシンで、MQTTブローカーとZigbee2MQTTが動いています。Tuya, Nature, SwitchBotのデバイスも、Homebridgeに接続しています。このうち、TuyaとNatureのプラグインは、それぞれの会社のクラウドサービスが提供するAPIを使用しています。SwitchBotに関しては、ローカルなBLE接続で制御しているので、クラウドを使用していません。

HomePod: Siriは動かないけどサーバは稼働

この状態で、インターネット接続を遮断しました。具体的には、インターネットプロバイダに接続しているケーブルをルーターから抜きました。

この結果、まずはHomePodのSiriは動かなくなりました。Siriへ呼びかけすると「インターネット接続されていない」という内容の返事を返します。Siriの本体はクラウド上にあるので、動かなくなって当然です。HomePodは外出先からの接続も担当しています。外部接続を遮断したので、当然ですが外部接続も不可能になっているはずです。

一方、HomePodは、例えば「センサに反応があったら照明を点灯する」というような、オートメーションやアクションも管理しています。オートメーションやアクションをiPhoneMacに任せることはできません。必ず家にあって、常時稼働しているデバイスが対応する必要があります。そこで、HomePodやAppleTVがホームサーバとして、オートメーションやアクションを担当しています。この機能は、外部接続が遮断されても動いていました。

HAP機器は動く

HAP接続している機器(ここではMerossのスマートプラグ)は、問題なく安定して稼働しました。HomeKitは、クラウドがなくても機器を操作できるということがメリットであると聞いたことがありますが、それを確認できました。

Homebridgeは要調整

想定外だったことは、Homebridgeが動かなくなったことです。それも、インターネット切断した直後は動作していて、ZigbeeやMQTT経由のデバイスが正しく稼働してました。それが一つ一つ徐々に反応しなくなり、最後には全て「応答なし」の表示になってしまいました。Homebridge接続のセンサ類も応答なくなりました。HAPデバイスのスマートプラグだけは健気に動いています。

Homebridgeのwebインタフェースを開いて、そこのエラーメッセージから、原因を特定できました。Nature Remoのプラグインが、Natureのサーバーに接続しようとして失敗しているのですが、その結果、Homebridgeにシグナルを送って再起動させているようでした。Homebridgeが再起動を繰り返しているために、ブリッジとしての機能が果たせていませんでした。そこで、Nature Remoのプラグインを停止したところ、Homebridgeは正常に機能再開しました。この結果、スマートホームの多くの部分が復旧しました。

MQTTとZigbeeは動く

Homebridgeが動作したので、MQTT経由でWiFi接続していた自作のESP32類が動くようになりました。またZigbee2MQTTで接続しているセンサ類、照明、壁スイッチなどが全て動くようになりました。センサ類・スイッチ類の動作に紐付けされる機器操作(「スイッチを入れると照明が点灯する」などのアクション)は、HomePodが管理していますが、これも動作します。

BLEも動く

BLEで接続しているSwitchBot製品も動きました。SwitchBot社のクラウドAPIを使用しておらず、内部のBLE接続だけを使用しているので、インターネット接続が不通になっても、問題なく動きます。

クラウド連携機器は動かない

動作しなかったのは、予想通りTuyaとNatureの機器です。どちらもそれぞれの会社のクラウドAPIを使用しているので、外部接続がないと使用できません。

まとめ

インターネットへの接続を外しても、引き続き動作するデバイスを確認しました。その結果、クラウドAPIを使うTuyaとNatureの機器を除いて、動作を確認できました。家にあるデバイスの8割以上は外部接続ができなくても動作する感じです。また、外部接続ができない場合に、停止しなければならないHomebridgeプラグイン (Natureのプラグイン) があることも確認できました。クラウドサービスが停止したり終了した場合や、何かの理由でインターネット接続できなくなった場合のシミュレーションにもなりました。

iPhoneがNFCタグを読んだら実行するオートメーションを設定する

iPhoneNFCタグを読んだ時に、何かのアクションを実行するショートカットを作成しました。これで、スマホNFCタグを読んだら明かりをつける、とか、帰宅して玄関に貼られたタグを読んだら、電気錠を開けて警報器をオフにするなどの自動操作が行えます。

NFCタグ

電磁誘導や電波を受け取って、その電力で稼働してIDを無線で返すタグは、パッシブ型RFIDタグと呼ばれています。ユニクロの服のタグや、図書館の本などに仕組まれてます。NFCタグもRFIDの一種です。SuicaをはじめとするFeliCaNFCと互換です。周波数やプロトコルが標準化されたおかげで、ほとんどのスマホNFCタグを読めます。

AmazonNFCタグを買う

NFCタグは標準化されているので、ネット通販で安価に販売されてます。AliExpressで安く買えますが、Amazonでもそれほど価格は変わりません。それでAmazonで、30枚で930円(1枚あたり31円)で売っていたコイン型のNFCタグを試してみました。

防水型で価格が安くて小型薄型なので、色々なところに気軽に貼れます。サイズは直径25mm、厚さは0.7mmです。

iPhoneで読む

後述するように、このタグはiPhoneで読めました。Amazonのコメントを見ると、感度が悪い、動作しないことがあるなどのコメントもあります。Suicaのようなクレジットカード型に比べて、500円玉より一回り小さいサイズで、アンテナコイルが小さいので、こんなものだと思います。スマホNFCアンテナの位置をしっかり把握して、タグに当てれば確実に動作します。最近のiPhoneの場合、画面上のノッチの裏側くらいをタグに当てると確実です。ノッチの裏、上辺から10mmくらいの位置とタグの中心を重ねると(iPhoneにタグがギリギリ隠れるくらいの位置)、一番感度が高いようです。

スイートスポットが狭いと感じるようでしたら、クレジットカードサイズのNFCタグにすると良いと思います。

カードサイズは1枚100円くらいです。こちらの製品は動作確認していませんが、同じNFCなので問題ないと思います。

「ショートカット」アプリ

iPhoneNFCタグを活用するには、標準のショートカットアプリが便利です。ショートカットは、元々はアプリなどを使用する手順をまとめて、一つのアイコンにして、iPhoneの画面に表示するアプリです。CUIの世界のバッチファイルとかスクリプトのような存在でした。HomeKitのスマートホームのコントロールも提供してます。現在は、色々なイベントをきっかけに動作するオートメーションなど機能が充実してます。

macOS 12.0以降では、Macでも動くようになってます。macOSにはそれまで、スクリプトエディタやAutometorという自動化のためのアプリがありましたが、それにショートカットが加わりました。macOSからショートカットを使う記事を前回紹介しました。今回はiPhoneから使います。

diysmarthome.hatenablog.com

個人用とホーム用のオートメーション

iPhoneNFCタグを読んだことをきっかけに動作するオートメーションを作成するには、ショートカットの画面下にある、「オートメーション」ボタンをタップします。画面には、今まで作成したオートメーションが表示されます。「ホーム」アプリで作ったHomeKitオートメーションも、ここに並んでいたのでちょっと驚きました。ショートカットとホームは連携しているようです。こんな芸当ができるのはOSを作っているAppleGoogleだけですね。

画面右上の+ボタンをクリックすると、新規のオートメーションを作成できます。ここでは、「個人用オートメーション」と「ホームオートメーション」の選択肢が現れます。この2つについて少し説明します。

個人用オートメーションは、作成したiPhoneだけで実行するオートメーションです。オートメーションの手順は、iCloudでバックアップされるものの、おそらくはそのiPhoneにローカルに保存されると思われます。そのiPhoneからのみ実行できるので、実行できる人はiPhoneの持ち主だけです。

ホームオートメーションは、「ホーム」アプリで設定した家ごとに作成します。その家の住人として登録された人全員が利用できます。ホームアプリで作成するオートメーションと同じものです。オートメーションのデータは、おそらくはその家の「ホームサーバ」に保存されます。ホームサーバは、その家に設置されたHomePod, AppleTV, iPadです。ホームサーバを交換したり追加すると自動的に引き継がれるので、おそらくはiCloud上にもバックアップされているはずです。

NFCタグを読んで実行するオートメーションは、個人用オートメーションとして作成します。ホームオートメーションでは作成できません。なのでここは、「個人用オートメーションを作成」をタップします。

LED電球を点けるオートメーションを作る

まずは、NFCタグを読んだらLED電球が点灯するオートメーションを作ってみます。「個人用オートメーションを作成」をタップすると、オートメーションを起動するトリガーを選ぶ画面が表示されます。スクロールしていくと、「NFC 例:"NFCタグをタップした時"」という選択肢があるので、これをタップします。

次にNFCタグをスキャンするボタンが現れるので、これをタップしてスキャンします。

スキャンできるとタグに名前をつけられます。ここではLED Onという名前にしました。

「次へ」をタップすると、アクションをつける画面に移動します。ここで「アクションを追加」をタップします。

Appボタンをタップしてスクロールするとホームが見えるのでこれをタップします。

すると、選択したAppで操作できる項目が現れます。この中から、「"(家の名前)"をコントロール」を選び、この手順の中の「シーンとアクセサリ」の部分をクリックします。これでアクセサリとその状態を選べば、動作の指定が完了します。ここでは、Ledvance RGBという名前のLED電球を1%の明るさで点灯させるという動作を指定しました。

完成すると、作成したオートメーションが表示されます。一番下に「実行の前に尋ねる」というスイッチがあります。これは、NFCタグを読んだ後に、確認の表示とタップ操作を必要とするかどうかの選択です。すぐに実行して欲しかったらこのスイッチをoffにします。確認の後で、offになります。

      

これで、iPhoneNFCタグを読むと、すぐにLED電球が点灯します。

   

タグの読み取りは、iPhoneがロックされていても機能します。ただ、画面が消えている状態では機能しないので、画面をタップして起動させておく必要があります。

NFCタグで玄関の電気錠とセキュリティを解除

玄関の外にNFCタグを貼っておいて、それをスマホで読むと錠が開くと便利かもしれません。そんなオートメーションも作ってみます。帰宅した際に、以前作成した電気錠と、セキュリティシステムを設定します。ついでに照明を点灯させても良いと思います。

 

diysmarthome.hatenablog.com

上のステップと同様な操作を行い、今度は「玄関」という名前のNFCタグを用意します。

このアクションには、

  1. Entranceという名前の電気錠を解除して、
  2. Securityという名前のセキュリティシステムをオフにする、

アクションを以下のように設定します。

これも、「実行の前に尋ねる」をoffに設定してみました。

最初の状態は、施錠されていて、セキュリティシステムが警戒状態です。

ここでタグを読ませると、確認のメッセージが現れました。

「実行の前に尋ねる」をoffにしたのに、今度は確認のメッセージが出ました。おそらくは、ロックとセキュリティシステムは、セキュリティが重要であるので、必ず確認が出る仕様になっているのだと思います。実際に、悪意のある人が玄関のタグを読んで、IDを取得して、同じタグを複製して、持ち主に気づかれずにiPhoneに読ませることが不可能ではないと思います。そんな場面でも、確認が出れば阻止できます。そのような仕様なのかと思いました。

それはさておき、ここでContinueを選択すると、玄関が解錠、セキュリティが解除になるよう動作開始します。

そして、玄関が解錠されて、セキュリティがオフになります。

玄関の電気錠は、オートロック機構により10秒後に施錠に戻ります。セキュリティの方はオフのままです。

まとめ

NFCタグを貼り付けて、これを読むことでHomeKitアクセサリを操作する自動化を行いました。ショートカットは、HomeKitアクセサリだけでなく、あらゆるアプリの制御に使えます。仕事や日常生活の中で色々使えると思います。

頻繁に使う機能だったら、専用の壁スイッチを取り付けた方が、スマホを取り出して当てる必要もなく、素早く操作できて便利です。

diysmarthome.hatenablog.com

diysmarthome.hatenablog.com

NFCタグを使うメリットは、価格が安く堅牢なことかと思います。1枚30円ほどなので、色々な機能のタグを気軽に貼れます。防水タグを使えば、玄関外のように風雨が当たる場所にも気軽に貼り付けられます。そのiPhoneを持っている人だけが使用できるので安全です。