πŸ“Œ This is Part 2 of the series. Part 1: Theory explains why this matters.


πŸ“¦ Unboxing and Preparation

Heltec V4 Contents

ComponentPurpose
Board ~60Γ—30 mmESP32-S3R2 + SX1262, OLED 128Γ—64, USB-C
Antenna (IPEX)Connect to ANT port - mandatory!
USB-C cablePower + flashing + debugging
Pins (optional)For external sensors/antennas

⚠️ Important: without antenna connected, the radio module may be damaged. Always attach antenna before powering on.

Heltec V4 Specifications

ComponentDescription
MCUESP32-S3R2 (WiFi + Bluetooth)
LoRa TransceiverSemtech SX1262
Frequencies863–870 MHz (EU), 902–928 MHz (US)
Display0.96" OLED 128Γ—64
PowerUp to +28Β±1 dBm (High Power option)
Power SupplyUSB-C + optimized LiPo management
ConnectorsUSB-C, U.FL/IPEX for LoRa, 1.25-8Pin GNSS, 1.25-2Pin Solar
Form FactorPin-compatible with V3/V3.1

⚑ Flashing: Web Flasher

Official flasher: https://flasher.meshtastic.org

Requirements

RequirementWhy
Chromium-based browser (Chrome, Edge, Brave)Web Serial API works only there
Serial port accessOn Linux - user must be in dialout group
Battery disconnectedDuring flashing - USB power only

🐧 Linux: Serial Port Permissions

If you see:

[09:52:42.841] Serial: serial_io_handler.cc:157 Failed to open serial port: FILE_ERROR_ACCESS_DENIED

Fix:

# Add user to dialout group
sudo usermod -a -G dialout $USER

# Apply changes (re-login or)
newgrp dialout

# Verify access
ls -l /dev/ttyUSB*  # or /dev/ttyACM*

πŸ”§ Flashing Process

  1. Disconnect battery and USB from the board
  2. Open web flasher, select:
    • Device: Heltec V4
    • Firmware: 2.7.21 (or latest stable/beta)
    • Variant: Full erase and install
  3. Click Erase Flash and Install
  4. Hold the PRG button on the board
  5. While holding PRG, plug in the USB cable
  6. Observe: brief red flash β†’ USB JTAG appears in port dropdown
  7. Release PRG, select USB JTAG, click Connect
  8. Wait for flashing to complete (terminal shows progress)
  9. After Leaving... message, press the RST button (reset)

πŸ’‘ If flasher doesn’t detect the port - try another cable (not all support data), another USB port, or restart the browser.


πŸ”Œ First Connection: Three Ways

After flashing, the board reboots and starts Meshtastic.

Connection Options

InterfaceHow to ConnectWhen to Use
BluetoothMeshtastic app (Android/iOS) β†’ scan devicesPortable node, one active connection
Wi-FiNode creates AP β†’ connect to your network β†’ IP shown on screenStationary node, multiple devices simultaneously
USB/COMConnect via terminal (PuTTY, screen)Home node, debugging, direct access

⚠️ Bluetooth: only one active connection.
Wi-Fi: multiple devices can connect simultaneously (convenient for stationary nodes).
USB: reliable for setup and debugging, no wireless connection required.

  1. Install Meshtastic (Android) or the iOS version
  2. Launch the app and grant location and Bluetooth permissions
  3. Go to the “Devices” tab (router icon) β†’ select the connection type (Bluetooth, Wi-Fi, or Serial), depending on the node’s mode (default is Bluetooth) β†’ tap πŸ” Scan or + Add
  4. Confirm pairing

Setup via Wi-Fi

  1. The node’s screen will display an IP address (usually 192.168.1.x)
  2. Connect to the node’s Wi-Fi network (password shown on screen)
  3. Open a browser and go to http://<node_IP_address>
  4. The web interface allows viewing data (e.g. JSON messages), but node configuration is not done here. Use one of the following for full setup:
    • Meshtastic mobile app
    • MeshApp
    • Python CLI (meshtastic) over USB, BLE, or Wi-Fi

