Cheap DIY automation for VELUX skylight windows. €30 to €50 in parts, vs €200+ for the official VELUX ACTIVE with NETATMO hub.
An ESP32 wired to 3 transistors that simulate the UP / DOWN / STOP button presses of a KUX 100 remote. Once flashed with ESPHome, the windows appear as three switches in Home Assistant.
- ESP32 GPIOs trigger NPN transistors that short the button pads of an opened KUX 100 PCB.
- ESPHome exposes 3 momentary switches (200 ms pulse).
- Home Assistant picks them up via the ESPHome integration.
- The remote runs off the ESP32's 3.3 V, batteries removed.
| Component | Qty | Cost | Notes |
|---|---|---|---|
| ESP32 dev board | 1 | €4 to €5 | DevKitC or Wemos D1 Mini |
| NPN transistor | 3 | €1 to €2 | 2N3904, 2N2222, or BC547 |
| 1 kΩ resistor | 3 | €0.50 | Base current limiting |
| KUX 100 remote | 1 | €20 to €40 | Second-hand, must be paired with your windows |
| Wires / pin headers | 1 | €2 |
Total: €30 to €50.
For each button (UP, DOWN, STOP):
- ESP32 GPIO -> 1 kΩ -> transistor base.
- Transistor emitter -> shared ground (also connected to KUX 100 GND).
- Transistor collector -> button pad on the KUX 100 PCB.
- ESP32 3.3 V and GND also power the KUX 100 PCB (batteries removed).
Default GPIO assignment in the ESPHome config below:
- UP: GPIO 18
- DOWN: GPIO 27
- STOP: GPIO 17
Remove batteries, gently pry the plastic clips, lift the PCB. Keep the metal battery contacts intact, they're reused for VCC and GND. Peel the tape covering the button pads to expose the contacts.
ESP32 mounted under the perfboard. VCC and GND go to a 2-pin terminal block.
esphome:
name: velux_remote
platform: ESP32
board: esp32dev
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
output:
- platform: gpio
pin: 18
id: button_up
- platform: gpio
pin: 27
id: button_down
- platform: gpio
pin: 17
id: button_stop
switch:
- platform: template
name: "Velux UP"
turn_on_action:
- output.turn_on: button_up
- delay: 200ms
- output.turn_off: button_up
- platform: template
name: "Velux DOWN"
turn_on_action:
- output.turn_on: button_down
- delay: 200ms
- output.turn_off: button_down
- platform: template
name: "Velux STOP"
turn_on_action:
- output.turn_on: button_stop
- delay: 200ms
- output.turn_off: button_stopStore Wi-Fi credentials in ESPHome's secrets.yaml, not in this file.
- No remote response: the KUX 100 must still be paired with the window. Verify transistor orientation (E/B/C), and that all grounds are tied together.
- ESPHome can't reach the device: check Wi-Fi credentials and boot logs over USB.
- One button works, not the others: almost always a cold solder joint on the button pad.
- Custom 3D-printed enclosure.
- Compact KiCad PCB to replace the perfboard.
Issues and PRs welcome, particularly with pinouts for other VELUX remote models.
MIT, see LICENSE.


