野菜の栽培は自然を相手にしていますので、天候を把握することが大事になってきます。
みなさんはどのくらい天候を意識できていますでしょうか?
家庭菜園で常に天候を気にするのはなかなか難しいですよね。
実は今回紹介する方法を実践すると畑の天候を自動で記録して、天候の状況を把握できるようになります。
今回はみなさんの畑の天気・気温・風速・風向きを誰でも簡単に自動で記録する方法を紹介します。
しかも無料で、測定器なども不要です。
誰にでもできるよう手順を追って説明しますので、ぜひ実践してみてくださいね。
手順1.Googleスプレッドシートを用意する
以前、畑の降水量を自動で記録する方法を紹介させていただきました。
Googleスプレッドシートの準備手順は上記記事の手順1に記載しております。
そちらを参照してください。
Googleスプレッドシートが開けたら次の手順に進みましょう
手順2.Google Apps Script(GAS)のプログラムを書く
次に天候情報を取得してGoogleスプレッドシートに記載をするプログラムを書きます。
プログラムと言ってもコピペで書けますので、経験がなくてもご安心ください。
Googleスプレッドシートでは、Google Apps Script(GAS)という制御プログラムを書くことができます。
GASもGoogleスプレッドシート同様、Googleが提供しているネット上で使える無料のサービスです。
function getWeather(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var lastRow = sheet.getLastRow();
var directionName = ["北","北北東","北東", "東北東", "東", "東南東", "南東", "南南東", "南", "南南西", "南西", "西南西", "西", "西北西", "北西", "北北西", "北"];
var url = 'http://api.openweathermap.org/data/2.5/weather?lat=XX.XXXX&lon=YYY.YYYY&appid=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ&units=metric&lang=ja';
//API呼び出し
var response = UrlFetchApp.fetch(url).getContentText();
//データ形成
var json = JSON.parse(response);
//天気の取得
var weather = json.weather[0].description;
//気温の取得
var temp = json.main.temp;
//風速の取得
var windspeed = json.wind.speed;
//風向きの取得
var windDeg = json.wind.deg;
var directionIndex = Math.round(windDeg/22.5)
//日付の取得
var dt = json.dt
var dtSeri = dt / 86400 + 25569;
var uxtime = (dtSeri - 25569) * 86400000;
var d = new Date(uxtime);
var dJST = Utilities.formatDate(d, 'JST','yyyy/MM/dd HH:mm');
//スプレッドシートへの書き込み
sheet.getRange(lastRow+1,1).setValue(dJST);
sheet.getRange(lastRow+1,2).setValue(weather);
sheet.getRange(lastRow+1,3).setValue(temp);
sheet.getRange(lastRow+1,4).setValue(windspeed);
sheet.getRange(lastRow+1,5).setValue(directionName[directionIndex]);
}
なお、手順1で紹介した記事の降水量と合わせて取得したい場合のプロブラムはまとめに記載しておきましたので、そちらを参考にしてください。
6行目に「lat=XX.XXXX&lon=YYY.YYYY」という部分がありますがこちらにはデータを取得する場所の緯度・経度を入力します。
緯度・経度はGoogleMapから調べられます。
「XX.XXXX」に緯度、「YYY.YYYY」に経度を入れましょう。
次に、同じく6行目で「ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ」となっているところですが、こちらにはこれから登録するサービスのIDを入れます。
入力内容は次の章で紹介しますので、一旦GASのプログラムはここまでです。
「Ctrlキー + s」で保存しておきましょう。
後でまた編集するので画面は開いたままでOKです。
手順3.気象情報取得サービスの利用登録をする(OpenWeatherMap)
次に気象情報を取得するためのサービスの利用登録をします。
今回はOpenWeatherMapが提供している「WeatherAPI」を使います。
以下のサイトから利用登録を進めていきましょう。
英語がわからなければGoogle翻訳を使いましょう。
「Free」が無料の範囲です。
1分間に60回までのリクエスト、1カ月で100万リクエスト以内であれば無料で使えます。
個人利用であればこれを超えることはないと思いますが、しっかりと抑えておきましょう。
1カ月で100万リクエストなので、1分間に20回までに留めておけば問題ありません。
今回は1時間に1回の呼び出しを想定した手順になります
このAPI Keyは先ほど作ったプログラムに入力するので、コピーしておきましょう。
手順4.天候情報が取得できるか確認する
天候情報が取得できるかを確認しましょう。
手順3.で取得したAPI Keyを手順2.で作成したGASプログラムの 「ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ」の部分に入力します。
手順5.天候情報の取得プログラムを定期的に実行する
プログラムが正常に動いたら、プログラムを定期的に実行するように設定をしましょう。
この方法も以下の記事の手順5に記載しております。
同じ方法で「getWeather」のプログラムを1時間おきに実行するようにしましょう。
まとめ
いかがだったでしょうか。
天候情報は取得できましたか?
Googleスプレッドシートはスマホアプリもありますので、スマホにアプリをインストールすれば、いつでもどこでも記録した天候情報が確認できます。
一度設定してしまえば、勝手にデータを取得し続けられますので、ぜひ試してくださいね。
1時間おきにデータを蓄積していると1カ月ちょっとで行がいっぱいになってしまうので、あらかじめ行を追加しておきましょう。
また、こちらの記事で紹介した降水量も同じスプレッドシートで管理したい場合のプログラムは以下になります。
参考までにお使いください。
function getWeather(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
var lastRow = sheet.getLastRow();
var url = 'https://map.yahooapis.jp/weather/V1/place?coordinates=YYY.YYYYYY,XX.XXXXXX&output=json&appid=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ';
//API呼び出し
var response = UrlFetchApp.fetch(url).getContentText();
//データ形成
var json = JSON.parse(response);
//日付の取得
var date = json.Feature[0].Property.WeatherList.Weather[0].Date
//降水量の取得
var rainFall = json.Feature[0].Property.WeatherList.Weather[0].Rainfall
var directionName = ["北","北北東","北東", "東北東", "東", "東南東", "南東", "南南東", "南", "南南西", "南西", "西南西", "西", "西北西", "北西", "北北西", "北"];
var url2 = 'http://api.openweathermap.org/data/2.5/weather?lat=XX.XXXX&lon=YYY.YYYY&appid=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ&units=metric&lang=ja';
//API呼び出し
var response2 = UrlFetchApp.fetch(url2).getContentText();
//データ形成
var json2 = JSON.parse(response2);
//天気の取得
var weather = json2.weather[0].description;
//気温の取得
var temp = json2.main.temp;
//風速の取得
var windspeed = json2.wind.speed;
//風向きの取得
var windDeg = json2.wind.deg;
var directionIndex = Math.round(windDeg/22.5)
//スプレッドシートへの書き込み(表示順を変えたい場合は1~6の数字を変更しましょう)
sheet.getRange(lastRow+1,1).setValue(date.substring(0, 4)+"/"+date.substring(4, 6)+"/"+date.substring(6, 8)+" "+date.substring(8, 10)+":"+date.substring(10, 12));
sheet.getRange(lastRow+1,2).setValue(weather);
sheet.getRange(lastRow+1,3).setValue(json.Feature[0].Property.WeatherList.Weather[0].Rainfall);
sheet.getRange(lastRow+1,4).setValue(temp);
sheet.getRange(lastRow+1,5).setValue(windspeed);
sheet.getRange(lastRow+1,6).setValue(directionName[directionIndex]);
}
X…,Y…,Z…の部分の入力を間違えないようにしましょう
特にZ…は使うAPIのよって異なりますので要注意です
コメント
いつも分かりやすく説明頂きありがとうございます。ラズパイ始めて間もないので、大変ありがたいです。
本ページも活用させてもらおうと手順の通りにやっているつもりですが、
GASを実行すると、
Exception: Request failed for http://api.openweathermap.org returned code 400. Truncated server response: {“cod”:”400″,”message”:”wrong latitude”} (use muteHttpExceptions option to examine full response)
とエラーが出てしまいます。
公開プログラムをコピペ、緯度と経度とAPI-Keyを
それぞれ「XX.XXXX」、「YYY.YYYY」、「ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ」に置き換えただけなのですが、ほかに変更する箇所はございますでしょうか?
もしお分かりになればご教示くださるとありがたいです。
T.tamaさん初めまして。
お読みいただいてありがとうございます。
エラーの内容を拝見すると、”wrong latitude”⇒「間違った緯度」ということなので、緯度情報の近辺が怪しいです。
プログラムの6行目「lat=XX.XXXX」の辺りが正しく入力できているか確認をしてみてください。
・緯度が90度以上になっていないか。(緯度と経度が入れ替わっていないか)
・緯度の後ろの「&」が消えていないか。
上記が正しそうであれば、緯度の小数点以下の数字が多すぎるとか少なすぎるとかを疑うとよいかもしれません。
明確な回答ができず申し訳ございません。
また何かあればコメントいただければと思います。
TBSテレビの堀江と申します。
ご連絡させていただきたいのですが、お問い合わせフォームはどちらになりますでしょうか。
何卒、よろしくお願いいたします。
堀江さん
コメントありがとうございます。
問い合わせフォームなどは特に設けておりませんので、
TwitterかInstagramのDMをいただければと思います。
よろしくお願いいたします。