じーろぐ

日々の記録。コンピュータやプログラミングの話題が多め。

Nature Remoで花粉が多い日に空気清浄機が自動起動するようにする

花粉が多い季節になってきたので、Nature Remoを使って花粉が多い日(の帰宅時間)に空気清浄機を自動起動するようにしてみました。 そのやり方を備忘録を兼ねて記載しておこうと思います。

全体の構成

Remoにはホコリセンサーとかはついていないので部屋の花粉量を知ることはできません。そこで、その日の外の花粉飛散量で代用します。 取得した花粉飛散量に基づいて、花粉の量が多いときNature Remo API経由で空気清浄機を起動します。

図で書くとこんな感じ。

f:id:z_logger:20190318004450p:plain

必要なもの

  • (リモコンで操作できる)空気清浄機
  • Nature Remo本体
  • Nature Remo Cloud APIのアクセストーク
  • サーバ

下準備

Nature Remoに空気清浄機を登録

Nature Remoに空気清浄機のリモコンの機能を学習させておきます。

f:id:z_logger:20190318012713p:plain

Nature Remo APIキーの取得

アクセストークンをhome.nature.globalから、取得しておきます。 Nature Remo Cloud APIの詳細については、developer.nature.globalを参照してください。(APIの使い方の説明は割愛)

今回使用した機器

f:id:z_logger:20190318004448j:plain

  • ファイルサーバはQNAPのTS-220

f:id:z_logger:20190218185912j:plain

今回使用した機器特有の制限

空気清浄機の制御にNAS(ネットワークファイルサーバ)を流用したQNAPのNASは、基本的にLinuxマシンですが、 ファイルサーバなので最小限のコマンドしか使えません。(pythonも2.7系が入っているが使用できるライブラリが少ない) そのため、原始的なコマンドだけ使ったシェルスクリプトで構成されてます。普通の環境だともうちょっと簡単にかける部分もあると思います。 (そのぶん、多少変更すればほとんどの環境で動作すると思います)

概要

基本的な手順は以下のとおりです。

  1. 花粉データのダウンロード
  2. ダウンロードしたデータをパースしてロギング
  3. 花粉が多ければ指定時刻にNature Remo Cloud API経由で空気清浄機を起動

以下に、上の流れに沿って具体的なやり方を説明します。 実際に試してみたい人向けに作成したプログラムを、Githubにコードをアップしておきました。最後に簡単に使い方も書いておいたので参考にしてみてください。

1. 花粉データの取得

環境省花粉観測システム(はなこさん)のデータを使いました。 このサイトでは花粉自動計測器で一時間おきに花粉の数を計測したデータを収集しリアルタイム(1時間毎)に更新しています。

今回はパースが容易でデータも軽い携帯はなこさん(モバイル向けページ)のデータを使いました。まずはここから最寄りの地点のデータが表示されるURLを調べます。例えば、新宿区役所第二分庁舎の観測データのURLは「kafun.taiki.go.jp/mobile/Data[51320100].html」です。

今回はこのデータを、cURLを使って取得します。シェルスクリプトに以下のように記述すると、ページのデータがkafun_raw_temp.txtとして保存されます。

TARGET_URL='http://kafun.taiki.go.jp/mobile/Data[51320100].html'
ORIGINAL_FILE_NAME='kafun_raw_temp.txt'

curl -s --globoff ${TARGET_URL} > ${ORIGINAL_FILE_NAME}

