NatureRemoを使って不快指数を計算する

この記事は[JXAdvent Calendar](https://qiita.com/advent-calendar/2018/jxpress)の24日目の記事です。
執筆はAndroidエンジニアのぬまっち([@nuMatch](https://twitter.com/nuMatch2552))が担当します。   

## 不快指数
まずは不快指数とはなんぞや、という話ですが
大雑把に説明すると人が暑い、寒いと感じる体感温度の指標の事です。

人が暑さや寒さを感じるには温度の他に湿度が関係してきます。
不快指数の計算式は

```
0.81×温度＋0.01×湿度×（0.99×温度-14.3）＋46.3
```
で求める事が出来ます。([wikipediaより](https://ja.wikipedia.org/wiki/%E4%B8%8D%E5%BF%AB%E6%8C%87%E6%95%B0))
一般的に不快指数が80を超えると多数の人が`暑い`と感じ、
60を下回ると`寒い`と感じると言われています。

例えば梅雨の時期、温度が28度で湿度が90%だと不快指数は`81.1`になり、とても暑いと感じます。
しかし30度を記録するような真夏日でも湿度が10%の時の不快指数は`72.1`となり、人はそこまで暑さを感じないのです。

## Nature Remo API 

不快指数の計算に使う温度と湿度は、Nature Remo APIを使って取得する事が可能です。

※トークンの取得周りは下記を参考に参考にさせて頂きました。
https://dev.classmethod.jp/etc/nature-remo-api/

状態取得APIを使えば、デバイスの温度や湿度、光量をJSON形式で取得する事が出来ます。

```python
import requests

headers = {
    'accept': 'application/json',
    'Authorization': 'Bearer {$トークン}',
    }

# https://api.nature.global/1/devicesは状態取得API
response = requests.get('https://api.nature.global/1/devices', headers=headers)
```

- Response例(一部抜粋)

```json

        "newest_events": {
            "hu": {
                "val": 20,
                "created_at": "2018-11-11T14:58:11Z"
            },
            "il": {
                "val": 243.39,
                "created_at": "2018-11-11T14:26:06Z"
            },
            "te": {
                "val": 21.39,
                "created_at": "2018-11-11T13:27:24Z"
            }
        }
```

- hu
    - 湿度(%) : 10%刻み
- il
    - 光量    ： 1～255の間で0.01刻み 
- te
    - 温度(℃) : 0.01℃単位

このうち、温度と湿度から不快指数を計算することが出来そうです。

## 完成形

先に書いた不快指数の計算式とNature Remo APIへのrequestを合わせたものが下記になります。


```python

import requests
import json

headers = {
    'accept': 'application/json',
    'Authorization': 'Bearer {$トークン}',
    }

response = requests.get('https://api.nature.global/1/devices', headers=headers)

def request_api():
    # レスポンスをjsonに変換する
    data = response.json()
    # 温度と湿度を取り出す
    te = data[0]['newest_events']['te']['val']
    hu = data[0]['newest_events']['hu']['val']
    # 不快指数を計算する
    disc = discomfort_index(te,hu)
    print('温度：(%s)℃　湿度：(%s)％' % (te, hu))
    print('不快指数：(%s)' % disc)

# 不快指数の計算式
def discomfort_index(te,hu):
    # floatに変換してから計算する
    temp = float(te)
    hum = float(hu)
    return 0.81 * temp + 0.01 * hum * (0.99 * temp - 14.3) + 46.3

```
このときの出力結果がこちらになります。

-  温度：(21.39)℃　湿度：(20)％
-  不快指数：(65.00112)

| 不快指数 | 体感 |
|:--|:--|
| 〜55 | 寒い |
| 55〜60 | 肌寒い |
| 60〜65 | 何も感じない |
| 65〜70 | 快い |
| 70〜75 | 暑くない |
| 75〜80 | やや暑い |
| 80〜85 | 暑くて汗が出る |
| 85〜 | 暑くてたまらない |
###### ([wikipediaより](https://ja.wikipedia.org/wiki/%E4%B8%8D%E5%BF%AB%E6%8C%87%E6%95%B0))


今回の温度と湿度から算出した不快指数の場合では快いとまではいなかくても、寒さを感じるほど不快ではないみたいですね。

ちなみに執筆現在の筆者の自室です。
もうちょっと加湿したほうがいいかもしれません。

## 不快指数の使い道
不快指数の本来の使い道は夏の蒸し暑さの指標です。
使い方によってはオフィス内でのエアコン戦争に終止符を打てるかもしれないので、夏までには実用できるように考えたいと思います。

## ホワイトクリスマスは過ごしやすいのか
最後に脱線してしまいますが、クリスマスネタを少し。
この記事を執筆している24日現在、JX通信社がある飯田橋の気温は

```
(気象庁発表 12月24日16:00の情報)
気温:8.4度
湿度:34%
```
で不快指数を計算すると `51.2`なので、都内といえどもちゃんと防寒してないと風邪をひいてしまいそうな寒さです。
今年の東京にも年内に雪は降らなそうですが、もしかしたら積雪があるほうが湿度が高くて不快指数も軽減される可能性を思いつきました。
気象庁のデータを確認すると、今夜札幌市には積雪があるようです。ホワイトクリスマスになりそうですですね。

```
(気象庁発表 12月24日16:00の情報)
気温:-2.9度
湿度:58%
```
不快指数を計算してみると`34.4`を記録ししました。これは厚着しないと凍える寒さです。
どうやら雪が降るからといって気温が低くても不快指数が軽減されるかもしれない、という仮説は甘かったようですね。
今夜大忙しのサンタさんには、ぜひともコンディションを整えて頂きたいです。

それでは `Happy Holidays!`