πŸ’‘ IP Address: node gets address from your router (not 192.168.4.1!). Exact address displayed on OLED screen.


πŸ‘€ User Configuration

Core Parameters

ParameterValueNote
Long Name[PE] ponfertatoFull node name, visible to all (up to 20 chars, Cyrillic allowed)
Short NameponfShort identifier in messages (strictly 4 chars, Latin only)
RoleCLIENT or CLIENT_MUTEFor cities with >200 nodes - CLIENT_MUTE (safe mode without rebroadcasting others’ packets)
Is Licensed (HAM)NoIf Yes β†’ disable MQTT encryption (regulatory requirement)

πŸ’‘ ShortName: exactly 4 characters! This appears in message headers. Examples: ponf, KST1, MOW2.

Additional Flags (Optional)

ParameterValueWhy
Show on mapYesAllow display on public maps (controlled via MQTT)
Ignore location requestsNoRespond to coordinate requests from other nodes

Advanced User Settings

ParameterValueNote
Public Key(auto-generated)Don’t change manually; used for encryption
Private Key(keep secret)Export and save securely on first setup
Admin Key(empty)Fill only for remote node management
Managed ModeNoDon’t enable without configured Remote Admin

🌐 MQTT Setup for ONEmesh (RU)

ONEmesh - map of Meshtastic devices in Russia. Connecting to their MQTT server lets your node appear on the map and exchange data with other participants.

πŸ” What’s transmitted via MQTT: text messages, device metrics (battery, signal), location (if enabled). Data goes to the map and regional Telegram chats per city settings.

Core Parameters

ParameterValueNote
MQTT Addressmqtt.onemesh.ruCommunity server (domain, not IP)
Port8883 (TLS) / 1883 (no TLS)Port auto-selected when TLS enabled
UsernameonemeshDefault; onemeshz / onemeshd for downlink
PasswordonecatShared for all project participants
Encryption enabledYesEncrypt MQTT traffic; requires PSK: AQ== in channel
JSON enabledNoNot needed for map, adds overhead
TLS enabledYesEncrypt connection; if errors β†’ try No + port 1883
Root topicmsh/RU/KSTKST = Kostroma city code (code list)
Proxy to clientYes (Bluetooth) / No (Wi-Fi)Not needed with direct Wi-Fi
Map reportsYesAllow sending reports for map display
I agreeYesConfirm geodata transmission rules
Precision729 mCoordinate precision on public map (~15 bits)
Map report interval3600 s (1 hour)Minimum report sending interval

πŸ’‘ Tip: if “Save” button is inactive - fill settings in stages: basics first (address, login, password), then map, then extra options.

Username Modes

UsernameDownlinkWhen to Use
onemesh❌ DisabledMost users - safe mode, uplink only
onemeshzβœ… Zero-hopIf you need internet data but won’t rebroadcast over radio (zero-hop policy)
onemeshdβœ… FullOnly for integrations, connecting network segments; not recommended for regular nodes - adds airtime load

⚠️ Using onemeshd with Downlink enabled can overload local network with internet packets. Use consciously and only with full understanding.

Advanced MQTT Parameters

ParameterValueNote
Connection Retry Interval30 secHow often to retry reconnect on drop
Keepalive Interval60 secConnection liveness check interval
QoS Level0Quality of Service: 0 = fire-and-forget (optimal for Meshtastic)
Retain MessagesNoDon’t retain last messages on broker
Topic Filtermsh/RU/KST/#Subscribe to subtopics (for integrations)

Common MQTT Issues

SymptomPossible CauseSolution
Connection refusedWrong login/password or portCheck onemesh/onecat, port 8883 with TLS
TLS handshake failedCertificate or time sync issueCheck NTP sync, temporarily disable TLS for test
No messages on mapWrong Root topic or PSKVerify: msh/RU/KST, channel with PSK: AQ==
MQTT disconnectedUnstable internet on node/phoneCheck connection, increase Map report interval
Message not appearingDownlink disabled on server for onemeshUse onemeshz if downlink needed

