openweather mapから雨予報を取得して、雨予報の場合google nest hubから雨降りを声で通知

openweathermapから予報を取得できることがわかったので、雨が降りそうになったらgoogle nest hubが雨降るよとしゃべるようにしてみました（google nest hubに好きなことをしゃべらせてみたいとも思っていました）

- google-home-notifierはバージョンの不一致なのか何なのかうまくいかなかったので、node REDを試してみたところ、とてもやりやすくて簡単にできました。google-home-notifierでgoogle homeとか、google nest hubとかに何かしゃべらせようと思っている人は、ぜひnode REDも試されるといいと思います。

# 前提

- raspberry piの初期設定が終わっていること
- google nest hubがあること（google homeでもきっとできると思いますが試していません）

https://qiita.com/tosshie/items/d06c9f57ceb340f2d589

# 事前準備
- 以下のサイトを参照して実施しています

https://liginc.co.jp/526532

- node redをraspberry piにinstall
    - google-home-notifierを入れようと苦戦していたraspberry piでは以下のコマンドが通らなかったのですが、OSを再インストールするとすんなり実行できました

```
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
```

- node redを開始

```
node-red-start
```

- 自動起動の設定

```
sudo systemctl enable nodered.service
```

- node redにアクセス
    - ブラウザで、"http://ラズパイのIPアドレスまたはホスト名:1880" にアクセスします

- 追加モジュールのインストール
    - 右上のハンバーガーマーク→パレットの管理→ノードを追加→
    - node-red-contrib-cast で検索してインストール << google home/google nest hubをしゃべらせるモジュール
    - node-red-contrib-cron で検索してインストール << cronモジュール



- openweathermapのアカウント作成
    - 以下のページからSign in → Create an Accountで登録
    - Sign in → API keys で API keyが発行できます。複数も発行できます。
    - APIをたたけるようになるまで一晩かかった気がします

https://openweathermap.org/

- APIのテスト
    - 以下のURLにブラウザでアクセスして表示されることを確認

```
https://api.openweathermap.org/data/2.5/weather?lang=en&q=tokyo&appid={API key}&units=metric
```


# 作成

- 以下のフローを作ります

![nodered_flow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849198/abb8df92-bb7a-df31-b3db-d00e67a273e4.png)

##### a: cron
- 一定時間間隔で起動するためのものです
- node:入力/cron
- パラメータ
    - name:なし
    - topic:なし
    - CRON Expression: 0 */5 * * * *
        - 5分間隔で実行

##### b: タイムスタンプ
- テスト用の起動ボタンです
- node: 共通/inject
 
##### c: http request
- openweathermapのAPIをたたくためのノード
- node: ネットワーク/http request
- パラメータ
    - メソッド：GET
    - URL: http://api.openweathermap.org/data/2.5/onecall?lat=35.6813&lon=139.7671&exclude=hourly,daily&units=metric&APPID={API key}
        - {API key}には自身のopenweathermapのAPI keyを入れてください
        - 座標は東京駅にしてありますが、自宅の座標に変更するのをお勧めします（google mapで右クリックしたら簡単に取得できます）
    - ペイロード: 無視
    - チェックは4個ともなし
    - 出力形式: UTF8文字列
    - 名前：なし

##### d: json
- openweathermapから取得したデータのパース用
- node: パーサ/json
- パラメータ
    - 動作：JSON文字列とオブジェクト間の相互変換
    - プロパティ：msg.payload
    - 名前：なし
    - オブジェクトからJSONへ変換のチェックなし

##### e: message payload
- json出力用
- node: 共通/debug
- パラメータ
    - 対象: msg.payload
    - 出力先: デバックウィンドウ
    - 名前: なし

##### f: 10分後の降水量
- 10分後の予想降水量をjsonから抜き出し
- node: 機能/function
- コード

```
var weather_list = msg.payload.minutely[9].precipitation
msg.rain_in10m = weather_list
return msg;
```

##### g: switch (10分後の天気の場合分け)
- 10分後の天気の場合分け（ちょっとでも予想降水量がある場合は条件1→h:雨が降ります）
- node: 機能/switch
- パラメータ
    - プロパティ: msg.rain_in10m
    - 条件1: 
        - > 
        - 0.1
    - 条件2:
        - その他

##### h: 雨が降ります
- 10分後の降水量が0.1以上だったときにgoogle nest hubに送るメッセージを作成
- node: 機能/function
- コード

```
msg.message = "もうすぐ雨が降ります。洗濯物は大丈夫かな。"
return msg;
```

##### i: 晴れ
- 10分後の降水量が0.1以下の時のメッセージを作成
- node: 機能/function
- コード

```
msg.message = "晴れです"
return msg;
```

##### j: msg.message (晴れメッセージをデバックウィンドウへ出力)
- 晴れメッセージをデバックウィンドウへ出力
- node: 共通/debug
- パラメータ：
    - 対象：msg.message
    - 出力先：デバックウィンドウ
    - 名前：なし

##### k: switch (現在雨が降っているかどうかの確認)
- 現在雨が降っているかどうかの確認
- node:機能/switch 
- パラメータ：
    - プロパティ：msg.payload.current.rain["1h"]
    - 条件1: 
        - > 
        - 1
    - 条件2:
        - その他

##### l: msg.payload.current.rain["1h"]
- 現在雨が降っている場合は、現在の降水量をデバックウィンドウに出力して終わり
- node: 共通/debug
- パラメータ：
    - プロパティ：payload.current.rain["1h"]
    - 出力先：デバックウィンドウ

##### m: msg.message
- 雨が降るとgoogle nest hubにCastしていることをデバックウィンドウでも表示
- node:共通/debug
- パラメータ：
    - プロパティ：msg.message
    - 出力先：デバックウィンドウ
    - 名前：なし

##### n: cast
- google nest hubにcast
- node: 機能/Cast
- パラメータ：
    - IP: google nest hubのIP address
    - language: ja
    - Name: cast (これは画像でIPが見えないようにしているだけ)

##### o: inject
- テスト用起動ノード (現在雨が降っておらず、10分後の雨が降る前提の値)
- パラメータ：
    - msg.rain_in10m: 0.2

# テストと実行
- b: タイムスタンプ を押して実行。デバックウィンドウにparceされた気象データが出てくるか確認（e: message payload で出力している）
- o: inject でパラメータを色々変えてみて、狙い通りの動作かどうかを確認
- あとはほっといて雨が降りそうなときにちゃんと通知されるかを確認



-------
2021年3月から始めたスマートホーム化はこちらに一覧化しています（2021年5月時点）

https://qiita.com/tosshie/private/738a85184d6cdaf20b3e