- Protobuf added: Jan 17, 2026 (protobufs PR #835)
- Firmware PR: #9351, merged into alpha 2.7.19
- Purpose: Allows nodes to set a status message (separate from long name) that is periodically rebroadcast (~twice daily)
- Config fields: Only one field
node_status(string, max 80 chars) - the status text
- Proto field:
ModuleConfig.statusmessage(field 14),ModuleConfigType.STATUSMESSAGE_CONFIG = 13 - Notable: Does NOT require device reboot on config change
- Protobuf added: Jan 19, 2026 (commit e2daf8d in protobufs repo)
- Firmware status: Protobuf definitions exist, but not yet released in any stable or alpha firmware. No firmware implementation PR found.
- Purpose: Mesh traffic optimization - position dedup, rate limiting, NodeInfo caching, hop exhaustion
- Config fields (14 fields):
enabled(bool) - master enableposition_dedup_enabled(bool) - drop redundant position broadcastsposition_precision_bits(uint32, 0-32) - precision for position dedupposition_min_interval_secs(uint32) - min interval between position updates from same nodenodeinfo_direct_response(bool) - respond to NodeInfo requests from local cachenodeinfo_direct_response_max_hops(uint32) - min hop distance before respondingrate_limit_enabled(bool) - per-node rate limitingrate_limit_window_secs(uint32) - time window for rate limitingrate_limit_max_packets(uint32) - max packets per windowdrop_unknown_enabled(bool) - drop unknown/undecryptable packetsunknown_packet_threshold(uint32) - threshold before droppingexhaust_hop_telemetry(bool) - set hop_limit=0 for relayed telemetryexhaust_hop_position(bool) - set hop_limit=0 for relayed positionrouter_preserve_hops(bool) - preserve hops for router-to-router traffic
- Proto field:
ModuleConfig.traffic_management(field 15),ModuleConfigType.TRAFFICMANAGEMENT_CONFIG = 14
| Area | StatusMessage | TrafficManagement |
|---|---|---|
requestAllModuleConfigs() |
Requests type 13 | Requests type 14 |
processAdminMessage() |
Stores via generic key merge | Stores via generic key merge |
createSetModuleConfigMessageGeneric() |
MISSING from configFieldMap | MISSING from configFieldMap |
server.ts load-config maps |
Partially present (statusmessage) |
MISSING |
server.ts switch cases |
case 'statusmessage' exists |
MISSING |
server.ts remote configTypeMap |
statusmessage: type 13 exists |
MISSING |
getCurrentConfig() Proto3 defaults |
Not applied | Not applied |
| UI Components | None | None |
| Admin Commands Tab | None | None |
- Existing pattern:
parseFirmwareVersion()+supportsFavorites()(checks >= 2.7.0) localNodeInfo.firmwareVersionis available viagetCurrentConfig()response- Remote nodes get firmware via
getDeviceMetadataResponse
Rather than hard-coding firmware version thresholds (fragile, since TrafficManagement isn't even released yet), we detect support by checking whether the node returned a config response for each module type. If the node doesn't understand the module, it simply won't respond to the config request (the config key will be absent from actualModuleConfig).
The getCurrentConfig() response already includes whatever module configs were received. We add a supportedModules metadata field to indicate which optional modules the connected node supports.
Add mappings in createSetModuleConfigMessageGeneric():
'statusmessage': 'statusmessage',
'trafficmanagement': 'trafficManagement'
Add trafficmanagement to all config maps where statusmessage already exists:
- Module config map in the load-config needsRequest check (~line 6113)
- The
casestatement for raw module configs (~line 6315) - The moduleConfigMap in the case body (~line 6329)
- The remote configTypeMap (~line 6369):
'trafficmanagement': { type: 14, isModule: true }
Add entries to the moduleConfigMap in requestRemoteConfig():
14: 'trafficManagement'(alongside existing13: 'statusmessage')
Apply Proto3 defaults for both new modules (like existing mqtt/neighborInfo/telemetry pattern):
- StatusMessage:
nodeStatusdefaults to'' - TrafficManagement: all booleans default to
false, all uint32s default to0
Add a supportedModules object to the return value:
return {
deviceConfig,
moduleConfig,
localNodeInfo: this.localNodeInfo,
supportedModules: {
statusmessage: !!moduleConfig.statusmessage,
trafficManagement: !!moduleConfig.trafficManagement
}
};This tells the frontend which optional modules the connected node actually supports.
Simple section with:
- Text input for
nodeStatus(max 80 chars, with character counter) - Save button
Pattern: follow existing simple config sections like
PaxcounterConfigSection.tsx
Grouped section with:
- Master enable toggle
- Position Deduplication group: enable toggle, precision bits (slider/number 0-32), min interval seconds
- NodeInfo Direct Response group: enable toggle, max hops (number)
- Rate Limiting group: enable toggle, window seconds, max packets
- Unknown Packet Dropping group: enable toggle, threshold count
- Hop Exhaustion group: exhaust_hop_telemetry toggle, exhaust_hop_position toggle, router_preserve_hops toggle
- Add state variables for both modules' config fields
- Load from
config.moduleConfig.statusmessageandconfig.moduleConfig.trafficManagement - Wire save handlers through
apiService.setModuleConfig() - Conditional rendering: Check
supportedModulesfrom config response. If a module is not supported, render the section as disabled/collapsed with a message like "This module is not supported by the connected node's firmware"
Add StatusMessage and TrafficManagement sections to the existing component, following the MQTT/NeighborInfo/Telemetry pattern.
Add state fields and reducer actions for both new module configs.
- Add
statusmessageandtrafficmanagementto thehandleLoadAllConfigs()sequence - Add save command mappings for both modules
- Apply the same disabled/unsupported logic based on whether config was returned
Both modules should already work via the existing setModuleConfig(moduleType, config) generic method, but verify and add any needed type-specific methods.
When a module is not supported (node didn't return config for it):
- Section header still visible with "Unsupported by device firmware" message
- Entire section disabled (grayed out inputs, save button disabled)
- Show known firmware version requirement: "Requires firmware version X or greater"
- StatusMessage: "Requires firmware version 2.7.19 or greater"
- TrafficManagement: "Not yet available in any firmware release"
- No firmware version gating logic - purely response-based detection
- Use the node's known firmware version in the message for context
src/server/protobufService.ts- Add configFieldMap entriessrc/server/server.ts- Complete config maps and switch casessrc/server/meshtasticManager.ts- Remote config maps + getCurrentConfig() changes
src/components/configuration/StatusMessageConfigSection.tsx- New componentsrc/components/configuration/TrafficManagementConfigSection.tsx- New component
src/components/ConfigurationTab.tsx- Wire in new sectionssrc/components/admin-commands/ModuleConfigurationSection.tsx- Add to remote adminsrc/components/admin-commands/useAdminCommandsState.ts- Add state/actionssrc/components/AdminCommandsTab.tsx- Wire in load/save commands
- Tests for new config sections
- Update existing config tests that enumerate module types
- Unsupported modules: Shown disabled (not hidden) with "Unsupported by device firmware" message + firmware version guidance
- Detection: Response-based only, no firmware version gating logic
- Firmware version display: StatusMessage = "Requires firmware 2.7.19+", TrafficManagement = "Not yet available in any firmware release"
- TrafficManagement field naming: Need to verify
trafficManagementis the actual key in decoded protobuf responses (protobufjs camelCasestraffic_management).