ずっと品切れだったRaspberry Pi 4が入手できたので、
- Homebridge本体と
- Mqttthingプラグイン
- Zigbee2MQTTプラグイン
- Mosquitto
- Zigbee2MQTT
をインストールしました。補助記憶にはUSBメモリを使い、電源とファンも強化しました。
Homebridgeサーバ遍歴
Homebridgeなどのサーバー用に、最初はRaspberry Pi Zero Wを使ってました。実用的に動作しましたが、再起動に時間がかかるので、後にRaspberry Pi 4 (2GB)に移行しました。起動が高速になって快適でした。Homebridgeの使用メモリは0.4GBくらいなので2GBで十分でした。
そのRaspberry Pi 4が、半年前くらいに起動しなくなりました。またSDカードの破損だろうと思ったのですが(SDカードの破損は3回以上経験してます)どうも違うようです。起動プロセスの最後の方で停止してます。ビデオチップの故障のような気がしました。
しかし、半導体不足により品薄になってしまったので、新しいRaspberry Pi 4が買えず、Intel NUCにUbuntuをインストールしてHomebridgeを使ってました。Intel NUCはそれなりに調子良く動いていました。
品薄だけど買えた
そうしていたら、たまたまタイミング良くRaspberry Pi 4を買うことができました。しばらく前からスイッチサイエンスでRaspberry Pi 4 (4GB)の入荷お知らせメールを申し込んでいました。どうせ買い換えるなら、メモリ容量を増やしてみようかと思いました。ただ人気のようで、連絡メールに気づいてもすでに売り切れていることばかりでした。今回は、たまたますぐにメールに気づき、購入できました。4GBモデルの在庫を確認したところ、メールが来てから5分後には品切れになってました。
世の中では、Homebridgeを動かすためにRaspberry Piを使うケースが多いです。Raspberry Piで色々な動作検証をした方が有用なブログ記事になると思い、Homebridgeを引っ越すことにしました。ということでRaspberry Piに出戻りします。
記憶媒体はUSBメモリ
SDカードが何度も壊れたので、USBメモリを使いました。今までの経験では、USBメモリよりもSDカードの方が壊れやすいと思ってたのですが、ネットで探したところではそのような話は書かれてませんでした。しばらくはUSBメモリを使って、耐久性の問題があれば、次はUSB経由のSATAドライブを試したいと思います。
以前は、Raspberry PiをUSB起動させる設定がすごく面倒でした。でも最近のファームウェアではデフォルトで起動可能になってます。そこで、小型USB 3.0メモリで、信頼できそうなブランド品を探しました。こちらの商品です。
小型で出っ張りが少なく隣接のUSBソケットの邪魔にならず、それでいて楽に抜き差しできる引っかかりもあります。Raspberry Piの同じサイドにあるUSBコネクタやEthernetコネクタの出っ張りに比べるとかなり短いので、もう少し大きめのUSBメモリでも良かったかもしれません。
SDカードに比べて信頼性が上がると共に、速度にも期待しました。それで、Raspberry Pi用に使用する前に、macOSのAmorphousDiskMarkというソフトでベンチマークしてみました。今まで使用していたTranscendの業務用と言われてた
- SDカードが、Read 24 MB/s, Write 13 MB/s
だったのに対して、同じ条件で、
- USBメモリは Read 156 MB/s, Write 28 MB/s
でした。時間がかかっていた再起動はほとんどRead動作だと思うので、速度向上が期待できます。
余談ですが、このSDカードのベンチマークはなかなか優秀で、USB 2.0のUSBメモリを使うとここまでの速度は出ません。なので、速度を改善する目的でUSB起動を行うなら、USB 3.0ポートのあるRaspberry Pi 4を使う必要があると思いました。USB 2.0しか搭載していないRaspberry Piだと、速度向上のメリットは無いと思います。SDカードって意外と高速で優秀だったんですね。
このSanDiskのUSBメモリのAmazonレビューを見ると、大きなサイズのファイルを2分間くらいにわたって書き込み続けると、発熱で速度が落ちると書いてあります。確かに、次に説明するHomebridgeイメージを書き込む作業では、そこそこ熱くなってました。でもHomebridge動作中は、ほんのり温かい程度の発熱です。発熱に関しても、今後の様子を見てみようと思います。
追記:この後、Transcendの「業務用」USBメモリに入れ替えました。詳細は以下をご覧ください。
Raspberry Pi Imagerで起動USBを作る
USBメモリにも、SDカードと同様にRaspberry Pi Imagerでインストールできます。
Raspberry Pi Imagerの「OSを選ぶ」から、Homebridgeを選びます。
右下の歯車アイコンを押すと、起動の設定ができます。ディスプレイは接続しない予定なので、「SSHを有効化する」を選んで、sshが使えるようにしておきます。スクショでは選択していませんが、公開鍵認証のみにしておきました。ユーザ名もいつも使っている名前にしました。セキュリティも上がるし、sshするときにユーザ名を入れなくて良いので楽です。またここで、時差を設定しておけばログの日時などが日本時間になるので楽です。Ethernetを使う予定ですが、バックアップとして2.4GHzのWiFiも設定もしました。
「ストレージを選ぶ」からUSBメモリを選んで、「書き込む」ボタンを押せば作成終了です。Homebridgeを書き込んだUSBメモリを入れてRaspberry Piを起動します。
固定アドレスにする
これで、適当なブラウザからhttp://raspberrypi.local:8581を開けば、Homebridgeを使用できます。
また、Raspberry Pi Imagerで「SSHを有効化する」を選んであるので、Macのターミナルなどから
% ssh raspberry.local
とタイプすれば、ssh接続できます。
今はデフォルト設定なので、アドレスをDHCPで取得してます。MQTTブローカなどを起動するので、固定アドレスにしておきたいです。そこで、Homebridgeの設定を進める前に、固定アドレスにしました。
dhcpcdを使う場合
DHCPで設定する管理は、以前はdhcpcdで行う場合が一般的でした。古いバージョンのPi Imagerでもdhcpcdが使われてます。今はNetworkManagerが使われているようです。
Raspberry Piにsshで接続して、sudo raspi-configすれば、どちらを使っているかわかりますし、変更できます。
dhcpcdを使う場合、固定アドレスを設定するためには、/etc/dhcpcd.confの
# Example static IP configuration:
のコメントのある付近を参考にして書き直します。
# Example static IP configuration: interface eth0 static ip_address=192.168.xxx.xxx/24 static routers=192.168.xxx.1 static domain_name_servers=192.168.xxx.1 1.1.1.1 1.0.0.1
この後、dhcpcdを再起動したら、固定アドレスで動作します。
$ sudo systemctl restart dhcpcd
NetworkManagerを使う場合
最近Pi Imagerを使ったところ、dhcpcdではなくNetworkManagerを使う設定になってました。初期値が変更になったのかもしれません。NetworkManagerの場合は、nmtuiコマンドで設定が可能です。
$ sudo nmtui
これで表示されるメニューを選んで、固定アドレスにします。
バックアップから復元
ここまで非常に順調でしたので、このままIntel NUCの環境を移行することにしました。なので、Homebridgeのバックアップ機能を使って、今までのHomebridge環境の設定ファイルを新しいHomebridgeに移行しました。このように移行すれば、プラグインの復元と設定、ブリッジのIDなどが全て引き継がれます。HomeKitの再設定も不要です。ユーザ名とパスワードも引き継がれます。
しかしこれで再起動してもエラーが出ます。MQTTブローカとZigbee2MQTTが足りないからです。
Mosquittoのインストール
次にこちらに書いた手順で、MQTTブローカであるMosquittoをインストールしました。
基本的には、Raspberry Piにssh接続して、aptコマンドでインストールするだけです。
sudo apt install mosquitto mosquitto-clients
また、OS起動時に自動的にMQTTブローカが立ち上がるように以下の設定をしました。
sudo systemctl enable mosquitto.service
Intel NUCの環境では、ユーザアカウント、パスワード付きで動作させてました。同じ設定を実現するために、古い環境(Intel NUCコンピュータ)から
- /etc/mosquitto/mosquitto.conf
- /etc/mosquitto/password.txt
の2個の設定ファイルをコピーし、Raspberry Pi 4に複写しました。
Zigbee2MQTTをインストール
次にZigbee2MQTTを、公式ページの手順に従ってインストールしました。
ここでも、Raspberry Piにssh接続して作業します。HomebridgeにはNode.jsが含まれているかと思ってたのですが、入ってませんでした。のでZigbee2MQTT公式ページの手順に従って、
sudo curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt install -y nodejs git make g++ gcc
としました。apt-getではなく、aptで統一しようと思っているので、aptを使いました。この後も公式ページの手順に従って、zigbee2mqttのディレクトリを作り、ユーザを設定して、
sudo mkdir /opt/zigbee2mqtt sudo chown -R ${USER}: /opt/zigbee2mqtt
Zigbee2MQTTのリポジトリをクローンしてディペンデンシーをインストールします(カタカナの意味がちょっとよくわかってないです)。
git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt cd /opt/zigbee2mqtt npm ci npm start
この後、/opt/zigbee2mqtt/data/configuration.yaml ファイルに設定を書きます。公式ページに説明があります。今回は、Intel NUCで設定した内容そのままなのでコピーすることにしました。yamlファイルだけでなく、Zigbeeデバイスのデータベースも全て移動します。そのためには、/opt/zigbee2mqtt/data の中のファイルを全部持ってくれば良いです。(実際にはdataディレクトリの内容をtarでまとめて、scpでコピーしました。)これでペアリング済みのZigbeeデバイスの情報が引き継がれるので、新たにペアリングする必要はないです。
最後に、systemctlコマンドでサーバとして起動させるために、 /etc/systemd/system/zigbee2mqtt.service ファイルを作り、以下の内容にしました。Userの部分は、ログインしているユーザ名にします。Pi Imagerでユーザを指定した場合は、それに書き換えてください。
[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
これで
cd /opt/zigbee2mqtt npm start
とすると、いろいろ準備をしてくれた後起動するはずです。コントロールCで止めます。また、
sudo systemctl enable zigbee2mqtt.service
とすれば、以後、自動的に起動します。とりあえず起動しておきたいので、
sudo systemctl start zigbee2mqtt.service
としておきます。
Homebridge再構築に必要な作業
今回、Intel NUCで動作しているHomebridgeを、Raspberry Pi 4に移行しました。この際に必要だったインストール作業をまとめておくと以下です。将来何かトラブルがあって、Homebridgeを再構築する必要があったときに役立つかと思います。
- Homebridgeをインストールする
- Homebridgeを復元する
- Mosquittoを再インストールする。
- /etc/mosquittoにあるmosquitto.confとpassword.txtを復元
- Zigbee2MQTTを再インストールする
- /opt/zigbee2mqtt/data以下を復元
ということで、バックアップしておくと良いファイルは、
- Homebridgeのバックアップアーカイブファイル
- /etc/mosquitto以下の2ファイル
- /opt/zigbee2mqtt/data以下の全ファイル
の3種類でした。
Raspberry Piの冷却
基板のままの状態でここまでの作業をしていると、Raspberry Piがとても熱くなってました。手で触ると、熱さでヒリヒリするくらいです。Homebridgeの設定ページの温度表示は60度近くになってます。心なしか動作が低下して、応答が途切れることもありました。不安定になっているようです。
試しに、USB給電の直径10cmくらいの扇風機で微風を当ててみたところ、温度はどんどん低下して37度くらいになりました。冷却は必須のようです。そこで、基板のまま使うのはやめて、今まで使用していたファン付きケースに入れました。こちらのケースです。
製品には小さなヒートシンクもついていますが、Raspberry Piの冷却には、ヒートシンクを使うよりも風を当てるのが効果的だと思います。このファンは5V用なのですが、前のRaspberry Piでは静音を狙って3.3Vで動かしてました。それも故障の原因だったかもしれません。今回は定格の5Vで動かすことにしました。ファンが小さいので、USB扇風機ほどの効果はありませんでしたが、それでも40度ほどで動作するようになりました。
Raspberry Piの電源
以前のRaspberry Pi 4では、Homebridgeのwebページに「電圧が低下した」という警告が出ることがありました。今回も、出力電流が2.1AのUSB電源アダプタに接続していたら、同様の警告が出ました。初期のUSB電源電力の規格は小さく、どのUSB電源でもRaspberry Piで使えるというわけではないようです。調べてみたところ、USB 2.0の電源電流規格は0.5A、USB 3.0, 3.1 Type-Aでも0.9Aらしいです。Type Cになっても、登場当時の5Vの電流は1.5Aで、後の規格で3Aになったようです。
Raspberry Pi 4には、5V 3Aくらいの電源が必要と巷では言われてます。(実測報告では1Aも必要なかったらしいですが)なので、電流容量の大きいUSB ACアダプタを使う必要があると思われます。手元のUSB電源アダプタを探ったら、Qualcomm quick charge 3.0対応のType-Aソケット式ACアダプタが見つかりました。これと同じものです。
quick chargeという規格は、Type-C PD (Power Delivery)と同様に、機器とネゴシエーションして電圧を上げて供給電力を増やす仕組みです。一見するとただのType-Aコネクタですが、対応デバイスには20Vまでの高電圧を出します。一方で非対応デバイスには5Vだけを供給します。ただquick charge 2.0以降ならば、5Vであっても、Type-C並に3A流せることになってます。
Raspberry Pi専用として売られている電源を買わなくても、入手が容易な、Type-C PD対応のUSB電源か、もしくはquick charge 2.0以降のUSB電源を用意すれば、必要とされる5V 3Aの電力を得られます。
まとめ
壊れてしまったRaspberry Pi 4の交換をしました。問題なく動作しています。Intel NUCを使った時の懸案事項だった、Zigbee2MQTTが10分おきにオフラインになってしまう問題も、発生しなくなりました。Raspberry Piは、もともとは教育現場で子供達が短時間使うために作られたコンピュータです。常時稼働させるためには、環境を整える必要があります。それで、記憶媒体はSDカードより堅牢と思われるUSBメモリにして、冷却ファン付きケースに入れて、電源も強化しました。
コメント
いつも楽しみに拝見させていただいてます。
本ブログを参考にしてラズパイ4にHomebridgeを導入しました。
そこで初歩的な質問で申し訳ないですが、
MosquittoとZigbee2MQTTをインストールする方法ですが、sshでラズパイに接続した上でのコマンドでしょうか?
本ブログのHomebridgeインストール(ラズパイOSではなくHomebridgeOS??)した上でssh接続の方法がわかりません。(「ssh pi@raspberrypi.local」で入れなくて…)
大変お手数ですがご教示いただけると幸いです。
はい、sshでRPiに接続した上での作業です。説明足りなくてすみません、本文に加筆しておきました。ありがとうございます。
Raspberry Pi ImagerでSSHを有効化する設定がしてあれば、sshdは動作しているので接続可能なはずです。もしかしたらraspberrypi.localから数値のIPアドレスへの変換(たぶんmDNSって仕組みで動いていると思います)がうまくいってない可能性があります。RPiにディスプレイを接続すればDHCPで割り当てられたアドレスがわかるので、その数値アドレスにsshしてはどうでしょうか
なんとかインストールできました。
お騒がせしました。