ラズパイ4でHomeKit対応見守りカメラを作ってみました

こんにちは。Tedです。

AppleのHomeKit対応製品は海外では充実していますが、日本ではまだまだ。そのために選択肢が少なく高価なのがネックです。

そこで今回はHomebridge + ラズパイを使って安価にHomeKitに対応した見守りカメラを作ってみました。

Homebridgeとは

HomebridgeはNodeJSを使ったHomeKitのエミュレーションを行うシステムです。オープンソースとして公開されています。

https://homebridge.io

用意するもの

  • ラズパイ(今回は Raspberry Pi 4B を使いました)
  • ラズパイ対応カメラ
  • 32GB マイクロSDカード
  • ラズパイ電源アダプタ
  • Pi4B用ラズパイケース(カメラを内蔵できるものを選びました)

f:id:TedWada:20191230185630j:plain
購入したラズパイ+ACアダプタセットとカメラ

他には環境を構築するためにMacBook Proおよびインターネット接続環境・有線LANケーブル・マイクロSDカードアダプタを用意しました。

「作ろう会」で作りました

今回は下記の作ろう会にて作成してみました。

ingage.connpass.com

masm11さん(当社シニアエンジニア)と植田雄太さんから助言をいただきながら進めました。

システム構築

ラズパイを使ってHomeKitカメラを作った記事はいくつかWeb上に上がっています。 たとえば下記がそうです。

appleinsider.com

このAppleInsiderの記事では構築済のシステムバイナリが提供されていますが、ラズパイ4では動きません。 そこで今回はバイナリを使わずシステムを構築していきます。

ラズパイを起動できるようにする

まずはラズパイを起動できるようにします。 今回は直付けのモニタ・キーボードは用意せずに構築していきます。

SDカードにRasbianを書き込む

下記のRasbianダウンロードサイトよりRasbianシステムをダウンロードします。 今回は Raspbian Buster with desktop and recommended software を使いました。

www.raspberrypi.org

ダウンロードしたZipアーカイブは解凍しておきます。

SDカードへの書き込みはMacにてターミナルを開いて下記のように進めます。

[~]$ diskutil list  #マイクロSDカードのアイデンティファイヤを調べておく
#ここではマイクロSDカードのアイデンティファイヤは /dev/disk1 と記述します。

[~]$ diskutil unmountDisk /dev/disk1  #いったんアンマウント
[~]$ diskutil eraseDisk MS-DOS BOOT /dev/disk1  #フォーマット
[~]$ diskutil unmountDisk /dev/disk1  #フォーマット後自動的にマウントされるので再度アンマウント

[~]$ sudo dd if=/ファイルパス/ダウンロードしたファイル.img of=/dev/rdisk1 bs=1m  #SDカードにイメージを書き込み

LANからラズパイにアクセスできるようにする

[~]$ diskutil mountDisk /dev/disk1  #書き込んだSDカードをマウント
[~]$ cd /Volumes/boot  #SDカードに移動
[~]$ touch ssh  #sshファイルを作成

ラズパイに周辺機器を取り付ける

ラズパイにカメラを取り付ける

写真のようにラズパイにカメラケーブルを取り付けます。

f:id:TedWada:20191230185939j:plain

向きを間違えないように、またしっかりとセットしてください。(見た目にはちゃんとケーブルがセットされているようでも微妙なズレで認識されなかったりします)

その他周辺を接続

バイナリを書き込んだマイクロSDカード、LANケーブルおよび電源をラズパイ本体に接続します。 ラズパイをケースに入れるのは基本的な動作確認ができてからとしました。

いよいよラズパイを起動

電源を入れると、本体の赤LEDが点灯し緑のアクセスLEDが点滅します。 10秒ほど待てばシステム起動となり、ラズパイにアクセスできるようになります。

ラズパイにSSH経由でアクセス

[~]$ ssh pi@raspberrypi.local
# 初期パスワードは raspberry (当然ながら変更しておく)

無線LANでアクセスできるようにする

上記の通りラズパイにアクセスしたら、無線LANに接続できるようにしておきます。

pi@raspberrypi:~ $ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf

下記を記述します。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
   ssid="<接続したいSSID>"
   psk="<WEPキー>"
}

ここまでできれば一段落です。 後はラズパイにシステムを構築していきます。

ラズパイシステムを最新の状態にアップデート

pi@raspberrypi:~ $ sudo apt-get update && sudo apt-get upgrade

カメラモジュールを有効化

pi@raspberrypi:~ $ sudo raspi-config

f:id:TedWada:20191223180809p:plain
「5 Interfacing Options」を選択。

f:id:TedWada:20191223180901p:plain
「P1 Camera」を選択。

f:id:TedWada:20191223180939p:plain
「Yes」で保存。

f:id:TedWada:20191223181012p:plain
カメラモジュールが有効化された。

タイムゾーンの設定

前記 raspi-config から適切にタイムゾーンを設定しておきます。

設定場所は [4 Localisation Options] - [I2 Change Timezone] にあります。 日本だと [Asia] - [Tokyo] ですね。

Node.jsをインストール

HomebridgeはNode v4.3.2またはそれ以降のバージョンが必要です。 今回は執筆時の最新版である version 10.x を使いました。

https://linuxize.com/post/how-to-install-node-js-on-raspberry-pi/ を参考にしました。

