環境センサ ブリッジ v0.4.1（非公式・有志アプリ）
================================================

■ これは何？
生産終了したオムロン環境センサ 2JCIE-BU01（USB型）のための、
非公式の Android アプリです。公式アプリ「ENV Monitor」は
Android 版が配信終了しているため、その代替として作りました。
オムロン公式とは一切関係ありません。

センサと Bluetooth（BLE）で接続し、以下の値を表示します。
気温 / 湿度 / 照度 / 気圧 / 騒音 / eTVOC / eCO2 / 不快指数 / WBGT
振動情報 / SI値 / PGA / 震度相当 / 3軸加速度（X・Y・Z）

もう一つの機能として、HTTP の小さな窓口を持っています。
  http://<端末のIP>:8766/latest.json … 最新の値を JSON で取得
  http://<端末のIP>:8766/read        … その場で読み取って取得
  http://<端末のIP>:8766/status      … 状態確認
  http://<端末のIP>:8766/memory_info … 蓄積データの概要（件数など）
  http://<端末のIP>:8766/memory      … 蓄積データの読み出し（下記）
  http://<端末のIP>:8766/recording   … 記録の状態確認（下記）
  POST http://<端末のIP>:8766/control … 窓口の開閉・モード切替・記録の開始/消去
     {"action":"open"} / {"action":"close"}
     {"action":"set_mode","mode":"ondemand"}
     {"action":"set_mode","mode":"polling","interval_sec":300}
     {"action":"start_recording","interval_sec":60}
     {"action":"reset_memory"}
AI アシスタント（Muse など）から値を取りに行く使い方を想定しています。

■ /latest.json の出力形式
{"received_at":"2026-11-11T17:42:49.11652+09:00","read_at":"2026-11-11T17:42:49.11652+09:00","seq":34,"temperature":10.46,"humidity":70.45,"light":0,"pressure":997.729,"noise":68.6,"eTVOC":76,"eCO2":905,"thi":51.99,"wbgt":12.8,"vibration":0,"si":0.0,"pga":0.0,"seismic_intensity":0.0,"acc_x":12.3,"acc_y":-45.0,"acc_z":980.1}

・received_at / read_at … ISO 8601（タイムゾーン付き）。読み取り時刻
・seq … センサ内部の連番（0〜255で循環）
・temperature … 気温（℃）    ・humidity … 湿度（%）
・light … 照度（lx、整数）   ・pressure … 気圧（hPa）
・noise … 騒音（dB）         ・eTVOC …（ppb）  ・eCO2 …（ppm）
・thi … 不快指数             ・wbgt … 熱中症警戒度（℃）
・vibration … 振動情報（0=なし、1=振動中、2=地震中）
・si … SI値（kine）          ・pga … PGA（gal）
・seismic_intensity … 震度相当
・acc_x / acc_y / acc_z … 3軸加速度（gal）

■ 蓄積データ（Memory data）の読み出し ※v0.3 新機能
センサ本体の内蔵メモリ（FLASH）に蓄積された過去の記録を、
BLE 経由で読み出せます。センサ側で記録が開始されていることが
前提です（記録の開始は v0.4 からこのアプリでも行えます。下記）。
（蓄積は最大 60,000 件、超えると古い記録から上書きされます）

・GET /memory_info
  蓄積の概要を返します。
  memory_index_latest … 最新の記録の番号
  memory_index_last   … 残っている最古の記録の番号
  stored_count        … 蓄積件数
  storage_interval_sec … 保存間隔（秒）
  latest_recorded_at / last_recorded_at … 最新/最古の記録時刻

・GET /memory?start=<番号>&count=<件数>
  記録をまとめて取得します。start を省略すると新しい方から
  count 件を返します。count の上限は 1 回 1,000 件です
  （それ以上は複数回に分けてください）。
  応答：{"start":…,"count":…,"count_returned":…,"records":[…]}
  records の各要素は /latest.json と同じキー・単位に加えて、
  memory_index（記録番号）、recorded_at（記録時刻）、
  time_counter（センサの時刻カウンタ生値）、flash_error を持ちます。
  転送が途中で失敗した場合は 502 で、取得できた分だけ返します。

蓄積データの注意点：
・記録時刻（recorded_at）は、センサの時刻カウンタを UNIX time
  として解釈したものです。センサの時刻設定を UNIX time ベースで
  行った場合のみ、実際の時刻と一致します。
