2021年1月10日日曜日

農産物のブランド化の方向性について。

農産物のブランド化について、どんな方向性がありえるのか。

ブランドと言うと少し大げさな表現かもしれませんが、その商品(農産物)に付随するイメージ、他との差異といったようなものですかね。

パッと思いつくところでは、


① 産地や地域
多くの消費者に商品イメージがある。例えば、「魚沼産コシヒカリ」「丹波の黒豆」「山形のさくらんぼ」みたいなもの。

② 農園や個人
産地や地域より狭い範囲ではあるものの、一定の消費者に商品イメージがある。例えば、「○○農園の大根」「××さんのかぶ」みたいなもの。

③ 賞、他経営体などのブランド
他ブランドから商品イメージが連想される。例えば、「△△賞受賞」「有名店で使用」「□□認定商品」みたいなもの。

④ 商品属性
消費者に事前の商品イメージはない。「見た目」「価格」「品種」「栽培方法」等の属性から商品イメージが連想される。


こんな感じですかね。他にも何かあるかな?

単体として考えると③や④は、直接的な商品イメージがないのでブランド未満の状態ですが、時間の経過とともに①や②になっていく可能性はあります。

もちろん、商品ごとにどれかひとつではなく、様々な組み合わせ、濃淡があって作り上げられるものです。


じゃあ、実際にどのような組み立てで商品作りをしていけばいいのかですが、

・消費者の目に入れば一定数購入される

・消費者が探し求めて購入してくれる

この2つを軸に、その商品をどういったシチュエーションで売れやすい商品にしたいのかを考えると、やるべきことも見えてくるのかなと。

今のところは思っています。


***

最近、思うことがあり、頭の整理がてら、ちょっと書いてみました。

作っている側が商品のことを一番分かっていないということが多々ある分野だと思います。難しいですが、同時にとても面白い部分でもあります。コツコツやっていきましょう。




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

2021年1月2日土曜日

農業経営における財務指標を確認してみる。

あけましておめでとうございます。

アルバムから牛の写真を探しましたら、2013年に黒島で撮影したものが出てきました。ぷち情報としましては、黒島は人より牛の方が多いそうです。


2021年、良い一年にしたいですね。

本年もどうぞよろしくお願いいたします。


***

さてさて、年末の投稿で「経営面に関しては、(中略)まず第一に財務的な安定性の確保が肝要ですね」と書いていたので、農林水産省が出している「新たな農業経営指標」を元に、農地と財務の経営データから財務指標(と一部技術指標)を簡易的に計算するスプレッドシートを作成しました。



PCでGoogleアカウントにログインした状態で、リンク先にて「ファイル」から「コピーを作成」で編集可能なファイルが作成されます。エクセルで使いたい方はファイル作成後にMicrosoft Excel(.xlsx)形式でダウンロードすれば使えると思います。


「農地」及び「財務」シート内の表に値を入力しますと(表内の白背景のセル)、「指標による評価結果」シートに結果が表示されます。入力する値は↓の画像を参考にしてください。


「農業経営指標分析プログラム入力説明書」(農林水産省)より


ちなみに、あくまでも簡易的に算出する用ですので、本格的な分析には農林水産省サイトの方で公開されているアプリケーション、もしくはExcelファイルを活用ください(新たな農業経営指標:農林水産省)。認定農業者は必須で行うことになっています。


以下、指標の説明です。「」内は農林水産省資料からの引用です(一部文体変更あり)。


【財務指標】

・売上高借入金比率
計算式:借入金/収入 計
望ましい水準:0~100 %
『売上高に占める借入金の比率を表す指標。値が大きいほど、売上高から見た借入金の負担が大きくなり、経営が不安定になる可能性が高くなる。』

・生産単位当たり借入金
計算式:借入金/耕作している農地面積 合計
望ましい水準:0~130 千円/10a
『一定の生産単位(10a、1 頭など)当たりの借入金の割合を表す指標。値が大き いほど、単位当たりの面積や頭数から見た借入金の負担が大きくなり、経営が不安定になる可能性が高くなる。』

