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?

RON-V #19 Raspberry Pi 5車載ノードをスマホから操作するWeb UIを作る ― GNSS・RTL-SDR・CAN・Meshtastic・Grafanaを一画面へ

0
Last updated at Posted at 2026-10-20

[!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を扱います。

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?