Skip to content

Releases: dida886/meshcore-card

Complete UI Overhaul - Performance Optimizations

Choose a tag to compare

@dida886 dida886 released this 18 Jul 11:28

πŸŽ‰ 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:

Buy Me A Coffee

BuyCoffee

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

Complete UI Overhaul - fix path

Choose a tag to compare

@dida886 dida886 released this 12 Jul 21:53

πŸŽ‰ v1.5.2 – Patch Release

This release fixes two issues reported by the community after the v1.5.0 UI overhaul.

πŸ› Bug Fixes

  1. 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.

  2. 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:

Buy Me A Coffee

BuyCoffee

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

Complete UI Overhaul - fix path

Choose a tag to compare

@dida886 dida886 released this 12 Jul 11:08

πŸŽ‰ v1.5.1 – Patch Release

This release fixes two issues reported by the community after the v1.5.0 UI overhaul.

πŸ› Bug Fixes

  1. 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.

  2. 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:

Buy Me A Coffee

BuyCoffee

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

Complete UI Overhaul

Choose a tag to compare

@dida886 dida886 released this 08 Jul 22:44

πŸŽ‰ 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_default option – 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 animate parameter in drawParticles now also controls floating dots movement.
meshcore-hub-card meshcore-remote-nodes-card

β˜• Support Development

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

Buy Me A Coffee

BuyCoffee

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

Card Split: Hub & Node Cards Are Now Separate

Choose a tag to compare

@dida886 dida886 released this 03 Jul 18:20

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:

Buy Me A Coffee

BuyCoffee

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:

  1. Open the Home Assistant app.
  2. Go to Settings β†’ Companion App.
  3. Open Troubleshooting (or Debugging, depending on your app version).
  4. Tap Reset Frontend Cache.
  5. Restart the app.

This has helped in my case when the app kept showing an outdated version of the dashboard.

Quick Repeater Card

Choose a tag to compare

@dida886 dida886 released this 29 Jun 23:46

πŸš€ What's New in Version 1.4.0

πŸ“‘ Quick Repeater Card – Dedicated Repeater Monitoring

meshcore-quick-remote-nodes-card meshcore-quick-remote-nodes-card2

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:

Buy Me A Coffee

BuyCoffee

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

Advert and Advert Flood buttons on Hub card

Choose a tag to compare

@dida886 dida886 released this 28 Jun 21:29

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

meshcore-hub-card-logo

🌐 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., 35s instead of 35.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:

Buy Me A Coffee

BuyCoffee

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

Human-Friendly Paths, Quick Copy & Mentions

Choose a tag to compare

@dida886 dida886 released this 27 Jun 13:40

πŸš€ 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: false in 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 snrId or seenId)
  • 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

Add Repository

file_integration

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

BuyCoffee

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

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

Choose a tag to compare

@dida886 dida886 released this 25 Jun 12:09

πŸš€ 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

Add Repository

file_integration

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

BuyCoffee

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

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.