・生産単位当たり農業用固定資産額
計算式:減価償却資産/交錯している農地面積 合計
望ましい水準:0~130 千円/10a
『一定の生産単位(10a、1 頭など)当たりの農業用固定資産額の割合を表す指標。 値が大きいほど、単位当たり面積や頭数から見た施設や機械等の固定資産の価値が高くなり、過剰投資となっている可能性が高くなる。』

・自己資本比率
計算式:資本/資産 計
望ましい水準:30~100 %
『総資本に占める自己資本の割合を表す指標。値が小さいほど、自己資本による部分が小さくなり、経営が不安定になる可能性が高くなる。』

・自己資本比率 - 除く土地
計算式:(資本 - 土地)/(資産 計 - 土地)
望ましい水準:30~100 %
『自己資本に含まれる科目のうち、「土地」に関する評価が過大にされている場合には、この比率も高くなため、適正の評価ができない場合には、「土地」に関する評価を除いて、この比率を算出する。』

・売上高現預金比率
計算式:現預金/収入 計
望ましい水準:20~200 %
『売上高に占める現預金の割合を表す指標。この比率が小さくなるほど、売上高から見た現預金の割合が少なくなり、経営が不安定になる可能性が高くなる。一方、この比率が大きすぎる場合には、経営と家計が区分されておらず、家計の現預金が経営向けとして計上されている可能性がある。』

【技術指標】

・農業所得率
計算式:農業所得/収入 計
標準的な水準:38 %
上位20%の水準:48 %
『売上高に占める農業所得の比率を表す指標。値が大きいほど、売上高の多くを農業所得とする技術水準が高いことを示す。』


と、なっております。

最後の農業所得率は技術指標の括りなのですが、ぜひ把握しておきたいので入れました。自己資本比率は、土地を評価に含めるかどうかで分かれますね。

財務指標には、それぞれ望ましい水準が設定されていますが、自身の経営の品目、規模、その他内容に応じて、あるべき水準の範囲をもう少し絞って使うのもよいかもしれませんね。

例えば、うちの場合で売上高現預金比率について考えますと、とりあえず1年間に必要になる経費や収入保険への加入も加味して、上限値は50%程度が心地よい範囲なのかなと。これ以上の比率になりますと、完全にだぶついた状態になるので、適宜家計へ蓄積・運用していった方がよさそうです。


攻めるも守るも、舵取りの難しい時代です。それでも、常に選択の余地を確保しておく、ということは意識していきたいところです。

今回のスプレッドシートは、経営改善に役立てられるよう、今後もバージョンアップしていきたいです。


経営改善におすすめの本です。


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

2020年12月30日水曜日

2020年の振り返り

2020年も年の瀬ですね。

せっかくなので、ポチポチと振り返りなどしてみたいと思います。


今年はもう、何と言っても新型コロナウィルス感染症ですね。

仕事へのダイレクトな影響としては、これまで出店させていただいていたイベント類がことごとく中止になりました。

残念な一方で、結果的に、そこそこの時間的な余裕ができまして、新たにスマート農業への取り組みを始めてみました。

さわくらいのごく小規模の農家にとっては、コスト的にも技術的にもスマート農業は難しいのかなと思っていたのですが、やってみると意外とそれっぽいことはできるなと。現代、便利なものと情報がたくさんありますね。

まだまだ始めたばかりではありますが、データを把握することの効果は想像していたよりもてきめんで、停滞気味だった栽培技術の向上にも、一筋どころか二筋、三筋の光明が差したよう感じています。今後もコツコツ、継続的に取り組んでいきます。


また経営面に関しては、一層気を引き締めていかなければと、改めて思うところです。

イベントへの出店が突然1年間(今後も続けばそれ以上)なくなるなんて事態が発生しうるわけですし、このわずか10年の間に起こった数多の災害を考えれば、大袈裟ではなくどんなに備えても備え過ぎるということはないように思います。特に農業は普段からリスクに溢れていますからね。

そして、備えるのであれば、まず第一に財務的な安定性の確保が肝要ですね。今年は本当に身にしみました。その土台の上に、生産・加工・販売・労務・その他の体制をいかに組み立てていくか。厳しい状況の中ではありますが、去年よりは今年、今年よりは来年と、少しずつでも良い方向ににじり寄っていけたらいいなと思います。


個人的なところでは、予定していた旅行ができなかったりもしました。

早くまた、友人に会ったり、旅行や食事をしたりということを何の気兼ねなく楽しめる世の中になってほしいですね。心から…。

