Commit Graph
22 Commits
Author SHA1 Message Date
pe1hvh ce6d8f8b9b docs: bring documentation in line with changelog up to 1.24.5
WHAT
- README: add 8.3 Repeater Configuration Read; document poll retries,
  traffic priority and cancellation in 8.2; add repeater, channel-sort
  and API keys to the configuration table; list rxlog.jsonl and
  repeater_config.jsonl; update 9.8, 9.16, 10, 14.2 and roadmap
- MULTI_INSTANCE: complete per-device file table and cleanup commands
- FEATURE_MESSAGE_PERSISTENCE: document the RX log JSONL stream,
  align example records with the archive fields
- MeshCore_GUI_Design.docx: v5.11.0 -> v6.0.0 for application 1.24.5
- CLAUDE.md: replace references to non-existent INSTALLATIE.md and
  TROUBLESHOOTING.md with README sections
- Fix stale defaults (MAX_CHANNELS, RXLOG_RETENTION_DAYS,
  BOT_DEVICE_NAME) and file paths (rooms, pins)
- Bump version 1.24.4 -> 1.24.5

WHY
Documentation lagged behind the code: most documents dated from 1.22.2,
the design document from 1.9.0, while the changelog had reached 1.24.4.

NOTES
Documentation only; no code, schema or API change. CLAUDE.md/ADR-003
describe meshcore-ble-connect as the primary BLE path, the code does
not use it; left unchanged pending decision.
2026-09-29 15:07:22 +02:00
pe1hvh d5e9331d4b Update README.md 2026-09-01 06:47:13 +02:00
pe1hvh 17b5089bdd docs(readme): sync with 1.22.5–1.24.1 and move bridge to its own repo
Bring README.md in line with the codebase after five releases and the
extraction of the bridge and observer daemons.

WHAT
- Document repeater statistics polling (1.23.0): config constants,
  archive path, panel behaviour and a new section 9.16.
- Correct section 8.2, which claimed values are shown exactly as
  reported. Since 1.23.2 uptime and airtime are rendered as
  d/h/m/s. Storage is unchanged; only presentation differs.
- Document the per-repeater Poll now button (1.24.0) and the
  reset_path() recovery after a login without confirmation (1.23.2).
- Add MSG_POLL_INTERVAL (1.22.6) and
  CHANNEL_DISCOVERY_ABORT_THRESHOLD (1.22.5) to the config table, and
  record the Room Server history timestamp issue as a known limitation.
- Replace section 11 with a pointer to meshcore-bridge and
  meshcore-observer, now separate repositories.
- Correct the project structure: the docs/ tree listed a file that does
  not exist and placed two others in the wrong directory; adr/, ble/ and
  examples/ were missing entirely. Also adds ble_connector.py,
  channel_discovery.py, repeater_stats_panel.py and the three
  repeater services.

WHY
The claim about value conversion in 8.2 was actively wrong, not merely
incomplete, and section 11 documented a package no longer in this
repository. Both mislead a reader who trusts the README over the code.

NOTES
- Documentation only. No code, no version bump.
- Section 11 is shortened rather than removed so sections 12-19 keep
  their numbering and existing anchors stay valid.
