備忘録

スポンサーサイト

上記の広告は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

Node-REDで線グラフ

センサーから得られた値を表示するためのグラフを作成方法を確認します。
今回は、Node-REDでグラフを出すだけです。

1.ライブラりgoogle chart nodeのインストール
http://flows.nodered.org/node/node-red-contrib-googlechart
こちらのライブラリをインストールします。

$npm install node-red-contrib-googlechart

↑をすると、カレントディレクトリにディレクトリnode_modulesができて、
その中にディレクトリnode-red-contrib-googlechartができます。

カレントディレクトリ
  ┗ node_modules
     ┗ node-red-contrib-googlechart

このディレクトリ構造を、
$HOME直下にあるディレクトリ.node-redにも作ってあげます。

.node-red
  ┗ node_modules
     ┗ node-red-contrib-googlechart

まぁ面倒なら、ディレクトリ.node-redで
$cd $HOME/.node-red
$npm install node-red-contrib-googlechart
をしてください。

2.Node-RED立ち上げ
Node-RED立ち上げ、再起動します。
右側のノードリストに、
chart requestノード、chart responseノードが追加されているのが
確認できるようになります。

ChartRequest

3.ノード組みあげ
今回はグラフを作るだけです。
それぞれドラッグでノードをおいていきます。今回はグラフの値も決めうちです。

全体のフロー
function

ChartRequestノードの設定
今回は線グラフにするので、LineChartを設定
Pathは、/LineChartに設定
Attributesでは、+Addボタンを押して、値となる要素を登録しておきます。
ChartResponse

functionノードの設定
今回はグラフの値を決めうちです。
それぞれグラフの要素と値を書いておきます。
googleのLineChartサンプルの値ですが、なんですかね?これ、映画の観客数でしょうか?
追加されたノード

Chart Response
特に設定するところはないですね
作成したフロー


4.ブラウザで閲覧
http://192.168.0.8:1880/LineChart
パスは、Node-redのIPアドレスと、ChartRequestで設定したPathの設定ですね
できたグラフ

とグラフにできました。
次回は実際に取得したセンサのデータを使って、グラフを出します


続きを読む

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

  1. 2016/06/20(月) 18:13:27|
  2. Raspberry Pi
  3. | トラックバック:0
  4. | コメント:0

Node-REDでセンサーの値をWebに出す

Node-REDを起動させて、
ブラウザアクセスをトリガとして、Webにセンサーの値を出してみたいと思います。

1.Node-REDを起動させます。
$node-red ./html.json

2.ブラウザからNode-REDにアクセスします
今回の場合は、Node-REDを立ち上げているラズベリーパイの
IPアドレスが192.168.0.8なので、ブラウザのURLに↓を入れます
http://192.168.0.8:1880/

3.ノードの作成
それぞれ以下のノードを作成しました。
テストのセンサー値取得

左から、それぞれ以下のように設定しました。
httpノード
 Method:GET
 URL:/bme280

execノード
 Command: $HOME/proj_python/bme280_sample.py
 Append: msg.payloadにチェック

functionノード
 Name:function
 Function:
  var m="";
  m=m+" ";
  m=msg.payload;
  m=m+"
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
";
  m=m+" ";
  msg.payload=m;
  return msg;

http responseノード
 特に何も設定なし

あとはそれぞれをつないであげれば良いですが、
execノードからfunctionノードへの接続は、
execノードの出力○の一番上と繋いでください、

execノードのinfoにも記載されていますが、
出力は、上から標準出力、エラー出力、戻り値になっています。
今回は、標準出力に出てくるものを次のfunctionに渡したいので、上のに繋ぎます。

httpのGETアクセスをトリガとして、
execのコマンドを実行して、コマンドの標準出力を
functionでHTMLの形にしてあげて、
最後にGETのレスポンスとして返す....という形です。

4.ブラウザでセンサーの値を取得

ブラウザから↓にアクセスしてみます
http://192.168.0.8:1880/bme280

temp : 29.79 ℃
pressure : 1016.28 hPa
hum : 45.22 %

とブラウザに表示されました。

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

  1. 2016/06/20(月) 13:30:10|
  2. Raspberry Pi
  3. | トラックバック:0
  4. | コメント:0

BME280温湿気圧の取得

秋月電子通商や、スイッチサイエンスなどで販売されている
BME280モジュールで温度、湿度、気圧を取得します。
http://akizukidenshi.com/catalog/g/gK-09421/
https://www.switch-science.com/catalog/2236/

今回BME280は、ラズベリーパイのI2Cピンに接続します。
ジャンパーJP3をはんだ付けして、
SDA、SCL、GND、VCCをそれぞれ接続、SDOをVCCに繋げるかGNDに繋げるかで
アドレスが変わるらしいですが、今回はGNDへ接続します。
ラズベリーパイのi2c-1(3,5ピンのほう)を使えば、プルアップ抵抗も不要です。

i2c-toolsでちゃんと認識されていることを確認します。
$ sudo i2cdetect -y 1
   0  1  2  3  4  5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- 76 --

次にドライバですが、既にできているものは使います。
スイッチサイエンスさんのほうで、サンプルコードがありますので
今回はPythonのサンプルプログラムをダウンロードします。
https://github.com/SWITCHSCIENCE/BME280/tree/master/Python27

ダウンロードしてきましたら、
サンプルコードの頭に↓を追記
#!/usr/bin/python

次に実行権限を与えます。
シェルより↓
$chmod +x bme280_sample.py

あとサンプルコードは、python smbusを使うのでインストールしておきます
$sudo apt-get install python-smbus

そして実行です。
$./bme280_sample.py

temp : 30.64 ℃
pressure : 1016.12 hPa
hum : 46.81 %

のようにコンソールが出れば、ひとまず成功です。

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

  1. 2016/06/19(日) 06:43:53|
  2. Raspberry Pi
  3. | トラックバック:0
  4. | コメント:0

Node-REDの起動

Node-REDを起動させるのは以下のコマンドで起動できます

$node-red ./html.json

html.jsonは、Node-REDで動かすファイルです。
初回や、ファイルがなければ自動で作成されます。

起動しましたら127.0.0.1:1880で起動したよ
っぽいメッセージがでますので、
好きなPCのブラウザから
http://:1880/
などでNode-REDのノードを組みましょう

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

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

Noderedのインストールから

raspberry piにNode-REDをインストールする方法です。
ってもapt-getなだけです

$sudo apt-get install nodered

ちなみに、最近のRasbian JESSIEには、Node.jsも含めて最初から入ってるっぽいです。
逆にnpmが入っていなかったりするので、必要があれば↓で入れましょう

$sudo apt-get install npm

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

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