ha-paneld version
0.9.6
Panel hardware
Sonoff NSPanel Pro (86P / 120P, PX30 / rk3326)
What happened?
Wake on wave cannot finish learning on this panel. The proximity source is
present and healthy, the app receives the transitions, a teach session starts
and stays active — and still every wave is rejected: acceptedGestures never
leaves 0/5 and polarity never leaves "unknown".
HARDWARE
Sonoff NSPanel Pro 120, rockchip px30_evb, Android 8.1.0 (API 27),
ha-paneld 0.9.6 build 527, su available, screen_off route su_blpower.
i2c = 2-0046:ls_stk3a5x, 2-0046-1:ps_stk3a5x (Sensortek STK3A5x)
inputs = lightsensor-level (event4), proximity (event5)
Android exposes it as a standard sensor:
0x00000003) Proximity sensor | AOSP | type: android.sensor.proximity(8)
on-change | minRate=5.00Hz | maxRate=142.86Hz | no batching | wakeUp
THE SENSOR WORKS
dumpsys sensorservice shows clean far->near->far transitions for every wave:
(wall=22:53:24.xxx) 1.00, 0.00, 0.00,
(wall=22:53:26.xxx) 0.00, 0.00, 0.00,
(wall=22:53:34.xxx) 1.00, 0.00, 0.00,
(wall=22:53:36.xxx) 0.00, 0.00, 0.00,
Note the values: this sensor reports 1.00 while a hand is near and 0.00 when
clear — the opposite of the usual "distance in cm" convention where near is
the small number. Range is binary, there is no intermediate value.
HA-PANELD SEES THEM TOO
Polling GET /api/v1/proximity twice a second during a teach session, raw
follows the hand exactly and age_s drops to 0:
22:53:13 session started
22:53:24 raw=1 session=true accepted=0
22:53:26 raw=0 session=true accepted=0
22:53:34 raw=1 session=true accepted=0
22:53:36 raw=0 session=true accepted=0
22:53:46 raw=1 session=true accepted=0
22:53:49 raw=0 session=true accepted=0
22:54:0x session ended: "Teaching timed out."
Three deliberate waves inside one session, each a bounded far->near->far with
the area left clear between them, none accepted. I also tried longer holds
(~3 s near) and very quick swipes (~0.2 s) with the same result.
STATE AFTER MANY ATTEMPTS
present: true, health: "learning", phase: "learning_gestures",
signalMode: "unknown", mode: "unknown", rangedEligible: false,
polarity: "unknown", acceptedGestures: 0, requiredGestures: 5,
readiness: 50, ready: false, wakeReady: false,
normalizedLevel: null, near: null,
lastSessionMessage: "Teaching timed out. Nothing unsafe was enabled; try again when convenient."
"Forget learned proximity" was used once; relearning restarts but behaves the
same.
SECOND OBSERVATION — READINGS STOP WHEN THE SCREEN IS OFF
With the display off, ha-paneld receives nothing at all: age_s keeps growing
past 20 minutes while dumpsys sensorservice records fresh transitions for the
same waves. health then reports "source_unavailable" and canTeach goes false.
Turning the display on makes raw follow the hand again within a second.
The sensor is flagged wakeUp, so the events themselves survive display-off.
If this is the intended lifecycle it seems to defeat wake on wave, since the
gesture has to be recognized precisely while the screen is off.
The panel is otherwise excellent — this is the only thing standing between it
and a proper presence-driven display.
Steps to reproduce
- NSPanel Pro (px30), 0.9.6, proximity present, screen on.
- Configure -> Presence & wake -> Teach a wave (or POST /api/v1/proximity/teach
with action=start).
- Leave the area clear, make one deliberate wave, step clear again. Repeat.
- GET /api/v1/proximity while waving: raw tracks the hand, age_s hits 0,
session.active is true, accepted stays 0.
- The session ends with "Teaching timed out", acceptedGestures 0/5,
polarity "unknown".
For the display-off observation:
6. Let the screen turn off, wave several times.
7. dumpsys sensorservice shows the transitions; GET /api/v1/proximity shows
raw unchanged and age_s growing.
Diagnostic dump (/diag)
ha-paneld diagnostics — 0.9.6 (build 527)
[captured] 2026-09-04T22:57:09.397+07:00 uptime=1h47m
[panel]
ha-paneld=0.9.6 (build 527)
Android=8.1.0 (API 27)
Firmware=4.8.0
Device=rockchip px30_evb (px30_evb)
CPU=4 cores · arm64-v8a · rk30board
RAM=1.9 GB total · 1.1 GB free
Storage=7.7 GB eMMC · 2.3 GB free (data)
Display=750×1334 px · logical 240 dpi
System WebView=com.android.webview 131.0.6778.200
HA Companion=not installed
MQTT state=connected · TCP/IPv4 · last-ok 8s ago · last-auth 3399s ago · auth-ok · prefer IPv6
Security mode=Relaxed
Keep panel responsive=on · power locks held
Prevent idle dim=off · timeout 1800s
Android dashboard lock=off
LED=none
Nav actions (a11y)=no
Navbar=Swipe reveal
Zigbee=none
Relays=none
Network ADB=active (5555) · external — not persisted by ha-paneld
Audio playback=idle
App database=1.2 MB used · 1.7 MB on disk · schema 14
Product version=NSPanel120P_4.8.0
Local-state sync=127s ago · brightness 153→190 · 968s ago · brightness 158→153 · 1087s ago · brightness 154→158 · 1148s ago · brightness 185→154 · 1447s ago · backlight →185 (firmware dim) · 1868s ago · backlight →188 (firmware dim) · 1928s ago · brightness 190→185 · 2229s ago · screen →OFF (physical)
State convergence=35 channels · 0 dirty · 0 in-flight · 12 unknown · ack 208/0 · pending none
[build] fingerprint=rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/095951: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=false daemon=false shizuku=manager_missing evdev=stopped/none ledjni=false
[display-sizing] android_base_logical_dpi=240 current_logical_dpi=240 override_dpi=none font_scale=1.0 profile_recommended_dpi=250 profile_recommended_font_scale=1.0
[zigbee-health] state=unknown layout=unknown package=- joined=unknown role=- gateway_cpu=-1 guard_cpu=-1 restarts_10m=0 containment=none recursive_watchdog=false
[storage-health] state=healthy pressure_state=healthy usable_bytes=2293161984 total_bytes=3440951296 used_percent=33.35674391364591 database_bytes=1302528 wal_bytes=123632 sidecar_bytes=32768 page_size_bytes=4096 page_count=318 freelist_count=0 schema_version=14 quick_check=ok checked_at=1788530988651 failure=none
[power-safety] state=safe keep_awake=true wake_lock=true wifi_lock_required=true wifi_lock=true prevent_idle_dim=false screen_timeout_ms=1800000 interactive=true power_source=ac plugged_mask=1 stay_on_mask=0 stay_on_effective=false device_idle=false doze_exempt=true screen_off=su_blpower reasons=prevent_idle_dim_disabled,native_screen_timeout_finite,stay_on_disabled
[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, i2c-0:rk3x-i2c, i2c-1:rk3x-i2c, i2c-2:rk3x-i2c]
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.0
Relevant logs
No proximity or gesture lines appear in logcat from the app during teaching,
so there is nothing to attach beyond the API state above.
sensors started (light=true proximity=true temp=ABSENT humidity=ABSENT)
ha-paneld version
0.9.6
Panel hardware
Sonoff NSPanel Pro (86P / 120P, PX30 / rk3326)
What happened?
Wake on wave cannot finish learning on this panel. The proximity source is
present and healthy, the app receives the transitions, a teach session starts
and stays active — and still every wave is rejected: acceptedGestures never
leaves 0/5 and polarity never leaves "unknown".
HARDWARE
Sonoff NSPanel Pro 120, rockchip px30_evb, Android 8.1.0 (API 27),
ha-paneld 0.9.6 build 527, su available, screen_off route su_blpower.
i2c = 2-0046:ls_stk3a5x, 2-0046-1:ps_stk3a5x (Sensortek STK3A5x)
inputs = lightsensor-level (event4), proximity (event5)
Android exposes it as a standard sensor:
0x00000003) Proximity sensor | AOSP | type: android.sensor.proximity(8)
on-change | minRate=5.00Hz | maxRate=142.86Hz | no batching | wakeUp
THE SENSOR WORKS
dumpsys sensorservice shows clean far->near->far transitions for every wave:
(wall=22:53:24.xxx) 1.00, 0.00, 0.00,
(wall=22:53:26.xxx) 0.00, 0.00, 0.00,
(wall=22:53:34.xxx) 1.00, 0.00, 0.00,
(wall=22:53:36.xxx) 0.00, 0.00, 0.00,
Note the values: this sensor reports 1.00 while a hand is near and 0.00 when
clear — the opposite of the usual "distance in cm" convention where near is
the small number. Range is binary, there is no intermediate value.
HA-PANELD SEES THEM TOO
Polling GET /api/v1/proximity twice a second during a teach session, raw
follows the hand exactly and age_s drops to 0:
22:53:13 session started
22:53:24 raw=1 session=true accepted=0
22:53:26 raw=0 session=true accepted=0
22:53:34 raw=1 session=true accepted=0
22:53:36 raw=0 session=true accepted=0
22:53:46 raw=1 session=true accepted=0
22:53:49 raw=0 session=true accepted=0
22:54:0x session ended: "Teaching timed out."
Three deliberate waves inside one session, each a bounded far->near->far with
the area left clear between them, none accepted. I also tried longer holds
(~3 s near) and very quick swipes (~0.2 s) with the same result.
STATE AFTER MANY ATTEMPTS
present: true, health: "learning", phase: "learning_gestures",
signalMode: "unknown", mode: "unknown", rangedEligible: false,
polarity: "unknown", acceptedGestures: 0, requiredGestures: 5,
readiness: 50, ready: false, wakeReady: false,
normalizedLevel: null, near: null,
lastSessionMessage: "Teaching timed out. Nothing unsafe was enabled; try again when convenient."
"Forget learned proximity" was used once; relearning restarts but behaves the
same.
SECOND OBSERVATION — READINGS STOP WHEN THE SCREEN IS OFF
With the display off, ha-paneld receives nothing at all: age_s keeps growing
past 20 minutes while dumpsys sensorservice records fresh transitions for the
same waves. health then reports "source_unavailable" and canTeach goes false.
Turning the display on makes raw follow the hand again within a second.
The sensor is flagged wakeUp, so the events themselves survive display-off.
If this is the intended lifecycle it seems to defeat wake on wave, since the
gesture has to be recognized precisely while the screen is off.
The panel is otherwise excellent — this is the only thing standing between it
and a proper presence-driven display.
Steps to reproduce
with action=start).
session.active is true, accepted stays 0.
polarity "unknown".
For the display-off observation:
6. Let the screen turn off, wave several times.
7. dumpsys sensorservice shows the transitions; GET /api/v1/proximity shows
raw unchanged and age_s growing.
Diagnostic dump (
/diag)Home Assistant version
2026.9.0
Relevant logs
No proximity or gesture lines appear in logcat from the app during teaching, so there is nothing to attach beyond the API state above. sensors started (light=true proximity=true temp=ABSENT humidity=ABSENT)