備忘録

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

Node-REDでセンサー計測値取得&MySQL& グラフ出力①

Node-REDでMySQLを使ってみます

1.Node-REDにMySQLのノードを追加
http://flows.nodered.org/node/node-red-node-mysql

$cd $HOME/.node-red
$npm install node-red-node-mysql

Mysqlノードをインストールします。
.node-redの下のmoduleにインストールされるように
最初ディレクトリ.node-redへ移動してからインストールします。

ここで一度Node-REDが起動していたら、再起動します。
http://<node-redが動いているサーバーのIPアドレス:ポート>
Node-REDに入ると下図のようにmysqlのノードが追加されました。


mysqlノード


2.元のセンサー計測値取得プログラムの修正
横道に一度それますが、BME280の計測値取得プログラムを修正します。

以前に紹介しましたが、スイッチサイエンスさんのサンプルプログラムを使用していました。
github.com/SWITCHSCIENCE/BME280/tree/master/Python27

MySQLに取り込み易いように、あと温度・湿度・気圧をそれぞれ個別に取得できるように
ちょっとだけ修正しました。青く着色している部分が修正行です。


- - - - BME280_temp.py (下の修正をしてリネームしたファイル)- - - - - -

bme280_sample.pyの以下の部分を修正しました。

bme280_sample.py L.62~
湿度・気圧の計測・出力する処理をコメントアウト

def readData():
    data = []
    for i in range (0xF7, 0xF7+8):
        data.append(bus.read_byte_data(i2c_address,i))
    #pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
    temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
    #hum_raw  = (data[6] << 8)  |  data[7]
   
    compensate_T(temp_raw)
    #compensate_P(pres_raw)
    #compensate_H(hum_raw)


bme280_sample.py L.98~
出力は数値のみする

def compensate_T(adc_T):
    global t_fine
    v1 = (adc_T / 16384.0 - digT[0] / 1024.0) * digT[1]
    v2 = (adc_T / 131072.0 - digT[0] / 8192.0) * (adc_T / 131072.0 - digT[0] / 8192.0) * digT[2]
    t_fine = v1 + v2
    temperature = t_fine / 5120.0
    print "%-6.2f" % (temperature)

- - - - BME280_hum.py (下の修正をしてリネームしたファイル)- - - - - -
bme280_sample.pyの以下の部分を修正しました。

bme280_sample.py L.62~
温度・気圧の計測・出力する処理をコメントアウト

def readData():
    data = []
    for i in range (0xF7, 0xF7+8):
        data.append(bus.read_byte_data(i2c_address,i))
    #pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
    #temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
    hum_raw  = (data[6] << 8)  |  data[7]
   
    #compensate_T(temp_raw)
    #compensate_P(pres_raw)
    compensate_H(hum_raw)

bme280_sample.py L.106~
出力は数値のみする

def compensate_H(adc_H):
    global t_fine
    var_h = t_fine - 76800.0
    if var_h != 0:
        var_h = (adc_H - (digH[3] * 64.0 + digH[4]/16384.0 * var_h)) * (digH[1] / 65536.0 * (1.0 + digH[5] / 67108864.0 * var_h * (1.0 + digH[2] / 67108864.0 * var_h)))
    else:
        return 0
    var_h = var_h * (1.0 - digH[0] * var_h / 524288.0)
    if var_h > 100.0:
        var_h = 100.0
    elif var_h < 0.0:
        var_h = 0.0
    print "%6.2f" % (var_h)


- - - - BME280_air.py (下の修正をしてリネームしたファイル)- - - - - -
bme280_sample.pyの以下の部分を修正しました。

bme280_sample.py L.62~
温度・湿度の計測・出力する処理をコメントアウト

def readData():
    data = []
    for i in range (0xF7, 0xF7+8):
        data.append(bus.read_byte_data(i2c_address,i))
    pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
    #temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
    #hum_raw  = (data[6] << 8)  |  data[7]
   
    #compensate_T(temp_raw)
    compensate_P(pres_raw)
    #compensate_H(hum_raw)

bme280_sample.py L.74~
出力は数値のみする

def compensate_P(adc_P):
    global  t_fine
    pressure = 0.0
   
    v1 = (t_fine / 2.0) - 64000.0
    v2 = (((v1 / 4.0) * (v1 / 4.0)) / 2048) * digP[5]
    v2 = v2 + ((v1 * digP[4]) * 2.0)
    v2 = (v2 / 4.0) + (digP[3] * 65536.0)
    v1 = (((digP[2] * (((v1 / 4.0) * (v1 / 4.0)) / 8192)) / 8)  + ((digP[1] * v1) / 2.0)) / 262144
    v1 = ((32768 + v1) * digP[0]) / 32768
   
    if v1 == 0:
        return 0
    pressure = ((1048576 - adc_P) - (v2 / 4096)) * 3125
    if pressure < 0x80000000:
        pressure = (pressure * 2.0) / v1
    else:
        pressure = (pressure / v1) * 2
    v1 = (digP[8] * (((pressure / 8.0) * (pressure / 8.0)) / 8192.0)) / 4096
    v2 = ((pressure / 4.0) * digP[7]) / 8192.0
    pressure = pressure + ((v1 + v2 + digP[6]) / 16.0) 

    print "%7.2f" % (pressure/100)

