Skip to content

Releases: maxlyth/ha-paneld

v0.9.6-rc2

v0.9.6-rc2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 27 Jul 23:09

Recommended installation

Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.

From macOS, Linux, Git Bash, or WSL, run:

curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.6-rc2/ha-paneld-installer-v0.9.6-rc2.sh | bash

The ha-paneld-v0.9.6-rc2-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.

Important changes — please read before upgrading

This release candidate is primarily about keeping panels reachable and making failures visible while they can still be recovered. It warns about storage, database and Android power conditions that could make a panel unreliable, stops failed configuration changes from masquerading as success, and improves dashboard, installer and hardware-sensor recovery. Testers should focus on upgrades, sleep and wake behaviour, log delivery and sensor continuity.

Added

  • Panels now warn when storage or database problems could make them unreliable. The Dashboard, diagnostics and Home Assistant report available space, database growth and database health. Serious problems produce a persistent warning and cause fleet verification to fail with recovery guidance. This release only detects and reports problems; it never deletes data or performs automatic database maintenance.

  • Panels can identify Android power settings that may make them unreachable after the screen switches off. A warning explains the risk and offers Repair power safety where ha-paneld can safely apply and verify the supported safeguards without rebooting. Where Android requires a manual change, the panel provides specific guidance and lets you hide that exact unchanged caution after acting on it; diagnostics and installer verification continue to report the underlying state.

  • Remote Controls can now return a panel to its configured Dashboard. Dashboard navigation remains separate from Reload, so routine navigation does not unnecessarily rebuild the page. A remote Reload in Hardened security mode requires approval on the panel.

Changed

  • Log shipping now works reliably with standard collectors and is easier to troubleshoot. You can choose syslog over TCP or UDP, or HTTP, test the destination from the panel before saving, and see a useful explanation when the collector cannot be reached. Hostnames with both IPv4 and IPv6 addresses are handled correctly, existing installations retain their transport behaviour, and UDP status is described honestly because delivery cannot be confirmed. Fresh installations default to TCP because a rejected connection can be reported instead of silently losing records. A dependency-free test receiver is included for end-to-end checks.

Fixed

  • Failed settings changes no longer look successful or replace working configuration. A change becomes visible only after it has been written durably. If saving fails, the previous settings and their active behaviour remain in place, the request reports the failure, and a retry starts from the last known-good state.

  • Automatic Home dashboard selection is predictable and only chooses a dashboard the signed-in user can access. A blank selection follows the user's default, then the Home Assistant system default, then the first available dashboard. Temporary Home Assistant failures are retried instead of opening an invented or inaccessible route.

  • TPA10 temperature, humidity and proximity sensors recover correctly again. Climate readings remain active long enough to refresh, a trustworthy learned proximity model survives restart validation, and brief noise no longer makes the Home Assistant entity appear unavailable. A genuinely stalled or contradictory sensor still fails safely and enters bounded recovery.

  • The installer can recover an app that Android has placed into its stopped state. It verifies that the normal launcher route actually restored panel health and uses a bounded fallback when it did not, rather than reporting success while the panel remains unavailable.

  • Automatic-sleep activity updates no longer make the Configure page flash, collapse or jump. Presence-source and history refreshes update the affected content while preserving settled controls, chart position, focus and scroll state. Temporary Home Assistant registry or history failures retry without replacing useful information with a misleading broken state.

Upgrade notes

  • Use the normal installer for an in-place update. No configuration reset or manual Home Assistant entity cleanup is expected.

  • Existing installations retain their effective log-shipping transport: an explicit legacy syslog selection remains TCP, while an upgraded configuration that never stored a protocol continues using UDP. Fresh installations default to TCP. A scheme or port entered in Sink host, such as udp://collector or collector:1514, is now interpreted directly.

  • A critical storage or database warning now makes installer and fleet verification stop. Preserve ha-paneld.db, restore storage headroom or correct the reported database or I/O problem, then rerun verification; RC2 does not delete or compact data automatically.

  • A panel may show a new Power safety warning if Android cannot prove that it will remain reachable with the screen off. Review the guidance and use Repair power safety where offered; the repair does not reboot the panel. In Hardened security mode, remote repair, Reload and acknowledgement of a manual-only caution require physical approval on the panel.

v0.9.6-rc1

v0.9.6-rc1 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 27 Jul 06:33

Recommended installation

Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.

From macOS, Linux, Git Bash, or WSL, run:

curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.6-rc1/ha-paneld-installer-v0.9.6-rc1.sh | bash

The ha-paneld-v0.9.6-rc1-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.

The 0.9.6 release of ha-paneld is on track to be the largest to date, and I have been working night and day to get it out the door. Previously, I was careful to list the major changes so that testers could evaluate new features, but this time there are hundreds, and trying to annotate every one has long since stopped being viable.

Previous releases had largely ignored the new-user experience, and features had piled on with little thought about how a new user would navigate setting up a new panel. Over the pre-release cycle, we have evolved from a helper process for the Home Assistant Companion App into a fully fledged dashboard app with many capabilities that I cannot expect a new user to set up without context.

Therefore, the biggest new feature might not be visible to existing users upgrading from an earlier release. I have spent a lot of time resetting panels and iteratively building a first-run configuration workflow that can run directly on a panel or, preferably, from a user's laptop or phone. Choosing to support two very different runtimes did not make this easy, and I am certain there will be holes. I have tried to imagine and test corner cases, but I am sure there are many I have missed. Please report them so that someone else does not have to suffer the same error.

The change list below is therefore acknowledged to be full of omissions. If I have broken something that you relied upon and not listed it, please raise an issue. Here are some of the highlights.

