環境監視システム自作 sqlite3によるデータ蓄積とグラフ表示

先に構築した Webサーバー(RasPi+Python)に次の改良を加えました。

◆ サーバーに逐次送られてくる環境データを、データベースに蓄積するようにしました。
◆ 蓄積されたデータを使い、環境の変化をブラウザにグラフ表示できるようにしました。
(グラフ表示の詳細については次の投稿で紹介していきます)
◆ 環境監視表示およびグラフ表示に露点を追加しました。
◆ RasPi のSDカード長持ち対策として RAM-Disk を設定し、頻繁に更新されるデータ受け渡しファイルを置くようにしました。

1.システムの構成

・Raspberry Pi3 OS:Raspbian Jessie      (変更なし)
・CGI(Web)サーバースクリプト言語:Python3.4.2 (変更なし)
・環境データ受信(デーモン起動):Python3.4.2  (変更なし)
・データベース:sqlite3
・グラフ作成モジュール:python3 matplotlib

・ディレクトリ構成の変更
directory2b
(★:新たに追加したファイル ☆:内容を変更したファイル)

2.Python によるCGI(Web)サーバー立ち上げ

変更なし  Webサーバー(RasPi+Python) 参照

3.親機2からの環境データ受け取りとデータ蓄積

この処理は python3スクリプト dat_rec.py により、デーモンとして実行します。その内容は次のようになります。

環境データは親機2からシリアルで約10秒ごとに送られてきます。このデータを受け取ってブラウザ表示のための受け渡し用ファイル(envmon.dat)としてRAMディスクに保存します。ブラウザからの要求で動作する表示用CGIスクリプトは、このデータ受け渡しファイルを読んでブラウザに返します。

また、10分毎のデータをデータベースファイル(envdat.db)に蓄積します。データーベースは簡易な sqlite3 を使いました。データ蓄積のインターバルはグラフ表示用途で考えれば30分から1時間間隔で十分なのですが、当面10分間隔としました。(保存されたデータ頻度を減らすなどの再構築はそれ程難しいことではありません)
データーベースファイル(envdat.db)は、初期状態で自動的に作成されるようにしましたが、sqlite3 では驚くほど簡単に行えます。

RasPi への Ram-Disk の設定はネットの情報に基づき行いました。解説は省かせて頂きます。

次に dat_rec.pyスクリプト のデータベース処理部を示します。

  # 10分ごとの環境データを日時とともに保存する。
  now = datetime.now().strftime('%Y/%m/%d %H:%M') # 現在の日時取得(文字列)
  if old != now and now[15] == '0': 		  # 10分単位か
      old = now
      conn = sqlite3.connect('/home/pi/web/cgi-bin/envdat.db') #データベース接続
      curs = conn.cursor()
      for i in range(dnum):
          rdt = (str[i].strip()).split(',') # 空白を削除しリスト形式に変換
          try:        # データ追加
              curs.execute('''INSERT INTO stocks VALUES(?, ?, ?, ?)''', (now,rdt[0],float(rdt[1]),int(rdt[2]))) 
          except:     # データ追加に失敗なら、テーブルを新規作成してからデータ追加
              curs.execute('''CREATE TABLE stocks (time text, sid text, temp real, humid int)''')
              curs.execute('''INSERT INTO stocks VALUES(?, ?, ?, ?)''', (now,rdt[0],float(rdt[1]),int(rdt[2]))) 
      conn.commit()    # 処理実行
      conn.close()

変更した dat_rec.pyスクリプトの全てをご覧になりたい方は次のリンクをクリック、もしくはダウンロードして下さい。
dat_rec.py_.txt
テキストファイルとなっています。末尾の_.txtを削除して dat_rec.py として下さい。なお 文字コードはUTF-8、TABサイズは 4 です。

このスクリプトを動かすためには、シリアルパッケージをあらかじめインストールしておく必要があります。また、スクリプトをデーモンとして動作させます。これらについては基本的に変更ありませんので Webサーバー(RasPi+Python) を参照してください。

4.環境データ表示 CGIスクリプト

ブラウザに環境データを表示させるCGIスクリプト( envmon.py )ですが、次の変更を加えました。

露点温度の計算と表示

ブラウザへの表示に「露点」を追加して表示させるようにしました。湿度測定の精度に見合うよう小数点以下は四捨五入しました。

なお 露点温度 は、次に示すように 温度 と 湿度 から計算により求めることができます。

その場所の温度をt[℃]、相対湿度をh[%RH]とすると
 飽和水蒸気圧 Ew[hPa] = 6.11*10^(7.5t/(t+237.3))
 水蒸気圧   E [hPa] = Ew*h/100
 露点温度   D  [℃] = 237.3*log10(6.11/E)/(log10(E/6.11)-7.5)

(重量)絶対湿度[g/㎥] の 表示も検討しましたが、露点から推測できると考えて止めました。

グラフ表示へのリンク設定

ブラウザに表示された「場所名」をクリックするとその場所の環境変化がグラフ表示されるようにリンクを設定しました。グラフ表示用CGIスクリプト( envgaraph.ph )に対して、GETで表示行番号を引数として渡して呼び出しすようにしました。

変更したCGIスクリプトとブラウザ表示(例)

変更したCGIスクリプトをご覧になりたい方は次のリンクをクリック、もしくはダウンロードして下さい。
envmon-py_2.txt
テキストファイルとなっています。末尾の_2.txtを削除して envmon.py として下さい。なお 文字コードはUTF-8、TABサイズは 4 です。

ブラウザでアクセスすれば環境データがリアルタイム表示されます。

URL:http://localhost:8000/cgi-bin/envmon.py
または http://192.168.xxx.xxx:8000/cgi-bin/envmon.py
ブラウザ表示例

ブラウザ表示例

とりあえずここまでとします。グラフ表示については次の投稿をご覧ください。

関連ページ

環境監視システム自作 概要
環境監視システム自作 子機 温湿度センサーユニット
環境監視システム自作 親機1 特定子機監視器
環境監視システム自作 親機2 データ収集 (TWE_Lite+PIC+Serial出力)
環境監視システム自作 Webサーバー(RasPi + Python)
環境監視システム自作 sqlite3によるデータ蓄積とグラフ表示
環境監視システム自作 matplotlibによるグラフ表示
環境監視システム自作 windows+Apacheサーバー
湿度を正確に測る