sense hatで測定した温度と湿度及び気圧をpythonでグラフ表示

2017年6月29日

師匠の50オヤジが、センサで測った値(温度、湿度、気圧、聞いてみたら、土の湿り気や太陽光の電圧、はては、雨粒感知まで)をため込んで、それをweb上でグラフに出して表 示していることを知りました。

60爺は、sense hat で温度、湿度、気圧は簡単に取得できます。

そこで、師匠のまねを して、これらのグラフを作成することにしました。

プログラムは、pythonを使ってみることにします。そして、データの取得先は、師匠の言っていたsqlite3に決めました。

その手順を、ここでお知らせします。

スポンサーリンク

グラフ作成手順

手順は次の通りです。

  1. データ取得プログラム作成
  2. 決まった時間ごとにデータ取得
  3. グラフ作成
  4. グラフの表示

さてさて、どのくらいでできるかな。楽しみです。

データ取得プログラム作成

まずは、取り込んだデータをsqlite3にため込むプログラムを作成します。

① データ取得は、sense hat のライブラリで簡単に取得できる。
② データベースをオープン、取得したデータを insert する。

これだけです。

# sqlite3 標準モジュールをインポート
import sqlite3
# datetime 標準モジュールをインポート
import datetime
# sense hat
from sense_hat import SenseHat
sense = SenseHat()
# データベースファイルのパス
dbpath = '/xxxxxx/xxxxxx/sqlite3/xxxxx_db.sqlite'
# データベース接続とカーソル生成
connection = sqlite3.connect(dbpath)
cursor = connection.cursor()
# 現在の時間を取得
now = datetime.datetime.now()
ti = now.strftime("%Y-%m-%d %H:%M:%S")
# 気温、気圧、湿度の取得
te = sense.get_temperature()
pr = sense.get_pressure()
hu = sense.get_humidity()
# エラー処理(例外処理)
try:
# CREATE
# cursor.execute("DROP TABLE IF EXISTS graph_data")
cursor.execute("CREATE TABLE IF NOT EXISTS graph_data ( time text, temp real, pres real, humi real)")
# INSERT
insert_sql = 'INSERT INTO xxxxx_data ( time , temp , pres , humi ) VALUES ( ? , ? , ? , ? )'
graph_data = ( ti , te , pr , hu )
cursor.execute(insert_sql,xxxxx_data )
except sqlite3.Error as e:
print('sqlite3.Error occurred:', e.args[0])
# 保存を実行(忘れると保存されないので注意)
connection.commit()
# 接続を閉じる
connection.close()

難しいところはありません。

でも、60爺は勉強になりました。

日程及び時間の取得、カーソルの使い方など、しばらくぶりのプログラミングで、躓きながらも楽しい時間を過ごしました。

それにしても、先人の皆さんは素晴らしい。

有用な情報があちこちにあって、それらを参考にプログラムを作り上げました。


決まった時間ごとにデータ取得

データ取得のイメージの画像

これは、簡単です。crontabを使用して、一定時間ごとに上記プログラムを起動します 。今回、15分ごとに動かします。

*/15 * * * * sudo python3 /home/pi/python_pg/graph_data/data_pro.py

グラフ作成

ここで、少し時間を取られました。

世の中、グラフ作成プログラムがたくさんあるんですね。いやー、驚きました。

60爺は、グラフを作成するのに特にこだわりはありませんので、簡単にできるものがいいなと思って選びました。

インストールや、環境設定が嫌だったので、結局、Google Charts を選びました。

これは、Google Charts 向けのHTMLファイルを作れば、web 上でグラフを作ってくれるそうです。

web をググって、参考になるプログラムをあさりました。

あっさりとできるものがなかったので、試行錯誤の結果、次のようなプログラムが完成しました。いやー、なかなか大変でした。