Added

  • New panels get a guided setup journey — the panel and browser both expose /setup, which leads through connection, dashboard and renderer requirements, Home Assistant sign-in, and the entity-filter choice. A panel that cannot safely render the dashboard because its browser engine is too old receives a clear block and recovery direction instead of a blank or misleading dashboard.

  • Panel screen remote control — you can now simulate panel taps from the web UI in Relaxed security mode only, for obvious reasons. Click the screenshot in the Dashboard tab to access it. This is useful for navigating dashboard tabs remotely while trying to get full coverage of the entity filter. It is not designed to be a real-time, interactive, multi-touch terminal.

  • Upgrades and backups preserve more recoverable state — I completely refactored the database schema in 0.9.6 into a more abstract form. Configuration is vaulted before structural database changes, downgrade recovery is surfaced clearly, and panel backups now include portable durable state as well as settings and profiles. Configuration data older than 0.9.5 cannot be upgraded directly, so upgrade to 0.9.5 first if you need to migrate an older installation. On rooted panels, the installer also makes a best-effort protected same-panel database snapshot for manual break-glass recovery before an upgrade; sandboxed panels retain the fail-closed settings export only.

  • Auto sleep using Home Assistant presence devices as well as local activity — the panel combines touch and proximity activity with selected Home Assistant presence sources, learns suitable delays, and shows the reason for its current decision. You might get a better outcome with an automation written in Home Assistant, but this low-configuration panel-side solution might work for many users once an area and presence sources have been selected. The panel and Home Assistant sensors must share the same Home Assistant area.

  • Use Home Assistant's native dashboard interface — I discovered during the 0.9.6 work that Home Assistant has a new external-bus interface that covers authentication and dashboard lifecycle capabilities we had previously built ourselves. For future compatibility, I chose to use Home Assistant's native interface where possible. This means the built-in renderer now requires Home Assistant 2026.4.2 or newer.

  • The installer can deliberately start over safelyinstall.sh --reset-config creates and checks a settings export, asks for typed confirmation, clears the app only after the replacement APK has been authenticated, and then returns the panel to first-run setup. Learned entity, proximity, ambient and revision state is intentionally erased and is not restored by that export. The option is refused for fleet updates.

Changed

  • Automatic dashboard selection is more useful — Auto now resolves to ha-paneld's built-in renderer, and the Home dashboard can initially follow the Home Assistant user's configured default. Explicit external-renderer choices remain available for existing setups.

  • Broader entity-filter support — filtering now understands more dynamic dashboard and card patterns and explains when cards cannot be safely filtered, including compatibility limits for Bubble and Kiosk-style dashboards.

  • More sensible default values — I have gone over nearly all configuration items and set explicit defaults for new users. Existing installations keep settings that were explicitly saved, but a changed default can affect an installation that was relying on the previous implicit value. Please review your configuration and point out anything missing.

Fixed

  • The on-panel controls are clearer and more reliable — vendor packages that firmware disabled can be re-enabled before ha-paneld removes its own tame selection; screen-brightness status distinguishes reduced helper-backed control from genuinely unavailable control; protected Configure labels no longer separate from their approval shields; and screenshot controls are easier to read and operate.

  • Configured panels stay configured after an upgrade or reconnect — setup banners no longer promise a dashboard step that does not exist, and panels already using entity filtering are not stranded on its setup question.

Upgrade notes

  • Use the normal installer for an in-place update. If you choose --reset-config, keep the verified settings export and expect to complete first-run setup again; it restores configuration, not learned state. Existing installations should continue without manual Home Assistant entity or discovery changes; a complete panel backup remains recommended before any major update.

v0.9.5

Choose a tag to compare

@github-actions github-actions released this 20 Jul 23:09

Recommended installation

Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.

From macOS, Linux, Git Bash, or WSL, run:

curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.5/ha-paneld-installer-v0.9.5.sh | bash

The ha-paneld-v0.9.5-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.

ha-paneld is easier to sign into, adapts better to each panel’s environment and recovers more reliably from routine changes. It also makes sensitive maintenance safer without taking control away from existing installations.

Added

  • Sign a panel in to Home Assistant from a remote browser — Configure creates a short-lived link that can be opened normally or copied into a private window for another user, avoiding credential entry on the panel keyboard. Fresh installations print the next-step URL, and Configure shows the connected user’s display name.

  • Auto-brightness adapts to each room — it learns from up to seven days of panel or Home Assistant light readings, follows the normal daylight pattern and responds to changes such as a room light switching on. You can set the minimum automatic level, preview sensitivity changes and pause automatic control after a manual brightness change.

  • Proximity sensors now set themselves up automatically — ha-paneld learns empty-room and approaching-person readings, including whether the sensor rises or falls. Once it has enough reliable readings, Home Assistant receives occupancy and a 0–100 proximity level. A guided three-wave setup can teach it immediately, while brief fluctuations are ignored.

  • Optional Hardened security mode requires approval on the panel for sensitive remote actions — software changes, credential export or restore, profile activation, reboot and other sensitive maintenance wait for a one-time approval in the Android app. They cannot be approved remotely. Existing installations remain in Relaxed security mode unless Hardened security mode is deliberately enabled on the panel.

  • You can measure whether dashboard filtering makes a panel faster — a comparison records the same dashboard with filtering off and on, so you can compare response time rather than relying on how it feels. It can still collect useful results if the dashboard becomes unresponsive. Discussion #10

  • Obsolete learned dashboard entities can be cleared from the Entities tab — a confirmed reset clears learned and manually included or excluded entities while the current filter continues working until a fresh scan completes. Issue #50

  • The software navigation bar has a dedicated Dashboard action — it opens the configured dashboard without reloading it. Reload remains available separately if recovery is needed. Issue #43

  • NSPanel Pro Zigbee joining can be requested from Configure — once joining is enabled in ZHA or Zigbee2MQTT, an unjoined panel can try joining again without a restart.

  • Advanced setup no longer requires cloning the repository — the signed release installer can configure, verify, back up or restore a panel using install.sh --provision.

