@mp-consulting/homebridge-daikin-cloud 1.5.2 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/README.md +40 -27
  2. package/config.schema.json +66 -12
  3. package/dist/src/accessories/air-conditioning-accessory.js +1 -1
  4. package/dist/src/accessories/air-conditioning-accessory.js.map +1 -1
  5. package/dist/src/accessories/altherma-accessory.js +1 -1
  6. package/dist/src/accessories/altherma-accessory.js.map +1 -1
  7. package/dist/src/accessories/base-accessory.d.ts +5 -4
  8. package/dist/src/accessories/base-accessory.d.ts.map +1 -1
  9. package/dist/src/accessories/base-accessory.js +9 -10
  10. package/dist/src/accessories/base-accessory.js.map +1 -1
  11. package/dist/src/api/daikin-api.d.ts +22 -6
  12. package/dist/src/api/daikin-api.d.ts.map +1 -1
  13. package/dist/src/api/daikin-api.js +49 -23
  14. package/dist/src/api/daikin-api.js.map +1 -1
  15. package/dist/src/api/daikin-controller.d.ts +4 -48
  16. package/dist/src/api/daikin-controller.d.ts.map +1 -1
  17. package/dist/src/api/daikin-controller.js +14 -84
  18. package/dist/src/api/daikin-controller.js.map +1 -1
  19. package/dist/src/api/daikin-mobile-oauth.d.ts +11 -40
  20. package/dist/src/api/daikin-mobile-oauth.d.ts.map +1 -1
  21. package/dist/src/api/daikin-mobile-oauth.js +36 -160
  22. package/dist/src/api/daikin-mobile-oauth.js.map +1 -1
  23. package/dist/src/api/daikin-oauth.d.ts +10 -37
  24. package/dist/src/api/daikin-oauth.d.ts.map +1 -1
  25. package/dist/src/api/daikin-oauth.js +36 -166
  26. package/dist/src/api/daikin-oauth.js.map +1 -1
  27. package/dist/src/api/daikin-schemas.d.ts +20 -22
  28. package/dist/src/api/daikin-schemas.d.ts.map +1 -1
  29. package/dist/src/api/daikin-schemas.js +17 -49
  30. package/dist/src/api/daikin-schemas.js.map +1 -1
  31. package/dist/src/api/daikin-types.d.ts +11 -23
  32. package/dist/src/api/daikin-types.d.ts.map +1 -1
  33. package/dist/src/api/daikin-types.js.map +1 -1
  34. package/dist/src/api/daikin-websocket.d.ts +4 -5
  35. package/dist/src/api/daikin-websocket.d.ts.map +1 -1
  36. package/dist/src/api/daikin-websocket.js +62 -34
  37. package/dist/src/api/daikin-websocket.js.map +1 -1
  38. package/dist/src/api/http-defaults.d.ts +3 -2
  39. package/dist/src/api/http-defaults.d.ts.map +1 -1
  40. package/dist/src/api/http-defaults.js.map +1 -1
  41. package/dist/src/api/http-transport.d.ts +14 -2
  42. package/dist/src/api/http-transport.d.ts.map +1 -1
  43. package/dist/src/api/http-transport.js +32 -9
  44. package/dist/src/api/http-transport.js.map +1 -1
  45. package/dist/src/api/token-client.d.ts +82 -0
  46. package/dist/src/api/token-client.d.ts.map +1 -0
  47. package/dist/src/api/token-client.js +188 -0
  48. package/dist/src/api/token-client.js.map +1 -0
  49. package/dist/src/api/token-storage.d.ts +6 -0
  50. package/dist/src/api/token-storage.d.ts.map +1 -1
  51. package/dist/src/api/token-storage.js +27 -1
  52. package/dist/src/api/token-storage.js.map +1 -1
  53. package/dist/src/config/config-manager.d.ts +69 -125
  54. package/dist/src/config/config-manager.d.ts.map +1 -1
  55. package/dist/src/config/config-manager.js +288 -225
  56. package/dist/src/config/config-manager.js.map +1 -1
  57. package/dist/src/constants/api.constants.d.ts +6 -0
  58. package/dist/src/constants/api.constants.d.ts.map +1 -1
  59. package/dist/src/constants/api.constants.js +7 -1
  60. package/dist/src/constants/api.constants.js.map +1 -1
  61. package/dist/src/constants/auth.constants.d.ts +11 -0
  62. package/dist/src/constants/auth.constants.d.ts.map +1 -1
  63. package/dist/src/constants/auth.constants.js +12 -1
  64. package/dist/src/constants/auth.constants.js.map +1 -1
  65. package/dist/src/constants/device.constants.d.ts +1 -7
  66. package/dist/src/constants/device.constants.d.ts.map +1 -1
  67. package/dist/src/constants/device.constants.js +2 -11
  68. package/dist/src/constants/device.constants.js.map +1 -1
  69. package/dist/src/constants/time.constants.d.ts +0 -2
  70. package/dist/src/constants/time.constants.d.ts.map +1 -1
  71. package/dist/src/constants/time.constants.js +1 -3
  72. package/dist/src/constants/time.constants.js.map +1 -1
  73. package/dist/src/device/accessory-factory.d.ts +0 -5
  74. package/dist/src/device/accessory-factory.d.ts.map +1 -1
  75. package/dist/src/device/accessory-factory.js +0 -7
  76. package/dist/src/device/accessory-factory.js.map +1 -1
  77. package/dist/src/device/capability-detector.d.ts +9 -1
  78. package/dist/src/device/capability-detector.d.ts.map +1 -1
  79. package/dist/src/device/capability-detector.js +32 -28
  80. package/dist/src/device/capability-detector.js.map +1 -1
  81. package/dist/src/device/capability-docs.d.ts.map +1 -1
  82. package/dist/src/device/capability-docs.js +3 -0
  83. package/dist/src/device/capability-docs.js.map +1 -1
  84. package/dist/src/device/data-paths.d.ts +18 -0
  85. package/dist/src/device/data-paths.d.ts.map +1 -0
  86. package/dist/src/device/data-paths.js +20 -0
  87. package/dist/src/device/data-paths.js.map +1 -0
  88. package/dist/src/device/profiles/device-profile.d.ts +0 -5
  89. package/dist/src/device/profiles/device-profile.d.ts.map +1 -1
  90. package/dist/src/device/profiles/device-profile.js +0 -21
  91. package/dist/src/device/profiles/device-profile.js.map +1 -1
  92. package/dist/src/features/base-feature.d.ts +53 -9
  93. package/dist/src/features/base-feature.d.ts.map +1 -1
  94. package/dist/src/features/base-feature.js +93 -40
  95. package/dist/src/features/base-feature.js.map +1 -1
  96. package/dist/src/features/feature-manager.d.ts +27 -15
  97. package/dist/src/features/feature-manager.d.ts.map +1 -1
  98. package/dist/src/features/feature-manager.js +27 -24
  99. package/dist/src/features/feature-manager.js.map +1 -1
  100. package/dist/src/features/index.d.ts +1 -0
  101. package/dist/src/features/index.d.ts.map +1 -1
  102. package/dist/src/features/index.js +1 -0
  103. package/dist/src/features/index.js.map +1 -1
  104. package/dist/src/features/modes/auto-fan-mode.feature.d.ts +16 -10
  105. package/dist/src/features/modes/auto-fan-mode.feature.d.ts.map +1 -1
  106. package/dist/src/features/modes/auto-fan-mode.feature.js +16 -40
  107. package/dist/src/features/modes/auto-fan-mode.feature.js.map +1 -1
  108. package/dist/src/features/modes/dry-operation-mode.feature.d.ts +12 -9
  109. package/dist/src/features/modes/dry-operation-mode.feature.d.ts.map +1 -1
  110. package/dist/src/features/modes/dry-operation-mode.feature.js +11 -30
  111. package/dist/src/features/modes/dry-operation-mode.feature.js.map +1 -1
  112. package/dist/src/features/modes/econo-mode.feature.d.ts +12 -9
  113. package/dist/src/features/modes/econo-mode.feature.d.ts.map +1 -1
  114. package/dist/src/features/modes/econo-mode.feature.js +11 -31
  115. package/dist/src/features/modes/econo-mode.feature.js.map +1 -1
  116. package/dist/src/features/modes/fan-only-operation-mode.feature.d.ts +12 -9
  117. package/dist/src/features/modes/fan-only-operation-mode.feature.d.ts.map +1 -1
  118. package/dist/src/features/modes/fan-only-operation-mode.feature.js +11 -30
  119. package/dist/src/features/modes/fan-only-operation-mode.feature.js.map +1 -1
  120. package/dist/src/features/modes/firmware-update.feature.d.ts +7 -6
  121. package/dist/src/features/modes/firmware-update.feature.d.ts.map +1 -1
  122. package/dist/src/features/modes/firmware-update.feature.js +15 -22
  123. package/dist/src/features/modes/firmware-update.feature.js.map +1 -1
  124. package/dist/src/features/modes/holiday-mode.feature.d.ts +2 -1
  125. package/dist/src/features/modes/holiday-mode.feature.d.ts.map +1 -1
  126. package/dist/src/features/modes/holiday-mode.feature.js +5 -15
  127. package/dist/src/features/modes/holiday-mode.feature.js.map +1 -1
  128. package/dist/src/features/modes/indoor-silent-mode.feature.d.ts +15 -12
  129. package/dist/src/features/modes/indoor-silent-mode.feature.d.ts.map +1 -1
  130. package/dist/src/features/modes/indoor-silent-mode.feature.js +15 -39
  131. package/dist/src/features/modes/indoor-silent-mode.feature.js.map +1 -1
  132. package/dist/src/features/modes/oscillation-mode.feature.d.ts +5 -6
  133. package/dist/src/features/modes/oscillation-mode.feature.d.ts.map +1 -1
  134. package/dist/src/features/modes/oscillation-mode.feature.js +14 -36
  135. package/dist/src/features/modes/oscillation-mode.feature.js.map +1 -1
  136. package/dist/src/features/modes/outdoor-silent-mode.feature.d.ts +12 -9
  137. package/dist/src/features/modes/outdoor-silent-mode.feature.d.ts.map +1 -1
  138. package/dist/src/features/modes/outdoor-silent-mode.feature.js +11 -31
  139. package/dist/src/features/modes/outdoor-silent-mode.feature.js.map +1 -1
  140. package/dist/src/features/modes/powerful-mode.feature.d.ts +14 -10
  141. package/dist/src/features/modes/powerful-mode.feature.d.ts.map +1 -1
  142. package/dist/src/features/modes/powerful-mode.feature.js +13 -32
  143. package/dist/src/features/modes/powerful-mode.feature.js.map +1 -1
  144. package/dist/src/features/modes/streamer-mode.feature.d.ts +12 -9
  145. package/dist/src/features/modes/streamer-mode.feature.d.ts.map +1 -1
  146. package/dist/src/features/modes/streamer-mode.feature.js +11 -31
  147. package/dist/src/features/modes/streamer-mode.feature.js.map +1 -1
  148. package/dist/src/features/on-off-data-point-feature.d.ts +43 -0
  149. package/dist/src/features/on-off-data-point-feature.d.ts.map +1 -0
  150. package/dist/src/features/on-off-data-point-feature.js +49 -0
  151. package/dist/src/features/on-off-data-point-feature.js.map +1 -0
  152. package/dist/src/platform.d.ts +56 -9
  153. package/dist/src/platform.d.ts.map +1 -1
  154. package/dist/src/platform.js +248 -128
  155. package/dist/src/platform.js.map +1 -1
  156. package/dist/src/services/climate-control/fan-speed.d.ts +45 -0
  157. package/dist/src/services/climate-control/fan-speed.d.ts.map +1 -0
  158. package/dist/src/services/climate-control/fan-speed.js +104 -0
  159. package/dist/src/services/climate-control/fan-speed.js.map +1 -0
  160. package/dist/src/services/climate-control/separate-fan.service.d.ts +45 -0
  161. package/dist/src/services/climate-control/separate-fan.service.d.ts.map +1 -0
  162. package/dist/src/services/climate-control/separate-fan.service.js +82 -0
  163. package/dist/src/services/climate-control/separate-fan.service.js.map +1 -0
  164. package/dist/src/services/climate-control/setpoint-resolver.d.ts +68 -0
  165. package/dist/src/services/climate-control/setpoint-resolver.d.ts.map +1 -0
  166. package/dist/src/services/climate-control/setpoint-resolver.js +170 -0
  167. package/dist/src/services/climate-control/setpoint-resolver.js.map +1 -0
  168. package/dist/src/services/climate-control/swing-controller.d.ts +28 -0
  169. package/dist/src/services/climate-control/swing-controller.d.ts.map +1 -0
  170. package/dist/src/services/climate-control/swing-controller.js +65 -0
  171. package/dist/src/services/climate-control/swing-controller.js.map +1 -0
  172. package/dist/src/services/climate-control.service.d.ts +39 -48
  173. package/dist/src/services/climate-control.service.d.ts.map +1 -1
  174. package/dist/src/services/climate-control.service.js +223 -554
  175. package/dist/src/services/climate-control.service.js.map +1 -1
  176. package/dist/src/services/hot-water-tank.service.d.ts +17 -8
  177. package/dist/src/services/hot-water-tank.service.d.ts.map +1 -1
  178. package/dist/src/services/hot-water-tank.service.js +102 -157
  179. package/dist/src/services/hot-water-tank.service.js.map +1 -1
  180. package/dist/src/types/daikin-enums.d.ts +0 -5
  181. package/dist/src/types/daikin-enums.d.ts.map +1 -1
  182. package/dist/src/types/daikin-enums.js +1 -7
  183. package/dist/src/types/daikin-enums.js.map +1 -1
  184. package/dist/src/types/device-capabilities.d.ts +1 -0
  185. package/dist/src/types/device-capabilities.d.ts.map +1 -1
  186. package/dist/src/utils/errors.d.ts +9 -0
  187. package/dist/src/utils/errors.d.ts.map +1 -0
  188. package/dist/src/utils/errors.js +25 -0
  189. package/dist/src/utils/errors.js.map +1 -0
  190. package/dist/src/utils/hap-write.d.ts +22 -0
  191. package/dist/src/utils/hap-write.d.ts.map +1 -0
  192. package/dist/src/utils/hap-write.js +33 -0
  193. package/dist/src/utils/hap-write.js.map +1 -0
  194. package/dist/src/utils/sleep.d.ts +5 -0
  195. package/dist/src/utils/sleep.d.ts.map +1 -0
  196. package/dist/src/utils/sleep.js +10 -0
  197. package/dist/src/utils/sleep.js.map +1 -0
  198. package/homebridge-ui/README.md +25 -2
  199. package/homebridge-ui/public/index.html +19 -17
  200. package/homebridge-ui/public/script.js +95 -32
  201. package/homebridge-ui/public/styles.css +109 -0
  202. package/homebridge-ui/server.js +687 -453
  203. package/package.json +3 -3
  204. package/dist/src/utils/log-context.d.ts +0 -105
  205. package/dist/src/utils/log-context.d.ts.map +0 -1
  206. package/dist/src/utils/log-context.js +0 -206
  207. package/dist/src/utils/log-context.js.map +0 -1
  208. package/dist/src/utils/update-mapper.d.ts +0 -59
  209. package/dist/src/utils/update-mapper.d.ts.map +0 -1
  210. package/dist/src/utils/update-mapper.js +0 -192
  211. package/dist/src/utils/update-mapper.js.map +0 -1
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Swing Controller
3
+ *
4
+ * Reads and writes the fan swing (fanDirection vertical/horizontal) state for
5
+ * the current operation mode. Shared by the HeaterCooler SwingMode, the
6
+ * separate Fan service and the Oscillation switch so all three agree on what
7
+ * "swinging" means and which axes get written.
8
+ */
9
+ import type { DaikinCloudDevice } from '../../api';
10
+ import type { FanAxis } from '../../device/data-paths';
11
+ export declare class SwingController {
12
+ private readonly getDevice;
13
+ private readonly managementPointId;
14
+ constructor(getDevice: () => DaikinCloudDevice, managementPointId: string);
15
+ /** Current swing value of an axis, or undefined when the axis doesn't exist in this mode. */
16
+ axisValue(axis: FanAxis): string | undefined;
17
+ hasAxis(axis: FanAxis): boolean;
18
+ isSupported(): boolean;
19
+ /** Off only when an axis that exists is stopped. */
20
+ isSwinging(): boolean;
21
+ describe(): string;
22
+ /** Axes whose current value differs from the requested state (equality guard). */
23
+ axesToWrite(enabled: boolean): FanAxis[];
24
+ /** Write the requested swing state to every axis that isn't already there. */
25
+ set(enabled: boolean): Promise<void>;
26
+ private operationMode;
27
+ }
28
+ //# sourceMappingURL=swing-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swing-controller.d.ts","sourceRoot":"","sources":["../../../../src/services/climate-control/swing-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAUvD,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBADjB,SAAS,EAAE,MAAM,iBAAiB,EAClC,iBAAiB,EAAE,MAAM;IAG5C,6FAA6F;IAC7F,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS;IAO5C,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAI/B,WAAW,IAAI,OAAO;IAItB,oDAAoD;IACpD,UAAU,IAAI,OAAO;IAIrB,QAAQ,IAAI,MAAM;IAIlB,kFAAkF;IAClF,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE;IAQxC,8EAA8E;IACxE,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1C,OAAO,CAAC,aAAa;CAItB"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ /**
3
+ * Swing Controller
4
+ *
5
+ * Reads and writes the fan swing (fanDirection vertical/horizontal) state for
6
+ * the current operation mode. Shared by the HeaterCooler SwingMode, the
7
+ * separate Fan service and the Oscillation switch so all three agree on what
8
+ * "swinging" means and which axes get written.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.SwingController = void 0;
12
+ const data_paths_1 = require("../../device/data-paths");
13
+ const types_1 = require("../../types");
14
+ const SWING = types_1.DaikinFanDirectionHorizontalModes.SWING;
15
+ const STOP = types_1.DaikinFanDirectionHorizontalModes.STOP;
16
+ // Horizontal first: matches the historical PATCH order.
17
+ const AXES = ['horizontal', 'vertical'];
18
+ class SwingController {
19
+ getDevice;
20
+ managementPointId;
21
+ constructor(getDevice, managementPointId) {
22
+ this.getDevice = getDevice;
23
+ this.managementPointId = managementPointId;
24
+ }
25
+ /** Current swing value of an axis, or undefined when the axis doesn't exist in this mode. */
26
+ axisValue(axis) {
27
+ const value = this.getDevice().getData(this.managementPointId, 'fanControl', data_paths_1.DataPaths.fanDirection(this.operationMode(), axis)).value;
28
+ return value === undefined ? undefined : String(value);
29
+ }
30
+ hasAxis(axis) {
31
+ return this.axisValue(axis) !== undefined;
32
+ }
33
+ isSupported() {
34
+ return this.hasAxis('vertical') || this.hasAxis('horizontal');
35
+ }
36
+ /** Off only when an axis that exists is stopped. */
37
+ isSwinging() {
38
+ return AXES.every(axis => this.axisValue(axis) !== STOP);
39
+ }
40
+ describe() {
41
+ return `vertical: ${this.axisValue('vertical') ?? null}, horizontal: ${this.axisValue('horizontal') ?? null}`;
42
+ }
43
+ /** Axes whose current value differs from the requested state (equality guard). */
44
+ axesToWrite(enabled) {
45
+ const target = enabled ? SWING : STOP;
46
+ return AXES.filter(axis => {
47
+ const current = this.axisValue(axis);
48
+ return current !== undefined && current !== target;
49
+ });
50
+ }
51
+ /** Write the requested swing state to every axis that isn't already there. */
52
+ async set(enabled) {
53
+ const target = enabled ? SWING : STOP;
54
+ const operationMode = this.operationMode();
55
+ for (const axis of this.axesToWrite(enabled)) {
56
+ await this.getDevice().setData(this.managementPointId, 'fanControl', data_paths_1.DataPaths.fanDirection(operationMode, axis), target);
57
+ }
58
+ }
59
+ operationMode() {
60
+ const value = this.getDevice().getData(this.managementPointId, 'operationMode', undefined).value;
61
+ return typeof value === 'string' && value ? value : types_1.DaikinOperationModes.AUTO;
62
+ }
63
+ }
64
+ exports.SwingController = SwingController;
65
+ //# sourceMappingURL=swing-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swing-controller.js","sourceRoot":"","sources":["../../../../src/services/climate-control/swing-controller.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAIH,wDAAoD;AACpD,uCAAsF;AAEtF,MAAM,KAAK,GAAG,yCAAiC,CAAC,KAAK,CAAC;AACtD,MAAM,IAAI,GAAG,yCAAiC,CAAC,IAAI,CAAC;AAEpD,wDAAwD;AACxD,MAAM,IAAI,GAAuB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAE5D,MAAa,eAAe;IAEP;IACA;IAFnB,YACmB,SAAkC,EAClC,iBAAyB;QADzB,cAAS,GAAT,SAAS,CAAyB;QAClC,sBAAiB,GAAjB,iBAAiB,CAAQ;IACzC,CAAC;IAEJ,6FAA6F;IAC7F,SAAS,CAAC,IAAa;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CACpC,IAAI,CAAC,iBAAiB,EAAE,YAAY,EAAE,sBAAS,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CACzF,CAAC,KAAK,CAAC;QACR,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,CAAC,IAAa;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC;IAC5C,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAChE,CAAC;IAED,oDAAoD;IACpD,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED,QAAQ;QACN,OAAO,aAAa,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,IAAI,iBAAiB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC;IAChH,CAAC;IAED,kFAAkF;IAClF,WAAW,CAAC,OAAgB;QAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACtC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,MAAM,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,GAAG,CAAC,OAAgB;QACxB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAC5B,IAAI,CAAC,iBAAiB,EAAE,YAAY,EAAE,sBAAS,CAAC,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,MAAM,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,aAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,eAAe,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC;QACjG,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,4BAAoB,CAAC,IAAI,CAAC;IAChF,CAAC;CACF;AAvDD,0CAuDC"}
@@ -1,38 +1,35 @@
1
1
  import type { CharacteristicValue, PlatformAccessory } from 'homebridge';
