v0.5.0
[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: falsehides 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: nullopens an interactive recipe pickerrecipe_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
pagesarray alongside (or instead of) the flatwidgetsarray - 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
widgetsarray 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
NSForegroundColorAttributeNamevia 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 (
attrslist: temperature, humidity, wind_speed, etc.) attr_unitsmapping allows per-attribute unit overrides- Integration auto-injects
attr_basetopic
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 deviceGET /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.