This is my experience when using the ESP32 with data taken from the Log tab and reduce for clarity:
* 2025-07-04T07:00:10.438Z
* COMMAND: Setting curtain to:21
…
* 2025-07-04T07:00:13.702Z
* [
{
"rssi": -63,
"serviceData": {
"model": "c",
"modelName": "WoCurtain",
"position": 44,
}
}
]
So, from the time that Homey picks up the UI request to the point at which the curtains send the first response because they are moving is about 3 seconds and they had already moved from 50% to 44% in that time. It’s very unlikely that the response can get much quicker than that.
But, to be honest, the main aim of the ESP32 is to improve the reporting time of changes. During that move, the position in Homey was updated via push notifications 3 times. Without the ESP32, Homey would have to poll the BLE to get updates, which adds a significant load on Homey and is only done every 10 to 30 seconds.
Using the hub I get:
* 2025-07-04T07:30:32.702Z
* Sending {
"command": "setPosition",
"parameter": "0,0,31",
"commandType": "command"
} to EEDFC1EB307B using OAuth
* 2025-07-04T07:30:35.304Z
* [
{
"hubMAC": "ec:6d:38:b2:67:ac",
"address": "EE:DF:C1:EB:30:7B",
"rssi": -62,
"serviceData": {
"model": "c",
"modelName": "WoCurtain",
"calibration": true,
"battery": 30,
"position": 39,
"lightLevel": 2
}
}
]
* 2025-07-04T07:30:39.333Z
* Got a webhook message! {
"eventType": "changeReport",
"eventVersion": "1",
"context": {
"battery": 40,
"calibrate": true,
"deviceMac": "EEDFC1EB307B",
"deviceType": "WoCurtain",
"group": true,
"slidePosition": 30,
"timeOfSample": 1751614239211
}
}
So, about 3 seconds from sending the command until the ESP32 reports the movement, but about 5 seconds before the webhook reports it.
Therefore, the ESP32 is marginally quicker at sending commands than the HUB method, faster at reporting the changes and supports more capabilities on most devices without polling. Also, it is a totally local interface, so no internet required.
I originally produced the ESP32 solution to improve the response of the door opening device and report information that’s not supported via the API