📈

IoT実験:ラズパイで温度取得しグラフ表示 (2)サーバでデータベース

2023/06/19に公開

概要

前回は、ラズパイ(Raspberry Pi、ラズベリーパイ)に温度センサDS18B20を接続して、Pythonスクリプトにより、温度データを取得して画面へ出力しました。

参考:
前回「(1)ラズパイで温度取得」

今回は、サーバの構築を行います。

まず、前回示したシステム内の大まかな機能を、もう一度示します。

  1. ラズパイ:温度センサから温度データを取得 (済み)
  2. ラズパイ:取得した温度データをネットワークを介してサーバへ送信
  3. サーバ:受信した温度データをデータベースへ保存
  4. サーバ:ユーザの要望に応じて温度データを可視化

システム内の大まかな機能
システム内の大まかな機能

本記事では、3番目「サーバ:受信した温度データをデータベースへ保存」と、2番目「ラズパイ:取得した温度データをネットワークを介してサーバへ送信」のサーバ側の“準備”を行います。

なお、3番目は「データベースへ保存」とありまして、システム内の機能としては正しいのですが、ラズパイからデータが送られてきて初めて保存が行われますので、今回おこなう内容は、正確には「サーバにデータベースを用意して、ラズパイからの保存指示に備えておく」となります。

また、こちらも前回示しましたが、最終目的を確認しておきますと、ラズパイで取得した温度データを、下図のように温度の時間的な変化としてグラフで見られるようにすることです(横軸が時間、縦軸が温度)。

グラフによる可視化の例
グラフによる可視化の例

今回の実験環境

サーバ

項目 内容
本体 Windows 10上の仮想マシン(VMware使用)
OS Ubuntu MATE 22.04.2 LTS
IPアドレス 192.168.130.50/24 (固定IPアドレス)

前回も述べましたが、「セキュリティをあまり考慮しなくてもよい」などの理由から社内LANの中にサーバを立てることとします。社内LANのネットワークは 192.168.130.0/24を例としており、サーバのアドレスを固定IPアドレスで設定します。

今回は実験ということで、実機は使わず、Windows上の仮想マシンとしてサーバを用意します。

データベース

項目 内容
データベース InfluxDB 2.7.0-1 (実験時最新のもの)

データベースは、時系列データベースであるInfluxDBを使用します。

前回の実験環境

ラズパイ

項目 内容
本体 Raspberry Pi 3B+
OS Raspberry Pi OS Lite
Release date: May 3rd 2023
System: 64-bit
Kernel version: 6.1
Debian version: 11 (bullseye)
開発言語 Python 3.9.2
ホスト名 raspi01.local
IPアドレス DHCP (192.168.130.0/24)

温度センサ

項目 内容
型番 DS18B20
通信方式 1-wire
抵抗 4.7kΩ(プルアップ用)

InfluxDB

InfluxDBとは

InfluxDBは、時系列データベースと呼ばれる種類のデータベースシステムです。時系列データベースは、日時が伴うデータを扱うことが得意なデータベースです。

たとえば、今回、例として採り上げている温度データは、日時を付加して保存します。これにより、温度の時間的変化をグラフで表示可能となります。このようなデータの保存には、時系列データベースを使用すると効率的です。

InfluxDBは、InfluxData社が開発しているソフトエアです。オープンソースソフトウエア(OSS)のものもあります。

