Skip to content
Get started

Smatek S9E

Photo: Smatek

A 10.1 in 1920×1200 RK3566 in-wall panel, the same SoC family as the TPA10, with two on-board mains relays, four LED-backlit buttons, a radar proximity sensor, and Zigbee, Ethernet and RS485.

Smatek S9E, Smatek S9, S9PE, S9PE-NZ (PoE variant), Build.MODEL S9, Build.DEVICE rk3566_r, ro.product.version S9_Android_1.0.2 and S9_Android_1.1.0.

SoC Rockchip RK3566 (quad Cortex-A55), the same SoC family as the TPA10
RAM and storage 2 GB RAM, 16 GB eMMC
Display 10.1 in, 1920×1200 multi-touch
Android 11
Connectivity Wi-Fi, Bluetooth, Zigbee, RJ45 Ethernet, RS485 (a PoE variant, the S9PE, also exists)
Sensors proximity radar, ambient light, temperature and humidity
Inputs 4 physical buttons with individual LEDs
Relays 2 on-board mains relays
Root the vendor app uses execRootCmd, so root is available; some units ship with developer mode unlocked. Whether su is reachable from a normal app sandbox is unconfirmed, and it decides whether the panel app drives the sysfs nodes directly or needs the root helper daemon.
Released Not confidently dated; the RK3566 SoC family did not reach the market until around 2021, the best lower bound found for this panel (RK3566 datasheet coverage, CNX Software, December 2020)

Two stock images have been analysed. They are block-based OTA .zip files in AOSP dynamic-partition format: decompress the .new.dat.br with brotli -d, unpack the super image with lpunpack, then search build.prop and the init .rc files with strings. Both report Build.MODEL S9 and Build.DEVICE rk3566_r, Android 11; the vendor build code is in ro.product.version:

Image ro.product.version Build Relay class
S9_1920x1200_20240712_Android_US S9_Android_1.0.2 eng.*.20240712 /sys/class/st_relay
S9_1920x1200_20251202_Android_US S9_Android_1.1.0 eng.xiaolp.20251202.160404 /sys/class/strelay

Both images were shared by the reporter from Smatek: S9_1920x1200_20240712_Android_US (1.0.2) and S9_1920x1200_20251202_Android_US (1.1.0). The original Smatek download links at docs.smatek.store:10001 are no longer reachable; contact Smatek support or the reporter for a copy.

Diffing the two images shows that only ro.product.version and the relay class differ. Every other control path documented below (button keycodes, button LED GPIOs, proximity GPIO, sensor wiring) is identical across both, so detection keyed on ro.product.version starting with S9 covers the whole line.

The panel app exposes the two mains relays as switch.<panel>_relay1 and switch.<panel>_relay2, only on a panel that has the relay sysfs class.

Terminal window
# firmware 1.1.0+ (most panels in the field)
echo 1 > /sys/class/strelay/relay1 # on
echo 0 > /sys/class/strelay/relay1 # off
echo 1 > /sys/class/strelay/relay2
# firmware 1.0.2 (initial release)
echo 1 > /sys/class/st_relay/relay1

The four buttons emit standard Android key codes 131 to 134, KEYCODE_F1 to KEYCODE_F4. The panel app’s accessibility capture reports them to event.<panel>_button (event types KEYCODE_F1 to KEYCODE_F4); bind dashboard actions to them in Home Assistant. The events need no root.

Each button has an LED at /sys/class/gpio/gpio<16+keycode>/value, which is GPIO 147 to 150 for buttons F1 to F4. Each is on or off, monochrome. The panel app exposes them as light.<panel>_button_led1 to light.<panel>_button_led4 (switched through su), counted from the profile’s hardware.button_led_gpio_base. The LEDs are not under /sys/class/leds, which holds only the mmc2:: SD card LED on the S9E; they are raw GPIOs.

Terminal window
echo 147 > /sys/class/gpio/export # one-time, if the node is absent
echo 1 > /sys/class/gpio/gpio147/value # button F1 LED on

Sensors: proximity comes from GPIO 18, not SensorManager

Section titled “Sensors: proximity comes from GPIO 18, not SensorManager”

The real signal is a root GPIO read at GPIO 18. The kernel registers a phantom Android sensor that never fires, so the value has to be read from sysfs:

Terminal window
cat /sys/class/gpio/gpio18/value # 1 = near, 0 = far (no export needed — reporter-confirmed)

The S9E profile therefore declares sensors.proximity_gpio: 18 instead of using the dead SensorManager source. The root helper holds the value descriptor open and streams changes immediately where the kernel supports GPIO edges; otherwise it rechecks the same descriptor twice a second. Losing the descriptor is reported explicitly, so Home Assistant shows the sensor as unavailable until the recovered helper stream supplies its current value. The signal then feeds the same self-learning presence detection and hand-gesture detection as Android sensors, normalised across all your panels. A reporter confirmed that gpio18 reads 0 far, 1 near, but the learning does not rely on that polarity. Ambient light, temperature and humidity surface through SensorManager as expected.

  • Relays: switch.<panel>_relay1 and switch.<panel>_relay2 through the relay sysfs class (root); both strelay and st_relay are probed.
  • Buttons: event.<panel>_button (KEYCODE_F1 to KEYCODE_F4), app-direct through accessibility.
  • Button LEDs: light.<panel>_button_led1 to light.<panel>_button_led4 through su (GPIO 147 to 150, exported on demand).
  • Proximity: a learned binary_sensor.<panel>_proximity and a normalised sensor.<panel>_proximity_level from the root helper’s held gpio18 event stream. The SensorManager proximity sensor registers but never fires, so it is bypassed.
  • Light: sensor.<panel>_illuminance through SensorManager, which works.

Comments

Comments are kept in this page's discussion on GitHub, so loading them connects your browser to GitHub. This browser remembers the choice and loads comments on other pages when you scroll down to them.

We Home Assistant and everything the Open Home Foundation does.

Last updated:

Build 93 · cb91a53