IoTセンサーデータを外部から見る

ラズベリーパイ等をInternetとのゲートウェーとしてセンサーデータをクラウドに送信することがIoTの手始めのようであるが、クラウド側の準備とかで個人としては敷居が高いようです。

そこで、簡易的にセンサーデータを可視化して外部Webサーバーに置きどこからでもブラウザーのみで表示する一例を公開しますので参考にしていただけると幸いです。

手始めにラズパイにI2C接続されたセンサーデータを定時に測定してグラフに表示するためISPのWebサーバーに転送する方法を説明します。下記の例は、台風通過時の都内室温と室内気圧の変動の様子です。

 

ハードウェアは、今回説明を簡単にするため、トランジスタ技術 2016年8月号の付属基板”アップル・パイ”で説明しますが、測定データがアスキー数値で取得できるコードが用意できれば応用は容易です。

この”アップル・パイ”には、環境センサー・モジュールとしてME-BME280を使用しています。I2CバスにLCD(8文字x2行)と共に接続されています。

CQ出版の特設サイト(読者サポートサイト)よりソースコード一式ダウロード可能ですので、それを用いた説明を行いますが、BME280の使い方、データ取得方法につての解説情報は、あちこちに掲載されています検索ください。

サンプルコード ”getBME280.c”をラズベリーパイ上でコンパイルし、”getBME”を作成します。

実行しますと、

pi@raspberrypi:~/ApplePi/bcm2835-1.50/ApplePi $ ./getBME
24.79C
100806Pa
50.25%
pi@raspberrypi:~/ApplePi/bcm2835-1.50/ApplePi $

となります。

このプログラムを使用して毎正時に温度測定を行いファイルに追加していく処理を行います。

作成されるファイルはこのような内容になります。日時、温度のファイルです。

pi@raspberrypi:/tmp $ cat 20171114.csv
'2017-11-14 00:00', 24.85
'2017-11-14 01:00', 23.93
'2017-11-14 02:00', 23.15
'2017-11-14 03:00', 22.66
'2017-11-14 04:00', 22.48
'2017-11-14 05:00', 22.37
'2017-11-14 06:00', 23.56
'2017-11-14 07:00', 22.76
'2017-11-14 08:00', 22.44
'2017-11-14 09:00', 22.21
'2017-11-14 10:00', 22.13
'2017-11-14 11:00', 22.03
'2017-11-14 12:00', 21.99
'2017-11-14 13:00', 21.97
'2017-11-14 14:00', 21.90
'2017-11-14 15:00', 21.90
'2017-11-14 16:00', 21.98
'2017-11-14 17:00', 22.10
'2017-11-14 18:00', 21.95
'2017-11-14 19:00', 21.85
'2017-11-14 20:00', 21.75
'2017-11-14 21:00', 21.74
'2017-11-14 22:00', 21.71
'2017-11-14 23:00', 21.61
pi@raspberrypi:/tmp $

さてこのファイルの作成方法ですが、先ほどの”getBME”とShell ScriptおよびそのShell Scriptを定時に起動するcrontabを活用します。少々力ずくですが、何らかの事由でデータの欠損等が表示てもそれなに処理を続けてくれます。

定時に実行されるShell Scriptは、このようになります。厳密には、このScriptの実行前に/tmp/filetを作成しておく必要があります。(touch /tmp/filet) 実際の運用時には、深夜24時前に別のcrontabにより作成されます。(別途説明)

pi@raspberrypi:~/I2C $ cat mkfile
#!/bin/bash
echo -n \' >> /tmp/filet ->改行を追加します。
date +"%Y-%m-%d %H:%M" | tr -d "\n" >> /tmp/filet ->日時を追加します。
echo -n \'\, " " >> /tmp/filet -> ”,"を追加します。
/home/pi/ApplePi/bcm2835-1.50/ApplePi/getBME -t | tr -d C >> /tmp/filet ->温度から”C"を削除して追加します。
pi@raspberrypi:~/I2C $

このScriptを毎正時に実行するため”crontab -e”で以下crontabに記載します。

0 * * * * /home/pi/I2C/mkfile

さて、この結果をGoogleChartのHTMLファイルに変換して外部Webサーバーにに書き込みます。今回は、ISVの個人ホームページ用の領域にFTPで転送します。FTP転送中にWebアクセスが完全に競合した場合ブラウザーからファイルが読めないことがあり得ますが、個人利用において今までアクセスが競合してアクセスできなかった経験がありません。

HTMLファイルの作成とFTP転送は、やはりShell Scriptとcrontabで行います。

