@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
@@ -2,263 +2,326 @@
2
2
  /**
3
3
  * Configuration Manager
4
4
  *
5
- * Centralizes configuration management with validation,
6
- * defaults, and type-safe access to config values.
5
+ * Single source of truth for the plugin configuration: the raw Homebridge
6
+ * platform config is normalized once (type coercion, schema bounds, defaults)
7
+ * and every consumer reads it through the typed getters below.
7
8
  */
8
9
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.ConfigManager = void 0;
10
- const daikin_schemas_1 = require("../api/daikin-schemas");
10
+ exports.ConfigManager = exports.FEATURE_CONFIG_KEYS = void 0;
11
+ exports.validateConfig = validateConfig;
11
12
  const constants_1 = require("../constants");
12
- class ConfigManager {
13
- config;
14
- normalized = null;
15
- constructor(config) {
16
- this.config = config;
13
+ const strings_1 = require("../utils/strings");
14
+ /**
15
+ * Per-feature config toggles (the `show*` keys of config.schema.json).
16
+ *
17
+ * - `extra`: switches that follow the legacy `showExtraFeatures` catch-all when
18
+ * their own key is not set.
19
+ * - `standalone`: default off and never follow `showExtraFeatures` (a separate
20
+ * Fan tile, and a switch that installs firmware).
21
+ *
22
+ * Kept in sync with config.schema.json and homebridge-ui/public/script.js by
23
+ * test/unit/config/feature-config-keys.test.ts.
24
+ */
25
+ exports.FEATURE_CONFIG_KEYS = {
26
+ extra: [
27
+ 'showPowerfulMode',
28
+ 'showEconoMode',
29
+ 'showStreamerMode',
30
+ 'showOutdoorSilentMode',
31
+ 'showIndoorSilentMode',
32
+ 'showAutoFanMode',
33
+ 'showOscillationSwitch',
34
+ 'showDryMode',
35
+ 'showFanOnlyMode',
36
+ 'showHolidayMode',
37
+ ],
38
+ standalone: [
39
+ 'showSeparateFanControl',
40
+ 'showFirmwareUpdateSwitch',
41
+ ],
42
+ };
43
+ /** Schema bounds (config.schema.json) the numeric settings are clamped to */
44
+ const UPDATE_INTERVAL_MINUTES_MIN = 1;
45
+ const UPDATE_INTERVAL_MINUTES_MAX = 60;
46
+ const FORCE_UPDATE_DELAY_MS_MIN = 5 * constants_1.ONE_SECOND_MS;
47
+ const FORCE_UPDATE_DELAY_MS_MAX = 300 * constants_1.ONE_SECOND_MS;
48
+ const PORT_MIN = 1;
49
+ const PORT_MAX = 65535;
50
+ const PRIVILEGED_PORT_MAX = 1023;
51
+ const DEVELOPER_PORTAL_RECOMMENDED_INTERVAL_MINUTES = 15;
52
+ /** Number from a number or numeric string; NaN for anything else (including '' and null). */
53
+ function toNumber(value) {
54
+ if (typeof value === 'number') {
55
+ return value;
17
56
  }
18
- /**
19
- * Get the normalized configuration with defaults applied
20
- */
21
- getNormalized() {
22
- if (!this.normalized) {
23
- this.normalized = this.normalize();
24
- }
25
- return this.normalized;
57
+ if (typeof value === 'string' && value.trim() !== '') {
58
+ return Number(value);
26
59
  }
27
- /**
28
- * Get authentication mode
29
- */
30
- getAuthMode() {
31
- return this.config.authMode === 'mobile_app' ? 'mobile_app' : 'developer_portal';
60
+ return NaN;
61
+ }
62
+ function isSet(value) {
63
+ return value !== undefined && value !== null && value !== '';
64
+ }
65
+ function nonEmptyString(value) {
66
+ return typeof value === 'string' && value !== '' ? value : undefined;
67
+ }
68
+ function clamp(value, min, max) {
69
+ return Math.min(max, Math.max(min, value));
70
+ }
71
+ function resolveAuthMode(config) {
72
+ return config.authMode === 'mobile_app' ? 'mobile_app' : 'developer_portal';
73
+ }
74
+ /** Parsed port, or undefined when it is not an integer within 1-65535. */
75
+ function parsePort(value) {
76
+ const port = toNumber(value);
77
+ return Number.isInteger(port) && port >= PORT_MIN && port <= PORT_MAX ? port : undefined;
78
+ }
79
+ /** Update interval in minutes: unset/0/non-numeric uses the default, the rest is clamped to the schema bounds. */
80
+ function resolveUpdateIntervalMinutes(value) {
81
+ const minutes = toNumber(value);
82
+ if (!Number.isFinite(minutes) || minutes === 0) {
83
+ return constants_1.DEFAULT_UPDATE_INTERVAL_MINUTES;
32
84
  }
33
- /**
34
- * Check if mobile app mode is enabled
35
- */
36
- isMobileAppMode() {
37
- return this.getAuthMode() === 'mobile_app';
85
+ return clamp(minutes, UPDATE_INTERVAL_MINUTES_MIN, UPDATE_INTERVAL_MINUTES_MAX);
86
+ }
87
+ /** Force update delay in ms: unset/0/non-numeric uses the default, the rest is clamped to the schema bounds. */
88
+ function resolveForceUpdateDelayMs(value) {
89
+ const delay = toNumber(value);
90
+ if (!Number.isFinite(delay) || delay === 0) {
91
+ return constants_1.DEFAULT_FORCE_UPDATE_DELAY_MS;
38
92
  }
39
- /**
40
- * Check if developer portal mode is enabled
41
- */
42
- isDeveloperPortalMode() {
43
- return this.getAuthMode() === 'developer_portal';
93
+ return clamp(delay, FORCE_UPDATE_DELAY_MS_MIN, FORCE_UPDATE_DELAY_MS_MAX);
94
+ }
95
+ /**
96
+ * Feature toggle semantics, defined once:
97
+ * - the per-feature key is a boolean: that value
98
+ * - otherwise (absent, null, anything else): `extra` features follow
99
+ * `showExtraFeatures`, `standalone` features are off
100
+ */
101
+ function resolveFeatures(config) {
102
+ const legacy = config.showExtraFeatures === true;
103
+ const features = {};
104
+ for (const key of exports.FEATURE_CONFIG_KEYS.extra) {
105
+ const value = config[key];
106
+ features[key] = typeof value === 'boolean' ? value : legacy;
44
107
  }
45
- /**
46
- * Get developer portal credentials
47
- */
48
- getDeveloperCredentials() {
49
- const { clientId, clientSecret, callbackServerExternalAddress, callbackServerPort } = this.config;
50
- if (!clientId || !clientSecret || !callbackServerExternalAddress) {
51
- return null;
52
- }
53
- return {
54
- clientId,
55
- clientSecret,
56
- callbackServerExternalAddress,
57
- callbackServerPort: callbackServerPort || 8582,
58
- oidcCallbackServerBindAddr: this.config.oidcCallbackServerBindAddr,
59
- };
108
+ for (const key of exports.FEATURE_CONFIG_KEYS.standalone) {
109
+ features[key] = config[key] === true;
60
110
  }
61
- /**
62
- * Get mobile app credentials
63
- */
64
- getMobileCredentials() {
65
- const email = this.getMobileEmail();
66
- const password = this.getMobilePassword();
67
- if (!email || !password) {
68
- return null;
111
+ return features;
112
+ }
113
+ function normalize(config) {
114
+ const excluded = Array.isArray(config.excludedDevicesByDeviceId) ? config.excludedDevicesByDeviceId : [];
115
+ return {
116
+ name: nonEmptyString(config.name),
117
+ authMode: resolveAuthMode(config),
118
+ httpTransport: config.httpTransport === 'curl' || config.httpTransport === 'node' ? config.httpTransport : undefined,
119
+ clientId: nonEmptyString(config.clientId),
120
+ clientSecret: nonEmptyString(config.clientSecret),
121
+ callbackServerExternalAddress: nonEmptyString(config.callbackServerExternalAddress),
122
+ callbackServerPort: parsePort(config.callbackServerPort) ?? constants_1.DEFAULT_CALLBACK_PORT,
123
+ oidcCallbackServerBindAddr: nonEmptyString(config.oidcCallbackServerBindAddr) ?? constants_1.DEFAULT_CALLBACK_BIND_ADDR,
124
+ email: nonEmptyString(config.daikinEmail) ?? nonEmptyString(config.email),
125
+ password: nonEmptyString(config.daikinPassword) ?? nonEmptyString(config.password),
126
+ updateIntervalMs: resolveUpdateIntervalMinutes(config.updateIntervalInMinutes) * constants_1.ONE_MINUTE_MS,
127
+ forceUpdateDelayMs: resolveForceUpdateDelayMs(config.forceUpdateDelay),
128
+ excludedDeviceIds: new Set(excluded.filter((id) => typeof id === 'string')),
129
+ features: resolveFeatures(config),
130
+ webSocketEnabled: config.enableWebSocket !== false,
131
+ };
132
+ }
133
+ /** Legacy credential keys that are in use because the canonical key is absent */
134
+ function legacyCredentialKeysInUse(config) {
135
+ const keys = [];
136
+ if (!config.daikinEmail && config.email) {
137
+ keys.push('email');
138
+ }
139
+ if (!config.daikinPassword && config.password) {
140
+ keys.push('password');
141
+ }
142
+ return keys;
143
+ }
144
+ /**
145
+ * Validate a raw plugin config. Pure: also used by the custom UI server
146
+ * (homebridge-ui/server.js) for its /config/validate endpoint.
147
+ *
148
+ * Errors are configurations the plugin cannot work with; out-of-range numeric
149
+ * settings are only warnings, because normalization clamps them.
150
+ */
151
+ function validateConfig(config) {
152
+ const errors = [];
153
+ const warnings = [];
154
+ const authMode = resolveAuthMode(config);
155
+ // Validate authentication credentials
156
+ if (authMode === 'developer_portal') {
157
+ if (!config.clientId) {
158
+ errors.push('Client ID is required for Developer Portal mode');
159
+ }
160
+ if (!config.clientSecret) {
161
+ errors.push('Client Secret is required for Developer Portal mode');
162
+ }
163
+ if (!config.callbackServerExternalAddress) {
164
+ errors.push('Callback Server Address is required for Developer Portal mode');
165
+ }
166
+ else if (config.callbackServerExternalAddress === 'localhost' || config.callbackServerExternalAddress === '127.0.0.1') {
167
+ // The Daikin redirect must reach this host from the user's browser
168
+ errors.push('Callback address cannot be localhost. Use your external IP or domain.');
69
169
  }
70
- return { email, password };
71
170
  }
72
- /**
73
- * Mobile app email, falling back to the legacy `email` key
74
- */
75
- getMobileEmail() {
76
- return this.config.daikinEmail || this.config.email;
171
+ else {
172
+ if (!config.daikinEmail && !config.email) {
173
+ errors.push('Email is required for Mobile App mode (config key: "daikinEmail")');
174
+ }
175
+ if (!config.daikinPassword && !config.password) {
176
+ errors.push('Password is required for Mobile App mode (config key: "daikinPassword")');
177
+ }
178
+ const legacyKeys = legacyCredentialKeysInUse(config);
179
+ if (legacyKeys.length > 0) {
180
+ warnings.push(`Using deprecated config key(s) ${legacyKeys.map(k => `"${k}"`).join(' and ')}. `
181
+ + 'Rename to "daikinEmail"/"daikinPassword" — the old names will stop working in a future release.');
182
+ }
77
183
  }
78
- /**
79
- * Mobile app password, falling back to the legacy `password` key
80
- */
81
- getMobilePassword() {
82
- return this.config.daikinPassword || this.config.password;
184
+ // Validate port
185
+ if (isSet(config.callbackServerPort)) {
186
+ const port = parsePort(config.callbackServerPort);
187
+ if (port === undefined) {
188
+ errors.push(`Invalid port number: ${config.callbackServerPort}. Must be between ${PORT_MIN} and ${PORT_MAX}.`);
189
+ }
190
+ else if (port <= PRIVILEGED_PORT_MAX) {
191
+ warnings.push(`Port ${port} is privileged (< 1024) and may require root permissions.`);
192
+ }
83
193
  }
84
- /**
85
- * Legacy credential keys that are in use because the canonical key is absent
86
- */
87
- getLegacyCredentialKeysInUse() {
88
- const keys = [];
89
- if (!this.config.daikinEmail && this.config.email) {
90
- keys.push('email');
194
+ // Validate update interval
195
+ if (isSet(config.updateIntervalInMinutes)) {
196
+ const raw = toNumber(config.updateIntervalInMinutes);
197
+ const minutes = resolveUpdateIntervalMinutes(config.updateIntervalInMinutes);
198
+ if (raw !== minutes) {
199
+ warnings.push(`Update interval must be between ${UPDATE_INTERVAL_MINUTES_MIN} and ${UPDATE_INTERVAL_MINUTES_MAX} minutes, `
200
+ + `got: ${config.updateIntervalInMinutes}. Using ${minutes} minutes.`);
91
201
  }
92
- if (!this.config.daikinPassword && this.config.password) {
93
- keys.push('password');
202
+ else if (authMode === 'developer_portal' && minutes < DEVELOPER_PORTAL_RECOMMENDED_INTERVAL_MINUTES) {
203
+ warnings.push(`Update interval ${minutes}min may exceed Developer Portal rate limit (200 calls/day). Recommended: 15+ minutes.`);
94
204
  }
95
- return keys;
96
205
  }
97
- /**
98
- * Get update interval in milliseconds
99
- */
206
+ // Validate force update delay
207
+ if (isSet(config.forceUpdateDelay)) {
208
+ const raw = toNumber(config.forceUpdateDelay);
209
+ const delay = resolveForceUpdateDelayMs(config.forceUpdateDelay);
210
+ if (raw !== delay) {
211
+ warnings.push(`Force update delay must be between ${FORCE_UPDATE_DELAY_MS_MIN} and ${FORCE_UPDATE_DELAY_MS_MAX} ms, `
212
+ + `got: ${config.forceUpdateDelay}. Using ${delay} ms.`);
213
+ }
214
+ }
215
+ return {
216
+ valid: errors.length === 0,
217
+ errors,
218
+ warnings,
219
+ };
220
+ }
221
+ class ConfigManager {
222
+ config;
223
+ normalized;
224
+ constructor(config) {
225
+ this.config = config;
226
+ this.normalized = normalize(config);
227
+ }
228
+ // ---------------------------------------------------------------------------
229
+ // Platform
230
+ // ---------------------------------------------------------------------------
231
+ /** Platform name as configured in Homebridge */
232
+ getName() {
233
+ return this.normalized.name;
234
+ }
235
+ /** HTTP transport from the config (the DAIKIN_HTTP_TRANSPORT env var still wins, see configureHttpTransport) */
236
+ getHttpTransport() {
237
+ return this.normalized.httpTransport;
238
+ }
239
+ /** Polling interval in milliseconds, clamped to 1-60 minutes */
100
240
  getUpdateIntervalMs() {
101
- const minutes = this.config.updateIntervalInMinutes || constants_1.DEFAULT_UPDATE_INTERVAL_MINUTES;
102
- return constants_1.ONE_MINUTE_MS * minutes;
241
+ return this.normalized.updateIntervalMs;
103
242
  }
104
- /**
105
- * Get force update delay in milliseconds
106
- */
243
+ /** Delay before refreshing after a change, in milliseconds, clamped to 5-300 seconds */
107
244
  getForceUpdateDelayMs() {
108
- return this.config.forceUpdateDelay ?? constants_1.DEFAULT_FORCE_UPDATE_DELAY_MS;
109
- }
110
- /**
111
- * Get excluded device IDs as a Set
112
- */
113
- getExcludedDeviceIds() {
114
- return new Set(this.config.excludedDevicesByDeviceId || []);
245
+ return this.normalized.forceUpdateDelayMs;
115
246
  }
116
- /**
117
- * Check if a device is excluded
118
- */
247
+ /** Whether the device (raw Daikin device ID) is listed in excludedDevicesByDeviceId */
119
248
  isDeviceExcluded(deviceId) {
120
- return this.getExcludedDeviceIds().has(deviceId);
249
+ return this.normalized.excludedDeviceIds.has(deviceId);
121
250
  }
122
- /**
123
- * Get feature configuration
124
- */
125
- getFeatures() {
126
- const legacy = this.config.showExtraFeatures === true;
127
- return {
128
- powerfulMode: this.config.showPowerfulMode ?? legacy,
129
- econoMode: this.config.showEconoMode ?? legacy,
130
- streamerMode: this.config.showStreamerMode ?? legacy,
131
- outdoorSilentMode: this.config.showOutdoorSilentMode ?? legacy,
132
- indoorSilentMode: this.config.showIndoorSilentMode ?? legacy,
133
- autoFanMode: this.config.showAutoFanMode ?? legacy,
134
- oscillationMode: this.config.showOscillationSwitch ?? legacy,
135
- dryMode: this.config.showDryMode ?? legacy,
136
- fanOnlyMode: this.config.showFanOnlyMode ?? legacy,
137
- holidayMode: this.config.showHolidayMode ?? legacy,
138
- };
139
- }
140
- /**
141
- * Check if WebSocket is enabled
142
- */
251
+ /** WebSocket push updates are on unless explicitly disabled */
143
252
  isWebSocketEnabled() {
144
- return this.config.enableWebSocket !== false;
253
+ return this.normalized.webSocketEnabled;
145
254
  }
146
- /**
147
- * Validate configuration using Zod schemas
148
- */
149
- validateWithZod() {
150
- const configData = {
151
- authMode: this.getAuthMode(),
152
- tokenFilePath: '', // This will be set by the controller
153
- clientId: this.config.clientId,
154
- clientSecret: this.config.clientSecret,
155
- callbackServerExternalAddress: this.config.callbackServerExternalAddress,
156
- callbackServerPort: this.config.callbackServerPort,
157
- oidcCallbackServerBindAddr: this.config.oidcCallbackServerBindAddr,
158
- email: this.getMobileEmail(),
159
- password: this.getMobilePassword(),
160
- };
161
- const result = (0, daikin_schemas_1.safeValidateData)(daikin_schemas_1.DaikinControllerConfigSchema, configData);
162
- if (!result.success) {
163
- return {
164
- valid: false,
165
- errors: [result.error],
166
- };
167
- }
168
- return { valid: true, errors: [] };
255
+ // ---------------------------------------------------------------------------
256
+ // Authentication / controller
257
+ // ---------------------------------------------------------------------------
258
+ getAuthMode() {
259
+ return this.normalized.authMode;
169
260
  }
170
- /**
171
- * Validate configuration
172
- */
173
- validate() {
174
- const errors = [];
175
- const warnings = [];
176
- const authMode = this.getAuthMode();
177
- // Validate authentication credentials
178
- if (authMode === 'developer_portal') {
179
- if (!this.config.clientId) {
180
- errors.push('Client ID is required for Developer Portal mode');
181
- }
182
- if (!this.config.clientSecret) {
183
- errors.push('Client Secret is required for Developer Portal mode');
184
- }
185
- if (!this.config.callbackServerExternalAddress) {
186
- errors.push('Callback Server Address is required for Developer Portal mode');
187
- }
188
- // Warn about localhost
189
- if (this.config.callbackServerExternalAddress === 'localhost' ||
190
- this.config.callbackServerExternalAddress === '127.0.0.1') {
191
- errors.push('Callback address cannot be localhost. Use your external IP or domain.');
192
- }
193
- }
194
- else if (authMode === 'mobile_app') {
195
- if (!this.getMobileEmail()) {
196
- errors.push('Email is required for Mobile App mode (config key: "daikinEmail")');
197
- }
198
- if (!this.getMobilePassword()) {
199
- errors.push('Password is required for Mobile App mode (config key: "daikinPassword")');
200
- }
201
- const legacyKeys = this.getLegacyCredentialKeysInUse();
202
- if (legacyKeys.length > 0) {
203
- warnings.push(`Using deprecated config key(s) ${legacyKeys.map(k => `"${k}"`).join(' and ')}. `
204
- + 'Rename to "daikinEmail"/"daikinPassword" — the old names will stop working in a future release.');
205
- }
206
- }
207
- // Validate port
208
- if (this.config.callbackServerPort !== undefined) {
209
- const port = typeof this.config.callbackServerPort === 'string'
210
- ? parseInt(this.config.callbackServerPort, 10)
211
- : this.config.callbackServerPort;
212
- if (isNaN(port) || port < 1 || port > 65535) {
213
- errors.push(`Invalid port number: ${this.config.callbackServerPort}. Must be between 1 and 65535.`);
214
- }
215
- else if (port < 1024) {
216
- warnings.push(`Port ${port} is privileged (< 1024) and may require root permissions.`);
217
- }
218
- }
219
- // Validate update interval
220
- if (this.config.updateIntervalInMinutes !== undefined) {
221
- const interval = this.config.updateIntervalInMinutes;
222
- if (interval < 1 || interval > 60) {
223
- errors.push(`Update interval must be between 1 and 60 minutes, got: ${interval}`);
224
- }
225
- else if (authMode === 'developer_portal' && interval < 15) {
226
- warnings.push(`Update interval ${interval}min may exceed Developer Portal rate limit (200 calls/day). Recommended: 15+ minutes.`);
227
- }
228
- }
229
- // Validate force update delay
230
- if (this.config.forceUpdateDelay !== undefined) {
231
- const delay = this.config.forceUpdateDelay;
232
- const delaySeconds = Math.floor(delay / 1000);
233
- if (delaySeconds < 1 || delaySeconds > 300) {
234
- errors.push(`Force update delay must be between 1 and 300 seconds, got: ${delaySeconds}`);
235
- }
261
+ isMobileAppMode() {
262
+ return this.normalized.authMode === 'mobile_app';
263
+ }
264
+ /** Client ID and secret are present (the minimum to start the Developer Portal controller) */
265
+ hasDeveloperCredentials() {
266
+ return this.normalized.clientId !== undefined && this.normalized.clientSecret !== undefined;
267
+ }
268
+ /** Mobile app email and password (falling back to the legacy keys), or null when either is missing */
269
+ getMobileCredentials() {
270
+ const { email, password } = this.normalized;
271
+ if (!email || !password) {
272
+ return null;
236
273
  }
274
+ return { email, password };
275
+ }
276
+ /** Legacy credential keys that are in use because the canonical key is absent */
277
+ getLegacyCredentialKeysInUse() {
278
+ return legacyCredentialKeysInUse(this.config);
279
+ }
280
+ /** Configuration for the DaikinCloudController, with defaults applied */
281
+ getControllerConfig(tokenFilePath) {
282
+ const n = this.normalized;
237
283
  return {
238
- valid: errors.length === 0,
239
- errors,
240
- warnings,
284
+ authMode: n.authMode,
285
+ tokenFilePath,
286
+ // Developer Portal fields
287
+ clientId: n.clientId,
288
+ clientSecret: n.clientSecret,
289
+ callbackServerExternalAddress: n.callbackServerExternalAddress,
290
+ callbackServerPort: n.callbackServerPort,
291
+ oidcCallbackServerBindAddr: n.oidcCallbackServerBindAddr,
292
+ // Mobile App fields
293
+ email: n.email,
294
+ password: n.password,
241
295
  };
242
296
  }
243
- /**
244
- * Normalize the configuration with all defaults applied
245
- */
246
- normalize() {
297
+ // ---------------------------------------------------------------------------
298
+ // Features
299
+ // ---------------------------------------------------------------------------
300
+ /** Whether a feature switch / service is enabled (see resolveFeatures for the semantics) */
301
+ isFeatureEnabled(key) {
302
+ return this.normalized.features[key];
303
+ }
304
+ // ---------------------------------------------------------------------------
305
+ // Validation / diagnostics
306
+ // ---------------------------------------------------------------------------
307
+ validate() {
308
+ return validateConfig(this.config);
309
+ }
310
+ /** The raw config with credentials and device IDs masked, for debug logging */
311
+ getRedactedConfig() {
312
+ const config = this.config;
247
313
  return {
248
- authMode: this.getAuthMode(),
249
- updateIntervalMs: this.getUpdateIntervalMs(),
250
- forceUpdateDelayMs: this.getForceUpdateDelayMs(),
251
- excludedDeviceIds: this.getExcludedDeviceIds(),
252
- features: this.getFeatures(),
253
- websocketEnabled: this.isWebSocketEnabled(),
314
+ ...config,
315
+ clientId: strings_1.StringUtils.mask(config.clientId),
316
+ clientSecret: strings_1.StringUtils.mask(config.clientSecret),
317
+ daikinEmail: strings_1.StringUtils.mask(config.daikinEmail),
318
+ daikinPassword: config.daikinPassword ? '***' : undefined,
319
+ // Legacy aliases, masked too so they never leak into debug logs
320
+ email: strings_1.StringUtils.mask(config.email),
321
+ password: config.password ? '***' : undefined,
322
+ excludedDevicesByDeviceId: [...this.normalized.excludedDeviceIds].map(deviceId => strings_1.StringUtils.mask(deviceId)),
254
323
  };
255
324
  }
256
- /**
257
- * Get raw config value (escape hatch for migration)
258
- */
259
- getRawConfig() {
260
- return this.config;
261
- }
262
325
  }
263
326
  exports.ConfigManager = ConfigManager;
264
327
  //# sourceMappingURL=config-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../../src/config/config-manager.ts"],"names":[],"mappings":"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"}
@@ -35,4 +35,10 @@ export declare const HTTP_REQUEST_TIMEOUT_MS = 30000;
35
35
  export declare const WRITE_INTER_REQUEST_DELAY_MS = 400;
36
36
  /** Daikin WebSocket URL for real-time updates */
37
37
  export declare const DAIKIN_WEBSOCKET_URL = "wss://wsapi.onecta.daikineurope.com";
38
+ /**
39
+ * File (in the Homebridge storage path) where the plugin records the last
40
+ * rate-limit headers it saw, so the settings UI can show them without
41
+ * spending an API call. Contents: RateLimitStatusFile.
42
+ */
43
+ export declare const RATE_LIMIT_STATUS_FILE = ".daikin-rate-limit.json";
38
44
  //# sourceMappingURL=api.constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.constants.d.ts","sourceRoot":"","sources":["../../../src/constants/api.constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAwB;AACxB,eAAO,MAAM,WAAW;;;;;;;;;;;;CAYd,CAAC;AAEX,4DAA4D;AAC5D,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAElD,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAExC,0CAA0C;AAC1C,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAE7C,6GAA6G;AAC7G,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,wCAAwC,CAAC"}
1
+ {"version":3,"file":"api.constants.d.ts","sourceRoot":"","sources":["../../../src/constants/api.constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAwB;AACxB,eAAO,MAAM,WAAW;;;;;;;;;;;;CAYd,CAAC;AAEX,4DAA4D;AAC5D,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,QAAQ,CAAC;AAElD,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAExC,0CAA0C;AAC1C,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAE7C,6GAA6G;AAC7G,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,wCAAwC,CAAC;AAE1E;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,4BAA4B,CAAC"}