VE6SLP / Projects

Operate a node

Connect to your node, check its roles and radio, manage saved state and follow traffic and repeater health.

Check your node

  1. Open the dashboard

    For Aspen, open http://NODE_IP/ and sign in at /admin for changes. For Willow, open your configured dashboard address. Check ready roles, the shared radio profile and connected clients.

  2. Connect the app

    Use the companion address and port 5000. Send an advert, then a private !ping to the bot. Expect Pong. App connection steps

  3. Check the service you need

    Use !help for bot commands, the room's login/history controls for conversations, and radio counters for queue and airtime. If a connection fails, inspect that service's client count and last error.

Change node settings · Backups and restarts · Update while keeping state · Add a command

Shared radio and airtime

The shared modem owns tuning, channel access and the transmit queue. It hands every received packet to each role and schedules their outgoing packets against shared capacity and airtime limits. The selected image sets how many roles and KISS connections it accepts.

What transmit status means
StatusMeaningWhat to do
QueuedThe modem accepted the packet and is waiting for airtime.Wait for a result.
ConfirmedThe radio sent the packet.Look for a recipient ACK or reply to confirm delivery.
UncertainThe connection or modem failed before a result arrived; the packet may or may not have been sent.Check status before sending again. Uncertain packets are not replayed automatically after reconnecting.

Local reflections: when one role transmits, the other roles on the same node receive a copy labelled as a local reflection. RF receptions carry measured RSSI and SNR. Use a recipient ACK or reply to check whether another radio received your transmission.

Adaptive bot admission (opt-in) reduces bot work as local RF load and queues grow, sharing the allowance fairly among callers. Enable it through owner administration and restart; bot adaptive reports the saved setting and live load. On a host, use adaptive on the owner socket.

A second repeater on the same mesh can duplicate forwarding and use extra airtime. Place repeaters deliberately.

RF load and capacity measurements: received replies, room delivery, queues, airtime and memory during mixed traffic.

Roles and identities

Each role is a separate MeshCore node with its own key. A standalone ESP32 runs one of each built-in role; a Go host can run additional instances. Pine pairs its repeater with the Lua bot.

Who owns what
RoleOwnsNotes
Shared modemTuning, channel access, transmit queue and airtimeRole keys stay with the roles.
RepeaterIts key and settingsForwards eligible RF traffic.
RoomIts key, login policy, members and recent historyRoom passwords are separate from administrator passwords.
Companion (Base)Its key, contacts, channels and messagesEvery app on this endpoint shares the identity. Uses companion protocol 14.
Command botIts key, installed program and stored dataUses its own identity and permissions.
ManagementNode-wide administration and radio settings (ESP32)Requires its own administrator authorization.
ObserverIts key, for publishing RF receptions to MQTTRole metadata stays on separate topics.

Names and role settings change without rebuilding. Changing an identity needs owner authority, and private data stays tied to the full key that created it. The MeshCore Android app connects over WiFi TCP, exchanges direct and room messages, and administers repeater and room roles you are authorized for.

What survives a restart

Kept

  • Role keys and saved settings
  • Installed bot programs and the previous version for rollback
  • Stored data for each caller, conversation, channel and bot
  • Timers and reminder records

Starts fresh

  • Lua global variables and running jobs
  • Contacts and routes the bot learned in memory; advertise again to restore them
  • Pine's trusted time and BLE pairings

Stored data stays with the full identities it belongs to, through name and program changes. Rolling back a program changes the code and leaves stored data and timer claims as they are.

Each reminder can be sent at most once. Restoring a backup does not re-arm reminders that were already sent or whose send was uncertain. A pending reminder needs trusted time and a fresh route, and expires after a 60-second delivery window.

Use an encrypted node backup before maintenance. Keep the operator seed needed to inspect it in private storage.

Administer a node

Over LoRa: open Management, install a command and use admin controls

Administration paths
NodeWhereStart with
Standalone ESP32Authenticated RF Management, or http://NODE_IP/admin on a trusted LANRoles, Shared radio and Programs sections
Go hostOwner Unix socket on the host, or host browser administrationhttp://127.0.0.1:9080/status
Willow Hew hostOwner-only owner.sock and admin.sock; separate native dashboardpython3 -B tools/willow.py health --state /path/to/private/willow
PinePine-Relay's administrator console in the MeshCore app, over RFbot status, bot limits, source status