参考:
InfluxDB Times Series Data Platform InfluxData (https://www.influxdata.com/)

InfluxDBは、v1系とv2系で大きく仕様が異なりますので注意が必要です。今回の実験では、v2系を使用します。

Web API

InfluxDBは、WebベースのAPIを装備しています。このため、InfluxDBを起動しておけば、ラズパイなどからは、http://..../... のような形式でアクセスすることで、データを保存することが可能です。

また、データを保存するための入れ物であるバケット(bucket)やメジャメント(measurement)を作成するのも、Web APIを通して行えますし、そのためのツール(Webベースの管理ツール)も付属します。このため、データベースの管理も比較的容易に行えます。

インストールと設定

Ubuntu MATEのインストール

今回は Linux OS である Ubuntu MATE を使用した例を示します。これ以外でも、著名なディストリビューション(Ubuntu、Debian、RedHatなど)であれば、InfluxDBは動作します。

ちなみに、Ubuntu MATE は、Ubuntuの派生品で、本家Ubuntuより軽量だと言われています。上述の通り、Windows上の仮想マシンとして動作させますので、より軽量な MATE を選択しました。

さて、Ubuntu MATE のインストールですが、インターネット上にたくさんの記事がありますので、そちらを参照してください。ここでは省略します。

参考:
Ubuntu MATE For a retrospective future (https://ubuntu-mate.org/)

Ubuntu MATEの設定(固定IPアドレスの設定)

インストールした Ubuntu MATE は、サーバとして使用しますので、固定IPアドレスを設定します。例では「192.168.130.50/24」を設定しますが、それぞれの環境に合わせて読み換えてください。

ネットワーク設定は、今回のバージョンでは、/etc/netplan ディレクトリの設定ファイルにて制御しています。
初期状態は、/etc/netplan/01-network-manager-all.yaml というファイルにて、NetworkManager を使用した自動取得となっています。

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    ...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    ...
    inet 192.168.130.101/24 brd 192.168.130.255 scope global dynamic noprefixroute ens33
    ...

↑ 現状を確認する(上記出力では、インターフェース名「ens33」、IPアドレス「192.168.130.101」であることが分かる。例で使用しているネットワークでは、192.168.130.100以降がDHCPによる自動取得の範囲となっている)

$ cd /etc/netplan/

$ ls
01-network-manager-all.yaml

$ cat 01-network-manager-all.yaml
# Let NetworkManager manage all devices on this system
network:
  version: 2
  renderer: NetworkManager

↑ 初期状態の設定ファイルを確認

$ sudo mv 01-network-manager-all.yaml 01-network-manager-all.yaml.org

↑ 初期状態の設定ファイルを無効化(ファイル名末尾が .yaml 以外で無効化できる)

$ sudo vi 100-ens33-fixed.yaml
network:
   version: 2
   renderer: networkd
   ethernets:
      ens33:
         addresses: [192.168.130.50/24]
         nameservers:
            addresses: [192.168.130.xxx]
         routes:
            - to: default
              via: 192.168.130.xxx

↑ 固定IPアドレスの設定ファイル「100-ens33-fixed.yaml」を新規作成(nameserversはDNSサーバのアドレス、routesはデフォルトゲートウェイのアドレスであるため、自分のネットワーク設定に変更する)

※ viエディタは操作が特殊です。使い慣れたエディタを使用してください。

$ sudo reboot

↑ 一旦再起動

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    ...
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    ...
    inet 192.168.130.50/24 brd 192.168.130.255 scope global ens33

↑ 状態を確認

InfluxDBのインストール

開発元のInfluxDataのサイトにアクセスする
↑ 開発元のInfluxDataのサイトにアクセスする(URL:https://www.influxdata.com/

「Developers」→「InfluxDB OSS」をクリック
↑ 「Developers」→「InfluxDB OSS」をクリック

「Get InfluxDB」をクリック
↑ 「Get InfluxDB」をクリック

Platformから「Ubuntu & Debian」を選択
↑ Platformから「Ubuntu & Debian」を選択

表示されたスクリプトをコピーし、、、
↑ 表示されたスクリプトをクリップボードにコピーし、、、

$ cd ~

$ vi inst-influxdb2.sh

↑ エディタにペーストして保存する。ファイル名は、たとえば「inst-influxdb2.sh」

$ bash ./inst-influxdb2.sh
...

↑ 保存したシェルスクリプトを実行する

$ dpkg -l | grep influxdb
ii  influxdb2                                2.7.0-1                                 amd64        Distributed time-series database.
ii  influxdb2-cli                            2.7.1-2 

↑ インストールされたことを確認する(バージョン番号は、その時点の最新となる)

$ sudo reboot

↑ 一旦再起動する

$ systemctl status influxdb
● influxdb.service - InfluxDB is an open-source, distributed, time series database
     Loaded: loaded (/lib/systemd/system/influxdb.service; enabled; vendor preset: enabled)
     Active: active (running) since Xxx 20xx-xx-xx xx:xx:xx JST; 1min 5s ago
       Docs: https://docs.influxdata.com/influxdb/
    Process: 1008 ExecStart=/usr/lib/influxdb/scripts/influxd-systemd-start.sh (code=exited, status=0/SUCCESS)
   Main PID: 1035 (influxd)
      Tasks: 8 (limit: 4517)
     Memory: 120.7M
        CPU: 3.046s
     CGroup: /system.slice/influxdb.service
             └─1035 /usr/bin/influxd
...

↑ サーバの状態を確認する

InfluxDBの管理画面と初期ユーザ設定

InfluxDBの設定は、Webブラウザを使用して、Webベースのサーバ管理ツールを開いて行います。

InfluxDBのサーバ管理ツールのURLは、http:// サーバのIPアドレス :8086/ です。
今回の例では、http://192.168.130.50:8086/ となります。

また、上記URLにアクセスすると、最初に初期ユーザの設定を行う画面となりますので、今回の例では、以下の情報を使用します。

項目 意味
Username db_user ユーザ名
Password
Confirm Password
(パスワード) db_userのパスワード
Initial Organization Name my_org 組織名
Initial Bucket Name my_bucket バケット(DB)名

このユーザアカウントは、サーバ管理ツールにログインする際に、毎回使用しますので、ユーザ名およびパスワードを忘れないようにしてください。

サーバ管理ツールのURLにアクセスし、「GET STARTED」をクリック
↑ サーバ管理ツールのURL(http://サーバのIPアドレス:8086/)にアクセスし、「GET STARTED」をクリック

初期ユーザ設定
↑ 初期ユーザ設定を行う。上表の情報を入力し、「CONTINUE」をクリック

「QUICK START」をクリック
↑ 「QUICK START」をクリック

メイン画面
↑ メイン画面になる

APIトークンの生成(ラズパイからデータ送信する準備)

InfluxDBへデータを保存する際、http://.../... のようにWeb APIを使用してデータをサーバに送信して保存します。
この際、誰でもデータを保存できてはセキュリティ上問題ですので、何らかの認証が必要です。

InfluxDB v1系ではユーザ名とパスワードにより認証し、データ保存を許可していました。これに対して、今回使用している v2系では、APIトークンを使用して認証を行います。

実際に生成されるAPIトークンは、ランダムな文字の羅列となります。これを一旦ファイルなどに保存しておき、後でラズパイに設定します。
これにより、ラズパイからデータ送信する際には、設定したAPIトークンにより認証したあとに、実際の温度データが送信されます。

APIトークンの生成は、サーバ管理ツールにて行うことができます。

ここでは、例として以下のような権限のAPIトークンを生成します。

項目 内容 備考
対象バケット my_bucket
権限 読み取り/書き込み許可
APIトークンの説明 my_bucket_rw 自分で見分けられるものなら何でも良い

メイン画面から「Load Data」→「API Tokens」をクリック
↑ メイン画面から「Load Data」→「API Tokens」をクリック(「Load Data」は上向き矢印(↑)のようなアイコン)

「GENERATE API TOKEN」→「Custom API Token」クリック
↑ 「GENERATE API TOKEN」→「Custom API Token」クリック

「my_bucket」の行の「Read」列および「Write」列にチェックを入れる
↑ 「Description」に「my_bucket_rw」を入力し、「my_bucket」の行の「Read」列および「Write」列にチェックを入れ、「GENERATE」クリック

APIトークンをクリップボードへコピー
↑ APIトークンが生成されるので、「COPY TO CLIPBOARD」をクリックしてコピーする(警告メッセージが表示されているが意訳すると「このAPIトークンは、二度と見ることはできないので、今、コピーしろ!」となっている)

$ vi ~/api_token.txt

↑ クリップボードへコピーしたAPIトークンをファイルへ保存する。(Linuxなら何かエディタを開いてペースト、Windowsならメモ帳などへペーストして保存する)

次回

以上で終了です。
次回は、ここで生成したAPIトークンをラズパイに設定し、温度データをサーバへ保存する部分を構成します。

Discussion