今回は2021年02月15日に投稿した記事の続きでオンプレミスサーバとOneDriveの同期、温度データのグラフ化についてご紹介していきます!また、温度計を使って実際に温度を測定したのでその結果もご紹介します!

前回の記事ではfitlet2でTEMPerとIBS-TH1から温度データを取得する方法を紹介していますので、興味のある方はぜひそちらもご覧ください!

目次
1. 今回の目標
2. 環境構築
 2-1. サーバマシンへUbuntu 20.04 LTSをインストール
 2-2. OneDrive Client for Linuxの導入
 2-3. Muninのインストール
 2-4. 温度データのコピー
 2-5. Muninプラグインの作成
 2-6. gnuplotのインストール
3. 測定方法
4. 結果
 4-1. Muninでグラフを作成できた!
 4-2. gnuplotでグラフを作成できた!
5. まとめ

1. 今回の目標

データをグラフにすることで「見える化」してわかりやすく

①POWERSTEP fitlet2とSORACOMで測定した温度データをOneDriveへアップロードする!
②OneDriveと同期したオンプレミスサーバで温度データをグラフ化する!
③異常な温度を検知したら警告メールを送信する!

前回の記事では①を目標に環境を構築しました。温度データを記録できるようにはなりましたが、文字の記録だけではパッと見ても温度変化が分かりづらいです。そこで②を目標に文字のデータをグラフ化することで分かりやすくすることを目指します。

また、前回は社内の室温を測っただけでしたが、今回は趣向を変えて社内で利用している冷蔵庫の温度を測ってみました。みなさんは、冷蔵庫の中は何℃くらいかご存知ですか?冷蔵庫の庫内温度は0 ~ 10 ℃と言われています。これは、食べ物を腐らせる細菌のほとんどが20 ℃ ~ 40 ℃を好み、10 ℃以下では繁殖が抑えられると言われているからです。ですが、開閉を繰り返す冷蔵庫は実際に10 ℃以下を保っているのでしょうか?特に、弊社の冷蔵庫は年季が入っているのでなおさら心配です。社員のおやつを細菌の繁殖から守るため、冷蔵庫がちゃんと冷えているのかどうか調査するのも今回の目標です!

2. 環境構築

図中左のマシンについて設定を行っていく

2-1. サーバマシンへUbuntu 20.04 LTSをインストール

手順はfitlet2と同様なため、前回の記事を参照。

2-2. OneDrive Client for Linuxの導入

こちらもほとんどfitlet2と同様ですが、こちらはダウンロードのみを行うようにオプションを指定します。

$ onedrive --synchronize --download-only

2-3. Muninのインストール

Muninはオープンソースのシステム監視ソフトウェアで通常はサーバのリソース監視に使われますが、数値さえ取得できれば大抵のものをグラフ化してブラウザ上に表示することができます。今回はこのソフトウェアを使って温度のグラフ化と警告メールの設定をしていきます。

  1. インストール
    Muninでグラフを表示するには本体のmunin、ブラウザからアクセスするためのapache2、リソースを監視するmunin-nodeをインストールします。
    $ sudo apt install munin munin-node apache2
  2. Muninログイン用のアカウント設定
    Muninの管理画面にログインするためのアカウントを設定します。初期設定ではログイン不要でアクセスできるようですが、なぜかアカウントを設定しておかないとアクセス拒否されてしまうため設定しておきます。
    $ sudo htpasswd -c /etc/munin/munin-htpasswd <USERNAME>
    New password:
    Re-type new password:
    Adding password for user <USERNAME>
  3. ブラウザからMunin管理画面へアクセス
    ブラウザにhttp://localhost/munin/またはhttp://マシンのIPアドレス/munin/と入力しMuninの管理画面へアクセスします。Muninが正常に動いていれば以下のような画面が表示されます。

    Muninの管理画面
    Categoriesは初期状態から変更されています。

2-4. 温度データのコピー

OneDriveディレクトリの温度データをMuninでグラフ化しようとしたところ、なぜがhomeディレクトリの下が取得できませんでした。なので二度手間のようですがOneDriveディレクトリの温度データをetcディレクトリ下へコピーするCronを登録します。

$ mkdir /etc/Tempereture
$
cp /etc/crontab /etc/cron.d/cpOneDrive_cron
$ sudo vi /etc/cron.d/cpOneDrive_cron

*/5 * * * * root cp /home/<username>/OneDrive/TEMPer.txt /etc/Tempereture/TEMPer.txt
*/5 * * * * root cp /home/<username>/OneDrive/IBS-TH1.txt /etc/Tempereture/IBS-TH1.txt
*/5 * * * * root cp /home/<username>/OneDrive/IBS-TH1-Mini.txt /etc/Tempereture/IBS-TH1-Mini.txt

2-5. Muninプラグインの作成