Aspen controls cover role selection, names, radio settings, grants, program installation, rollback and scoped backups. Program transfers over RF can resume through ordinary MeshCore repeaters. Willow's local controls cover its supported role and bot settings, not shared modem tuning; consult its service guide before a change.

  • Check before rebooting. Compare saved and applied settings first. A radio change affects every role on that modem.
  • After a timeout, read status before repeating an install or restore; the first request may have completed.
  • Before maintenance, keep program and scoped data backups. For an unreadable filesystem, use the platform's recovery procedure to preserve recoverable state.

Keep local services private. KISS, companion TCP and the ESP32 dashboard and /admin page use plain HTTP or TCP, so credentials and backups are visible to anyone on that network. Use them on a trusted LAN or protected tunnel, and import secrets over encrypted RF or the host's owner socket. Plain MQTT also needs a trusted network.

RF management and owner CLI · ESP32 browser administration · Go host status and owner socket · Willow service and owner controls

Watch the traffic

The observer publishes RF receptions to your MQTT broker as observer-v1 messages with upstream-compatible packet fields and hashes. Packets and status use meshcore/IATA/UPPERCASE_OBSERVER_KEY/{packets,status}; role metadata uses separate lowercase-key topics.

  • The packet feed contains RF receptions only. Local transmissions and reflections are kept separate.
  • Aspen publishes with QoS 0 and a bounded queue. Go and Willow host observers use QoS 1; broker acknowledgement confirms publication, not subscriber processing. Host retries can redeliver a packet. Willow checkpoints its pending and queued observations after 30 seconds of dirty state and flushes on a controlled stop; crash recovery resumes from the last completed checkpoint, so recent events can be lost or replayed.
  • Connect over MQTT on a trusted LAN, or WSS with CA and hostname checks. Send packets only to a broker you trust with your traffic.
  • Configure Aspen’s observer destination and credentials using its observer guide.
  • Willow accepts your broker's hostname, IPv4 or bracketed IPv6 address in observer.url. TCP, TLS, WS and WSS use the existing publisher; TLS verifies the certificate and hostname. Keep credentials in their separate private settings and run the offline state check before restarting.

The KISS monitor decodes serial or TCP traffic, and the node dashboard shows roles, connections, queues, airtime and memory. For history, import the Grafana dashboard and select your Prometheus data source; the ESP32 telemetry publisher feeds resource panels and a companion bot can poll traffic and repeater status.

Aspen observer setup · Willow observer setup · Grafana dashboard import · Dashboard JSON

Operating Pine

On XIAO nRF52840 + Wio SX1262, Pine runs the shared Lua engine beside a native repeater, with separate repeater and bot identities. It supports custom commands, personal notes, stored data, events, timers and mesh operations.

  • Limits: two Lua job slots (at most one for custom or event work, so built-in commands keep capacity), 4,096-byte programs and a 48 KiB Lua memory quota. Check bot limits before installing a program.
  • Trusted time: after each restart, an authenticated administrator sends bot time UNIX_SECONDS, and refreshes it at least hourly. Reminders and other deadlines wait in storage until time is set.
  • Radio counters: bot radio shows queued, confirmed and failed or uncertain transmissions and RF time.
  • BLE (optional): a MeshCore companion app can pair over BLE as Pine-Bot, using a locally set six-digit PIN. Pairings clear on restart; forget the old pairing on the phone and pair again. Repeater administration uses its separate authenticated console.

Pine production Lua · Pine notes and BLE

For a RAK4631 node, use the native repeater and notes-bot profile. The RAK13800 Ethernet option accepts MeshCore companion connections on port 5000.

ESP32 memory and flash

Full Aspen needs PSRAM and room for two application slots. The XIAO ESP32-S3R8 uses 8 MB flash; other board layouts are described in the board guide.

  • Lua has a 96 KiB memory cap per program state.
  • Wasm reserves a 1 MiB PSRAM interpreter pool on first use, kept until restart, plus 64 KiB of program memory per instance.
  • The radio, WiFi, TLS and task stacks also need internal RAM.

Measured build sizes and memory budget

Continue