2
2
  import type { DaikinCloudAccessoryContext, DaikinCloudPlatform } from '../platform';
3
- import { DaikinControlModes, DaikinOperationModes, DaikinSetpointModes, DaikinTemperatureControlSetpoints } from '../types';
3
+ import { DaikinOperationModes } from '../types';
4
+ import type { DaikinControlModes } from '../types';
4
5
  import { FeatureManager } from '../features';
6
+ import { FanSpeedController } from './climate-control/fan-speed';
7
+ import { SwingController } from './climate-control/swing-controller';
8
+ import { SetpointResolver } from './climate-control/setpoint-resolver';
5
9
  export declare class ClimateControlService {
6
10
  readonly platform: DaikinCloudPlatform;
7
11
  readonly accessory: PlatformAccessory<DaikinCloudAccessoryContext>;
8
12
  readonly managementPointId: string;
9
13
  private readonly name;
10
- private readonly service?;
11
- private fanService?;
14
+ private readonly service;
12
15
  readonly featureManager: FeatureManager;
16
+ readonly swing: SwingController;
17
+ readonly fanSpeed: FanSpeedController;
18
+ readonly setpoints: SetpointResolver;
19
+ private readonly autoSetpointSync;
20
+ private readonly separateFan;
21
+ private lastOperationMode?;
13
22
  constructor(platform: DaikinCloudPlatform, accessory: PlatformAccessory<DaikinCloudAccessoryContext>, managementPointId: string);
23
+ private get device();
24
+ private getData;
25
+ private setData;
26
+ private write;
14
27
  /**
15
- * Optional standalone Fan (Fanv2) service.
16
- *
17
- * HomeKit hides the HeaterCooler's RotationSpeed slider and SwingMode toggle
18
- * when the accessory is grouped into a single tile in the Home app — they're
19
- * only reachable by opening the device directly. Exposing a separate Fanv2
20
- * service gives the fan speed slider and oscillation toggle their own tile that
21
- * stays visible even when grouped.
22
- *
23
- * Gated behind the `showSeparateFanControl` config option, and only added when
24
- * the device actually exposes a fixed fan speed and/or a swing mode. The fan's
25
- * Active characteristic mirrors the unit on/off state, and its RotationSpeed /
26
- * SwingMode reuse the same handlers as the HeaterCooler so both services stay
27
- * in sync.
28
+ * Threshold characteristics. getData() always returns a wrapper, so these are
29
+ * always present; the props come from the device's setpoint constraints.
28
30
  */
31
+ private setupThreshold;
29
32
  setupSeparateFanService(): void;
30
- /**
31
- * Execute a device write operation with proper HAP error handling.
32
- * Catches errors, logs a warning, and throws HapStatusError(SERVICE_COMMUNICATION_FAILURE)
33
- * so HomeKit shows "No Response" instead of Homebridge logging "plugin threw an error".
34
- */
35
- private setDeviceData;
36
33
  /**
37
34
  * Push current device state to all HAP characteristics via updateValue().
38
35
  * Called after every poll/WebSocket update so HomeKit has an accurate view of
@@ -40,47 +37,41 @@ export declare class ClimateControlService {
40
37
  * scene commands before they ever reach onSet.
41
38
  */
42
39
  refreshValues(): void;
40
+ /**
41
+ * Add/refresh RotationSpeed for the current operation mode's fixed fan speed,
42
+ * or remove it when that mode has none (getData() returns `{ value: undefined }`
43
+ * for a missing path; setting it would fail at the API).
44
+ *
45
+ * The characteristic stays in percentage space (see fan-speed.ts). setProps
46
+ * runs FIRST to widen any narrow range left over from a prior session, or the
47
+ * updateValue below trips HAP's validateUserInput; minValue=0 (not
48
+ * stepPercent) keeps HAP happy for cached values below one step —
49
+ * percentToDeviceSpeed clamps writes up to the device minValue anyway.
50
+ */
43
51
  addOrUpdateCharacteristicRotationSpeed(): void;
44
52
  handleActiveStateGet(): Promise<CharacteristicValue>;
45
53
  handleActiveStateSet(value: CharacteristicValue): Promise<void>;
46
54
  handleCurrentTemperatureGet(): Promise<CharacteristicValue>;
55
+ private currentTemperature;
47
56
  handleCoolingThresholdTemperatureGet(): Promise<CharacteristicValue>;
48
57
  handleCoolingThresholdTemperatureSet(value: CharacteristicValue): Promise<void>;
49
- handleRotationSpeedGet(): Promise<CharacteristicValue>;
50
- handleRotationSpeedSet(value: CharacteristicValue): Promise<void>;
51
58
  handleHeatingThresholdTemperatureGet(): Promise<CharacteristicValue>;
52
59
  handleHeatingThresholdTemperatureSet(value: CharacteristicValue): Promise<void>;
60
+ private thresholdGet;
53
61
  /**
54
- * Daikin's auto operationMode uses a SINGLE setpoint, not a range like
55
- * HomeKit's HeaterCooler (heating threshold + cooling threshold). Without
56
- * this sync the Daikin app keeps showing whatever auto setpoint was there
57
- * when the device was last in auto mode, regardless of what the user picks
58
- * in HomeKit. Mirror the midpoint of the current heating/cooling thresholds
59
- * to /operationModes/auto/setpoints/roomTemperature whenever either
60
- * threshold is set, so the Daikin app and HomeKit stay in sync.
61
- *
62
- * No-op when the device doesn't expose an auto setpoint (e.g. devices
63
- * without an auto operationMode at all).
62
+ * Write a threshold, then mirror the heating/cooling midpoint to Daikin's
63
+ * single AUTO setpoint — once, after concurrent threshold writes settle
64
+ * (see AutoSetpointSync).
64
65
  */
65
- private syncAutoSetpointIfSupported;
66
+ private thresholdSet;
67
+ handleRotationSpeedGet(): Promise<CharacteristicValue>;
68
+ handleRotationSpeedSet(value: CharacteristicValue): Promise<void>;
66
69
  handleTargetHeaterCoolerStateGet(): Promise<CharacteristicValue>;
70
+ private targetHeaterCoolerState;
67
71
  handleTargetHeaterCoolerStateSet(value: CharacteristicValue): Promise<void>;
68
72
  handleSwingModeSet(value: CharacteristicValue): Promise<void>;
69
73
  handleSwingModeGet(): Promise<CharacteristicValue>;
70
74
  getCurrentOperationMode(): DaikinOperationModes;
71
75
  getCurrentControlMode(): DaikinControlModes;
72
- getSetpointMode(): DaikinSetpointModes | null;
73
- getSetpoint(operationMode: DaikinOperationModes): DaikinTemperatureControlSetpoints;
74
- hasSwingModeVerticalFeature(): boolean;
75
- hasSwingModeHorizontalFeature(): boolean;
76
- hasSwingModeFeature(): boolean;
77
- hasPowerfulModeFeature(): boolean;
78
- hasEconoModeFeature(): boolean;
79
- hasStreamerModeFeature(): boolean;
80
- hasOutdoorSilentModeFeature(): boolean;
81
- hasIndoorSilentModeFeature(): boolean;
82
- hasOperationMode(operationMode: DaikinOperationModes): boolean;
83
- hasDryOperationModeFeature(): boolean;
84
- hasFanOnlyOperationModeFeature(): boolean;
85
76
  }