Muninにはリソース監視用の様々なプラグインが用意されていますが、自作したプラグインを読み込ませてグラフを作成することも可能です。

  1. プラグインの作成
    プラグイン用のディレクトリにファイルを作成します。書き方にしたがって入力するだけなので見た目ほど難しくありません。
    $ sudo vi /usr/share/munin/plugins/TEMPer

    #!/bin/bash output_config() { echo "graph_title Temperature from TEMPer" echo "graph_category sensors" echo "graph_vlabel Celsius" echo "graph_args --base 1000 -l 0" echo "graph_scale no" echo "temperature.label Temperature" echo "temperature.info Temperature from TEMPer" } output_values() { printf "temperature.value %2.2f\n" $(number_of_plugins) } number_of_plugins() { gawk 'END{print $2}' /etc/Temperature/TEMPer.txt } output_usage() { printf >&2 "%s - munin plugin to graph an example value\n" ${0##*/} printf >&2 "Usage: %s [config]\n" ${0##*/} } case $# in 0) output_values ;; 1) case $1 in config) output_config ;; *) output_usage exit 1 ;; esac ;; *) output_usage exit 1 ;; esac
    output_config()にはグラフについての情報を入力します。ここでグラフタイトルなどを設定します。
    output_values()ではグラフにプロットする数値を表示します。
    number_of_plugins()で元のデータからプロットする数字を抜き出しています。
    output_usage()以下はMunin公式マニュアルにあるテンプレートと同様です。
    $ sudo vi /usr/share/munin/plugins/IBS-TH1

    #!/bin/bash output_config() { echo "graph_title Temperature from IBS-TH1" echo "graph_category sensors" echo "graph_vlabel Celsius" echo "graph_args --base 1000 -l 0" echo "graph_scale no" echo "temperature.label Temperature" echo "temperature.info Temperature from IBS-TH1" } output_values() { printf "temperature.value %2.2f\n" $(number_of_plugins) } number_of_plugins() { gawk 'END{print $2}' /etc/Temperature/IBS-TH1.txt }

    -----以下 TEMPer と同文-----
    $ sudo vi /usr/share/munin/plugins/IBS-TH1-Mini

    #!/bin/bash output_config() { echo "graph_title Temperature from IBS-TH1-Mini" echo "graph_category sensors" echo "graph_vlabel Celsius" echo "graph_args --base 1000 -l 0" echo "graph_scale no" echo "temperature.label Temperature" echo "temperature.info Temperature from IBS-TH1-Mini" } output_values() { printf "temperature.value %2.2f\n" $(number_of_plugins) } number_of_plugins() { gawk 'END{print $2}' /etc/Temperature/IBS-TH1-Mini.txt }

    -----以下 TEMPer と同文-----
  2. シンボリックリンク作成
    Muninプラグインは実行ファイルを/usr/share/munin/plugins/に設置し、シンボリックリンクを/etc/munin/plugins/に設置します。このディレクトリにはデフォルトでいくつかプラグインのシンボリックリンクが入っているので不要なものは削除しておきます。
    $ sudo ln -s /usr/share/munin/plugins/TEMPer /etc/munin/plugins/TEMPer
    $ sudo ln -s /usr/share/munin/plugins/IBS-TH1 /etc/munin/plugins/IBS-TH1
    $ sudo ln -s /usr/share/munin/plugins/IBS-TH1-Mini /etc/munin/plugins/IBS-TH1-Mini
  3. 実行ユーザの変更
    munin-nodeに以下の記述を追加し、プラグインの実行ユーザをrootに変更します。今回はテスト環境のためrootにしましたが、実際の運用では要件に合わせてアカウントの変更や権限の処理を厳密化する必要があります。
    $ sudo vi /etc/munin/plugin-conf.d/munin-node

    [TEMPer]
    user root

    [IBS-TH1]
    user root

    [IBS-TH1-Mini]
    user root
  4. プラグインの動作確認
    「munin-run」コマンドでプラグインが動作するかどうか確認します。
    $ sudo munin-run TEMPer
    temperature.value 20.00
  5. munin-nodeデーモンを再起動
    デーモンを再起動してプラグインを反映させます。

2-6. gnuplotのインストール

gnuplotはグラフ作成ソフトです。Muninは温度データの一番下にある数値をプロットしているだけなので、同期がズレるとグラフもズレてしまう場合があります。gnuplotは温度データにある温度と日時からグラフを作成するため同期がズレてもグラフがズレることはありません。

  1. gnuplotのインストール
    コマンドからgnuplotをインストールする。
    $ sudo apt install gnuplot
  2. 動作確認
    「gnuplot」を実行するとgnuplotが起動し対話モードになります。試しにsin(x)のグラフを描いてみます。下のようなグラフがGUI上に表示されればOKです。
    $ gnuplot

    gnuplot> plot sin(x)

    sin(x)のグラフ

3. 測定方法

設置場所のイメージ

いよいよここからは実際に温度を測ってみます。
TEMPerは1mのUSB延長ケーブルを使ってfitlet2に接続しIBS-TH1をその近くに設置、IBS-TH1 Miniは社内の冷蔵庫の中に設置しました。

冷蔵庫に設置されたIBS-TH1 Mini

