Raspberry PiのGPIOを使うHomebridge-RPiプラグイン

DIYする

Homebridge-RPiプラグインを使えば、Raspberry Pi (RPi) のGPIOをHomeKitから利用できます。以前RPiに接続したミリ波レーダー人感センサーを、このプラグインから読めるように設定しました。

RPiのGPIOのためのプラグイン

前回の記事で、ミリ波レーダーを利用した人感センサーLD241をRasbpberry Piに接続して、HomeKitから使えるようにしました。

LD241は、送料込み数百円で入手可能なセンサーです。

人感センサーLD2410をRaspberry Piに接続する
前回の記事で紹介した人感センサーLD2410を、Raspberry Pi 4 (RPi4) のGPIOピンに接続しました。GPIOピン状態をHomeKit人感センサーに橋渡しするHomebridgeプラグインを使用して、HomeKitから使...

Motion sensor plus

前回の記事で使用したHomebridgeプラグインは、GPIOに接続した動きセンサをHomeKitから使えるようにするMotion sensor plusプラグインでした。

GitHub - Droccal/homebridge-motion-sensor-plus: Extended functionality for sensors connected to GPIO Pins of a raspberry pi
Extended functionality for sensors connected to GPIO Pins of a raspberry pi - GitHub - Droccal/homebridge-motion-sensor-...

問題なく動作していたのですが、node.jsをバージョンアップしたら、互換性が無いと言われるようになりました。

[07/11/2023, 22:12:30] ERROR LOADING PLUGIN homebridge-motion-sensor-plus:
[07/11/2023, 22:12:30] Error: The module '/var/lib/homebridge/node_modules/homebridge-motion-sensor-plus/node_modules/epoll/build/Release/epoll.node'
was compiled against a different Node.js version using
NODE_MODULE_VERSION 108. This version of Node.js requires
NODE_MODULE_VERSION 115. Please try re-compiling or re-installing
the module (for instance, using `npm rebuild` or `npm install`).

このプラグインは20ヶ月以上更新されていないので、これを機会にメジャーなプラグインに乗り換えることにしました。

Homebridge-Rpiプラグイン

そこで、前回の記事では使わなかったHomebridge-Rpiというプラグインを使うことにしました。GPIOを使用するプラグインの中では、汎用的で、最も頻繁にメンテナンスされています。様々な目的に使えて、Motion sensorにも対応してます。

GitHub - ebaauw/homebridge-rpi: Homebridge plugin for Raspberry Pi.
Homebridge plugin for Raspberry Pi. Contribute to ebaauw/homebridge-rpi development by creating an account on GitHub.

対応しているアクセサリーは、

  • Buttons
  • Contact sensors (Eveの履歴機能対応)
  • DHTxx 温度/湿度 sensors
  • Doorbells
  • Motion sensors (Eveの履歴機能対応)
  • Leak sensors
  • Smoke sensors
  • リレー、LED, ファンなどのスイッチ
  • PWM方式の調光LED(電球)
  • サーボモーター(HomeKitからスイッチとして見える)
  • 調色LED

です。対応アクセサリ種類にOccupancy sensorはありません。でも、Motion sensorは、PIR(パッシブ赤外線)人感センサーのことで、ホームアプリからの扱いは、Occupancy sensorと全く同じなので、これでも問題ないと思います。

pigpioとpigpiod

前回、Homebridge-Rpiプラグインを見送った理由は、pigpiodデーモンをインストールするのが面倒そうだったからです。でも試してみたところ、Raspberry Pi Imagerで使用するHomebridgeイメージには、pigpiodがすでにインストールされていて、自動的に起動する設定になってました。なので、準備作業無しで、このプラグインが使えることに気づきました。

pigpio

Raspberry PiのGPIOを使うために、いくつかのライブラリが提供されています。その一つにpigpioがあります。pigpioライブラリをCやPythonから使用すれば、GPIOの単純な入出力だけでなく、GPIO経由でのPWM設定、サーボパルス送出、I2C, SPI利用などが可能になります。

pigpiod

一方、pigpiod(最後のdはdaemonのd)は、pigpioライブラリをコマンドラインやソケット通信から使えるようにするデーモン(常駐ソフト)です。pigpioライブラリがインストールされていて、pigpiodが稼働していると、コマンドラインからpigpioの機能が使えます。例えば現在、LD241は、GPIO 4番ピンに接続しています。Rasbperry Piにssh接続して、以下のpigsコマンドを発行すると、4番ピンを読むことができます。人が存在すると1が、不在ならば0が返ってきます。

