今回は、以下記事で取得した温度データを、
Databaseに保存し、BI(Business Intelligence)ツールのmetabaseを使って、
グラフで可視化していきます。
DataBaseやmetabaseは、
docker, docker-composeを使ってアプリを構築していきます。
その他、DataBase(MySQL)をブラウザで管理することが出来るphpMyAdminも、
Dockerを使って構築していきます。
Docker・Docker Composeインストール
Dockerって何?
Dockerって何?という方は、以下記事を見てみてね。
Dockerインストール手順
Dockerのインストールを行うには、
以下記事に記載の手順で行います。
インストールには、以下コマンドを実行します。
$ 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のインストールを行うには、
以下記事に記載の手順で行います。
以下コマンドを使ってインストールを行います。
$ 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 は、
以下記事で作成したものを利用します。
定期的にプログラムを実行する
定期的にプログラムを実行するには、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
動作確認
以下記事の通り、ラズパイと温度湿度センサーを接続します。
後は、 毎時、00分、15分、30分、45分のどこかのタイミングで、
実際にDataBaseの中に値が入っているか、、phpmyadminで確認します。
Metabaseで表示
最後に、DataBaseに格納された温度情報を、
データ可視化ツールのMetabaseを使って図示します。
Metabaseは、コンテナで起動します。
プログラミング
以下ディレクトリ通り、ディレクトリとファイルを作成する。
この章では、以下赤字のファイルを修正します。
/home/pi/work/temp/ ├ docker/ │ └ docker-compose.yml ├ metabase/ │ └ 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に格納し、
可視化ツールでデータを整形して表示しました。
ここまで作れるようになると、
あなたが作りたいものは、自分で調べて作れると思います。
次は、あなたが作りたいものを作ってみてね。
以下記事では他にも色んな電子工作を作っています。
あなたが作りたいモノのヒントがあれば嬉しいです。
記事を更新するとTwitterでつぶやきます。
フォローしてもらうと、記事を書くモチベーションが上がります。
下のTwitterアイコンからフォローお願いします。
不明な点があればページTOPの「お問い合わせ」にてご連絡下さい。
もし一人で作るのが難しかったら、
一緒に作るサービスをしています。
お気軽に ページTOPの「お問い合わせ」にてご連絡下さい。