0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenWrt OMRON 環境センサー 2JCIE-BU01

0
Posted at

:flag_jp: Japanese article
OpenWrt_icon.png

はじめに

OMRON 2JCIE-BU01は温度・湿度・照度・気圧・騒音・eTVOC・eCO₂ などを測定できる多機能環境センサーです。
ここでは、センサーを動作させ、Python ライブラリを使ってデータを取得し、シンプルな HTML ページでブラウザ表示するまでの一連の手順をまとめます。

OMRON 環境センサー

2JCIE-BU01

※フィルタキャップ標準装備:2JCIE-BU01-FL1

定格

項目 仕様
電源電圧 5V(USB給電)
測定機能 温度、湿度、照度、気圧、騒音、3軸加速度
通信方式 Bluetooth® low energy(Bluetooth® v5.0)USB通信(USB2.0)
通信距離 約10m
使用周囲温度 -10~60℃
使用周囲湿度 30~85%RH
外形寸法 約29.1×14.9×7.0mm
質量 約2.9g
絶対最大定格 電源電圧 -0.3~5.5V
絶対最大定格 電源電流 ~100mA
絶対最大定格 温度 -20~70℃
推奨動作範囲 電源電圧 4.75~5.25V

性能

項目 検出可能範囲 精度(特に指定がない場合はVcc=5.0V Ta=15~35℃)
温度 -10~60℃ ±2℃以内
湿度 30~85%RH ±5%RH以内
照度 10~2000lx ±100lx以内
気圧 700~1100hPa ±4hPa以内
騒音 40~94dB
3軸加速度 -1960~1960gal
eTVOC 0~29206ppb

ENV Monitor

セットアップ

パッケージ

  • インストール
command -v opkg >/dev/null && opkg update && opkg install kmod-usb-serial kmod-usb-serial-ftdi usbutils python3 python3-pip
command -v apk >/dev/null && apk update && apk add kmod-usb-serial kmod-usb-serial-ftdi usbutils python3 python3-pip

センサーの接続とドライバー認識

  • 確認
lsusb

Bus 001 Device 004: ID 0590:00d4 OMRON 2JCIE-BU01

  • ドライバーロード
modprobe ftdi_sio
echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id
  • 認識確認
dmesg | tail
ls /dev/ttyUSB*

/dev/ttyUSB0

永続化

  • rc.local
cat << 'EOF' > /etc/rc.local
#!/bin/sh -e

# OMRON 2JCIE-BU01 sensor driver
modprobe ftdi_sio
echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id

exit 0
EOF

chmod +x /etc/rc.local
  • procd initスクリプト
cat << 'EOF' > /etc/init.d/ftdi_omron_sensor
#!/bin/sh /etc/rc.common

USE_PROCD=1
START=50  # ネットワーク初期化後(早め)に実行
STOP=10

start_service() {
    procd_open_instance
    procd_set_param command /bin/sh -c "modprobe ftdi_sio && echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id"
    procd_set_param respawn  # 失敗時自動再実行(オプション)
    procd_close_instance
}

stop_service() {
    # 停止時は特に処理不要(ドライバーはアンロードせず残す)
    :
}
EOF

chmod +x /etc/init.d/ftdi_omron_sensor
/etc/init.d/ftdi_omron_sensor enable   # 起動時に自動実行を有効化
/etc/init.d/ftdi_omron_sensor start    # 即時適用(テスト用)

echo "procd initスクリプトを作成・有効化しました。再起動後に自動認識されます。"
# reboot

認識確認

dmesg | grep ttyUSB
ls /dev/ttyUSB*

Python ライブラリ

nobrin/omron-2jcie-bu01 を使用

  • インストール
pip3 install omron-2jcie-bu01
pip3 --version
pip3 list | grep omron
ls /sys/bus/usb-serial/drivers/ftdi_sio/

動作テスト

  • コンソールでデータ確認
cat << 'EOF' > /root/test_sensor.py
#!/usr/bin/python3

from omron_2jcie_bu01 import Omron2JCIE_BU01

sensor = Omron2JCIE_BU01.serial("/dev/ttyUSB0")

