アミュレット株式会社は2023年7月20日より、POWERSTEP fitlet2 BTOの後継機となるPOWERSTEP fitlet3 BTOをリリースしました!fitlet2より更にCPU性能がアップしています!

そこで今回もPOWERSTEP fitlet3 BTOSORACOM Airを使って遠隔温度監視システムを構築していきたいと思います!前回はOneDriveやオンプレミスサーバを利用して実装しましたが、今回はGoogleスプレッドシートを利用してより簡単に実装していきます!

使用する機材

・POWERSTEP fitlet3 BTO

fitlet3

fitlet2は耐久性・耐振動性が高く、ほこりや湿気に強い小型PCです。今回はOSも前回より新しいUbuntu Desktop 22.04.2 LTSを利用します。

・ABiT USBドングル AK-020

前回に引き続きこちらのUSBドングルを使用していきます。Ubuntuのバージョンが変わったことで使うための設定も変わっています。

・SORACOM Air

SORACOM Air

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

・Inkbird IBS-TH1

Inkbird IBS-TH1

前回も利用したBluetooth温湿度計です。これを使えば離れた場所の温度をワイヤレスで測定することができます。本来は測定した温度をスマホアプリで取得する製品ですが、今回紹介する方法を使えばUbuntuマシンでも温度を取得することが可能です。

・TP-Link Bluetooth USBアダプタ UB400

今回はfitlet3でBluetoothを利用するためにこちらのUSBドングルを使用します。特に設定は必要無く接続するだけで使用できます。

実験に使用した機材

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

環境構築

遠隔温度監視システムの動作イメージ

POWERSTEP fitlet3へUbuntu 22.04.02 LTSをインストール

  1. Ubuntu 22.04.02 LTSインストーラのダウンロード
    Ubuntu公式サイトからインストーラをダウンロードします。
  2. インストーラをメディアへ書き込み
    ダウンロードしたインストーラを書き込みソフト等でメディアへ書き込みます。この書き込み先のメディアがインストールメディアになります。今回の実験ではUSBメモリを使用しました。
  3. fitlet3にインストールメディアを挿入し起動
    2.で作成したインストールメディアをfitlet3に挿入して起動します。
  4. インストール開始
    インストールメディアを挿入して起動するといくつかの設定が表示されます。「最小インストール」を選択してインストールを開始します。インストールは数分程度で完了します。
  5. インストール完了
    インストールが完了すると画面にインストールメディアを抜くよう表示されます。指示に従うと自動で再起動します。

SORACOM Airでネットワークに接続する

  1. 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
  2. USBシリアルデバイスとして認識されるかどうか確認
    AK-020を接続して再起動し、USBシリアルデバイスとして認識されているかどうか確かめます。
    $ ls /dev/ttyU*
    /dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3
  3. wvdialのインストール
    SIMカードを使用してインターネットに接続するために必要なwvdialをインストールします。
    $ sudo apt install wvdial
  4. 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
  5. ネットワークに接続
    「wvdial」コマンドを実行するとネットワークへの接続が開始します。IPアドレスやDNSアドレスが割り振られれば接続完了です。
    $ sudo wvdial
  6. ネットワークの切断
    ネットワーク接続中は「wvdial」コマンドが実行され続けます。切断する場合は[Ctrl] + Cでコマンドを終了させます。

Inkbird IBS-TH1で温度測定

  1. IBS-TH1のMACアドレス確認
    MACアドレスを調べるにはスマホアプリから確認するか「hcitool」コマンドを実行して調べます。「sps」と付いているものがIBS-TH1のMACアドレスです。
    $ sudo hcitool lescan
    LE Scan ...

    XX:XX:XX:XX:XX:XX sps
  2. bluepyのインストール
    bluepyをインストールすることで、PythonでBLE製品にアクセスできるようになります。
    $ sudo install libglib2.0-dev
    $ pip3 install bluepy
  3. 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')
  4. Pythonスクリプトの実行
    作成したPythonスクリプトを実行することでIBS-TH1で測定した温度を取得することができます。
    $ python3 inkbird_ibsth1.py
    temperature 20.00 °C

Googleスプレッドシート作成

  1. スプレッドシートを新規作成する
  2. 1つ目のシートの名前を「log」にする
  3. 拡張機能のApp Scriptからスクリプトを作成する
    function doPost(e) {
      var temp = e.parameter.temp;
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('log');
      sheet.appendRow([new Date(), temp]);
    }
    
  4. スクリプトを保存しデプロイする。
    デプロイタイプは「ウェブアプリ」、アクセスできるユーザーは「全員」にする。デプロイが完了したらウェブアプリのURLをコピーしておく。
  5. データ送信のテスト
    データの送信にはcurlコマンドを使用する。下記のコマンドを実行しスプレッドシートが更新すればテスト成功。URLには先ほどコピーしたウェブアプリのURLを入力する。
    $ sudo apt install curl
    $ curl -X POST -d "temp=20" -o /dev/null https://script.google.com/macros/s/XXX
    

計測結果をスプレッドシートに送信する

  1. 計測結果を送信するシェルスクリプトを作成する。
    $ 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
    
  2. 実行権限を付与して実行する。スプレッドシートが更新されれば成功。
    $ chmod 744 post.sh
    $ ./post.sh
    
  3. 自動で送信されるようにcronに登録する。
    $ crontab -e
    */5 * * * * cd /path/to/script; /bin/sh post.sh
    

計測結果をグラフ化する

  1. 計測結果をフィルタリングする
    「log」シートのデータをグラフ化しやすいようにフィルタリングする。「filter」という名前のシートを追加しA1に以下のように記載する。これにより直近の180個分のデータを抽出できる。
    =QUERY(log!A:B, "SELECT * ORDER BY A DESC LIMIT 180")
    
  2. 「graph」というシートを追加し、フィルタリングしたデータをもとにグラフを作成する

結果と考察

今回は温度センサーを社内の会議室に設置し一晩温度を測定してみました。その結果、下記のようなグラフが作成できました!

会議室の気温

グラフを見ると早朝にかけて徐々に気温が上がっていき、朝になると一気に下がっていることがわかります。これは終業時間になりエアコンを止めたことで気温が上がり、朝誰かがエアコンを付けたことで気温が下がっていると考えられます。
ところどころ線が途切れているのはデータ取得時にBluetooth接続が不安定だった時だと考えられます。これはデータが取れなかった時は再度温度計にアクセスするようスクリプトを書き換えれば解決出来そうです。

まとめ

今回はPOWERSTEP fitlet3 BTOとSORACOM Airで遠隔温度監視システムを作ってみました。前回の記事と違いグラフ化をGoogleスプレッドシートで行っているので、URLを公開すれば手軽にデータへアクセスしたり共有することができるのも便利ですね!

センサーを使ったデータ収集というとラズパイをイメージしがちですが、ラズパイと比べてfitlet3は

  • 高いCPU性能
  • 頑丈な筐体
  • 広温度に対応

といった大きなメリットがあります!
「データ収集をしたいけれど環境が特殊で中々見合うコンピューターが無い」といったときfitlet3がマッチするのではないでしょうか?

弊社では購入前サポートとして製品の貸し出しサービスも行っています。fitlet3を試しに使ってみたいというお客様はぜひお気軽にお問い合わせください。

POWERSTEP fitlet3 BTO / 見積依頼ページ