# オムロン環境センサ 2JCIE-BU01 — Windows 版引き継ぎ資料（USB シリアル＋ロガー）

これは、**Windows PC に USB 接続した 2JCIE-BU01 を読み続け、同一ネットワークへ
HTTP/JSON で公開するロガー**の実装仕様です。姉妹編の
`OMRON_SENSOR_HANDOVER.md`（BLE／Android 版）がセンサー側プロトコルの
一次資料で、本書は **Windows＋USB シリアル側の差分と実運用の教訓**だけを
書いています。作り直す人の Muse の初期解析の足がかりとしてどうぞ。

- Windows は家ごとに環境差が大きい（Python の有無など）ため、完成品の配布では
  なく「仕様を渡して各環境で作る」前提の資料です。
- 個人を特定する情報（端末名、IP アドレス、センサーの MAC アドレスなど）は
  意図的に除いてあります。
- フレーム仕様や内蔵メモリの話は BLE 版資料 §3 を参照。本書と重なる部分は
  結論だけ再掲します。

---

## 1. 全体像

```
[2JCIE-BU01] --USB シリアル--> [Windows PC 上のロガー] --HTTP :8765 (LAN / Tailscale)--> [Muse のコンピュータ]
```

- ロガーはセンサーを一定間隔（既定 60 秒）で読み、履歴 CSV と最新値 JSON を
  自分のフォルダに書き続ける。
- Muse は `GET /latest.json`（最新値）、`GET /summary.json`（傾向まとめ）を叩く。
- USB シリアルと BLE は同時使用できる。PC ロガーとスマホ Bridge（BLE 版資料）が
  同じセンサーを並行して読む構成も可能（実運用で確認済み）。

## 2. 前提（Windows 側の環境）

- **Python 3 が必要で、Windows には標準搭載されていない**。python.org の
  インストーラか Microsoft Store から入れる。`py` ランチャーが使える状態が前提。
- **オムロンの純正 USB ドライバが必要**。公式配布（2jcie-bu01_usbdriver.zip、
  omronfs.omron.com で配布）が入ると、デバイスマネージャーに
  「2JCIE-BU01 Serial Port」として COM ポートが現れる。USB の ID は
  VID 0x0590 / PID 0x00D4。
  - 代替策（掲示板の実測報告）: FTDI の CDM ドライバを「ディスク使用」で
    手動適用しても動く。表示名が FTDI のものになる代償あり。
- ライブラリは PyPI の **`omron-2jcie-bu01`**（と `pyserial`）を使うのが
  実証済みの近道。初回は pip で取得するためネット接続が要る。

## 3. 読み取り（USB シリアル）

```python
from omron_2jcie_bu01 import Omron2JCIE_BU01
sensor = Omron2JCIE_BU01.serial("COM9")   # ポート名は §4 の方法で決める
data = sensor.latest_data_long()          # 最新のセンシング＋計算を一括取得
```

- 返り値は namedtuple／dict 相当。**キー名の綴りはライブラリの版で揺れる**ので、
  実装側は別名テーブルで吸収すること（実運用で使った対応）:

| 正規化キー | 候補となる生キー |
|---|---|
| temperature | temperature, temp |
| humidity | relative_humidity, humidity |
| light | ambient_light, light, illuminance |
| pressure | barometric_pressure, pressure, air_pressure |
| noise | sound_noise, noise |
| etvoc | etvoc, eTVOC, etvoc_ppb |
| eco2 | eco2, eCO2, eco2_ppm |
| thi（不快指数） | discomfort_index, thi |
| wbgt（熱中症警戒度） | heat_stroke, wbgt |
| vibration | vibration_information, vibration |
| pga | pga |
| seismic（震度相当） | seismic_intensity, si_value |

- **値が文字列で返ることがある**。数値は必ず float 変換を試み、失敗したら
  「欠測（None）」として扱う防御にすること。
- ⚠️ **eCO2 は VOC からの換算推定値で、本物の CO2 ではない**（BLE 版資料と同じ）。
- 気圧は現地気圧（絶対値）。海面気圧との差は標高依存で、標高約 26 m の実測では
  理論値 +3.2 hPa に対し実測は約 +4.4 hPa のずれ。絶対値より**変化（傾向）**で
  使うのが向いている。

## 4. COM ポートの扱い（この資料で一番大事な教訓）

- **自動検出**: `serial.tools.list_ports.comports()` を走査し、description /
  manufacturer / product に **"2JCIE" または "OMRON"** を含むポートを選ぶ。
  VID/PID（0x0590 / 0x00D4）も照合キーになる。
- **Windows は COM 番号を付け替える**。挿す USB ポートやハブを変えた、
  ドライバを入れ直した等で COM8 → COM9 のように変わる。
  - ❌ 悪い設計: 起動時に一度だけポートを解決し、固定で使い続ける。
    番号が変わると読み取りが**恒常的に失敗し続ける**（実運用で実際に踏んだ）。
  - ✅ 正しい設計: 読み取り失敗が続いたら（目安 3 回）**自動検出をやり直し**、
    新しい番号に追随する。手動でポートを選ばせた場合はそちらを尊重する。
- シリアルポートは**1 プロセスが占有**する。ファームウェア更新ツール（DFU）や
  他のリーダーを動かす前に、ロガーを終了すること。
- PC 本体や発熱するハブに直挿しすると本体熱で**温度が高めに出る**。
  短い USB 延長ケーブルで PC から離すのが定番の対処。

## 5. HTTP 窓口（ポート 8765、読み取り専用）

| 窓口 | 内容 |
|---|---|
| `GET /latest.json` | 最新の読み取り（生キーそのままの JSON）。失敗時は `{"measured_at": ..., "error": "..."}` |
| `GET /env_log.csv` | 履歴 CSV（列は生キー＋先頭に `measured_at`、ISO 形式のローカル時刻） |
| `GET /summary.json` | 現在値と傾向のまとめ（下記） |
| `GET /` | ブラウザ用の簡易ステータスページ（任意） |

`/summary.json` の形:

```json
{
  "ok": true,
  "measured_at": "2026-01-01T12:00:00",
  "readings": 123,
  "current": {"temperature": 21.8, "humidity": 57.9, "light": 70,
              "pressure": 986.5, "noise": 65.9, "etvoc": 10, "eco2": 472,
              "thi": 68.2, "wbgt": 19.6},
  "delta": {"pressure_1h": 0.4, "pressure_3h": -1.2,
            "humidity_1h": 2.0, "temperature_1h": -0.3},
  "pressure_tendency": "やや下降しています",
  "pga_max_10min": 0.0,
  "comment": "気圧は3時間で1.2hPa下がっていて、やや下降しています。",
  "last_error": null
}
```

- データが無い間は `{"ok": false, "error": ...}`。
- 変化量は「現在時刻から 1 時間前／3 時間前に最も近い記録」との差
  （許容誤差 30 分／90 分）。履歴が浅い間は null でよい。
- サーバは `0.0.0.0` で待ち受ける前提（Muse が別マシンから読むため）。
  **LAN 内からは誰でも読める**ことは、利用者に一言断っておくこと。

## 6. ロガー設計の要点（参考実装の構成）

実運用中の参考実装（Sensor App for Windows v2）はこの構成:

- **単一プロセス**：読み取りスレッド＋HTTP スレッド。GUI は tkinter
  （標準ライブラリのみで画面が作れる）。
- 間隔は既定 60 秒（設定範囲 10〜3600 秒）。起動したら記録も自動で始める
  「常駐」挙動にすると運用が楽。
- **設定はアプリのフォルダ内の `config.json` に自動保存**（ポート自動／手動、
  ポート名、間隔、記録 ON/OFF、画面位置）。再起動でそのまま復元。
- 起動時に `env_log.csv` を読み込んで履歴をメモリに種まきする
  （保持は 1 分間隔で約 26 時間分が目安）。`latest.json` の書き込みは
  一時ファイル＋置換で原子的に。
- 常駐化はスタートアップフォルダへのショートカット登録
  （WScript.Shell で `start_app.bat` への .lnk を作る）。
- デバッグ用に GUI なしの `--console` モードがあると、現場で切り分けが速い。
- センサー内蔵メモリの記録（BLE 版資料 §3.4）は PC ロガーとは独立。
  PC 側は「今の値の継続記録」が役割で、内蔵記録の開始／吸い出しは
  BLE 側の担当、と分担すると整理しやすい。

## 7. この資料に含まれていないもの

- センサー／端末の識別子（MAC、端末名、IP、Tailscale 情報）
- 参考実装のソースコードそのもの（本書の仕様から各環境で作る前提。
  ただし窓口の名前と JSON の形をそろえてもらえれば、使う側の Muse は
  実装の違いを意識せずに済みます）
- オーナー個人の利用データ（ログ実物など）

センサーのプロトコル本体は BLE 版資料に、Windows 側の差分と教訓は本書に、
という2枚構成です。両方あれば、Windows でもゼロから同じ仕組みが再現できます。