print("Device Info:")
print(sensor.info())

print("\nLatest Sensor Data:")
print(sensor.latest_data_long())
EOF

chmod +x /root/test_sensor.py
python3 /root/test_sensor.py

ブラウザ表示用 HTML 生成スクリプト作成

  • /www/sensor.html
cat << 'EOF' > /root/sensor_html.py
#!/usr/bin/python3
from omron_2jcie_bu01 import Omron2JCIE_BU01
from datetime import datetime

# ログファイルパス
LOG_FILE = "/var/log/sensor_data.log"

try:
    sensor = Omron2JCIE_BU01.serial("/dev/ttyUSB0")
    devinfo = sensor.info()
    data = sensor.latest_data_long()
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    # ログ出力用の文字列作成
    log_entry = (
        f"{timestamp} | "
        f"Temp:{data.temperature:.2f}°C | "
        f"Hum:{data.humidity:.2f}% | "
        f"Light:{data.light}lx | "
        f"Pressure:{data.pressure:.3f}hPa | "
        f"Noise:{data.noise:.1f}dB | "
        f"eTVOC:{data.eTVOC}ppb | "
        f"eCO2:{data.eCO2}ppm | "
        f"THI:{data.thi:.2f} | "
        f"WBGT:{data.wbgt:.1f}°C"
    )

    # ログファイルに追記
    with open(LOG_FILE, "a") as logf:
        logf.write(log_entry + "\n")

    # 既存のHTML生成処理(変更なし)
    html = """<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>2JCIE-BU01 環境センサー</title>
    <meta http-equiv="refresh" content="60">
    <style>
        body {{ font-family: Arial, sans-serif; font-size: 13px; margin: 20px; background: #f0f0f0; }}
        h1 {{ font-size: 18px; color: #333; margin-bottom: 10px; }}
        h2 {{ font-size: 16px; margin: 20px 0 10px 0; }}
        p {{ margin: 5px 0; }}
        table {{ width: 550px; max-width: 100%; border-collapse: collapse; margin: 15px 0; background: white; box-shadow: 0 0 8px rgba(0,0,0,0.1); }}
        th, td {{ padding: 8px; border: 1px solid #ccc; text-align: left; }}
        th {{ background: #4CAF50; color: white; font-size: 14px; }}
        .label {{ width: 200px; font-weight: bold; }}
        .value {{ text-align: right; font-weight: bold; }}
        small {{ font-size: 11px; color: #666; }}
    </style>
</head>
<body>
    <h1>OMRON 2JCIE-BU01 環境センサー</h1>
    <p><strong>最終更新:</strong> {timestamp}</p>
    <h2>デバイス情報</h2>
    <table>
        <tr><th class="label">項目</th><th class="value">値</th></tr>
        <tr><td>モデル</td><td class="value">{model}</td></tr>
        <tr><td>シリアル番号</td><td class="value">{serial}</td></tr>
        <tr><td>ファームウェア</td><td class="value">{fw_rev}</td></tr>
        <tr><td>ハードウェア</td><td class="value">{hw_rev}</td></tr>
    </table>
    <h2>最新センサーデータ</h2>
    <table>
        <tr><th class="label">項目</th><th class="value">値</th><th>単位</th></tr>
        <tr><td>温度</td><td class="value">{temperature:.2f}</td><td>°C</td></tr>
        <tr><td>湿度</td><td class="value">{humidity:.2f}</td><td>%</td></tr>
        <tr><td>照度</td><td class="value">{light}</td><td>lx</td></tr>
        <tr><td>気圧</td><td class="value">{pressure:.3f}</td><td>hPa</td></tr>
        <tr><td>騒音</td><td class="value">{noise:.1f}</td><td>dB</td></tr>
        <tr><td>eTVOC</td><td class="value">{etvoc}</td><td>ppb</td></tr>
        <tr><td>eCO₂</td><td class="value">{eco2}</td><td>ppm</td></tr>
        <tr><td>不快指数</td><td class="value">{thi:.2f}</td><td>-</td></tr>
        <tr><td>WBGT</td><td class="value">{wbgt:.1f}</td><td>°C</td></tr>
    </table>
    <p><small>自動更新: 60秒ごと(リロードで手動更新)</small></p>
</body>
</html>"""

    formatted_html = html.format(
        timestamp=timestamp,
        model=devinfo.model,
        serial=devinfo.serial,
        fw_rev=devinfo.fw_rev,
        hw_rev=devinfo.hw_rev,
        temperature=data.temperature,
        humidity=data.humidity,
        light=data.light,
        pressure=data.pressure,
        noise=data.noise,
        etvoc=data.eTVOC,
        eco2=data.eCO2,
        thi=data.thi,
        wbgt=data.wbgt
    )

    with open("/www/sensor.html", "w") as f:
        f.write(formatted_html)

    print(f"{timestamp}: HTML更新とログ記録完了")
