This project allows you to free your Philips CX3550 from the cloud and enable fully local control using HomeAssistant while getting rid of the annoying delays and loading times, the official had. Instead of dealing with the limitations of the official firmware, I decided to dig down all the way to the hardware level and reimplementing the WiFi firmware on an ESP32 using only local protocols.
- All regular device features (5 Modes, Swing on/off, Timer, LEDs on/off, Beep on/off)
- Config portal for easy setup activated by holding the power button
- Fully local control via MQTT and HomeAssistant
- Prebuilt binaries for quick install
- Allow entering the config portal without performing a factory reset
- Properly implement the WiFi status LEDs (white for reconnect, orange for setup)
- Add position sensor to allow the fan to auto center before turning off
Before doing any hardware modifications, it's important to have the ESP32 flashed and working.
The project currently only supports the ESP32, precompiled binaries are available for the classic ESP32 (e.g. D1 Mini, NodeMCU) in Releases. For initial setup use the firmware-merged.bin, for OTA updates the firmware-ota.bin.
Images for different models can be manually compiled using PlatformIO.
You can either flash the image using esptool.
esptool --chip esp32 --port /dev/ttyUSB0 --baud 921600 write-flash 0x0 firmware-merged.binOr via the ESPHome web flasher. Just make sure to use manual upload and select the previously downloaded firmware image. Advanced options like configuring WiFi via serial are not supported.
https://web.esphome.io/
After successful installation, the ESP should immediately open a WiFi access point named "Philips-CX3550". If you can see that you can continue with the Hardware Modifications.
Do not connect the device to the mains while it's hooked up to a computer. This device doesn't have an insulated power supply since there are no parts that the user can touch during normal operation. Therefore everything on the low voltage side can be live at 230V referenced to earth.
Unfortunately, the MXChip EMC6069-P WiFi module uses the BK7235 microcontroller, which is not supported by LibreTiny yet. The only solution I found at this point is disconnecting the original module and placing an ESP32 on top of it. If LibreTiny adds support for the chip in the future, I'm happy to update the project to run on the original hardware.
The original module has 5 connections to the rest of the circuit: GND, VCC, RX, TX and Reset. To disconnect the module:
- Cut VCC between the capacitor and the module
- Cut RX before R104 and R105
- Turn around or remove R5
- Turn around or remove R1
- Optionally you can remove R91 to permanently silence the beeper
Now we need to hook up wires to GND and VCC and to the MCU side of the now open RX and TX lines (marked with a dot in the previous picture). If you want to use those nice easy to reach pads at the bottom for 5V and GND, like I did, R46 needs to be bridged.
The last step is connecting the new wires to the ESP32 module. I used an ESP32 D1 Mini since that's what I had laying around, but other boards like the ESP32 Super Mini should work just as well. GND and 5V (or 3.3V) go to their corresponding pins on the ESP32. RX and TX go to the application UART RX2 and TX2 of the ESP32. Do not hook them up to the debug UART pins RX and TX.
Due to a known bug in the cheap ESP32 D1 Mini knockoff I'm using, it was necessary to supply it via 5V and bridge the diode to the USB to UART chip in order to get the ESP to boot. Removing the bright red power LED is probably also a good idea.
You're now ready to reassemble and test your new HomeAssistant device.
To factory reset and put the device into setup mode, hold the power button for 5 seconds until the power LED starts blinking red. The device should then open a WiFi access point named "Philips-CX3550". Once connected, the config page at http://192.168.4.1/ should open automatically. There you can select your WiFi network and enter your HomeAssistant MQTT credentials. The OTA password can be used to manually upload OTA updates without having to factory reset the device. By default it consists of the last 3 blocks of the ESPs MAC address. For security reasons, it should always be set to a secure password.
Right now firmware updates need to be manually installed in one of two ways:
After factory resetting the device as described in Initial Setup you can upload the latest firmware-ota.bin after clicking on "Update".
To use OTA in PlatformIO, we first need to create a config file platformio_override.ini containing the devices IP and the OTA password configured during first setup:
[env:ota-update]
upload_protocol = espota
upload_port = <device-ip>
upload_flags =
--auth=<ota-password>Then start the upload with pio run -e ota-update -t upload.
Currently the HomeAssistant entity names are in German. For other languages all visible texts can be modified in src/strings.h.
The main MCU communicates with the original WiFi module using an undocumented serial protocol. A detailed documentation of the packets and commands I was able to reverse engineer can be found in reverse-engineering/PROTOCOL.md.





