MeshCore Remote Terminal を使い始める
この wiki では、Remote Terminal for MeshCore(RemoteTerm)を紹介し、MeshCore デバイスがメッセージを送信するためのインターフェースを提供します。本チュートリアルでは、Seeed XIAO ESP32S3 & SX1262 Kit をコンパニオン無線機として使用し、Raspberry Pi Zero 2W 上で RemoteTerm を実行するための基本的なセットアップを説明します。これにより、パワーユーザー向けのコンパクトなオールインワン MeshCore ソリューションが実現します。
RemoteTerm の概要
RemoteTerm は、MeshCore デバイスを接続したサーバー上で動作するオープンソースアプリケーションです。

これによりローカル MeshCore ネットワークへのインターフェースが提供され、同じローカルネットワーク上の任意のデバイス(オフグリッドであっても)が無線経由でメッセージを送受信できるようになります。RemoteTerm はモバイル端末との相性が非常に良く、次のような追加機能を利用できます:
- 受信したすべてのパケットのキャッシュ
- 複数の Python ボットの実行
- 無制限のコンタクトとチャンネルの監視
- ネットワークまたは VPN 経由で無線機へリモートアクセス
- パケットを MQTT、SQS、Apprise などへ転送
- メッシュノードマップの可視化
セットアップ
ハードウェア
| XIAO ESP32S3 & Wio-SX1262 Kit | Raspberry Pi Zero 2W |
|---|---|
![]() | ![]() |
メインハードウェアに加えて、以下のアクセサリが必要です:
- 16GB 以上の MicroSD カード
- USB Micro - USB-C ケーブル(無線機を接続するため)
- USB Micro - USB-A または USB-C ケーブル(Raspberry Pi に給電するため)
- Raspberry Pi 用の安定した電源(5V 2.5A 推奨)
無線機のセットアップ
- Seeed の XIAO ESP32S3 ボード と SX1262 モジュールを B2B カプラで接続します。
- LoRa アンテナを SX1262 に取り付けます。
- コンピュータに接続し、web flasher を使って "Seeed Studio Xiao S3 WIO"(Serial Companion)を書き込みます。

このチュートリアルでは、シリアルコンパニオンのセットアップ方法を説明します。TCP および Bluetooth コンパニオンも RemoteTerm でサポートされていますが、セットアップはやや複雑です。
Pi のセットアップ
- ここをクリックして Raspberry Pi Imager をダウンロードします
- Imager を開き、Raspberry Pi のモデルを選択し、「Raspberry Pi OS Lite (64 bit)」を選択します
- SSH をパスワード(必要に応じて鍵)で有効化し、Wi-Fi 接続を設定します
- ESP32 MeshCore を Raspberry Pi に接続します
ESP32 LoRa Mesh ノードが POWER ポートではなく USB に接続されていることを確認してください

右角アダプタを使用した完全な組み立ては、次のようになります:

- Pi の
POWERポートに電源を接続します - 自宅のルーターの管理インターフェースを使用して、Raspberry Pi に割り当てられたアドレスを確認します。IP アドレスが変わらないように DHCP 予約を割り当てることを検討してください。
Pi の設定
- Raspberry Pi へ SSH セッションを開きます
- 無線機が認識されていることを確認します。
find /dev/serial/by-id -maxdepth 1 -type l -print | sortを実行すると、/dev/serial/by-id/usb-Espressif_USB_JTAG_serial_debug_unit_XX:XX:XX:XX:XX:XX-if00のような一覧が表示されるはずです - 更新とアップグレードを行います
sudo apt update # update package repositories
sudo apt upgrade -y # upgrade packages
sudo apt-get install -y git # install git
curl -fsSL https://get.docker.com | sh # install docker - クローンと起動
git clone https://github.com/jkingsman/Remote-Terminal-for-MeshCore.git
cd Remote-Terminal-for-MeshCore/
# configure the docker setup
./scripts/setup/install_docker.sh
設定オプションの解説
README と ブログ には、より詳細なセットアップ手順が記載されています
サーバーの起動
設定
セットアップスクリプトで dockerfile の設定が完了したら、次を実行します
sudo docker compose up -d
これでサーバーが起動します。次のコマンドも役に立つかもしれません:
sudo docker compose up -d # start RemoteTerm in the background
sudo docker compose logs -f # follow the container logs live
sudo docker compose down # stop and remove the running container
sudo docker compose restart # restart the container without changing the image
sudo docker compose pull && sudo docker compose up -d # upgrade to the latest published image and restart
RemoteTerm は無線機を完全に管理します。つまり、一度無線機を RemoteTerm に接続すると、すべてのコンタクト/チャンネルが RemoteTerm にインポートおよびオフロードされ、実際にデバイスと同期されるコンタクトは RemoteTerm によって制御されます。
ホットスポット設定(オプション)
これは任意の設定であり、自宅から離れて使用する無線機にのみ推奨されます。この設定を行うと、無線機は自宅の Wi-Fi から切断されますが、自身の Wi-Fi をブロードキャストし始めるため、インターネット接続がなくてもアクセスできるようになります。
-
ホットスポットを設定します
sudo nmcli device wifi hotspot ssid <hotspot name> password <hotspot password> ifname wlan0 -
新しい Wi-Fi ネットワークに接続し、再度 Pi に SSH 接続する必要がある場合があります。Pi の URL は、新しいネットワークに接続した際の Wi-Fi 設定における「デフォルトゲートウェイ」となります。
-
起動時にホットスポットをブロードキャストするように設定します
nmcli connection
# grab the UUID of the Hotspot connection
sudo nmcli connection modify <hotspot UUID> connection.autoconnect yes connection.autoconnect-priority 100
RemoteTerm を使い始める
メイン画面

