2020年12月1日にネットワークアプライアンスとして「POWERSTEP fitlet2 VPNルーター」を発売しましたが、fitlet2はパーツ構成を変えることで様々な用途に活用できるポテンシャルを秘めています。

そこで、この度弊社ではfitlet2のパーツをBTOでカスタマイズできる「POWERSTEP fitlet2 BTO」を発売することが決定しました!Wi-FiモジュールPoE対応LANポートなどのパーツをラインナップしており、用途に合わせたカスタマイズが可能です!

POWERSTEP fitlet2 BTOを利用する一つの例として、Wi-Fiモジュールを搭載したPOWERSTEP fitlet2 BTOとSORACOM Airを使用し、遠隔温度監視システムを構築してみました!かなり長めの内容となるため、3回に分けてご紹介いたします!

目次
1. 背景
2. 目標
3. 使用する機材
4. 環境構築
 4-1. POWERSTEP fitlet2へUbuntu 20.04 LTSをインストール
 4-2. SORACOM Airでネットワークに接続する
 4-3. TEMPerで温度測定
 4-4. Inkbird IBS-TH1で温度測定
 4-5. Inkbird IBS-TH1 Miniで温度測定
 4-6. OneDrive Client for Linuxの導入
 4-7. 取得した温度を記録する
5. 結果
 5-1. SORACOM Airでネットに繋がった!
 5-2. 温度データがOneDriveにアップロードされた!
6. まとめ

1. 背景

IoTのイメージ

「IoT(Intenet of Things)」という言葉は技術の進歩にしたがってずいぶん身近なものになりました。IoTでは、離れたところにあるセンサーから情報を受け取り、分かりやすいかたちに加工して、人やものに伝えます。今回の記事では、温度計から取得したデータをSORACOM Airを使ってクラウドサービスに共有し、共有した温度データをグラフ化、異常な温度を検知した場合はメールで通知するシステムを構築しました。システム構築の方法と温度測定の結果を「データの取得」「グラフ化」「メールで通知」の全3回に分けてご紹介します。

2. 目標

今回構築するシステムはこのようなイメージです。

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

①POWERSTEP fitlet2とSORACOMで測定した温度データをOneDriveへアップロードする!
②OneDriveと同期したオンプレミスサーバで温度データをグラフ化する!
③異常な温度を検知したら警告メールを送信する!

1回目の今回は①の内容についてを主に紹介していきます!

3. 使用する機材

・POWERSTEP fitlet2 BTO

POWERSTEP fitlet2 BTO
オプションのWi-Fiモジュールとアンテナを搭載している

fitlet2は耐久性・耐振動性が高く、ほこりや湿気に強い小型PCです。今回は組み込みPCとして使用するため、OSにUbuntu 20.04 LTSをインストールし、Bluetooth対応のWi-Fiモジュールを搭載しました。

・ABiT USBドングル AK-020

USBドングル AK-020

AK-020のSIMスロット

2019年に投稿した記事でも使用したUSBドングルです。カバーを外すと写真のようにSIMスロットがあります。ここにSIMカードを挿入しPCに接続することでデータ通信を行うことが可能です。Raspbianでは簡単に使えましたが、Ubuntuでは少し設定が必要になりますので後ほど紹介します。

・SORACOM Air

SORACOM Air

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

・PCsensor Gold TEMPer

TEMPer

「Linux 温度計」などで検索すると真っ先に出てくるUSB温度計です。弊社でもサーバルームの温度監視に導入したことのある製品です。

・Inkbird IBS-TH1

IBS-TH1(左)

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

・Inkbird IBS-TH1 Mini

IBS-TH1 Mini(右)

上の製品のミニ版です。この製品と上の製品ではBLT(Bluetooth Low Energy)のhandle情報が違うので注意が必要です。

・サーバマシン

POWERSTEP 1U

以前紹介した記事と同じものを使用しました。前回の実験でUbuntu 20.04 LTSとOneDrive Client for Linuxをインストールしており、そこにいくつかソフトウェアを追加することで簡単に温度データをグラフ化することができます。

4. 環境構築

4-1. POWERSTEP fitlet2へUbuntu 20.04 LTSをインストール

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

