This repository contains a guide and configuration files for converting the Create Wind Calm fan from Tuya Smart to ESPHome. For more information on this fan and some experiences using it, see https://github.com/velzend/create_ikohs_fan. Most of the information in this guide came from an issue on velzend's git repo and my own experiences.
I am not resposible for any damage you might do to your device, nor will I provide any support besides the information given below
The CREATE WIND CALM (also known as IKOHS) ceiling fan is Tuya based device, which means that it requires cloud connectivity to be able to be controlled remotely.
For Tuya devices there are generally two ways to make the device local only:
- Using local integrations that speak the tuya protocol like localtuya, tuya-local, tinytuya etc.
- By modding the device to use ESPHome
Tuya devices expose a number of data points which represent different features of a tuya device. These are relevant for either type of integration. The data points for the CREATE WIND CALM can be found in the tuya folder in this repository.
While these generally work, they have a big downside. It requires registering the device with the Tuya Smart app, registering as a developer on the Tuya cloud platform and finally blocking internet access from the device. All in all it works, but it is not fully local only. Initially this was the integration method I used, but it had a lot of intermittent connection issues, where then fan just started refusing connectings after a certain amount of time. All in all it will work in some cases, and might be the solution if you are not comfortable physicially modifying your device.
The better solution, in my eyes, is to fully eliminate the Tuya Cloud connectivity and switch over to ESPHome instead. For some devices this is as easy as flashing ESPHome directly to the tuya provided board using libretiny. In the case of this fan this is not possible as it uses the WBR3 board which is not supported by libretiny. However, the WBR3 board is fully pin-compatible with an ESP-12F, which makes replacing it relatively easy.
First of all it's important to be aware that there are multiple versions of this fan. Some variants have a dimmable light, while my fan has not. The exact motor control unit and RF remote used also seem to differ between units. This is most likely due to CREATE just using any parts available off the shelve.
Make sure to flash your ESP-12F with ESPHome before continuing. In my case I used a development board which makes this very quick and easy without any soldering. The esphome folder in this repository contains the ESPHome yaml for the fan, carefully check this file and make sure you set up the correct secrets and IP addresses.
When opening the motor control unit, it should have a main board with 2 small daughter boards soldered on using through-hole headers. One of these boards has the WBR3 soldered to it, the other is the RF receiver for the remote. The WBR3 daughter board can easily be desoldered to make working on replacing the WBR3 a little easier. This is also the perfect time to remove the speaker (or put a small amount of glue in the top hole) to get rid of the annoyingly loud beeping sound the fan makes.
![](https://private-user-images.githubusercontent.com/1276085/348704981-ce8caa76-2155-4edd-ba73-7b7db52eb295.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQzMDkyMzQsIm5iZiI6MTcyNDMwODkzNCwicGF0aCI6Ii8xMjc2MDg1LzM0ODcwNDk4MS1jZThjYWE3Ni0yMTU1LTRlZGQtYmE3My03YjdkYjUyZWIyOTUuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDgyMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA4MjJUMDY0MjE0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YTMyNzA2YWIxMmQ4ZGU4MGVmZDg5ZThkMmVjM2QyNTBkMDUyMTQ2NTZiYTk5ODMxYzMzZGMxMDIzNzYxMGM0NyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.bOX5uYauwSRRGFFXSbnTyGepbG1yC7k0aCdSG0MOJ6U)
![](https://private-user-images.githubusercontent.com/1276085/348705676-3d6e0a4e-d0f2-47d6-b297-649c8fe9524f.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQzMDkyMzQsIm5iZiI6MTcyNDMwODkzNCwicGF0aCI6Ii8xMjc2MDg1LzM0ODcwNTY3Ni0zZDZlMGE0ZS1kMGYyLTQ3ZDYtYjI5Ny02NDljOGZlOTUyNGYuanBnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDgyMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA4MjJUMDY0MjE0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NzRiNDkyMjAxOWJmZjg3YjI2M2IyMmVjMzAyMTg4ODM0MDVkOTU3NTZlNDNjMGU2NGZjNGJmMTA3MzEyNDllOCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.OO_6OXelgtBYzJ3CN2YRoTZ5Ny57bbewYTmOr09ZeLE)
![](https://private-user-images.githubusercontent.com/1276085/349474044-be020b66-2fc3-4315-ab36-c84492b434d9.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQzMDkyMzQsIm5iZiI6MTcyNDMwODkzNCwicGF0aCI6Ii8xMjc2MDg1LzM0OTQ3NDA0NC1iZTAyMGI2Ni0yZmMzLTQzMTUtYWIzNi1jODQ0OTJiNDM0ZDkucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDgyMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA4MjJUMDY0MjE0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YWRiNGJkNjc5MjgyOWYyYmJiODgwZTdhODE2YTBiNTAzODBiNDM5MGM3YmIzZTMxMzYzNzc5YmQ5MzE3ZmUxYyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.oXbKLHTC4X8SqgAJSJnBpQ0uEdN8JedBkdvbiquUfiY)
![](https://private-user-images.githubusercontent.com/1276085/349473138-8ddb6150-24a2-4d83-b156-de602178a3f9.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQzMDkyMzQsIm5iZiI6MTcyNDMwODkzNCwicGF0aCI6Ii8xMjc2MDg1LzM0OTQ3MzEzOC04ZGRiNjE1MC0yNGEyLTRkODMtYjE1Ni1kZTYwMjE3OGEzZjkucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI0MDgyMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNDA4MjJUMDY0MjE0WiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YWJiOWU1OWYzMjVkNTc5OTZlMzY5Y2M3NTA5OGRiMTAwZTZjYWNjMjI2OTQ1ZTJhY2I0YTBjNjRkMTFhODg4OCZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QmYWN0b3JfaWQ9MCZrZXlfaWQ9MCZyZXBvX2lkPTAifQ.5ycdj5dRalXYfEWQrCBe4gLdUQhp-cuJvW-7xxpcLCs)
- The motor control unit with the removed daughter board.
- Rear side of the daughter board, the removed WBR3 and ESP-12F
- Front side of the daughter board, the removed WBR3 and ESP-12F
- Wiring from the daughter board to the ESP-12F
When placing the ESP-12F the following connections need to be made:
ESP-12F | Daughter Board | Notes |
---|---|---|
TXD | TXD | |
RXD | RXD | |
GPIO15 | GND | Set correct boot mode |
EN | VCC | Always enable, don't use EN on daughter board |
VCC | VCC | |
GND | GND |
As you can see, my first time soldering did not go down so well. I destroyed the pads on the daughter boards and had to use wires instead. This is not neccesary if the WBR3 is removed a bit more carefully.
In the pictures a wire from GPIO12 can also be seen, but this one is not neccesary, I added it in case I would have to desolder the RF receiver directly to the ESP-12F to keep the remote working as expected.
However, I found out that this is not neccesary, the motor control unit already informs the ESP-12F when a change is made using the remote as long are you are running ESPHome with a small fix (see below).
After reassembling everything, the fan should start and the ESPHome dashboard should be reachable over the network.
If the ESPHome integration is configured in home assistant the device should be auto discovered.
Multiple people ran into issues setting the fan speed, because the tuya device does not correctly report all data points to ESPHome on startup. I found out that this was caused by ESPHome not processing all information being sent by the tuya device and managed to fix this by making a small change to ESPHome. This fix is available since ESPHome 2024.7, so make sure to use a recent version.
Datapoint 64 can be used to set the countdown timer, the actual countdown is handled by the motor control unit. Currently the fan turns off when this timer expires, but there is no feedback to ESPHome. After the fan turns off, ESPHome can't issue any further commands. Currently, the only way to get the fan working again is to turn it on with the RF remote after the timer expires. After doing so ESPHome works as expected again. Since this is a hardware issue with the motor control unit, it's probably best to not use this datapoint at all and build a custom timer script in ESPHome.