見出し画像

【GASでIoT】GASとラズパイでおこなう、お手軽データ・ロギング&フィードバック制御〔解説編4〕~ラズベリーパイの情報をGAS側で受ける⇒スプレッドシートに自動記録する~

この記事のシリーズでは、Googole Apps Script(GAS)を利用して、日常生活を便利にする事をテーマにしています。

GASへのアクセスは、通常はキーボードから文字情報で行いますが、「Raspberry Pi(ラズベリーパイ)」というシングルボードコンピュータを介することで、文字以外の情報をインプットする事ができます。

今回インプットする情報は「温度」で、この情報を利用して電気なべの温度をコントロールしよう、というのがテーマです。

先回までの記事で、ラズベリーパイ側から温度の情報を、発信するところまでご説明しました。

今回は、その情報をGAS側で受けて、スプレッドシートに記録するとこまでをご説明します。

ここから先は、Google Apps Script についての説明です

ここまでのシステム全体の振り返り


最初に、システム全体の構成と、今回どこを説明しているのかご説明します。

今回説明しようとしている部分は、以下の左側の囲み部で、ラズベリーパイが、マクロコード付きでGASにアクセスしたところからになります。

マクロコードとは何かというと、アクセス用URLに続けて付加される、ではじまる以下の様な情報の事でした。

HTTPS:// GASのURL ?<変数名1=値1>&<変数名2=値2>・・・

注意)マクロコードで送信する情報は、アクセスのログなどを参照することで、簡単に第三者に知られてしまうそうですので、重要な情報のやりとりには使わない様にします。

マクロコードに含まれる情報は、GASではdoGet()関数の引数として簡単に処理できる


GASには、プロジェクト内で、1つだけ設定できる、doGet()関数 というものがあり、以下の様なコードで、アクセスを受けた時の処理を記述できます。

doGet(){ アクセスを受けた時の処理 }

この時のマクロコードを受けた時の処理は簡単で、以下の様に、doGet()関数の引数として記述することで、その情報を受け取る事ができます。

doGet(e){ var 変数=e.parameter.変数名; }

引数は「イベント(event)変数」の意味でを使用する事が多いのですが、この引数の子要素として、.parameter.変数名 を指定することで、簡単に値を取得できます。

今回は変数名を thrm として 以下の様にアクセスしますので、

HTTPS:// GASのURL ?thrm=温度

次の様なコードで温度データを取得できることになります。

doGet(e){ var thrm=e.parameter.thrm; }

受け取ったデータをスプレッドシートへ記録(データ・ロギング)する


受け取ったデータは、セルを指定する getRange( ) 関数と、その子要素である setValue( )  を以下の様に使えば、スプレッドシートのセルに簡単に記録できます。

シート.getRange(セル番地).setValue(値);

注意)GASには、エクセルのマクロ(VBA)の様な、Cells(セル番地) という一つの関数で済むという命令文はありません。セルへの読み書きはすべて、一度getRange( ) という関数で範囲を取得して、その子関数という形でおこないます。

時刻の取得

ところで、取得した温度の時間変化を知りたい場合、その時刻も同時に記録しておく必要があります。

時刻は、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)

オレンジ色のセルは、初期状態での「最終行」を7行目(7行目までは色々な記述がある)とするための調整で、あまり意味はありません。

コード

上記のスプレッドシートに書き込む処理は、以下の様なコードになります。

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にアクセスさえできれば、この様に無料で簡単にデータ・ロギングが可能です。

ここで一端記事を切って、続きは次の記事といたします。

次は、得られた記録を使って、ラズベリーパイ側に、電気なべを制御するためのデータをレスポンスする部分の説明をする予定です。


いいなと思ったら応援しよう!