はじめに
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 ライブラリ
- インストール
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