except Exception as e:
    error_msg = f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} | ERROR: {str(e)}"
    with open(LOG_FILE, "a") as logf:
        logf.write(error_msg + "\n")
    print(error_msg)
EOF

chmod +x /root/sensor_html.py

# ログファイル初期化
: > /var/log/sensor_data.log
chmod 644 /var/log/sensor_data.log

echo "スクリプトを修正しました。cron実行ごとにセンサーデータが /var/log/sensor_data.log に記録されます。"

ブラウザで表示

http://192.168.1.1/sensor.html

自動更新

crontab -e

1分ごとのcron登録コマンド

crontab -l > /tmp/current_crontab 2>/dev/null || touch /tmp/current_crontab

cat << 'EOF' >> /tmp/current_crontab
# OMRON 2JCIE-BU01 sensor data update every minute
* * * * * /usr/bin/python3 /root/sensor_html.py > /dev/null 2>&1
EOF

crontab /tmp/current_crontab
rm -f /tmp/current_crontab

echo "cronジョブを登録しました。1分ごとに /www/sensor.html が自動更新されます。"

1時間ごとのcron登録コマンド

crontab -l > /tmp/current_crontab 2>/dev/null || touch /tmp/current_crontab

cat << 'EOF' >> /tmp/current_crontab
# OMRON 2JCIE-BU01 sensor data update every hour (at minute 0)
0 * * * * /usr/bin/python3 /root/sensor_html.py > /dev/null 2>&1
EOF

crontab /tmp/current_crontab
rm -f /tmp/current_crontab

echo "cronジョブを1時間ごとに変更しました。正時(例: 00分、01分など)に更新されます。"
cat << 'EOF' > /etc/init.d/ftdi_omron_sensor
#!/bin/sh /etc/rc.common

START=90
STOP=10

CRON_LINE="0 * * * * /usr/bin/python3 /root/sensor_html.py > /dev/null 2>&1"
CRON_COMMENT="# OMRON 2JCIE-BU01 sensor data update every minute (managed by ftdi_omron_sensor)"

start() {
    logger -t ftdi_omron_sensor -p user.notice "開始: センサードライバーとcronジョブを設定します"

    modprobe ftdi_sio 2>/dev/null || true
    if [ -f /sys/bus/usb-serial/drivers/ftdi_sio/new_id ]; then
        echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id 2>/dev/null
        logger -t ftdi_omron_sensor -p user.notice "ドライバー登録完了: VID:0590 PID:00d4"
    else
        logger -t ftdi_omron_sensor -p user.warn "警告: new_idファイルが存在しません(ドライバーロード失敗?)"
    fi

    (crontab -l 2>/dev/null | grep -v -F "$CRON_COMMENT"; echo "$CRON_COMMENT"; echo "$CRON_LINE") | crontab - || true
    logger -t ftdi_omron_sensor -p user.notice "cronジョブ登録完了(60分ごと更新)"
}

stop() {
    (crontab -l 2>/dev/null | grep -v -F "$CRON_COMMENT" | grep -v -F "$CRON_LINE") | crontab - || true
    logger -t ftdi_omron_sensor -p user.notice "停止: cronジョブを削除しました"
}
EOF

chmod +x /etc/init.d/ftdi_omron_sensor
/etc/init.d/ftdi_omron_sensor restart   # 即時テスト
# reboot                                  
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?