こんにちは。
今日は気象情報API「DarkSky API」の最寄りの観測点のデータを取得して温度と湿度より「絶対湿度」を計算してGoogleスプレッドシートに1時間毎に記録するGoogle Apps Scriptを作ってみたのでその説明です。
絶対湿度とは
「絶対湿度」とは、空気1立方メートルあたりの水分の重量です。
インフルエンザウィルスの流行の指標などにも用いられ「乾燥指数」などと表示する温湿度計も発売されていたりします。
7g/立方メートル以下になるとインフルエンザに対して注意が必要とされているようです。
昨今流行している新型コロナウィルス(COVID-19)の場合、気温が高く絶対湿度も高いと思われるシンガポールなどでも流行したので、絶対湿度が高いと安全という訳ではなさそうですが、ウィルスなので絶対湿度が低いとかなりな感染力をもつと思われるので、安全衛生の観点から常時絶対湿度を監視できた方が安心かと思います。
なお、絶対湿度が測定できる温度湿度計としては、
などがあります。
Dark Sky
気象情報APIもいろいろありますが、私の住む市内に観測点があることと、ここのcurrentlyのデータはUV指数や可視性などもデータとして得られるのと、1日1000callまでは無料なのでここを選びました。
まずは、以下のURLで最寄りの観測点を調べます。
https://darksky.net/
観測点が見つかったら、URL部分の/forecast/ 以降の緯度、経度を記録しておきます。
次に以下のURLで「TRY FOR FREE」を押して無料利用を開始します。
https://darksky.net/dev
利用登録ができたら、Secret Keyを記録しておきます。
画面のSample API CallのURLをブラウザに入れて、成功したらAPIをCallすることができています。
API Callは、
https://api.darksky.net/forecast/[SecretKey]/[latitude],[longitude]
のような形式で呼び出すことになるので、先ほど記録した[SecretKey],[latitude],[longitude]を準備しておきます。
Google Apps Script
まずはGoogleスプレッドシートを起動して、適宜名前をつけておきます。
Googleスプレッドシートの「ツール→スクリプトエディタ」でGoogle Apps Scriptを起動します。
適宜名前をつけたら、GASのスクリプトプロパティにSHEET_NAMEと、先ほど記録した、SECRET,LATITUDE,LONGITUDEを登録しておきます。
以下のようなコードをテスト的に書きました(テストなので、エラー処理等は記述していません。)
var prop = PropertiesService.getScriptProperties();
// SHEET_NAME,SECRET,LATITUDE,LONGITUDEプロパティに登録しておく
var sheetName = prop.getProperty('SHEET_NAME');
var secret = prop.getProperty('SECRET');
var Latitude = prop.getProperty('LATITUDE');
var Longitude = prop.getProperty('LONGITUDE');
function myFunction() {
// シート取得
var ss = SpreadsheetApp.openById(SpreadsheetApp.getActiveSpreadsheet().getId());
var sheet = ss.getSheetByName(sheetName);
// Dateオブジェクトを作成
var d = new Date() ;
// UNIXタイムスタンプを取得する (ミリ秒単位)
var a = d.getTime() ;
// UNIXタイムスタンプを取得する (秒単位 - PHPのtime()と同じ)
var datetime = Math.floor( a / 1000 ) ;
//DarkSky API 呼び出し
var requestUrl = "https://api.darksky.net/forecast/"+secret+"/"+Latitude+","+Longitude+","+datetime+"?
lang=ja&exclude=minutely,hourly,daily&units=si";
Logger.log(requestUrl);
var response = UrlFetchApp.fetch(requestUrl);
var jsonString = response.getContentText();
var data = JSON.parse(jsonString);
Logger.log(data);
var latitude = data.latitude;
var longitude = data.longitude;
var timezone = data.timezone;
var time = data.currently.time;
var offset = data.offset;
var summary = data.currently.summary;
var icon = data.currently.icon;
var precipIntensity = data.currently.precipIntensity;
var precipProbability = data.currently.precipProbability;
var precipType = data.currently.precipType;
var temperature = data.currently.temperature;
var apparentTemperature = data.currently.apparentTemperature;
var dewPoint = data.currently.dewPoint;
var humidity = data.currently.humidity;
var abhumidity = 217*(6.1078*10**(7.5*temperature/(temperature+237.3)))/(temperature+273.15)*humidity;
var pressure = data.currently.pressure;
var windSpeed = data.currently.windSpeed;
var windGust = data.currently.windGust;
var windBearing = data.currently.windBearing;
var cloudCover = data.currently.cloudCover;
var uvIndex = data.currently.uvIndex;
var visibility = data.currently.visibility;
var ozone = data.currently.ozone;
var date = new Date(time * 1000);
var DateTime = Utilities.formatDate(date, 'JST', 'yyyy年M月d日 H時m分');
sheet.appendRow([latitude,longitude,timezone,offset,DateTime,summary,icon,precipIntensity,precipProbability,precipType,temperature,apparentTemperature,dewPoint,humidity,abhumidity,pressure,windSpeed,windGust,windBearing,cloudCover,uvIndex,visibility,ozone]);
}
これでGoogleスプレッドシートに1実行毎に1行記録されていきます。
このGASを時間実行で1時間毎にスケジュールして、スケジュール後初回実行して完了です。
まとめ
まずは、Googleスプレッドシート上で絶対湿度が簡単に確認できるツールが欲しくてコードを書きました。
必要に応じて、絶対湿度が7以下になるとgmailでメールするなど、機能拡張もできると思います。
よかったら参考にしてください。