Skip to content

See Your Signal: Routes, Bubbles & Real-Time Metrics

Choose a tag to compare

@dida886 dida886 released this 25 Jun 09:09

πŸš€ What's New in Version 1.3.1

πŸ—ΊοΈ Transmission Route Visualization

The Message Card now displays full transmission metrics for received messages:

  • RSSI, SNR, and hop count shown as a compact metrics bar below each message
  • Expandable path section – click the metrics bar to reveal the complete transmission route (e.g., a1b2 β†’ c3d4 β†’ e5f6 β†’ ...)
  • Smart path formatting – automatically splits hex paths into readable node hops, with special handling for FLOOD and FOLD route types
  • SVG icons for signal strength, activity, and waypoints – visually clean and theme-friendly

πŸ’¬ Bubble-Style Message Layout

Messages now display in a modern chat-like bubble interface:

  • Sent messages – right-aligned with green accent
  • Received messages – left-aligned with blue accent
  • Clear header with time and sender name
  • Direction arrow icons integrated into the sender line

πŸ“‘ Real-Time rx_log Data

The card now subscribes to meshcore_message events and reads transmission data from a local NDJSON file:

  • Automatic refresh when new messages arrive
  • Improved message matching – switched from text-based matching to reliable entity_id + timestamp indexing, with Β±15s tolerance for time drift
  • Cache busting – file requests now bypass browser cache to always load the latest data
  • Refresh button now also reloads rx_log data alongside message history
  • Local file caching with automatic pruning (24h max age, 500 entries per entity limit)

πŸ“± Mobile-Optimized Styles

  • Single-line metrics bar – RSSI, SNR, and hop count now stay in one row on all screen sizes
  • Properly sized SVG icons that scale down on smaller devices
  • Metrics wrap only on very small screens (<380px) to maintain readability

πŸ”§ Configuration Required for Route Visualization

To enable the route visualization feature, you need to set up a file-based notification service that captures MeshCore events:

Step 1: Configure the File Notification Service

Add Repository

Please configure Set up a notification service and the file path set to /config/www/meshcore_rx.json

This creates a notification entity (typically notify.meshcore_rx_log). The file will be served from /local/meshcore_rx.json, making it accessible to the card.

Important: Make sure your configuration.yaml allows external access to the www directory:

default_config:
  whitelist_external_dirs:
    - '/config/www'

Step 2: Create the Automation

Create a new automation that writes every meshcore_message event to the file. The automation has been optimized in v1.3.1 to store only essential fields, reducing file size by ~50-60% compared to storing the full event data:

alias: MeshCore - Log RX to file
description: ""
triggers:
  - event_type: meshcore_message
    trigger: event
actions:
  - data:
      entity_id: notify.file
      message: |
        {% set d = trigger.event.data %}
        {% set rx = d.rx_log_data[0] %}
        {{ {"entity_id": d.entity_id, "sender_name": d.sender_name | default('unknown'), "rx_timestamp": rx.timestamp, "rssi": rx.rssi, "snr": rx.snr, "path": rx.path | default(''), "path_len": rx.path_len | default(0), "route_typename": rx.route_typename | default(''), "channel_name": rx.channel_name | default(''), "channel_idx": rx.channel_idx | default(0)} | tojson }}
    action: notify.send_message
mode: queued

What's optimized: Instead of storing the entire event JSON (~400-500 bytes per entry), the automation now extracts only the 10 essential fields needed for route visualization (~180-250 bytes per entry). Each entry is a clean, flat JSON object with no nested arrays – faster to parse and easier on disk space.

Note: The entity_id must match the notification entity created in Step 1. If you used a different name, adjust accordingly (e.g., notify.file).

Step 3: Verify

Restart Home Assistant

Send or receive a message via MeshCore

Check that /config/www/meshcore_rx.json exists and contains JSON lines

The Message Card will automatically load and display route metrics for matching messages

Optional: Automatic Log Rotation

The meshcore_rx.json file grows with every incoming message. To prevent it from becoming too large, you can set up automatic rotation that keeps only the most recent entries.

Step 1: Add a shell command

Add this to your configuration.yaml:

shell_command:
  clean_rx_log: >
    lines=$(wc -l < /config/www/meshcore_rx.json) &&
    if [ "$lines" -gt 500 ]; then
      sed "1,$((lines-500))d" /config/www/meshcore_rx.json > /tmp/meshcore_rx_clean.json &&
      cp /tmp/meshcore_rx_clean.json /config/www/meshcore_rx.json;
    fi

This script:

  • Counts the number of lines in the file
  • Only runs when there are more than 500 entries
  • Removes the oldest entries, keeping the 500 most recent
  • Uses an atomic copy so the file is never inaccessible

Step 2: Create an automation

alias: MeshCore - Clean old RX logs
description: ""
triggers:
  - trigger: time
    at: "03:00:00"
actions:
  - action: shell_command.clean_rx_log
    data: {}

This runs daily at 3:00 AM, keeping your log file lean and fast to load.

Note: Adjust the 500 value to your needs. Each entry is roughly 100-125 bytes. Keep in mind that the Message Card loads this entire file into memory when displaying route metrics – a larger file means slower initial rendering and higher memory usage on the dashboard.

β˜• Support Development

If you find this project useful and would like to support future development:

Buy Me A Coffee

Your support helps fund development, testing, bug fixes, and new features.