[!NOTE]
2026-09-23 現行GitHub同期メモLTE L3/L4 Evidence、rclone非同期配送、Google Sheets INDEX、RTL-SDR USB消失時の1回限りの自動power-cycleは現行
mainに存在します。現行のSDR precheckはhub-location=3 / hub-port=1を使用し、RF/LTE両方のsystemd drop-inから実行します。
RON-V 連載リンク
← 前の記事:#17 — Google Sheetsへの非同期同期
→ 次の記事:#19 — スマホから操作するWeb UI
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ではSQLiteへ保存した軽量な観測値だけでなく、後から再解析できるEvidenceも残します。
LTE cell_search では、
L1
PCI / EARFCN / PSS powerなどの軽量Fact
L3
解析済みStructured Evidence
L4
cell_search raw log
に分けています。
ファイル本体はGoogle Driveへ、検索用のINDEXはGoogle Sheetsへ送ります。
LTE measurement
↓
SQLite
↓
Evidence Producer
┌───┴───┐
↓ ↓
L3 L4
JSON LOG
└───┬───┘
↓
sync_objects / sync_deliveries
↓
rclone worker
↓
Google Drive
↓
Google Sync Worker
↓
L3_INDEX / L4_INDEX
1. ローカルファースト
重要なのは、クラウドへ送る前に測定をローカルで完結させることです。
測定
↓
SQLite / raw log保存
↓
ここで測定としては完了
↓
Evidence生成
↓
クラウド配送
Google DriveやInternetに障害があってもLTE測定そのものは止めません。
2. L3 / L4保存先
現行実装では、
/var/lib/ronv/l3/lte
/var/lib/ronv/l4/lte
を使用します。
1回のLTE scanについて、
L3 : JSON
L4 : raw text log
を生成します。
3. 現行L3 payload
現行 app/integration/lte_evidence.py のL3 schemaは、
ronv.lte.evidence.v1
です。
概念例は、
{
"schema": "ronv.lte.evidence.v1",
"object_uid": "l3-lte-cell-search-00000001-00000002",
"level": 3,
"data_type": "lte_cell_search_evidence",
"event_time_jst": "2026-09-08T10:00:00+09:00",
"source": {
"table": "lte_measurements",
"row_ids": [1, 2]
},
"scan": {
"band": 28,
"pci_count": 2,
"gps": {
"latitude": null,
"longitude": null,
"gps_status": "no_fix"
},
"measurements": []
},
"l4": {
"object_uid": "l4-lte-cell-search-00000001-00000002",
"mime_type": "text/plain"
}
}
です。
L3の data_type は、
lte_cell_search_evidence
L4は、
lte_cell_search_raw_log
です。
4. L4はraw log
L4は cell_search のraw logをそのままEvidence化します。
生成時に、
bytes
sha256
mime_type
file_path
を記録します。
将来解析ロジックが変わっても、L4があれば再解析できます。
5. sync_objects
L3/L4は生成後、
sync_objects
へ登録されます。
主な情報は、
object_uid
source_table
source_id
data_type
level
priority
event_time_jst
file_path
mime_type
bytes
sha256
state
です。
ファイル生成とSHA256確認まで終わったものを ready として扱います。
6. sync_deliveries
配送は sync_deliveries で別管理します。
rclone workerでは主に、
pending / retry
↓
inflight
↓
acked
と進みます。
失敗内容によっては、
retry
failed
になります。
これによりEvidence生成と外部配送を分離できます。
7. rclone設定
公開用設定は、
[rclone]
enabled = false
binary = "/usr/bin/rclone"
remote_name = "<RCLONE_REMOTE>"
remote_root = "RONV_RCLONE"
timeout_sec = 120
retry_sec = 60
です。
実環境では enabled=true とし、実際のremote名を設定します。
OAuth tokenや rclone.conf はGitHub/Qiitaへ載せません。
Drive上は概ね、
RONV_RCLONE/
├── L3/
│ └── lte/
└── L4/
└── lte/
となります。
8. rclone worker
実装は、
app/integration/rclone_delivery_worker.py
です。
現在はL3/L4の pending / retry を取得し、ローカルファイルのSHA256を確認してから送信します。
成功すると、
state = acked
remote_id = <remote file>
となります。
失敗した場合は retry_sec に従って再試行します。
9. Google Sheets INDEX
Google SheetsにはEvidence本体を入れません。
L3_INDEX
L4_INDEX
へ、
object_uid
level
event_time_jst
data_type
local_path
mime_type
local_bytes
sha256
upload_transport
upload_representation
upload_state
upload_bytes
remote_id
received_at_jst
などを出します。
これにより、
Google Sheets = 検索・状態確認
Google Drive = ファイル本体
と役割を分けられます。
10. systemd timer
LTE Evidenceは、
[Timer]
OnBootSec=2min
OnUnitInactiveSec=5min
AccuracySec=5s
Unit=ronv-lte-evidence.service
です。
rclone配送は、
[Timer]
OnBootSec=3min
OnUnitInactiveSec=1min
AccuracySec=5s
Unit=ronv-rclone-delivery.service
です。
Google Sheets同期は5分周期です。
それぞれ独立しているため、
測定
Evidence
Drive配送
Sheets同期
のどこかが一時停止しても、前段を止めない構成になっています。
11. RTL-SDR共有
RON-VではRF測定とLTE測定が同じRTL-SDR Blog V4を使います。
同時openを避けるため、
/tmp/ronv-sdr.lock
を app/common/sdr_lock.py で排他利用します。
またRF測定終了後はsystemd drop-inでLTE測定を起動します。
RF
↓
OnSuccess / OnFailure
↓
LTE
RFが成功しても失敗しても、LTE測定へ進む設計です。
12. RTL-SDRがUSBから消える問題
実機運用では、RTL-SDRがLinuxのUSB一覧から完全に消える事象を経験しました。
lsusb -d 0bda:2838
でも見つからない場合、単なる usbreset 対象そのものが存在しません。
そこでRON-Vでは、
app/common/sdr_health.py
でsysfs上のVID/PID、
0bda:2838
を確認します。
13. systemd ExecStartPreでprecheck
RFとLTEの両方に、
systemd/ronv-rf-measure.service.d/sdr-precheck.conf
systemd/ronv-lte-measure.service.d/sdr-precheck.conf
があります。
現行設定は、
--attempts 3
--interval 1
--recover
--hub-location 3
--hub-port 1
--off-seconds 3
--recovery-attempts 10
--recovery-interval 1
です。
つまり測定前に、
RTL-SDRあり
↓
そのまま測定
RTL-SDRなし
↓
対象USB portをOFF
↓
3秒待機
↓
ON
↓
再enumeration確認
を行います。
14. uhubctl権限
ronv ユーザーへ任意のsudo権限は渡しません。
現行GitHubでは、
deploy/sudoers/ronv-uhubctl
に、対象ポートだけを操作できるルールを置いています。
現在の対象は、
hub location 3
port 1
です。
USB topologyは環境で変わるため、別機体へそのままコピーせず lsusb -t と uhubctl で確認する必要があります。
15. 1障害につきpower-cycleは1回
物理故障や配線不良で復旧できない場合に、測定周期ごとに無限power-cycleするのは危険です。
そこで、
/run/ronv/sdr-recovery.failed
をfailure latchとして使います。
最初のMISSING
↓
power-cycleを1回
↓
失敗
↓
latch保持
↓
次回はSKIPPED
です。
RTL-SDRが自然復帰した場合はlatchを解除します。
さらに、
/run/ronv/sdr-recovery.lock
を flock して、RF/LTEから二重に復旧処理が走ることを防ぎます。
16. DVB driverの競合対策
現行repoには、
deploy/etc/modprobe.d/blacklist-rtl.conf
も含めています。
RTL-SDRをSDR用途で使う環境では、DVB用kernel driverとの競合を避けるための構成です。
17. 確認コマンド
Evidence:
systemctl status \
ronv-lte-evidence.timer \
--no-pager
journalctl \
-u ronv-lte-evidence.service \
-n 100 \
--no-pager
rclone:
systemctl status \
ronv-rclone-delivery.timer \
--no-pager
journalctl \
-u ronv-rclone-delivery.service \
-n 100 \
--no-pager
SDR:
lsusb -d 0bda:2838
/home/ronv/.venvs/ronv/bin/python \
-m app.common.sdr_health \
--attempts 3 \
--interval 1
まとめ
#18では、
LTE
↓
L3 JSON
L4 raw log
↓
SQLiteでEvidence/Delivery管理
↓
rclone
↓
Google Drive
↓
Google Sheets INDEX
を構築しました。
さらに、RTL-SDRのUSB完全消失に対して、
precheck
↓
1回限りのUSB power-cycle
↓
failure latch
↓
RF/LTE間の排他
を追加しています。
大切なのは、クラウドやSDR障害が起きても「測定結果をローカルへ残す」設計を中心に置くことです。