数字171
とアーチ状のゲージがPushoverのコンプリケーションです。
私の通常使いでは、数字を今日使った電気代、ゲージを24時間時計にしています。
(今日は八割方暮れたけど、この時間でエアコンかけてて171円なら普通かな)
#1. 必要なもの
- Node-Red
- Pushover
- Apple watch
- iPhone
- Raspberry Pi
#2. 手順
###Pushoverの導入
https://pushover.net/
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. おわりに
それにしても広瀬すずさん若い!
最後まで読んでいただき、ありがとうございました。