πŸ“‘ LoRa and Channel Settings

LoRa Section

ParameterValueWhy
RegionRussiaAuto-sets 433 MHz, power ≀20 dBm, and MQTT root topic
Modem PresetLongFastRange/speed balance for urban conditions
Frequency Slot2Public interval for RU868 (avoid conflicts)
Transmit Power20 dBmMax allowed for amateur use in RF
Boosted RX GainOnImproves weak signal reception (critical for urban)
Hop Limit5Max hops; enough for city, doesn’t overload airtime
Ignore MQTTNoAccept packets that came via internet (from MQTT neighbors)
OK to MQTTYes ⚠️Critical: allows neighbors to relay your data to OneMesh map

Advanced LoRa Parameters

ParameterValueNote
Bandwidth250 kHzChannel bandwidth; don’t change when using presets
Spreading Factor11Spreading factor; higher = farther but slower
Coding Rate5 (4/5)Error correction; balance reliability/speed
Frequency Offset0.0 HzCrystal frequency correction; change only for calibration
Override Duty CycleNoDon’t override airtime restrictions
SX126x RX Boosted GainOnHardware RX gain boost on SX1262

Channels - Detailed

Configure the Primary channel (index 0):

ParameterValueNote
RolePrimaryOnly one channel can be primary; device telemetry goes through it
NameLongFastExactly this: public network filters packets by this name
PSKAQ==Base encryption key for OneMesh (128-bit); required if MQTT encryption enabled
Uplink enabledYesSend data from this channel to MQTT server
Downlink enabledNoDon’t receive from MQTT (unless using onemeshz/onemeshd)
Position enabledYesTransmit coordinates via this channel
Precise locationNoHide exact coordinates from other nodes in channel
Precision182 mPosition precision transmitted in channel (~17 bits)
MutedNoDon’t mute channel (otherwise messages won’t be visible)

Secondary Channel (Optional, Index 1)

ParameterValueNote
RoleSecondaryAdditional channel for private groups or bots
Name[PE] BackupAny name <12 bytes (Latin)
PSK(generate your own)Private key for your group
Uplink / DownlinkNoDon’t send to public MQTT
PositionNoDon’t transmit coordinates in private channel
Precision45 mMaximum precision for private use

βœ… Important: at least one channel must have PSK: AQ== or be unencrypted for OneMesh server to accept packets.

πŸ’‘ Secondary channels are created via + in the app. They don’t interfere with main traffic and are useful for private communication.

Channel Management: Tips

  • Channel order: Primary must be first (index 0) - system telemetry goes through it.
  • Channel names: use Latin, no spaces or special characters.
  • PSK lengths: supported: 0 (no encryption), 8, 128, 256 bits. OneMesh requires AQ== (8-bit).
  • Export/import: channel settings can be exported to JSON for quick deployment on other nodes.

πŸ“ Position Settings

Fixed Coordinates (for Stationary Nodes)

ParameterValueRecommendation
Fixed positionOnFor nodes without GPS module
Latitude57.742Kostroma latitude, no trailing zeros (enter as 57.742, not 57.74200)
Longitude40.978Kostroma longitude, same as above
Altitude100Altitude above sea level (approx., in meters)

πŸ’‘ Coordinates stored as integer Γ— 1e7. In app, enter with 6 decimal places.

Position Packet - Intervals and Precision

ParameterValueWhy
Position broadcast interval7200 s (2 hours)Balance between map freshness and airtime load
Smart positionNoFixed interval more reliable for stationary node
Smart position min distance100 mMin distance to trigger smart broadcast
Smart position min interval300 sMin interval between smart broadcasts
Position flagsALTITUDE + TIMESTAMPTransmit only altitude and timestamp (less traffic)
Provide location to networkYesAllow coordinate transmission to network (controlled via OK to MQTT)

Advanced Position Settings

