2020年11月22日日曜日

GASで動的な栽培管理用データ閲覧Webページを作る。

GAS(Google Apps Script)を使い、動的な原木椎茸栽培管理用データ閲覧Webページを作ってみました。動的なページなのでデータが自動更新されます。



このようなページになります(スマホから閲覧)。グラフと表の数字が一定時間毎に更新されます。

元となる温度と湿度のデータは前回投稿の「Nature RemoとGASを使って温度・湿度をリアルタイムで記録する。」の方法で取得しています。

実感として、温度と湿度だけでもいろいろと理解が深まりますね。原木椎茸の栽培にあたっては、「寒暖差」「乾湿差」がダイレクトに品質に影響するな……と。


ということで、こういうページを作ってくと便利なので、以下作り方の説明です。


① Webページに載せるデータを作成

前回投稿で作った温度・湿度のログを取るスプレッドシートに追加でWebページに載せるデータを作ります。上の写真と同じものを作るとちょっと分量が多いので、直近3日分(72時間分)の温度・湿度の変化を見る線グラフと平均気温、平均湿度の表を作ってみます。


①-1 シートの追加


「graph」「web」シートを追加します。


①-2 「graph」シート

「log」シートのデータをそのままグラフにすると期間がどんどん長くなってしまうので、GASで「graph」シートに直近3日分(72時間分)のデータだけ持ってきてグラフを作ります。前回投稿の通り15分毎にデータを取得している場合は288行分になります。

スプレッドシートの「ツール」→「スクリプト エディタ」でGASを開きます。「ファイル」→「New」→「スクリプト ファイル」を選択、作成。

コードは以下の通りです。

function graphData() {
  var spreadsheet = SpreadsheetApp.openById("スプレッドシートID");
  var logSheet = spreadsheet.getSheetByName("log");
  var graphSheet = spreadsheet.getSheetByName("graph");

  var lastRow = logSheet.getLastRow();
  
  if(lastRow > 288) {
    var timeStamp = logSheet.getRange(lastRow - 287, 1, 288).getValues();
    var tm = logSheet.getRange(lastRow - 287, 2, 288).getValues();
    var hu = logSheet.getRange(lastRow - 287, 3, 288).getValues();
  } else if(lastRow <= 288) {
    var timeStamp = logSheet.getRange(2, 1, lastRow).getValues();
    var tm = logSheet.getRange(2, 2, lastRow).getValues();
    var hu = logSheet.getRange(2, 3, lastRow).getValues();
  }
    
  graphSheet.getRange(2, 1, 288).setValues(timeStamp);
  graphSheet.getRange(2, 2, 288).setValues(tm);
  graphSheet.getRange(2, 3, 288).setValues(hu);
}

2行目の「スプレッドシートID」は書き換えてください。当該スプレッドシートURLの下記部分です。

https://docs.google.com/spreadsheets/d/ここの値をコピペ/edit#gid=0


トリガー設定を行い一定時間毎に実行されるようにしまておきます。



実行されると直近3日分(72時間分)のデータが入ります。



グラフを作成。


①-3 「web」シート


「web」シートはAVERAGE関数で平均を出します。直近1日間は193行目から289行目、直近3日間は2行目から289行目までになります。


② HTMLの作成

GASで「ファイル」→「New」→「HTML ファイル」を選択。HTMLの作成をします。ファイル名は「index」にしておきます。

コードは以下の通りです。

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <center>
      <h1>データ閲覧Webページ</h1>
      <br />
      <iframe></iframe>
      <br />
      <table>
        <tr>
          <th></th>
          <th> 直近1日間 </th>
          <th> 直近3日間 </th>
        </tr>
        <tr>
          <td>平均気温(℃)</td>
          <td align="right"><?=aveTm1?></td>
          <td align="right"><?=aveTm3?></td>
        </tr>
        <tr>
          <td>平均湿度(%)</td>
          <td align="right"><?=aveHu1?></td>
          <td align="right"><?=aveHu3?></td>
        </tr>
      </table>
      <br />
    </center>
  </body>
