目標
数字171とアーチ状のゲージがPushoverのコンプリケーションです。
私の通常使いでは、数字を今日使った電気代、ゲージを24時間時計にしています。
(今日は八割方暮れたけど、この時間でエアコンかけてて171円なら普通かな)
目次
1. 必要なもの
- Node-Red
- Pushover
- Apple watch
- iPhone
- Raspberry Pi
2. 手順
Pushoverの導入
Pushoverというアプリを使えば、iPhoneやApple Watchに通知を送信できます。Androidにも対応しています。
また、Apple Watchのコンプリケーションとしても使え、ある程度の量の文字や数値情報をApple Wacthに表示できます。
今回はそちらの機能を使います。
コンプリケーションの詳細は次を参照してください。
Pushoverは買い切りアプリ(ダウンロードと試用は無料、試用期間後の継続使用は一度だけアプリ内課金)ですが、使用できる通知は1か月あたり最大10,000件となっているので、通知頻度には注意してください。(執筆時)
なお、Pushoverの使用状況はPushoverのサイトで確認できます。
まずはPushoverアプリをiPhoneとApple Watchにインストールし、必要となるUser KeyとAPI Tokenuser keyをPushoverサイトで取得します。
このPushoverのkeyを取得するところまでは、次の@BlueRayiさんの解説に詳しく書かれています。
Pushoverアプリをインストールし、User KeyとAPI Tokenuser keyを取得できたら、iPhoneでApple WatchのコンプリケーションをPushoverに変更しておきます。
次のような形状のコンプリケーションが選べるフェイスを選んでください。
あとはPushoverアプリやiPhoneの通知などを設定してください。それほど難しくはないはずです。
Node-Redの設定
次はNode-Redの設定です。
Raspberry Piに最新のNode-Redが入っていなければインストールしておきます。
pushover用のノードがあるので、そちらをインストールしていきましょう。
まず、Node-Redのパレット検索でnode-red-contrib-pushoverを見つけ、インストールします。
時計アイコン付きの青いgrancesノードがパレットで選べるようになったらインストール完了です。
次に、パレットからワークスペース上にgrancesノードをドラッグして置きます。
このgrancesノードをダブルクリックし、設定画面を開きます。
さらにKeys欄右の鉛筆ボタンからプロパティ設定画面に入ります。
UserとTokenに、先ほど取得したUser KeyとAPI Tokenの値をそれぞれ入力します。
入力したら適当なNameを付けて保存します。
次に、injectノードを挿入しワイヤーで接続します。このinjectノードの設定は変更しません。
両者の間にchangeノードを挿入します。
3つのノードがワイヤーで繋がりましたか?
chngeノードを設定します。
node-red-contrib-pushoverのヘルプにあるように、msg.countに整数値(制限不明)、psg.percentに0〜100までの整数値を入れることができます。ここではそれぞれ定数111,99を代入しています。(文字列でも大丈夫でした)
Apple Watchの画面上では、
msg.countが数値、msg.percentがゲージにそれぞれ対応します。
デプロイボタンを押してデプロイしてから、injectノード(タイムスタンプ)左側のボタンを押してノードを動かしてみます。
エラーは出ていないようですね。Apple Watchにはちゃんと送信されているでしょうか?
chngeノードに設定した値が反映されました!ゴール!
タイミングによっては反映まで遅延があるようです。通知オフを解除した朝の起きがけなどは更新されていないことが多いです。
3. おまけ
追加でいじってみましょう。
余計なものをgranceノードに送らないようにする
changeノードの部分をfunctionノードに置き換えてみます。
こうすることで、msgのプロパティがcountとpercent(と_msgig)に制限され、多くのノードをつなげた時に余計なデータをgranceノードに送って挙動を妨げる心配がなくなります。
この例では、
injectノードからmsg.payloadにタイムスタンプの数値が送られてきますが、functionノードで無視されるわけです。
更新頻度に制限をかける
メッセージの流量を制限します。ここでは、30分あたり4件以上の通知は破棄するように設定します。
まずdelayノードを追加します。
このdelayノードを設定します。
前述の通りPushoverの月当たりの通知量に制限があるので、このようなリミッターは付けておくべきでしょう。テストの時はバイパスをお忘れなく。
さらに遊んでみる
次に、changeノードを挿入します。
挿入したChangeノードを設定します。
ここには数値ではなく計算式を入れてやります。
msg.mycountには、ある日付から今までの日数を計算する式を入力します。ちなみに$ceil()は切り上げ関数です。
$ceil(($millis()-$toMillis("1998-06-19T09:00:00.00Z"))/86400000)
msg.mypercentには、ある日付から今までの年数を計算する式を入力します。$floor()は切り捨て関数です。
$floor(($millis()-$toMillis("1998-06-19T09:00:00.00Z"))/31536000000)
代入する値はJSONata形式を指定してください。
なお、日付は某有名人の方の生年月日を使わせていただきました。
次に、injectノードの設定を毎日9時に変更します。これで毎日9時にApple Watch宛に新しいデータが送信されます。
また、functionノードで、changeノードで設定した変数を受け取れるよう書き換えます。
msg.countにmsg.mycount、msg.percentにmsg.mpercentの値を代入しています。
デプロイしてみましょう。
さてどうなるでしょうか。
おっと、このコンプリケーションでは4桁以上の数字は表示しきれないようです。
ではフェイスを変えて再チャレンジ。
できましたね。
先ほど設定した通り、数値は設定日からの経過日、ゲージは経過年(最大100年)を表します。
changeノードの日付を自分の誕生日にすれば、マイ「人生100年メメントモリ時計」の完成です。
4. おわりに
それにしても広瀬すずさん若い!
最後まで読んでいただき、ありがとうございました。

