その時のためにも、頑張らねば!


***

そんなこんなで、本年もたくさんの方にお世話になりました。本当にありがとうございました。

みなさま、どうぞ良い年をお迎えください。




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

2020年12月19日土曜日

スマートプラグ(TP-Link HS105)をスプレッドシートからIFTTT経由でスイッチングする。

前回投稿の「アメダスのデータをGASのWebスクレイピングで自動取得する」で取得したデータを元に、スマートプラグを用いて湿度が一定の値を上回ったら扇風機の電源をON、下回ったらOFFに、自動で切り替わるようにしてみました。


今回使ったスマートプラグは「TP-Link HS105」です。1,600円で購入。2つセットだともう少しお得に販売していますね。

設定したタイマーやスケジュールによるON/OFFは、ややこしいことをしなくても専用アプリから自動化できます。便利ですね。


今回は、湿度の値によってON/OFFを切り替えたいため、アメダスのデータからGAS(Google Apps Script)でON/OFFの判定をしてスプレッドシートに入力、スプレッドシートをトリガーとしてIFTTT経由でスイッチングを行うようにしました。

IFTTTというのは、Webサービス間の連携をしてくれるWebサービスで、例えばBloggerに投稿をしたら自動でタイトルとURLをTwitterでシェアする、みたいなことができます。今回使うスマートプラグも対応しています(サービス名はTP-Link Kasa)。これまであまりしっかり使ったことがなかったので、これを機に。

以下、作り方です。


① スマートプラグのセッティング

TP-Link HS105の初期設定は公式のページにわかりやすく書いてあります(「アプリ「Kasa」でミニ スマートWi-Fiプラグの初期設定をするには」)。簡単でした。

注意点としては、プラグが左右で幅の違う極性付きプラグ(N極があるプラグ)になっているので、壁から直接でない場合は対応したコードが必要になります。見事に引っかかりました(笑)。壁は基本的にJIS規格で対応したものになっているとのこと。

安価なもので、こちらのコードが対応していました。ただ、合わせ買い対象商品なので何かのついでに買うのがいいですね。


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

IFTTTでトリガーとするスプレッドシートの表を作成します。

アメダスのデータを取得しているスプレッドシートとは別に新しいファイルを作成します。追加したシート(gid=0以外のシート)はIFTTTで指定できないようです。


B2、B3のセルをIFTTTのトリガーとして利用します。初期状態で空白だと動かないようなので、適当な値を入れておきます。

シート名は「control」にしておきます(コード作成時にこの名前で使います)。


③ GASでON/OFFの判定

アメダスのデータを取得するタイミングでON/OFFの判定もしたいので、前回投稿のアメダスのデータを取得するスクリプトに関数+αを追記します。

コードは以下の通りです。
var spreadsheet1 = SpreadsheetApp.openById("スプレッドシートID(アメダスデータ)");
var dataSheet = spreadsheet1.getSheetByName("data");

var spreadsheet2 = SpreadsheetApp.openById("スプレッドシートID(トリガー表)");
var conSheet = spreadsheet2.getSheetByName("control");
  
function getAmadasToday() {
  var dataLastRow = dataSheet.getLastRow();
  
  var opt = {"contentType":"text/html;","method":"get"};
  var dataAmd = "";
  var contentAmd = "";
  var postText = "";
  var urlAmd = "アメダスURL";
  
  var date_and_time = new Date();
  var dataDate = Utilities.formatDate(date_and_time, "JST", "YYYY/MM/d H");
  var time = Utilities.formatDate(date_and_time, "JST", "H");
  if(time == 0) {
    time = 24;
  }
  var min = Utilities.formatDate(date_and_time, "JST", "mm"); //参考(取得分)
  var conDate = Utilities.formatDate(date_and_time, "JST", "YYYY/MM/dd H:mm"); //control記載用

  var middleArr = [];
  var tableArr = [];

  dataAmd = UrlFetchApp.fetch(urlAmd ,opt);
  contentAmd = dataAmd.getContentText();
  postText = getStringSlice(contentAmd, '<td class="time left">' + time + '</td>','</tr>');
  postText = postText.replace(/<\/td>/g, '</td>,');
  postText = postText.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, '');
  postText = postText.replace( /\r\n/g , "\n" );
  postText = postText.replace( /^(\n+)|(\n+)$/g , '');
  postText = postText.replace(/\/\/\//g, '');
  postText = postText.replace(/&nbsp;/g, '');
  middleArr = postText.split( /\n/g );
  tableArr[0] = middleArr[0].split(",");
  tableArr.splice(0,0);
  
  if(tableArr[0][0] != "" && dataDate != dataSheet.getRange(dataLastRow, 1).getValue()) {
    dataSheet.insertRows(dataLastRow + 1);
    dataSheet.getRange(dataLastRow + 1, 1).setValue(dataDate);
    dataSheet.getRange(dataLastRow + 1, 2, 1, 8).setValues(tableArr);
  
    control(tableArr[0][5], conDate);
  }
}