pi@raspberrypi:~ $ curl -sL https://deb.nodesource.com/setup_10.x | sudo bash -  #最新版をget
pi@raspberrypi:~ $ sudo apt-get install -y nodejs  #インストール
pi@raspberrypi:~ $ node --version  #インストールされたバージョンを確認
v10.15.2   #などと表示されればOK

Homebridgeをインストール

pi@raspberrypi:~ $ sudo npm install -g --unsafe-perm homebridge

Homebridge用カメラプラグインをインストール

pi@raspberrypi:~ $ sudo npm install -g homebridge-camera-rpi@latest

Homebridgeの設定ファイルを編集

pi@raspberrypi:~ $ mkdir .homebridge  #最初にディレクトリを作成
pi@raspberrypi:~ $ vi .homebridge/config.json

ファイル内に下記を記述します。

{
  "bridge": {
    "name": "Homebridge",  #名称を設定
    "username": "1A:2B:3C:4D:5E:6F",  #16進数で自由に設定(重複しないようMACアドレス推奨)
    "port": 46183,
    "pin": "111-22-333"  #自由に設定
  },

  "description": "HomeCamera",  #名称を設定

  "platforms": [
    {
      "platform" : "rpi-camera", 
      "cameras": [{
        "name": "Home Camera",  #名称を設定(Homeアプリでのデバイス名)
        "rotate": 90  #0-180の回転角度
      }]
    }
  ]
}

(※2020-1-11 修正: platforms内のplatformの名称はプラグイン固有なのでその旨修正)

あとは、ラズパイ起動時に必要なモジュールが自動的にスタートするようにしておきます。 これは動作確認が終わってからでもよいでしょう。

自動起動の設定

pi@raspberrypi:~ $ sudo vi /etc/rc.local

ファイル内に下記を追加します。 スクリプト後半、exit 0 の前あたりに書きました。

/usr/bin/homebridge -U /home/pi/.homebridge/ &

(※2020-2-16 修正: homebridgeが格納されているディレクトリを修正)

Homeアプリにカメラを登録

前提としてすでにHomeKitホームハブ(HomePod, Apple TVなど)が稼働していることとします。

HomePod、Apple TV、iPad をホームハブとして設定する - Apple サポート

前記ホームハブと同じネットワークセグメントに接続されているデバイス(iPhoneなど)にてHomeアプリを起動します。

f:id:TedWada:20191229150313j:plain

Homeアプリにて [+] をタップしてデバイスを追加します。

f:id:TedWada:20191229150537j:plain

[アクセサリを追加] をタップします。

f:id:TedWada:20191229150954j:plain

[コードがないか、スキャンできません] をタップします。

f:id:TedWada:20191229151126j:plain

設定したカメラデバイスが表示されるのでタップします。

f:id:TedWada:20191229151252j:plain
カメラ名として設定したデバイスを選択する。

[このまま追加] をタップし、その後表示される画面にてconfig.jsonにて設定したpinを入力します。

f:id:TedWada:20191229151447j:plain

以上にてカメラデバイスが追加されます。

f:id:TedWada:20191229151516j:plain

正しく動作すれば図のようにカメラ画像がHomeアプリから確認できるようになります。

f:id:TedWada:20191229173256p:plain

うまく動かない場合は

カメラが正しく動いているか

pi@raspberrypi:~ $ vcgencmd get_camera  #カメラの状態を取得
supported=1 detected=1  #このように表示されていれば正しく認識されている

上記のように返らない場合はカメラケーブルの接続状態を確認しましょう。

カメラ画像が取得できるか

pi@raspberrypi:~ $ raspistill -o pictureFromCamera.jpg

取得した画像は sftp などで取得・確認します。

Homebridgeは正しく起動しているか

Homeアプリからデバイスが見えない場合、Homebridgeが正しく稼働していない可能性が高いです。

pi@raspberrypi:~ $ ps -aux | grep homebridge  #homebridgeプロセスが正しく起動しているか確認
root       432  0.2  1.8 181880 72148 ?        Sl   Dec18  36:25 homebridge  #このような表示があればプロセスは存在している

プロセスは起動しているが動作がおかしい場合はデバッグモードでエラーが起こっていないか確認しましょう。

pi@raspberrypi:~ $ sudo kill <killしたいPID(上記の場合は432>  #いったんHomebridgeプロセスを終了
pi@raspberrypi:~ $ DEBUG=* homebridge -D  #デバッグモードで起動

Homebridgeの設定ファイルに誤りはないか

config.json ファイルを JSON Lint などのJSONバリデータにて確認しましょう。

突然Homeアプリからデバイスが見えなくなった

システムの設定時など、何度か再起動を繰り返していると突然Homeアプリからデバイスが見えなくなることがあります。

この場合は下記のようにペアリングをリセットすると見えるようになります。

  • HomeアプリからHomebridgeアプリをすべて削除する。
  • persist および accessories フォルダを削除する。
pi@raspberrypi:~ $ sudo rm -rf .homebridge/persist
pi@raspberrypi:~ $ sudo rm -rf .homebridge/accessories
  • config.json 内の username を(インクリするなど)別のものに変える。

上記を行った後、システムを再起動します。

それでもうまくいかない場合

下記リンクに沿って調べてみてください。

Basic Troubleshooting · nfarina/homebridge Wiki · GitHub