RemoteTerm のメイン画面には、既知のチャンネル、リピーター、ルームサーバーの一覧が表示され、上部にはお気に入り用のスペースがあります。任意のコンタクトまたはチャンネルをクリックするとメッセージの送受信を開始でき、リピーターをクリックするとログインして管理インターフェースを表示できます。画面上部の緑色のボタンからチャンネルやコンタクトを追加できます。
コンタクトリストの上には、次のツールがあります:
| 一般項目 | 機能 |
|---|---|
| Packet Feed | 受信した生パケットを到着順に表示 |
| Node Map | ノードの位置を可視化 |
| Mesh Visualizer | ノードとトラフィックをリアルタイムに 3D 表示するカスタマイズ可能なビジュアライザ |
| Trace | リピーター間でマルチホップトレースを実行し、信号強度情報を取得 |
| Message Search | チャンネルおよびメッセージ履歴から単語やフレーズを検索 |
| Channel Finder | 復号されていないが受信されたパケットに対して、チャンネル名を特定するチャンネルファインダー |
メッセージング(チャンネル)
チャンネルを作成または参加するには、アプリのメインメニュー左上にある「Add Channel/Contact」ボタンをクリックします。キーのみで識別されるプライベートチャンネルや、名前を #hashtag として指定する Hashtag チャンネルには、表示されるメニューから参加できます。
Public チャンネルは、すべての新しい RemoteTerm インスタンスに自動的に追加されます。ローカルメッシュには、Public、#test や #testing、#bots や #bot など、アクティブなチャンネルが存在することが多いでしょう。これらは、使い始めたり、初心者向けの良いローカルルームを案内してくれる人を見つけたりするのに適した場所です。
チャンネルを選択すると、画面は次のようになります:

ステータスバーには次の項目があります:
| アイコン | 機能 |
|---|---|
![]() | 通知を設定します。デスクトップ通知(ブラウザを開いている必要があります)または Web Push(ブラウザを閉じていても配信可能)を選択できます。これらには信頼された HTTPS コンテキストが必要です(インストーラーで利用可能な snakeoil 証明書が通知に十分かどうかは、OS やブラウザによって異なります) |
![]() | リージョナルルーティングのオーバーライドを有効にし、このチャンネルでメッセージを送信する際に無線機の地域的な範囲を制限します。対応する、または異なるリージョン設定を持つユーザーは、それぞれあなたのメッセージを表示したり自動的に無視したりできます |
![]() | 無線機のデフォルトとは別に、チャンネルごとのホップ幅オーバーライドを設定できます |
![]() | チャンネルをお気に入りに追加または削除します |
![]() | チャンネルを削除しますが、後で再追加した場合に備えてメッセージ履歴は保持されます |
| Room Key | 指定されたルームの MeshCore キーを表示します |
左上隅にはチャンネル名と情報アイコンがあり、これをクリックすると、そのチャンネルがどれくらいアクティブか、誰がメッセージを送信しているか、そのキー(上部ステータスバーの「Show key」テキストをクリックしても確認できます)など、チャンネルに関する情報を表示できます:

メッセージング(ダイレクトメッセージ)
ダイレクトメッセージの送信は、いくつかの異なるオプションがある点を除けば、チャンネルメッセージと同様に動作します。
| アイコン | 機能 |
|---|---|
![]() | メッセージがたどるのにより理想的なルーティングパスを見つけるために、コンタクトに対してルーティングされたプローブを送信します |
![]() | リモートおよびローカルのSNRデータを含むダイレクトトレースをコンタクトに送信します |
![]() | 通知を設定します。デスクトップ通知(ブラウザを開いておく必要があります)またはWeb Push(ブラウザが閉じていても配信可能)を選択できます。これらには信頼されたHTTPSコンテキストが必要です(インストーラから利用できるsnakeoil証明書が通知を許可するのに十分かどうかは、OSとブラウザによって異なります) |
![]() | コンタクトをお気に入りに追加または削除します |
![]() | 会話を削除しますが、後で再度追加することを選択した場合に備えて、過去のメッセージは保持されます |
| Contact Key | 指定されたコンタクトのMeshCoreキーと、最後に検知されたタイミング(アドバタイズ、メッセージなど)、およびその方法(ダイレクトか、パケットがたどった経路か)に関する情報を提供します |
チャンネルと同様に、選択したコンタクトの上部バーにある情報アイコンまたは名前をクリックすると、そのコンタクトの分析情報を表示できます。
MQTT と自動化
RemoteTermは、自動化システム向けの豊富な統合機能を提供する点で優れています。統合機能は、特定の種類のパケットが検知されたとき(たとえば、チャンネルでメッセージが送信されたときやDMが受信されたとき)にアクションを実行します。これには次のものが含まれます:
- MQTT、パケットをMQTT経由で次の宛先に転送:
- プライベートブローカー
- コミュニティアグリゲータ
- Home Assistant
- Webhook、メッセージデータを含むGETまたはPOSTリクエストを特定のURLに送信
- Apprise、Discord、Telegram、SMS、メールなどに転送できる柔軟な通知ファンアウトツール
- Amazon SQSキューへのパケットまたはメッセージのエンキュー
- Pythonボット
コミュニティメッシュマッピングのセットアップ
MeshCoreノードの位置、メッセージの流れのパターン、接続性の内訳などを表示することは、MeshCoreネットワークを構築するうえでコミュニティに役立ちます。このデバッグビューを提供するために、コミュニティアグリゲータは オブザーバ からの生パケットフィードを取り込みます。
RemoteTermを使うと、メッセージの送受信に使用しているのと同じ無線機を、オブザーバノードとしてこれらのコミュニティマッピングおよび可視化の取り組みに貢献するために簡単に利用できます。
MeshCoreは、MQTTノード経由でメッセージがメッシュに入ることを 許可しません。コミュニティの可観測性の取り組みは読み取り専用です。
コミュニティオブザーバプラットフォームは多数ありますが、LetsMesh はより一般的なものの1つであり、ここではそれをセットアップします。
- ここをクリックしてLetsMeshにアクセスし、LetsMesh analyzerにログインします。
- RemoteTermで「Settings」に移動し、「MQTT & Automation」をクリックします。
- 「Add Integration」をクリックし、左側のリストから「LetsMesh (US)」を選択します。

- 「Create」をクリックします。
- LetsMeshへのサインアップに使用したものと同じメールアドレスを入力し、最寄りの空港のIATAコードを入力します。
- 「Save as Enabled」をクリックします。
緑色の点と「Connected」ステータスが表示されるはずです。正常な統合は次のように表示されます:

代わりに琥珀色の点が表示される場合は、「Edit」ボタンの横にある「ⓘ」記号をクリックしてエラーを確認してください。
次に、このリンクに移動します。約15分以内に、そこであなたの無線機が緑色で表示され、自身のテレメトリとパケットがLetsMeshに転送されているのが確認できるはずです!

