SORACOMデバイスのバッテリーチェッカーを作ってみた

間に合うかわかないけど、ソラコムTシャツ欲しいと思っている人です。

## 前日談
ソラコムさんの公式のデバイス、色々と登場していて、自分では以下のデバイスを持っています。
- GPSマルチユニットSORACOM Edition
- LTE-M Button for Enterprise
- LTE-M Button Plus
- LTE-M Button powered by AWS

いずれも、電池内蔵だったり、単四電池で動いたりしているわけですが、
いずれは電池がなくなる時がくるわけです。

LTE-M Buttonはボタンを押した段階でのみ、動作するため、頻繁に押さない限りは、そんなに電池交換する必要はないです。
LTE-M Button powered by AWSは通信成功回数等にも左右されますが、1500回ぐらい押すとなくなるようです。
LTE-M Button Plus/LTE-M Button for Enterpriseはまだそこまで押してない(汗)なので、電池切れてないですね。。。おそらく同じぐらいかと思いますが。

GPSマルチユニットSORACOM Editionについては、こちらでも書きましたが、12日ぐらいで電池が切れて、充電する必要がありました。
[GPSマルチユニットSORACOM Edition 使ってみて、だいたい1ヶ月経ちました。](https://qiita.com/keni_w/items/24784a8155b5b0b0fb09)

これも、無論、通信状態、送信内容の有無等が関係してくるので、一概にこの日数になるものではありません。悪しからず。。。

そんなある日、
GPSマルチユニットSORACOM Editionで取得した温度・湿度のデータをSlackに通知させるのをSORACOM Funk + AWS Lambdaで作っているのですが（別途SORACOM Lagoonでも可視化もしてる）、
通知こねーなーと思ったら、見事に電池切れになってました。悲しい。

これは、気づける何某かが欲しいなー、ついでもボタンのバッテリーも取れるようにしちゃえーってことで、**作りました**

**「SORACOM Device Battery Alert」**

なんか洒落た名前でも考えようかと思ったんですが、そのままです。
なんか突然名前が変わったら、変えたんだなと生暖かく見守ってください。

以下で公開しています。
[SORACOM Device Battery Alert](https://github.com/Kenichiro-Wada/soracom-device-battery-alert#soracom-device-battery-alert)

こんな感じで通知が来ます。
<img width="523" alt="通知内容" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72752/b9e4acf0-5cca-cfe5-88fa-bf1b51fada30.png">
※作って気づいたんですがw、GPSマルチユニットでも同じメッセージで、交換できないよと自分で突っ込んでしまったので、近日修正予定です。

## SORACOM Device Battery Alertについて 

READMEにも書きました(拙くてすみませんが、そちらも合わせて参照していただければと)が、
対応デバイスは、
- GPSマルチユニットSORACOM Edition
- LTE-M Button for Enterprise
- LTE-M Button Plus
- LTE-M Button powered by AWS
です。

なお、
GPSマルチユニットSORACOM Edition、LTE-M Button for Enterprise/LTE-M Button Plus、LTE-M Button powered by AWS
の括りで、チェックのON/OFFはできるようにしています。

また、実行時に、デバイスに情報を取りに行くというわけではなく、
デバイスからの受け取った最終データにあるバッテリーレベルの情報を取得して、閾値以下であった場合は、通知する仕組みになっています。

SORACOMからデータ取得する部分は
先日[SORACOM の利用料金を定期的に Slack に通知する](https://blog.soracom.jp/blog/2020/01/20/notify-slack-of-soracom-usage/)で発表されたSORACOM CLI Layerを使って、Lambda内でCLIを実行しています。
CLI実行部などは、すみません。
そのまま利用させていただいています。

なので、動作の際には、**AUTH KEY**と**AUTH SECRET KEY**が必要になりますので事前にSORACOMのユーザーコンソールで取得をお願いします。

以下からはちょっと中身の解説です。

### デバイス情報の取得方法
これは、デバイスによって異なります。

1. GPSマルチユニットSORACOM Edition
  - 設定時に、設定したSIMのTagに**name=soracom.gadgets**、**value=GPS-Multiunit**と設定される（これで紐づけている？）ので、このタグが付いているものをGPSマルチユニットSORACOM Editionとします。
  - ということで、`soracom subscribers list --tag-name soracom.gadgets --tag-value GPS-Multiunit` これでSIM情報取れます。
2. LTE-M Button for Enterprise/LTE-M Button Plus
  - 実はこれが一番悩みました。どれで取るのがいいのかなーと。結局、GPSマルチユニットと同じく、タグで取得する方法とSIMグループ(SIMグループ名)から取得する方法の2つを使えるようにしてあります。
  - SIMのタグ指定
     - `soracom subscribers list --tag-name '[tagName]' --tag-value '[tagValue]'`
  - SIMグループ名指定(2回コマンド実行)
     - `soracom groups list --tag-name name --tag-value '[tagValue]'`
     - `soracom groups list-subscribers --group-id [上記で取得したSIMグループID]`

3. LTE-M Button powered by AWS
  - これは `soracom gadgets list` で、バッテリー情報まで取れてしまうので、これ一発で終了です。

### データについて
LTE-M Button powered by AWSは `gadgets list` で取れるので割愛します。
GPSマルチユニットSORACOM EditionとLTE-M Button for Enterprise/LTE-M Button PlusはSIMごとに
 `soracom data get --imsi xxx --limit 1`
で取得しています。
レスポンスのパラメータが違うので、
レスポンスに、payloadが含まれていれば、**GPSマルチユニットSORACOM Edition** としています。
なお、Funkと違って(**本当にFunkは神！**)、base64デコードしないと、中身はわからないので、payloadをbase64デコードして、バッテリー情報(bat)を取得しています。
payloadがなければ、**LTE-M Button for Enterprise/LTE-M Button Plus**なので、batteryLevelに格納されている情報を取得しています。

### 閾値
これは、
GPSマルチユニットSORACOM Edition
と
LTE-M Button for Enterprise/LTE-M Button Plus/LTE-M Button powered by AWS
で異なっています。
それぞれLambdaの環境変数（機能増やしたら、設定項目多すぎるという罠w）でそれぞれ閾値を設定するようにしています。

GPSマルチユニットSORACOM Editionの場合、
バッテリー情報として返される値は、-1(充電中)、0〜3なので、-1以外の閾値以下にしています。
セットする値、3も可能ですが、常に通知されてしまうので、
**1**がおすすめかなと思います。

LTE-M Button for Enterprise/LTE-M Button Plus/LTE-M Button powered by AWSの場合は
0〜1の間で0.25刻みなので、指定は可能ですが。1以下の値をセットする必要があります。
こちらは**0.25**がおすすめかなと思います。
ただ、0.25でも、使い方によっては大分保つんですよね。。。

### 通知間隔
Cloudwatch Eventsのcron式での設定になります。
1時間に1回ぐらいがおすすめかと。

## 余談
- SW001とかついてますけど、マザーボードとかにあるスイッチってこんな感じの名前じゃなかったでしたっけっていうことで、切り替え系はオマージュです（わかりづらい？）。
  - 閾値とかはそのままの名前ですけど。
- SORACOM CLI Layer(CLI自体)ってバージョンアップすると、ログにアップしたよーって出るんですね。これ拾って勝手にアップデートできないものかと思ってみたり。。。
- あと、意外と処理時間かかるので、見直し予定

## 一応バージョンアップする予定
- 未実装の機能があるので、それは入れる予定。あくまで予定
- Slackに通知させてますけど、Amazon SNS使って、メール通知とかもありかなと思っているので、これを組み込もうかと。
- これAPIから呼べるようにしてもいいのかな？とか思ってたりします。
- 結構突貫工事で作ったので、イマイチなところあるので、リファクタリングする予定。

--- 

使えたら使ってみてください。
使ってみてのダメ出し、助言もお待ちしております。
凹まない程度にお願いします。