Philips_HueをAPI連動！「目覚ましに自動点灯&電球色で生活情報をひと目で取得」システムを作ったよ

#はじめに

目覚まし代わりに照明ON！
電球色で天気や、電車遅延などが色でひと目でわかる！！
そんな、起きた瞬間に生活情報が一発でわかる夢のシステムを作ってみました。

名付けて**「hue_info」** 
git-hubレポジトリはコチラになります。
https://github.com/akiraseto/hue_info

![IMG_6658.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215645/7a586399-bca9-138f-2eb2-2dbf53c56702.jpeg)

ちょっと前につくったシステムで、毎朝こんな感じで起きてます。

- 起床5分前の6:55分にライトが自動点灯
- 部屋のスポットライト6つがそれぞれの情報に応じて色を変化
- 明るくて目を開ける→寝ながらにして、色で情報を取得！

#照明色の情報
照明は6つで、得られる情報は以下の内容にしました。

- 天気
 住んでいる地域の天気予報の概要から色を選択 
[雨]の文字あるなら:青 
[曇]の文字あるなら:緑 
[晴]の文字あるなら:黄

- 気温
最高気温を昨日と比較して色を選択 
昨日 < 今日:赤 
昨日 = 今日:緑 
昨日 > 今日:青 

- 電車の遅延
私は会社まで2つの路線を使用します。電車の遅延情報から色を選択 
2本遅延している:赤 
1本遅延している:黄 
遅延無し:青 

- 運動量
昨日と一昨日の合計歩数を比較 
昨日 < 昨日:青 
昨日 = 昨日:緑 
昨日 > 昨日:赤 

- 体重
昨日と一昨日の体重を比較 
昨日 < 昨日:赤 
昨日 = 昨日:緑 
昨日 > 昨日:青 

- 株
日経平均株価を、昨日と一昨日で比較 
昨日 < 昨日:青 
昨日 = 昨日:緑 
昨日 > 昨日:赤 

#システム構成

大まかな流れは以下の感じです。

1. iphoneアプリ「ホーム」のオートメーション機能で6:55に動作予約
2. HomeKit化されたRaspberrypi 3B+(以下:ラズパイ)で動作予約したpythonコードを実行
3. pythonコードが各情報をAPIで取得
4. 取得情報に応じて色を決定して、「Philips Hue」に命令
5. 照明の色が変化する

ちょっと細かく見ていきます。

##登場人物
###HomeKitとは
Appleが提唱するホームIoT規格です。
https://www.apple.com/jp/ios/home/

対応デバイスを設定すると、iphoneや、siriから制御することができます。
今回はコチラの規格を利用しました。

###ラズパイをHomeKit化する

通常、HomeKitは対応アクセサリのみの制御となりますが、
オープンソースのhomebridgeを通して、
ラズベリーパイなどををHomeKit化することができます。

homebridgeはnode.jsで書かれているモジュールです。
https://www.npmjs.com/package/homebridge

ラズパイにhomebridgeをインストール

```
npm i homebridge

#モジュールディレクトリが作成されますので、移動
cd .homebridge

#設定したい機能をconfigに追記します。
vi config.json

#config.jsonのaccessoriesに追加。

  "accessories": [
    {
      "accessory": "CMD",
      "name": "hue_info",
      "on_cmd": "cd /home/pi/hue_info && python3 /home/pi/hue_info/connect_hue.py",
      "off_cmd": ""
    }
　]

```
*アカウント名piは任意に変更してください*

HomeKitアクセサリのひとつの機能として、iphoneやsiriで起動することができます。
config.jsonの細かい設定方法は以下を参考にしてみてください。
https://qiita.com/FePlus/items/4b863de7af8fbdee4d61#configjsonについて

###homebridgeを常駐化
ラズパイでhomebridgeを常駐化させて、いつでもpythonコードを命令できるようにします。

1. /etc/systemd/system/homebridge.serviceファイルを作成
2. homebridgeを常駐化させてリスタートさせる。

```sh
# homebridge.serviceファイルを作成
vi /etc/systemd/system/homebridge.service

# /etc/systemd/system/homebridge.service
[Unit]
Description=Node.js HomeKit Server
After=syslog.target network-online.target

[Service]
Type=simple
User=pi
ExecStart=/home/pi/.nodebrew/current/bin/node /home/pi/.nodebrew/current/bin/homebridge -U /home/pi/.homebridge
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target
```
*アカウント名piは任意に変更してください。nodebrew箇所も環境に応じて変更してください*

これだとnodebrew依存でnodeのバージョンを変更すると動かない可能性もある書き方ですが、
私は頻繁にバージョン変更することもないので、ゆるーくこのままで動かしています。

次は常駐daemon化します。

```sh
sudo systemctl daemon-reload
sudo systemctl enable homebridge.service
sudo systemctl restart homebridge.service
```
加えてhomebridgeを再起動してきます。

###pythonで各APIを取得
各データの取得API先は以下としました。

#####天気、気温
livedoorのweather apiを利用しました。
http://weather.livedoor.com/weather_hacks/

#####電車遅延情報
鉄道遅延情報jsonを利用させてもらいました。
https://rti-giken.jp/fhc/api/train_tetsudo/

#####株価
無料でAPIで提供してくれているサービスがなかなか見当たらないです。
今回はリアルタイムではなく、取引終了後に終値を記録しているサイトから取得させてもらいました。
無尽蔵相場書庫
http://souba-data.com/

