「ラズパイ」と「スプレッドシート」で全自動水耕栽培器をつくって女の子にTwitterで実況しながら栽培してもらう:⑨各種機能編 ~取得した情報をスプレッドシートにまとめる~

Get Data Into Sheet!

今回はラズパイで取得したデータをスプレッドシートに書き込んでいく。これができれば晴れてIoTと語れるようになるので頑張っていこう。

 

スプレッドシートに情報を取得するってどんな感じなの?

こんな感じです。緯度経度・日の出・日の入り・画像パスなどの情報はセキュリティ的に問題があるので伏せておきます。

f:id:udonnamerou:20200814010725p:plain



どうやってデータをスプレッドシートに送るのか?

「HAGUKUMU」ではスプレッドシートに情報を送る方法として以下の3つがある。それぞれ解説していきたい。

  1. Pydriveを使ってGoogleDrive経由でスプレッドシートに情報を送る
  2. ラズパイからURLを送り、シート側がdoGetで受け取ることで情報を取得する
  3. APIを使ってスプレッドシート側から取得する

 

1.Pydriveを使ってGoogleDrive経由でスプレッドシートに情報を送る

1.については以前の記事でやったことで、Pydriveを経由してGoogleドライブに画像を送信する方法である。なお、Googleドライブにある画像をスプレッドシートで取得する方法についてはまだ述べていないので、ここでさらっとソースコードを張り付けておく。

 

  1. GASを使ってGoogleDriveに上がっている画像IDを取得するプログラム
//GAS
function
getImageFromDrive() { var imageid = "your_folderID"; var gif_imageid = "your_folderID"; var array = {}; ipath = _returnImagePath(imageid); gpath = _returnImagePath(gif_imageid); array["ipath"] = ipath; array["gpath"] = gpath; return array; } function _returnImagePath(id){ list = []; folder = DriveApp.getFolderById(id); files = folder.getFiles(); while(files.hasNext()) { var buff = files.next(); list.push([buff.getId()]); }; list = list.reverse(); imagepath = list.pop();
//imagepathを返す return imagepath; }

やっていることはこの記事に近い。

 

2.ラズパイからURLを送り、シート側がdoGetで受け取ることで情報を取得する

 

1.取得した高さデータをラズパイ側でhttpでポストする

//f_countは高さデータ 0.05.0などのフロート型が入る
def witeToGs(f_count):  
    value = str(f_count)
    if (f_count == 0):
  f_countが0の場合計測できていないので、エラーと判定する
        value = "err"
        
    url = "https://script.google.com/macros/s/your_spreadID/exec?data1=" + value
    requests.get(url)

2.スプレッドシート側のdoGetメソッドで高さを取得

function doGet(e) {
  var lastRow = dsheet.getLastRow();
  var spreadsheetId = "your_spreadsheetID";
  var sheetName = "your_sheet";
  var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  
  var value = e.parameter.data1;
  sheet.getRange(lastRow,D_HEI,1,1).setValue(value);
}

やっていることはこの記事に近い。

 

3.APIを使ってスプレッドシート側から取得する

「HAGUKUMU」はSORACOMのサマーインターンシップ応募作品として作成しているため、SORACOMさんからGPSマルチユニットの供与を受けている。GPSマルチユニットは気温や湿度、位置情報などのデータを取得してくれるすごいやつで、それらのデータはSORACOMのエンドポイントを設定してあげることでAPIで取得できる。

SORACOMのAPIについては公式の利用ガイドを参照してほしいのだが、せっかくなので、取得に必要なコードをここに記載しておく。

function getSoracomInfo() {

  //APIを叩く  
  rawdata      = _requestJson();
  //JSONをパースする
  soracomInfos = _jsonParse(rawdata)
    
  var Array = {};
  Array["lat"]  = soracomInfos["lat"];
  Array["lon"]  = soracomInfos["lon"];
  Array["bat"]  = soracomInfos["bat"];
  Array["temp"] = soracomInfos["temp"];
  Array["humi"] = soracomInfos["humi"];
  
  return Array
  }

function _requestJson(){
  const IMSI        = "your_IMSI"
  const URL         = "https://api.soracom.io/v1/subscribers/your_IMSI/data"
  
 //アクセストークンの取得
  var array = _returnAuth ()

  var apikey = array["apiKey"]
  var token = array["token"]
  
  var options = {
     "headers" : {
       "X-Soracom-API-Key" : apikey,
       "X-Soracom-Token": token
     }
  } 
  
  var rawdata = UrlFetchApp.fetch(URL, options).getContentText();
  return rawdata
}

function _jsonParse(r){
  var jdata = JSON.parse(r)
  var latestjdata = jdata[0]
  
  //文字型で認識されているようなので、もういちどJSONへパース
  var content  = JSON.parse(latestjdata["content"]);
  var payload  = content["payload"];
  var decoded  = Utilities.base64Decode(payload);
  var data     = Utilities.newBlob(decoded).getDataAsString();
  
  //もういちどJSONへパース
  var soracomInfos = JSON.parse(data);

  return soracomInfos
}
//soracomのトークンは定期的に途切れる仕様になっているので、実行するたびにトークンを取得しに行く関数
function _returnAuth (){
  var url = 'https://api.soracom.io/v1/auth';
  var headers = {
             "Accept": "application/json",
  };

  var payload = {
              "email":"your_email",
              "password":"your_pass"
  };

   var options =
   {
     "contentType": "application/json",
     "headers":headers,
     "method": "post",
     "payload" : JSON.stringify(payload)
   };

  var response = UrlFetchApp.fetch(url,options);
  var data = JSON.parse(response.getContentText());
  
  var array = {};
  array = {"apiKey":data["apiKey"],"token":data["token"]}
  return array;

 

長くなってしまったので、今回はこれくらいにしておこう

次回はツイッターで美少女がツイートできるように設定していくぞ!

前回:⑧各種機能編 ~写真をGoogleドライブにアップロードする~

次回:⑩各種機能編 ~Googleスプレッドシートとツイート~