Summary
After adding a private Meshtastic channel via Configuration → Channels, inbound messages on that channel appear in the LongFast conversation in the Messages tab, even though decryption works. Outbound to the same channel works on peer devices (e.g. L1 tracker).
Reported on v0.7.6 by Gus (Discord).
Steps to reproduce
- Fresh start with only default LongFast, or remove
meshtastic.channel_keys from local.yaml and restart.
- Add a private channel (name + 256-bit PSK) via Configuration → Channels and Save (no service restart).
- From another node on the same private channel (second Meshpoint or L1), send a broadcast message.
- On the receiving Meshpoint, open Messages: message lands under LongFast instead of the private channel row.
Contrast: Restart after step 2, or configure the channel only in local.yaml before first boot: routing works.
Expected
Inbound private-channel broadcasts route to broadcast:meshtastic:1 (or the correct channel index) matching /api/messages/channels.
Actual
Inbound packets decrypt but node_id is stored as broadcast:meshtastic:0 (LongFast).
Root cause
channel_hash_map in _setup_message_interception (src/api/server.py) is built once at startup. PUT /api/config/channels updates live crypto keys but does not rebuild the map. Lookup falls back to index 0:
ch_idx = channel_hash_map.get(packet.channel_hash, 0)
TX uses TxService._resolve_channel, which reads current _crypto state, so outbound hashing is correct.
Workaround
Restart the service after saving channels on the dashboard:
sudo systemctl restart meshpoint
Proposed fix
- Small
ChannelHashResolver class with rebuild(config, crypto) and lookup(hash).
- Wire rebuild into
update_channels after add_channel_key loop.
- Unit tests for rebuild + routing.
Environment
- v0.7.6
- Meshtastic private channel (custom PSK)
- Dashboard channel editor (not yaml-only setup)
Summary
After adding a private Meshtastic channel via Configuration → Channels, inbound messages on that channel appear in the LongFast conversation in the Messages tab, even though decryption works. Outbound to the same channel works on peer devices (e.g. L1 tracker).
Reported on v0.7.6 by Gus (Discord).
Steps to reproduce
meshtastic.channel_keysfromlocal.yamland restart.Contrast: Restart after step 2, or configure the channel only in
local.yamlbefore first boot: routing works.Expected
Inbound private-channel broadcasts route to
broadcast:meshtastic:1(or the correct channel index) matching/api/messages/channels.Actual
Inbound packets decrypt but
node_idis stored asbroadcast:meshtastic:0(LongFast).Root cause
channel_hash_mapin_setup_message_interception(src/api/server.py) is built once at startup.PUT /api/config/channelsupdates live crypto keys but does not rebuild the map. Lookup falls back to index0:TX uses
TxService._resolve_channel, which reads current_cryptostate, so outbound hashing is correct.Workaround
Restart the service after saving channels on the dashboard:
Proposed fix
ChannelHashResolverclass withrebuild(config, crypto)andlookup(hash).update_channelsafteradd_channel_keyloop.Environment