function getStringSlice(content, startStr, endStr) {
  var indexStart = content.indexOf(startStr);
  if(indexStart == -1){
    return "";
  } else {
    indexStart += startStr.length
    return content.slice(indexStart, content.indexOf(endStr, indexStart));
  }
}

function control(hu, time) {
  var staOn = conSheet.getRange(2, 4).getValue();
  var staOff = conSheet.getRange(3, 4).getValue();

  if(hu > 80 && staOn == "") {
    conSheet.getRange(2, 2).setValue(hu);
    conSheet.getRange(2, 3).setValue(time);
    conSheet.getRange(2, 4).setValue("ON");
    conSheet.getRange(3, 4).setValue("");
  } else if(hu < 70 && staOff == "") {
    conSheet.getRange(3, 2).setValue(hu);
    conSheet.getRange(3, 3).setValue(time);
    conSheet.getRange(3, 4).setValue("OFF");
    conSheet.getRange(2, 4).setValue("");
  }
}

書き換えが必要なのは次の通りです。

・1行目、4行目「スプレッドシートID」

1行目がアメダスのデータを入力しているスプレッドシート、4行目がトリガーとなる表のスプレッドシートです。スプレッドシートを開いた状態でURLの下記部分に表示されます。ちょっと長めです。

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


・14行目「アメダスURL」

https://www.jma.go.jp/jp/amedas_h/ より取得する地点を選んでください。

小名浜の場合ですと、 https://www.jma.go.jp/jp/amedas_h/today-36846.html になります(?より後ろにくっついている文字は必要ありません)。


・44行目「8」

取得する要素数によって変わります。要素数+1の値を入れてください。


・46行目「5」

取得する要素のうち、湿度の順番を0から数えて入れます。小名浜の場合ですと6番目なので5になります。


・64行目「hu > 80」、69行目「hu <= 70」

今回は湿度が80%を上回ったら電源をON、70%を下回ったらOFFという条件にしています。適宜変更してください。


以上です。


ON/OFFの判定は、アメダスのデータを取得するスクリプトとは分けてしまってもいいのですが、そうすると余計にGASのトリガーを設定しなければならないのと(制限がある)、アメダスの測定時(毎正時)〜アメダスのデータ取得〜ON/OFFの判定と、タイムラグが大きくなってしまうまめ、ひとつにまとめました。


④ IFTTTの設定

スプレッドシートの「Cell updated in spreadsheet」をトリガーに、スマートプラグを「Turn on」、もしくは「Turn off」にします。ON、OFF、それぞれアプレットが必要なので2つ作ることになります。

トリガーは「If This」より、

・「Google Sheets」 → 「Cell updated in spreadsheet」を選択
・「Or copy and paste the spreadsheet URL」 → https://docs.google.com/spreadsheets/d/スプレッドシートID(トリガー表)
・「Which cell to monitor?」 →  B2(Turn on) / B3(Turn off)


アクションは「Then That」より、

・「TP-Link Kasa」 → 「Turn on」 / 「Turn off」
・「Device」 → 今回設定したスマートプラグ


となります。


⑤ 動かしてみる

と言っても、条件が満たされないと動かないのですが……。

80%を上回ったのでON。



70%を下回ったのでOFF。



うまく動きましたでしょうか。

GASのログを見るとアメダスのデータは11分に取得しているようなので、IFTTTが動くまでに若干タイムラグがありますね。

***


