Releases: dida886/meshcore-card
Release list
Complete UI Overhaul - Performance Optimizations
π v1.5.3 β Performance Optimizations
β¨ New Features
- Animated Traffic Bars β smooth bar animations instead of dots
- Added Node software version
β‘ Performance
- 30 FPS optimization (skip every second frame)
- Reduced CPU usage when cards are off-screen
- Optimized canvas rendering
β 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.
Complete UI Overhaul - fix path
π v1.5.2 β Patch Release
This release fixes two issues reported by the community after the v1.5.0 UI overhaul.
π Bug Fixes
-
Mainsβpowered nodes no longer show a misleading 0β―% battery
Nodes that are permanently powered via USB or mains and report 0β―V / 0β―% now display a clean βMains poweredβ indicator with a plug icon, instead of a red 0β―% battery bar. This removes the false lowβbattery warning for wired repeaters. -
Hub card now shows the correct device name
The hub name is now taken from the Home Assistant device registry (name_by_user or name) or from the entityβs friendly_name, rather than being reconstructed from the entity ID. Hubs with custom names (e.g. βSaarMesh.de HASSβ) now appear correctly, instead of being shown as a mangled string like βSaarmesh de pi5β.
β¨ Improvements
- Added Hub software version
- Added caching for hub and node discovery β reduces repeated work and improves dashboard performance.
- Introduced a global neighbours index β much faster neighbour lookups when multiple cards are 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.
Complete UI Overhaul - fix path
π v1.5.1 β Patch Release
This release fixes two issues reported by the community after the v1.5.0 UI overhaul.
π Bug Fixes
-
Mainsβpowered nodes no longer show a misleading 0β―% battery
Nodes that are permanently powered via USB or mains and report 0β―V / 0β―% now display a clean βMains poweredβ indicator with a plug icon, instead of a red 0β―% battery bar. This removes the false lowβbattery warning for wired repeaters. -
Hub card now shows the correct device name
The hub name is now taken from the Home Assistant device registry (name_by_user or name) or from the entityβs friendly_name, rather than being reconstructed from the entity ID. Hubs with custom names (e.g. βSaarMesh.de HASSβ) now appear correctly, instead of being shown as a mangled string like βSaarmesh de pi5β.
β¨ Improvements
- Added Hub software version
- Added caching for hub and node discovery β reduces repeated work and improves dashboard performance.
- Introduced a global neighbours index β much faster neighbour lookups when multiple cards are 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.
Complete UI Overhaul
π MeshCore Card Enhanced v1.5.0 β Complete UI Overhaul
This release brings a completely redesigned user interface, significant code refactoring, and several highly requested features.
β¨ What's New
- Unified card framework β All cards now share a common base, reducing code duplication and improving maintainability.
- Dynamic theming for particles β Hub card particles now automatically adapt to the active Home Assistant theme (light/dark).
- Signal icons β RSSI, SNR, and Noise cards now display variant-specific icons with matching colors for faster visual scanning.
- Expandable neighbors in Node Card β Neighbor lists can now be toggled open/closed, identical to the Quick Repeater card.
neighbors_expanded_defaultoption β Control whether neighbor lists start expanded or collapsed.- Offline status pill β The Node Card now uses a distinct red pill for offline devices, clearly separating them from online ones.
- Offline message in Quick Repeater Card β Offline repeaters now show a clear "Node Offline" message, consistent with the Node Card.
- Particle animation control β The
animateparameter indrawParticlesnow also controls floating dots movement.
β 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.
Card Split: Hub & Node Cards Are Now Separate
Release Notes β v1.4.2
Fix: remove duplicate hub-card registration
ποΈ Card Split: Hub & Node Cards Are Now Separate
In this release, we've split the original custom:meshcore-card into two dedicated cards for better flexibility, performance, and user experience:
| Card Type | Lovelace Type | Description |
|---|---|---|
| Hub Card | custom:meshcore-hub-card |
Displays only MeshCore hubs with full configuration options |
| Node Card | custom:meshcore-node-card |
Displays only MeshCore nodes (repeaters, rooms, sensors, clients) |
| Original Card | custom:meshcore-card |
Legacy compatibility β now shows only hubs (nodes removed) |
π Migration Guide
If you were using custom:meshcore-card to display both hubs and nodes, simply replace it with the new dedicated cards:
# Before (v1.4.0 and earlier)
type: custom:meshcore-card
hubs:
55733c: true
nodes:
MyNode: true
# After (v1.4.1 β recommended)
- type: custom:meshcore-hub-card
hubs:
55733c: true
- type: custom:meshcore-node-card
# All nodes are displayed automatically
# Use filters and hidden_nodes to customizeπ Bug Fixes
- Fixed neighbor filtering to properly skip "unavailable network" entries
- Fixed temperature display in Node Card
- Fixed expandable neighbor list toggle
- Improved mobile responsiveness for signal-row and traffic-grid
- Fixed card editor checkbox list for hiding nodes
- Fixed snrDescription tooltip in neighbor list
β 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.
Notice
If you're having an issue where changes in your Home Assistant dashboard don't appear in the Android app, even after refreshing the page, try clearing the frontend cache.
Steps:
- Open the Home Assistant app.
- Go to Settings β Companion App.
- Open Troubleshooting (or Debugging, depending on your app version).
- Tap Reset Frontend Cache.
- Restart the app.
This has helped in my case when the app kept showing an outdated version of the dashboard.
Quick Repeater Card
π What's New in Version 1.4.0
π‘ Quick Repeater Card β Dedicated Repeater Monitoring
A new, lightweight card designed specifically for monitoring all MeshCore repeaters in your network:
- Complete repeater overview β displays all repeaters in a compact, scannable list
- Key metrics at a glance: battery percentage, uptime, SNR, RSSI, noise floor, and temperature
- Expandable neighbor list β click the "Neighbors" header to reveal detailed information about each neighbor:
- Neighbor name (with clickable link to contact details)
- SNR value with color coding (green/yellow/orange/red)
- Time since last seen
- Connection count over the last 48 hours
- Smart sorting β sort repeaters by SNR (best signal first), name (alphabetical), or battery level (highest first)
- Clean, mobile-first design β optimized for small screens with large touch targets
- Minimal configuration β just add the card and it works automatically
- Click-through β click on any metric to open the more-info dialog for that entity
Perfect for quick network health checks β see which repeaters are online, which have weak signals, and which need battery replacement, all from a single card.
Configuration
type: custom:meshcore-quick-repeater-card
# Optional: Sort order
sort_by: snr # Options: snr (default), name, battery
# Optional: Grid rows for dashboard layout
grid_options:
rows: 4β 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.
Advert and Advert Flood buttons on Hub card
Release 1.3.4
π New Features
Advert Buttons on Hub Card
Now you can send Advert (Zero-Hop) and Advert Flood directly from the Hub card! Simply click the button and the command is sent instantly.
- Advert β sends a Zero-Hop Advert (
advert) - Advert Flood β sends a Flood Advert (
send_advert(flood=True))
β
Visual feedback β green confirmation message appears after successful sending
β
Configurable β you can hide the buttons with show_hub_advert_buttons: false in the card configuration
β
Translations available in all supported languages
π Translations
- Added Advert-related translations for all supported languages
π Bug Fixes
- Fixed seconds formatting in message card β time is now displayed as an integer instead of long decimal values (e.g.,
35sinstead of35.6800000667572s) - Various minor fixes and improvements
Configuration
type: custom:meshcore-card
show_hub_advert_buttons: true # default: trueβ 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.
Human-Friendly Paths, Quick Copy & Mentions
π What's New in Version 1.3.3
π·οΈ Repeater Name Mapping (Message Card)
- Path segments now show real contact names instead of raw hex identifiers
- Enabled by default β toggle with
use_repeater_names: falsein config - Unrecognized nodes display βUnknown (hex)β β translatable via
message-card.unknown_repeater
π LongβPress to Copy
- Longβpress on the expanded path β copies the full route text
- Longβpress on a message bubble β copies the message content
- Visual βCopied!β overlay appears on the specific element (path or bubble), not the whole card
@Mentions
- Click a received message sender β inserts
@[name]into the message input and focuses it
π¨ UI & UX Improvements
- Path wrapping β long routes now break neatly between hops on narrow screens
(each segment is wrapped in<span class="path-hop">) - Neighbors in the hub/node card are now clickable even when no contact entity exists (falls back to
snrIdorseenId) - Temperature badge in the node header is now clickable (opens the entityβs history)
- Editor includes a checkbox to toggle repeater name display
π§ 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.
See Your Signal: Routes, Bubbles & Real-Time Metrics
π What's New in Version 1.3.2
π§ Robust NDJSON Parser
The card now includes a smart JSON parser that handles both single-line and pretty-printed multi-line entries in meshcore_rx.json. No more missing route metrics due to JSON formatting issues.
πΆ Refined SNR Color Scale for Neighbors
SNR thresholds have been fine-tuned and the visual style upgraded:
- Green: β₯ 9 dB (was β₯ 10 dB) β excellent signal
- Yellow: 6β8 dB β good signal
- Orange: 0β5 dB β weak signal
- Red: < 0 dB β critical
π§ 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.
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.