4-2. SORACOM Airでネットワークに接続する

  1. udevルール作成
    AK-020を接続したときに自動でUSBシリアルデバイスとして認識するようにudevルールを作成します。この設定は使用するUSBドングルによって異なります。
    $ sudo vi /etc/udev/rules.d/40-ak-020.rules

    ACTION=="add", ATTRS{idVendor}=="15eb", ATTRS{idProduct}=="7d0e", RUN+="/sbin/modprobe usbserial vendor=0x15eb product=0x7d0e
  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でコマンドを終了させます。

4-3. TEMPerで温度測定

  1. TEMPerのデバイスID確認
    TEMPerは何度かマイナーチェンジしているらしく、デバイスIDが違う場合は同じ設定でも上手く動作しない可能性があります。デバイスIDは「lsusb」コマンドで確認することができます。今回の実験に使ったTEMPerのデバイスIDは「413d:2107」です。
    $ lsusb

    Bus 001 Device 004: ID 413d:2107
  2. hidapiのインストール
    HID機器とやり取りするためのAPIであるhidapiをインストールします。
    $ git clone https://github.com/signal11/hidapi
    $ cd hidapi/linux
    $ make -f Makefile-manual
    $ cc -Wall -g -lrt -shared -fpic -Wl,-soname,libhidapi-hidraw.so.0 hid.o -o libhidapi-hidraw.so `pkg-config libudev --libs`
  3.  TEMPeredのインストール
    TEMPeredを使って測定した温度を取得します。TEMPeredの最新版はLinuxで動作しないため、以前のリビジョンに戻してからインストールします。また、「cmake」コマンドを使用するため予めインストールしておきます。
    $ sudo apt install cmake
    $
    git clone https://github.com/hughesr/TEMPered $ cd TEMPered $ git checkout hack-413d-2107 $ git reset --hard 75aa1e2 $ cmake . $ make
  4. TEMPerで測定した温度の取得
    「tempered」コマンドを実行するとTEMPerで測定した温度を取得することができます。仕様上エラーメッセージも一緒に出力されてしまうようです。
    $ sudo tempered
    /dev/hidraw5 0: temperature 20.00 °C
    /dev/hidraw5 1: Failed to get the temperature: Not enough data was read from the sensor. /dev/hidraw5 1: no sensor data available
  5. シェルスクリプトの作成
    温度だけを表示させるためのシェルスクリプトを組みます。
    $ sudo vi /usr/local/bin/gettemp
    
    #!/bin/bash
    /usr/local/bin/tempered 2> /dev/null | gawk 'NR==1' | cut -b 17-
  6. 権限の変更
    権限不足にならないよう変更する。
    $ sudo chmod 777 /usr/local/bin/tempered
    $ sudo chmod 777 /usr/local/bin/gettemp
  7. シェルスクリプトの実行
    作成したスクリプトを実行することで無駄な表示を省いて温度を取得することができます。
    $ sudo gettemp
    temperature 20.00 °C

4-4. 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

