今回Raspberry Piで部屋の温度を記録するに当たって、おおよそ以下のような設計を考えました。
- Raspberry Piで部屋の温度を測定する
- データベースに測定時刻と共に温度データを蓄積する
- データベースの情報を元にグラフを描画する
1の手順については準備編で紹介した書籍、”Raspberry Piで学ぶ電子工作”で紹介されているので、それを流用します。今回のエントリは2の部分です。
SQLiteによるデータの蓄積
簡易なデータベースとして今回はSQLiteを使うことにしました。SQLiteはローカルでの利用に向いた手軽なデータベースとしてよく使われているものだそうです。
コードは以下のような感じになりました。
<Python>
#UTF8
import smbus
from time import sleep
import sqlite3
import datetime
#温度測定プログラム"Raspberry Piで学ぶ電子工作 プログラム7-1を流用"
#変数"InputValue"に温度が格納される
#データベースファイルが存在しない場合は作成
dbpath = '/home/pi/Documents/roomtemp_db.sqlite'
#コネクション生成
connection = sqlite3.connect(dbpath)
#カーソル生成
cursor = connection.cursor()
#テーブルが存在しない場合は作成
#ID、日付時刻、温度の3列で構成
cursor.execute("CREATE TABLE IF NOT EXISTS roomtemptable (id INTEGER PRIMARY KEY AUTOINCREMENT, datetime TEXT, temp REAL)")
#現在時刻を取得
nowdt = datetime.datetime.now()
nowdt = nowdt.strftime('%Y%m%d-%H:%M:%S')
#SQLコマンド実行
sql = 'insert into roomtemptable (datetime, temp) values (?, ?)'
data = (nowdt, inputValue,)
cursor.execute(sql, data)
connection.commit()
connection.close()
SQLiteの面白いと思ったところはコード内でファイル作成から行えるところです。既に同名のファイルが存在した場合は上書きせずにスキップしてくれるので、作る方としては楽です。これはテーブルについても同様です。
SQLコマンドの実行はcursorインスタンスのexecuteメソッドで行います。SQL文のパラメータはタプル(データの組)としてexecuteメソッドの第2引数に設定することができます。他にもパラメータの使い方はあるようなのですが、何となく私はこの記法が理解しやすかったのでそうしました。
日付時刻の処理
少々詰まったのは日付時刻の処理で、取得したdatetime型の情報を文字列型に変換する方法が分からずに苦労しました。結局datetimeオブジェクトのstrftimeメソッドで変換可能なことが分かったのでそれを使いました。
まとめ
このプログラムを実行することでデータベースを作成し、その中のテーブルに日付時刻と共に温度情報を書き込むことができます。
後はこのプログラムを定期的に実行すればOKです。次回のエントリではcronを使ってこのプログラムを自動実行する方法を整理してみたいと思います。
参考リンク
sqlite3—SQLite データベースに対する DB-API 2.0 インターフェース
datetime—基本的な日付型および時間型
[Python.org]
Pythonのドキュメント群は非常に分かりやすい日本語情報があるので、何と言ってもオフィシャルの情報が頼りになりました。