[0.5.1] – 2026-06-10
A feature + reliability release: a new cover widget (blinds / shades / garage doors, with tilt), a fix for the iOS MQTT client failing to connect to strict brokers, a data-freshness watchdog that recovers from a stuck backend, and a reworked dev/deploy workflow.
iOS App
New widget type
cover – Blinds, shades, RF shades, and garage doors (cover.* entities)
- Controls adapt to the entity's
supported_featuresby default: open/close are always shown; the stop button appears only when the cover supports it; a position slider appears for covers that report position; tilt buttons and a tilt slider appear when tilt is supported - Granular, orderable controls (
cover_items): choose exactly which controls appear —open,close,stop,position,presets,tilt_open,tilt_close,tilt_slider— and their order (top→bottom in tall tiles, row sequence in wide tiles). The older coarsecover_controls(buttons/slider/presets/tilt) is still accepted and auto-expanded - Elastic layout:
cover_layout(auto/horizontal/vertical) sets orientation. In vertical layout the position/tilt sliders render as upright sliders (full-height travel) beside a button column, so they stay usable in tall 1×N tiles - Tilt controls use drawn slat icons that take the button text color (render correctly on iOS 5.1, where the previous glyphs showed as empty squares, and stay visible on light tiles); the status readout is height-capped so controls aren't cramped
- Position-preset buttons (
position_presets, default0 / 25 / 75 / 100) for one-tap positioning - Center label shows state (
OPEN/CLOSED/OPENING/CLOSING) plus the current position percentage when available protected: truerequires a confirmation tap before open/close (recommended for garage doors); the stop button is never gated- Publishes
open_cover/close_cover/stop_cover/set_cover_positionand the tilt equivalents
MQTT connection reliability — fixed
- Fixed a bug where the CONNECT packet could be silently truncated if the output stream was not yet writable the instant it opened, leaving strict brokers (e.g. mosquitto 2.x) waiting forever with no CONNACK (
connect timeout). Outbound writes are now buffered and flushed as the socket accepts data - Added an MQTT 3.1 fallback option (Settings) for brokers/listeners pinned to the legacy protocol
- Added Verbose MQTT log (Settings): logs the CONNECT summary (protocol, client-id, keepalive, credentials present, length) + a hex preview, byte counts, and a clearer timeout diagnostic
- Keepalive is now configurable and the client-id is guaranteed non-empty/unique
Data-freshness watchdog
- The app now tracks a backend heartbeat (and all inbound traffic) and forces a reconnect if data goes stale for ~90 s, recovering from a frozen-but-connected backend. Dormant unless the backend actually publishes heartbeats, so older integrations are unaffected
Home Assistant Integration
Cover support
- Routes cover commands to the matching
cover.*services (open_cover,close_cover,stop_cover,set_cover_position, and tilt variants) - Auto-injects
attr_basefor cover widgets;current_position,current_tilt_position, andsupported_featuresare mirrored automatically
Freshness heartbeat
- Publishes a retained per-device heartbeat to
mqttdash/dev/<device_id>/heartbeat({"ts":<unix>,"seq":<n>}) every ~30 s
Profile Editor
- Added the Cover widget type: live canvas visualization (elastic, matching the iOS layout) plus a config panel to pick individual controls and reorder them (↑/↓), choose layout direction, edit position presets, and toggle
protected
MQTT topics
- New retained topic
mqttdash/dev/<device_id>/heartbeat(HA → iPad), payload{"ts":<unix>,"seq":<n>} - Cover commands flow over
mqttdash/cmd/cover.<object>; cover state/attributes mirror undermqttdash/statestream/cover/<object>/…(includingcurrent_position,current_tilt_position,supported_features)