See Your Signal: Routes, Bubbles & Real-Time Metrics
π 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
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: queuedWhat'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;
fiThis 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:
Your support helps fund development, testing, bug fixes, and new features.