</html>

10行目の<iframe></iframe>部分には「graph」シートで作成したグラフを埋め込みます。



「グラフを公開」から「埋め込む」→「公開」で<iframe>タグのリンクが表示されますので<iframe></iframe>部分を書き換えます。「インタラクティブ」でグラフが動的になります。


③ HTMLを表示するためのGASの作成

GASで「ファイル」→「New」→「スクリプト ファイル」を選択。

コードは以下の通りです。

function doGet() {
  var spreadsheet = SpreadsheetApp.openById("スプレッドシートID");
  var webSheet = spreadsheet.getSheetByName("web");

  var aveTm1 = webSheet.getRange(2, 2).getValue();
  var aveHu1 = webSheet.getRange(3, 2).getValue();
  var aveTm3 = webSheet.getRange(2, 3).getValue();
  var aveHu3 = webSheet.getRange(3, 3).getValue();
  
  var web = HtmlService.createTemplateFromFile("index");

  web.aveTm1 = aveTm1.toFixed(1);
  web.aveHu1 = aveHu1.toFixed(1);
  web.aveTm3 = aveTm3.toFixed(1);
  web.aveHu3 = aveHu3.toFixed(1);
  
  return web.evaluate().setTitle("データ閲覧Webページ");
}

2行目の「スプレッドシートID」は書き換えてください。


④ ウェブアプリケーションとして公開

「公開」→「ウェブアプリケーションとして導入…」より、

・「Project version: 」→ New
・「Execute the app as: 」→ User accessing the web app
・「Who has access to the app: 」→ 全ユーザー

で更新します。

「Current web app URL:」で表示されるURLでデータの閲覧ができます。コードを変更した場合はProject versionをNewで更新します。

(下の「Test web app for your latest code.」が開発環境のURLになります。Project versionを更新しなくてもコードの変更を確認できます。)


⑤ ページの確認


こんな感じになります(スマホから閲覧)。

ちなみに、スプレッドシートを共有しているGoogleアカウント(にログインしているブラウザ)からでないとWebページを表示できません。

共有されている無料のGoogleアカウントでは、初回のWebページ表示時に、「このアプリは確認されていません」というページが表示されます。ここで「安全なページに戻る」をクリックすると表示できませんので、「詳細」→「プロジェクト名(安全ではないページ)に移動」から承認します。


***

ちゃんと動きましたでしょうか?

あとは、どんなデータがあれば栽培の役に立つのかですね。原木椎茸の場合は、「寒暖差」「乾湿差」を見るための、分散の値が重要そうです。

うまく活かしていきたいですね。


・関連投稿
Nature RemoとGASを使って温度・湿度をリアルタイムで記録する。


Twitter(@nkkmd)、Instagram(@nkkmd)も日々更新中です。

2020年11月13日金曜日

Nature RemoとGASを使って温度・湿度をリアルタイムで記録する。

Nature RemoとGASを使って原木椎茸を栽培しているビニールハウス内の温度・湿度をリアルタイムで記録できるようにしてみました。

これができますと、「【計画編】原木椎茸の収穫のタイミングで通知してくれるものを作ってみる。」で書いたような「積算温度から収穫のタイミングを通知してくれるもの」が作れます。スマート化へ向けた第一歩です。


Nature Remo 3 ネイチャーリモ スマートリモコン 温湿度/照度/人感センサー搭載 スマートロック対応 アレクサ/Google Home/Siri対応 Remo-1W3
Nature Remo 3 ネイチャーリモ スマートリモコン 温湿度/照度/人感センサー搭載 スマートロック対応 アレクサ/Google Home/Siri対応 Remo-1W3

by SimpleImageLink

