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 カプラで接続します。
- SX1262 に LoRa アンテナを取り付けます。
- コンピュータに接続し、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 ノードが USB ポートに接続されており、POWER ポートではないことを確認してください

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

- 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 という名前で識別されるハッシュタグチャンネルには、表示されるメニューから参加できます。
Public チャンネルは、すべての新しい RemoteTerm インスタンスに自動的に追加されます。ローカルメッシュには、Public、#test や #testing、#bots や #bot など、アクティブなチャンネルがいくつか存在する可能性があります。これらは、使い始めたり、新規ユーザー向けの良いローカルルームを案内してくれる人を見つけたりするのに適した場所です。
チャンネルを選択すると、画面は次のようになります:

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

メッセージング(ダイレクトメッセージ)
ダイレクトメッセージの送信はチャンネルメッセージと同様に動作しますが、いくつか異なるオプションがあります。
| アイコン | 機能 |
|---|---|
![]() | メッセージがたどるのにより理想的なルーティングパスを見つけるため、コンタクトにルーティングプローブを送信します |
![]() | コンタクトに対して、リモートおよびローカルのSNRデータを含むダイレクトトレースを送信します |
![]() | 通知を設定します。デスクトップ通知(ブラウザを開いておく必要があります)またはWeb Push(ブラウザが閉じていても配信可能)を選択できます。これらには信頼されたHTTPSコンテキストが必要です(インストーラから入手できるsnakeoil証明書が通知を許可するのに十分かどうかは、OSとブラウザによって異なります) |
![]() | コンタクトをお気に入りに追加または削除します |
![]() | 会話を削除しますが、後で再度追加する場合に備えて履歴メッセージは保持されます |
| コンタクトキー | 指定されたコンタクトの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 はその中でも人気の一つであり、ここではこれをセットアップします。
- ここをクリックして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、メールなど、数百種類の通知サービスの一つまたは複数を選択して、チャンネルメッセージやダイレクトメッセージを送信できます。

例として、特定の 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」の手順に従うと、次のようなダッシュボードを利用できます:

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