86
77
  //# sourceMappingURL=climate-control.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"climate-control.service.d.ts","sourceRoot":"","sources":["../../../src/services/climate-control.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAW,MAAM,YAAY,CAAC;AAClF,OAAO,KAAK,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EACL,kBAAkB,EAKlB,oBAAoB,EACpB,mBAAmB,EACnB,iCAAiC,EAClC,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAS7C,qBAAa,qBAAqB;IAChC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,2BAA2B,CAAC,CAAC;IACnE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAU;IACnC,OAAO,CAAC,UAAU,CAAC,CAAU;IAC7B,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;gBAGtC,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAE,iBAAiB,CAAC,2BAA2B,CAAC,EACzD,iBAAiB,EAAE,MAAM;IAuF3B;;;;;;;;;;;;;;OAcG;IACH,uBAAuB,IAAI,IAAI;IAsD/B;;;;OAIG;YACW,aAAa;IAU3B;;;;;OAKG;IACH,aAAa,IAAI,IAAI;IAkHrB,sCAAsC;IAsDhC,oBAAoB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAMpD,oBAAoB,CAAC,KAAK,EAAE,mBAAmB;IAc/C,2BAA2B,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAU3D,oCAAoC,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAapE,oCAAoC,CAAC,KAAK,EAAE,mBAAmB;IAS/D,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAatD,sBAAsB,CAAC,KAAK,EAAE,mBAAmB;IAsDjD,oCAAoC,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAapE,oCAAoC,CAAC,KAAK,EAAE,mBAAmB;IASrE;;;;;;;;;;;OAWG;YACW,2BAA2B;IAuDnC,gCAAgC,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAoBhE,gCAAgC,CAAC,KAAK,EAAE,mBAAmB;IA2B3D,kBAAkB,CAAC,KAAK,EAAE,mBAAmB;IAe7C,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAkBxD,uBAAuB,IAAI,oBAAoB;IAI/C,qBAAqB,IAAI,kBAAkB;IAW3C,eAAe,IAAI,mBAAmB,GAAG,IAAI;IAQ7C,WAAW,CAAC,aAAa,EAAE,oBAAoB,GAAG,iCAAiC;IAuDnF,2BAA2B;IAO3B,6BAA6B;IAK7B,mBAAmB;IAInB,sBAAsB;IAMtB,mBAAmB;IAMnB,sBAAsB;IAMtB,2BAA2B;IAM3B,0BAA0B;IAU1B,gBAAgB,CAAC,aAAa,EAAE,oBAAoB;IAMpD,0BAA0B;IAI1B,8BAA8B;CAG/B"}
