Skip to content

0.9.7: HA Companion update entity shows a permanent pending update on panels with no Companion installed, and cannot be withheld #154

Description

@cb2206

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

  1. Panel on 0.9.7 using the built-in renderer with no Companion app installed ([packages] android=not installed minimal=not installed).
  2. Connect it to Home Assistant over MQTT and let discovery run.
  3. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions