資材置場の温度を監視し換気促進


[メカトラックス](https://mechatrax.com/)三好です。
本記事では弊社のラズベリーパイ用4G（LTE）通信モジュール「[4GPi](https://mechatrax.com/products/4gpi/)」を活用するレシピとして、資材置場の温度を監視し、換気を促進するシステムをご紹介します。
このレシピではRaspberry Piに「[4GPi](https://mechatrax.com/products/4gpi/)」とオムロン社製のUSB型環境センサ「[2JCIE-BU](https://www.fa.omron.co.jp/products/family/3724/)」を接続し、定期的に温湿度を計測します。計測した温湿度は、4G（LTE）回線でSORACOM Harvest Dataに送信・記録し、資材置場が高温になった際は4GPiから直接SMSでのアラートを送信します。SMS（ショートメッセージ）を使うため、スマホだけでなくガラケー（フィーチャーフォン）でもアラートの受信が可能です。

なお、オムロン社製のUSB型環境センサ「[2JCIE-BU](https://www.fa.omron.co.jp/products/family/3724/)」は下記のような特徴があります。
> 2JCIE-BU はさまざまな環境情報のセンシングに活用できる多機能センサモジュールです。
> 温度、湿度、光、気圧、騒音、3軸加速度といった各種センサを搭載しています。
> 特徴的な機能として、高精度の振動加速に基づいて地震を判断することができます。
> また、揮発性有機化合物（VOC）センサを活用し、室内空気品質の連続モニタリングを実現しています。
> インタフェースとして USB および Bluetooth® を備えています。
> (https://github.com/omron-devhub/2jciebu-usb-raspberrypi/blob/master/README_ja.md#2jciebu-usb-raspberrypi より引用)

![mtx-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/ae2b17f2-9689-c32e-11ad-61973457ddc8.png)


# 必要なもの
- Raspberry Pi
- ラズベリーパイ用4G（LTE）通信モジュール「[4GPi](https://mechatrax.com/products/4gpi/)」
　　- [4GPi同梱品] 4Gアンテナ2本
　　- [4GPi同梱品] USB-A オス - USBmini-b オスケーブル（4GPi接続用）
　　- [4GPi同梱品] DCジャック - XHP-2コネクタ変換ハーネス(ACアダプタ接続用)
　　- [4GPi同梱品] 基板固定用六角スペーサ（M2.6）セット：4セット
- [ACアダプタ](https://store.mechatrax.com/product.php?id=12)(12V/2A以上を推奨)
- microSDカード
- 標準サイズのSIMカード(SMS送受信可能なサブスクリプションプランのSIMが必要です。今回は[plan-D(SMS あり)](https://soracom.jp/store/13380/)を使用)
- オムロン社製USB型環境センサ「[2JCIE-BU](https://www.fa.omron.co.jp/products/family/3724/)」（今回は温湿度を計測し、閾値として温度を使用します）


※SDカードへのOSイメージの書き込み、およびソフトウエアの準備の際に下記が必要です。
- PC
- micro SDカードリーダー
- [USB - シリアル変換ケーブル](https://store.mechatrax.com/product.php?id=38)
![mtx-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/3c9534b5-c123-69ab-b2fa-f33e20bff2d9.png)




# 1．事前準備
まずは、ハードウェアの組立から本機器を4G（LTE）回線に接続します。
下記リンクの手順に沿って実施してください。

https://mechatrax.com/blog/setup-4gpi/

※注意点
現時点ではオムロン社製USB型環境センサ「[2JCIE-BU](https://www.fa.omron.co.jp/products/family/3724/)」をRaspberry Piに接続しないでください。ソフトウェアの設定が終わり次第接続します。
![mtx-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/c07d60d7-d684-a048-081a-fb9bb6b7e178.png)

# 2．SORACOM Harvest Dataの設定
次に、測定した温湿度を4G回線経由でSORACOM Harvest Dataに送信する設定を実施します。

## 2.1 SORACOMユーザーコンソールにログインする。
使用するPCのブラウザで「[SORACOMユーザーコンソール](https://console.soracom.io/login?return_to=%2Fdashboard)」にアクセスし、登録したメールアドレスとパスワードを入力してログインします。

ログイン画面
![mtx-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/078c3f7c-2f35-a7df-6df7-441dd11059da.png)
ログイン後のダッシュボード
![mtx-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/b6b6b9bc-455b-36c9-1c31-f3a5844f29b0.png)


## 2.2 SIM管理画面で使用しているSIMのIMSIを確認する。
ダッシュボード左上のメニューをクリックするとメニューが表示されるので、"SORACOM AIR FOR セルラー"をクリックし、続けて"SIM管理"をクリックするとSIM管理画面が表示されます。

"SORACOM AIR FOR セルラー"をクリック
![mtx-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/b9864bfc-0046-df48-3fbd-ab686eba76e1.png)

"SIM管理"をクリック
![mtx-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/9f4f5d43-d57c-8a67-f2d5-eab34b4487a8.png)

SIM管理画面
![mtx-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/bda7aa86-46f0-8ef3-d759-bab0607ca434.png)

上記画面のIMSIを確認してメモを取ります。


## 2.3 新規グループを作成し、使用しているSIMを追加する。
ダッシュボード左上のメニューをクリックし、"SORACOM AIR FOR セルラー"内の"SIMグループ"をクリックするとSIMグループ管理画面が表示されます。
![mtx-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/5dc801e1-9bcd-e626-741e-3d8acb406233.png)


SIMグループ管理画面
![mtx-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/388f968f-540f-5f30-17d3-becc6e6479e9.png)

"＋追加"をクリックすると"グループ作成"のポップアップが出てくるのでグループ名を入力して、グループ作成をクリックします。
![mtx-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/7f8ed02c-f2a1-631d-3cc9-b04fbd39379d.png)

今回は"4GPi_IoTストア用"というグループを作成しました。
![mtx-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/66844cee-d038-707d-4553-4dc4e8547171.png)


続いてSIM管理画面に戻り、使用しているSIMの一番左のチェックボックスにチェックを入れて"操作"をクリックします。
![mtx-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/2683c236-aa78-b263-d478-48a6f2148180.png)


表示されるポップアップメニューの"所属グループの変更"をクリックします。
![mtx-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/f7f096f3-dc67-5417-a94e-9f3b12609627.png)

"SIMの所属グループ変更"というポップアップメニューが出てくるので、新しい所属グループをクリックして、先ほど作成したグループをクリックし、"グループ変更"をクリックします。
![mtx-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/f9aa7b60-419c-8e2d-0510-b90cb399ebc9.png)
↓
![mtx-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/d3528e0a-cd2a-eaa4-c6a7-64a8fee0e519.png)
↓
![mtx-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/3c00b79c-0786-532c-666a-61f6388af6dc.png)
↓
下記の通りグループが変更されました。
![mtx-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/0a25c869-6a68-1c39-d668-bd3bed1ed1e0.png)



## 2.4 設定したグループのSORACOM Harvest Data設定をONにする。
SIMグループ画面に戻り先ほど作成したグループ名をクリックします。
![mtx-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/17c0a905-4b82-b52c-2423-9f7bf38ae5c4.png)

"SORACOM Harvest Data設定"をクリックして、offになっているトグルをクリックしてonにし、保存をクリックします。
![mtx-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/ecd1d1db-8286-93e2-f07e-8ef82ba9ab3c.png)
![mtx-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/dd1c846a-7614-4390-dc1c-8505223269a4.png)
![mtx-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/8999efe4-cdff-cfbc-efa4-68ce41626b47.png)


## 2.5 SORACOM Harvest Dataページのリソースから使用しているSIMを選択する。
ダッシュボード左上のメニューをクリックし、"データ収集・蓄積・可視化"をクリックし、"SORACOM Harvest Data"をクリックするとSORACOM Harvest Data画面が表示されます。
![mtx-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/7f2e1b16-134a-e4b2-bffa-688c3323d7ab.png)
![mtx-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/ff37606b-aad2-ad4f-0a34-ae6621ec412e.png)

"リソース"をクリックし、先ほどメモしたIMSIを入力して使用するSIMを選択します。
![mtx-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/840f8290-b4cb-94a1-461e-f0836b6112dd.png)
![mtx-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/82170533-b59f-5700-6bff-6a0608535ee6.png)

使用するSIMのSORACOM Harvest Data画面が表示されました。
![mtx-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/400dc628-fddd-d680-448c-c619babb8690.png)

## 2.6 SORACOM Harvest Dataの動作確認を実施する。
1．事前準備ですでにRaspberry Piには電源が投入されていて、PCとも接続済みになっているため下記順番で動作確認を進めてください。
![mtx-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/0f2e2da1-1047-b61d-5903-ce04ce0671a2.png)
SORACOM Harvest Dataの設定がうまくできているか確認するために、Tera Termで下記コマンドをRaspberry Piに送ります。
```
curl -v -X POST http://harvest.soracom.io \
-H "content-type:application/json" \
-d '{
  "温度": 0
}'
```
成功するとTera Term上では下記画像のようにレスポンスが返ってきます。
![MTX-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/b0a1b143-b161-2339-6fa8-1197dcae273a.png)

SORACOM Harvest Data上で温度"0"が下記画像の通り確認できました。
![mtx-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/beeb9753-198e-256e-d4c3-ea801349173d.png)

※詳細は下記リンクを参考にしてください。

https://users.soracom.io/ja-jp/docs/harvest/send-data/?tab-2-1=selected


以上でSORACOM Harvest Dataの設定は完了です。

# 3．ソフトウェアの準備
次にソフトウェアの準備を行います。
引き続き、Tera TermからRaspberry Piにログインし、コマンドを実行します。



## 3.1 必要なパッケージをインストールする。
今回のレシピでは”python3-serial”と”gir1.2-modemmanager-1.0”のパッケージを使用します。
下記のコマンドを実行してインストールをしてください。
```
sudo apt install python3-serial gir1.2-modemmanager-1.0
```

## 3.2 環境センサを使用するためにudevルールを設定する。
環境センサを自動で認識させるため、/etc/udev/rules.d/のディレクトリに新しいルールを設定します。
下記のコマンドを実行して/etc/udev/rules.d/のディレクトリに、ここでは"98-2jciebu.rules"という名前の設定ファイルを作成します。/etc/udev/rules.d/のディレクトリでは昇順で設定ファイルが実行されるため、必要に応じて名前は変更してください。
```
sudo nano /etc/udev/rules.d/98-2jciebu.rules
```

nanoのエディター画面が開かれたら下記の内容を書き込んでください。

```98-2jciebu.rules
ACTION=="add", ATTRS{idVendor}=="0590", ATTRS{idProduct}=="00d4", \
   RUN+="/sbin/modprobe ftdi_sio", \
   RUN+="/bin/sh -c 'echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'", \
   SYMLINK+="2jciebu"
```
入力が完了したら、"Ctrl + xキー"を押し、`Save modified buffer？`と聞かれたら"Y"を入力し、Enterキーを押し、上書き保存します。

## 3.3 メインプログラムを作成する。
任意のディレクトリにメインプログラムを作成します。ここでは下記のコマンドを実行し、ホームディレクトリに"/soracom-iot-store_4gpi/"という名前のディレクトリを作成し、main.pyという名前のメインプログラムを作成します。ディレクトリ、メインプログラムの名前は必要に応じて変更してください。
```
sudo mkdir ~/soracom-iot-store_4gpi/
sudo nano ~/soracom-iot-store_4gpi/main.py
```
nanoのエディター画面が開かれたら下記の内容を書き込んでください。

```python:main.py
#!/usr/bin/env python3
# -*- Mode: python; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
"""
MIT License

Copyright (c) 2018 - present OMRON Corporation
Copyright (c) 2023 - MechatTracks Co., Ltd.

All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
"""

import serial
import time
import requests
import gi
gi.require_version('ModemManager', '1.0')
from gi.repository import Gio, ModemManager

TEMPERATURE_THRESHOLD = 00  # 温度の閾値を設定
PHONE_NUMBER = '08000000000'  # SMSの送信先の電話番号を設定
HARVEST_URL = "http://harvest.soracom.io"  # Harvestのアップロード先を設定

ser = serial.Serial(
    "/dev/2jciebu", 115200, serial.EIGHTBITS, serial.PARITY_NONE)
command = bytearray([0x52, 0x42, 0x05, 0x00, 0x01, 0x21, 0x50])


def s16(value):
    return -(value & 0x8000) | (value & 0x7fff)


def calc_crc(buf, length):
    crc = 0xFFFF
    for i in range(length):
        crc = crc ^ buf[i]
        for i in range(8):
            carrayFlag = crc & 1
            crc = crc >> 1
            if (carrayFlag == 1):
                crc = crc ^ 0xA001
    crcH = crc >> 8
    crcL = crc & 0x00FF
    return (bytearray([crcL, crcH]))


def get_temperature(data):
    return s16(int(hex(data[9]) + f'{data[8]:02x}', 16)) / 100


def get_relative_humidity(data):
    return int(hex(data[11]) + f'{data[10]:02x}', 16) / 100


def send_alert_sms(temperature, relative_humidity):
    message = (
        "資材置場が高温になっています！換気をしてください。\n"
        f"温度：{temperature}℃\n"
        f"湿度：{relative_humidity}%"
     )

    mngr = ModemManager.Manager.new_sync(
        Gio.bus_get_sync(Gio.BusType.SYSTEM, None),
        Gio.DBusObjectManagerClientFlags.DO_NOT_AUTO_START,
        None)
    obj = mngr.get_objects()[0]
    msg = obj.get_modem_messaging()

    prop = ModemManager.SmsProperties.new()
    prop.set_number(PHONE_NUMBER)
    prop.set_text(message)

    sms = msg.create_sync(prop)
    sms.send_sync()
    msg.delete_sync(sms.get_path())


def upload_data_to_harvest(temperature, relative_humidity):
    upload_data = {"温度": temperature, "湿度": relative_humidity}
    response = requests.post(HARVEST_URL, json=upload_data)
    response.raise_for_status()


if __name__ == '__main__':
    command = command + calc_crc(command, len(command))
    ser.write(command)
    time.sleep(0.1)
    data = ser.read(ser.inWaiting())

    temperature = get_temperature(data)
    relative_humidity = get_relative_humidity(data)

    if temperature > TEMPERATURE_THRESHOLD:
        send_alert_sms(temperature, relative_humidity)

    upload_data_to_harvest(temperature, relative_humidity)

```
プログラムを書き込んだら、変数の設定を行います。冒頭のライセンスを除いた、8,9行目の”TEMPERATURE_THRESHOLD”と”PHONE_NUMBER”をそれぞれ設定します。
”TEMPERATURE_THRESHOLD”には換気を促進するためのSMSでのアラートを送信する際の閾値を設定します。例えば、資材置き場の温度が35℃以上となった際にSMSでのアラートを送信したい場合は
```
TEMPERATURE_THRESHOLD = 35
```
とします。
次に”PHONE_NUMBER”にはSMSの送信先の電話番号を設定します。

”TEMPERATURE_THRESHOLD”と”PHONE_NUMBER”をそれぞれ設定したら、"Ctrl + xキー"を押し、`Save modified buffer？`と聞かれたら"Y"を入力し、Enterキーを押し、上書き保存します。

## 3.4 メインプログラムを定期実行させる。
cronを使用し、メインプログラムを定期実行させ、資材置き場の定期的な監視を行います。
下記のコマンドを実行し、cronの設定を行います。
```
crontab -e
```
`Select an editor.`とエディターの選択を聞かれるので、お好みのエディターを選択してください。ここでは`1. /bin/nano`を選択するため、何も入力をせずにEnterキーを押します。

![mtx-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/c14828bb-134b-cbe9-022f-577deba3ca71.png)

![mtx-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/2d0edcdc-ab3f-f2c8-b16f-13a5f832b0eb.png)

エディターが開かれたら最終行に下記を入力します。ここでは動作確認のため、1分毎にメインプログラムが実行されるようにします。
```
*/1 * * * * sudo python3 ~/soracom-iot-store_4gpi/main.py
```
入力が完了したら、"Ctrl + xキー"を押し、`Save modified buffer？`と聞かれたら"Y"を入力し、Enterキーを押し、上書き保存します。

ここまで完了したら、下記のコマンドでRaspberry Piをシャットダウンします。
```
sudo shutdown -h now
```

## 3.5 動作確認を実施する。
Raspberry PiのUSBポートに環境センサを差し込み、Raspberry Piの電源を投入します。
Raspberry Piが起動したら、SORACOM Harvest Dataの画面を確認し、データが記録されていることを確認します。

![mtx-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/ce8d6c74-5b9e-042e-8b9a-98e4ca7073ab.png)


温湿度データが記録されていることが確認できました。
また、センサを直接手で触るなどし、温度が上がるとSMSでのアラートが送られてくることも確認できます。

![mtx-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/22676067-031a-f1a3-df37-21baf2bcafa9.png)
![mtx-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/c8e3164a-b93e-1c97-19a8-0f0aa2d050f0.png)


動作が確認出来たら再度、下記のコマンドでcronを開き、任意の定期実行の間隔を再設定します。
```
crontab -e
```

下記は10分毎、1時間毎に定期実行をさせる例です。

```
*/10 * * * * sudo python3 ~/soracom-iot-store_4gpi/main.py
```
```
* */1 * * * sudo python3 ~/soracom-iot-store_4gpi/main.py
```

cronでの再設定が完了したら下記コマンドでRaspberry Piをシャットダウンします。
```
sudo shutdown -h now
```

# 4．設置・実行
Raspberry Piを資材置き場に設置し、電源を投入します。Raspberry Piが起動すると、設定した定期実行の間隔でSORACOM Harvest Dataにデータが記録され、閾値を超えるとSMSでのアラートが送られてきます。
![mtx-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104465/0c1af004-a9f7-1442-5cfd-b68b39b73c4e.png)


# 5．次のステップ
本記事では資材置場の室温監視システムを作成しました。
RaspberryPi及びラズパイ用4G通信モジュール「[4GPi](https://mechatrax.com/products/4gpi/)」は汎用性が高いため、同じハードウェア構成で下記システムを構築することも可能です。
　・オムロン社製USB型環境センサ「[2JCIE-BU](https://www.fa.omron.co.jp/products/family/3724/)」で取得可能な他の値を使ったアラートシステム
　　（温湿度、照度、気圧、騒音、CO2）

以上で解説は終わりになります。