アミュレット株式会社は2023年7月20日より、POWERSTEP fitlet2 BTOの後継機となるPOWERSTEP fitlet3 BTOをリリースしました!fitlet2より更にCPU性能がアップしています!
そこで今回もPOWERSTEP fitlet3 BTOとSORACOM Airを使って遠隔温度監視システムを構築していきたいと思います!前回はOneDriveやオンプレミスサーバを利用して実装しましたが、今回はGoogleスプレッドシートを利用してより簡単に実装していきます!
使用する機材
・POWERSTEP fitlet3 BTO

fitlet2は耐久性・耐振動性が高く、ほこりや湿気に強い小型PCです。今回はOSも前回より新しいUbuntu Desktop 22.04.2 LTSを利用します。
・ABiT USBドングル AK-020
前回に引き続きこちらのUSBドングルを使用していきます。Ubuntuのバージョンが変わったことで使うための設定も変わっています。
・SORACOM Air

前回も利用した3G回線を使ったデータ通信ができるSIMカードです。SIMカードはplan-dのもので、NTT ドコモの回線を使っています。plan-dの場合、1日あたり10円でデータ通信を行うことが可能です。
・Inkbird IBS-TH1

前回も利用したBluetooth温湿度計です。これを使えば離れた場所の温度をワイヤレスで測定することができます。本来は測定した温度をスマホアプリで取得する製品ですが、今回紹介する方法を使えばUbuntuマシンでも温度を取得することが可能です。
・TP-Link Bluetooth USBアダプタ UB400
今回はfitlet3でBluetoothを利用するためにこちらのUSBドングルを使用します。特に設定は必要無く接続するだけで使用できます。

fitlet2での実験では無線LANアンテナを使用していましたが、今回はUSBドングルでBluetoothを利用するためスッキリした見た目になりました!
環境構築

