Project to replace the original KeeLoq RF add-on for a Superrollo GW60 roller shutter controller.
This repository contains the complete project stack:
- nRF52 firmware for BLE-to-KeeLoq RF control
- ESPHome bridge for Home Assistant integration
- a 3D-printable case
- a custom PCB design including Gerbers
I built a replacement for the original RF add-on hardware. The goal of this project is to integrate my own roller shutters into a local, self-hosted automation setup without relying on the vendor accessory.
- BLE peripheral running on nRF52
- simple GATT write interface for shutter actions
- actions supported:
UPDOWNSTOP
- static BLE PIN with MITM-protected encrypted access
- persistent KeeLoq sync counter stored in internal flash
- serial debug interface for local testing
- ESPHome bridge for automation integration
- hardware design files for a dedicated PCB
- 3D-printable enclosure
- documentation and presentation material for the reverse engineering process
.
├── espHomeBridge/
│ ├── bridge.yaml
│ └── secrets.yaml
├── hardware/
│ ├── case/
│ │ └── GW60.3mf
│ └── pcb/
│ └── GW60BLE/
│ ├── Gerber.zip
├── fs.h
├── GW60BLE.ino
├── keeloq.cpp
├── keeloq.h
├── README.md
└── secrets.h
The firmware is implemented in:
GW60BLE.inokeeloq.cppkeeloq.hfs.h
It runs on an nRF52-based board and exposes a BLE GATT API to trigger RF transmissions for the GW60 shutter.
Responsibilities:
- provide a BLE service for actions
- validate incoming commands
- send KeeLoq RF frames
- maintain the rolling/sync counter in internal flash
- provide a serial interface for debugging and manual control
Located in:
espHomeBridge/bridge.yaml
This acts as the BLE client side and integrates the device into ESPHome / Home Assistant.
Responsibilities:
- discover and connect to the BLE peripheral
- authenticate/pair if required
- write action bytes to the custom GATT characteristic
- expose the shutter as a cover-like automation endpoint
espHomeBridge/secrets.yaml contains local configuration and should remain private.
Located in:
hardware/case/GW60.3mf
This contains the printable enclosure for the hardware build.
Located in:
hardware/pcb/GW60BLE/
Included files:
- Gerber export for manufacturing
This allows the project to be reproduced as dedicated hardware instead of loose prototyping components.
Home Assistant / ESPHome
|
v
ESPHome bridge
|
BLE
|
v
nRF52 firmware
|
KeeLoq RF TX
|
v
Superrollo GW60
The firmware exposes a custom BLE service and characteristic:
- Service UUID:
0xBC10 - Characteristic UUID:
0xBC11
The characteristic is:
- readable
- writable
- writable without response
| Action | Value |
|---|---|
| UP | 0x03 |
| DOWN | 0x05 |
| STOP | 0x07 |
Writing one byte with one of the values above causes the firmware to:
- update the last characteristic value
- transmit the corresponding KeeLoq RF signal
- increment and persist the sync counter
BLE access is protected with:
- a static PIN
- encrypted connection with MITM protection
From the firmware:
- read permission:
SECMODE_ENC_WITH_MITM - write permission:
SECMODE_ENC_WITH_MITM
This is not meant to be an internet-facing device. It should only be used inside a trusted local environment.
On boot, the device:
- initializes internal flash storage
- loads the persisted 16-bit sync counter
- initializes Bluefruit / BLE
- configures security
- starts advertising the custom action service
On command reception, the device:
- validates the action byte
- sends the RF frame via
sendSignal(...) - increments the sync counter
- stores the new counter value in flash
The firmware also supports direct testing over the serial console.
| Key | Action |
|---|---|
w |
send UP |
s |
send DOWN |
| space | send STOP |
m |
print local BLE MAC address |
The firmware prints useful debug information such as:
- current sync counter
- BLE service/characteristic UUIDs
- configured device PIN
- connection / disconnection events
Relevant top-level behavior:
setup()- starts serial
- initializes internal flash
- restores sync counter
- initializes BLE stack
- configures security and GATT
- starts advertising
gw60ActionWriteCallback(...)- validates incoming BLE writes
- dispatches valid action bytes
applyGw60Action(...)- updates characteristic value
- sends RF signal
- increments sync counter
loop()- listens for serial test commands
This firmware is written in Arduino-style C++ for nRF52 using the Adafruit Bluefruit stack.
Typical requirements:
- PlatformIO or Arduino-compatible nRF52 toolchain
- Adafruit nRF52 / Bluefruit support
- required local header files for secrets and KeeLoq implementation
Example high-level build flow:
- create your local
secrets.h - provide the KeeLoq implementation and RF transmit code
- build for your target nRF52 board
- flash the firmware
- open serial monitor at
115200
Sensitive values are intentionally separated from the main code.
Expected local configuration includes things such as:
- BLE device name
- BLE PIN
- RF / KeeLoq secrets
- manufacturer key material
- device-specific identifiers
Relevant private files include:
secrets.hespHomeBridge/secrets.yaml
This is only illustrative; keep the real values private.
#pragma once
static const char* gw60BleDeviceName = "GW60-Bridge";
static const char* gw60BleDevicePin = "123456";- Power the nRF52 device.
- Pair over BLE using the configured PIN.
- Connect from the ESPHome bridge or another BLE client.
- Write one byte to characteristic
0xBC11:0x03for up0x05for down0x07for stop
The repository includes everything needed to reproduce the dedicated hardware build:
- enclosure model in
hardware/case/ - Gerbers for fabrication in
hardware/pcb/GW60BLE/Gerber.zip
This makes it possible to rebuild the project as a clean standalone device rather than as a breadboard or dev-board-only prototype.
Dump the firmware. See https://dirb.me/doku.php?id=de:tech:gw60 for how to connect and a nice read :D In the firmware look for a contiguous run of movlw / movwf, repeated eight times, writing eight bytes into consecutive RAM registers. I did something like this on the disassembled firmware:
grep -C8 "movwf" factory.asm | grep -C8 "movlw"- device-specific implementation for Superrollo GW60
- uses a rolling/sync counter and therefore depends on keeping transmitter state consistent
- static BLE PIN is simple but not ideal for high-security environments
- internal flash wear should be considered if commands are sent extremely frequently
This project is intended only for hardware I own or am explicitly authorized to control. Reverse engineering and RF transmission may be restricted by law, contract, or radio regulations depending on jurisdiction.