ちなみに、そもそもなぜ湿度によって扇風機を回すのかというと、雨の日のような湿度が高い状態が続くとやはり椎茸も水分量が多くなってしまうのですね。そこで、扇風機で空気を動かすことで幾分でも緩和できないか、という実験をしています。

ハウス内の湿度が高すぎる状況というのは、外気の湿度が高すぎて換気で落とせないパターンなので、ハウス内のNature Remoではなくアメダスのデータを使用しました。



今回は単純に湿度の値でしたが、この方法ならスイッチングの条件を自由に作れます。スマート農業にも、いろいろと使えそうですね。

ただ、IFTTTの有料化にともない、無料アカウントではアプレットが3つまで、かつそれぞれ1時間毎に1回までしか起動できないようです。

この方法は、ON/OFFにアプレットを2つ使ってしまうため、2つ以上の機器、もしくは1時間に1回以上の頻度でON/OFFの切り替えを想定する場合には、有料版にする必要があります。あと、有料版であればIFTTTが動くまでのタイムラグも小さくなるみたいです。他にも機能的にはだいぶできることが増えるようなので、本格的なスマート化にあたっては有料化もありかもですね。


他の方法としては、今回使ったスマートプラグのTP-Linkには、公開されているAPIがあり、IFTTTを使わずに直接操作することも可能みたいです。ただ公式のAPIではない?ようなので、自己責任の範囲でという感じになるのですかね。

勉強しつつ、こちらもちょっと試してみようかと思います。


・関連投稿



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

2020年12月15日火曜日

アメダスのデータをGASのWebスクレイピングで毎時間自動取得する。

以前、過去の気象データをWebスクレイピングで取得するGASを作成しましたが、今回は1時間おきに更新されるアメダスのデータを取得するGASを作成してみます。

現状、ビニールハウス内のデータ(温度・湿度)についてはNature Remoから取得しているのですが(湿度の精度については課題ありですが)、ハウス外のデータについてはリアルタイムでの把握ができていませんでした。

野外となりますと、防水・防塵への対応なども必要となりますので、どう実現したものかと思案していたのですが、よく考えたらわざわざ自分で測定しなくてもちょっと離れた位置のデータならあるよなと。アメダスが。毎正時の観測値が各地点ごとに表形式で更新されています。(今回使いませんが地図形式もあります。)

個人的な好みとしても、ハードは最小限にとどめたいので一石二鳥です。使えるものは使っていきましょう。

ということで、以下、作り方のメモです。

(ちなみに、Webスクレイピングというのはウェブサイトから情報を抽出する技術です。公式で適切なAPIが提供されていれば不要ですが、そういうところばかりとは限りません。やはり、使えると便利です。サイトによっては規約等で禁止されていることもあるので注意が必要です。)


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

まずはスプレッドシートの準備をします。


画像の通り、1行目に見出しを作ります。A列から順に、「日時」「気温(℃)」「降水量(mm)」「風向(16方位)」「風速(m/s)」「日照時間(h)」「湿度(%)」「気圧(hPa)」です。

これは小名浜の場合ですが、地点によって取得できる要素が異なるので適宜修正してください。

シート名は「data」にしておきます(コード作成時にこの名前で使います)。


② コードの作成

作成したスプレッドシートの「ツール」→「スクリプト エディタ」からスクリプトファイルを作成します。コードは以下の通りです。

var spreadsheet = SpreadsheetApp.openById("スプレッドシートID");
var dataSheet = spreadsheet.getSheetByName("data");
  
