kintoneに乗るっ!

非エンジニアが勉強がてら kintone で遊ぶブログ

Nature Remoからデータを定期取得してkintoneに保存しよう

f:id:ibukintone:20210721004049j:plain

暑さでなにも考えられない、そんな日々を送っておりますいぶろぐです。

数年前にスマートリモコン「Nature Remo」を購入してから、 家電を付属のリモコンで操作することがほとんどなくなりました。

外出先でもスマホで家電を操作できるし、Alexaと連携して音声操作もできる... 正直、Nature Remoなしの生活はちょっと考えられません。

そんなNature RemoにはAPIが用意されており、 室温やデバイスの設定情報を取得したり、家電をAPI経由で操作したりすることが可能!

というわけで、kintoneと連携してみましょう。

やりたいこと

  1. Nature Remoから室温、エアコン設定データを定期取得
  2. kintoneにデータを保存
  3. kintoneで可視化

定期取得するにはどこかでコードを実行する必要があるので、今回はHerokuにお手伝いいただきます。 Herokuは、コード実行環境をクラウドで提供してくれるサービスです。

kintoneアプリ作成

まずはいつもどおり、データを蓄積するkintoneアプリを作成します。 エアコンに関するデータはグループフィールドでまとめてみました。 f:id:ibukintone:20210720233042p:plain

データ蓄積に必要なフィールドは次のとおりです。

フィールド名 フィールド フィールドコード
作成日時 作成日時 -
室温 数値 temp
エアコン設定温度 数値 target_temp
モード 文字列1行 mode
風量 文字列1行 vol
風向 文字列1行 dir

フォーム設計が終わったら、「設定」からレコード作成権限のあるAPIトークンを発行して、アプリを保存すればOK。

Nature Remo Cloud APIトークン取得

次のサイトにアクセスして、Nature RemoのAPI利用に必要なトークンを取得します。 home.nature.global

ログインしてページを進んでいくとトークン発行画面が現れるので、「Generate access token」をクリックしてトークンを発行。 f:id:ibukintone:20210720234804p:plain

のちのち使うので、発行したトークンはどこかにコピペしておいてください。

コードをかきかき

今回は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を連携し、リポジトリを接続します。 f:id:ibukintone:20210721000435p:plain

アプリIDやトークン、kintoneのURLを環境変数として設定しておいて... f:id:ibukintone:20210721000554p:plain

Heroku Schedulerを使って、10分ごとにコードを実行するよう設定。これですべての作業は完了です! f:id:ibukintone:20210721000531p:plain

動作確認

しばらくしてkintoneのアプリを見てみると...レコードが登録されています!(時間がずれているのは一体...?) f:id:ibukintone:20210721001144p:plain

こんな感じでグラフ化すると、いい感じになりますね。 f:id:ibukintone:20210721001433p:plain

Nature Remoとkintoneを連携して、いい感じに室内環境のデータを蓄積してみました。

APIを利用すれば、「勤怠アプリで出勤したら、テレビをオフにする」みたいなこともできそうですね! いずれやってみようと思います。

ではでは〜。