- 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
- Rapberry piにi2cでアクセス可能なセンサを接続する。
- cronで定期的に起動するスクリプトでセンサ情報を取得し、テキスト形式のログファイルに出力する。
- 出力されたファイルをJSON形式に変換する。
- https://c3js.org/ で可視化する。
- APDS9960使用 光学式ジェスチャーセンサモジュールキット http://akizukidenshi.com/catalog/g/gK-09754/
- BME280使用 温湿度・気圧センサモジュールキット http://akizukidenshi.com/catalog/g/gK-09421/
ラズパイ4Bは、放熱のためにアルミ合金ケースに入れているが、GPIO(40pin)はフラットケーブルで
ケース外に引き出すことができる。
そこからブレッドボードに繋いでセンサモジュールを接続してみた。
# 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
とりあえず、認識されているようだ。
# apt install python3-smbus python3-pip
# python3 -m pip install apds9960
# python3 -m pip install RPi.GPIO
2.2 his.ambient.py
光センサからの取得データを標準出力に出して終わる。
# python3 ./his.ambient.py
{ "place" : "home" , "time" : "2020-08-22T00:16:01Z" , "AmbientLight" : 4398 , "red" :1296 , "green" :1389 , "blue" :1483 }
2.3 his.env2.py
環境センサからの取得データを標準出力に出して終わる。
# 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.4 his.log.wrap.sh
2つのセンサ情報をまとめて、本日付の名前のログファイルに出力するスクリプト。
スクリプト内で、上記his.ambient.pyとhis.env2.pyを起動し、出力をマージ・整形している。
10分ごとにhis.log.wrap.shを起動する。
# crontab -e
で編集する。
*/10 * * * * /home/shibata/scripts/his.log.wrap.sh
下記のように、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.1 log2json.awk
標準入力のテキストを、単純にJSON形式に変換して標準出力するawkスクリプト。
ファイル形式のチェックは行なっていない。つまり、たいしたことはやってない。
- 毎時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)
https://github.com/c3js/c3 から必要なものを有り難く頂く。
c3.jsはさらにd3.jsを前提としている。
4.2 index.html
c3.jsを使ったグラフ表示を行うための入り口
4.3 c3-test.js
JavaScriptによるグラフ表示スクリプト
下記で試験的に公開中。いつ止まるかわかりません。
http://euqset.org/
上記サイトは、直近8日間の値を表示している。
- 表示対象のデータ範囲を指定できるようにする。