function getAmadasToday() {
  var dataLastRow = dataSheet.getLastRow();
  
  var opt = {"contentType":"text/html;","method":"get"};
  var dataAmd = "";
  var contentAmd = "";
  var postText = "";
  var urlAmd = "アメダスURL";
  
  var date_and_time = new Date();
  var dataDate = Utilities.formatDate(date_and_time, "JST", "YYYY/MM/d H");
  var time = Utilities.formatDate(date_and_time, "JST", "H");
  if(time == 0) {
    time = 24;
  }

  var middleArr = [];
  var tableArr = [];

  dataAmd = UrlFetchApp.fetch(urlAmd ,opt);
  contentAmd = dataAmd.getContentText();
  postText = getStringSlice(contentAmd, '<td class="time left">' + time + '</td>','</tr>');
  postText = postText.replace(/<\/td>/g, '</td>,');
  postText = postText.replace(/<("[^"]*"|'[^']*'|[^'">])*>/g, '');
  postText = postText.replace( /\r\n/g , "\n" );
  postText = postText.replace( /^(\n+)|(\n+)$/g , '');
  postText = postText.replace(/\/\/\//g, '');
  postText = postText.replace(/&nbsp;/g, '');
  middleArr = postText.split( /\n/g );
  tableArr[0] = middleArr[0].split(",");
  tableArr.splice(0,0);
  
  if(tableArr[0][0] != "" && dataDate != dataSheet.getRange(dataLastRow, 1).getValue()) {
    dataSheet.insertRows(dataLastRow + 1); 
    dataSheet.getRange(dataLastRow + 1, 1).setValue(dataDate);
    dataSheet.getRange(dataLastRow + 1, 2, 1, 8).setValues(tableArr);
  }
}

function getStringSlice(content, startStr, endStr) {
  var indexStart = content.indexOf(startStr);
  if(indexStart == -1){
    return "";
  } else {
    indexStart += startStr.length
    return content.slice(indexStart, content.indexOf(endStr, indexStart));
  }
}

書き換えが必要なのは3か所です。

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

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

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


・11行目「アメダスURL」

https://www.jma.go.jp/jp/amedas_h/ より取得する地点を選んでください。

小名浜の場合ですと、 https://www.jma.go.jp/jp/amedas_h/today-36846.html になります(?より後ろにくっついている文字は必要ありません)。


・39行目「8」

取得する要素数によって変わります。要素数+1の値を入れてください。


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


③ トリガーの設定

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

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

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


アメダスの更新は1時間おきで、毎時間10分頃までには更新されるようですが、時間ベースのトリガーでは実行する厳密な時間は指定できないため、アメダスが未更新だった場合に備えて「30 分おき」にしておきます。実行時に最新の値が未取得だった場合のみスプレッドシートへの入力が行われます。


④ 取得開始


このような感じになります。うまく動きましたでしょうか。


***

GASによるWebスクレイピングのスクリプトは一度作っていたのでけっこう楽に作れました。

1時間おきの気象データが(概ね)リアルタイムで取得できるといろいろ使えますね。まず温度・湿度の変化を確認するグラフは作っておきたいところ。

Nature Remoの湿度の精度がいまいちなのでこちらで補完できたらと考えています。


・関連投稿
気象データをGASのWebスクレイピングで自動取得する。

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

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


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

2020年12月1日火曜日

ブログを始めてまる10年

このブログは2011年1月に開始したので、今年の12月でまる10年になりました。

私自身は当時まだ学生で、大学と実家を行ったり来たりしながら農作業を手伝っていました。よく考えたら、今も行ったり来たりしていますね。

本当にいろいろとありました(あります)が、何だかんだここまで続けることができてありがたい限りですね。ブログも、農業も。

ブログは、半分は農園の紹介や名刺的な意味合いで、もう半分は自身の備忘録として趣味的に書いています。

最初はおそらく自分しか見ていなかったんじゃないかと思うのですが(笑)、徐々にアクセスも増えて、最近は検索からICT活用関連の投稿などが見られているようです。わずかながらでも誰かの役に立っているのであれば、うれしいことですね。

また、ブログ経由でご縁をいただくというようなことも多々あり、書き続けてきてよかったなぁと思います。

農業に関しては、これまで通り規模拡大の方向性ではなく、身の回りの土地をより良く活用していけるような農業を目指したいと思っています。

あと、今後は少しでも林業的な何かに取り組めたらなと。

先日、2020年の農林業センサスの結果概要が出ましたが、これまでの流れ通り、農業経営体の減少とともに、法人化、規模拡大が進んでいるとのことです。

実感としても、あえて一定規模に留めておこうとしなければ規模拡大の方向へ力が働くし、ある程度まで拡大したら素直に法人の方が適切な経営ができるように思います。

この流れはもう10年、20年は少なくとも続くような気がしますが、そうした中で、さわのような農園が地域や社会に対してどういった役割を担っていけるのか、よくよく見極めながら舵取りしていきたいところです。

今後ともどうぞよろしくお願いいたします。




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

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)も日々更新中です。