Skip to content

v0.5.0

Choose a tag to compare

@3dg1luk43 3dg1luk43 released this 07 Apr 11:54

[0.5.0] – 2026-04-07

This is a major feature release. Version 0.5.0 brings a brand-new visual profile editor, six new widget types, multi-page dashboard support, a redesigned HA integration with per-device entities, OAuth2-based deploy, and a wave of polish across the iOS app.


Profile Editor — New

A fully featured web-based dashboard designer is now live at:
https://3dg1luk43.github.io/ha_mqtt_dash_profile_editor/

Built in React 19 with Vite, dnd-kit drag-and-drop, and Zustand state management. No installation required — open it in any browser and start building.

Canvas & Layout

  • iPad frame preview with 8 device model presets (iPad 1st gen through iPad Air, plus custom resolution)
  • Portrait / landscape toggle
  • Drag-and-drop widget placement with resize handles
  • Grid overlay with configurable columns, cell dimensions, and margins
  • Per-page grid override
  • Dev overlay mode (shows grid indices for debugging)

Configuration

  • Right-sidebar config panel with per-widget-type forms for all 19 widget types
  • Common fields: label, entity ID, position, size, format (colors, alignment, font size)
  • Widget-specific fields: see individual widget sections below
  • Entity ID autocomplete sourced from your live HA instance (requires connection)

Multi-page support

  • Add, rename, and delete pages via tab bar
  • Drag widgets within and across pages
  • Per-page grid overrides

Navbar customization

  • Edge placement: top / bottom / left / right
  • Custom background color, active/inactive button colors, text color, border color
  • Toggle battery indicator and Keep-Awake button visibility

Device settings panel

  • Keep-Awake toggle
  • Screensaver timeout (seconds; 0 = disabled)
  • Screensaver clock font size
  • Device orientation (auto / portrait / landscape)

Profile management

  • Undo / redo (full history stack; Ctrl+Z / Ctrl+Y)
  • Auto-save to browser localStorage
  • Import: JSON paste or file upload
  • Export: clipboard copy or file download
  • Share via URL: profile encoded as base64 in the URL fragment

Home Assistant integration (one-click deploy)

  • OAuth2 connection to your HA instance
  • Device ID selector
  • ⚡ Deploy button sends the profile directly to the device over MQTT via the integration API
  • Entity autocomplete for all widget entity fields
  • Token auto-refresh (60 s before expiry)

iOS App

New widget types

timer – Local countdown timer (no entity or MQTT required)

  • Configurable default duration (default_seconds; default 300 s)
  • Tap the time display to start/pause; long-press to reset
  • +/− buttons with accelerating repeat (0.4 s → 0.15 s → 0.07 s intervals)
  • When finished: 5 red flashes + vibration + system alert sound
  • Timer state persists across page switches
  • configurable: false hides the +/− buttons for a repeat-only mode

webpage – Embedded web view

  • Renders any local URL (dashboards, recipe pages, status pages, etc.)
  • Uses WKWebView on iOS 8+ with fallback to UIWebView on iOS 7−
  • URL set via stream_url

mealie – Mealie recipe integration

  • Connects to a self-hosted Mealie instance
  • recipe_slug: null opens an interactive recipe picker
  • recipe_slug: "..." displays a specific recipe directly
  • Shows ingredients, steps, or both (visible_section)
  • Handles URL-safe base64 recipe images

sousvide – Sous vide cooker status

  • Displays on/off state, current temperature, target temperature, and time remaining
  • Dims the tile automatically when idle/off

appliance – Generic appliance status

  • Displays running state, current program name, and time remaining
  • Dims when off

mediaplayer – Media player controls

  • Shows track title and artist
  • Play/pause and next/previous buttons
  • Seekable progress bar with position/duration display
  • Auto-injects MQTT topics from the entity ID