$ pigs r 4
1
$ pigs r 4
0

pigpiodは、コマンドラインだけでなく、ソケット通信もサポートしています。なので、ネットワーク上にある他のコンピュータからGPIO入出力が可能です。GPIOピンをネットワーク越しに操作できてしまうことには危険な場合もあります。なので、pigpiodの起動コマンドには、外部からのアクセスを禁止したり、アクセスできるコンピュータのIPアドレスを限定する機能があります。次で説明します。

RPiでのpigpiod設定

先に述べたように、RPiのHomebridgeイメージには、pigpioもpigpiodもインストールされていて、自動起動します。その起動設定を調べてみました。/lib/systemd/system/pigpiod.serviceにsystemctlの起動コマンドがありました。それによると、以下のようでした。

[Unit]
Description=Daemon required to control GPIO pins via pigpio
[Service]
ExecStart=/usr/bin/pigpiod -l
ExecStop=/bin/systemctl kill pigpiod
Type=forking
[Install]
WantedBy=multi-user.target 

pigpiodの起動オプションは-lになっていて、これは説明によると、

  • ソケット通信は有効 (default値)
  • 外部からのソケット通信は無効 (-lオプション)

という設定です。RPiの中のプログラムからのみソケット通信できる設定で、ネットワーク越しの操作は出来ないので、安心しました。

プラグインをインストール

ここまでの調査で、pigpiodがRPiですでに稼働していることが判明しました。そこで次に、HomebridgeにHomebridge-Rpiプラグインをインストールして設定します。HomebridgeのWeb UIからプラグインを選択して、プラグインを探します。

これをインストールすると以下の設定が可能になります。まずはデフォルトの状態で使います。pigpiodとはソケット通信します。デフォルトのpigpiodアドレスはlocalhostになっています。Homebridgeが動作している同じマシンのpidpiodに、ソケット通信する設定です。

次に、デバイスとしてMotion Sensorを追加しました。LD2410をGPIO 4番に接続してあるので、そのように設定します。

この結果、Homebridgeのconfigファイルの該当部分は以下になりました。

{
    "name": "RPi",
    "hosts": [
        {
            "host": "localhost:8888",
            "devices": [
                {
                    "device": "motion",
                    "name": "LD2410",
                    "gpio": 4,
                    "reversed": true
                }
            ]
        }
    ],
    "platform": "RPi"
}

人検出に対する動作が想定と逆だったので、reversedをtrueにしてあります。

HomeKitから使う

設定ファイルを保存し、Homebridgeを再起動すると、iPhoneとMacのホーム.appに以下のように人感センサーが表示されました。

人の検出をトリガーとしたオートメーションが設定可能になりました。

RPiのおまけ機能

ここまで設定したところで、ホーム.appに意図しないアクセサリが3個現れていました。RPiにはpi4という名前をつけていたのですが、その名前の

  • スイッチ
  • 温度センサー
  • 煙センサー

が表示されています。homebridge-rpiがRPiの状態をモニターする機能で、デフォルトで有効になっているようです。

   

これらは、RPiのCPU温度の測定値、電源LEDの状態を表しています。また煙センサーは、実際には煙センサーではなく、

  • RPiのCPUが高温になりすぎて動作周波数が制約される、
  • もしくは電圧降下が発生した時

に、知らせてくれるアクセサリです。また、過去の状態をEveアプリからグラフ化する機能もあるようです。GPIOを使うだけでなく、Raspberry PiをHomeKitから利用することを目的にしたプラグインのようです。ただ、今回はGPIOを使うのが目的だったので、それ以外の機能を無効にしました。Homebridgeのプラグイン設定画面で、RPi機能を隠すように設定します。

最終的なconfigファイルは以下になりました。

{
    "name": "RPi",
    "hosts": [
        {
            "host": "localhost:8888",
            "hidden": true,
            "noFan": true,
            "noPowerLed": true,
            "noSmokeSensor": true,
            "devices": [
                {
                    "device": "motion",
                    "name": "LD2410",
                    "gpio": 4,
                    "reversed": true
                }
            ]
        }
    ],
    "platform": "RPi"
}

これで、ホームから、RPiのスイッチ、温度センサー、煙センサーのアクセサリーが消えました。

まとめ

HomebridgeのHomebridge-Rpiプラグインをインストールして、RPiのGPIOに接続したLD2410がHomeKitの人感センサとして動作するよう設定しました。このプラグインが必要とするpigpiodデーモンは、すでにインストール済みでしたので、プラグインをインストールするだけの手間で、作業は完了しました。

コメント

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