Raspberry Pi、Docker、Metabaseを使って、温度情報を可視化しよう

electric

今回は、以下記事で取得した温度データを、
Databaseに保存し、BI(Business Intelligence)ツールのmetabaseを使って、
グラフで可視化していきます。

Raspberry Piを使って、【温度・湿度】をブラウザ表示
今回は、温度湿度センサーを使って、部屋の温度・湿度をブラウザに表示します。この記事では単に部屋の温度・湿度をブラウザに表示するだけですが、将来的には、温度・湿度をDataBaseに保存したり、BI(Business Intelli...

DataBaseやmetabaseは、
docker, docker-composeを使ってアプリを構築していきます。

その他、DataBase(MySQL)をブラウザで管理することが出来るphpMyAdminも、
Dockerを使って構築していきます。

Docker・Docker Composeインストール

Dockerって何?

Dockerって何?という方は、以下記事を見てみてね。

環境構築が驚くほど簡単になる【 Docker 】の概要説明
開発環境を構築するのが大変、開発する人の分だけ、開発環境を構築するのに時間が掛かる。そんな経験ないでしょうか?そんな方には、dockerがお勧めです!dockerって何?dockerって聞いたことあるけど、何がいいのか良く分かって...
Dockerの全体像を理解する為に【ライフサイクル】と【コマンド】を図解で説明
Dockerとは??という方は、環境構築が驚くほど簡単になる【 Docker 】の概要説明の記事を参照ください。Dockerのイメージやコンテナを操作する際、"docker run ・・・" などのコマンドを使います。イメージやコ...
Dockerコンテナが簡単に作れる!【Dockerfile 】サンプル
Dockerとは??という方は、環境構築が驚くほど簡単になる【 Docker 】の概要説明の記事を参照ください。Dockerfileをさくっと作りたいが、Dockerfileに記載する命令って何があって、どうやって使うんだっけ?と...

Dockerインストール手順

Dockerのインストールを行うには、
以下記事に記載の手順で行います。

Install Docker Engine on Debian
Instructions for installing Docker Engine on Debian

インストールには、以下コマンドを実行します。

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

インストールが完了したら、
バージョンを確認してみましょう!

$ docker -v
Docker version 20.10.10, build b485636

アクセス権限付与

インストールをしただけでは、
pi ユーザは、Dockerへアクセスする権限がありません。
そこで、以下コマンドを使って、権限を付与します。

$ sudo usermod -aG docker pi

# pi ユーザを docker グループに追加する命令です。

Docker Composeインストール手順

Docker Composeのインストールを行うには、
以下記事に記載の手順で行います。

Docker Compose のインストール — Docker-docs-ja 19.03 ドキュメント

以下コマンドを使ってインストールを行います。

$ sudo pip3 install docker-compose

インストールが完了したら、
バージョンを確認してみましょう!

$ docker-compose -v
docker-compose version 1.29.2, build unknown

Docker・Docker Compose 動作確認

プログラミング

以下ディレクトリ通り、ディレクトリとファイルを作成する。

/home/pi/work/temp/
└ test/
  ├ DockerFile
  └ docker-compose.yml

docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
      - "8080:80"

DockerFile

FROM httpd:alpine

実行・確認

docker-compose.ymlファイルがあるディレクトリまで移動し、
以下コマンドを実行する。

$ docker-compose up -d --build

パソコン or スマホのブラウザを開き、
Raspberry Pi の IPアドレス:ポート(デフォルト8080)でアクセスします。
例えば、
http://192.168.11.9:8080
です。

ブラウザの画面に、
「It works!」の文字が表示されれば成功です。

表示を確認したら、以下コマンドでコンテナを落としておきましょう。

$ docker-compose down

DataBaseコンテナの作成

Docker、 Docker Composeのインストールを終え、
Dockerコンテナを作る準備が出来ました。

この章では、
DataBaseのコンテナを作っていきます。

まず、DataBaseのベースとなる、イメージですが、
以下コマンドを実行すると、armv7l であり、
私のラズパイのCPUは、ARM32bitであることがわかりました。

そこで、ARM32bitで動作するイメージを使う必要があります。

$ uname -m

プログラミング

以下ディレクトリ通り、ディレクトリとファイルを作成する。

/home/pi/work/temp/
└ docker/
  └ docker-compose.yml

docker-compose.yml

version : "3"
services:
  db:
    image: hypriot/rpi-mysql
    restart: always
    ports:
      - 3306:3306
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD={root password}
      - MYSQL_DATABASE=temperature
      - MYSQL_USER=pi
      - MYSQL_PASSWORD=raspberry

volumes:
  db-data:

実行・確認

docker-compose.ymlファイルがあるディレクトリまで移動し、
以下コマンドを実行する。

docker-compose up -d --build

以下コマンドでコンテナが起動しているか確認しましょう。

$ docker ps

phpMyAdminコンテナの作成

以下コマンドを実行し、phpMyAdminコンテナを起動します。

$ docker run --restart=always --name phpmyadmin_temp -d -e PMA_HOST=mysql -p 8080:80 --net docker_default phpmyadmin

以下コマンドでコンテナが起動しているか確認しましょう。
STATUSが 「Up ***」と表示されていたら起動成功です。

$ docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS         PORTS                                       NAMES
7be73122cde2   phpmyadmin          "/docker-entrypoint.…"   13 seconds ago   Up 3 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp       phpmyadmin_temp

DataBaseテーブル・カラム追加

では、phpMyAdminを使って、DataBaseへテーブルやカラムを追加していきます。

パソコン or スマホのブラウザを開き、
Raspberry Pi の IPアドレス:ポート(デフォルト8080)でアクセスします。
例えば、
http://192.168.11.9:8080
です。

上記章にて、DataBaseコンテナを設定した以下値を使って、
ログインを行います。

- MYSQL_USER=pi
- MYSQL_PASSWORD=raspberry

左の temperature データベースを選択し、
右下のテーブルを作成で、
名前:temperature、カラム数:4
と設定し、実行を押します。

これでテーブルが作成されました。

次に、左のtemperatureテーブルを選択し、
以下通り、カラムを追加します。

最後に、idに以下画面の通り、AUTO_INCREMENT を設定すれば完了です。

左側のtemperatureテーブルを選択し、
右側の「構造」タブを選択します。

カラム:id の「変更」ボタンを押します。

右側にある、A_I のチェックボックスを押して、
「保存する」ボタンを押したら、
DataBaseの設定の完了です。

PythonからDataBaseアクセス

pythonからMySQL/MariaDBにアクセスするのに、
「mysql-connector-python」ライブラリを利用します。

ライブラリインストール

以下コマンドでライブラリをインストールします。

$ pip3 install mysql-connector-python

プログラミング

以下ディレクトリ通り、ディレクトリとファイルを作成する。

/home/pi/work/temp/
└ db.py

db.py

# coding:utf-8

import mysql.connector as mydb
import sys
import datetime


def connect_db():

  host = 'localhost'
  port = '3306'
  user = 'pi'
  password = 'raspberry'
  dbname = 'temperature'

  try:
    resconn = mydb.connect(
      host = host,
      port = port,
      user = user,
      password = password,
      database = dbname
    )
  except Exception as e:
    print('Error: DB Connection Error', e)
    sys.exit(1)

  # 接続が切れた場合に自動的に再接続する
  resconn.ping(reconnect=True)

  return resconn


def insert_temp(conn, temp, hum):
  cur = conn.cursor()

  dt = datetime.datetime.now()
  try:
    cur.execute("INSERT INTO temperature (date, temp, hum) VALUES (%s, %s, %s)", (dt, temp, hum))
    conn.commit()
  except Exception as e:
    print('Error: Insert Data Error', e)
    conn.rollback()
    sys.exit(1)


if __name__ == "__main__":
    conn = connect_db()
    insert_temp(conn, 20.2, 64.7)

実行・確認

以下コマンドでプログラムを実行します。

python3 db.py

では、実際にDataBaseの中に、
insert_temp(conn, 20.2, 64.7) の通り、
temp: 20.2, hum: 64.7
の値が入っているか、phpmyadminで確認してみましょう。

パソコン or スマホのブラウザを開き、
Raspberry Pi の IPアドレス:ポート(デフォルト8080)でアクセスします。
例えば、
http://192.168.11.9:8080
です。

以下画面の通り、
左側のtemperatureテーブルを選択すると、
右側の一番下の行に、
期待通り、 temp: 20.2, hum: 64.7
が格納されているのが確認出来れば成功です。

定期的に温度をDataBaseに格納

以上の機能をまとめて、
定期的(15分周期)に温度湿度センサー情報をDataBaseに格納していきます。

プログラミング

以下ディレクトリ通り、ディレクトリとファイルを作成する。
この章では、以下赤字のファイルを修正します。

/home/pi/work/temp/
├ docker/
│  └ docker-compose.yml
├ temperature.py
├ db.py
└ app.py

app.py

本モジュールで行うことは、
ラズパイに接続した温度湿度センサーの値を取得し、
DabaBaseに格納します。

# -*- coding: utf-8 -*-

import temperature
import db

if __name__ == '__main__':

    conn = db.connect_db()
    temp, hum = temperature.get_temp_hum()
    print(temp)
    db.insert_temp(conn, round(temp, 1), round(hum, 1))

temperature.py は、
以下記事で作成したものを利用します。

Raspberry Piを使って、【温度・湿度】をブラウザ表示
今回は、温度湿度センサーを使って、部屋の温度・湿度をブラウザに表示します。この記事では単に部屋の温度・湿度をブラウザに表示するだけですが、将来的には、温度・湿度をDataBaseに保存したり、BI(Business Intelli...

定期的にプログラムを実行する

定期的にプログラムを実行するには、cron と呼ばれる、
UNIX OS(ラスパイOS)にで標準で入っているプログラムを使用します。
cronを使用すれば、スケジュールに従って、指定したプログラムを実行してくれます。

コマンドラインから、以下コマンドを実行します。

crontab -e

ファイルが開いたら、以下を追記し、
ファイルを保存・終了します。

以下は、「15分周期で、 /home/pi/work/temp/app.py を実行して」という命令です。
具体的には、毎時、00分、15分、30分、45分にプログラムを実行します。

*/15 * * * * /usr/bin/python3 /home/pi/work/temp/app.py

動作確認

以下記事の通り、ラズパイと温度湿度センサーを接続します。

Raspberry Piを使って、【温度・湿度】をブラウザ表示
今回は、温度湿度センサーを使って、部屋の温度・湿度をブラウザに表示します。この記事では単に部屋の温度・湿度をブラウザに表示するだけですが、将来的には、温度・湿度をDataBaseに保存したり、BI(Business Intelli...

後は、 毎時、00分、15分、30分、45分のどこかのタイミングで、
実際にDataBaseの中に値が入っているか、、phpmyadminで確認します。

Metabaseで表示

最後に、DataBaseに格納された温度情報を、
データ可視化ツールのMetabaseを使って図示します。

Metabaseは、コンテナで起動します。

プログラミング

以下ディレクトリ通り、ディレクトリとファイルを作成する。
この章では、以下赤字のファイルを修正します。

/home/pi/work/temp/
├ docker/
│  └ docker-compose.ymlmetabase/
│  └ Dockerfile
├ temperature.py
├ db.py
└ app.py

docker-compose.yml

version: '3'

services:
  mysql:
    image: hypriot/rpi-mysql
    ports:
      - 3306:3306
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD={root password}
      - MYSQL_DATABASE=temperature
      - MYSQL_USER=pi
      - MYSQL_PASSWORD=raspberry
    restart: always

  metabase:
    build: ../metabase
    container_name: metabase
    ports:
      - 3000:3000
    volumes:
      - ../metabase/data:/metabase-data
    environment:
      - MB_DB_FILE=/metabase-data/metabase.db
    restart: always

volumes:
   db-data:

Dockerfile

FROM arm32v7/adoptopenjdk:11.0.10_9-jdk-hotspot

RUN mkdir /apps
WORKDIR /apps/

RUN apt update
RUN apt install -y wget
RUN wget https://downloads.metabase.com/v0.38.0.1/metabase.jar

EXPOSE 3000

CMD java -jar metabase.jar

実行

docker-compose.ymlファイルがあるディレクトリまで移動し、
以下コマンドを実行する。

$ docker-compose up -d --build

metabase初期設定

パソコン or スマホのブラウザを開き、
Raspberry Pi の IPアドレス:ポート(3000)でアクセスします。
例えば、
http://192.168.11.9:3000
です。

Raspberry Pi の IPアドレス:ポート(3000) にアクセスすると、
以下の画面が表示されます。

いよいよ設定です。
「開始しましょう」ボタンを押します。

■言語の設定です。
Japanese を選択し、「次へ」ボタンを押します。

■アカウントの設定です。
以下通り、各自の設定を入力し、 「次へ」ボタンを押します。

■データの追加
後で設定するので、「あとでデータを追加する」ボタンを押します。

■情報収集協力
情報収集に同意するか選択し、「次へ」ボタンを押します。

最後に、「Metabaseを使い始める」ボタンを押して、
最初の設定は完了です。

Database追加設定

画面右上の歯車アイコンを押し、
「管理者」を選択します。

以下画面の
「データベースを追加する」ボタンを押します。

以下画面の通り設定し、
「保存」ボタンを押します。

ユーザ名とパスワードは、
上記で設定した、

      - MYSQL_USER=pi
      - MYSQL_PASSWORD=raspberry

になります。

温度情報の可視化

画面下の「温度表示」を押します。

「Temperature」を選択します。

右側の「要約」ボタンを押します。

以下画面の通り、
集約方法をTempにし、集約キーをDateの分に設定し、
保存ボタンを押して終了です!!!

最後に

如何だったでしょうか?

温度センサーから取得したデータをDatabaseに格納し、
可視化ツールでデータを整形して表示しました。

ここまで作れるようになると、
あなたが作りたいものは、自分で調べて作れると思います。
次は、あなたが作りたいものを作ってみてね。

以下記事では他にも色んな電子工作を作っています。
あなたが作りたいモノのヒントがあれば嬉しいです。

電子工作(Raspberry Pi でできること)
このサイトは、「モノづくりの楽しさをあなたに伝えたい」との思いで作っています。「難易度:☆☆☆」の章に、Raspberry Pi(マイコン) と Python(プログラミング言語)を使ったおもちゃの作り方を書いています。あ...

記事を更新するとTwitterでつぶやきます。
フォローしてもらうと、記事を書くモチベーションが上がります。
下のTwitterアイコンからフォローお願いします。

不明な点があればページTOPの「お問い合わせ」にてご連絡下さい。

もし一人で作るのが難しかったら、
一緒に作るサービスをしています。
お気軽に ページTOPの「お問い合わせ」にてご連絡下さい。

タイトルとURLをコピーしました