ha-paneld version
0.9.7 (build 776)
Panel hardware
Sonoff NSPanel Pro (86P / 120P, PX30 / rk3326)
What happened?
0.9.7's new HA Companion update entity is announced on every panel, including panels that run the built-in renderer and have no Companion app installed at all. With nothing installed it publishes installed_version: "not installed" alongside a real latest_version, so Home Assistant treats it as a pending update permanently: the panel is listed on Settings → Updates, it counts towards the Settings badge, and "Update all" would install the minimal Companion on panels that deliberately don't have it.
On a 16-panel fleet that's 16 phantom updates that can never be cleared.
Live state on one panel (built-in renderer, [packages] android=not installed minimal=not installed in the dump below):
update.<panel>_ha_companion state=on
installed_version: "not installed"
latest_version: "2026.4.4"
title: "HA Companion"
release_summary: "Stable channel. This panel's safety cap is 2026.5.4; the newest release is
2026.6.5. Not installed; installing adds the minimal app."
There's also no way to withhold it from the panel side. SoftwareUpdateEntities.shape() (v0.9.7, line 221) only sets announced = false when inputs.suppressed is set, and that is only ever set for the ha-paneld component (Panel Assistant ownership) — the Companion entity is unconditional. It's published via reconcileSoftwareUpdates() rather than registryExposable, so unlike the other optional entities it has no "expose to HA" toggle in Configure.
That leaves only Home-Assistant-side remedies: disable or hide the entity on every panel, or Skip the version — and a skip comes back with the next Companion release.
Expected: a panel with no Companion installed shouldn't advertise a pending Companion update, or it should at least be possible to withhold the entity.
The "install the Companion from Home Assistant" affordance itself is genuinely useful — the ask is only that it stops presenting as a pending update on panels that don't have the app. Any one of these would do it:
- don't publish
latest_version when installedVersion == null (state stays off; installable() and the install command are unaffected, so the deliberate "install the minimal app" path still works);
- gate the entity on the active renderer, or on
companion_auto_update;
- route it through SettingsRegistry so it honours a per-panel expose toggle like the other optional entities.
Steps to reproduce
- Panel on 0.9.7 using the built-in renderer with no Companion app installed (
[packages] android=not installed minimal=not installed).
- Connect it to Home Assistant over MQTT and let discovery run.
- Settings → Updates —
<panel> · HA Companion <version> is listed as an available update, permanently.
Diagnostic dump (/diag)
ha-paneld diagnostics — 0.9.7 (build 776)
[captured] 2026-09-15T10:31:18.509-06:00 uptime=2d4h
[panel]
ha-paneld=0.9.7 (build 776)
Android=8.1.0 (API 27)
Firmware=3.8.0
Device=rockchip px30_evb (px30_evb)
CPU=4 cores · arm64-v8a · rk30board
RAM=1.9 GB total · 1.2 GB free
Storage=7.8 GB eMMC · 2.2 GB free (data)
Display=750×1334 px · logical 320 dpi
System WebView=com.android.webview 138.0.7204.63
HA Companion=not installed
MQTT state=connected · TCP/IPv4 · last-ok 29s ago · last-auth 101437s ago · auth-ok · family Automatic (next IPv4)
Security mode=Relaxed
Keep panel responsive=on · power locks held
Prevent idle dim=on · timeout never
Android dashboard lock=off
LED=none
Nav actions (a11y)=yes
Navbar=Swipe reveal
Zigbee=vendor-native · running · Repeater
Relays=none
Network ADB=active (5555) · external — not persisted by ha-paneld
Audio playback=idle
App database=6.3 MB used · 7.3 MB on disk · schema 14
Product version=NSPanel120P_3.8.0
Local-state sync=449s ago · brightness 222→226 · 569s ago · brightness 218→222 · 869s ago · brightness 223→218 · 989s ago · brightness 219→223 · 1229s ago · brightness 215→219 · 1709s ago · brightness 211→215 · 2129s ago · brightness 207→211 · 2369s ago · brightness 202→207
State convergence=43 channels · 0 dirty · 0 in-flight · 15 unknown · ack 905/0 · pending none
[build] fingerprint=rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/092718:userdebug/test-keys
board=rk30sdk product=px30_evb hardware=rk30board abis=arm64-v8a,armeabi-v7a,armeabi
[boot-security] verified=green flash=locked vbmeta=unknown build=userdebug debuggable=yes
[env] selinux=0 su=true write_settings=true a11y=true daemon=true shizuku=manager_missing evdev=stopped/none ledjni=false
[display-sizing] android_base_logical_dpi=240 current_logical_dpi=320 override_dpi=320 font_scale=1.0 profile_recommended_dpi=250 profile_recommended_font_scale=1.0
[renderer] mode=builtin state=checking outcome=unobserved fault=none detail=none recovery=none transport=http address_family=automatic observed_age=49m process_age=1d4h package_updated=1d4h theme=follow/light
[ha-network] state=healthy cause=none responsiveness=healthy measuring=true socket=live window=5m probes=30 round_trips=30 p50=34 p95=123 max=137 jitter=27 loss=0.0% consecutive=0 server_errors=0 auth_errors=0 last_reply_age=4734
[ha-path-probe] state=healthy family=ipv4 bursts=6 sent=30 received=30 loss=0.0% p50=23 p95=58 max=64 jitter=19 dead_bursts=0 interval=600s last_burst_age=155448
[camera] state=absent outcome=camera-unavailable fault=none detail=not_enumerated recovery=none clients=0 last_frame=never failures=0 indication=none stream_clients=0 stream_port=off encoder=none encode=none delivered=none requested_fps=none
[zigbee-health] state=unknown layout=unknown package=- joined=true role=Repeater gateway_cpu=4 guard_cpu=0 restarts_10m=0 containment=none recursive_watchdog=false
[storage-health] state=healthy pressure_state=healthy usable_bytes=2176237568 total_bytes=3606069248 used_percent=39.6506994643271 database_bytes=54165504 wal_bytes=524288 sidecar_bytes=163840 page_size_bytes=4096 page_count=13224 freelist_count=2 schema_version=14 quick_check=ok auto_vacuum=incremental checked_at=1789474827801 failure=none failure_operation=none
[power-safety] state=safe keep_awake=true wake_lock=true wifi_lock_required=true wifi_lock=true prevent_idle_dim=true screen_timeout_ms=2147483647 interactive=true power_source=ac plugged_mask=1 stay_on_mask=15 stay_on_effective=true device_idle=false doze_exempt=true screen_off=su_blpower screen_off_selected=unknown screen_off_reason="not yet exercised; no screen-off has occurred since this controller was constructed" reasons=none
[sysfs] leds=[] backlight=[backlight] devfreq=[dmc, ff400000.gpu]
[labels] ls: /sys/class/leds/*/: No such file or directory ls: /dev/ledjni: No such file or directory u:object_r:sysfs:s0 /sys/class/backlight/backlight/
[hardware]
inputs=[rk8xx_pwrkey (event0 cpufreq dmcfreq keychord ), chsc_cap_touch (event1 cpufreq dmcfreq ), adc-keys (event2 cpufreq dmcfreq keychord ), gpio_keys (event3 cpufreq dmcfreq ), lightsensor-level (event4 ), proximity (event5 )]
i2c=[0-0020:rk809, 1-002e:chsc_cap_touch, 1-003c:tp, 2-0046:ls_stk3a5x, 2-0046-1:ps_stk3a5x, 5-0038:px30-aht20, i2c-0:rk3x-i2c, i2c-1:rk3x-i2c, i2c-2:rk3x-i2c, i2c-5:gpio_i2c@3]
iio=[]
thermal=[cooling_device0:thermal-cpufreq-0, cooling_device1:thermal-devfreq-0, cooling_device2:thermal-devfreq-1, thermal_zone0:soc-thermal, thermal_zone1:gpu-thermal]
relays=[st_relay/mode, st_relay/relay1, st_relay/relay2, st_relay/relay3, st_relay/relay4]
[packages] android=not installed minimal=not installed
[vendor-tame] known=7 installed=7 active=0 disabled=7
[capabilities] Root (su)=ok | Verified app update / screenshot / display=ok | Screen brightness=ok | Screen on/off=ok | Reboot / reload / launcher=ok
Home Assistant version
2026.9.2
Relevant logs
Nothing logged — the entity state above is the whole symptom.
ha-paneld version
0.9.7 (build 776)
Panel hardware
Sonoff NSPanel Pro (86P / 120P, PX30 / rk3326)
What happened?
0.9.7's new HA Companion
updateentity is announced on every panel, including panels that run the built-in renderer and have no Companion app installed at all. With nothing installed it publishesinstalled_version: "not installed"alongside a reallatest_version, so Home Assistant treats it as a pending update permanently: the panel is listed on Settings → Updates, it counts towards the Settings badge, and "Update all" would install the minimal Companion on panels that deliberately don't have it.On a 16-panel fleet that's 16 phantom updates that can never be cleared.
Live state on one panel (built-in renderer,
[packages] android=not installed minimal=not installedin the dump below):There's also no way to withhold it from the panel side.
SoftwareUpdateEntities.shape()(v0.9.7, line 221) only setsannounced = falsewheninputs.suppressedis set, and that is only ever set for the ha-paneld component (Panel Assistant ownership) — the Companion entity is unconditional. It's published viareconcileSoftwareUpdates()rather thanregistryExposable, so unlike the other optional entities it has no "expose to HA" toggle in Configure.That leaves only Home-Assistant-side remedies: disable or hide the entity on every panel, or Skip the version — and a skip comes back with the next Companion release.
Expected: a panel with no Companion installed shouldn't advertise a pending Companion update, or it should at least be possible to withhold the entity.
The "install the Companion from Home Assistant" affordance itself is genuinely useful — the ask is only that it stops presenting as a pending update on panels that don't have the app. Any one of these would do it:
latest_versionwheninstalledVersion == null(state staysoff;installable()and the install command are unaffected, so the deliberate "install the minimal app" path still works);companion_auto_update;Steps to reproduce
[packages] android=not installed minimal=not installed).<panel> · HA Companion <version>is listed as an available update, permanently.Diagnostic dump (
/diag)Home Assistant version
2026.9.2
Relevant logs
Nothing logged — the entity state above is the whole symptom.