Nature Remoからデータを定期取得してkintoneに保存しよう
暑さでなにも考えられない、そんな日々を送っておりますいぶろぐです。
数年前にスマートリモコン「Nature Remo」を購入してから、 家電を付属のリモコンで操作することがほとんどなくなりました。
外出先でもスマホで家電を操作できるし、Alexaと連携して音声操作もできる... 正直、Nature Remoなしの生活はちょっと考えられません。
そんなNature RemoにはAPIが用意されており、 室温やデバイスの設定情報を取得したり、家電をAPI経由で操作したりすることが可能!
というわけで、kintoneと連携してみましょう。
やりたいこと
- Nature Remoから室温、エアコン設定データを定期取得
- kintoneにデータを保存
- kintoneで可視化
定期取得するにはどこかでコードを実行する必要があるので、今回はHerokuにお手伝いいただきます。 Herokuは、コード実行環境をクラウドで提供してくれるサービスです。
kintoneアプリ作成
まずはいつもどおり、データを蓄積するkintoneアプリを作成します。 エアコンに関するデータはグループフィールドでまとめてみました。
データ蓄積に必要なフィールドは次のとおりです。
フィールド名 | フィールド | フィールドコード |
---|---|---|
作成日時 | 作成日時 | - |
室温 | 数値 | temp |
エアコン設定温度 | 数値 | target_temp |
モード | 文字列1行 | mode |
風量 | 文字列1行 | vol |
風向 | 文字列1行 | dir |
フォーム設計が終わったら、「設定」からレコード作成権限のあるAPIトークンを発行して、アプリを保存すればOK。
Nature Remo Cloud APIトークン取得
次のサイトにアクセスして、Nature RemoのAPI利用に必要なトークンを取得します。 home.nature.global
ログインしてページを進んでいくとトークン発行画面が現れるので、「Generate access token」をクリックしてトークンを発行。
のちのち使うので、発行したトークンはどこかにコピペしておいてください。
コードをかきかき
今回はkintoneに適用するJavaScriptではなく、HerokuのNode.js環境で実行するJavaScriptを書いていきます。
コードの全体はこんな感じで〜。トークンなどはHerokuの環境変数から読み込み、直書きを避けます。
const FormData = require('form-data'); const { URL, URLSearchParams } = require('url'); const fetch = require('node-fetch'); const Headers = fetch.Headers; // Nature RemoのAPIのエンドポイントを定義 // Nature Remoのデバイス情報取得と連携家電の情報取得は、エンドポイントが異なる const deviceUrl = 'https://api.nature.global/1/devices'; const applianceUrl = 'https://api.nature.global/1/appliances'; // fetchでAPIをGETする関数 const getData = async (url, param) => { const resp = await fetch(url, param); const data = await resp.json(); return data; } (async () => { const param = { method: 'GET', headers: { 'Authorization': 'Bearer' + process.env.RTOKEN } }; // Nature Remoからデータを取得 const deviceData = await getData(deviceUrl, param); const applianceData = await getData(applianceUrl, param); // kintoneにPOSTするbodyをつくる const body = { 'app': process.env.APPID, 'record': { 'temp': { 'value': deviceData[0].newest_events.te.val }, 'target_temp': { 'value': applianceData[0].settings.temp }, 'mode': { 'value': applianceData[0].settings.mode }, 'vol': { 'value': applianceData[0].settings.vol }, 'dir': { 'value': applianceData[0].settings.dir } } }; // kintone REST APIでレコードを登録 const resp = await fetch(process.env.KINTONEURL, { method: 'POST', headers: { 'X-Cybozu-API-Token': process.env.KTOKEN, 'Content-Type': 'application/json', }, body: JSON.stringify(body) }); if(resp.ok) { const result = await resp.json(); console.log(result); } else { const error = await resp.json(); console.log(error); } })();
!注意!
今回は簡略化のため「レコードを削除する」機能を実装していません。 このコードをそのまま利用すると、レコードが増える一方です。 実用する場合は、レコード件数を取得して古いレコードを削除するといった機能を実装しておきましょう。
依存関係の情報を持つpackage.json
を生成するため、次のコマンドをコードを保存したディレクトリで実行します。
npm init -y
今回はGitHubのリポジトリからHerokuへコードをデプロイしたいので、コードとpackage.json
をGitHubにPushしておきます。
Herokuにコードをデプロイ
あとはコードをHerokuにデプロイすればOK!HerokuとGitHubを連携し、リポジトリを接続します。
アプリIDやトークン、kintoneのURLを環境変数として設定しておいて...
Heroku Schedulerを使って、10分ごとにコードを実行するよう設定。これですべての作業は完了です!
動作確認
しばらくしてkintoneのアプリを見てみると...レコードが登録されています!(時間がずれているのは一体...?)
こんな感じでグラフ化すると、いい感じになりますね。
〆
Nature Remoとkintoneを連携して、いい感じに室内環境のデータを蓄積してみました。
APIを利用すれば、「勤怠アプリで出勤したら、テレビをオフにする」みたいなこともできそうですね! いずれやってみようと思います。
ではでは〜。