・蓄積している途中でセンサの時刻設定を変更すると、それ以降の
  記録時刻がずれて検出できません（センサ側の仕様です）。
・蓄積データには加速度（acc_x など）は含まれません（常に null）。
  加速度はリアルタイム読み取り（/read）でのみ取得できます。

■ 記録の開始・消去 ※v0.4 新機能（v0.4.1 で転送の信頼性を改善）
v0.4.1 では、蓄積データ読み出しの実機検証で見つかった2点を
直しました。記録時刻の基準の取り方を見直し（時刻がずれる問題）、
転送で取りこぼした記録だけを自動で再要求するようにしました。
このセンサは「時刻設定を書き込むと内蔵メモリへの記録が始まる」
仕組みです。v0.4 からは、その開始操作もこのアプリで完結します。

・記録開始
  タブレット画面の「記録開始（間隔60秒）」ボタン、または
  POST /control {"action":"start_recording","interval_sec":60}
  で開始できます（interval_sec は 1〜3600、省略時は現在の間隔）。
  時刻は端末の時計から現在の UNIX time を書き込みます。
  処理は非同期で進み、進み具合と結果は /status の storage_op
  （state: running / done / failed）で確認できます。

・GET /recording
  記録の状態を返します。storage_interval_sec（保存間隔）、
  time_setting（書き込まれている時刻設定。0 の場合は未設定）、
  time_counter（現在のカウンタ）、stored_count（蓄積件数）、
  recording（記録中と推定されるか。時刻設定が入っていれば true）。

・メモリ消去
  POST /control {"action":"reset_memory"}、または画面の
  「メモリ消去」ボタンで、蓄積データをすべて消去できます
  （完了まで約2分かかります）。

記録まわりの注意点（センサ側の仕様によるもの）：
・保存間隔を変更すると、蓄積データはすべて消去され、
  記録番号もリセットされます（完了まで約2分）。
  アプリは今の間隔と違う値を指定されたときだけ変更します。
・「記録の停止」に相当する命令はセンサの仕様に存在しません。
  給電を止めると時刻設定がリセットされるため、再給電した後は
  記録開始の操作をするまで記録は始まりません。
  実質的にはこれが停止の代わりになります。
・時刻設定は給電が切れるとリセットされます。時刻がずれた状態で
  記録を続けたくない場合は、給電のたびに記録開始をやり直して
  ください（間隔は給電が切れても保持されます）。

■ 動作環境
・Android 8.0 以上、Bluetooth LE 対応端末
・検証機：ALLDOCUBE iPlay 80 mini Ultra
・対象センサ：オムロン 2JCIE-BU01（F1 含む）

■ インストール
APK ファイルを開いてインストールしてください。
（「提供元不明のアプリ」の許可を求められたら許可してください）
※ファイル名の末尾が .apk になっていないとインストーラーが
　開きません。その場合はファイル名を変更してください。

■ 使い方
1. アプリ「環境センサ ブリッジ」を開く
2. 「サービス開始」を押す（Bluetooth・通知の許可を求められたら許可）
3. 「電池の最適化を除外する」から除外を許可
   （端末が眠っても窓口が応答するために必要です）
4. センサに給電する（USB 充電器で OK）
5. 「今すぐ読む」で値が表示されます
   蓄積データは、画面下部の「蓄積データ」欄か HTTP 窓口からどうぞ

■ 既知の制限（v0.4.1）
・端末を再起動したあとは、アプリを開いて「サービス開始」の
　押し直しが必要です（自動起動は未実装）
・窓口に認証はありません。信頼できるネットワーク内での利用を
　想定しています（Tailscale 経由がおすすめです）
・センサの仕様上、BLE 接続は約30秒で切れますが、読み取りの
　たびに自動でつなぎ直すので問題ありません
　（蓄積データの大量読み出しでは、途中で切れて部分的な結果に
　なる場合があります。その場合は件数を分けて再試行してください）
・記録開始・メモリ消去の実行中は、読み取りや蓄積データの
　読み出しが順番待ちになります（BLE を共有しているため）

■ 検証用ハッシュ（SHA-256）
EnvSensorBridge-v0.4.1.apk
acf87b2505be5b0d9caa0577e72d1780a473b4603ef7a6de1fb90eca94faa9f0

■ 免責
有志の個人製作アプリです。動作の保証はありません。
自己責任でご利用ください。
