Smart HomeをDIYする

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

スマートホームの電気代

スマートホームDIYするために、Raspberry PiやESP32などを常時稼働させることになります。PCやNASをサーバにすることもあります。HomePodやApple TVも常時通電してます。これらの電気代ってどのくらいになるのか測定してみました。結果は、ESP32が年額67円、Raspberry Pi 4では450円くらいです。

(続きはこちら

diysmartmatter.com

Raspberry Pi上のHomebridge関連設定をバックアップする

こちらに移転しましたので自動転送します。

Raspberry Pi 4で動かしている、Homebridge, MQTT, Zigbee2MQTTの設定をバックアップすることを考えました。Raspberry Pi 4はUSBメモリで起動しているので、SDスロットは未使用でした。そこでここにSDカードを挿してcronで定期バックアップします。

バックアップは大事

Raspberry Piは元々教育用に開発されたので、24時間運用の長期稼働サーバには向いていないのかもしれません。対策なしで長期間使用すると、発熱とか電源で問題を引き起こすことがあります。さらに一般のSDカードはOS稼働ドライブとして酷使されることを想定していないためか、破損することも多いです。SDカードは今まで3回くらい壊しています。それで現在は、ファンをつけて、余裕のある電源にして、USBメモリ起動で動かしています。

diysmarthome.hatenablog.com

この時の経験で、起動ドライブが全損しても、

  • 新しいドライブにRasberry Pi ImagerでHomebridgeを入れる
  • apt installでMQTTを入れる
  • git cloneでZigbee2MQTTを入れる

という手順で、30-40fくらいでまっさらな状態に復帰できると思ってます。ただこの後、設定を全部やり直すことになると面倒です。設定ファイルだけは、最新版とはいかなくても、せめて前日分くらいはバックアップしておきたいところです。

バックアップに必要な設定ファイル

Homebridge, MQTT, Zigbee2MQTTに必要な個々のスマートホーム環境設定ファイルは、以下にあります。

  • Homebridge: /var/lib/homebridge/backups/ 以下にあるファイル
  • MQTT: /etc/mosquitto/ 以下にあるファイル
  • Zigbee2MQTT: /opt/zigbee2mqtt/data/  以下にあるファイル

これらを定期的にバックアップしておけば良いです。

Homebridgeに関しては、Web UIが全体のバックアップを定期的に /var/lib/homebridge/backups/ 以下に作ってくれてます。Raspberry Piの場合、ホームディレクトリにも.homebridgeという名前でシンボリックリンクされてます。ここには以下のように、config.jsonの履歴と、homebridge全体のバックアップの履歴が残ってます。このバックアップファイルがあれば、Web UIからいつでもバックアップ時の状態に復帰できます。

/home/pi/.homebridge/backups
|--config-backups
|  |--config.json.1670586132270
|  |--config.json.1670587369395
|  |--config.json.1670587421278
|  |--config.json.1670589306480
|  |--config.json.1670589675541
|  |--config.json.1670590012329
|  |--config.json.1670673111798
|  |--config.json.1670673396960
|  |--config.json.1670673600936
|  |--config.json.1672312854904
|  |--config.json.1672314886473
|  |--config.json.1672314962236
|  |--config.json.1672315045610
|  |--config.json.1672315399117
|--instance-backups
|  |--homebridge-backup-0E9D862FB5B5.1672075298214.tar.gz
|  |--homebridge-backup-0E9D862FB5B5.1672161696499.tar.gz
|  |--homebridge-backup-0E9D862FB5B5.1672248100850.tar.gz
|  |--homebridge-backup-0E9D862FB5B5.1672333504456.tar.gz
|  |--homebridge-backup-0E9D862FB5B5.1672419904107.tar.gz
|  |--homebridge-backup-0E9D862FB5B5.1672506303962.tar.gz
|  |--homebridge-backup-0E9D862FB5B5.1672592703773.tar.gz
|  |--homebridge-backup-0E9D862FB5B5.1672679104020.tar.gz

一方、MQTTの設定ファイルは、/etc/mosquitto/mosquitto.confにあります。ついでなので、/etc/mosquitto/以下を全部バックアップすることにします。

最後のZigbee2MQTTの設定ファイルやデータベースは、/opt/zigbee2mqtt/data/  以下にあります。Zigbee2MQTTのバージョンアップの方法のガイドでも、これをバックアップして戻すという手順が紹介されてます。

www.zigbee2mqtt.io

なので、/opt/zigbee2mqtt/data/  以下をバックアップしておけば大丈夫と思われます。

SDカードをマウントする

前述のように、今のRaspberry Pi 4ではSDカードを使わずにUSBメモリを使ってます。なのでSDカードソケットが空いてます。ここにSDカードを入れてバックアップ先にします。容量も信頼性も少なめで良いので、手元にあった適当なmicro SDカードを使いました。

これをRaspberry Pi 4に挿して、lsblkコマンドで確認します。SDカードを挿す前は、以下のようでしたが、

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    1 28.7G  0 disk 
├─sda1   8:1    1  256M  0 part /boot
└─sda2   8:2    1 28.4G  0 part /

SDカードを刺した後は、以下のようになりました。

$ lsblk 
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT 
sda 8:0 1 28.7G 0 disk 
├─sda1 8:1 1 256M 0 part /boot 
└─sda2 8:2 1 28.4G 0 part / 
mmcblk0 179:0 0 3.7G 0 disk 
└─mmcblk0p1 179:1 0 3.7G 0 part

mmcblk0p1という3.7GBのデバイスが見えるようになってます。これがSDカードなので、マウントします。まずはマウントポイントを/mntの下に作って、

$ sudo mkdir /mnt/sd

マウントします。

$ sudo mount /dev/mmcblk0p1 /mnt/sd -o uid=1000,gid=1000

ここでは、今ログインしているユーザが読み書きできる設定でマウントしました。 今ログインしているユーザのuidとgidは、

$ id

コマンドでわかるのですが、特にユーザを追加していなければ1000になっているはずです。これで/mnt/sd/以下にマウントされたSDカードに読み書きできるようになりました。

ただ、このままだと再起動するたびにmountコマンドを発行する必要があります。自動的にマウントするように、/etc/fstabの最後に以下の行を追加しておきます。

/dev/disk/by-uuid/1234-5678 /mnt/sd vfat uid=1000,gid=1000 0 0 

この行の最初のパラメータは、mountコマンドの時と同様に/dev/mmcblk0p1でも良かったかもしれませんが、より確実かなと思いuuidにしました。uuidは、

$ ls -l /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 15 Dec 20 11:29 1234-5678 -> ../../mmcblk0p1

などすれば確認できます。

rsyncコマンドでバックアップ

バックアップの方法はたくさんありますが、単純にrsyncコマンドを使いましt。rsync -a --delete {コピー元} {コピー先}コマンドで、コピー元のディレクトリを、コピー先に複製できます。同じものがあればスキップしてくれて、コピー元にないファイルは消してくれます。なので、2つのディレクトリの内容を同期させるのに適したコマンドです。

例えば、

$ rsync -a --delete /var/lib/homebridge/backups/ /mnt/sd/backup/homebridge/
$ rsync -a --delete /opt/zigbee2mqtt/data/ /mnt/sd/backup/zigbee2mqtt/
$ rsync -a --delete /etc/mosquitto/ /mnt/sd/backup/mosquitto/

とすれば、Homebridgeサーバに必要な設定ファイル類をSDカードのbackupディレクトリ以下にコピーしてくれます。

rsyncコマンドは、sshのファイルコピーもしてくれます。例えばhoge.comというマシンに公開鍵認証で(パスワード不要で)sshできるように設定してあれば、

$ rsync -a --delete /var/lib/homebridge/backups/ hoge.com:backup/homebridge/
$ rsync -a --delete /opt/zigbee2mqtt/data/ hoge.com:backup/zigbee2mqtt/
$ rsync -a --delete /etc/mosquitto/ hoge.com:backup/mosquitto/

とすれば、ネットワーク先のbackupディレクトリ以下にバックアップできます。

cronで自動実行

バックアップコマンドをまとめて、以下のようなバックアップ用シェルスクリプトを作りました。Homebridge, Zigbee2MQTT, Mosquittoの設定ファイルを、上記で設定したSDカードと、ネットワーク上のマシン(仮にhoge.comとしてます)にバックアップします。

#!/bin/sh
### backup to an SD card ### date >> /mnt/sd/backup/lastbackup.txt rsync -a --delete /var/lib/homebridge/backups/ /mnt/sd/backup/homebridge/ rsync -a --delete /opt/zigbee2mqtt/data/ /mnt/sd/backup/zigbee2mqtt/ rsync -a --delete /etc/mosquitto/ /mnt/sd/backup/mosquitto/ ### backup to a remote server ### rsync -a --delete /var/lib/homebridge/backups/ hoge.com:backup/homebridge/ rsync -a --delete /opt/zigbee2mqtt/data/ hoge.com:backup/zigbee2mqtt/ rsync -a --delete /etc/mosquitto/ hoge.com:backup/mosquitto/ scp /mnt/sd/backup/lastbackup.txt hoge.com:backup/.

バックアップの履歴がわかるように、dateコマンドの内容をlastbackup.txtというファイルに追加保存してます。履歴ファイルはscpコマンドで、リモートサーバにも複写しました。このスクリプトを/usr/local/bin/backupHB.shとして保存しました。

次に、このスクリプトを夜中に自動実行するよう、crontabに設定しました。crontab -eで編集できるファイルの最終行に、以下の行を追加します。

59 2 * * * /usr/local/bin/backupHB.sh

これで、毎日2:59amに、backupHB.shファイルが実行されます。

まとめ

Raspberry Pi上のHomebridge, Zigbee2MQTT, Mosquittoの設定をSDカードにバックアップするようにしました。ついでにネットワーク上のサーバにもバックアップするよう設定しました。インターネット上やLAN内にsshできるサーバが無ければ、SDカードでも十分かと思います。また、サーバをRaspberry PiのSDカードで稼働させている場合は、この記事とは逆に、バックアップ先にUSBメモリを使うのも良いと思います。

遠隔地へのバックアップは安全性が高いですが、ネットの不調でいざという時にバックアップできていないこともあります。その点、SDカードやUSBメモリは、実体があるだけに安心感があります。