このセクションでは、MODEセンサーゲートウェイマシンのCPU温度をセンサーデータに見立て、クラウドへ5秒おきにデータを送信するプログラムを開発してみます。

ログイン

MODEセンサーゲートウェイとディスプレイをHDMIにて接続し、USBキーボードを接続しコンソール・ログイン画面を表示させます。MODE社よりあらかじめ伝えられたIDとパスワードを利用してログインします。

コーディング

簡単に作成できる Bash スクリプトで書いてみましょう。このチュートリアルではコードの修正点をスクリプトファイルに反映しながら進めていきます。コードの完成形は本章の末尾に記載しています。

シェルスクリプトファイルの作成

まずは、ホームディレクトリにcpu_temp.shファイルを作成し、起動スクリプトに/bin/bashを指定します。

$ vi cpu_temp.sh

#!/bin/bash

センサーの宣言

最初にやるべき事はLocal APIに対してセンサーの存在を宣言することです。宣言を行うにはアナウンスAPIを利用します。アナウンスAPIには、センサーの識別IDとセンサーデータのスキーマを知らせます。宣言はJSON形式にて記述して、このチュートリアルではcurlコマンドを用いてHTTPでAnnounce APIにPOSTします。


先ほどのcpu_temp.shに下記を追記します。


announce_json=$(cat <<JSON

{

  "model": "CUSTOM",

  "id": "MyNUC",

  "sensors": [

    "TEMPERATURE:0"

  ]

}

JSON

)


curl -X POST -d "$announce_json" \

  --header "Content-Type: application/json" \

  http://localhost:55299/announce


開発版のMODEセンサーゲートウェイで設定できるセンサーの”model”は常にCUSTOMです。”id”はセンサーの固有の識別子です。MODEのHomeID内でユニークなidを指定してください。MODEのHomeIDについて学ぶ前であれば、ご自分の管理するセンサー内で重複しないようにすればよいとだけ覚えてください。

収集するデータは、温度データ1つですので、TEMPERATURE型で1つのスキーマを定義します。

作られたJSONをcurlコマンドでPOSTします。

データを収集する

このMODEセンサーゲートウェイに使われているハードウェアであるNUC5CPYH上のLinuxでは、CPUの温度は次のファイルから取得することができます。

/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input


中を開くと例えば 44000 とあります。これはCPU温度が44.000℃であることを表しています。

次のようなsleep付きのループを追加し、5秒毎に変数にCPU温度を格納するようにしてみましょう。

while true

do

  sleep 5


  temp=$(cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input)

done

データをMODEセンサークラウドへLocal APIで送る

前のセクションで収集したCPUの温度データをデータ送付APIで送ってみましょう。データはJSON形式で定義して送信できます。スキーマとセンサー値を対にして送信します。”timestamp”フィールドは省略することもできますが、ここではタイムスタンプを付与して送信してみます。


先ほどのループを次のように改変してみましょう。太字部分です。また、いったんここまでのコードの全体も示しておきます。

#!/bin/bash


announce_json=$(cat <<JSON

{

  "model": "CUSTOM",

  "id": "MyNUC",

  "sensors": [

    "TEMPERATURE:0"

  ]

}

JSON

)


curl -X POST -d "$announce_json" \

  --header "Content-Type: application/json" \

  http://localhost:55299/announce


while true

do

  sleep 5


  temp=$(cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input)

  value=$(echo $temp | awk '{print $1/1000}')


  data_json=$(cat <<JSON

    [

      {

        "sensor": "TEMPERATURE:0",

        "value": $value

      }

    ]

JSON

)


  curl -X POST -d "$data_json" \

    --header "Content-Type: application/json" \

    http://localhost:55299/sensorModules/CUSTOM:MyNUC/sensorData

done

確認と仕上げ

うまくできていれば、MODEセンサークラウドのUIで送信されたデータを確認することができます。

シェルスクリプトを保存し、実行権限を付けます。

$ chmod +x cpu_temp.sh


その後実行してみましょう。

    $ ./cpu_temp.sh


実行すると、アナウンスAPIがまず呼ばれ、データが5秒間隔で送信されます。アナウンスAPIにより、MODEセンサークラウドはMODEセンサーゲートウェイにセンサーが接続されていることを認識できます。


プログラムの確認のため、MODEセンサークラウドにアクセスし、センサーモジュールのスキャンをしてみましょう。



右上の [Add Modules] ボタンを押下します。


[ Start Scanning] ボタンを押下し、センサーのスキャンをします。


アナウンスAPIで宣言した、”MyNUC”のセンサーが表示されれば成功です。