4-5. Inkbird IBS-TH1 Miniで温度測定

  1. IBS-TH1 MiniのMACアドレス確認
    IBS-TH1と同様にMACアドレスを確認します。Inkbirdの温度計を2個同時に使用すると、2個目のデバイス名はTSTになるようです。同時に使用しなければIBS-TH1もMiniもspsになります。
    $ sudo hcitool lescan
    LE Scan ...

    XX:XX:XX:XX:XX:XX TST
  2. Pythonスクリプトの作成
    IBS-TH1 Mini用のPythonスクリプトを作成します。IBS-TH1とMiniではhandle情報が違うため注意が必要です。
    $ sudo vi inkbird_ibsth1_mini.py
    
    from bluepy import btle
    import struct
    
    def get_ibsth1_mini_data(macaddr):
        peripheral = btle.Peripheral(macaddr)
        characteristic = peripheral.readCharacteristic(0x002d)
        (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_mini_data(PERIPHERAL_MAC_ADDRESS1)
    
    print('temperature', sensorValue['Temperature'], '°C')
  3. Pythonスクリプトの実行
    作成したPythonスクリプトを実行することでIBS-TH1 Miniで測定した温度を取得することができます。
    $ python3 inkbird_ibsth1_mini.py
    temperature 20.00 °C

4-6. OneDrive Client for Linuxの導入

方法は以前紹介したものとほぼ同じですが、改めて紹介します。前回と違い、このマシンではアップロードしか行わないため同期開始のコマンドにオプションを付けます。また、タイムアウトを防ぐためにいくつか設定を追加します。

  1. OneDrive Client for Linuxに必要なソフトのインストール
    Ubuntuマシンで端末を開き以下のコマンドを実行します。
    $ sudo apt install build-essential
    $ sudo apt install libcurl4-openssl-dev
    $ sudo apt install libsqlite3-dev
    $ sudo apt install pkg-config
    $ sudo apt install curl
    $ sudo apt install libnotify-dev
    $ curl -fsS https://dlang.org/install.sh | bash -s dmd

    curlコマンドを実行した後、以下のような表示が出るため、「Run」のあとに書かれたコマンドをコピーします。このコマンドはDコンパイラのバージョンによって異なります。

    Run `source ~/dlang/dmd-2.094.2/activate` in your shell to use dmd-2.094.2.
    This will setup PATH, LIBRARY_PATH, LD_LIBRARY_PATH, DMD, DC, and PS1.
    Run `deactivate` later on to restore your environment.
  2. OneDrive Client for Linuxのインストール
    上でコピーしたコマンドを実行し、OneDriveをインストールしていきます。

    source ~/dlang/dmd-2.094.2/activate
    git clone https://github.com/abraunegg/onedrive.git
    cd onedrive
    ./configure
    make clean; make;
    sudo make install
    deactivate
  3. 設定ファイルのコピー
    設定ファイルを、設定ファイル用のディレクトリにコピーします。このconfigファイルから同期先のディレクトリを変更できます。デフォルトではホームディレクトリに「OneDrive」というディレクトリが作成され、そこが同期先ディレクトリとなります。

    $ mkdir -p ~/.config/onedrive
    $ cp ./config ~/.config/onedrive/config
  4. サービスの起動
    OneDriveのサービスを起動します。

    $ systemctl --user enable onedrive
    $ systemctl --user start onedrive
  5. アプリケーションの承認
    初めてonedriveコマンドを実行すると、Microsoftアカウントでアプリケーションを承認するように要求されます。アカウントは予め作っておきます。

    $ onedrive 
    
    Authorize this app visiting:
    
    https://.....
    
    Enter the response uri: 

    表示されたURLにアクセスし、ログインすると白紙のページにリダイレクトされます。この白紙ページのURLをコピーし、上記の「Enter the response uri: 」にペーストし、以下のように表示されれば完了です。

    Application has been successfully authorised, however no additional command switches were provided.
    
    Please use --help for further assistance in regards to running this application.
  6. OneDriveへのアップロードのみ行う
    このマシンではOneDriveへのアップロードのみを行うためオプションで指定します。ついでにOneDrive上のファイルを削除しないようにしておきます。

    $ onedrive --synchronize --upload-only --no-remote-delete
  7. systemdのタイムアウトまでの値を変更
    3G回線でアップロードを行うとタイムアウトしてしまう場合があるため、[Service]に以下の記述を追加します。
    $ systemctl --user edit --full onedrive.service

    [Service]
    TimeoutSec=900
  8. サービスの再起動
    オプションを指定してサービスを再起動する。
    $ systemctl --user stop onedrive.service
    $ systemctl --user --no-block start onedrive.service

4-7. 取得した温度を記録する

  1. Cronの作成
    定期的に温度を取得してファイルに残すCronを作成します。
    まずはcron.dにファイルを作成します。
    $ cp /etc/crontab /etc/cron.d/temperature_cron
  2. Cronの設定
    余分な行を削除し設定を書き込みます。今回は5分ごとに温度を取得し、日付と時間を付与して書き込んだファイルをOneDriveディレクトリに作成するように設定します。また、回線が遅いからかときどきOneDrive Client for Linuxの調子が悪くなるので30分ごとに再同期をかけます。
    $ sudo vi /etc/cron.d/temperature_cron

    SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    */5 * * * * root gettemp | tr 'n/' ' ' >> /home/<username>/OneDrive/TEMPer.txt ; echo `date "+\%Y\%m\%d\%H\%M\%S"` >> /home/<username>/OneDrive/TEMPer.txt
    */5 * * * * root python3 /home/<username>/inkbird_ibsth1.py | tr 'n/' ' ' >> /home/<username>/OneDrive/IBS-TH1.txt ; echo `date "+\%Y\%m\%d\%H\%M\%S"` >> /home/<username>/OneDrive/IBS-TH1.txt
    */5 * * * * root python3 /home/<username>/inkbird_ibsth1_mini.py | tr 'n/' ' ' >> /home/<username>/OneDrive/IBS-TH1-Mini.txt ; echo `date "+\%Y\%m\%d\%H\%M\%S"` >> /home/<username>/OneDrive/IBS-TH1-Mini.txt
    */30 * * * * <username> service --user stop onedrive.service ; onedrive --synchronize --resync --upload-only --no-remote-delete ; service --user start onedrive.service
  3. Cronのリスタート
    Cronをリスタートして設定を反映させます。しばらくしてOneDriveディレクトリに温度データのファイルが作成されていればOKです。
    $ sudo service cron restart

5. 結果

5-1. SORACOM Airでネットに繋がった!

fitlet2でwvdialを実行した結果

上記環境を構築しUSBドングルを接続して「wvdial」コマンドを実行した結果、このようにIPアドレスとDNSアドレスが割り振られました!

インターネットに接続されているかどうかは「ping」コマンドなどで確認できます。

$ ping google.com
PING google.com (172.217.24.142) 56(84) バイトのデータ
64 バイト応答 送信元 nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=1 ttl=117 時間=407 ミリ秒
64 バイト応答 送信元 nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=2 ttl=117 時間=327 ミリ秒
64 バイト応答 送信元 nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=3 ttl=117 時間=336 ミリ秒
64 バイト応答 送信元 nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=4 ttl=117 時間=335 ミリ秒
64 バイト応答 送信元 nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=5 ttl=117 時間=344 ミリ秒
64 バイト応答 送信元 nrt20s01-in-f14.1e100.net (172.217.24.142): icmp_seq=6 ttl=117 時間=533 ミリ秒
^C
--- google.com ping 統計 ---
送信パケット数 7, 受信パケット数 6, パケット損失 14.2857%, 時間 6005ミリ秒
rtt 最小/平均/最大/mdev = 327.235/380.355/532.981/73.220ミリ

このように応答が帰ってくればインターネットに接続できています!

5-2. 温度データがOneDriveにアップロードされた!

OneDrive
温度データがアップロードされている

OneDriveを確認すると、温度データがfitlet2から5分毎にアップロードされていました!これで離れた場所にいてもPCやスマホがあれば温度を確認することができます!

TEMPer.txt
温度と日時が記録されている

温度データを開くと、このように取得した温度と日時が記録されています。Cronを書き換えれば日時の表記を変えたり他の情報を付加したりすることも可能です。

TEMPer.txtのバージョン履歴

OneDriveにはバージョン履歴から復元する機能があるため、万が一上書きしてしまっても安心です。誤ってファイルを消した場合でもごみ箱に残っていれば復元できるなど、OneDriveをLinuxマシンで使えるとかなり便利です。

6. まとめ

今回は「POWERSTEP fitlet2 BTOとSORACOM Airで遠隔温度監視システムを作ってみた!その1」として、SORACOM AirでUbuntuマシンをインターネットに繋ぐ方法と温度計から取得した温度データをOneDriveへアップロードする方法をご紹介しました!Wi-Fiの飛んでいない場所でもSORACOM Airを使って通信ができるというのは便利ですね!今回は温度計を使用しましたが、他のセンサーや防犯カメラ、監視カメラといった機器にも応用できるのではないでしょうか?

次回は「POWERSTEP fitlet2 BTOとSORACOM Airで遠隔温度監視システムを作ってみた!その2」として目標②の「OneDriveと同期したオンプレミスサーバで温度データをグラフ化する!」についてご紹介していきます!

2.5インチストレージマウンタを装着したfitlet2

POWERSTEP fitlet2 BTOは、コンピューターに必要な部品を一つのモジュールにまとめ、必要に応じて組み込める(Computer-on-Module, CoM)仕様のため、構成部品を変更することで広温度対応の理想的なIoT機器として活用することができます。この実験では使用しませんでしたが、写真のように2.5インチストレージマウンタを装着すれば、fitlet2のストレージに直接ログを収集することも可能になります。
ご興味がありましたら、お気軽にお問い合わせください。

POWERSTEP fitlet2 BTO / 見積依頼ページ