細かい点ですが、URLに角括弧("["と"]”)が含まれているので、--globoffオプションを付ける必要があります。 また、最初テストするときは-sオプションを外して置くと良いです。進捗が表示されます。 ファイルは、ガラケー用のページみたいでサイズも500バイトぐらい。単純なHTMLファイルです。

注意点は、サーバ負荷。更新は1時間に1回なのでそれ以上の頻度でアクセスしないこと。 利用規約上プログラムからのアクセスも禁止されていないようですが、過負荷にならないよう十分注意してください。特にテスト時にはミスにより意図しない動作をすることもあるので、データのパース等も一度上記のようにローカルにダウンロードしてから、ローカルのファイルを使ってテストすると良いです。

2. 花粉データのパースとロギング

ダウンロードした、kafun_raw_temp.txt(単純なHTMLファイル)から、花粉の個数の部分を抽出します。やり方は何でも良いですが、今回はシェルスクリプトで作りました。 詳細は、Githubに上げてあるソースコードgetKafunData.sh を参照してください(NASにインストールされているコマンドだけで動くようにしてあるのであまりキレイなコードではないです)。

抽出したら花粉の量を、「logs/kafun.txt」にロギングします。

2019-03-17T17:46:01, 4
2019-03-17T18:46:01, 20
2019-03-17T19:46:01, 0
2019-03-17T20:46:01, 4
2019-03-17T21:46:01, 0

また、空気清浄機起動のフラグにするため、getKafunData.shでは花粉が多い日はkafun_alert.txtにフラグを立てるようにしています。

毎時35分にデータが更新されるのでcrontabに

45 */1 * * * /path/to/crawler/getKafunData.sh 

と記述すると、毎時45分に花粉の量を取得できます。

3. 花粉の多い日の指定時刻に空気清浄機を起動

細かく説明すると長くなるので、Nature Remo Cloud API経由で空気清浄機をONにする赤外線信号を送信するやり方のみ說明します。

はじめに、空気清浄機をON/OFFするsignal IDを調べておきます。 以下のコマンドを実行してNature Remo Cloud API経由で登録済みの機器とそのSignal ID一覧を取得します。

curl -s -X GET "https://api.nature.global/1/appliances" -H "accept: application/json" --header "Authorization: Bearer ${TOKEN}" > result_models.json

成功するとJSONファイルが得られます。空気清浄機の部分を見ると、こんな感じ。

{
        "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
        "device": {
            "name": "XXXXXX",
            "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
            "created_at": "2017-xx-xxxx",
            "updated_at": "2019-xx-xxxx",
            "mac_address": "xx:xx:xx:xx:xx:xx",
            "serial_number": "010xxxxxxxxxxxxx",
            "firmware_version": "Remo/1.0.xx-xxxxx",
            "temperature_offset": 0,
            "humidity_offset": 0
        },
        "model": null,
        "type": "IR",
        "nickname": "空気清浄機",
        "image": "ico_fan",
        "settings": null,
        "aircon": null,
        "signals": [
            {
                "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
                "name": "切タイマー",
                "image": "ico_timer"
            },
            {
                "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
                "name": "花粉",
                "image": "ico_plus"
            },
            {
                "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
                "name": "オン",
                "image": "ico_on"
            },
            {
                "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx",
                "name": "オフ",
                "image": "ico_off"
            }
        ]
    },

"signals"の中の、idがsignal idです。

このsignal IDとアクセストークンをつかって、Nature Remo Cloud APIを叩きます。

result=`curl -s -X POST "https://api.nature.global/1/signals/${SIGNAL_ID}/send" -k -H "Authorization: Bearer ${TOKEN}" -o /dev/null -w '%{http_code}'`

キモは、「api.nature.global/1/signals/${SIGNAL_ID}/send」ですが、-w '%{http_code}'を追加しておくと、変数resultにHTTPステータスコードが代入できて便利(200が返ってこれば正常にIR信号が送信されてます)。 あとは、ロギングした花粉のデータと時刻から、タイミングよく上記のコマンドが自動実行されるようにすればOK。

アップロードしたサンプルプログラムの使い方

実際のプログラムを、いかにアップロードしました。

github.com

実体は、小さいシェルスクリプト3つと設定ファイル3つ。合計200行ぐらい。

エアコンの自動起動プログラムと混ざっていてわかりにくいですが、以下のファイルになります。

ファイル名 説明
getKafunData.sh 花粉データのダウンロードとロギング
auto_aircleaner_ctrl.sh 花粉の飛散量が多ければ指定時刻に空気清浄機を起動
ctrl_aircleaner.sh 空気清浄機起動スクリプト
token.txt アクセストーク
aircleaner_id.txt signal IDを記入
ctrl_aircleaner_config.txt 起動時刻の設定ファイル

まず、token.txtにアクセストークンを記入します。

つづいて、aircleaner_id.txtに調べたシグナルIDを書き込みます。

off,air-cleaner-poweroff-signalID-here
on,air-cleaner-poweron-signalID-here
turbo,air-cleaner-swich-turbomode-signalID-here
timer,air-cleaner-enable-autopoweroff-signalID-here

最後に、ctrl_aircleaner_config.txtに花粉が多い日に空気清浄機を起動する時間を設定します。以下は、休日は17:00に、平日は18:00に空気清浄機を起動する例。

#AIR-CLEANER SETTING
WEEK_DAY, 18, 00
HOLIDAY,  17, 00

あとは、cronでauto_aircleaner_ctrl.shが定期的に実行されるようにすればOKです。ただ、いずれのスクリプトも環境に合わせて多少編集しないと動かないと思いますのであくまで参考程度に。

Nature Remoの関連記事

zlog.hateblo.jp