【Home Assistant(Hass.io)】
汎用InfluxDBサーバーを立ち上げる
「Home Assistant(Hass.io)でホームオートメーション 再起動!」シリーズです。
Home Assistantに供給する気象データなどの格納先として、独立した時系列データベースサーバを立ち上げましょう。
- 【Home Assistant(Hass.io)】 汎用InfluxDBサーバーを立ち上げる
- 0. なぜ独立サーバーを?
- 1. Raspberry PiをHDDから起動する
- 2. InfluxDBを導入する
- 3. データベースの設定
- 4. InfluxDB覚書
- 5. おわりに
0. なぜ独立サーバーを?
最初にHome Assistant用のセンサー情報収集の仕組みを作ったときは、Raspberry Pi Zero Wに「Bluetooth Low Energyでセンサーと接続する仕組み」と「時系列データベース」の二つを一緒に押し込みました。
【Home Assistant(Hass.io)でホームオートメーション】2. 環境センサー(Omron)を接続 ー 中編 - コモノポリタン
ところが最近、洗面台の裏にあるそのRaspberry Pi Zero Wが良く落ちます。やはりSDカードにDB(InfluxDB)を載せてガリガリ読み書きさせるとダメなのでしょうか?
本体のHass.ioのサーバも同様の懸念があるらしいので、「Raspberry PiはすべからくSDカードで運用しない」というのが根本的解決のような気がします。が、しかし、
- 非常に残念なことにHass.ioはまだRaspberry PiのUSBブート(SDカード無し運用)に対応していない
- 洗面台裏サーバ(Raspberry Pi Zero W)はスペースの都合でSDカード以外は対応できない*1
という事情があるので、次善の策として、ガリガリとデータを読み書きするDBを分離して、独立したDBサーバを作りそこに書き込んで貰おうという作戦です。
まあ、Raspberry Piが落ちるのは他の原因かもしれませんが、とりあえず可能性を一つ潰したいということです。これがデータベースを分離して独立にする、という今回の理由の一つ。
さて、さすがに安定運用を目指して分離したDBサーバがSDカードに依存していたりすると、何をしているか分からなくなるので、Raspberry PiをSDカードで運用するのを辞めてUSB HDD(SSDでも良いと思いますが手元に無し)で運用する仕組みを構築したいと思います。
1. Raspberry PiをHDDから起動する
1.1 HDD起動可能かの確認
Raspberry Pi 3B+は、最初からUSBブート可能に設定されています。Raspberry Pi 3BはゴニョゴニョするとUSBブート可能になります。それ以外のRaspberry Piは、4も含めてUSBブートには対応していません(追記:Pi4は対応したみたいですが、試してません)。
1.2 USB HDDの準備
安定運用のためにUSB HDDからブートしたいので、USBバスパワーでの運用は避けます。外部電源で稼働するUSB HDDを選びましょう。今回は押し入れから発掘した500GBのUSB HDD(Buffalo HD-CE500U2)*2を使いました。
「bootエリアはFAT32でないとだめなのでFAT32でフォーマットしておくべし」しかしながら「Windowsでは32GBまでしかフォーマットできないので32GB以上の場合は何らかのツール(例えばFAT32Formatter
)つかうべし」などと言われております。
実はbalenaEtcherでOSイメージを焼くと、bootドライブをFAT32で書き込んでくれるので、単にWindowsの「ディスクの管理」でUSB HDDのパーティションを削除して「未割当」に戻して置くだけで大丈夫でした。
1.3 USB HDDにRaspberry Pi OS(32bit) Liteイメージを焼く
HDDから起動できるようにするために、色々とやり方がネットにありましたが、balenaEtcherでSDカードにRaspberry Pi OS(32bit) Lite(旧Raspbian Lite)のイメージを焼くのとまったく同じ手順で出来ました。
- Raspberry Pi OS(32bit) LiteのイメージをRaspberryのサイトからダウンロード
- balenaEtcherを起動して、Raspberry Pi OS(32bit) Liteのイメージを選択して、次にHDDを書き込み先に指定します。Flash!のボタンを押すと「Drive XXXX is unusually large for an SD card or USB stick. Are you sure ....(なんかSDカードに思えないでっかいディスクだけど大丈夫かぁ?)」と言われますが、そこはContinueで。
- しばらくすると書き込みが終わります。
私が今回使ったUSB HDDは容量が500GBでしたが、balenaEtcherでイメージを焼き付けるとディスクのパーティション構成は、
という感じになりました。
(USB HDDをWindows PCに繋ぎなおして、ディスク管理で確認。raspios buster lite 2020-05-27)
一旦PCにUSB HDDを繋いで、bootエリアにssh
という空ファイルを作っておきます。これがないとsshで接続できませんからね。
1.4 Rasbperry Piに接続して起動
SDカードを挿さずに、USB HDDをRaspberry Pi 3B/3B+に挿し(とUSB HDDの電源を忘れずにコンセントに挿し)、LANを繋いでRaspberry Piの電源を入れます。何度か(4度ほど?)USB HDDの電源が切れる音がして、都度立ち上がり直して、LANの所がピカピカしだします。落ち着いたところでsshで接続(pi/raspberry)します。
ログインしたらRaspberry Pi OSの初期設定をしておく。
$ sudo raspi-config
設定は次の通り。
- 1. Change User Password:
- 新しいパスワードを入力
- 4. Localization Option:
- "I1 Change Locale"で、en_US.UTF-8 と ja_JP.UTF-8 を選択(en_GB.UTF-8は外しておきましょう)。選択はスペースバーで。Default localeには、jp_JP.UTF-8を指定
- 4 Localization Option:
- "I2 Change Timezone"で Asia/Tokyoを選択。
- 4 Localization Option:
- "I4 Change WLAN Country"で"JP Japan"を選択。無線LANを使わないなら不要ですが。
- 5 Interfacing Options:
- “P2 SSH” でonにする
ちなみにfdiskでどんなパーティション構造になっているか確認すると、こんな感じでした。
Device Boot Start End Sectors Size Id Type /dev/sda1 8192 532479 524288 256M c W95 FAT32 (LBA) /dev/sda2 532480 976773167 976240688 465.5G 83 Linux
/dev/sda2が / (root)
にマウントされます。広々ですね。
balenaEtcherで焼いたイメージでは、bootエリア256MB、それ以外のRaspberry Pi OSの領域が1.47GBとなっていましたが、しらないうちにHDDのほぼ全領域が/(root)
になっています。実は今のRaspberry Pi OSは、未割当領域が後ろに余っていると初回立ち上げ時にOSの領域を自動的に最大サイズまで拡大する設定になっている、とのこと。便利ですね。らくちん、広々。
2. InfluxDBを導入する
時系列データを簡単に扱えるデータベースとしてInfluxDBがあります。 InfluxDB: Open Source Time Series Database | InfluxData
今回は今後の拡張も考えて、時系列データベースのInfluxDB、情報収集用のTelegraf、可視化用のGrafanaをセットで導入します。
2.1. InfluxDB v1.8インストール
InfluxDBの安定最新版はv1.8なのですが何故か辿りにくいところにインストールガイドがあります。基本的には下記の通りすすめます。 Install InfluxDB OSS | InfluxDB OSS 1.8 Documentation
InfluxDB v1.8をインストールする前に、まずOSのアップデートをしておきます。
$ sudo apt-get update $ sudo apt-get upgrade
2020-05-27のRasPiOSはDebian Busterベースなので、下記のInfluxDataのリポジトリを設定しておく。
$ wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add - $ echo "deb https://repos.influxdata.com/debian buster stable" | sudo tee /etc/apt/sources.list.d/influxdb.list
追記(2021/12/13):一回壊れたので再インストールしてみた。RaspiOSがBullseyeになってkeyの管理が変わったりしたので下記でリポジトリ設定。ちょっと長い…。
$ sudo su # wget -qO- https://repos.influxdata.com/influxdb.key | gpg --dearmor > /etc/apt/trusted.gpg.d/influxdb.gpg # echo "deb [signed-by=/etc/apt/trusted.gpg.d/influxdb.gpg] https://repos.influxdata.com/debian bullseye stable" > /etc/apt/sources.list.d/influxdb.list
influxDBを導入。
$ sudo apt-get update && sudo apt-get install influxdb
influxDBをサービス登録して自動起動できるようにしておく。
$ sudo systemctl unmask influxdb.service $ sudo systemctl start influxdb $ sudo systemctl enable influxdb.service
systemctl status influxdb
でinfluxdbの起動状況を確認して、active (running)
となっていたらOKです。
2.2. Telegraf v1.14インストール
データ収集用エージェントのtelegrafは今回は使いませんが入れておきます。 https://docs.influxdata.com/telegraf/v1.14/introduction/installation/:embed: title
$ sudo apt-get update && sudo apt-get install telegraf $ sudo systemctl start telegraf $ sudo systemctl enable telegraf.service
これもsystemctl status telegraf
でtelegrafの起動状況を確認して、active (running)
となっていたらOKです。
2.3. Grafana v7.0.1インストール
追記(2021/12/13):Home AssistantのGrafanaアドオンを使うときは入れなくてもよし。
時系列データ可視化ツールのGrafanaも入れておきます。
Grafana® Features | Grafana Labs
Raspberry Pi(ARM)へのインストールは基本下記のとおりです。 Install on Debian/Ubuntu | Grafana Labs
$ wget -qO - https://packages.grafana.com/gpg.key | sudo apt-key add - $ echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list $ sudo apt update && sudo apt-get install grafana $ sudo systemctl start grafana-server $ sudo systemctl enable grafana-server.service
http://localhost:3000/
でアクセスできればGrafanaはインストールできています。
3. データベースの設定
3.1. ユーザ設定
InfluxDBへのhttpおよびCLIアクセスを制限するために、まずアクセスするユーザ(今回はroot)を作成する。
$ influx > create user root with password 'xxxxxx' with all privileges (管理ユーザ作成。パスワードをシングルクォーテーション(')で囲うことを忘れずに) > set password for "root"='xxxxxxxx' (パスワード変更) > drop user "root" (ないと思うけど、rootユーザを削除したいとき)
3.2 アクセス制御
デフォルトではInfluxDBはアクセス制御が効いていない(=だれでもアクセスできる、ま、便利ではありますが)ので、アクセス制御を有効にする。InfluxDBの設定ファイル(/etc/influxdb/influxdb.conf
)をエディタ(nanoなど)で編集する。
$ sudo nano /etc/influxdb/influxdb.conf
後ろの方にある[http]セクションのauth-enabledをtrueにする。
(略) [http] auth-enabled = true (略)
confファイルを編集したら、influxdbサービスを再起動する。
$ sudo systemctl restart influxdb
CLI (Command Line Interface)でInfluxにアクセスするときは、user/passwordが必須になる。
$ influx -precision rfc3339 -username root -password 'xxxxxxxxx'
パスワード間違っていても入れるが、操作できない。
ERR: authorization failed
なんて言われる。
4. InfluxDB覚書
CLI (Command Line Interface)でInfluxにアクセスする。-precision rfc3339
は、タイムスタンプの可読性を上げるおまじない。
$ influx -precision rfc3339 -username root -password 'xxxxxxxxx'
データ操作以外の操作。
> show databases (データベースの一覧) > use <database> (データベースの指定。これをやらないと以下のコマンドは使えません) > show measurements (measurement(リレーショナルDBの「表(table)」みたいなもの)の一覧) > show tag keys [from <measurements] (tag(リレーショナルDBの「キー」みたいなもの)の名前の一覧) > show tag values [from <measurements] with key=<tab> (あるtagに格納されている値(キー値)の一覧) > show field keys [from <measurements] (fieldの名前の一覧) > select count(<field key>) from <measurement> (格納されているデータ総数を表示) > select first(<field key<) from <measurement> (最初のデータの日付の確認) > create database home_assistant (データベースの作成) (influxdbインテグレーションを使うときは上記データベースが必要)
データのバックアップとリストア。本来的にはデータの保管だが、今回はデータの引っ越しに使用。
今、wxbeacon2のデータを格納しているinfluxdbが稼働しているRaspberry PiのInfluxDBの設定ファイル(/etc/influxdb/influxdb.conf
)のbind-address
のコメントを外して、汎用InfluxDBサーバーからリモート(かつライブ)でバックアップが取れるようにする。
bind-address = "192.168.xx.xx:8080"
引っ越し先のRaspberry Pi(汎用InfluxDBサーバー)から今までのInfluxDBに接続してバックアップし、書き戻す。
$ influxd backup -database weather -portable -host 192.168.xx.xx:8080 ./backup $ influxd restore -db weather -portable -newdb sensors ./backup
1年弱分(3台)のデータでどちらも1分以内に終了。
5. おわりに
センサーデータの格納場所を作り直したので、次は、Omronのセンサーサーバのアップデートかな。