Nature Remo で温度超過時にアラート通知をする

はじめまして。最近、チンチラを描い始めました。
猫ではなく、ネズミっぽいアレです。
可愛いですよね。めっちゃうんこするけど。

![IMG_3254.jpg](https://qiita-image-store.s3.amazonaws.com/0/242473/46da9189-8565-1046-5ea7-36baffddd1bd.jpeg)

ところで、チンチラは標高が高い山に原生している生き物なので、暑さに弱いのです。
温度が25度を超えるとしんどいらしいです。

これからの季節、基本冷房はつけっぱなしにする予定ですが、
うっかり野郎なので、エアコン付け忘れたまま外出してしまうかもしれません。
そのため、温度がしきい値を超えたときに通知が来るようなものを実装しようと考えました。

今回は、「Nature Remo」と、「Line Notify」を使って環境を作ります。
Nature Remoは、家電の操作をリモートでできるスマートなヤツです。
APIを使っていろいろ操作を行うことができます。
https://nature.global/jp/blog/2018/1/30/api

#事前準備

・Nature Remoのアクセストークンを取得
以下URLからトークンを発行します。
https://home.nature.global/
トークンは一度しか表示されないので、メモします。

・Line Notifyのトークンを取得
https://notify-bot.line.me/
LINE@でアカウントを作ってもいいのですが、今回はPush通知だけ行いたいのでNotifyを選びました。

# RemoのAPIを叩く

Swaggerにドキュメントが公開されています。
http://swagger.nature.global/#/default/get_1_devices

今回はRubyで書きたいので、Swagger上のサンプルコマンドをcurl-to-rubyでnet/httpに一発変換。
https://jhawthorn.github.io/curl-to-ruby/

```rb

require 'net/http'
require 'uri'

uri = URI.parse("https://api.nature.global/1/devices")
request = Net::HTTP::Get.new(uri)
request["Accept"] = "application/json"
request["Authorization"] = "Bearer <アクセストークン>"

req_options = {
  use_ssl: uri.scheme == "https",
}

response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(request)
end

puts response.body
```

以下のような結果が帰ってきます。

```json

[
    {
        "created_at": "2018-04-02T09:33:23Z", 
        "firmware_version": "Remo/1.0.62-gabbf5bd", 
        "humidity_offset": 0, 
        "id": "<RemoのID>", 
        "name": "<Remoの名前>, 
        "newest_events": {
            "hu": {
                "created_at": "2018-04-03T06:44:31Z", 
                "val": 50
            }, 
            "te": {
                "created_at": "2018-04-03T04:50:11Z", 
                "val": 23
            }
        }, 
        "temperature_offset": 0, 
        "updated_at": "2018-04-02T14:14:41Z", 
        "users": [
            {
                "id": "<ユーザID>", 
                "nickname": "<自分の名前>", 
                "superuser": true
            }
        ]
    }
]
```
[newest_events]の[hu][val]が湿度、[te][val]が温度のようです。

##必要な情報を抜き出す

温度と湿度の情報だけほしいので、抜き出します。

```rb

hash = JSON.parse(response.body)

temptation = hash[0]["newest_events"]["te"]["val"].to_f
humidity = hash[0]["newest_events"]["hu"]["val"].to_f

puts temptation
puts humidity
```

実行結果

```
23.0
50.0
```
いい感じの気温・湿度ですね。

#Line Notifyからの通知

こちらを参考にしました。以下コードを追加。
https://qiita.com/pinori/items/7964b6c5c614ea783540

```rb
def LineNotify(msg)
	uri = URI.parse("https://notify-api.line.me/api/notify")
	https = Net::HTTP.new(uri.host, uri.port)
	https.use_ssl = true

	req = Net::HTTP::Post.new(uri.request_uri)
	req["Authorization"] = "Bearer <アクセストークン>"
	req["Content-Type"] = 'application/x-www-form-urlencoded;charset=UTF-8'
	req.set_form_data({message: msg})

	res = https.request(req)
end

upperTemp = 25.0
lowerTemp = 15.0

if temptation > upperTemp
	msg = "室温が" + temptation.to_s + "度になりました。\n" + "暑いよ～！(´˔`;^ )∫"
	LineNotify(msg)
elsif temptation < lowerTemp
	msg = "室温が" + temptation.to_s + "度になりました。\n" + "寒い…((-˔-^lll )∫)ｶﾞﾀｶﾞﾀ"
	LineNotify(msg)
end

```

#実行する

![IMG_9065.png](https://qiita-image-store.s3.amazonaws.com/0/242473/529741b4-6012-f51f-2e8a-70e5ff70812b.png)


ちゃんと通知されました。
RemoのAPI制限は「5分以内に30回」なので、1分に1回程度なら回しても問題なさそうです。
それでは、よいチンチラライフを…