ParameterValueNote
GPS EnabledNoDisable if no module; saves power
GPS Update Interval60 secHow often to poll GPS (if enabled)
GPS Attempt Time0Don’t limit satellite search time
RX/TX/Enable GPIO0Pins for external GPS module (defaults)
Broadcast Smart Minimum Distance100 mMin movement to trigger smart broadcast
Broadcast Smart Minimum Interval300 secMin time between smart broadcasts

πŸ” For privacy: reduce Precision in channel (182 m) and Map precision (729 m), or set fixed coordinates away from real location.


βš™οΈ Additional Modules

Neighbor Info

ParameterValueNote
EnabledYesFor “Neighbors” layer on OneMesh map
Update interval14400 s (4 hours)Minimum interval, don’t reduce - extra airtime load
Transmit over LoRaNoDon’t transmit neighbor data over radio (only via MQTT)

πŸ—ΊοΈ Map will show layers “Who heard this device” and “Who this device heard” - useful for coverage analysis.

Device - Role and Rebroadcast

ParameterValueWhen to Use
RoleCLIENT_MUTEIn cities with >200 nodes - safe mode without rebroadcasting others’ packets
CLIENTIf network is small or you have good antenna/location - can help network
Rebroadcast modeCORE_PORTNUMS_ONLYRebroadcast only basic packet types (position, text) - optimal for city
ALLRebroadcast everything - only for tests or very small networks
Node info broadcast interval43200 s (12 hours)How often to broadcast info about yourself; 12h is enough for monitoring
Double tap as buttonNoPrevent accidental triggers
Disable triple clickYesPrevent false beacons
LED heartbeat disabledNoVisual operation indicator (LED blinking)

Advanced Device Settings

ParameterValueNote
Button GPIO0Button pin (default)
Buzzer GPIO0Buzzer pin (default)
Buzzer ModeALL_ENABLEDBuzzer mode: DISABLED, ALERTS_ONLY, ALL_ENABLED
TZDEFGMT-3Timezone for local time
Is ManagedNoManaged mode (only for admin nodes)
Serial EnabledNoSerial console (for debugging)
Debug Log APINoOutput debug logs (not for production)

Timezone

ParameterValueNote
TimezoneGMT+3 (Moscow)For correct time display in logs and timestamps
Use phone timezoneButtonPress to populate the timezone from the phone’s system settings

Power - for Stability

ParameterValueNote
Power Saving ModeNoStationary node with USB power
On Battery Shutdown After0 secDon’t shut down on power loss (if UPS present)
ADC Multiplier Override1.0Battery voltage calibration
Wait Bluetooth Secs0With direct WiFi, don’t wait for BLE
Min Wake Secs30Min active time after receiving packet
INA219 Address0Power monitor address (auto-detect)

Display - OLED Optimization

ParameterValueNote
Screen Timeout60 secOLED timeout for power saving
GPS FormatUNUSEDCoordinate format on screen (not used with fixed position)
Auto Screen Carousel0Disable auto window rotation
Compass North TopYesFix north to top of compass
Flip ScreenNoDon’t flip screen (per body orientation)
UnitsMETRICMetric system (Β°C, m, km/h)
OLED TypeOLED_AUTOAuto-detect display controller
Display ModeDEFAULTStandard display mode
Heading BoldYesBold heading for better readability
Wake on Tap or MotionNoDisable wake on motion (no accelerometer on V4)

Bluetooth - When WiFi Off

ParameterValueNote
EnabledNoWith WiFi enabled, Bluetooth auto-disables on ESP32
Pairing ModeFIXED_PINIf enabling - use fixed PIN
Fixed PIN123456 β†’ change!Must change to random 6-digit code

Network - WiFi for Stationary Node

ParameterValueNote
WiFi EnabledYesDirect connection to router
SSID / PSK<your_data>2.4 GHz networks only
Enable Local UDP BroadcastNoNot required for OneMesh
NTP Serverpool.ntp.orgMore reliable than default meshtastic.pool.ntp.org
Address ModeDHCPAuto IP assignment
IPv6 EnabledNoNot used in current config

