Two Sofucor ceiling fans have RF remotes but no smart home integration. Controlling them requires physical remotes.
Replace the physical remotes with WiFi-controllable NodeMCU devices that replay the RF signals. Build this as a generic, repeatable toolkit so any RF-controlled device can be added by following the same workflow.
- Reverse-engineer the Sofucor fan remote RF protocol
- Build NodeMCU firmware that replays fan commands over HTTP
- Python CLI to send commands
- Controls: fan speed (off / speed 1 / speed 2 / speed 3) and light toggle
- Home Assistant integration (REST or MQTT)
- Generic toolkit: any RF device can be added by writing a YAML profile
- Rolling code remotes (ceiling fans use fixed codes — if these don't, we reassess)
- Building a custom PCB
- Mobile app (HTTP endpoint is sufficient for HA integration)
- Capture RF signal with RTL-SDR +
rtl_fm - Analyze waveform in Audacity, measure pulse timings
- Write
devices/<device_name>.yamlwith frequency, encoding, and bit patterns - No firmware or code changes needed
| Item | Status | Notes |
|---|---|---|
| Nooelec NESDR Mini 2+ RTL-SDR | Working | SN: 00000001, confirmed with rtl_test |
| HiLetgo ESP8266 NodeMCU | Have it | Not yet tested |
| HiLetgo 315MHz TX/RX module | Ordered | MX-FS-03V transmitter, MX-05V receiver |
| ELEGOO dupont jumper wires | Ordered | F-to-F for NodeMCU↔TX module connection |
| Two Sofucor ceiling fans | Installed | Remote frequency not yet confirmed |
| Tool | Purpose | Status |
|---|---|---|
| Gqrx | Visual spectrum analysis / frequency finding | Installed, tested |
| rtl_fm | CLI signal capture to WAV | Installed |
| Audacity | Waveform analysis, pulse timing | Installed |
| PlatformIO | NodeMCU firmware deployment | Installed |
| Python 3.13 | Control CLI | Installed |
- Exact fan remote frequency — likely 315 MHz, promising signal spotted at 315.4 MHz, not yet confirmed
- Fixed vs rolling code — almost certainly fixed (standard for ceiling fans)
- NodeMCU 3.3V GPIO vs TX module 3.5V minimum — try at 3.3V first, add level shifter if needed
- Fan responds to HTTP command sent to NodeMCU (no physical remote needed)
python main.py sofucor_fan speed_1controls the fan- Adding a second RF device requires only a new YAML file