OpenCCVoice / DVSwitch Bot 操作マニュアル(運用者向け)
概要
このマニュアルは、OpenCCVoice / DVSwitch Bot を運用する方向けの操作マニュアル(逆引き集)です。「こうしたいときは、これを打つ」を素早く引けるよう、各操作を「目的 → コマンド → 確認方法」のセットで記載しています。仕組みの説明は別冊『システム仕様書』を参照してください。

前提条件
本マニュアルは、以下の環境を前提としています。
- 対象システム:Raspberry Pi OS(Bookworm)+ DVSwitch-Server + デーモン分離版 Bot(V1.73)
- スクリプト配置:
/opt/dvswitch_bot/bin/ - サービス名:
dvswitch-bot(ハイフン)
dvswitch-bot(ハイフン)です。dvswitch_bot(アンダースコア)では「could not be found」になります。まず覚える基本操作
迷ったらこの 4 つです。
状態を見ます。
sudo systemctl status dvswitch-bot --no-pager
再起動します(設定やスクリプトを変えた後)。
sudo systemctl restart dvswitch-bot
ログを流し見します(「Ctrl + C」で抜ける。bot は止まらない)。
sudo journalctl -u dvswitch-bot -f
設定を変えます(対話)。反映は再起動です。
sudo python3 /opt/dvswitch_bot/bin/bot_setup.py
sudo systemctl restart dvswitch-bot
運用フロー(全体像)
「設定を変えたい」「音声を変えたい」など、目的別の作業の流れです。
日常操作:起動・停止・状態確認
状態を確認する
sudo systemctl status dvswitch-bot --no-pager
見るポイントは以下のとおりです。
Active: active (running)…正常に動いているActive: inactive (dead)…停止しているActive: activating (auto-restart)…起動に失敗して再起動を繰り返している(設定不正を疑う。「トラブル対応」へ)
起動・停止・再起動
起動します。
sudo systemctl start dvswitch-bot
停止します。
sudo systemctl stop dvswitch-bot
再起動します(設定変更の反映に使う)。
sudo systemctl restart dvswitch-bot
自動起動(電源投入時に自動で立ち上がる設定)
自動起動を有効化します。
sudo systemctl enable dvswitch-bot
自動起動を無効化します。
sudo systemctl disable dvswitch-bot
現在の設定を確認します(enabled / disabled)。
sudo systemctl is-enabled dvswitch-bot
sudo systemctl enable --now dvswitch-bot で「自動起動有効化+即起動」を一度に行えます。ログの見方
常駐中の Bot は画面に出力されず、すべて journal(システムログ)に記録されます。
リアルタイムで流し見する(最もよく使う)
sudo journalctl -u dvswitch-bot -f
-f は「流し続ける」という意味です。カーチャンク応答や時報が出る様子をそのまま眺められます。「Ctrl + C」で抜けます(Bot は止まらず、表示だけ終わる)。
直近のログをまとめて見る
直近 50 行を見ます。
sudo journalctl -u dvswitch-bot -n 50 --no-pager
今日のぶんを見ます。
sudo journalctl -u dvswitch-bot --since today --no-pager
直近 1 時間を見ます。
sudo journalctl -u dvswitch-bot --since "1 hour ago" --no-pager
ログの読み方(よく出るメッセージ)
| ログの例 | 意味 |
|---|---|
Config loaded /opt/dvswitch_bot/bot_config.json | 設定の読み込み成功 |
Bot ready — monitoring DMR traffic | 監視開始(正常起動の合図) |
Startup ann ... scheduled in 5.0s | 起動の約 5 秒後に「起動しました。」を送出(V1.62〜) |
Kerchunk detected: <callsign> (0.9s) trigger | カーチャンクを検知して応答する |
receive:suppressed: <callsign> (... remaining ...) | 抑制時間中なので応答しない |
receive:watchdog pseudo-end: <callsign> (...) | SFR 中継等で終端が落ちた送信を擬似終端として救済(V1.67〜) |
receive:watchdog ignored (high loss): ... | パケットロスが大きすぎる受信は救済しない |
Trigger 22:00 time_signal | 22 時の時報を送出 |
Trigger 22:30 half_hour_signal | 22 時 30 分の案内を送出(TIME_SIGNAL_MODE=2 のとき/V1.64〜) |
Trigger 001.wav scheduled_message | 定時メッセージを送出 |
NightSkip ... time_signal suppressed (night mode) | ナイトモードで時報を抑制 |
NightSkip ... half_hour_signal suppressed (night mode) | ナイトモードで 30 分案内を抑制 |
NightSkip ... scheduled_message suppressed (night mode) | ナイトモードで定時メッセージを抑制 |
Config error ... | 設定が不正。起動拒否(フェイルセーフ) |
TX_GAIN ... フォールバック | TX_GAIN の値が不正なので等倍(1.0)で動作(送出は止めない/V1.68〜) |
エラーだけ拾う
sudo journalctl -u dvswitch-bot --since today --no-pager | grep -iE "error|!!|fail"
設定変更(受信時間・時刻案内・放送回数・ナイトモード・送出音量)
Bot 本体(dvswitch_bot.py)は編集しません。設定は原則 bot_setup.py で変えます。送出音量 TX_GAIN も bot_setup.py/ダッシュボードで設定できます(後述)。
現在の設定を確認する
sudo python3 /opt/dvswitch_bot/bin/bot_setup.py -s
設定値の表示と、有効性チェック([OK] か [WARN])が出ます。
設定を変更する(対話)
sudo python3 /opt/dvswitch_bot/bin/bot_setup.py
対話で以下を聞かれます(Enter で現在値を維持)。
| 項目 | 意味 | 既定 | 範囲 |
|---|---|---|---|
| 最小受信時間(秒) | これ未満の電波は無視 | 0.5 | 0 より大 |
| 最大受信時間(秒) | これ以上は通常交信とみなし応答しない | 3.9 | 最小 < 最大 |
| 放送回数 | 1 時間あたりの定時メッセージ回数 | 2 | 時刻案内モード依存(下表) |
| ナイトモード(y/n) | 夜間の時報・定時メッセージ抑制 | y | y / n |
| N1(開始時) | ナイトモード開始時刻 | 22 | 0〜23 |
| N2(終了時) | ナイトモード終了時刻 | 5 | 0〜23 |
時刻案内モード(TIME_SIGNAL_MODE)— V1.64〜
時報(時刻案内)の頻度を選べます。bot_config.json の TIME_SIGNAL_MODE で指定します(任意キー。未設定の旧設定は従来動作=モード 1 として扱う)。
| モード | 動作 |
|---|---|
| 0 | 時刻案内なし |
| 1 | 毎正時のみ「○○時です」(従来動作) |
| 2 | 毎正時「○○時です」+毎 30 分「○○時 30 分です」 |
放送回数(ANNOUNCE_FREQ)の有効範囲はモードに依存します(正時 / 30 分は時刻案内が占有するため)。
| モード | 放送回数に指定できる値 |
|---|---|
| 0 | 0 / 1 / 2 / 3 / 4 |
| 1 | 0 / 1 / 2 / 3 |
| 2 | 0 / 2 |
変更を反映する(必須)
sudo systemctl restart dvswitch-bot
sudo journalctl -u dvswitch-bot -n 25 --no-pager
起動ログで設定が反映されているか確認します。
ナイトモードの動作
放送回数を例えば「2 回(:20, :40)」、N1=22、N2=5 と設定した場合は以下のとおりです。
| 時刻 | 時報(:00) | 定時メッセージ(:20, :40) |
|---|---|---|
| 〜21 時台 | 出す | 出す |
| 22:00 | 出す(+ナイトモード突入アナウンス) | — |
| 22:20, 22:40 | — | 抑制(出さない) |
| 23 時〜翌 5 時台 | 抑制 | 抑制 |
| 6:00〜 | 再開 | 再開 |
ポイントは、N1(22 時)の時報と突入アナウンスは出るが、その後の同じ時間帯の定時メッセージは出さない点です。起動ログでは time_signal : suppress 23-05 / sched_message : suppress 22-05 と表示されます(カーチャンク応答は 24 時間動作し、ナイトモードの影響を受けません)。
TIME_SIGNAL_MODE=2(30 分案内あり)の場合、30 分案内は定時メッセージと同じ抑制窓(N1 時〜N2 時)で抑制されます。起動ログに half_hour : suppress 22:30-05:30 のように出ます。送出音量(TX_GAIN)— 手動設定 / V1.68〜(上級者向け)
bot が送出するすべての音声(カーチャンク ID・時報・30 分案内・起動 / ナイト案内・定時メッセージ 001/002)の音量を、線形倍率 TX_GAIN(1.0=等倍)で一律に調整できます。Analog_Bridge.ini の usrpGain と同じ表現で、主用途は減衰(1.0 未満)です。
TX_GAIN は bot_config.json の任意キーで、現在は bot_setup.py(対話)とダッシュボード(app.py)の双方で設定でき、保存し直しても消えません。下記の手動 JSON 編集は、ツールを使わず直接調整したいとき向けの代替手段です。設定手順(手動で JSON を編集)は以下のとおりです。
まず現在の設定を確認します。
cat /opt/dvswitch_bot/bot_config.json
エディタで TX_GAIN を追記します(例:0.7 に減衰)。"TX_GAIN": 0.7 を JSON に 1 行追加します(他のキーと同じ階層)。
sudo nano /opt/dvswitch_bot/bot_config.json
反映します。
sudo systemctl restart dvswitch-bot
sudo journalctl -u dvswitch-bot -n 25 --no-pager | grep -i "TX gain"
- 有効範囲:0.0 より大きく 5.0 以下。1.0 を超えると増幅(クリップに注意)。
- 値が不正(数値でない / 0 以下 / 範囲外)でも送出は止めず、等倍(1.0)にフォールバックして警告ログを出します。
- 起動ログに
TX gain : 0.7 (減衰 / vol 効果を全送出に付与)のように表示されます。
音声の変更(固定 WAV・試聴)
コールサインや案内文を変えたいときは、固定 WAV を作り直します。運用を続けたまま(常駐させたまま)作り直せます。
systemctl restart は不要です。カスタム音声(cstm)に差し替える — V1.73〜
bot が送出する intro(名乗り)・定時メッセージ 001・002 を、自前の WAV に個別に差し替えられます。標準ファイル(fixed_intro.wav/001.wav/002.wav)はそのまま残し、/opt/dvswitch_bot/ 直下に cstm_intro.wav/cstm_001.wav/cstm_002.wav(8000 Hz・モノラル・16-bit)を置きます。
有効化は 2 通りあります(どちらでも結果は同じです)。
- ダッシュボード:ブラウザでダッシュボードを開き、「変更モード」→「カスタム音声 — 差し替え」カードで使う項目にチェック →「保存」(自動でサービス再起動・反映)。
- 対話設定:
sudo python3 /opt/dvswitch_bot/bin/bot_setup.pyで intro/001/002 を個別に選びます。
intro をカスタムにすると、それを使う 3 か所(カーチャンク応答・起動アナウンス・ナイトアナウンスの名乗り)すべてに効きます。時報イントロ time_intro.wav は差し替え対象外です。
詳しい作成手順・つまずきポイントは GitHub リポジトリの カスタム音声.md を参照してください。
運用途中で固定 WAV を作り直す(対話)
cd /opt/dvswitch_bot/bin sudo ./create_wav.sh
コールサイン・地名・定時メッセージ 1/2 を対話入力すると、英数字を自動でカナ変換し、/opt/dvswitch_bot/ 直下に WAV を生成(上書き)します(fixed_intro / fixed_outro / time_intro / 001 / 002)。
create_wav.sh は、上書きの直前に既存の *.wav を /opt/dvswitch_bot/bak/wav/YYMMDDHHMMSS/ へ自動退避します(dvs_config.sh と同じ作法)。作り直しに失敗しても元へ戻せます(後述)。念のため停止します(任意)。
sudo systemctl stop dvswitch-bot
作り直します。
cd /opt/dvswitch_bot/bin && sudo ./create_wav.sh
作り直し後に再開します。
sudo systemctl start dvswitch-bot
通常は停止せずに作り直しても問題ありませんが、確実にしたいときの手順です。
生成された WAV を確認する
ls -la /opt/dvswitch_bot/*.wav
音声フォーマット(8000 Hz / 1ch / 16-bit)を確認します。
soxi /opt/dvswitch_bot/*.wav
ファイルの更新時刻が今になっていれば、上書きできています。
試聴する(実際に電波に乗せて聞く)
二重送信を避けるため、先に Bot を止めます。
sudo systemctl stop dvswitch-bot
python3 /opt/dvswitch_bot/bin/test_send.py /opt/dvswitch_bot/001.wav
python3 /opt/dvswitch_bot/bin/test_send.py /opt/dvswitch_bot/fixed_intro.wav
確認できたら Bot を戻します。
sudo systemctl start dvswitch-bot
test_send.py を実行すると、同じ UDP ポート(51000)に二重送信になり音が崩れます。必ず stop してからテストしてください。作り直しに失敗した → 元の音声に戻す(復元)
cd /opt/dvswitch_bot/bin sudo ./create_wav.sh -r
日付フォルダの一覧が出るので、戻したい番号を選びます。復元後は再起動不要で次の送出から反映されます。
古いバックアップをまとめて消したいときは以下を実行します(/opt/dvswitch_bot/bak/wav/ を全削除。確認あり)。
cd /opt/dvswitch_bot/bin sudo ./create_wav.sh -d
DVSwitch 設定の変更(コールサイン・TGIF・TG)
コールサイン・DMR ID・TGIF パスワード・送信 TG を変えるときは dvs_config.sh を使います。3 つの ini を編集する前に自動でバックアップを取ります。
設定変更(対話)
cd /opt/dvswitch_bot/bin sudo ./dvs_config.sh
対話入力します(Enter で現状維持)。
| 項目 | 例 |
|---|---|
| Callsign | JJ2YYK |
| DMR ID(7 桁) | 4402519 |
| ESSID(2 桁) | 11 |
| TGIF Password | (TGIF サイトで発行した値) |
| 送信 TG(txTg) | 44833 |
最後に「サービスを再起動しますか?(y/N)」と聞かれます。y で analog_bridge と mmdvm_bridge が再起動され、設定が反映されます。
バックアップから復元する
cd /opt/dvswitch_bot/bin sudo ./dvs_config.sh -r
古いバックアップを全部消す
cd /opt/dvswitch_bot/bin sudo ./dvs_config.sh -d
スクリプトの更新(GitHub から最新版を反映)
GitHub リポジトリのスクリプトを更新したら、実機にも反映します。
現行をバックアップ
sudo cp /opt/dvswitch_bot/bin/dvswitch_bot.py \
/opt/dvswitch_bot/bin/dvswitch_bot.py.bak.$(date +%F_%H%M%S)最新版を取得して上書き
cd /opt/dvswitch_bot/bin BASE=https://raw.githubusercontent.com/ji2tab/OpenCCVoice-For-DVSwitch/main curl -fsSL "$BASE/dvswitch_bot.py" -o dvswitch_bot.py chmod +x dvswitch_bot.py
5 本まとめて取り直すなら以下を実行します。
cd /opt/dvswitch_bot/bin for f in dvswitch_bot.py bot_setup.py test_send.py create_wav.sh dvs_config.sh; do curl -fsSL "$BASE/$f" -o "$f" done chmod +x *.py *.sh
バージョンを確認して再起動
人間向けの版表記を確認します。
grep -n "Document Version" /opt/dvswitch_bot/bin/dvswitch_bot.py | head -1
機械可読の固定バージョン行を確認します(V1.69〜。ダッシュボードはこちらを優先参照)。
grep -n '^version' /opt/dvswitch_bot/bin/dvswitch_bot.py | head -1
再起動して確認します。
sudo systemctl restart dvswitch-bot sudo journalctl -u dvswitch-bot -n 25 --no-pager
起動ログのバージョン表記が更新されていれば反映成功です。
バックアップと復元
設定一式をまとめて保存する
mkdir -p ~/dvswitch_backup && cd ~/dvswitch_backup sudo cp /opt/Analog_Bridge/Analog_Bridge.ini ./ sudo cp /opt/MMDVM_Bridge/MMDVM_Bridge.ini ./ cp /opt/dvswitch_bot/bin/dvswitch_bot.py ./ cp /opt/dvswitch_bot/bin/bot_setup.py ./ cp /opt/dvswitch_bot/bot_config.json ./ sudo cp /etc/systemd/system/dvswitch-bot.service ./ 2>/dev/null || true cp /usr/share/hts-voice/mei/mei_normal.htsvoice ./ cd ~ && tar czf dvswitch_backup_$(date +%Y%m%d).tar.gz dvswitch_backup/
できた dvswitch_backup_YYYYMMDD.tar.gz を別の PC やクラウドに保管します。
ini だけ手早く戻す
dvs_config.sh -r(前述)が、ini のバックアップ / 復元には最も簡単です。
SD カードまるごとバックアップ(推奨・別 PC で)
Pi をシャットダウンし、SD を別 PC に挿して実行します。
dd は不可逆なコマンドです。of= / if= のデバイス名を取り違えると、書き込み先のディスクを破壊します。fdisk -l で対象デバイス(/dev/sdX)を必ず確認してから実行してください。デバイス名を確認します。
sudo fdisk -l
SD カードのイメージを取得します(/dev/sdX は確認した実際のデバイス名に置き換える)。
sudo dd if=/dev/sdX of=~/pi_backup_$(date +%Y%m%d).img bs=4M status=progress
イメージを圧縮します。
gzip ~/pi_backup_*.img
トラブル対応(逆引き)
| 症状 | 原因の候補 | 対処 |
|---|---|---|
| サービスが見つからない(could not be found) | 名前の打ち間違い | サービス名は dvswitch-bot(ハイフン)。アンダースコアではない |
activating (auto-restart) を繰り返す | 設定不正でフェイルセーフ作動 | journalctl -u dvswitch-bot -n 30 で Config error を確認 → bot_setup.py で設定し直す |
手動起動で Config error で止まる | bot_config.json が無い / 壊れ / 値不正 | bot_setup.py で作成。-s で検証 |
| 音が出ない(無音) | md380-emu 停止 or Analog 設定ミス | sudo systemctl status md380-emu。停止なら restart |
| 音がプツプツ / ケロケロ | 一時的負荷 | 一度 restart。頻発するなら CPU 温度・電源を確認 |
| カーチャンクに反応しない | 抑制時間中 / 受信時間が範囲外 | ログの suppressed や受信秒数を確認。bot_setup.py で最小 / 最大受信時間を見直す |
| SFR 中継でカーチャンクに反応しない | 終端パケット落ちで end が記録されない | V1.67 以降に更新。ログに watchdog pseudo-end が出れば救済動作中(watchdog ignored (high loss) ならロス過大で救済対象外) |
| 時報・定時が出ない | ナイトモード中 | ログに NightSkip が出ていれば仕様どおり。bot_setup.py -s で確認 |
| 30 分案内が出ない | TIME_SIGNAL_MODE が 2 でない | bot_config.json の TIME_SIGNAL_MODE を 2 に。放送回数の有効範囲も変わる |
| 起動アナウンスが出ない | V1.61 以前 | V1.62 以降に更新。起動ログのバージョンを確認 |
| 定時が夜間も出てしまう | 旧版(V1.60 以前)の可能性 | V1.69 へ更新。起動ログのバージョンを確認 |
TX_GAIN を変えても音量が変わらない | 設定変更後に再起動していない / 値が範囲外 | bot_setup.py かダッシュボードで設定し直して再起動。有効範囲は 0.0 超〜5.0 以下。不正値は等倍にフォールバック |
| カスタム音声にしたのに標準のまま | ファイル名・置き場所が違う | ls /opt/dvswitch_bot/cstm_*.wav で名前と場所を確認(カスタム音声の節を参照) |
| ログに「フォールバック」と出る | カスタム ON だがファイルが無い | ファイルを置けば再起動なしで反映される(カスタム音声の節を参照) |
| test_send で音が崩れる | Bot と二重送信 | 先に sudo systemctl stop dvswitch-bot してからテスト |
| 音声を作り直したら失敗した | 読み間違い・変換ミス等 | sudo ./create_wav.sh -r で前の WAV に戻す |
| md380-emu が SEGV | qemu が新しすぎる | qemu-user-static を 5.2 系に固定(apt-mark hold) |
よく使うコマンド早見表
サービス操作
sudo systemctl status dvswitch-bot --no-pager sudo systemctl restart dvswitch-bot sudo systemctl stop dvswitch-bot sudo systemctl start dvswitch-bot
ログ
sudo journalctl -u dvswitch-bot -f sudo journalctl -u dvswitch-bot -n 50 --no-pager
設定
sudo python3 /opt/dvswitch_bot/bin/bot_setup.py sudo python3 /opt/dvswitch_bot/bin/bot_setup.py -s sudo nano /opt/dvswitch_bot/bot_config.json sudo systemctl restart dvswitch-bot
音声
cd /opt/dvswitch_bot/bin && sudo ./create_wav.sh cd /opt/dvswitch_bot/bin && sudo ./create_wav.sh -r python3 /opt/dvswitch_bot/bin/test_send.py /opt/dvswitch_bot/001.wav
DVSwitch 設定
cd /opt/dvswitch_bot/bin && sudo ./dvs_config.sh cd /opt/dvswitch_bot/bin && sudo ./dvs_config.sh -r
バージョン確認
grep -n '^version' /opt/dvswitch_bot/bin/dvswitch_bot.py
関連サービス
sudo systemctl status md380-emu --no-pager sudo systemctl restart analog_bridge mmdvm_bridge md380-emu
対象:Raspberry Pi OS Bookworm、DVSwitch-Server、デーモン分離版 V1.69
配置:
/opt/dvswitch_bot/bin/📝 執筆:JJ2TAB(尾張旭 DMR デジピーター 管理人)
🏛 JJ2YYK あいちデジタルコミュニケーションハムクラブ