⚠️ With WiFi enabled, Bluetooth auto-disables on ESP32 architecture.


🧩 Module Settings (Continued)

Telemetry

ParameterValueNote
Send Device TelemetryYesEnable for node status monitoring
Device Metrics Interval900 sec (15 min)How often to send device metrics
Power Metrics EnabledYesCritical for power monitoring
Power Metrics Interval300 sec (5 min)How often to send power data
Environment Metrics EnabledNoIf no BME280/BME680 sensors
Air Quality EnabledNoOnly for BME680
Display Metrics on ScreenYesShow metrics on OLED
Display FahrenheitNoMetric system (Β°C)

Canned Messages

ParameterValueNote
EnabledYesConvenient for quick replies
MessagesTest link,On air,73!,Coordinates receivedComma-separated, no spaces after
Send BellNoDon’t send bell character with messages
Rotary EncoderNoIf no encoder connected

Disabled Modules (Recommendation for OneMesh)

ModuleStateWhy
SerialNoConsole not used
External NotificationNoWithout external piezo/LED modules
Store & ForwardNoOnly for REPEATER/ROUTER
Range TestNoCreates excess traffic
AudioNoNot supported on Heltec V4
Remote HardwareNoNot used
Ambient LightingNoSave power
Detection SensorNoWithout external GPIO sensors
PaxcounterNoExcess traffic for OneMesh
Status MessageNoNot needed for stationary node

πŸ”‘ Critical Flags and Application Order

  1. Channel Name: Primary must be exactly LongFast.
  2. PSK: AQ== in primary channel is required for OneMesh filtering.
  3. OK to MQTT: On - without this, neighbors can’t relay your packets to server.
  4. Save Order (UI bug workaround):
    • LoRa β†’ Region β†’ save
    • Channels β†’ name + PSK + Uplink/Downlink β†’ save
    • MQTT β†’ basic params β†’ save
    • MQTT β†’ Map Reports β†’ save separately
    • Position / Device / Power β†’ save
    • Reboot node
  5. Verification:
    • In app: MQTT β†’ status Connected
    • On map: node appears within 1–3 hours
    • In LongFast chat: messages from neighbors visible

πŸ”§ Optimal Flashing Process

For Heltec V4 (Bootloader Workaround)

Due to a Heltec V4 bootloader quirk, the standard order doesn’t always work. Optimal process:

  1. Disconnect battery and USB from the board
  2. Open web flasher
  3. Select device: Heltec V4, firmware: 2.7.21
  4. Click Erase Flash and Install
  5. Hold the PRG button on the board
  6. While holding PRG, plug in the USB cable
  7. Observe: brief red flash β†’ USB JTAG appears in port dropdown
  8. Release PRG, select USB JTAG, click Connect
  9. Wait for flashing to complete
  10. After Leaving... message, press the RST button (reset)

πŸ’‘ Note: this process is described in meshtastic/firmware#8543


πŸ“€ First Messages Between Two Nodes

Preparation

  1. Flash both boards per instructions above
  2. On each, configure:
    • Same region (Russia)
    • Same channel with identical PSK (AQ==)
    • Position enabled: Yes (for testing)
  3. Place nodes 10–50 m apart (for initial test)

Test

  1. On first node in app: Messages β†’ + β†’ type text β†’ Send
  2. On second node: incoming message should appear
  3. Check Map tab - if MQTT is enabled, both nodes should appear on map within an hour

Troubleshooting

SymptomCheckFix
No messagesVerify channels have same PSKCopy key exactly, no spaces
Node not on mapCheck MQTT enabled, Map reports, internet on phone/nodeReboot node (RST), wait 1–2 report cycles
MQTT connection errorVerify TLS enabled, root topicTry disabling TLS; ensure Root topic = msh/RU/XXX
No radio connectionCheck antenna, region, Hop limitAttach antenna, set Region: Russia, Hop limit: 5

πŸ†˜ Help and Community