/his.RASP.i2c

Python scrips for i2c sensors on Raspberry Pi

Primary LanguagePython

his.RASP.i2c abstruct

  • Python scrips for i2c sensors on Raspberry Pi
  • script for convert from "test formated log file" to "JSON format"
  • https:/c3.js.org based JavaScript for display line chart

概要

  1. Rapberry piにi2cでアクセス可能なセンサを接続する。
  2. cronで定期的に起動するスクリプトでセンサ情報を取得し、テキスト形式のログファイルに出力する。
  3. 出力されたファイルをJSON形式に変換する。
  4. https://c3js.org/ で可視化する。

1.センサ接続

1.1 対象センサ

1.2 接続概要図

ラズパイ4Bは、放熱のためにアルミ合金ケースに入れているが、GPIO(40pin)はフラットケーブルで
ケース外に引き出すことができる。
そこからブレッドボードに繋いでセンサモジュールを接続してみた。

1.3 接続確認

# apt install i2c-tools
# i2cdetect -y 1

         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- 39 -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- 76 --              
  • 0x39がAPDS9960
  • 0x76がBME280

とりあえず、認識されているようだ。

2.センサ情報取得

2.1 前提ソフトウエアのインストール

# apt install python3-smbus python3-pip
# python3 -m pip install apds9960
# python3 -m pip install  RPi.GPIO

光センサからの取得データを標準出力に出して終わる。

# python3 ./his.ambient.py 
{ "place" : "home" ,  "time" : "2020-08-22T00:16:01Z" ,  "AmbientLight" : 4398 ,  "red" :1296 ,  "green" :1389 ,  "blue" :1483 }

環境センサからの取得データを標準出力に出して終わる。

# python3 ./his.env2.py 
{ "place": "home" , "time": "2020-08-22T00:13:13Z" , "cpu": 39.0 , "temp": 35.1 , "humid": 49.5 , "pressure": 1012.3 }

2つのセンサ情報をまとめて、本日付の名前のログファイルに出力するスクリプト。
スクリプト内で、上記his.ambient.pyとhis.env2.pyを起動し、出力をマージ・整形している。

2.5 cronの設定

10分ごとにhis.log.wrap.shを起動する。

# crontab -e

で編集する。

*/10 * * * * /home/shibata/scripts/his.log.wrap.sh

2.6 ログファイル例

下記のように、1行ごとに2つのセンサ情報を記録している。
cpu:はRaspberry PiのCPU温度センサの値。

{ "place" : "home" , "time" : "2020-08-22T00:00:02Z" , "AmbientLight" : 4057 , "
red" :1156 , "green" :1260 , "blue" :1370  , "cpu": 40.1 , "temp": 35.3 , "humid
": 49.3 , "pressure": 1012.4 }
{ "place" : "home" , "time" : "2020-08-22T00:10:02Z" , "AmbientLight" : 3175 , "
red" :875 , "green" :989 , "blue" :1115  , "cpu": 40.1 , "temp": 35.1 , "humid":
 49.5 , "pressure": 1012.4 }
{ "place" : "home" , "time" : "2020-08-22T00:20:02Z" , "AmbientLight" : 3144 , "
red" :863 , "green" :978 , "blue" :1109  , "cpu": 40.1 , "temp": 35.2 , "humid":
 49.4 , "pressure": 1012.4 }

3.出力ファイルをJSON形式に変換

標準入力のテキストを、単純にJSON形式に変換して標準出力するawkスクリプト。
ファイル形式のチェックは行なっていない。つまり、たいしたことはやってない。

3.2 cronの設定

  • 毎時07分と37分に起動し、下記の処理を行う。
  • ログファイルは日付ごとのファイル名を持ったものとなっている。
  • ファイル名でソートし、直近の9日分のファイル名を取得する。
  • 9日分のファイルの内容を連結(cat)し、その中からさらに直近の1153行のログを取得する。
  • 尚、1153行の意味は下記。
    表示期間8日間 × 24時間/日 × 60分/時間 ÷ ログ1行/10分間隔 + 1行 = 1153行
7,37 * * * * cp -au /home/shibata/his.SensorLogs/Log-2* /var/www/euqset.org/Logs/ && (cat `ls -1 /var/www/euqset.org/Logs/Log-*|sort|tail -9`|sort|tail -1153|/home/shibata/scripts/log2json.awk > /var/www/euqset.org/Log.txt)

3.3 出力ファイル例

Log.txt

4.JSON形式ファイルの内容を可視化

4.1 前提ソフト

https://github.com/c3js/c3 から必要なものを有り難く頂く。

c3.jsはさらにd3.jsを前提としている。

c3.jsを使ったグラフ表示を行うための入り口

JavaScriptによるグラフ表示スクリプト

4.4 出力サンプル

5.お試しサイト

下記で試験的に公開中。いつ止まるかわかりません。
http://euqset.org/ 上記サイトは、直近8日間の値を表示している。

6.今後の予定

  • 表示対象のデータ範囲を指定できるようにする。