- Screenshot placeholders added in sections 3 and 9.16.
- Two pre-existing broken anchors (#1412-ble-quick-fixes,
  #13-known-limitations) are left untouched; out of scope here.
2026-09-01 06:42:51 +02:00
pe1hvh 17c36321ed add examples 2026-09-01 03:51:50 +02:00
pe1hvh 8fc1e78a05 Backup 2026-04-21 00:14:25 +02:00
pe1hvh da3a868ec6 fix(bot): per-sender cooldown + empty-channel fallback (v1.20.1)
- Replace global _last_reply float with _last_reply_per_sender dict.
  A reply to one node no longer blocks all other senders for 5 s.
  LRU eviction keeps the dict bounded at 200 entries.

- _get_active_channels() now falls back to BotConfig defaults when
  the stored channel set is empty (user never saved a selection).
  Bot was silently deaf on first run despite the panel showing all
  channels pre-checked.

Closes: bot only replies to first sender in multi-node #test session.
2026-04-16 07:07:50 +02:00
pe1hvh ad91b27c62 docs: overhaul README to reflect current platform scope
The README had fallen significantly behind the current state of the
codebase. This commit brings it up to date across the board.

Content changes:
- Rewrite title, subtitle and opening line to reflect the all-in-one
  platform nature of the project instead of focusing on the bridge alone
- Rewrite section 1 (Why This Project Exists) to cover the full
  operator workflow: connect, monitor, manage, archive, automate, BBS,
  bridge, publish, headless
- Merge the two overlapping platform/testing notes into one
- Update features list: add BBS as a first-class feature, merge
  Dynamic Channel Discovery and Add/Delete Channel into Channel
  Management, rename Contact Maintenance to Contact Management, remove
  Threaded Architecture (implementation detail), add Headless /
  Multi-instance as explicit feature
- Move BBS section from top-level §12 into §9 Functionality as §9.14,
  adjusting heading levels accordingly
- Add §9.2 note clarifying that contacts and nodes are the same concept
- Add new §8.1 Data Directory with a complete overview of all files and
  subdirectories under ~/.meshcore-gui/, including maintenance commands
- Update §10 architecture diagram and component list: add BBSPanel,
  BotPanel, REST API block, ChannelService, BbsService,
  PublicApiService and MapSnapshotService
- Update §15.2 project structure: add meshcore_gui/api/, all missing
  panels and services, and reflect install_scripts/ as a subdirectory
- Fix all install script paths from root level to install_scripts/
- Document install_scripts/install_venv.sh as the first setup step
- Document install_scripts/install_observer.sh in project structure
- Update Observer mode in roadmap: installer present, daemon in
  development
- Renumber sections 13–20 to 12–19 after BBS was absorbed into §9
- Update all cross-references and table of contents accordingly
2026-04-07 11:50:33 +02:00
pe1hvh 4a58a95cf0 fix: channel attribution, dedup, cache bugs + channel edit/move (v1.19.0)
fix(packet_decoder): brute-force channel resolution when hash lookup fails

ChannelCrypto.calculate_channel_hash() and the MeshCore firmware compute
different channel identifiers for the same secret, causing _hash_to_idx to
return None for all hashtag-channel messages. Fallback: try each registered
key individually via a single-key keystore. First valid decryption wins.
Result cached in _hash_to_idx for O(1) resolution on subsequent packets.

fix(events): channel-agnostic sentinel prevents cross-channel duplicates

on_rx_log now marks '*' in DualDeduplicator after storing a message.
on_channel_msg checks this sentinel and suppresses storage regardless of
channel_idx or message_hash differences between the two library systems.
Fixes #mc-radar messages appearing in #weather and vice versa.

fix(events): secondary path-cache keyed by content for hash-mismatch

_path_cache keyed by meshcoredecoder hash; CHANNEL_MSG_RECV carries meshcore
hash (different value). Added _path_cache_by_content ("sender:text[:100]")
as fallback so path_hashes are recovered when the two hashes disagree.

fix(commands,cache): remove stale channel key after del_channel reindex

Cache entry for old_idx not removed after slot move, causing same channel
to appear twice. New DeviceCache.remove_channel_key(idx) called after each
move. asyncio.sleep(0.5) added before re-discovery to let device settle.

feat(channel_panel,commands,dashboard): channel edit — move/reindex support

First channel-edit capability in the GUI. New '↕️ Move / Reindex' mode in
Channel Manager dialog. Source channel selected from dropdown, target index
in number field. ↕ button inline with 🗑 in Messages and Archive submenus.
_cmd_move_channel reads secret from cache or device, writes new slot, clears
old slot, updates cache atomically, triggers re-discovery with settle delay.
2026-04-06 10:23:24 +02:00
pe1hvh 1275f78e36 feat(api): add public REST API for stats, nodes and messages
WHAT: Four read-only GET endpoints under /api/v1/ registered on the
NiceGUI/FastAPI instance via register_routes(_shared) in __main__.py.
Controlled by API_ENABLED in config.py (default: True).

WHY: Enables the domca.nl PHP collector to pull live mesh data over HTTP
without direct access to SQLite or SharedData internals.

NOTES: Private channel messages are unconditionally excluded in
public_api_service.py — filtering is server-side hard, no auth needed.
Channel rule: idx==0 (Public) or name.startswith('#') (Hashtag) = expose.
2026-04-04 14:17:07 +02:00
pe1hvh a62b8d1733 feat(channels): add hashtag and private channel management dialog
WHAT: New + Add Channel button in the Messages submenu opens a dialog
supporting three modes — Hashtag (key derived from name), Private New
(random key + QR export), Private Existing (paste hex key).

WHY: Channels could only be added via firmware/external tools. The new
dialog covers all user scenarios without changing the BLE worker or
existing panels.

NOTES: Requires `qrcode[pil]` for QR rendering (graceful degradation if
absent). Channel re-discovery is triggered automatically on success.
2026-04-04 11:40:14 +02:00
pe1hvh 00d1739378 feat(bot): extract bot to dedicated panel with channel assignment and private mode(#v1.15.0)
WHAT: New BotPanel replaces the BOT checkbox in ActionsPanel. Interactive
channel checkboxes (from live device channel list) replace the hardcoded
BOT_CHANNELS constant. Private mode restricts replies to pinned contacts only.
BotConfigStore persists settings per device to ~/.meshcore-gui/bot/.

WHY: Bot configuration was scattered (toggle in Actions, channels in code).
A dedicated panel and config store aligns with the BBS panel/BbsConfigStore
pattern and enables private mode without architectural changes.

NOTES: ActionsPanel.__init__ signature simplified (set_bot_enabled removed).
create_worker accepts pin_store kwarg (backwards compatible, defaults to None).
2026-03-16 16:48:16 +01:00
pe1hvh 8836d9dd6e fix(bbs_service): resolve NameError in _abbrev_table that crashed !h and !help(#v1.14.1)
_abbrev_table used a list comprehension inline inside a generator
expression filter. In Python 3, list comprehensions have their own
scope, so the loop variable 'cu' was not visible to the outer 'if'
condition — causing a NameError on every !h / !help DM command.

Extract the comprehension to a local variable 'cats_upper' so both
the iteration and the filter operate on the same pre-built list.
2026-03-16 11:20:55 +01:00
pe1hvh 5273f360b2 Update README.md 2026-03-14 21:34:29 +01:00
pe1hvh e4755b3047 feat(bbs): DM-based BBS with channel-based access, multi-channel whitelist, short syntax(#v1.14.0)
Adds an offline BBS accessible via Direct Message to the node's own key.
Access is channel-based: anyone seen on a configured BBS channel is
automatically whitelisted for DM access. Channels stay clean.

- Multi-channel configuration: any combination of device channels can be
  selected; senders on any of them are auto-whitelisted
- Short syntax: !p <cat> <text> and !r [cat] alongside full !bbs syntax
- Category abbreviations computed automatically (shortest unique prefix)
- handle_channel_msg: bootstrap reply on channel + auto-whitelist sender
- handle_dm: DM entry point, checks whitelist, routes to post/read/help
- DM reply routed back to sender via command_sink
- SQLite message store with WAL mode and configurable retention
2026-03-14 21:11:22 +01:00
pe1hvh 231f800b57 feat: DM-based BBS with channel-based access, multi-channel whitelist, short syntax(#v1.14.0)
Adds an offline BBS accessible via Direct Message to the node's own key.
Access is channel-based: anyone seen on a configured BBS channel is
automatically whitelisted for DM access. Channels stay clean.

- Multi-channel configuration: any combination of device channels can be
  selected; senders on any of them are auto-whitelisted
- Short syntax: !p <cat> <text> and !r [cat] alongside full !bbs syntax
- Category abbreviations computed automatically (shortest unique prefix)
- handle_channel_msg: bootstrap reply on channel + auto-whitelist sender
- handle_dm: DM entry point, checks whitelist, routes to post/read/help
- DM reply routed back to sender via command_sink
- SQLite message store with WAL mode and configurable retention
2026-03-14 21:02:03 +01:00
pe1hvh 2963e1c855 feat(bbs): DM-based BBS with channel-based access, multi-channel whitelist, short syntax 2026-03-14 20:58:56 +01:00
pe1hvh e2a911838b feat(bbs): DM-based BBS with channel-based access, multi-channel whitelist, short syntax(#v1.14.0)
Adds an offline BBS accessible via Direct Message to the node's own key.
Access is channel-based: anyone seen on a configured BBS channel is
automatically whitelisted for DM access. Channels stay clean.

- Multi-channel configuration: any combination of device channels can be
  selected; senders on any of them are auto-whitelisted
- Short syntax: !p <cat> <text> and !r [cat] alongside full !bbs syntax
- Category abbreviations computed automatically (shortest unique prefix)
- handle_channel_msg: bootstrap reply on channel + auto-whitelist sender
- handle_dm: DM entry point, checks whitelist, routes to post/read/help
- DM reply routed back to sender via command_sink
- SQLite message store with WAL mode and configurable retention
2026-03-14 20:38:32 +01:00
pe1hvh d9ad4c83b8 feat(bbs): DM-based BBS with channel-based access, multi-channel whitelist, short syntax(#v1.14.0)
Adds an offline BBS accessible via Direct Message to the node's own key.
Access is channel-based: anyone seen on a configured BBS channel is
automatically whitelisted for DM access. Channels stay clean.

- Multi-channel configuration: any combination of device channels can be
  selected; senders on any of them are auto-whitelisted
- Short syntax: !p <cat> <text> and !r [cat] alongside full !bbs syntax
- Category abbreviations computed automatically (shortest unique prefix)
- handle_channel_msg: bootstrap reply on channel + auto-whitelist sender
- handle_dm: DM entry point, checks whitelist, routes to post/read/help
- DM reply routed back to sender via command_sink
- SQLite message store with WAL mode and configurable retention
2026-03-14 20:01:07 +01:00
pe1hvh 374897448e feat(bbs): DM-based BBS with short syntax and auto-abbreviations(#v1.14.0)
Adds an offline Bulletin Board System accessible via Direct Message to
the node's own key. All BBS commands (!p, !r, !bbs) are handled directly
in EventHandler.on_contact_msg, independent of MeshBot.

- One node = one board; settings reduced to a single channel selector
- Short syntax: !p <cat> <text> and !r [cat] alongside full !bbs syntax
- Category abbreviations computed automatically (shortest unique prefix)
- !r and !bbs help always include the abbreviation table in the reply
- DM reply routed back to sender via command_sink
- SQLite message store with WAL mode and configurable retention
2026-03-14 18:36:58 +01:00
pe1hvh 00b70d6448 Add image to README for visual enhancement
Added an image to enhance the README and provide visual context.
2026-03-09 18:10:32 +01:00
pe1hvh fc60756c91 Update README with new image and requirements
Added a new image to the README and updated requirements.
2026-03-09 18:08:18 +01:00
pe1hvh d8a7947c6b Initial clean code 2026-03-09 17:53:29 +01:00