Node-RedとPushoverでApple Watchに情報を表示させる


##目標
![53783D56-1459-489D-A518-6E4570BB8AC6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/b67bfb7d-48f2-0a68-3580-1813ccf03eee.png)

数字`171`とアーチ状のゲージが**Pushover**の**コンプリケーション**です。

私の通常使いでは、数字を今日使った電気代、ゲージを24時間時計にしています。

（今日は八割方暮れたけど、この時間でエアコンかけてて171円なら普通かな）

#目次
[1.必要なもの](#1-必要なもの)
[2.手順](#2-手順)
[3.おまけ](#3-おまけ)
[4.おわりに](#4-おわりに)

#1. 必要なもの

+ Node-Red
+ Pushover
+ Apple watch
+ iPhone
+ Raspberry Pi

#2. 手順

###Pushoverの導入
https://pushover.net/

**Pushover**というアプリを使えば、iPhoneやApple Watchに通知を送信できます。Androidにも対応しています。

また、Apple Watchのコンプリケーションとしても使え、ある程度の量の文字や数値情報をApple Wacthに表示できます。
今回はそちらの機能を使います。

:::note info
コンプリケーションの詳細は次を参照してください。
:::

https://support.apple.com/ja-jp/guide/watch/apda6559ad78/8.0/watchos/8.0

:::note warn
Pushoverは買い切りアプリ（ダウンロードと試用は無料、試用期間後の継続使用は一度だけアプリ内課金）ですが、使用できる通知は1か月あたり最大10,000件となっているので、通知頻度には注意してください。（執筆時）
:::

>なお、Pushoverの使用状況はPushoverのサイトで確認できます。

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/a774f9e7-2b36-b1f6-ac34-bf85a209c091.png)

まずはPushoverアプリをiPhoneとApple Watchにインストールし、必要となるUser KeyとAPI Tokenuser keyをPushoverサイトで取得します。

このPushoverのkeyを取得するところまでは、次の@BlueRayiさんの解説に詳しく書かれています。

https://qiita.com/BlueRayi/items/ffc70df12ddb8013b01c

Pushoverアプリをインストールし、User KeyとAPI Tokenuser keyを取得できたら、iPhoneでApple WatchのコンプリケーションをPushoverに変更しておきます。

次のような形状のコンプリケーションが選べるフェイスを選んでください。

![B8A5765D-7207-4CC0-AACF-15C85D44298F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/ac71f3d5-616b-e305-3c83-06096b3a04ff.png)

![86E17C8A-A40D-44F6-975E-8DAD04C404DA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/55f49464-a9cd-8436-89c7-b4642fc604a4.png)

あとはPushoverアプリやiPhoneの通知などを設定してください。それほど難しくはないはずです。

###Node-Redの設定

次はNode-Redの設定です。

:::note info
Raspberry Piに最新のNode-Redが入っていなければインストールしておきます。
:::

https://nodered.jp/docs/getting-started/raspberrypi

pushover用のノードがあるので、そちらをインストールしていきましょう。

https://flows.nodered.org/node/node-red-contrib-pushover

まず、Node-Redのパレット検索で`node-red-contrib-pushover`を見つけ、インストールします。

![ABC0D316-6B1F-4D12-8488-837D258B8325.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/78a3470c-6f1c-cfe3-37a6-c907f285b6a3.jpeg)

時計アイコン付きの青い`grancesノード`がパレットで選べるようになったらインストール完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/d6f57271-e5e4-8952-4bcd-ecced9fc3f36.png)

次に、パレットからワークスペース上に`grancesノード`をドラッグして置きます。

![30EF7AB1-17E5-40EA-81E6-5FD40902C5C6.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/e62fd767-bf02-2e68-e399-731a5a75889a.jpeg)

この`grancesノード`をダブルクリックし、設定画面を開きます。

![Untitled-1 copy 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/72e8a79c-6c5f-83c2-35d5-7c4e4b46fab7.jpeg)

さらに`Keys`欄右の`鉛筆ボタン`からプロパティ設定画面に入ります。

`User`と`Token`に、先ほど取得した`User Key`と`API Token`の値をそれぞれ入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/9391f1ca-0eee-e72d-bb97-e3aa7eb4afbd.png)

入力したら適当な`Name`を付けて保存します。

次に、`injectノード`を挿入しワイヤーで接続します。この`injectノード`の設定は変更しません。

![Screen Shot 2022-01-05 at 9.07.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/18ff1b85-290f-c2f0-c797-80286f0f8b05.png)

両者の間に`changeノード`を挿入します。
3つのノードがワイヤーで繋がりましたか？

![Screen Shot 2022-01-05 at 9.16.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/4fd1da27-44b6-4949-ff8d-1b74b00d5c10.png)

`chngeノード`を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/35500ada-0b85-0771-67bc-b5d3fd98bfc9.png)


`node-red-contrib-pushover`のヘルプにあるように、`msg.count`に整数値（制限不明）、`psg.percent`に0〜100までの整数値を入れることができます。ここではそれぞれ定数`111`,`99`を代入しています。(文字列でも大丈夫でした)

