【GASでIoT】GASとラズパイでおこなう、お手軽データ・ロギング&フィードバック制御〔解説編4〕~ラズベリーパイの情報をGAS側で受ける⇒スプレッドシートに自動記録する~
この記事のシリーズでは、Googole Apps Script(GAS)を利用して、日常生活を便利にする事をテーマにしています。
GASへのアクセスは、通常はキーボードから文字情報で行いますが、「Raspberry Pi(ラズベリーパイ)」というシングルボードコンピュータを介することで、文字以外の情報をインプットする事ができます。
今回インプットする情報は「温度」で、この情報を利用して電気なべの温度をコントロールしよう、というのがテーマです。
先回までの記事で、ラズベリーパイ側から温度の情報を、発信するところまでご説明しました。
今回は、その情報をGAS側で受けて、スプレッドシートに記録するとこまでをご説明します。
ここまでのシステム全体の振り返り
最初に、システム全体の構成と、今回どこを説明しているのかご説明します。
今回説明しようとしている部分は、以下の左側の囲み部で、ラズベリーパイが、マクロコード付きでGASにアクセスしたところからになります。
マクロコードとは何かというと、アクセス用URLに続けて付加される、?ではじまる以下の様な情報の事でした。
HTTPS:// GASのURL ?<変数名1=値1>&<変数名2=値2>・・・
マクロコードに含まれる情報は、GASではdoGet()関数の引数として簡単に処理できる
GASには、プロジェクト内で、1つだけ設定できる、doGet()関数 というものがあり、以下の様なコードで、アクセスを受けた時の処理を記述できます。
doGet(){ アクセスを受けた時の処理 }
この時のマクロコードを受けた時の処理は簡単で、以下の様に、doGet()関数の引数として記述することで、その情報を受け取る事ができます。
doGet(e){ var 変数=e.parameter.変数名; }
引数は「イベント(event)変数」の意味でeを使用する事が多いのですが、この引数の子要素として、.parameter.変数名 を指定することで、簡単に値を取得できます。
今回は変数名を thrm として 以下の様にアクセスしますので、
HTTPS:// GASのURL ?thrm=温度
次の様なコードで温度データを取得できることになります。
doGet(e){ var thrm=e.parameter.thrm; }
受け取ったデータをスプレッドシートへ記録(データ・ロギング)する
受け取ったデータは、セルを指定する getRange( ) 関数と、その子要素である setValue( ) を以下の様に使えば、スプレッドシートのセルに簡単に記録できます。
シート.getRange(セル番地).setValue(値);
時刻の取得
ところで、取得した温度の時間変化を知りたい場合、その時刻も同時に記録しておく必要があります。
時刻は、Date( ) 関数と、formatDate(タイムゾーン、書式)関数を下の様に使う事で取得できるので、これも同様の処理でセルに記録する様にします。
変数=new Date();
時刻 = Utilities.formatDate(変数, 'Asia/Tokyo', 'yyyy/MM/dd hh:mm:ss');
スプレッドシートの用意
記録用のスプレッドシートは、以下の様なものとします。
シート名は「温度」で、1行目には表題が入っています。
2~7行目(オレンジ色のセル)は、A列、B列、C列にそれぞれ、以下の関数が入っています。
A列:=A8
B列:=B8
C列:=round((A行番号-A$2)*24*60,2)
コード
上記のスプレッドシートに書き込む処理は、以下の様なコードになります。
function doGet(e) {
//マクロコードを受け取る
var thrm=e.parameter.thrm;
//マクロコードが無い場合の処理
if(e.parameter.thrm == null){
return ContentService.createTextOutput('No Data');
}else{
//アプリケーションを取得|スプレッドシートのIDは各自のものを記入
var myApp = SpreadsheetApp.openById('★スプレッドシートのID★');
//対象シートをシートの名前を指定して取得
var mySheet = myApp.getSheetByName('温度');
//Date型の時刻オブジェクトを取得(初期値は現在日時)
var date = new Date();
//現在時刻を取得
var myDate = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd hh:mm:ss');
//最終行+1行目にデータを記録
var NewDateRow = mySheet.getLastRow() + 1;
mySheet.getRange(NewDateRow, 1).setValue(myDate);
mySheet.getRange(NewDateRow , 2).setValue(thrm);
mySheet.getRange(NewDateRow-1 , 3).copyTo(mySheet.getRange(NewDateRow , 3));
新しくデータを書き込む時は、getLastRow( ) 関数を利用して最終行を取得し、それより1多い行(=最終行の次の行)に書き込む様にしています。
また、時間経過を知るために、C列では、経過時間を表示する関数を copyTo()関数を使って、直前の行を複写する形でコピーしています。
測定が始まると、以下の様に8行目から書き込みがはじまります。
以上、ラズベリーパイからのデータが、見事、GASとスプレッドシートを使って記録(データ・ロギング)できました!
IoTの世界では、センサのデータを受けて記録するサービスが色々ありますが、HTPSではじまるURLにアクセスさえできれば、この様に無料で簡単にデータ・ロギングが可能です。
ここで一端記事を切って、続きは次の記事といたします。
次は、得られた記録を使って、ラズベリーパイ側に、電気なべを制御するためのデータをレスポンスする部分の説明をする予定です。