pi@raspberrypi:~/I2C $ cat mkhtml.sh
#!/bin/bash
cd /tmp ->Ramディスクの/tmp上で作業を行います。
cp /home/pi/I2C/htmlhead /tmp/today.html ->HTMLファイルの定型の先頭部分をコピーします。
date +"%Y-%m-%d" >> /tmp/today.html ->タイトル部分に今日の日付を挿入します。
cat /home/pi/I2C/htmltop >> /tmp/today.html ->HTMLファイルの定型部分をマージします。
sed -e 's/^/\t[/;s/$/],/' /tmp/`/bin/date -d '1 days ago' '+%Y%m%d'`.csv >> /tmp/today.html ->昨日分のデータをマージします。
sed -e 's/^/\t[/;s/$/],/' /tmp/filet | sed -e '$s/.$//' >> /tmp/today.html ->本日の現在までのデータをマージします。
cat /home/pi/I2C/htmlbotm >> /tmp/today.html ->HTMLファイルの後半部分の定型部分をマージします。
/usr/bin/ftp -n < /home/pi/I2C/ftpcom.txt ->出来上がったHTMLファイルをFTPで外部ISPのWebサーバーに転送します。
pi@raspberrypi:~/I2C $

完成したHTMLファイルはこのようになります。

pi@raspberrypi:/tmp $ cat today.html
<html>
<head>
<title>
2017-11-15
</title>
<script type="text/javascript" src="https://www.google.com/jsapi"></script>
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawChart);
function drawChart() {
var data = google.visualization.arrayToDataTable([
['Time', 'Temp'],
['2017-11-14 00:00', 24.85],
['2017-11-14 01:00', 23.93],
['2017-11-14 02:00', 23.15],
['2017-11-14 03:00', 22.66],
['2017-11-14 04:00', 22.48],
['2017-11-14 05:00', 22.37],
['2017-11-14 06:00', 23.56],
['2017-11-14 07:00', 22.76],
['2017-11-14 08:00', 22.44],
['2017-11-14 09:00', 22.21],
['2017-11-14 10:00', 22.13],
['2017-11-14 11:00', 22.03],
['2017-11-14 12:00', 21.99],
['2017-11-14 13:00', 21.97],
['2017-11-14 14:00', 21.90],
['2017-11-14 15:00', 21.90],
['2017-11-14 16:00', 21.98],
['2017-11-14 17:00', 22.10],
['2017-11-14 18:00', 21.95],
['2017-11-14 19:00', 21.85],
['2017-11-14 20:00', 21.75],
['2017-11-14 21:00', 21.74],
['2017-11-14 22:00', 21.71],
['2017-11-14 23:00', 21.61],
['2017-11-15 00:00', 22.55],
['2017-11-15 01:00', 22.30],
['2017-11-15 02:00', 21.96],
['2017-11-15 03:00', 21.91],
['2017-11-15 04:00', 21.92],
['2017-11-15 05:00', 21.81],
['2017-11-15 06:00', 21.85],
['2017-11-15 07:00', 21.75],
['2017-11-15 08:00', 30.18],
['2017-11-15 09:00', 30.91],
['2017-11-15 10:00', 29.27],
['2017-11-15 11:00', 26.28],
['2017-11-15 12:00', 24.33],
['2017-11-15 13:00', 32.71],
['2017-11-15 14:00', 34.23],
['2017-11-15 15:00', 32.92],
['2017-11-15 16:00', 26.37],
['2017-11-15 17:00', 25.17],
['2017-11-15 18:00', 24.50]
]);

var options = {
title: 'Temperature Yesterday & Today',
vAxis: { title: '\xB0'+'C', minValue: 10, maxValue: 30}
};

var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
</head>
<body>
<div id="chart_div" style="width: 900px; height: 500px;"></div>
</body>
</html>
pi@raspberrypi:/tmp $

FTP転送のためのコマンド記載ファイルは、

pi@raspberrypi:/tmp $ cat ftpcom.txt
open ftp.xxyyyzz.ne.jp
user abcd pwpwpw
cd public_html
put today.html
quit
pi@raspberrypi:/tmp $

となります。サーバーのアドレス、ユーザー名、パスワード等は、ISPから指定されたものをお使いください。この例ですと、

http://xxyyyzz.ne.jp/~abcd/today.html

で気温グラフが表示されると思います。

さて、このScriptを毎時適当な時間に実行するため”crontab -e”で以下をcrontabに追加します。

3 * * * * /home/pi/I2C/mkhtml.sh

毎時3分に実行しています。

同様に日付が変わるときにデータを昨日のデータに移し替えおよび”/tmp/filet”を作成する処理を行います。

45 23 * * * /home/pi/I2C/eod.sh

毎日23:45に行っています。

pi@raspberrypi:~/I2C $ cat eod.sh
#!/bin/bash
cd /tmp
mv /tmp/filet /tmp/`date "+%Y%m%d"`.csv
touch /tmp/filet
rm /tmp/`/bin/date -d '1 days ago' '+%Y%m%d'`.csv
pi@raspberrypi:~/I2C $

これで、一時間毎の室温をどこからでも確認できます。

 

カテゴリーIoT

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です