Changed

  • Kiosk-enabled panels go directly to their dashboard during routine startup — the built-in renderer shows the QR/configuration screen once after each ha-paneld version change, while a launchable external renderer goes directly to its dashboard. Admin Launcher and recovery states still retain the configuration screen. Issue #31

  • Configure and Install are easier to use on compact panels — related settings use shorter cards, Save changes appears only after a setting has changed, and setup tools such as display sizing, vendor packages and backup/restore are grouped on Install.

  • Wake on wave now requires a deliberate gesture — the display wakes only after a complete wave towards and then away from the panel. Setup, testing and standing near the panel no longer wake it accidentally; touch-to-wake remains available while it is learning.

  • Editable YAML files now define all hardware profiles — the editor suggests valid choices, prevents profiles for different hardware from being activated, and keeps unofficial reflashed-device profiles in the community catalog rather than presenting them as built-in support. Issue #28

  • Dashboard diagnostics identify busy Home Assistant entities more clearly — they show which three entities sent the most updates and data during the past hour.

  • Panel information is more useful — runtime diagnostics report app storage plus verified-boot and bootloader status without configured names; profile views show clearer processor details and useful reference links.

Fixed

  • Panels are less likely to become unavailable after settings, network or helper changes — replaced tasks and MQTT connections now shut down cleanly, and losing privileged screen control no longer leaves ha-paneld permanently unresponsive.

  • LED and button-backlight controls now reach the hardware reliably — controls no longer return to off while brightness is changing, and button-backlight entities use Home Assistant’s normal light icon.

  • Installer progress and failures are clearer — named stages show what is happening, backups are checked before connecting, stalled downloads and installs time out cleanly, and panels with insufficient system space receive a clear explanation. Issue #44, Issue #46

  • Adaptive-brightness settings are validated before saving — unreadable, missing or non-numeric Home Assistant light entities leave the current source and other pending settings unchanged, while invalid values show the supported range and an actionable error.

  • Wake on wave can be taught before a proximity sensor has identified how it works — simple on/off and graduated sensors can complete guided learning, while missing or unknown sources remain safely disabled. Relearning or changing the sensor no longer leaves wake-on-wave incorrectly enabled after a restart.

  • Ethernet-connected panels no longer expose unavailable Wi-Fi diagnostics — Wi-Fi network and signal entities appear only while Wi-Fi is the active connection, and stale values are removed when it changes to Ethernet. Issue #21

  • Restoring a backup no longer changes untouched vendor Zigbee settings, including when an older backup is restored. Issue #48

  • Hardened security mode no longer reuses credentials after a Home Assistant or MQTT server change — enter credentials for the new server or the old secret is cleared.

  • Install and Configure report the real outcome without discarding newer edits — failed display-size changes are no longer shown as successful, and settings appear only where they apply.

  • CPU and temperature sensors explain when the installed helper is too old instead of silently disappearing. Issue #21

  • Disabled features stop consuming resources while temporarily unavailable sensors retry at a controlled rate and repeated diagnostic requests share one refresh.

  • Live Sensors shows brightness as a percentage while retaining the 0–255 value for diagnostics. Issue #30

  • Panel capability lists omit hardware known to be absent while Generic profiles retain discovery guidance for unknown hardware.

Upgrade notes

  • Existing panels remain in Relaxed security mode. Enable Hardened security mode only from the Android app’s Configure toolbar on the panel after disabling classic network ADB and Android Wireless debugging; remote tap injection remains unavailable until the panel returns to Relaxed security mode.

v0.9.4

Choose a tag to compare

@github-actions github-actions released this 16 Jul 19:01

Recommended installation

Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.

From macOS, Linux, Git Bash, or WSL, run:

curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.4/ha-paneld-installer-v0.9.4.sh | bash

The ha-paneld-v0.9.4-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.

ha-paneld can now help explain why a built-in Home Assistant dashboard feels slow. New and updated cards on the Dashboard tab measure interaction delay, main-thread blocking, Home Assistant state traffic and renderer instability, then report a conservative likely cause. This helps distinguish an overloaded dashboard from excessive entity updates, memory pressure or another busy process on the panel.

Installation now uses the panel's active hardware profile in a single pass. The one-line installer starts ha-paneld during the installation run so the app can identify the panel before setup finishes. It then verifies the profile-specific access, helper and software requirements, while clearly reporting any optional or on-panel steps instead of silently applying them.

Added

  • Built-in dashboard performance diagnostics — interaction timing is separated into input delay, event handling and presentation alongside state-update rate, payload volume, main-thread occupancy, long frames and renderer reloads. These measurements do not require root or WebView debugging when using the built-in renderer.
  • Persistent performance history — content-free, minute-level dashboard measurements are retained for up to seven days and available through the API for before-and-after comparisons across page reloads and app restarts.
  • NSPanel Pro Zigbee gateway health reporting and runaway protection — ha-paneld reports gateway state, join status, CPU use, restart history and containment results. An unjoined gateway with sustained high CPU, or a configured gateway on a supported layout that repeatedly restarts, can be switched off automatically after a startup grace period; a joined gateway is never stopped merely for high CPU use.
  • Profile-aware installation in one pass — the one-line installer starts the app, waits for it to identify the panel profile, then verifies the access, helper and software requirements for that hardware before reporting the installation complete.

