GPSマルチユニットSORACOM Editionでペットのお世話

前回の記事の通り、GPSマルチユニット SORACOM Editionを入手したので活用していきます。

ハムスターがやってきた

さて、これを何に使おうかと思っていた矢先、我が家にハムスターがやってきました。

引き渡しの際、ペットショップの店員さんから丁寧に説明して頂きまして

  • 20~25℃の室温で飼育すること。
    特に20℃以下になると下痢をするので注意。
  • エアコン使用を推奨。
    床暖房は必要以上に熱くなり火傷の事例があるので注意。

えー結構面倒だなぁ…といった感想。
床にケージを直置きするので、特にケージ周りの温度が気になります。
ということで温度のリアルタイム監視、及び異常通知をやってみることにしました。

アーキテクチャ

GPSユニットから送信した温度の閾値監視、通知はSORACOM Lagoonを用いれば可能なのですが、元々我が家のネットワークにはZabbixを用いた監視環境があるので、監視環境を統合したいと思います。

GPSマルチユニットからは定期的(5分ごと)に温度・湿度の情報を送信。
まずはSORACOM Harvestに蓄積しますが、あくまで一時的な置き場所として利用します。

SORACOM Harvestに蓄積したデータをZabbixにてポーリングし長期蓄積、グラフ化します。閾値(20℃以下、25℃以上)になった際にはアラートが発生し、backlogに課題(チケット)を自動起票、課題作成がメールで通知されるという大げさな仕様です(笑

GPSマルチユニットのセットアップ

まず、GPSマルチユニットのセットアップを行います。
公式マニュアルや他の方の記事に既に掲載がありますし、非常に簡単ですが一応記載します。

GPSマルチユニットの設定は、SORACOMコンソールの「ガジェット管理」の中から行います。

「新規デバイス設定」をクリックします。

するとSIMの選択画面になりますので、GPSマルチユニットに挿入したSIMを選択します。

続いてSIMグループを作成します。
GPSマルチユニット専用のSIMグループを作成することが推奨されています。

「次へ:設定を編集」をクリックすると、デバイスの設定画面が開きますので順次設定を行います。
まず送信内容の選択です。今回は温度・湿度を選択します。

続いて送信先ですが今回はSORACOM Harvestを選択します。

送信モードは「定期送信:手動モード」で良いです。

送信間隔を指定します。今回は5分ごととしました。

加速度割り込みは利用しません。そのまま「保存」をクリックします。

以上で設定は完了です。
デバイスの電源を入れ、本体のボタンをクリックすると設定が反映されセンサーデータの送信が開始されます。

SORACOMコンソールのSIM管理画面にて対象のSIMを選択し、「操作」⇒「データを確認」にてSORACOM Harvestにデータが来ていることを確認します。

Zabbixへのデータ取り込み

SORACOM Harvestへのアップロードが完了しましたので、いよいよZabbixへのデータ取り込みを行います。

SAMユーザの作成

スクリプトに組み込む認証情報は権限を絞った方がセキュリティ上望ましいため、SAMユーザを作成しHarvestへのRead Only権限を付与します。

公式マニュアルに従いSAMユーザの作成を行います。
コンソールへのログインは行いませんので、パスワードの設定は不要です。
また、権限設定はテンプレートから「Harvestのデータの参照のみ許可」を選択しました。

スクリプトの設置

Zabbix監視対象のサーバ(今回はZabbixサーバ自身)に以下のようなスクリプトを設置します。

import sys
import requests
import json
import base64

soracom_authKeyId = 'keyId-xxxxxxxxxxx' (※SAMユーザの認証キーID)
soracom_authKey   = 'secret-xxxxxxxxxxxxxxxxxxx'  (※SAMユーザの認証キーシークレット)
imsi = 'xxxxxxxxxxxx' (※対象SIMのIMSI番号)

args = sys.argv

headers = {'Content-Type': 'application/json'}
payload = {'authKeyId': soracom_authKeyId, 'authKey': soracom_authKey}
responce = requests.post("https://api.soracom.io/v1/auth", headers=headers,data=json.dumps(payload)).text
data = json.loads(responce)

try:
  apikey = data['apiKey']
  token = data['token']
except:
  print('Invalid Username/Password')

headers = {
  'Accept': 'application/json',
  'X-Soracom-Api-Key': apikey,
  'X-Soracom-Token': token
}

url="https://api.soracom.io/v1/subscribers/" + imsi + "/data?sort=desc&limit=1"

responce = requests.get(url,headers=headers).text
data    = json.loads(responce)[0]['content']
b64data = json.loads(data)['payload']
payload = json.loads(base64.b64decode(b64data))

if len(args) > 1:
  if args[1]=='temp':
    print(payload['temp'])
  elif args[1] == 'humi':
    print(payload['humi'])
  elif args[1] == 'bat':
    print(payload['bat'])

本スクリプトはSORACOM Harvestに保存されている最新のデータのみを取得し、引数にtemp,humi,batを指定すると温度・湿度・バッテリー残量を取得できるようにしています。

$ python getharvestdata.py temp
22.6
$ python getharvestdata.py humi
55.1
$ python getharvestdata.py bat
3

アイテムの作成

Zabbixエージェントの設定ファイル(/etc/zabbix/zabbix_agentd.conf)に以下のような行を追記し、設置したスクリプトを実行し値を読み込むようにします。
設定が終わったらzabbix-agentデーモンを再起動し反映します。

UserParameter=SORACOM_MultiUnit.temp[*],python /usr/local/bin/getharvestdata.py temp
UserParameter=SORACOM_MultiUnit.humi[*],python /usr/local/bin/getharvestdata.py humi

次にZabbixコンソールにログインし、アイテムを作成します。
キー名としてUserParameterで指定したもの(SORACOM_MultiUnit.temp,SORACOM_MultiUnit.humi)を指定し設定するとzabbixにアイテムとして登録されます。

するとZabbixのアイテムの値として自動的に収集・蓄積されるようになります。

トリガーの作成

温度が25℃を超過する、および20℃を下回る場合に通知がされるよう、トリガーの作成を行います。
測定温度のばらつきに対応するため、過去30分間の平均値により判定するようにしました。

グラフの確認

以上の設定で温度がグラフに表示されるようになります。
閾値と比較し現状がどうなのか、解りやすく仕上がりました。

Backlogへの課題自動生成・メール通知

Zabbixでアラートが発生した際、Backlogに自動的に課題を生成するようにします。
また、私にメールが通知されるようになりました。
設定方法は以前Qiitaに記事を投稿済ですので、こちらをご覧下さい。

zabbixアラート発生時にBacklog課題を自動起票する - Qiita
##はじめに Backlogは利用していますか? 見やすくてチームでの課題管理/チケット管理に便利ですよね。 無料枠でも1プロジェクト,100MB,10名まで利用できるので、ある程度使えます。 かたやzabbixのみではアラートにコ...

課題の確認

実際に25℃を超過した場合、20℃を下回った場合は課題が生成されます。
これにより事象の見落としを防ぐことができます。

気になったこと

この仕組みを稼働させ10日間ほど経過しましたが、いくつか気になる事象が発生しましたので記載しておきます。

測定値にばらつきが大きい?

以下に拡大したグラフを掲載します。
測定値にばらつきがあり、1~2℃の上下動が確認できます。
(ちなみにこの日、部屋は無人でした)

以下のように、ちょうど閾値に掛かるようなケースではアラートが頻発することがあります。

上記にも記載しましたが、実運用にのせる場合は ある程度長めの期間の平均値をベースに閾値判定を行った方が良いかと思います。

充電中は温度が上昇する

充電中は筐体の温度が上昇するようで、温度センサーの測定値に影響してしまいます。

こればかりは対処のしようが無いかなぁと言った感じです。
私の利用しているモバイルバッテリーと接続した場合では、充電完了時点で給電がストップしました。
ストップせず、充電完了後は給電側から駆動するようになると改善できるかもしれません。

記事初出の際、電池が切れた際に設定がクリアされるとのコメントを掲載しましたが、再検証の結果、起動時に反映されることを確認しましたので本件は削除しました。失礼しました。

まとめ

GPS マルチユニット SORACOM Editionの使用レポートをお送りしました。
改善の余地はありますが、SIMを挿せばすぐに使えるセンサーユニットとして、手頃でいいですね。

なお今回は(WiFiが届く)室内で利用したので、SORACOM回線を使う意味はあまり無いですがw
筐体に入っているデバイスということで床に雑に置いても利用できるメリットはあるので。。。

今後は屋外でも利用してみたいと思います。

コメント