iRayanKhan / homebridge-tuya

A Homebridge plugin to control Tuya devices locally.
MIT License
395 stars 165 forks source link

setMultiStateLegacy function breaks Sulion FanLight #474

Open nextgenoperations opened 4 months ago

nextgenoperations commented 4 months ago

Checklist

Describe the bug When upgrading to the latest release and checking the configured DPs, I noticed that I was not able to ever turn the fan off, it would always revert to speed 1 when switched off.

To Reproduce Switch fan off in apple home..... slide down the fan control to 0, but fan always stays at speed 1 (or whatever you have defaultFanSpeed set to).

Expected behavior Fan to go off....

Environment (please complete the following information):

Additional context I found the issue... the setMultiStateLegacy breaks my fan device....

After some debugging i discovered that setting multiple DPS in a single call to the device doesn't work , my Fan only processes the last DP sent... so in my case, when the FanActive DP was sent (set to false when swtiching fan off) and the FanRotationSpeed set to the deffault (1 in my case), the fan would only process the last DP, speed 1, so the fan was active with speed 1, which explains why I could never turn it off via homebridge.

return this.setMultiStateLegacy({[this.dpFanOn]: value, [this.dpRotationSpeed]: this.fanDefaultSpeed}, callback);

I tested this extensively by reading back the DPs from the device and when using setMultiStateLegacy the FanActive DP was never set. If I switched the order of the DPs above, then dpFanOn was set correctly, but dpRotationSpeed not.

By reverting the code to call setMultiState instead (which generates a call per DP to be set), the Fan started to work again.

return this.setMultiState({[this.dpFanOn]: value, [this.dpRotationSpeed]: this.fanDefaultSpeed}, callback);

I think we should have an option to use setMultiStateLegacy or setMultiState somewhere so I don't have to edit code with every upgrade etc.

Many thanks,

Adam

nextgenoperations commented 3 months ago

Additional info:

I just tested the above with the remote control that came with the device and I can contend that when you switch the fan on for example, it sends two commands, one to set dpFanActive and the other dpRotationSpeed, so the remote sends each DP call in a separate message too.