Changed

  • Full panel backups now preserve more recoverable state — backups include configuration, custom profiles and entity-filter choices, with optional Home Assistant Companion login data. Supplying a passphrase creates an encrypted .hpb backup; creating an unencrypted .zip requires explicit acknowledgement.
  • Persistent application state is consolidated into a local database — existing settings and learned entity data migrate automatically on first start, providing a common durable store for configuration, profiles and performance history.
  • Root-helper upgrades are authenticated and recoverable — the installer verifies that the helper matches the release and retains the previous working installation until the app and replacement helper have both been verified.
  • Custom profiles now use schema 2 — provisioning recommendations are separated from hardware capabilities and runtime configuration. Existing schema 1 revisions remain available for inspection and export but cannot be activated; ha-paneld falls back to a compatible bundled profile or Generic until the profile is updated.
  • Profile recommendations no longer make optional system changes automatically — ordinary and fleet installation report recommended vendor-package changes instead. Existing package controls explicitly selected by the user continue to work and reapply at boot.

Fixed

  • Dashboard screenshots remain visible while refreshing — returning to Dashboard shows the last successful capture immediately and replaces it only after a fresh screenshot has loaded; a slow or failed capture no longer blanks the card.
  • Panel capability reporting is easier to interpret — the effective WebView rendering engine leads over stale package-reported versions, helper-backed root capability is not presented as a failure, and operational details such as state convergence, MQTT authentication timing and audio playback are separated from core panel information.
  • Successful installation is no longer reported as failed because a later optional recommendation could not be completed — required installation and startup failures still fail the run, while optional actions are reported separately.
  • Configuration changes and shutdown no longer leave duplicate or stale background operations running — superseded work is collapsed or cancelled once its result is no longer relevant.
  • WF1589T LED ownership is reported accurately — the conflicting vendor LED service is presented as an optional, reversible package-control recommendation rather than being changed automatically.
  • Large backups and Companion login restores use bounded file-backed processing — backup, encryption, upload, validation and restore no longer need to hold the complete archive in memory.

Upgrade notes

  • Custom profiles created for schema 1 must be updated to schema 2 before they can be activated.
  • Existing settings and learned entity data should migrate automatically, but an explicit panel backup is recommended before installing this release.
  • Unencrypted backups now use .zip; encrypted backups continue to use .hpb.
  • Profile-recommended vendor-package changes are no longer applied automatically. Review the post-install guidance if a hardware feature depends on one.

v0.9.3

Choose a tag to compare

@github-actions github-actions released this 15 Jul 23:41

Recommended installation

Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.

From macOS, Linux, Git Bash, or WSL, run:

curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.3/ha-paneld-installer-v0.9.3.sh | bash

The ha-paneld-v0.9.3-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.

Device support is no longer limited to profiles shipped by the ha-paneld project. Panel owners and hardware vendors can create, edit, validate, import, activate, export and share panel profiles without rebuilding the app. Profiles remain declarative and limited to capabilities already implemented by ha-paneld, so extending hardware support cannot introduce executable code or arbitrary privileged operations.

This release also strengthens dependency and release verification, updates the shipped MQTT networking stack to security-patched versions and adds optional enhanced access for genuinely unrooted panels.

Added

  • Panel support can be added or refined through validated YAML profiles — the new Profile page can inspect the active bundled profile, edit or import a profile, preview validation, activate a revision, return to automatic selection and roll back to the last working revision. Profiles select bounded drivers and curated artifacts supported by ha-paneld; they cannot introduce shell commands, arbitrary paths, credentials or executable code. An unknown panel can also create a conservative draft from passive diagnostics for refinement and sharing, while bundled profiles include comments explaining how important values were established.
  • Optional Shizuku enhanced access is available for genuinely unrooted panels — after the checksum-pinned Shizuku manager is installed and its service started, the user can approve ha-paneld locally to gain display sizing, screenshots, key and tap input, and signer-verified ha-paneld or minimal Home Assistant Companion installs. It does not provide root or the root-only hardware, system and private-data capabilities. The approval cannot be enabled remotely, and a service started through ADB normally needs rearming after a reboot.
  • Provisioning can prepare the optional Shizuku path without hiding the remaining on-panel stepprovision.sh --shizuku verifies or installs the pinned manager, starts its ADB service and points to the local approval screen. A trusted same or newer manager is retained on a repeated run.

Changed

  • Dependency and release inputs now have stronger supply-chain controls — Gradle artifacts are locked and checksum or signature verified, npm tools use exact lockfiles without dependency lifecycle scripts, GitHub Actions use full commit pins and publishing tools use hash-locked dependencies. Separately scoped CycloneDX inventories describe the Android/Gradle and embedded profile-editor runtimes, while curated Shizuku and WebView APKs require their recorded checksum as well as the expected package and signer.
  • The shipped MQTT networking stack has been updated to security-patched versions — the HiveMQ client now uses the updated Netty transport line while retaining the existing MQTT connection and recovery model.
  • Release validation is more resilient and precise — software inventories carry stable document identities, security analysis uses high-precision queries, and an external attestation outage no longer prevents an otherwise signed and verified release from being published.
  • Fleet imports now fail closed for new settings — a setting is copied between panels only after it has been explicitly classified as portable. Shared endpoints and common behaviour preferences remain portable, while credentials, renderer and dashboard state, calibration, display tuning, update policy and logging stay with their original panel.

Fixed

  • A configured dashboard returns to the foreground reliably after startup — once Android's home-screen state has been reconciled, ha-paneld opens a ready built-in or explicitly selected external renderer instead of leaving the admin launcher visible. Interrupted built-in-renderer preparation remains retryable. (#31)
  • The admin launcher's Dashboard tile opens the configured renderer — it now selects a ready built-in renderer, an explicitly selected external renderer or the existing automatic Companion fallback without showing unusable or duplicate targets. (#32)
  • Restoring a Home Assistant Companion login repairs a blank internal server URL before it goes live — ha-paneld applies and verifies the repair in the staged database before entering the rollback-capable live transaction. A failed repair leaves the existing Companion data untouched instead of restoring a login that opens Home Assistant's “Missing Host header” error.
  • Credential backup and HTTPS audio handling are safer — Android's implicit app backup and device-transfer path is disabled and excludes credential preferences, while HTTPS audio downloads use Android's normal certificate and hostname verification.
  • Embedded browser and local navigation targets are more tightly constrained — embedded browser views reject file and content-provider access, release links accept only GitHub HTTPS destinations, peer navigation targets are validated before use and screenshot hydration stays on its fixed same-origin endpoint.

Docs

  • The NSPanel Pro firmware index now includes the omitted 4.5.3 files — the monitor also verifies each indexed download's size and its documentation now matches the daily seven-day availability history.

v0.9.2

Choose a tag to compare

@github-actions github-actions released this 15 Jul 00:26

Recommended installation

Do not use adb install directly. It installs the APK but does not complete ha-paneld's permissions, startup, configuration, and verification.

From macOS, Linux, Git Bash, or WSL, run:

curl -fsSL https://github.com/maxlyth/ha-paneld/releases/download/v0.9.2/ha-paneld-installer-v0.9.2.sh | bash

The ha-paneld-v0.9.2-manual-setup-required.apk asset is for manual or on-device sideloading. After installing it, open ha-paneld and complete the on-panel setup.

Home Assistant dashboards that seemed too demanding for a low-powered wall panel can now be made far more responsive. A large Home Assistant installation may send thousands of entity states and updates to a panel even when its dashboard displays only a small fraction of them, causing delayed taps and sluggish navigation. The built-in renderer can now learn what the dashboard uses and ask Home Assistant to send only those states. Automatic filtering remains experimental, opt-in and exclusive to the built-in renderer, but it no longer requires a hand-maintained entity list. For installations using a second Home Assistant instance, filtering proxy or similar workaround solely to reduce panel load, the built-in filter may allow that extra infrastructure to be retired.

Added

  • Automatic dashboard entity filtering for the built-in renderer — ha-paneld examines the configured dashboard, observes the states it uses while running and builds a focused Home Assistant subscription. A dedicated Entities page shows what was found, explains why each entity is included and allows manual additions or exclusions before filtering is enabled.
  • Potentially unsafe dashboard rules are identified before filtering — broad or dynamic rules that ha-paneld recognizes are shown with their source and a suggested correction. Users can fix the dashboard, deliberately continue without the uncertain entities or leave filtering disabled; ignored warnings remain visible and can be restored later. Custom cards and behavior that automatic learning has not observed may still require manual review.
  • Learned entity choices persist without making backups unnecessarily large — ha-paneld retains the user's manual choices, discards old observations automatically and can rebuild the rest of the catalog when needed. Existing exact entity lists remain supported through /api/v1/dashboard/entity-filter for controlled or externally managed setups.
  • Built-in dashboard performance is now measurable on every panel — the Performance page and /api/v1/perf show how long a cold or warm dashboard load takes to become usable and how often the renderer has reloaded unexpectedly in the past 24 hours. These measurements do not require root and make it easier to see whether a renderer or configuration change actually helped.
  • Two newly reported panel types now identify correctly — preliminary profiles give the Amazon Echo Show 5 Gen 2 running LineageOS and the unbranded ZX-SMT156/RK3566_T cautious defaults based on their submitted diagnostics. Follow-up diagnostic reports also collect the remaining hardware details needed to refine support without a long manual adb session.
  • Dashboard startup now shows what the panel is waiting for — if networking is still coming up after a reboot, the built-in dashboard shows whether it is waiting for network services, a link, an address or a connection instead of looking broken. It learns the panel's typical startup time to give more useful progress on later boots and disappears entirely when networking is already ready.

Changed

  • Changes made on the panel now stay in sync with Home Assistant — screen power, brightness, volume, relays, LEDs and proximity could become stale or briefly jump back after a local or external change. ha-paneld now reports the latest confirmed panel state and keeps pending updates in order.
  • Installing the APK alone is clearly identified as incomplete setup — releases now lead with the installer that handles permissions, startup, configuration and verification. The APK remains available for on-device sideloading and manual setups.
  • The unfinished remote-control page is withheld — the Test tab and its screenshot tap-control workflow are hidden while the feature is reviewed for reliability. Existing screenshot, action, input and audio APIs remain available, and old /test bookmarks return to Dashboard.

Fixed

  • Panels recover automatically from a temporary MQTT login rejection — a rejected connection could leave a panel offline or start overlapping reconnect attempts. ha-paneld now starts a fresh connection and retries at a controlled pace, while diagnostics show what happened and when the next attempt will run.
  • Home Assistant entities no longer become stale after a failed MQTT update — a missed state update could block later changes or trigger repeated retries. ha-paneld now keeps the latest panel state, limits the retry rate and continues sending pending updates.
  • Home Assistant now shows the screen's real power state — on panels such as the TPA10, switching off the backlight could leave Home Assistant showing the screen as on because the stored brightness remained non-zero. ha-paneld now reads whether the backlight itself is powered. The updated app and helper daemon must be installed together on affected panels.
  • Settings changes and restarts no longer mix old and new behaviour — work already underway during a settings change, MQTT reconnect or service restart could finish using the previous configuration, allowing an old connection, dashboard, audio request or status update to reappear after the change. ha-paneld now discards anything that belongs to the previous setup once its replacement begins.
  • Home Assistant no longer shows hardware changes that did not happen — if an LED, relay or display command failed or was overtaken by a newer command, Home Assistant could still show the requested state even though the panel had not applied it. ha-paneld now publishes changes only after the hardware confirms them and prevents older commands from replacing newer ones.
  • Interrupted maintenance tasks no longer look successful — an upload, download, software installation or uninstall that stopped part-way could still be reported as complete, while a failed update check could leave an old result looking current. ha-paneld now keeps these failures visible and reports success only when the full operation finishes.
  • A reboot no longer shows two connection errors before the dashboard appears — if networking was not ready, the built-in dashboard could first show Chromium's offline error and then Home Assistant's 60-second connection-failed countdown. It now waits for the network and opens the dashboard directly; genuine later failures still retry.
  • “Silence boot chime” now also silences startup notification sounds — on panels with separate ring and notification volumes, startup could still play a notification sound even when Silence boot chime was enabled. The setting now mutes both streams and uses a silent notification channel.
  • “Open in Home Assistant” follows the panel's current server and device — changing the Home Assistant server or panel identity no longer leaves the button pointing at an obsolete device or a device on the previous server.
  • Display information no longer presents Android's base logical density as native DPI — the logical density used to size the interface is labelled separately from the screen's physical pixels per inch, which is shown only for device profiles where it is known reliably.
  • Helper-backed panels no longer claim that working privileged controls are unavailable — diagnostics now distinguish direct app access to su from actions routed through the helper daemon, such as reboot and reload on the TPA10.

v0.9.1

Choose a tag to compare

@github-actions github-actions released this 12 Jul 01:50

Added

  • Opt-in System WebView auto-update — a new "WebView auto-update" switch (off by default; shown only where ha-paneld pins a recommended WebView for the panel) keeps the system WebView on that pinned build, installing a newer one over root on the update check. Note that the first swap between two different WebView vendors on a signature-locked panel is still a one-time manual step — see the panel's hardware guide.
  • Dashboard sizing matches the Companion app — the built-in renderer now scales the page the same way the Home Assistant Companion app does, so a panel switched over from the Companion keeps its dashboard layout instead of rendering more compact. A new "Dashboard zoom" setting tunes it per panel (100% = Companion default); pinch-to-zoom stays off, since a fixed panel wants a deliberate zoom, not an accidental one. Switching a panel to the built-in renderer also carries over the zoom you had chosen in the Companion app's "Page zoom" setting — and on a rooted panel, if the zoom isn't 100%, ha-paneld points you at the panel display-density control (a crisper way to size the dashboard) with a one-tap reset.
  • "App Configuration" in the dashboard sidebar — the built-in renderer now adds the same sidebar entry the Companion app does; tapping it opens ha-paneld's own configuration page on the panel.
  • Panel-appropriate defaults on first run — a panel running the built-in renderer now starts with the sidebar hidden and background connections kept alive (so it stays responsive when idle), values most people never think to set. These are applied once and remain changeable afterwards.

Changed

  • TPA10-class panels now recommend LineageOS WebView 150 instead of Cromite. LineageOS is a newer, maintained, vanilla-Chromium build that — unlike Cromite — leaves autoplay enabled, so Home Assistant camera-card (WebRTC) streams start without a tap. Cromite remains available as a fallback.
  • The built-in renderer no longer bounces on overscroll — dragging past the top or bottom of the dashboard used to show Android's elastic stretch (or edge glow on older panels), which looks out of place on a wall panel that rarely scrolls, so it is now off by default. A dashboard_overscroll setting restores the native effect for anyone who wants it (settable over the API).
  • Smoother LED effect animations — the pulse (breathing) effect now runs at a higher frame rate along a smooth curve, so it glides rather than steps, and no longer flashes white at the dim end of each breath.

Fixed

  • The soft navbar no longer swallows taps at the bottom of the built-in renderer — in "Swipe reveal" mode ha-paneld armed a full-width overlay strip that consumed every touch in the bottom ~48dp band (re-injecting non-swipe taps via a slow root call, and dropping them entirely on panels without root). The built-in renderer now detects the reveal swipe within the dashboard activity instead, so taps and scrolls at the bottom edge reach the dashboard with no latency, while a genuine upward edge-swipe still reveals the bar.
  • Pull-to-refresh no longer fires from a drag inside the dashboard — the built-in renderer's refresh gesture now arms only for a drag that starts at the very top edge of the screen and pulls down into it. Previously any downward drag on the dashboard content could trigger it, because the Home Assistant frontend scrolls inside the page and the stock gesture check therefore always believed the view was at the top. Scrolling views and dragging card controls now never start a refresh, regardless of scroll position. (#29)
  • LED effects now stop reliably — an effect (strobe, blink or pulse) stops the moment the light is turned off or the effect is changed. Previously an effect could keep running after the light was turned off, and occasionally get stuck flashing until the app was restarted. (#16)

Full Changelog: v0.9.0...v0.9.1

v0.9.0

Choose a tag to compare

@github-actions github-actions released this 10 Jul 15:00

Headline: ha-paneld can now render the Home Assistant dashboard itself. 0.9 changes the project's stance: previously a headless agent that always deferred dashboard rendering to the HA Companion app, ha-paneld now offers its own built-in renderer (experimental, off by default) so a panel can run as a single-app appliance. The Companion app remains today's default and a permanently supported path. Everything below is cumulative since v0.8.7.

Added

  • Built-in dashboard renderer (experimental) — ha-paneld renders the HA dashboard in its own WebView: authenticated with the same external_auth contract the Companion uses, provisioned with zero typing on the panel (provision.sh --builtin --ha-url with --ha-token or --ha-user/--ha-pass), and integrated with the watchdog/kiosk machinery as a first-class dashboard target. Engineered for weeks-long unattended uptimes: the page freezes while the screen is off (~70% renderer CPU saved), a handshake watchdog reloads a dashboard that fails to actually connect (with backing-off retries and a clean "Reconnecting…" screen instead of a browser error page), memory is bounded by invisible screen-off reloads, renderer crashes are contained and rate-limited (falling back to the admin launcher rather than churning), and a definitively revoked login latches with on-panel fix instructions instead of retrying forever.
  • Renderer quality-of-life — camera streams autoplay (with fullscreen video and native confirm/alert handling), instant pull-to-refresh (drag down re-navigates the live frontend; double-pull for a full reload), an optional idle return-to-home, an edge-to-edge fullscreen mode (bars revealed by an edge swipe), a "Clear renderer storage" remote heal, and private-CA HTTPS support (user-installed CAs are trusted, matching the Companion).
  • Light/dark theming across every surface — the web UI follows each viewing browser's light/dark preference (with a ?theme=light|dark override for testing); a "Dark mode" toggle on the Display card themes ha-paneld's own screens and sets the built-in dashboard's default colour scheme on panels without a system dark-mode setting (Android 9 and older); a theme picked inside HA always wins.
  • The Configure page follows settings changed outside it — an open Configure tab auto-reloads when the panel's settings change via the API, an HA entity, or another browser; unsaved edits are never destroyed (a banner offers the reload instead).
  • Honest handling of features that need root — on a panel without root, the features that require it are shown greyed with a lock note (never hidden) so you can see what's unavailable and why; the no-root Install picker offers a Download APK link for a manual update, and the installer states plainly at provision time which capability tier your panel is in.
  • One-click switch from the Companion — picking the built-in renderer borrows an installed Companion's sign-in automatically (root panels), so trying it is a single picker change.
  • LED effectsstrobe, blink and pulse through HA's native light effect selector.
  • MQTT over TLSssl:///mqtts:// broker URLs connect over TLS with the default trust store (CA-signed brokers validate; port defaults to 8883).
  • --prerelease install channelinstall.sh … | bash -s -- --prerelease (and provision.sh --prerelease) installs the newest release-candidate instead of the latest stable, for testing pre-release builds.

Changed

  • Dashboard settings get their own Configure card with a known-renderers-only picker, and Configure cards carry maturity badges ("skunk-works" / "experimental") so pre-release surfaces are labelled.
  • The performance page attributes cost honestly — sampling is far lighter, the sampler's own probe cost is shown as its own row, and the built-in renderer's hosting cost is labelled as such.
  • Companion auto-update settings step back when there's no Companion — hidden from the form and their HA entities withdrawn on Companion-less panels; listed after ha-paneld's own update settings.

Fixed

  • A cumulative pass of renderer and platform fixes shipped across the rcs, highlights: a renderer crash-loop can no longer churn the panel all night; a revoked login is recoverable from the Configure tab; kiosk/watchdog returns no longer reload a healthy dashboard; switching an existing panel to the built-in renderer reclaims the HOME role from the Companion; the soft navbar's Reload could force-stop ha-paneld itself on a builtin panel; settings side-effects (fullscreen, dark mode) now truly apply on save; a stale "Companion update available" notice can no longer outlive an uninstall; the Rockchip /dev/ledjni RGB-LED driver is labelled accurately for non-rk3576 SoCs; provision.sh login failures explain themselves and credentials with special characters work; vendor-tamed panels bring the dashboard up promptly after taming the vendor home launcher.

Full Changelog: v0.8.7...v0.9.0

v0.8.7

Choose a tag to compare

@github-actions github-actions released this 07 Jul 15:29

This release includes a large amount of work to improve the reliability of the install and provisioning scripts (install.sh, provision.sh, and the root-daemon installer) across the supported panels — su-dialect probing, adb preflighting, honest self-verification, and clear, classified failure reporting. If you still hit an install or provisioning problem, please report it so it can be fixed.

Beyond that, panel telemetry is more reliable across the fleet, the Tuya TPA10 gains room temperature/humidity sensors, and the :8888 header is now responsive on narrow panels.

Added

  • Room temperature & humidity on the Tuya TPA10 — the onboard CHT8305 chip is exposed as opt-in Room temperature / Room humidity sensors in Home Assistant, read through the root helper daemon (proper temperature/humidity device classes, off by default), with a per-panel calibration offset for panel self-heating.

Changed

  • Provisioning is much more robustprovision.sh and the root-daemon installer now probe each panel's su dialect (join-style vs exec-style, su 0 / su root / su -c, or root-adbd with no su), preflight the adb connection and fail fast (~12s) with specific recovery steps instead of hanging, classify install failures (signature mismatch, downgrade, out-of-storage) with how to recover, and degrade gracefully when a vendor build refuses adb-side permission grants. The daemon installer's exit code now reflects whether the daemon is actually running.
  • Diagnostic sensors populate on more panels — CPU usage and SoC temperature fall back to the root helper daemon when the app can't read them directly, so they no longer show "Unknown" on sandboxed panels. All OS-sourced telemetry — the diagnostic sensors and the :8888 performance view — now flows through one shared reader instead of two paths that could disagree.
  • Responsive :8888 header — a sticky top bar that never scrolls away; on a narrow or single-column panel the tab bar collapses to a hamburger menu and header items progressively hide instead of wrapping, so the header never overflows.
  • Config & controls polish — the "expose to Home Assistant" control is now a link / broken-link icon toggle, and the Controls action buttons collapse to icons when the row would otherwise wrap. The low-value instrumentation master switch is gone (the performance sampler stays gated by page views, the real cost control).

Fixed

  • /api/v1/diag responds instantly — it serves the last-known panel snapshot and refreshes in the background instead of re-running the full probe suite (which can take >12s on an NSPanel Pro).
  • provision.sh self-verify and --persist-adb work reliably — verify no longer always ended "re-run to finish", --persist-adb is confirmed by read-back, and provisioning can no longer clobber other accessibility services if it can't read the current list.
  • "Open in Home Assistant" is more reliable — it falls back to the URL the HA Companion already uses when the panel's own HA device-page URL can't resolve.
  • On the Tuya TPA10, the room-temperature calibration offset saves from the web UI (a posted value was previously accepted but silently dropped), and the older temperature/humidity sensors — which never streamed a live value on this chip — are retired in favour of the daemon-read room_temp/room_humidity.

Docs

  • The root-daemon install step (helper/install-daemon.sh) is now linked from the provisioning guide.

Full Changelog: v0.8.6...v0.8.7

v0.8.6

Choose a tag to compare

@github-actions github-actions released this 05 Jul 21:44

The Install tab becomes a software-management hub, panels get encrypted backup/restore and self-healing update paths, and health problems surface much earlier and more clearly.

Added

  • The Install tab is a software-management hub — view and update ha-paneld, the HA Companion and the System WebView from :8888, each with a channel selector and a picker of recent releases, an on-demand health re-check, and an update banner with a per-version "Ignore this version" dismissal.
  • Encrypted panel backup & restore — export a panel's full state (ha-paneld config plus, on a rooted panel, the HA Companion login) as a passphrase-sealed bundle; restore reapplies the config and re-logs in the Companion with no on-panel OAuth — the wall-panel equivalent of the cloud app-data backup these GMS-less panels don't have.
  • One-tap self-heal for the two most common blank-dashboard causes — a too-old System WebView (downloaded and installed from the ha-paneld WebView mirror, per-panel known-good build) and a Companion with no internal URL (which shows as a "Missing 'Host' header" screen).
  • Watchdog crash-loop protection — a dashboard app that crashes on every launch backs off instead of restart-storming and raises a clear health warning; a per-panel Companion version cap guards against a known-bad update (e.g. the NSPanel Pro's Android 8.1 crashing on Companion 2026.6.5+).
  • Install an APK from the web UI, and uninstall a removable app — both gated behind explicit opt-in toggles (ha-paneld itself and the System WebView provider can't be removed this way).
  • Opt-in diagnostic sensors (IP address, CPU usage, memory usage, SoC temperature, boot time), and local-state sync extended to the CPU governor — values changed outside ha-paneld now reach Home Assistant without flooding the broker.
  • Panel switcher in the :8888 header — on a multi-panel network, the panel's name becomes a dropdown that jumps your browser to the same view on another panel.
  • Experimental kiosk lock — an opt-in per-panel setting that keeps non-admin users on the dashboard by suppressing the Android navigation bar and returning to the dashboard on any navigate-away; always reversible (on-panel 7-tap unlock, :8888, Home Assistant, or a reboot).
  • Dashboard & Launcher app pickers are now dropdowns of installed apps, and both settings show what "auto" resolves to instead of a bare placeholder.
  • Provisioning tames recommended vendor apps by default (e.g. the NSPanel Pro's eWeLink control-panel overlay and factory test tools) — reversible, and it can never strand the panel's home role.
  • Live log viewer (Logs tab, app + system sources, pause/filter/follow) and a live Sensors card on the Dashboard, both served over Server-Sent Events with the same redaction pass as remote log shipping.
  • Companion auto-update channel (Stable / Pre-release), and full config export/import via provision.sh.

Changed

  • Publishing a setting to Home Assistant is now opt-in per setting — admin-oriented settings (self-update, Companion auto-update, network ADB, Zigbee router, app watchdog) are panel-local by default; existing panels keep whatever they already expose.
  • The web UI loads instantly — the Dashboard and Configure tab render immediately from a cached, single-flight probe snapshot instead of blocking on every root-probed value.
  • Safer, leaner APK installs — every over-the-air install preflights free space and streams the verified APK straight into the installer instead of keeping a second staged copy.
  • The header shows the panel's friendly name instead of its panel_id, and panel-health warnings are more prominent, with a one-tap self-heal offered from a failed Companion login.
  • Clearer update-entity names ("ha-paneld auto-update"), and config import is now best-effort — valid keys apply even when others in the same bundle don't.

Fixed

  • Home Assistant entity ids are anchored to the panel id, not the friendly name — new entities keep stable sensor.<panel>_*-style ids regardless of how the device is renamed.
  • Local changes now reach Home Assistant — brightness, volume and the effective backlight sync back to HA via a deadbanded, settle-aware heartbeat instead of going stale until the next command.
  • Vendor kiosk launchers (eWeLink) can be tamed without stranding the panel, and the Launcher button always falls back to something usable instead of doing nothing.
  • MQTT reliability — a superseded client rebuilding in the background could no longer overwrite the live connection's status with a false "credentials rejected" warning.
  • A brightness command or an interrupted config save can no longer leave the panel in a bad state — brightness floors above zero, and config writes are atomic.
  • A hung su can no longer stall the app — one-shot root commands now run with a hard timeout.
  • Touch-to-wake — a screen-off can never strand the panel dark, even before proximity calibration.
  • "Open in Home Assistant" self-heals when HA's device id changes, and auto-return after a relaunch now waits for the MQTT reconnect instead of giving up after 8 seconds.

Security

  • CSRF and DNS-rebinding protection on the :8888 control API.
  • App and Companion updates download over HTTPS only, on top of the existing signature + package pin.

Full Changelog: v0.8.5...v0.8.6