Hi I have an R1 (Renesa) fan and did some hands-on BLE testing; sharing findings in case useful.
behind story -
I wanted to control the fans locally with BLE, so I got to the rabbit hole to do this I got till pulling the state of the device locally and got stuck on the sending cmd and found this project on GitHub
Confirmed working (R1, BLE):
Write characteristic accepts plain JSON directly, unencrypted: {"power":true/false}, {"speed":N,"boost":false} (N=1-6), {"led":true/false}, {"sleep":true/false}, {"timer":N} (N=0/1/2/3/6 hours)
Read characteristic (9fa1610e-...) returns a CSV telemetry string; first field is a status bitmask I've fully decoded:
bits 0-3: speed (1-6)
bit 4: power on
bit 5: LED on
bit 7: sleep mode
bits 16-23: timer hours active
This telemetry reflects true fan state regardless of control method — confirmed it updates correctly when the fan is controlled via the physical remote.
One latency observation from this current setup of yours: with BLE-only polling (no Wi-Fi in range), state updates in Home Assistant lag by my poll interval (~30s) behind the fan's actual state — e.g. if the fan is turned on by remote, HA doesn't reflect it until the next poll. With Wi-Fi connected, updates appear to be instant/pushed. Worth noting for anyone relying on BLE-only fans for automations sensitive to timing.
I know it's just a consequence of BLE being poll-based rather than push-based in this setup, not a flaw.
if you provide the adjustment for the timing in BLE it would be great!
Happy to share more detail (full field notes, sample telemetry strings) if useful.
Hi I have an R1 (Renesa) fan and did some hands-on BLE testing; sharing findings in case useful.
behind story -
I wanted to control the fans locally with BLE, so I got to the rabbit hole to do this I got till pulling the state of the device locally and got stuck on the sending cmd and found this project on GitHub
Confirmed working (R1, BLE):
Write characteristic accepts plain JSON directly, unencrypted: {"power":true/false}, {"speed":N,"boost":false} (N=1-6), {"led":true/false}, {"sleep":true/false}, {"timer":N} (N=0/1/2/3/6 hours)
Read characteristic (9fa1610e-...) returns a CSV telemetry string; first field is a status bitmask I've fully decoded:
bits 0-3: speed (1-6)
bit 4: power on
bit 5: LED on
bit 7: sleep mode
bits 16-23: timer hours active
This telemetry reflects true fan state regardless of control method — confirmed it updates correctly when the fan is controlled via the physical remote.
One latency observation from this current setup of yours: with BLE-only polling (no Wi-Fi in range), state updates in Home Assistant lag by my poll interval (~30s) behind the fan's actual state — e.g. if the fan is turned on by remote, HA doesn't reflect it until the next poll. With Wi-Fi connected, updates appear to be instant/pushed. Worth noting for anyone relying on BLE-only fans for automations sensitive to timing.
I know it's just a consequence of BLE being poll-based rather than push-based in this setup, not a flaw.
if you provide the adjustment for the timing in BLE it would be great!
Happy to share more detail (full field notes, sample telemetry strings) if useful.