見出し画像

気象情報API Dark SkyとGASを利用して室温と外気温の自動比較アプリを作った

背景

前回『暑くて眠れないので温度を自動記録するNature Remo API/GASアプリを作った』という記事を書きました。
しかしアプリを作った当日のこと。逆に寒くて起きてしまうという残念な事態に陥ります。やれやれです。
エアコンがついた部屋から出てみるとかなり涼しく「今日はエアコンいらないな…」と思ってしまいました。

ここでふと思いました。『エアコンのついた部屋』と『外気温』は一体どちらのほうが涼しいのだろうかと。
ということで今回は作るシステムはこちらです。

1. Dark Sky(気象情報オープンデータ)から室外温度を取得する
2. Nature Remoから室内温度を取得する
3. Google Sheetに取得した温度を記録する

今回もGAS(Google Apps Script)を利用してサーバレスで構築しました。

気象情報・気温を取得できるAPI

まずは外気温を取得するためのオープンデータを調べてみます。
以下のサイトが一番参考になりました。

この記事で書かれているAPIの概略をまとめました。

1. OpenWeatherMap
無料で利用可能なAPIは現在の気象情報が取得できるもの、3時間毎/5日間の予報が取得できるものの2種類。1日のコール数に制限がない。
ただし更新される気温は3時間先までの気温の平均なので、今現在の気温が分かりづらい。
2. WeatherUnderGround
無料で利用可能なAPIの種類が豊富。
ただし情報の正確さが貧弱な観測所もある。
3. Forecast(現在はDark Skyに名称変更)
無料で利用可能なAPIは2種類で、現在/1時間毎/毎日の情報が取得できるものと、過去60年間の指定した日付の気象情報が取得できるもの。

今回は最も忠実に現在の気温を取得できそうなDark Skyを採用しました。

Dark Skyの登録

まずはDarkSkyのAPIページから登録を行います。
以下の『TRY FOR FREE』からメールアドレスとパスワードを登録すれば完了です。カンタン!

ログイン後の『Your Secret Key』がアクセスキーになるので保存しときます。

ちなみに登録前のページでDark Skyの料金が見れますが、1日1,000コール以上はお金が掛かるように見えます。

ただし実際に登録の際にはクレジットがいらなかったのと、以下のように注意書きで『1,000回以上コールしたかったら請求書情報更新してね』と書いてあるので、クレジット登録しなくても大丈夫のようです。良かった。

Plan Type: Trial
Your trial account allows up to 1,000 free calls per day to evaluate the Dark Sky API. If you would like to make more than 1,000 calls per day, simply enter billing information to upgrade to a full account.

プログラム無限ループさせても金銭的に死ぬことはないから安心ですね。
(´-`).oO(もし課金システムで本当に無限ループさせたら、死ぬのかな)

緯度と経度を調べる

次は利用したい地域の緯度と経度を調べます。
Dark Skyのページにある検索ボックスから地域の名前を入力すると、URLに経度と緯度が表示されるので、これをメモします。

登録時に取得したアクセスキーと経度・緯度を利用して、以下のURLをブラウザから打ってみます。

https://api.darksky.net/forecast/[key]/[latitude],[longitude]

結果です。うまく取得できていますね。やったー!

それではプログラムを作り始めましょう。

GAS(Google Apps Script)を使って気温の自動取得

さて遂にプログラムの実装です。
今回も前回同様サーバレスでやりたいため、GASを利用してJavaScriptで実装ました。

var darkSkyAccessToken = "XXX"
var latitudeLongitude = "XXX,XXX"   // 緯度_経度

function myFunction() {
  var url = "https://api.darksky.net/forecast/" + darkSkyAccessToken + "/" + latitudeLongitude;
  var data = JSON.parse(UrlFetchApp.fetch(url));
  var currentTemperture = (5/9) * (data["currently"]["temperature"]-32); // 華氏を摂氏に変換
  var currentHumidity = data["currently"]["humidity"] * 100;
  console.log(currentTemperture)
  console.log(currentHumidity)
}

結果です。うまく温度と湿度が取れていますね。

[18-07-12 15:03:47:030 JST] 実行を開始しています
[18-07-12 15:03:47:153 JST] UrlFetchApp.fetch([https://api.darksky.net/forecast/XXX/XXX,XXX]) [0.114 秒]
[18-07-12 15:03:47:156 JST] console.log([30.372222222222224, []]) [0 秒]
[18-07-12 15:03:47:156 JST] console.log([55.00000000000001, []]) [0 秒]
[18-07-12 15:03:47:157 JST] 実行が無事終了しました(合計ランタイム 0.119 秒)

それでは取得した温度と湿度をスプレッドシートに記録していきます。
前回のNature Remoの温度・湿度をスプレッドシートに記録するプログラムを拡張して作っています。

var darkSkyAccessToken = "XXX"
var latitudeLongitude = "XXX,XXX"   // 緯度_経度
var natureRemoAccessToken = 'XXX'
var spreadsheetId = 'XXX'
 
function main() {
  var natureRemoData = getNatureRemoData(); // NatureRemoは室温を取得する
  var darkSkyData = getDarkSkyData(); // DarkSkyはオープンデータから外気温を取得する
  var lastRow = getLastRow();
  setLatestData(natureRemoData, darkSkyData, lastRow+1);
}
 
function getNatureRemoData() {
  var url = "https://api.nature.global/1/devices";
  var headers = {
    "Content-Type" : "application/json;",
    'Authorization': 'Bearer ' + natureRemoAccessToken,
  };
  var options = {
    "method" : "get",
    "headers" : headers,
  };

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

function getDarkSkyData() {
  var url = "https://api.darksky.net/forecast/" + darkSkyAccessToken + "/" + latitudeLongitude;
  var data = JSON.parse(UrlFetchApp.fetch(url));
  return data;
}
 
function getLastRow() {
  var datas = SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getDataRange().getValues()
  var data = datas[datas.length - 1]
  return datas.length;
}
 
function setLatestData(natureRemoData, darkSkyData, row) {
  SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getRange(row, 1).setValue(new Date())
  SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getRange(row, 2).setValue(natureRemoData[0].newest_events.te.val)
  SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getRange(row, 3).setValue(natureRemoData[0].newest_events.hu.val)
  SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getRange(row, 4).setValue((5/9) * (darkSkyData["currently"]["temperature"]-32))  // 華氏を摂氏に変換
  SpreadsheetApp.openById(spreadsheetId).getSheetByName('log').getRange(row, 5).setValue(darkSkyData["currently"]["humidity"] * 100)
}

スプレッドシートの結果です。
室内の情報がNature Remo、室外の情報がDark Skyのオープンデータです。

うまくいきました!これで温度が比較できるぞー!

まとめ

こんな感じで室内と室外の気温・湿度が比較できるようになりました。
黄色くちょろちょろって見えているのが新しく追加した室外温度です。

かわいいですね。ほれぼれします。
(´-`).oO(あれ、室外湿度はどこいったんだろう)

さて、これにて室温と外気温が比較できるようになりました。
これだけの情報があれば、『外のが涼しいから窓開けよっか?』というのも自動で判断できるようになります。
こうなってくると窓を自動で開閉する装置が欲しくなりますね…

この記事が気に入ったらサポートをしてみませんか?