Nature Remoというのはスマホから家電などを操作するためのスマートリモコンなのですが、APIが公開(https://developer.nature.global/)されていてセンサーから得られるデータをリアルタイムに取得することが可能です。(今回はリモコンとしての機能は使いません。)

モデルはmini/2/3とありますが、2もしくは3であれば温度・湿度(と照明・人感)のセンサーがついています。miniですと温度のみです。後々分析の幅も広がりそうなので、湿度も測定できる3を購入しました。

-----
追記(2021-1-14)

購入時に気がついていなかったのですが、湿度の測定範囲が30〜70%なので、それ以上のレンジでの測定が必要となる場合にはNature Remoでは難しそうです。トリガー目的であればいいですが、分析目的であれば別の方法を考えた方が良さそうです。温度のみであればminiで大丈夫です。
-----

このデータをGAS(Google Apps Script)を使ってスプレッドシートに書き込みます。

データの取得にはNature Remoの設置場所(今回はビニールハウス内)にWi-Fi環境が必要となるため、最低限の容量で使用できるHIS Mobileのビタッ!プランを契約、合わせて富士ソフトのモバイルWi-Fiルーター「+F FS030W」を購入しました。

富士ソフト SIMフリー wi-fi ルーター dual band +F FS030W LTE 対応 microSIM FS030WMB1
富士ソフト SIMフリー wi-fi ルーター dual band +F FS030W LTE 対応 microSIM FS030WMB1

by SimpleImageLink

これで必要な道具はそろいました。

ちなみにここまでにかかった費用は、

・Nature Remo 3 - 9,980円
・HIS Mobile 事務手数料 - 3,300円
・+F FS030W - 10,300円

合計 23,580円(税込)です。

小規模農家でもこのくらいの初期費用であれば、実験として軽い気持ちでスマート農業に取り組めますね。


以下、設定方法です。


① Nature Remoの初期設定

セットアップにWi-Fi接続が必要になりますが、今回用意したモバイルWi-Fiルーターで接続してしまうと貴重な容量を食ってしまうため、容量を気にしなくていい別のWi-Fiを利用した方がいいかも知れません。接続するWi-Fiは後から変更できます。


② ビニールハウスに設置

こんな感じでビニールハウス内に設置しました。



電気はもともと引いてあり天井を通っているので、延長コードで引っ張ってきました。かっちり固定はせずメッシュのバッグに入れてぶら下げました(測定値に影響あるかも?)。撒水時も避ければまぁ大丈夫そうです。

写真ではほぼ見えないですがモバイルWi-Fiルーターも一緒にバッグに入っています。記録を開始するにはNature RemoのWi-Fi設定を更新してモバイルWi-Fiルーターに接続します。

Nature Remoの測定値の校正のため別の温湿度計も設置。


③ スプレッドシートの準備


スプレッドシートは見出しとして1行目に「タイムスタンプ」「温度」「湿度」「温度校正値」「湿度校正値」と手入力。

シート名は「log」にしておきます(GASでこの名前で使います)。

Nature Remoではセンサーから取得する温度と湿度の値を校正することができます。APIから取得する温度・湿度は校正後の値となるため、後から調整が必要になった時のために校正値も取得しておきます。


④ コードの作成

スプレッドシートの「ツール」→「スクリプト エディタ」でGASを開きます。

コードは以下の通り。

var access_token = "Nature Remo アクセストークン";

var spreadsheet = SpreadsheetApp.openById("スプレッドシート ID");
var sheet = spreadsheet.getSheetByName("log");
 
function main() {
  var data = getNatureRemoData();
  var lastRow = sheet.getLastRow();
  sheet.insertRows(lastRow + 1);
  setData(data, lastRow + 1);
}
 
function getNatureRemoData() {
  var url = "https://api.nature.global/1/devices";
  var headers = {
    "Content-Type" : "application/json;",
    'Authorization': 'Bearer ' + access_token,
  };
  var options = {
    "method" : "get",
    "headers" : headers,
  };

  var data = JSON.parse(UrlFetchApp.fetch(url, options));
  
  return data;
}

function setData(data, row) {
  sheet.getRange(row, 1).setValue(new Date());
  sheet.getRange(row, 2).setValue(data[0].newest_events.te.val);
  sheet.getRange(row, 3).setValue(data[0].newest_events.hu.val);
  sheet.getRange(row, 4).setValue(data[0].temperature_offset);
  sheet.getRange(row, 5).setValue(data[0].humidity_offset);
} 

書き換えが必要なのは次の2ヵ所です。

・1行目「Nature Remo アクセストークン」

https://home.nature.global/ より発行できます。後から再表示ができないのでメモしておきます。


・3行目「スプレッドシート ID」

該当するスプレッドシートを開いた状態でアドレスバーURLの下記部分に表示されます。ちょっと長めです。

https://docs.google.com/spreadsheets/d/ここの値をコピペ/edit#gid=0


GAS初回実行時は承認が必要となります。無料のGoogleアカウントの場合「このアプリは確認されていません」というページが表示されます。ここで「安全なページに戻る」をクリックすると実行できませんので、「詳細」→「プロジェクト名(安全ではないページ)に移動」から承認します。


⑤ トリガー設定

定期的にmain関数を実行するためにトリガー設定をします。

「トリガーを追加」より、

・「実行する関数を選択」→ main
・「実行するデプロイを選択」→ Head
・「イベントのソースを選択」→ 時間主導型
・「時間ベースのトリガーのタイプを選択」→ 分ベースのタイマー
・「時間の間隔を選択(分)」→ 15 分おき
・「エラー通知設定」→ 今すぐ通知を受け取る

時間の間隔は適宜変更してください。


⑥ 記録開始


うまくデータが取れました。

通信容量に関しては記録開始から2週間程度で21MBでした。ブレはあるかと思いますがビタッ!プランの月に100MBまでのプランで十分そうですね。

月々の運用費は通信費180円(税別)と電気代幾ばくとなります。


***

ということで、Nature RemoとGASを使って温度・湿度をリアルタイムで記録する方法でした。

現在、このデータを元に積算温度を計算したり、通知を出したりといろいろ試しているのですが、思った以上に有用そうだなというのが感触です。栽培技術の向上にもつなげられるのではなかろうかと。


・関連投稿
GASで動的な栽培管理用データ閲覧Webページを作る。

【計画編】原木椎茸の収穫のタイミングで通知してくれるものを作ってみる。

小さく始めるスマート農業


また、今回はビニールハウス内という通常の屋内よりは多少過酷な環境下での使用となるため(初心者の)電子工作が必要になるRaspberry Piを使う方法はやめました。でも楽しそうなので、そのうち何かの場面で使ってみたいですね。


Twitter(@nkkmd)、Instagram(@nkkmd)も日々更新中です。

2020年11月2日月曜日

職業としての農業

先週末、これから新規就農を考えている方々との交流イベントがありまして、市内の農園を回って一緒にお話を聞き、最後に懇談会的なものでちょっとおしゃべりをしました。

普段、他の農家の方のお話を聞く機会というのもあまりないので私自身とても勉強になりました。様々な考え方、目標、やり方に触れますと、やはり刺激になりますね。(せっかくなのに写真撮り忘れた…。)

そして、改めて職業としての農業の魅力を考えてみると、地域、品目、規模、生産方式、経営体制等、その自由度の高さにあるのかなと思いました。6次化、スマート農業といった分野も含めると本当に裾野は広いですね。

もちろん、職業である以上は経営として成り立たせることが大前提ですが、不確実性の時代にあっては、まずは自分が何をやりたいのかという軸が一層大事になってくる気がします。目標、考え方によっては、専業にこだわる必要もないのではなかろうかと思っています。(関連投稿:家族経営の農業の兼業化という方向性

と、今思うところをポツポツ書いてみましたが、また5年、10年経つとどんな状況になっているのでしょうかね。今回ご一緒した方々も就農してバリバリやっていますかね。楽しみです。


・関連投稿
新規就農おすすめ本『絶対にギブアップしたくない人のための 成功する農業』

『農で1200万円!「日本一小さい農家」が明かす「脱サラ農業」はじめの一歩』。あえて規模拡大を求めないという最適解。


写真撮り忘れたので代わりに最近のクレソン畑です。


Twitter(@nkkmd)、Instagram(@nkkmd)も日々更新中です。