- - - - - - - - - - - - - - - - - - - - - -
動作テストをしてみます。

$ ./BME280_temp.py
28.31
$ ./BME280_hum.py
 45.48
$ ./BME280_air.py
 954.12

それぞれ温度、湿度、大気圧の値だけを、
個別に取り出せるようにできました。

3.フローの作成
今回は3つのフローを作成します。
 a. センサーから計測値を取得して、MysqlのDBに保存するフロー
 b. MySQLのDBから、24時間分の
 c. ブラウザからのGETリクエストに対して、測定結果をグラフで表示するフロー

それぞれ順に作成していきます。
a. センサーから計測値を取得して、MysqlのDBに保存するフロー
WS000005_20160626025456a41.jpg 左から、Injectノード→ execノード①→ functionノード①
             → execノード②→ functionノード②
             → execノード③→ functionノード③ → mysqlノード
という形です。
functionノード③と、mysqlノードの出力には一応debugノードを付けていますが、
出力を確認する必要がなければ不要です。

injectノード
10分ごとにこのフローを走らせるので、Repeat=intervalにして、every10minitesに設定しました
WS000010.jpg

execノード①
センサーから温度のみを取得します。
コマンドに、さっき作ったBME280_temp.pyを指定します。
結果は、msg.payloadに追記で載せたいので、Appendにもチェックを入れます。
WS000011.jpg

functionノード①
INSERTコマンドで、dbへデータを登録していきますが、そのコマンドコールを作っていきます。
msg.topicへコマンドコールをまんま書き込んでいきます。
今回 カラムid=1,カラムdateは、このフローが動いたときなのでnow()を指定しています。
WS000012.jpg

execノード②
湿度を取得する処理をコールして、Appendのmsg.payloadにチェックを入れます
WS000013.jpg

functionノード②
今までのmsg.topicに、直前のexecノード②の出力結果を追記します。
mysqlのInsertコマンドコールの文を意識して、","も入れます。
WS000014.jpg

execノード③
大気圧を取得するプログラムを指定します。
Appendのmsg.payloadにチェックを入れます。
WS000015.jpg

functionノード③
msg.topicに、execノード③の出力を追記します。
WS000016.jpg

mysqlノード
鉛筆マークよりInsetコマンドを動かすサーバーを指定します。
鉛筆アイコンから、サーバーを追加します。
それぞれmysq;サーバーを指定します
それぞれUser、password、Datebaseを入力します。
WS000024.jpg

WS000023.jpg


私の環境だと問題なく動作しますが、execノード①のテーブル指定は、
tb_sensor を、
db_sendor.tb_sensor したほうがいいかもしれません。

さすがに長すぎますので、次のフローは次回に。。。
スポンサーサイト

テーマ:ハードウェア - ジャンル:コンピュータ

  1. 2016/06/26(日) 03:36:55|
  2. Raspberry Pi
  3. | トラックバック:0
  4. | コメント:0

MySQLをインストール

今日は実際のデータを取りながら、それぞグラフにしていこうと思っていたのですが、
センサーのデータを、テキストに落としていくとか、
長い目でみてアレなので、MySQLに保存していくようにします。

1.MySQLに保存
$sudo apt-get install mysql-server
インストール時にパスワードを求められますが任意に設定します。

2.データベース・テーブルの作成

# mysqlにログイン
$mysql -u root -p
<この後にパスワードを求められるので入力>

# 現在のデータベースを確認
mysql>show databases;
<出力>
+--------------------+
| Database          |
+--------------------+
| information_schema    |
| mysql            |
| performance_schema   |
+--------------------+
4 rows in set (0.01 sec)

最初から3つのDBがあるみたいですね

# データベースの作成
mysql>create database db_sensor;
<出力>
Query OK, 1 row affected (0.00 sec)

db_sensorという名称のデータベースを作りました。
念のため、show databases;で確認すると
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_sensor          |
| mysql              |
| performance_schema |
+--------------------+

確かにdb_sensorが作られました。

# データベースの選択
mysql>use db_sensor;
<出力>
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

useコマンドでデータベースを選択します。

# テーブルの作成
mysql>create table tb_sensor( id int , date datetime, temperature float, humidity float, atom float);

これでtb_sensorというテーブルが作られます。
括弧の中は、作られるカラムを指定します。
int型のカラム id
日時datetime型のカラム date
float型のカラム temerature
float型のカラム humdity
float型のカラム atom
と作りました。

#テーブルの確認
mysql >show tables;
<出力>
+---------------------+
| Tables_in_db_sensor |
+---------------------+
| tb_sensor           |
+---------------------+

これでひとまずセンサーのデータを保存するデータベースとテーブルができました。
長くなるので、この先は次回へ

テーマ:ハードウェア - ジャンル:コンピュータ

  1. 2016/06/26(日) 01:39:23|
  2. Raspberry Pi
  3. | トラックバック:0
  4. | コメント:0
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。