”MyNUC”を選択し、 [Add Sensor Modules] ボタンを押下しましょう。


次のように”0001:MyNUC”があれば、センサーデータの収集がはじまっています。

センサーを選択して、データを確認してみましょう。


CPU温度に変化が無くてつまらない場合は、別途下記のようなシェルスクリプトをいくつかバックグラウンドで実行してCPUを負荷をかけ、温度を上昇させててみましょう。テストのあとはプロセスを止め忘れないようにしてください。

#!/bin/bash

while true

do

  date +%s | sha256sum > /dev/null

done

コマンドの受信

MODE クラウドからコマンドを受け取れるようにしてみましょう。ここのチュートリアルではデータ送信の停止と再開をできるようにします。


先ほどのデータ収集のループにコマンドを受け取ることができるコマンド取得 APIを追記します。今までのコードのループに対して、下記太字部分を追記します。


while true

do

  sleep 5


  curl -s -X GET \

    http://localhost:55299/sensorModules/CUSTOM:MyNUC/command


  temp=$(cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input)

  value=$(echo $temp | awk '{print $1/1000}')


  data_json=$(cat <<JSON

    [

      {

        "sensor": "TEMPERATURE:0",

        "value": $value

      }

    ]

JSON

)


  curl -X POST -d "$data_json" \

    --header "Content-Type: application/json" \

    http://localhost:55299/sensorModules/CUSTOM:MyNUC/sensorData

done


実行すると、数回次のようなJSONが出力されます。アナウンス時や接続時にセンサーの起動コマンドが自動的に送信されてきたものです。

$ ./cpu_temp.sh

{"action":"startSensors","interval":30,"sensors":["TEMPERATURE:0"]}


MODEセンサークラウドからセンサーのストップの指示が来た時はセンサーデータを送らないように、スタートの指示の時はデータを送るようにループを改修してみましょう。

修正と追記する箇所は下記の太字部分です。ループに入る直前に変数の初期化が追加されているところに注意してください。


sensing=true

while true

do

  sleep 5


  cmd=$(curl -s -X GET -w '%{http_code}' \

    http://localhost:55299/sensorModules/CUSTOM:MyNUC/command |\

  grep 200)


  echo $cmd | grep startSensor && sensing=true

  echo $cmd | grep stopSensor && sensing=false


  ! $sensing && continue


  temp=$(cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input)

  value=$(echo $temp | awk '{print $1/1000}')


  data_json=$(cat <<JSON

    [

      {

        "sensor": "TEMPERATURE:0",

        "value": $value

      }

    ]

JSON

)


  curl -X POST -d "$data_json" \

    --header "Content-Type: application/json" \

    http://localhost:55299/sensorModules/CUSTOM:MyNUC/sensorData

done

収集の設定

最後にMODEセンサーゲートウェイの電源が切れ、再起動された場合にもデータ収集が自動的に開始するような設定をしてみましょう。cronにて先ほど書いたスクリプトを起動するよう実行コマンドを追記します。crontab -e コマンドを使ってエディタを起動して設定ファイルを開いてください。

$ crontab -e


下記を最下行に追記し、保存します。

@reboot nohup /home/ubuntu/cpu_temp.sh > /dev/null &


再起動し、データがMODEセンサークラウドで確認できていれば成功です。再起動は、MODEセンサーゲートウェイの電源ボタンを押して電源を切り(電源ボタンの青いLEDが消えます)、もう一度押すことでできます。もしくは、下記コマンドで再起動できます。

$ sudo shutdown -r now

チュートリアルのコード全体

完成したコード全体をここに示します。

#!/bin/bash


announce_json=$(cat <<JSON

{

  "model": "CUSTOM",

  "id": "MyNUC",

  "sensors": [

    "TEMPERATURE:0"

  ]

}

JSON

)


curl -X POST -d "$announce_json" \

  --header "Content-Type: application/json" \

  http://localhost:55299/announce


sensing=true

while true

do

  sleep 5


  cmd=$(curl -s -X GET -w '%{http_code}' \

    http://localhost:55299/sensorModules/CUSTOM:MyNUC/command |\

  grep 200)


  echo $cmd | grep startSensor && sensing=true

  echo $cmd | grep stopSensor && sensing=false


  ! $sensing && continue


  temp=$(cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input)

  value=$(echo $temp | awk '{print $1/1000}')


  data_json=$(cat <<JSON

    [

      {

        "sensor": "TEMPERATURE:0",

        "value": $value

      }

    ]

JSON

)


  curl -X POST -d "$data_json" \

    --header "Content-Type: application/json" \

    http://localhost:55299/sensorModules/CUSTOM:MyNUC/sensorData

done