Multi-page support

  • Profiles can now contain a pages array alongside (or instead of) the flat widgets array
  • Each page has an optional name and per-page grid override
  • Navigation bar with named page tabs; swipe left/right to switch pages
  • All pages are pre-rendered; live MQTT state updates apply to all pages simultaneously
  • Fully backward compatible: profiles with only a widgets array continue to work

Climate widget — fixed

  • Mode-color tinting was silently broken on iOS 7+ due to a deprecated UIKit API (UITextAttributeTextColor)
  • Fixed by switching to NSForegroundColorAttributeName via a new _applySegmentTextColor:toSegmentedControl: helper
  • State-based colors (per state_formats) are now applied immediately if the entity state is already cached
  • Tile background also tints to a darker shade of the active mode color for better readability

Weather widget

  • Added full multi-attribute display (attrs list: temperature, humidity, wind_speed, etc.)
  • attr_units mapping allows per-attribute unit overrides
  • Integration auto-injects attr_base topic

Notifications

  • App now handles push notifications from the HA integration
  • Notifications show title + message overlaid on the dashboard
  • Screensaver is dismissed on notification arrival

Screensaver

  • Configurable idle timeout (screensaverTimeout, seconds; 0 = disabled)
  • Configurable clock font size (screensaverFontSize, points)
  • Touch anywhere to dismiss; also dismissed by incoming notifications or timer alarms

Navbar

  • Battery level indicator (optional; shown by default)
  • Keep-Awake toggle button (optional; shown by default)
  • Custom styling: background, active/inactive/text/border colors
  • Placement: top / bottom / left / right (navbarEdge)

MQTT / connectivity

  • Refactored MQTTManager: removed legacy session implementations; now uses a single clean code path
  • Battery level now reported via dedicated telemetry topic (replaces heartbeat approach)
  • On reconnect, app requests a fresh state snapshot to eliminate stale tiles
  • Offboarding: clean removal workflow when a device is deregistered in HA

Home Assistant Integration

Per-device HA entities

Each registered device now automatically creates the following entities:

Entity Type Description
sensor.{device_id}_battery Sensor Battery level (%) from device telemetry
switch.{device_id}_keep_awake Switch Prevent device from sleeping
number.{device_id}_brightness Number Screen brightness (0.0–1.0)
select.{device_id}_orientation Select auto / portrait / landscape
number.{device_id}_screensaver_timeout Number Idle timeout in seconds (0 = off)
number.{device_id}_screensaver_font_size Number Screensaver clock font size (pt)
button.{device_id}_reload_config Button Force profile reload on device

All entities are backed by HA persistent storage and published to the device via MQTT on change.

Per-device notify services

Each device gets its own notify service: notify.mqttdash_{device_id}

Use it in automations:

service: notify.mqttdash_my_ipad
data:
  title: "Alert"
  message: "Laundry done"

Profile push API

New HTTP endpoint used by the profile editor's Deploy button:

  • POST /api/ha_mqtt_dash/apply_profile — receives profile JSON, validates it, stores it, and publishes to the device
  • GET /api/ha_mqtt_dash/entities — returns entity list for editor autocomplete
  • Security: local-network only (RFC-1918 + loopback), Bearer token required, rate-limited (20 req / 60 s per IP), 512 KB body limit

Profile validation

  • Maximum 20 pages, 200 widgets per page, 500 widgets total
  • String values capped at 4096 characters
  • JSON round-trip sanitization

New services

Service Description
ha_mqtt_dash.set_device_profile Push a profile to a device programmatically
ha_mqtt_dash.dump_store Debug: dump HA Store contents to log
ha_mqtt_dash.dump_runtime_cfg Debug: dump runtime config to log
ha_mqtt_dash.dump_device_config Debug: dump per-device config to log

Persistent storage

Profiles and device settings are now stored in HA's persistent storage (.storage/ha_mqtt_dash). They survive HA restarts and are restored without requiring the device to reconnect.

Device registry

Devices now appear in HA's device registry with meaningful names. All per-device entities are grouped under the device entry.