SQLite記録データ集計 |
(1)概要
ESPr Developerで測定した温度データをレンタルサーバー上のSQLiteファイルに書き込んでいますが、このデータを見やすいように加工して表示してみます。先回投稿時には下の図の通りすべてのデータを単に並べています。(本記事作成時には最新20件表示に一部改良)
ただし、実際にはそんなに過去の温度を知りたくはありませんし、上の図の様に約5分単位の温度記録も必要ありません。そこで、今回は当日含め過去3日分のデータを1時間単位で表示する様にします。今回作成したブラウザへの出力は次の通りです。
温度データを測定し始めたのが、2日前の13:41~(本記事作成時)でしたので、それ以前の時間はデータが空白状態です。同様にインターネット接続し、ブラウザーを開いた時刻以降の当日のデータもありませんので空白になります。
今回の表示は2日前の午前0時から約1時間毎のデータを検索しブラウザー表示します。ESPr Developerは約5分周期で温度測定を行い、データをサーバー登録します。測定時刻は大きくズレはないと思いますが、通信遅れやサーバー側登録時刻であることなど、厳密には測定時刻ではありませんので予めご了承下さい。
以上の様にESPr Developerは定時刻に測定を行っていませんので、検索方法は、2日前の午前0時から約1時間単位でデータ検索し、複数あるデータの中の最も早い時間の温度データをその時間帯の代表データとして抽出します。
※ESPr Developerを他目的でも使用する為、プログラムを2018年11/19~11/21の3日間固定検索する様に変更しました。
尚、SQLite処理については、下記も参考にしてみて下さい。
[https://kats-eye.net/info/2018/11/13/php-sqlite/]
(2)プログラム
プログラムを以下に示します。行番2~4は対象日を変数に設定します。行番11~41のforループでは、対象日をループごとに変更します。行番14~40のforループでは、対象時間帯をループごとに変更します。このループによって日付と時間帯を確定します。行番18,19では、それぞれ開始と終了の日付・時間を設定します。
行番22~25でSQLiteのデータ検索を行うSQL文を作成します。行番24で検索対象範囲の時間帯を設定しています。行番25は登録の早い順に並びかえる様に検索順序を指定しています。
行番26でSQLを実行し、行番28~38で実行結果を表示します。各時間帯は約1時間ですので、5分に1回データ登録していることから、データは12件程度存在するはずですが、行番37で検索結果表示を中断し、次の時間帯の検索に移ります。結果、各時間帯の最も早い時間の1件のみがブラウザー上に出力されます。
<?php $tmp_dt[0] = date('Y-m-d', strtotime('-2 day')) ; $tmp_dt[1] = date('Y-m-d', strtotime('-1 day')) ; $tmp_dt[2] = date('Y-m-d') ; echo "<br><br>"; $db = null;$sql = null; $db = new SQLite3("./sq/temp_record.sqlite3"); for($i = 0 ; $i < 3; $i++){ $dsp_cnt = 0; for($j = 0 ; $j < 24; $j++){ $dsp_cnt = $dsp_cnt + 1 ; echo $dsp_cnt." , " ; $start_tm = $tmp_dt[$i]." ".mb_substr("00".$j,-2).":00:00" ; $end_time = $tmp_dt[$i]." ".mb_substr("00".$j,-2).":59:59" ; $res = null; $sql = "SELECT created_datetime , g_temp "; $sql = $sql."FROM temp_reco "; $sql = $sql."WHERE created_datetime >= '".$start_tm."' AND created_datetime <= '".$end_time."' "; $sql = $sql."ORDER BY created_datetime"; $res = $db->query($sql); while($row = $res->fetchArray(SQLITE3_NUM)) { for($k = 0 ; $k < count($row); $k++){ echo $row [$k]; if($k < count($row) - 1){ echo " , " ; } } break ; } echo "<br>"; } } ?>
PHPによる表の作成(テーブル) |
PHPを使って、ESPr Developerで測定したデータを表にして出力します。最初は判りづらかったのですが、ようやくPHPプログラムから、HTMLを出力するのに慣れてきたところですので、ここで復習もかねてやってみます。
ブラウザへの出力は次の通りです。各データを枠線で囲んで少しデータが見やすくなったと思います。表の中のすき間等も設定できるのですが、私のスキルではそう簡単ではなく、時間がかかりますので割愛させて頂きます。
詳細の説明は省略させて頂きますが、プログラムは次の通りです。PHPの echo 文でHTMLのTABLE要素等を出力しています。
<?php $tmp_dt[0] = date('Y-m-d', strtotime('-2 day')) ; $tmp_dt[1] = date('Y-m-d', strtotime('-1 day')) ; $tmp_dt[2] = date('Y-m-d') ; echo "<br><br>"; $db = null;$sql = null; $db = new SQLite3("./sq/temp_record.sqlite3"); echo "<TABLE border='1' style='border-collapse: collapse;' >"; for($i = 0 ; $i < 3; $i++){ $dsp_cnt = 0; for($j = 0 ; $j < 24; $j++){ $dsp_cnt = $dsp_cnt + 1 ; $start_tm = $tmp_dt[$i]." ".mb_substr("00".$j,-2).":00:00" ; $end_time = $tmp_dt[$i]." ".mb_substr("00".$j,-2).":59:59" ; $res = null; $sql = "SELECT created_datetime , g_temp "; $sql = $sql."FROM temp_reco "; $sql = $sql."WHERE created_datetime >= '".$start_tm."' AND created_datetime < '".$end_time."' "; $sql = $sql."ORDER BY created_datetime"; $res = $db->query($sql); while($row = $res->fetchArray(SQLITE3_NUM)) { echo "<TR><TD>".$dsp_cnt."</TD>" ; for($k = 0 ; $k < count($row); $k++){ echo "<TD>".$row [$k]."</TD>"; } break ; } echo "</TR>"; } } echo "</TABLE>"; ?>
まとめ |
PHP言語でSQLiteに記録されたデータを処理するプログラムを作成したきました。これまで作成したのは、下記の通りです。
次回以降は1時間単位に集計した温度データをグラフにする検討をして行きたいと思っています。幾つか調べてみたのですが、Chart.jsというJavaScriptのチャートライブラリーがフリーで使えて、比較的扱いやすそうです。JavaScriptはブラウザー側で動くプログラムですので、サーバーからデータを取得する為にHTTP通信を使う必要がある様です。次回、HTTP通信の基本的な使い方を確認してみます。