色々Google Spreadsheetsに保存して使いたい、ということで NatureRemoのAPIを使って色々と情報をSpreadsheetsに入れてみました。
NatureRemo API
NatureRemoはいろいろな家電のリモコンをひとまとめにしてスマホなどから 操作できるようにしてくれるスマートリモコンですが、 かなりオープンな感じでAPIを提供してくれています。
これによってNatureRemoで計測している温度や 各家電にいつどの様な命令を送ったか、 またAPIを通じてリモコン操作を行うことも可能です。
今回はそれをGoogle Apps Scriptから叩いて 温度情報とリビングのエアコンと照明の情報を取ってみることにしました。
NatureRemo-gas
こんな感じのプロジェクトを作りました。
Google Apps ScriptでのAPIの扱い方や Spreadsheetsの連携などは以下を参照。
Google Spreadsheetsからスクリプトエディタを使って作った Google Apps Scriptのプロジェクトに、 このレポジトリにある、NatureRemo.gs、utils.gs、params.gsを コピーしてプロジェクトに追加。
NatureRemoのAccess Tokens のページでアクセストークンを取得して、
var ACCESS_TOKEN = '<YOUR_ACCESS_TOKEN>;
の様な形でsecrets.gsというファイルを別途作り保存。
これでNatureRemo.gsの中のfillNatureRemo
関数を実行すると、NatureRemoの情報がこんな感じで取れます。
取得しているのは
- NatureRemoが測定した温度
エアコン
と登録されているエアコンの状態照明
と登録されているライトの状態
です。
使っているのがNatureRemo miniなので測定値は温度しかありません。 GET: devices を使っていますが、これで返ってくるのは最新の測定値です。
ただ、NatureRemoではどのタイミングで測定を行っているか、
値のアップデートを行っているか、よくわからないのですが、
返ってくる値の中のupdated_at
を見ると
数時間同じ時間になったままで値も同じままだったりします。
他の測定機器を見るとその間数度変化があっても感知せずに、
特に28度、みたいなきっかりの値が長かったりします。
ただ、1度単位でしか測れないわけではなく、27.4度、みたいな小数な数字を返すこともあります。
なので結構大雑把な測定値、という感じになっています。
また、機器情報に関しては他にも色々使っていますが、エアコンと照明の状態を記録してみることにしました。
エアコン
、照明
は自分でつけた家電のニックネーム(ただ、これらを最初に登録するとつけられるデフォルトの名前のままですが)なので、
もし違う名前の場合、
params.gs
の中のNICKNAME_XXX
を変更する必要があります。
GET: appliances を使って各機器の状態を取ってきていますが、
- エアコンの設定温度
- エアコンのモード(冷房か、暖房か、など)
- エアコンの最後に押されたボタン
- エアコンの状態(0: off, 1: on)
- エアコンの場合、最後に押されたボタンが
power-off
だと止まっている状態。それ以外は付いている状態。power-on
は記録されるときもあるが、途中で記録されなくなる。 - これを使って押されたボタンが
power-off
ならエアコンが止まっている状態、それ以外なら付いている状態、と記録。 - ここは経験的に見ただけで、もしかすると間違っているかもしれない
- エアコンの場合、最後に押されたボタンが
- 照明の明るさ
- 一応記録しているがonでもoffでも、明るさ変えても100しか返ってこない。。。
- 照明の状態(on/off)
- 照明の最後に押されたボタン
- 照明の状態(0: off, 1: on)
- 照明の場合はon/offがはっきり返ってくるのでそれをそのまま利用
を記録しています。 ただし、これらは今使っている家電で返ってくるもので、 メーカーによっては違う値が返ってくるかもしれません。
そのあたりは実際に自分の使っているもので試して見る必要があるかもしれません。
湿度、照度、人感センサーの値を取得する
今使っているのがNatureRemo miniなので温度しか測定値が無いのですが、
他の情報も測定できる機器であれば
NatureRemo.gs
の中のdevices()
関数の中で、
return {'columns': ['Temperature', 'Humidity', 'Illuminance', 'Motion'],
'data': [events.te.val, events.hu.val, events.il.val, events.mo.val]};
の様に他の値も記録するようにしてあげればOK。
ただし、Spreadsheetsを一度作ってから変更すると列がずれてしまうので 変更する際にはシートの作り直しから。
取得頻度
今はまだテストも兼ねて毎分状態を取得しています。
トリガーとして、時間主導型で分ベースタイマー
を使い1分おき、でやっています。
これだけ頻繁にやると、1日の中で結構(数回~数十回)エラーが起きてます。
サーバー エラーが発生しました。しばらくしてからもう一度試してください。
といったエラーが主で、頻繁にやりすぎて前の実行が終わってない状態で始まってしまったために
出てしまっているのか、ちょっとまだ詳細はよくわかってませんが、
まあエラーが起きてもその後取れれば特に気にしないという感じで今のところは見ています。
ただ、上にも書いたように、そもそもNatureRemoのサーバーで 状態がそれほど頻繁にアップデートされているわけではありません。
温度測定もそうですが、各機器の状態も、そもそもそれほど頻繁に変わるものではないし、 毎分記録をつける必要があるのか、という感じ。
単純に10分に1度、とかにするとちょっと変化が激しいときには詳細さが足りないな、と思うので なるべく1分くらいの詳細さはほしいとは思う。
後は、updated_at
の値を見て、変わったときにだけ記録するか。
単純な情報取得としてはその様に変わったときだけを記録しておくのが正しいわけですが、 Spreadsheetsに入力して、あとでグラフ化しよう、とか思うと、 全部の状態を一度に取ってきて、毎分の状態、として記録されているとやりやすかったりします。
まあグラフ化するときにもう位置段階処理するものを挟めばよいわけですが、 Spreadsheetsを使って簡単に、と思うとなかなか面倒なので考えもの。
このあたりはまた考えていきたいところではあります。