import os
import sys
# sqlite3 標準モジュールをインポート
import sqlite3
# datetime
import datetime
argvs = sys.argv
argc = len(argvs)
html_path = '/home/pi/python_pg/graph_data/'
if(argc == 2):
html_path = argvs[1] + os.sep
# データベースファイルのパス
dbpath = '/home/pi/sqlite3/graph_data_db.sqlite'
# データベース接続とカーソル生成
connection = sqlite3.connect(dbpath)
cursor = connection.cursor()
# 本日の日付を取得
date_format = '%Y-%m-%d %H:%M:%S'
d = datetime.datetime.today()
# 現時点より10日前の日付を取得
d -= datetime.timedelta(days = 10)
date_string_output = d.strftime(date_format)
lines = ['']
lines.append("<html>\n")
lines.append(" <head>\n")
lines.append(" \n")
lines.append(' <script type="text/javascript" src="https://www.google.com/jsapi"></script>\n')
lines.append(' <script type="text/javascript">\n')
lines.append(' google.load("visualization", "1", {packages:["corechart"]});\n')
lines.append(" \n")
lines.append(" google.setOnLoadCallback(drawChart);\n")
lines.append(" \n")
lines.append(" function drawChart() {\n")
lines.append(" \n")
lines.append(" var data = google.visualization.arrayToDataTable([\n")
lines.append(" ['年度', '気圧(hPa)'],\n")
# エラー処理(例外処理)
try:
# select 時間、気圧を読取る
select_sql = 'select time,pres from graph_data where time >= ?'
for row in cursor.execute( select_sql , (date_string_output,) ):
str_row = str(row)
str_row = str_row.replace('(', '[')
str_row = str_row.replace(')', ']')
str_row = ' ' + str_row + ',\n'
lines.extend(str_row)
except sqlite3.Error as e:
print('sqlite3.Error occurred:', e.args[0])
lines.append(" ]);\n")
lines.append(" \n")
lines.append(" var options = {\n")
lines.append(" title: '気圧',\n")
lines.append(" vAxis: {\n")
lines.append(" minValue: 900,\n")
lines.append(" maxValue: 1100,\n")
lines.append(" ticks: [900,950,1000,1050,1100] }\n")
lines.append(" };\n")
lines.append(" \n")
lines.append(" var chart = new google.visualization.LineChart(document.getElementById('chart_div'));\n")
lines.append(" chart.draw(data, options);\n")
lines.append(" }\n")
lines.append(" </script>\n")
lines.append(" </head>\n")
lines.append(" <body>\n")
lines.append(' <div id="chart_div" style="height: 400px; width: 80%;"></div>\n')
lines.append(" </body>\n")
lines.append("</html>\n")
with open(html_path + 'pres_display.html','w') as f:
f.writelines(lines)

こちらのプログラムは、長いですが、それほど難しいものではありません。

まず、グラフを出すことのできるHTMLファイルを作成することに専念しました。

そのファイルが出来た後、このプログラムに取込むことを優先したことで作成できました。

その他は、データベースの読込み(OPEN)、読出し(SELECT)等データベース(cursolの使い方)の基本的な使い方、また、データベースの取出しに、いろいろ悩みました。

また、2日前からのデータを抽出する方法の調査、そして、読出したデータをグラフ用に合わせるため、文字列操作を行わねばならず、こちらも、データベースと同様、いろいろ調べました。

まア、久々にプログラミングをしたので面白かったですね。

上記のグラフ作成プログラムは、温度及び湿度をグラフにするものです。

ですので、中身をいくつか変更して、別途、気圧をグラフに書き出すプログラムも作成しました。

グラフの表示

次に、出来上がったグラフ表示のHTMLを、60爺のブログへ転送します。

ここは、ftpでやろうと思っていましたが、師匠の50オヤジからsshfsなる便利なツールがあると聞いたので、急遽、それを取り込みました。

先ほど、データ取得のプログラムを15分ごとに動かしました。それに続き、温度・湿度プログラム、気圧プログラム、HTML(温度、湿度)、HTML(気圧)も、15分ごとに動かさねばなりません。

しかし、crontab は、並べて書いても、上から順に実施してくれません。

そこで、これら5つをshellにして、このshellを15分ごとに動かすようにしました。

#!/bin/bash
sudo python3 /xxxxxxxxx/data_pro.py
sudo python3 /xxxxxxxxx/write_html.py
sudo cp /xxxxxxxxx/temp_humi_display.html /xxxxxxxxx/Raspi
sudo python3 /xxxxxxxxx/write_pres_html.py
sudo cp /xxxxxxxxx/pres_display.html /xxxxxxxxx/Raspi
*/15 * * * * sudo sh /home/pi/python_pg/graph_data/display.sh

そこで、できたグラフがこちらです。なかなかいいですね。

ただ、sense hat で測定した温度は、ラズパイに接続している関係か常時35℃以上の高い値になっており、実際の気温とは数値が離れているようです。

データがたまったら、2日前でなく、10日前からとか、1ヶ月前からとかの長期的なグラフに変えてみたいと思っています。

【温度・湿度】

【気圧】

スポンサーリンク

最後に

sense hatで測定したデータを決まった時間にため込んでいき、それをグラフにする処理を作成しました。

今回は、作成手順に示したように、それぞれのプログラムを作るのに四苦八苦しました。

なんせ、久しぶりでしたので、やってきたことをほとんど忘れており、試行錯誤の繰り返しでした。

ですが、久しぶりのプログラミング作業は楽しかったですね。

■「sense hatで遊ぶ!」の記事は次の通りです

スポンサーリンク
この記事を書いた人

60爺

60路を越え、RaspberryPi と出会い、その関係でブログ開設(2017/2~)となりました。始めてみると、コツコツやるのが性に合ってしまい、漢字の記事から家の補修・将棋・windows10関係・別名・言い方などジャンルを拡大して今に至ってます。まだまだ、元気なので新たな話題を見つけて皆様に提供できればと思っています。「プロフィールはこちら