[!NOTE]
2026-09-23 現行GitHub同期メモWebの現行入口は
app.web.web_entry:create_app()、実画面はapp/web/web_v2.pyです。現在は従来のGNSS / RTL-SDR / Vehicle / LTE / Camera / Mesh / Googleに加え、Wi-Fi設定とUPS runtime statusもWebから確認できます。
RON-V 連載リンク
← 前の記事:#18 — LTEのL3/L4とGoogle Drive転送
→ 次の記事:#20 — UPS監視と安全Shutdown
L0〜L4の定義追記(2026-10-25)
本文中のコード・試験結果は執筆当時の記録として残しています。画像AI・音声を関連付ける現在の定義は次のとおりです。
| レベル | 残す内容 |
|---|---|
| L0 | Meshtastic向けの23バイト短報。画像AIの候補通知は任意設定 |
| L1 | 個別の観測・撮影/録音/認識の状態と、詳細への参照 |
| L2 | 一定時間の観測件数・分類別候補などの集計 |
| L3 | 画像AIの詳細、録音情報、文字起こし全文 |
| L4 | 元画像JPEG、元音声WAV、LTEのraw logなど |
L0の警報欄は1バイト=8ビットです。新しいversion=2の定義は、倒木 0x01、冠水 0x02、煙 0x04、道路上の障害物 0x08、路面の穴 0x10。残り3ビットは未割り当てです。0x03は倒木と冠水の組み合わせで、煙の番号ではありません。0x00はL0上では未判定で、安全を示しません。 候補ありでは元イベントの時刻・位置を使い、現在地と混同しません。
発信元はnode_uid、根拠は画像・音声などです。「処理成功」「災害の候補」「人の確認済み」を分けます。初期の確認状態はunreviewed。画像AIの検出0件を「危険なし」とせず、音声の否定も全文へ残します。人が補足・訂正する画面と、音声からの災害自動分類は今後の実装です。
10月25日にL1の関連付け・L2の集計・音声L3/L4の転送処理をコードへ追加しました。新連携の実機確認はこれからです。音声転送とL0候補通知は初期設定では無効で、個別に有効化します。従来のL0 version=1へ、この分類の意味を遡って付けません。
Looker Studioで使用中のSheets summaryはRF測定から直接出力する既存の10列で、L2とは別です。今回の追加で列名・順序・値の意味、既存Grafanaの参照項目は変えません。L1のMesh送信、写真・音声のMesh転送、自動公開は実装していません。
詳細と設定手順:データレベルの定義(リポジトリの閲覧権限が必要です)。
はじめに
RON-Vの機能が増えると、SSHで個別のserviceやDBを確認するだけでは車載運用が煩雑になります。
そこでスマートフォンから、
http://ronv.local:5000
を開き、
GNSS
RTL-SDR
AtomS3R
Meshtastic
Camera
Internet
Google
UPS
Vehicle
LTE
systemd
をまとめて確認できるWeb UIを用意しました。
1. 現行Web構成
現在の入口は、
systemd/ronv-web.service
↓
Gunicorn
↓
app.web.web_entry:create_app()
↓
app/web/web_v2.py
です。
web_entry.py はデプロイ環境固有のDashboard URLなどを反映する薄い入口で、画面本体は web_v2.py にあります。
共通処理は web_app.py から利用しています。
2. systemd / Gunicorn
現行unitは、
[Service]
Type=simple
User=ronv
WorkingDirectory=/home/ronv/ronv
Environment=PYTHONUNBUFFERED=1
Environment=RONV_CONFIG=/home/ronv/ronv/config/ronv.toml
ExecStart=/home/ronv/.venvs/ronv/bin/gunicorn --workers 1 --bind 0.0.0.0:5000 --access-logfile - --error-logfile - app.web.web_entry:create_app()
Restart=on-failure
RestartSec=2
です。
確認:
systemctl status \
ronv-web.service \
--no-pager
3. 設定
config/ronv.toml の [web] を使います。
[web]
host = "0.0.0.0"
port = 5000
grafana_url = "<GRAFANA_URL>"
looker_url = "<LOOKER_STUDIO_URL>"
公開用 ronv.example.toml ではURLを空欄にしています。
4. トップ画面
現行画面ではstatus chipとして、
GNSS
RTL-SDR
AtomS3R
Meshtastic
Camera
Internet
Google
を表示します。
さらにUPS runtime statusを、
Battery voltage
Current
Power
Estimated SOC
Guard status
Detail
として表示します。
UPS情報はSQLiteではなく、
/run/ronv/ups-status.json
を読みます。
5. GNSS
GNSSは位置fixとgpsd状態を確認します。
WebがGNSSデバイスを独占せず、既存のRON-V APIから状態を取得します。
6. RTL-SDR
Web UIはRTL-SDRをopenしません。
RF/LTE測定との競合を避けるため、USB上にRTL-SDRが存在するかを軽量に確認するだけです。
SDRの実際の利用は測定service側へ任せます。
7. Vehicle / LTE
最新のVehicle情報やEvent、LTE測定結果はSQLiteから取得して表示します。
LTEでは代表的に、
Band
EARFCN
Frequency
PCI
PCI count
PSS power
GPS status
を確認できます。
8. Camera
最新画像は、
/camera/latest
から確認できます。
トップ画面でも最新画像を表示し、RingCam/Event evidenceの入口として利用できます。
9. Meshtastic
WebからText送信要求をSQLite queueへ登録します。
Web
↓
mesh_messages
state=queued
↓
ronv-mesh.service
↓
920MHz Mesh
↓
ACK
↓
state=acked
となります。
Webプロセス自身がMeshtastic USBを直接openしない点が重要です。
10. Wi-Fi設定
現在のWeb UIには、
/wifi
があります。
- 周辺APスキャン
- 保存済み接続への切替
- 新しいSSID/Passwordでの接続
を行えます。
WebプロセスへNetworkManagerの強い権限を直接与えず、
/usr/local/sbin/ronv-wifi-helper
を限定されたsudoルール経由で呼び出す設計です。
11. Internet / Google
Internet状態を確認し、
full
limited
portal
offline
などとして表示します。
Google chipは、
google.enabled
Internet状態
を主に表示する軽量statusです。
Google Sheetsへの個別同期結果の詳細は、ronv-google-sync.service のjournalやSQLiteの配送状態で確認します。
12. Grafana / Looker Studio
トップ画面には、
/grafana
/looker
を用意しています。
Grafana URLは web_entry.py が設定値を確認してredirectします。
Looker Studioも ronv.toml のURLへredirectします。
13. systemd状態
画面では主なunitを確認します。
ronv-vehicle.service
ronv-web.service
ronv-mesh.service
ronv-rf-measure.timer
ronv-lte-evidence.timer
ronv-vehicle-evidence.timer
ronv-rclone-delivery.timer
ronv-google-sync.timer
grafana-server.service
gpsd.socket
Webは「管理画面」であり、測定本体ではありません。
Webが停止しても観測処理は独立して継続します。
14. API
現在は、
GET /health
GET /api/status
GET /mesh/history
POST /mesh/send
GET /camera/latest
GET /events
GET /wifi
POST /wifi/up
POST /wifi/connect
GET /grafana
GET /looker
GET/POST /reboot
GET/POST /shutdown
などがあります。
15. Raspberry Pi再起動
Webから直接 sudo reboot を実行しません。
POST /reboot
↓
/home/ronv/ronv/data/vehicle/reboot.request
↓
ronv-reboot-request.path
↓
ronv-reboot-request.service
↓
systemctl reboot
です。
GET /reboot は確認画面だけを表示し、POSTで初めてrequestを作ります。
16. シャットダウン
shutdownも同様です。
POST /shutdown
↓
/home/ronv/ronv/data/vehicle/poweroff.request
↓
ronv-poweroff-request.path
↓
ronv-poweroff-request.service
↓
systemctl poweroff
Webアプリへroot権限を与えず、systemdへ特権操作を限定しています。
17. スマートフォン向け
画面はレスポンシブなgridを使い、スマートフォンでも、
status
Vehicle
LTE
UPS
Camera
service
を縦方向に確認しやすくしています。
車内ではSSHよりもWeb UIの方が状態確認が速く、運転開始前・停止後のチェックに向いています。
18. 機密情報をGitHubへ入れない
次は実環境固有なのでGitHubへ登録しません。
Wi-Fi password
Google Service Account JSON
Spreadsheet IDの実値
rclone token
環境固有URL
公開repoには設定項目とプレースホルダだけを置きます。
19. 現在のRON-V
現行構成では、
RF
LTE Band 28
GNSS
Vehicle / AtomS3R
Camera / RingCam
Meshtastic
SQLite
L0 / L1 / L2
L3 / L4 Evidence
Google Sheets
Google Drive
Grafana
Looker Studio
Web UI
UPS status
を一つの車載ノードとして扱えます。
Web UIはその「現在状態を見る入口」です。
まとめ
Webは観測の中心ではなく、確認・操作の入口です。
測定系
独立して継続
Web
状態確認
Wi-Fi変更
Mesh送信
Dashboardリンク
reboot / shutdown要求
と分離することで、Web障害が測定へ波及しにくい構成にしています。
次の #20 では、車載電源断に備えたUPS監視と安全shutdownを扱います。