Feature: Dynamic Wind port setting (API field identified)
Dynamic Wind ("Dynamischer Wind" in the German app) is a per-port setting on UIS controllers that makes a fan repeatedly cycle between its min and max levels to simulate natural wind. It is currently not exposed by the integration in any version.
I reverse-engineered the field via A/B snapshot diff (capture getDevSetting + getdevModeSettingList, toggle Dynamic Wind in the app, capture again, diff):
Field location
- Endpoint:
/api/dev/getDevSetting (also mirrored in getdevModeSettingList → devSetting)
- Field:
portParamData — returned as a JSON-encoded string, e.g. "[0, 2, 1, 2, 19, 136, 2, 1, 1]"
- Index 8 (last element) is the Dynamic Wind flag:
1 = on, 0 = off
- The other 8 elements were stable across toggles; only index 8 changes
Note: the previously suspected secFuc* fields (secFucStatus, secFucDevEffect, secFucParams) are unrelated — they stayed 0 on all ports while Dynamic Wind was active.
Write path (verified working)
AdvancedSettingsKey.PORT_PARAM_DATA already exists in const.py, so the existing update_device_settings() read-modify-write path handles it without client changes. Verified on a live controller (both directions, with read-back):
getDevSetting → parse portParamData string to list
- flip index 8
- re-serialize to a JSON string (must stay a string — sending a raw list breaks the urlencoded
updateAdvSetting call)
- pass via
update_device_settings(controller_id, port, dev_name, {AdvancedSettingsKey.PORT_PARAM_DATA: value})
Result: app reflects the toggle immediately; updateAdvSetting returns success; read-back confirms the new value.
Suggested implementation
A switch entity per port (e.g. switch.<device>_port_<n>_dynamic_wind) reading index 8 of the parsed portParamData and writing through the existing advanced-settings path.
Tested on: UIS Controller 69 Pro, integration v2.2.0, 3 controllers / 9 ports. Happy to provide raw snapshot diffs or test a branch.
Feature: Dynamic Wind port setting (API field identified)
Dynamic Wind ("Dynamischer Wind" in the German app) is a per-port setting on UIS controllers that makes a fan repeatedly cycle between its min and max levels to simulate natural wind. It is currently not exposed by the integration in any version.
I reverse-engineered the field via A/B snapshot diff (capture
getDevSetting+getdevModeSettingList, toggle Dynamic Wind in the app, capture again, diff):Field location
/api/dev/getDevSetting(also mirrored ingetdevModeSettingList→devSetting)portParamData— returned as a JSON-encoded string, e.g."[0, 2, 1, 2, 19, 136, 2, 1, 1]"1= on,0= offNote: the previously suspected
secFuc*fields (secFucStatus,secFucDevEffect,secFucParams) are unrelated — they stayed0on all ports while Dynamic Wind was active.Write path (verified working)
AdvancedSettingsKey.PORT_PARAM_DATAalready exists inconst.py, so the existingupdate_device_settings()read-modify-write path handles it without client changes. Verified on a live controller (both directions, with read-back):getDevSetting→ parseportParamDatastring to listupdateAdvSettingcall)update_device_settings(controller_id, port, dev_name, {AdvancedSettingsKey.PORT_PARAM_DATA: value})Result: app reflects the toggle immediately;
updateAdvSettingreturns success; read-back confirms the new value.Suggested implementation
A switch entity per port (e.g.
switch.<device>_port_<n>_dynamic_wind) reading index 8 of the parsedportParamDataand writing through the existing advanced-settings path.Tested on: UIS Controller 69 Pro, integration v2.2.0, 3 controllers / 9 ports. Happy to provide raw snapshot diffs or test a branch.