ボット
RemoteTermは、自分自身のボットをプログラムするためのインターフェースを提供します。ボットは、コンタクトまたはチャンネルからメッセージを受信するたびに実行されるシンプルなPythonコードで構成されます。
ボットは他のメッセージに応答して自動トラフィックを生成します。これは、ボットがメッシュをフラッディングしたり無限ループしたりしないよう、慎重に記述する責任が あなた にあることを意味します。
シンプルなサイコロロールボットのセットアップ
ここでは、標準形式で要求された(例:「3d6」は6面ダイスを3回振ることを意味します)シンプルなサイコロロール機能を持つボットを構築するためのチュートリアルを示します。手順は次のとおりです:
- RemoteTermで「Settings」に移動し、「MQTT & Automation」をクリックします。
- 「Add Integration」をクリックし、左側のリストから「Python Bot」を選択します。
- 「Create」をクリックします。
- 「Dice Bot」のように、わかりやすい名前をボットに付けます。
- エディタからコードを消去し、代わりに次のコードを貼り付けます:
import random
import re
def bot(**kwargs) -> str | list[str] | None:
"""Dice roller — responds to !dice NdS in #bot only."""
sender_name = kwargs.get("sender_name")
message_text = kwargs.get("message_text", "")
channel_name = kwargs.get("channel_name")
is_outgoing = kwargs.get("is_outgoing", False)
if is_outgoing or channel_name != "#bot":
return None
match = re.match(r"^!dice\s+(\d+)d(\d+)$", message_text.strip())
if not match:
return None
count, sides = int(match.group(1)), int(match.group(2))
if count < 1 or count > 20 or sides < 2 or sides > 100:
return "I don't know how to roll that! [1-20]d[2-100]"
rolls = [random.randint(1, sides) for _ in range(count)]
parts = " + ".join(str(r) for r in rolls)
name = sender_name or "Someone"
return f"@[{name}] rolled {parts} = {sum(rolls)}"
- 「Save as Enabled」をクリックします。
別の無線機を使用して #bot ルームに移動し、サイコロロールをリクエストします(例:「3d6」)。出力は次のようになります:

期待どおりに応答が表示されない場合は、Dockerコンテナからサーバーログを確認し、Pythonコードの実行時にエラーが報告されていないか確認できます。
パス幅ボットのセットアップ
MeshCoreファームウェア v1.14+ では、メッセージがメッシュをどのように通過するかに大きな変更が加えられました。互換性のあるルーターを通過するパケットは、マルチバイトのホップ識別子を運ぶことができるようになりました。
自分のメッセージにマルチバイトパスが関連付けられているかどうかを判断するのに役立つボットを作成できます。このスクリプトは、ホップ幅メッセージとパケットホップデータ自体を提供することで、複数のメッセージを応答として送信する機能を利用します。
def bot(**kwargs) -> str | list[str] | None:
"""Report the sender's path hop width in #bot."""
sender_name = kwargs.get("sender_name")
message_text = kwargs.get("message_text", "")
channel_name = kwargs.get("channel_name")
is_outgoing = kwargs.get("is_outgoing", False)
path = kwargs.get("path")
path_bytes_per_hop = kwargs.get("path_bytes_per_hop")
if is_outgoing or channel_name != "#bot":
return None
if "!hopwidth" not in message_text.lower():
return None
name = sender_name or "Someone"
if path_bytes_per_hop is None or not path:
return f"@[{name}]'s hop width is unknown (no path data)"
hop_count = (len(path) // 2) // path_bytes_per_hop
if path_bytes_per_hop == 1:
msg = f"@[{name}]'s hops are 1 byte wide; they might not be on 1.14+ or there may be incompatible repeaters in the path."
else:
msg = f"@[{name}]'s hops are {path_bytes_per_hop} bytes wide; they are using firmware v1.14+!"
return [msg, f"Heard via {hop_count} hop{'s' if hop_count != 1 else ''}"]
MeshCoreチャンネルメッセージをDiscordに転送する
Apprise はRemoteTermでサポートされている柔軟な通知サービスです。Appriseを使用すると、DiscordからTelegram、SMS、メールなど、数百の通知サービスの1つまたは複数を選択して、チャンネルまたはダイレクトメッセージを送信できます。

例として、特定のMeshCoreチャンネル内のすべてのメッセージを、RemoteTerm経由でDiscordに転送するためにAppriseを使用します。
- 管理者権限を持つDiscordのチャンネルを開きます。
- チャンネル名を右クリックし、「Edit Channel」をクリックします。
- 左側のメニューで「Integrations」をクリックし、「Create Webhook」をクリックします。
- Webhookに適切な名前を付け、Webhook URLをコピーします。Webhookは
https://discord.com/api/webhooks/<WebhookID>/<WebhookToken>の形式になっている必要があります。

- RemoteTerm で "Settings" に移動し、"MQTT & Automation" をクリックします。
- "Add Integration" をクリックし、左側のリストから "Apprise" を選択します。
- "Create" をクリックします。
- 入力欄に通知 URL を追加します。Apprise の Discord ドキュメント によると、これは
discord://{WebhookID}/{WebhookToken}/の形式である必要があります。コピーした URL から WebhookID と WebhookToken を使用します。 - 利用可能な場合に、設定済みの名前とアバターを使用してユーザーのアイデンティティを保持するかどうかを選択します。
- メッセージにルーティングパスデータを含めるかどうかを選択します(無効化を推奨)。
- Discord に転送したい連絡先/チャンネルを選択し、"Save as Enabled" をクリックします。

有効化されると、メッセージのフローが始まるはずです。問題が発生したり、期待したメッセージが表示されない場合は、サーバーログで報告されたエラーを確認するか、すべてのチャンネルを有効にして、少なくとも RemoteTerm ↔ Discord 間の連携が動作していることを確認してください。

RemoteTerm を Home Assistant と連携する
Home Assistant は、使いやすく強力なホームオートメーションのためのフレームワークを提供します。RemoteTerm は、組み込みの MQTT 連携機能を通じて Home Assistant と統合できます。この連携により、メッセージに基づいてオートメーションをトリガーしたり、中継器やローカル無線のテレメトリを監視したり、アドバタイズ内の GPS によって連絡先を追跡したりできます。
中継器テレメトリ追跡を活用するには、目的の中継器を自動テレメトリ取得に登録する必要があります。一度登録すると、RemoteTerm は設定可能な間隔でテレメトリを要求し、履歴値を保持するとともに、最新の値を Home Assistant で参照できるようにします。

自動中継器テレメトリ取得にはカスタマイズ可能な間隔があります。1 時間に 1 回から 1 日に 1 回までの頻度を選択できますが、自動取得は 24 時間あたり 24 回を超えることはできません。

追跡対象の中継器を希望どおりに設定し、Home Assistant で MQTT Discovery が有効になったら、RemoteTerm でインテグレーションを設定してデータフローを開始できます。
- RemoteTerm で "Settings" に移動し、"MQTT & Automation" をクリックします。
- "Add Integration" をクリックし、左側のリストから "Home Assistant MQTT Discovery" を選択します。
- "Create" をクリックします。
- MQTT ブローカー情報を入力します。ホストとポートに加え、該当する場合はユーザー名/パスワード/TLS 設定も入力します。
- Home Assistant でアドバタイズの GPS 位置情報を通じて追跡したい連絡先を選択します。
- Home Assistant で表示したいテレメトリ追跡中継器を選択します。
- Home Assistant 内でトリガーに使用するメッセージスコープを選択します。
- "Save as Enabled" をクリックします。
RemoteTerm のインテグレーション設定画面には、「What gets created in Home Assistant」と「Published Topic Summary」のドロップダウンに、作成されるトピック/エンティティが正確に表示されることに注意してください。
追跡対象の連絡先と中継器は Home Assistant 内にエンティティを作成します。Home Assistant が煩雑になるのを避けるため、関心のある連絡先のみに選択を絞りたい場合があるかもしれません。
メッセージイベントはエンティティを 作成せず、トリガーにのみ使用されます。すべてのメッセージを Home Assistant に流すことについては、一般的に問題はありません。
新しいエンティティを表示するには、Home Assistant の Web インターフェースにログインします。"Settings" をクリックし、次に "Devices & Services"、続いて "MQTT" をクリックします。追跡対象のエンティティが表示されるはずです。

それらをクリックして、利用可能なメトリクスを表示します。中継器の場合、最新の有効なメトリクスが表示されます。自動テレメトリ取得を有効にしたばかりの場合は、すべての中継器および無線テレメトリフィールドが Home Assistant 内で埋まるまで、最大 8 時間待つ必要があるかもしれません。

追加の設定ガイダンスについては、RemoteTerm リポジトリ内の README_HA.md を参照してください。たとえば、「Full monitoring dashboard with message feed」の手順に従うと、次のようなダッシュボードを利用できます:

次のステップ
公式 MeshCore Discord に参加し、RemoteTerm の開発スレッド をフォローすることで、RemoteTerm の開発状況を常に把握したり、質問したりできます。コードベースは頻繁に更新されており、Changelog で最新リリースを確認できます。そしてもちろん、RemoteTerm は永遠に無料・広告なし・オープンソースです — GitHub でスターを付けてください。








