スマホの電池切れ・電源落ちを別のスマホに通知する

【2021/4追記】
IFTTTの有料化により、webhookの遅延が数時間単位となってしまったようで、下記のような即時性を要求しない動作にも耐えられなくなってしまいました。
③のプログラムを変更して対処した記事がこちらになります。





最近、古いスマホと0SIMを組み合わせて車載GPSとして活用しています。
古いスマホは常時車に積んで置き、車両盗難時等に、メインスマホから位置情報を取得出来るようにしておくものです。
しかし、古いスマホなため電池残量が残っているにも関わらず勝手に電源が落ちたり、圏外からの復帰がうまく行かない事があります。
こうなるとメイン端末から位置情報の取得は出来ないため、意味がなくなります。
このような状態に陥った時にメインスマホに通知が欲しいところですが、この時車載スマホ側は電源が落ちているor通信が出来ない状態なので、探した限りその動作を実現するアプリは見つかりませんでした。
そこで、GoogleスプレッドシートとIFTTTを用いて「スマホAの電源落ちを別のスマホBに通知する」動作を実現してみました。

動作概要は以下の通りです。
①1時間に1回、スマホAがIFTTTのWebhook API(1)を叩く。
②Webhook API(1)が叩かれたら、Googleスプレッドシートにログを残す。
③1時間に1回、Google Apps ScriptがGoogleスプレッドシートのログを確認する。
ここで、ログが残っていればフラグを立てる。ログが残っていなければIFTTTのWebhook API(2)を叩く。
④IFTTTのWebhook API(2)が叩かれたら、スマホBに通知を送信する。

以下、各動作の詳細です。

①1時間に1回、スマホAがIFTTTのWebhook API(1)を叩く。


スマホAが電源が入っている、かつ通信可能状態の時に行う動作です。
Webhook APIを叩くというのは、「ある特定のURLにアクセスする」という事です。
これがIFTTTのトリガーになります。
今回はAndroidアプリMacrodroidを用いて、「1時間に1回ある特定のURL(1)にアクセスする」設定を作りました。
この「ある特定のURL(1)」は、②で確定します。




②Webhook API(1)が叩かれたら、Googleスプレッドシートにログを残す。

IFTTTを用いてこの動作を実現します。
こちらのページを参考にさせていただきました。




トリガー(This)の部分はWebhooksの「Receive a web request」になります。
Event Nameは好きに決めてください。私は「power_on」としました。
アクション(That)の部分はGoogle Sheetsの「Add row to spreadsheet」になります。
Formatted rowは「{{OccurredAt}}」のみとしました。


ここまで作成すると、①で使用する「ある特定のURL(1)」が決まります。
このページのDocumentationをクリックすると出てくるページの、「Make a POST or GET web request to:」のURLがそれです。



{event}の部分をEvent Nameに置き換えればOKです。
このURLにアクセスすると「Congratulations! You've fired the power_on event」と表示され、スプレッドシートのA列に時刻が記録されます。



③1時間に1回、Google Apps ScriptがGoogleスプレッドシートのログを確認する。ここで、ログが残っていればフラグを立てる。ログが残っていなければIFTTTのWebhook API(2)を叩く。


Google Apps Scriptを用いてこの動作を実現します。
ソースコードは以下の通りです。


  1. var sheet = SpreadsheetApp.getActiveSheet();
  2. function checkLog() {
  3.     //最終行を取り出す
  4.     var datas = sheet.getRange("A1:B" + sheet.getLastRow()).getValues();
  5.     var record = datas.pop();
  6.     //ログチェック
  7.     if (record[1] == ""){
  8.         sheet.getRange(sheet.getLastRow(), 2).setValue("logged");
  9.         return;
  10.     //ログがなければIFTTT(Webhooks)経由で通知
  11.     } else {
  12.         var url = "https://maker.ifttt.com/trigger/{applet}/with/key/{key}";
  13.         UrlFetchApp.fetch(url)
  14.         return;
  15.     }
  16. }


15行目のURLは④で設定するIFTTTのWebhook API(2)のURLとなります。
これにより、ログがA列の最終行に記録されていればB列に"logged"と書き込まれ、記録されていない、すなわち既にB列に"logged"と書き込まれていればIFTTTのWebhook API(2)を叩くことが出来ます。


こちらのページを参考にさせていただきました。

Google Apps Scriptの書き方はこちら↓



1時間に1回Google Apps Scriptを実行させる方法はこちら↓



コードの設計に関してはこちら↓






④IFTTTのWebhook API(2)が叩かれたら、スマホBに通知を送信する。

③で既に最終行のB列に"logged"と書き込まれている場合、すなわち過去1時間の間に①が動作していない場合、スマホBに「電源切れの可能性があります」という文面の通知を送ります。
こちらのページを参考にさせていただきました。



Webhook API(2)のURLの取得の仕方は②と同様です。
現在、利用開始して1週間程度経ちましたが、問題なく使用できています。
IFTTTは初めて使いましたが、非常に便利で他のことにも使ってみたいなと感じました。



コメント

このブログの人気の投稿

湾岸ミッドナイトの聖地についてまとめてみる

MakeMKVでリッピングに失敗する時の対処方法

中華タブレットのバッテリー交換に挑戦した話