1
+ {"version":3,"file":"climate-control.service.d.ts","sourceRoot":"","sources":["../../../src/services/climate-control.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,mBAAmB,EAAE,iBAAiB,EAAqB,MAAM,YAAY,CAAC;AAC5G,OAAO,KAAK,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEpF,OAAO,EAAoB,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAClE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAU7C,OAAO,EAAE,kBAAkB,EAAe,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAoB,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAMzF,qBAAa,qBAAqB;IAChC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,2BAA2B,CAAC,CAAC;IACnE,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,iBAAiB,CAAC,CAAuB;gBAG/C,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAE,iBAAiB,CAAC,2BAA2B,CAAC,EACzD,iBAAiB,EAAE,MAAM;IA2D3B,OAAO,KAAK,MAAM,GAEjB;IAED,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACH,OAAO,CAAC,cAAc;IAoBtB,uBAAuB,IAAI,IAAI;IAe/B;;;;;OAKG;IACH,aAAa,IAAI,IAAI;IAmErB;;;;;;;;;;OAUG;IACH,sCAAsC;IAwBhC,oBAAoB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAMpD,oBAAoB,CAAC,KAAK,EAAE,mBAAmB;IAW/C,2BAA2B,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAMjE,OAAO,CAAC,kBAAkB;IAIpB,oCAAoC,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIpE,oCAAoC,CAAC,KAAK,EAAE,mBAAmB;IAI/D,oCAAoC,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAIpE,oCAAoC,CAAC,KAAK,EAAE,mBAAmB;IAIrE,OAAO,CAAC,YAAY;IAOpB;;;;OAIG;YACW,YAAY;IAapB,sBAAsB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAQtD,sBAAsB,CAAC,KAAK,EAAE,mBAAmB;IAmBjD,gCAAgC,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAQtE,OAAO,CAAC,uBAAuB;IAYzB,gCAAgC,CAAC,KAAK,EAAE,mBAAmB;IAqB3D,kBAAkB,CAAC,KAAK,EAAE,mBAAmB;IAU7C,kBAAkB,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAOxD,uBAAuB,IAAI,oBAAoB;IAI/C,qBAAqB,IAAI,kBAAkB;CAG5C"}