#####体重
旧Nokia体重計、現withingsブランドが出しているwifi対応体重計を使用しています。
https://www.withings.com/jp/ja/body-plus

利用者専用ページから体重と歩数をAPIで取得可能。
体重管理に興味ある方には、コチラの体重計はおすすめです。
初回にwifi設定すれば、毎回自動で体重、BMI、体内水分量などを計測時にcloudに送信、
毎日の変化を利用者ページでグラフ付きで管理できます。スマホアプリでも同期して閲覧可能です。

#####歩数
かなり回りくどい方法になってしまいました。。。
AppleWatchにて歩数をロギングしているのですが、AppleヘルスケアはAPIがない。icloudで取得することもできない。。
iphoneから歩数データをダウンロードしてメールで飛ばすことはできるのですが、なるべく自動でやりたいです。

苦肉の策として
1. iphoneで、「ヘルスケア」(純正アプリ)と、「Health Mate」(withingsの体重計アプリ)を連動させる。
2. Health Mateでpullしてヘルスケアから歩数データを取得しwithingsの専用ページに歩数データを取り込む
3. 更新された歩数データをwithingsのAPIを通して取得

なんとも遠回りな長い道のりで取得しています。
Appleには、個人データ用のAPIを作っていただきたいです。

###pythonでPhilips Hueを制御
Philips社製の、wifiを通してON/Off、明るさ、色の変更を制御できるIoT電球です。
https://www2.meethue.com/ja-jp

Hue自体はHomeKit対応アクセサリですが、
今回はAPIからのデータに応じて電球色を変えたいので、pythonから制御しました。

まず、HueシステムはhueブリッジというHub機器で各電球を制御しています。
hueブリッジにはIPアドレスが付与されており、このIPアドレス宛にRESTAPIすることで各電球を制御できます。
DHCPでコロコロIPが変わっては面倒なので、予め固定IPにしておきます。
（固定IPの方法に関しては、ルーター機器によって設定方法が異なるので割愛します）

#####hueブリッジとの通信について
RESTAPIで逐一書くのが、正直ちょっとめんどくさい。。
代わりに、オープンソースのpythonモジュール「phue」を導入しました。

phue
hueブリッジへのRESTAPIをWrapperして、methodに簡単な引数を渡すだけで制御できるモジュールです。
初回使用のみhueブリッジと同期が必要ですが、それ以降は不要です。

インストール

```
pip install phue
```
詳細は公式GitHubページで確認してみてください。
https://github.com/studioimaginaire/phue


##コード
この記事では、システムの全体像を紹介したいので、大まかな構成だけにとどめます。
詳細は上記でも紹介した[GitHubリポジトリ](https://github.com/akiraseto/hue_info)を確認してください。

###構成

```
hue_info/
├── README.md
├── api_stock.py  #株価取得用
├── api_train.py  #電車遅延用
├── api_weather.py  #天気取得用
├── api_withings.py  #体重、歩数取得用
├── cli_api_stock.py  #手動で個別操作用:株価
├── cli_api_train.py  #手動で個別操作用:電車遅延
├── cli_api_weather.py  #手動で個別操作用:天気
├── cli_api_withings.py  #手動で個別操作用:体重、歩数
├── cli_withings_token.py  #手動で個別操作用:withingsトークン取得
├── cli_withings_token_refresh.py  #手動で個別操作用:トークンリフレッシュ
├── config.py  #個人設定
├── connect_hue.py  #本体のプログラム
├── tmp  #API取得したデータ格納用ディレクトリ
└── withings_token_refresh.py  #withingsトークンリフレッシュ用
```

- 本体は`connect_hue.py`となります。こちらがmainです。
- `api_`接頭辞のファイルはapiを通しての各情報取得用ファイルとなり、connect_hue.pyから呼び出されます。
- `cli_`が付くファイルはterminalでの個別に手動操作したいとき用となります。
- `config.py`は個人のパスワードや、トークンIDなどを格納しています。コチラを適所変更してください。
- `tmp`ディレクトリには各APIで取得したデータをjsonファイルで格納しています。
- `withings_token_refresh.py`は体重計withingsのAPI接続用トークンを毎回リフレッシュするためのコードです。

数点だけ補足説明させてください。
####api_stock.py
株式市場は土日と祝日が休みです。祝日情報を取得するために以下からjsonで取得しています。

```
        # 祝日apiを入手
        HOLIDAY_URL = "https://holidays-jp.github.io/api/v1/date.json"
```
この祝日と、正月の1，2，3日、土日の、それ以外の日をAPI取得するようにしています。

####api_stock.py
livedoor weather APIですと、最高気温の取得が時々失敗します。
他のブログ記事などで調べると仕様のようで、気温の箇所だけ取得できずに他は正常に機能しています。
ひとまず気温が取れていない場合は20度に強引に設定していますが、他のAPIを検討したほうがいいかもしれません。

##おわりに
大事な使用感ですが、
最初の1週間は楽しかった。あぁー楽しかったなー

ですが、
チカチカしてイライラする（嫁の声）
（娘:幼児、興奮して走り回る）
（息子:新生児、起きて少しグズる）
そんなに急いで情報必要なのか。。（私の心の声）

そんな、**起きた瞬間=エレキトリカルパレード状態**と化してしまいました。
まぁ今でも便利で面白いのでしばらく早朝エレキトリカルライフを過ごしたいと思います。