>Apple Watchの画面上では、`msg.count`が数値、`msg.percent`がゲージにそれぞれ対応します。

>![9DC43D80-4359-4A42-A855-60E6D7CD8641.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/574fb5e9-2dd8-d81f-5625-b338f2c61a30.jpeg)

`デプロイ`ボタンを押してデプロイしてから、`injectノード`（`タイムスタンプ`）左側のボタンを押してノードを動かしてみます。

![Screen Shot 2022-01-05 at 9.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/1f1202fa-b4b7-44e0-6880-79bffbe0f71b.png)

エラーは出ていないようですね。Apple Watchにはちゃんと送信されているでしょうか？

![2FE10EC4-CCDA-4968-854D-D1D151EF9F84.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/362d0252-666f-b515-f5c5-7d89fe24e942.png)

`chngeノード`に設定した値が反映されました！ゴール！

:::note info
タイミングによっては反映まで遅延があるようです。通知オフを解除した朝の起きがけなどは更新されていないことが多いです。
:::

#3. おまけ

追加でいじってみましょう。

###余計なものを`granceノード`に送らないようにする

`changeノード`の部分を`functionノード`に置き換えてみます。

![7A41CC4E-7427-45C6-9FD0-71C9E3765725.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/5437760d-c4a9-6141-528b-7b4ddc9ba5b5.jpeg)

![1C06B79C-6DE4-4A33-8F5F-1112963C1EEB.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/762ed646-e583-ef5b-ab19-c544c9dd92f8.jpeg)

こうすることで、`msg`のプロパティが`count`と`percent`（と`_msgig`）に制限され、多くのノードをつなげた時に余計なデータを`granceノード`に送って挙動を妨げる心配がなくなります。
>この例では、`injectノード`からmsg.payloadにタイムスタンプの数値が送られてきますが、`functionノード`で無視されるわけです。

###更新頻度に制限をかける

メッセージの流量を制限します。ここでは、30分あたり4件以上の通知は破棄するように設定します。

まず`delayノード`を追加します。

![82D1712B-3367-44EB-A7F9-79C75AEAFE19.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/cf69c7ed-a530-633d-1607-cf200d6e1a1a.jpeg)

この`delayノード`を設定します。

![42845ED2-0E49-414D-B268-F2155F097158.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/e7667be9-8148-40c0-2c9e-2c6c3b998cb0.jpeg)

:::note info
前述の通りPushoverの月当たりの通知量に制限があるので、このようなリミッターは付けておくべきでしょう。テストの時はバイパスをお忘れなく。
:::

###さらに遊んでみる

次に、`changeノード`を挿入します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/d1b57a70-2e67-a368-ad34-36edd0bf0a63.png)

挿入した`Changeノード`を設定します。

![DCB9462E-5A6B-4EF3-B412-9D47B6C2C132.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/224e3c03-6685-4478-d87d-c3a8b010a98f.jpeg)

ここには数値ではなく計算式を入れてやります。

`msg.mycount`には、**ある日付から今までの日数**を計算する式を入力します。ちなみに`$ceil()`は切り上げ関数です。

```msg.mycount
$ceil(($millis()-$toMillis("1998-06-19T09:00:00.00Z"))/86400000)		
```

`msg.mypercent`には、**ある日付から今までの年数**を計算する式を入力します。`$floor()`は切り捨て関数です。

```msg.mypercent
$floor(($millis()-$toMillis("1998-06-19T09:00:00.00Z"))/31536000000)
```
>代入する値はJSONata形式を指定してください。

>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/89b52ff8-047e-d85d-b38b-1a3f3687e585.png)

https://docs.jsonata.org/date-time-functions

https://qiita.com/tseigo/items/e7deb8d6d4902a4aef30


なお、日付は某有名人の方の生年月日を使わせていただきました。

次に、`injectノード`の設定を毎日9時に変更します。これで毎日9時にApple Watch宛に新しいデータが送信されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/e9a59afa-82f1-abee-83bf-8c46cbb3380f.png)

また、`functionノード`で、`changeノード`で設定した変数を受け取れるよう書き換えます。

![C98F6BC7-E0F7-4CBB-9FE6-D2ABBAA9602E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/f41c660b-bcd9-5758-6ddf-91f5a93280df.jpeg)

>msg.countにmsg.mycount、msg.percentにmsg.mpercentの値を代入しています。

デプロイしてみましょう。
さてどうなるでしょうか。

![EB52B806-38CF-481E-9D5D-7E0F742BEFF9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/ce3f8b9f-a224-f135-8ac8-3e742f47cdd5.png)

おっと、このコンプリケーションでは4桁以上の数字は表示しきれないようです。
ではフェイスを変えて再チャレンジ。

![47AEF205-4C2F-4BDA-A0D2-D0488ED041BD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/495297/612db563-48d1-fc2c-5301-7f8a3826d08b.png)

できましたね。
先ほど設定した通り、数値は設定日からの経過日、ゲージは経過年（最大100年）を表します。

`changeノード`の日付を自分の誕生日にすれば、マイ「人生100年メメントモリ時計」の完成です。

#4. おわりに

それにしても**広瀬すず**さん若い！

最後まで読んでいただき、ありがとうございました。