POWERSTEP fitlet3へUbuntu 22.04.02 LTSをインストール
- Ubuntu 22.04.02 LTSインストーラのダウンロード
Ubuntu公式サイトからインストーラをダウンロードします。 - インストーラをメディアへ書き込み
ダウンロードしたインストーラを書き込みソフト等でメディアへ書き込みます。この書き込み先のメディアがインストールメディアになります。今回の実験ではUSBメモリを使用しました。 - fitlet3にインストールメディアを挿入し起動
2.で作成したインストールメディアをfitlet3に挿入して起動します。 - インストール開始
インストールメディアを挿入して起動するといくつかの設定が表示されます。「最小インストール」を選択してインストールを開始します。インストールは数分程度で完了します。 - インストール完了
インストールが完了すると画面にインストールメディアを抜くよう表示されます。指示に従うと自動で再起動します。
SORACOM Airでネットワークに接続する
- Ubuntu 22.02.04 LTS ではAK-020を接続すると自動でモバイルネットワークとして認識されてしまいますが、これだと上手く動作できないため/etc/rc.localを作成してUSBシリアルとして認識されるようにします。
$ vi /etc/rc.local #!/bin/sh service NetworkManager stop sudo modprobe -r ftdi_sio sudo modprobe -r usbserial sudo modprobe usbserial vendor=0x15eb product=0x7d0e sudo modprobe ftdi_sio service NetworkManager start exit 0
- USBシリアルデバイスとして認識されるかどうか確認
AK-020を接続して再起動し、USBシリアルデバイスとして認識されているかどうか確かめます。$ ls /dev/ttyU* /dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3
- wvdialのインストール
SIMカードを使用してインターネットに接続するために必要なwvdialをインストールします。$ sudo apt install wvdial
- wvdial.confの編集
wvdialの設定ファイルを編集します。$ sudo vi /etc/wvdial.conf
[Dialer Defaults] Modem Type = Analog modem Phone = *99***1# Carrier Check = no Auto Reconnect = yes ISDN = 0 Init1 = ATZ Init2 = AT+CFUN=1 Init3 = AT+CGDCONT=1,"IP","soracom.io" Dial Command = ATD Modem = /dev/ttyUSB0 Baud = 460800 Username = sora Password = sora - ネットワークに接続
「wvdial」コマンドを実行するとネットワークへの接続が開始します。IPアドレスやDNSアドレスが割り振られれば接続完了です。$ sudo wvdial
- ネットワークの切断
ネットワーク接続中は「wvdial」コマンドが実行され続けます。切断する場合は[Ctrl] + Cでコマンドを終了させます。
Inkbird IBS-TH1で温度測定
- IBS-TH1のMACアドレス確認
MACアドレスを調べるにはスマホアプリから確認するか「hcitool」コマンドを実行して調べます。「sps」と付いているものがIBS-TH1のMACアドレスです。
$ sudo hcitool lescan
LE Scan ...
XX:XX:XX:XX:XX:XX sps - bluepyのインストール
bluepyをインストールすることで、PythonでBLE製品にアクセスできるようになります。
$ sudo install libglib2.0-dev
$ pip3 install bluepy - Pythonスクリプトの作成
IBS-TH1で測定した温度を取得するためのPythonスクリプトを作成します。「PERIPHERAL_MAC_ADDRESS1 = ‘XX:XX:XX:XX:XX:XX’」にはIBS-TH1のMACアドレスを入力します。今回は温度しか表示しませんが、湿度も取得しているのでスクリプトを書き換えれば表示させられます。
$ sudo vi inkbird_ibsth1.py from bluepy import btle import struct def get_ibsth1_data(macaddr): peripheral = btle.Peripheral(macaddr) characteristic = peripheral.readCharacteristic(0x0028) (temp, humid, unknown1, unknown2, unknown3) = struct.unpack('<hhbbb', characteristic) sensorvalue= { 'Temperature': temp / 100, 'Humidity': humid / 100, 'unknown1': unknown1, 'unknown2': unknown2, 'unknown3': unknown3, } return sensorValue PERIPHERAL_MAC_ADDRESS1 = 'XX:XX:XX:XX:XX:XX' sensorValue = get_ibsth1_data(PERIPHERAL_MAC_ADDRESS1) print('temperature', sensorValue['Temperature'], '°C')
- Pythonスクリプトの実行
作成したPythonスクリプトを実行することでIBS-TH1で測定した温度を取得することができます。
$ python3 inkbird_ibsth1.py
temperature 20.00 °C
Googleスプレッドシート作成
- スプレッドシートを新規作成する
- 1つ目のシートの名前を「log」にする
- 拡張機能のApp Scriptからスクリプトを作成する
function doPost(e) { var temp = e.parameter.temp; var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('log'); sheet.appendRow([new Date(), temp]); }
- スクリプトを保存しデプロイする。
デプロイタイプは「ウェブアプリ」、アクセスできるユーザーは「全員」にする。デプロイが完了したらウェブアプリのURLをコピーしておく。 - データ送信のテスト
データの送信にはcurlコマンドを使用する。下記のコマンドを実行しスプレッドシートが更新すればテスト成功。URLには先ほどコピーしたウェブアプリのURLを入力する。$ sudo apt install curl $ curl -X POST -d "temp=20" -o /dev/null https://script.google.com/macros/s/XXX
計測結果をスプレッドシートに送信する
- 計測結果を送信するシェルスクリプトを作成する。
$ vi post.sh #!/bin/sh result=`python3 inkbird_ibsth1.py | cut -d" " -f 2` if [ $? -gt 0 ]; then exit 1; fi curl -X POST -d "temp=${result}" -o /dev/null https://script.google.com/macros/s/XXX
- 実行権限を付与して実行する。スプレッドシートが更新されれば成功。
$ chmod 744 post.sh $ ./post.sh
- 自動で送信されるようにcronに登録する。
$ crontab -e */5 * * * * cd /path/to/script; /bin/sh post.sh
計測結果をグラフ化する
- 計測結果をフィルタリングする
「log」シートのデータをグラフ化しやすいようにフィルタリングする。「filter」という名前のシートを追加しA1に以下のように記載する。これにより直近の180個分のデータを抽出できる。=QUERY(log!A:B, "SELECT * ORDER BY A DESC LIMIT 180")
- 「graph」というシートを追加し、フィルタリングしたデータをもとにグラフを作成する
結果と考察
今回は温度センサーを社内の会議室に設置し一晩温度を測定してみました。その結果、下記のようなグラフが作成できました!

グラフを見ると早朝にかけて徐々に気温が上がっていき、朝になると一気に下がっていることがわかります。これは終業時間になりエアコンを止めたことで気温が上がり、朝誰かがエアコンを付けたことで気温が下がっていると考えられます。
ところどころ線が途切れているのはデータ取得時にBluetooth接続が不安定だった時だと考えられます。これはデータが取れなかった時は再度温度計にアクセスするようスクリプトを書き換えれば解決出来そうです。
まとめ
今回はPOWERSTEP fitlet3 BTOとSORACOM Airで遠隔温度監視システムを作ってみました。前回の記事と違いグラフ化をGoogleスプレッドシートで行っているので、URLを公開すれば手軽にデータへアクセスしたり共有することができるのも便利ですね!
センサーを使ったデータ収集というとラズパイをイメージしがちですが、ラズパイと比べてfitlet3は
- 高いCPU性能
- 頑丈な筐体
- 広温度に対応
といった大きなメリットがあります!
「データ収集をしたいけれど環境が特殊で中々見合うコンピューターが無い」といったときfitlet3がマッチするのではないでしょうか?
弊社では購入前サポートとして製品の貸し出しサービスも行っています。fitlet3を試しに使ってみたいというお客様はぜひお気軽にお問い合わせください。