温度計をそれぞれの場所にセットしたら、手動でコマンドを実行し温度が取得できるかどうか試してみます。

$ sudo gettemp
temperature 28.18 °C
$ python3 inkbird_ibsth1.py
temperature 25.14 °C
$ python3 inkbird_ibsth1_mini.py
temperature -0.37 °C

暖房の設定温度は25℃だったため、IBS-TH1のほうがTEMPerより正確なようです。温度のズレはスクリプトを書き足せば修正できますが、ひとまず今回はこのまま実験します。
IBS-TH1 Miniは冷蔵庫の中にあるうえに、fitlet2から5mほど距離が離れていますが問題なく温度を取得できました。冷蔵庫にしては温度が低めなのは中に冷凍室があるタイプだからだと考えられます。今のところ、庫内温度に問題はなさそうです。

温度が取得できることが確認できたのでしばらく放置してデータが集まるのを待ちます。

4. 結果

4-1. Muninでグラフを作成できた!

社内ノートPCからでもMuninへアクセスできた

サーバマシン上のWebブラウザにhttp://localhost/munin/、またはLAN内のマシンのWebブラウザにhttp://マシンのIPアドレス/munin/と入力することでMuninの管理画面へアクセスすることができます。左のCategorysからsensorsを選ぶとそれぞれの温度計から取得した温度のグラフが表示されます。

TEMPerから取得した温度のグラフ

IBS-TH1から取得した温度のグラフ

IBS-TH1 Miniから取得した温度のグラフ

それぞれの温度計から取得した温度のグラフが作成されていました!ときどきIBS-TH1のグラフが極端に下がっていますが、これはBluetoothで温度を取得できなかったときにこうなってしまいます。社内では多くのWi-Fi機器を使用しているので、それが干渉してしまっているのかもしれません。IBS-TH1 Miniもときどき温度を取得できていないときがありますが、頻度はIBS-TH1とそれほど変わりませんでした。

こうして見ると社内に人がいる間は温度が高くなり、いなくなると温度が下がっているのがよく分かりますね。肝心の冷蔵庫の庫内温度は、最低 -2.77 ℃、最高 3.99 ℃と10 ℃以下をキープしていました!これで安心しておやつの保存を任せられます!

4-2. gnuplotでグラフを作成できた!

温度データを元にgnuplotでグラフを作成してみます。コマンドで数値の意味とグラフの描き方を指定するとその通りにグラフを作成してくれます。

$ gnuplot
gnuplot> set xdata time
gnuplot> set timefmt "%Y%m%d%H%M%S"
gnuplot> set format x "%Y/%m/%d\n%H:%M:%S"
gnuplot> plot [] [0:] "/home/<username>/OneDrive/TEMPer.txt" using 4:2 w l
gnuplot> plot [] [0:] "/home/<username>/OneDrive/IBS-TH1.txt" using 4:2 w l
gnuplot> plot [] [-4:4] "/home/<username>/OneDrive/IBS-TH1-Mini.txt" using 4:2 w l

TEMPerの温度データを元にしたグラフ

IBS-TH1の温度データを元にしたグラフ

IBS-TH1 Miniの温度データを元にしたグラフ

指定した期間のグラフを表示することもできます。日時の指定は読み込む温度データと同じ形式で入力します。また、「set」コマンドで指定した設定は「reset」コマンドでリセットできます。

gnuplot> plot [20210128100000:20210129100000] [0:] "/home/<username>/OneDrive/IBS-TH1.txt" using 4:2 w l
gnuplot> reset

IBS-TH1の温度データから2021/01/28 10:00から2021/01/29 10:00までの温度を抜き出したグラフ

gnuplotでグラフを作成することができました!gnuplotならIBS-TH1やMiniで温度の取得に失敗したデータは省かれるのでMuninよりキレイなグラフになります。温度監視だけならMuninでも十分ですが、温度変化をわかりやすく見たい場合はgnuplotのほうが良いかもしれません。

5. まとめ

今回は「②OneDriveと同期したオンプレミスサーバで温度データをグラフ化する!」を目標に、サーバへUbuntu、OneDrive Client for Linux、Munin、gnuplotをインストールしました。その結果、温度計で取得した温度データをグラフ化することができました!また、社内で使用している冷蔵庫が庫内をしっかり冷やせていることがわかりました!なんとなく冷やせているだろうというよりは、こうして温度変化を目で見えるようにしたほうが安心できますね!

次回は「POWERSTEP fitlet2 BTOとSORACOM Airで遠隔温度監視システムを作ってみた!その3」として、いよいよ最後の目標である「異常な温度を検知したら警告メールを送信する!」の方法をご紹介します!

また、アミュレットでは今回活躍したようなオンプレミスサーバにぴったりなマシン「POWERSTEP 1U」の取り扱いもありますので、ご興味がありましたらそちらもぜひご覧ください!

POWERSTEP fitlet2 BTO / 見積依頼ページ

POWERSTEP 1U 製品ページ / 見積依頼ページ