I just installed a QuietCool whole house fan and was disappointed that I wasn't able to easily integrate it into Home Assistant. So I did what any nerd trying to avoid real work would do and fired up URH and reverse engineered the remote's RF protocol to build an ESPHome controller for it.
The entire process and sample component YAML are documented in my git repo.
I used an ESP32 and a CC1101 radio module (both available from lots of places online for less than $10 USD each) and was able to get it to work using the stock components in ESPHome (CC1101 and Template Fan) and also provided the code to the Arduino proof-of-concept.
Major kudos to Caleb Crome who reverse engineered an older version and got me heading down the right path.
Hi @thadd I just want to say thanks for contributing your work on this.
I've managed to get it booting and got my remote id but it does not seem able to turn the fan on or off.
You mention in your repo your friend having the non-eco model. That may be what mine is. Do you happen to know what changes are needed to get it working on his model?
EDIT: Based on your screenshots stating that your friend's signal capture was a higher frequency I tried this:
Glad you got it working! It’s probably not a difference between the models but with the centering on the CC1101 chips. I read some folks had to tweak the target frequency a bit to get things to work so I’ll make a note of trying that in docs in case other run into the same issue.
I've been searching for a year for a way to automate my whole house fan with the QuietCool glass remote, thank you for putting this together. It grabbed my remote ID immediately after flashing but wasn't able to successfully send commands out of the box. Taking a cue from this discussion thread I started incrementing the frequency and landed on a working solution after a couple tries.
I got an ESP32 and CC1101 now, wired em up, and I've been banging my head on this for a week. Tried frequencies between .90 and .98 in 0.01 increments. Just not seeing anything in the logs. I do notice that at ~.94, the remote seems to be unable to communicate with the fan when it is nearby, suggesting that the CC1101 is interfering with the remote. Unfortunately, even though moving the remote away from the CC1101 gets rid of the interference and allows the remote to operate, I still do not see the remote ID printed in the logs.
I would try the Arduino version in the repo. You can download the IDE from Arduino's website and that file should load up and run on your ESP32. It'll be easier to debug than ESPHome if only because it compiles and runs in seconds instead of minutes. It sounds like the interface is working fine since it's doing some reading, but still double check your wiring. Some ESP32s have discrepancies between the pin numbering printed on the board and which GPIO they're actually connected to.
Once the Arduino sketch is loaded on the ESP32, you can hit "R" when connected to the ESP in the serial console from the Arduino IDE and then try waking your remote and pushing buttons. If it can read your remote it should spit out the ID and the command it saw to the console.
Is your QuietCool newer or older? You have the glass remote (not the one with physical buttons, just touch surfaces)? Try also unplugging your fan if it's easy to do. It could be that the controller is echoing responses that are messing up the ID reader.
Are you in the USA? It might be that they have different frequencies in different countries.
Yeah, exactly. I put a software-defined radio right next to the fan and picked up a response message. It was super faint and there’s no way the antenna inside the remote can pick it up. I think they intended the protocol originally to have a confirmation but couldn’t get it working.
Anyway, eliminating potential messages from the fan itself if yours transmits louder won’t hurt and could help.
But the important thing is the arduino version should be more forgiving if the message is faint because he frequency is off.
Another thing that occurred to me is to try tweaking the baud rate too (line 67 in component.yaml or 42 in the arduino sketch). When I captured things it seemed just a touch under 2400 and so it's possible some part of it is a bit off or being a bit particular.
Thadd, thanks for the original legwork here — your URH writeup is what convinced
me this was tractable. A couple of things I found might help unstick people on
the frequency/baud tuning:
@James_Guillochon — your hunch that the capture looked “just under 2400” lines
up with what the remote’s firmware actually configures: it’s exactly 2400 bps
(2-FSK, ±10 kHz deviation, sync 2D D4, no CRC). Locking that in should clear
the “Invalid packet” warnings. What helped me most on the frequency front was
using a Semtech LoRa radio in raw FSK instead of a CC1101 — the packet engine
does sync-word detection in hardware, so it’s far less sensitive to the exact
center frequency and there’s no per-chip 433.92/.94/.96 hunting.
One protocol note for your “turns on High when you press Off from Low” lambdas
(post #8): speed is a 2-bit field (command >> 4) & 0x03 and the 0x80 bit is
masked off, so 80 and 90 are both valid Off — one means “off, no
remembered speed,” the other “off, remembered Low.” Handling 80 fixed a
stuck-state issue on one of my two units, which emit different Off bytes despite
identical firmware.
For what it’s worth, I spent the day with the LoRa boards I had on hand building
a self-learning version — you pair it by pressing your glass remote twice and it
captures the 4-byte sender ID over the air (no sniffing or firmware dump to
onboard), and it’s bi-directional so pressing the physical remote updates the HA
entity too. Repo’s here if it’s useful:
Hi all! I was able to load this onto an ESP8266 I had lying around and got it transmitting with 433.96MHz. However, one thing I noticed is that the fan will start seemingly at randomly when the router is offline. Typically it is 10-20 min from when the router is offline, but has been as long as an hour.
I can only assume that something is causing it to transmit the start command when it is searching for the router to reconnect to. Would it be possible to prevent transmitting any commands until the device is confirmed connected to the router?
I’m also US, have the glass remote, but I’m running the 3 speed model. It has been installed for 15 months, no idea how old the stock was when I had it installed.
I added this update to narrow the filter a bit and hone in on valid packets. As soon as I added this the remote ID popped out immediately. So far I can get my setup to listen, but it does not appear to be working on the Tx side. Not sure if I’m not actually sending data, or if my CC1101 is too far out of spec for the hub to listen. Too late to work on it more tonight, but thought I’d share my minor success.
Now that I had a few hours of sleep I have it working. I ended up using 433.91MHz.
Thadd, thank you so much for your contribution. I have been trying unsuccessfully to get this working on my own for a year on and off. It’s very satisfying to be able to use my phone to run the fan. I could have purchased dozens of new remotes with the time I spent on this, but the dopamine hit of getting it done on my own has been very satisfying.
For anyone else with a 3 speed fan sold as Stealth Pro X (dealer only installation) the following works for me: