Netatmo自作パート2:計測データをデータベースに放り込む

とりあえず温度計を作ってみた、と言っても、パーツを組み上げてサンプルのプログラムを動かしてみただけの状態です。これではPCの前でコマンド入力をしないと温度湿度がわからないし、不便です。まだヨメの揶揄する声が聞こえてきそうです...。*1 急いで完成させないといけません。でも時間はそれほどありません。ちょっとした空き時間に触るだけなので。

センサーからの情報を取得するプログラム自体はそのまま流用するとして(SwitchScienceさんありがとうございます)、プログラムでセンサーが吐いた情報をデータベースに取り込む、ということがプログラム上でできるなら、それを定期的に実行すればよい、ということになりそうです。つまり、喫緊の課題としては、

  • DBを用意する
  • テーブルを作る
  • データを放り込む

が満たせればよいわけです。やることはそれほど難しくないはずなので早速始めてみましょう。

データベースの構築

データベースソフトウェアの選定とインストール

サンプルのプログラムは前回の投稿で書いたとおりPythonで書かれています。プログラムはそのまま流用するので、Pythonでコントロールしやすいこと、またラズパイでの運用なので軽量であること、の2点を勘案してSqliteを採用しました。では、早速インストールしてしまいましょう。

$ sudo apt install sqlite3
(Python3で動作させることを想定。)
$ mkdir sqlite3 && cd sqlite3
(適当なフォルダを適当な箇所に掘る)
$ sqlite3 netatmo.fake
(ファイルそのものがデータベースになる様子)
sqlite> CREATE TABLE atmos (Date, Temperature, Humidity, Pressure);

テーブルを作ってみたはいいけれど...

さて、ここまでは慣れた作業で相当カンタンなので*2、こんな酒をかっくらいながら作業をしていましたが、まだまだ酔いが足らなかったようで、そこそこ大事なことに気が付きました。

「あれ?データの型指定ってどうやってやるんだっけ?」

SQLというとデータベースにデータを入れたりなんかしたり、というアレですが、ソフトウェア(SqliteAccessSQLServerMySQLPostgreSQLなどなど)によって多少の差はあるものの、ほぼ方言レベルの差なので、だいたいどれか一つのソフトを使っていれば他のソフトにも応用が効くのですが、それはそれとして。 今回はテーブルを作るので(CREATE TABLE)、テーブル名を[atmos]とすると、そのあとに続くカッコの中の書き方は通常、 [カラム名1 データ型], [カラム名2 データ型], ... みたいな書き方、例えば、 (hoge INTEGER, fuga REAL, ... という書き方をするのです。これでデータを入れるときに不正なデータを入れずに済むし、データベースからプログラムで読み込むときにもカラムのデータ型が確定していればプログラムで考えることが少なくなるわけです(カラムのデータ型は不変だから)。さて実際のプログラムまで考えると、「データ取得日時」を取らないとデータの整理ができません。とりあえずはインデックスなしで運用してみようと考えています。最終的に古いデータを削除する必要があるのでインデックスを貼ってインクリメントでの運用はちょっと大げさかしら、と考えています。容量も少ないので。*3

えっと何言ってるかよくわかんないんですけど

取得日時カラムは日時型よね、と調べてみると、

ないのかよ...。

と言うか。よくわかんねぇなぁ。えっと。

と調べながら酒をすすりながら、と2本目のカップ酒に手が伸びようと言うところ。

簡単に説明をします。型指定はしなくても大丈夫のようです。データが入ってきたらその都度判別する、ということのようですね。

www.sqlite.org

公式サイトを見てみると、数字に関してはIntegerもしくはReal、ですが、BME280のサンプルコードを叩くと出てくる数値(気温・湿度・気圧)はいずれも小数点以下の数値を返してきます。これを整数に丸める意味はないので、そのまま小数点以下の数値を格納すればいいことになるので、Real一択ということになります。 また、日付はどうやらTextとして入れればいいようですが、結局は(上でも書いていますが)型指定をしないままでこんなテーブルを作ってみようかと思います。

CREATE TABLE atmos (Date, Temperature, Humidity, Pressure);

で、適当なデータをINSERT文でテーブルにぶっこんでみます。*4

INSERT INTO atmos VALUES('2019-03-09 01:03:00', 24.83, 39.40, 1007.82);

酔っ払いました...( ´ー`)フゥー...

今回の成果は?

計測データの受け渡しはできていないのですが、データベースはできて動くことまで確認をしました。酔っ払ったので今日は開発を終わります。

次回のご予定は?

サンプルコードにデータの書き込みロジックを埋め込むだけですかねぇ。え?お酒もいただけるですか?飲みながらでいいですか?

*1:「15,000円の温度計だかアキバでパーツ買ってきて安かったかなんか知らないけど使えないじゃん。100均の温度計は置いておくだけで温度も湿度もわかるし、何より電気代食わないよ。無駄だよね〜(笑)。」 ガチで言われます。ぐうの音も出ないとはこの事...。

*2:Accessのコーディングからスタートしたシステム屋なのでデータベースに関しては割と得意です。

*3:後日譚にはなるし、おそらくパート5とか6くらいで再度触れますが、最終的にはインデックスを貼ってしかもオートインクリメントのカラムを増やしています。理由はそのあたりで説明をします。

*4:実はここで1時間くらいコケてたんですが、よく見ればVALUESのカッコ内のカンマを一つ入れ忘れていたのを見落としておりました。コレは流石に酒のせい、とここで一旦開発を中断。