@mp-consulting/homebridge-daikin-cloud 1.5.1 → 1.6.0

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 (212) 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/lib/kit.css +1 -1
  201. package/homebridge-ui/public/script.js +95 -32
  202. package/homebridge-ui/public/styles.css +109 -0
  203. package/homebridge-ui/server.js +321 -125
  204. package/package.json +14 -15
  205. package/dist/src/utils/log-context.d.ts +0 -105
  206. package/dist/src/utils/log-context.d.ts.map +0 -1
  207. package/dist/src/utils/log-context.js +0 -206
  208. package/dist/src/utils/log-context.js.map +0 -1
  209. package/dist/src/utils/update-mapper.d.ts +0 -59
  210. package/dist/src/utils/update-mapper.d.ts.map +0 -1
  211. package/dist/src/utils/update-mapper.js +0 -192
  212. package/dist/src/utils/update-mapper.js.map +0 -1
@@ -4,7 +4,7 @@
4
4
  * These enums represent the values used by the Daikin Cloud API.
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.DaikinTemperatureControlSetpoints = exports.DaikinSetpointModes = exports.DaikinControlModes = exports.DaikinOutdoorSilentModes = exports.DaikinStreamerModes = exports.DaikinEconoModes = exports.DaikinPowerfulModes = exports.DaikinFanDirectionVerticalModes = exports.DaikinFanDirectionHorizontalModes = exports.DaikinFanSpeedModes = exports.DaikinOperationModes = exports.DaikinOnOffModes = void 0;
7
+ exports.DaikinTemperatureControlSetpoints = exports.DaikinSetpointModes = exports.DaikinControlModes = exports.DaikinOutdoorSilentModes = exports.DaikinStreamerModes = exports.DaikinEconoModes = exports.DaikinPowerfulModes = exports.DaikinFanDirectionHorizontalModes = exports.DaikinFanSpeedModes = exports.DaikinOperationModes = exports.DaikinOnOffModes = void 0;
8
8
  var DaikinOnOffModes;
9
9
  (function (DaikinOnOffModes) {
10
10
  DaikinOnOffModes["ON"] = "on";
@@ -29,12 +29,6 @@ var DaikinFanDirectionHorizontalModes;
29
29
  DaikinFanDirectionHorizontalModes["STOP"] = "stop";
30
30
  DaikinFanDirectionHorizontalModes["SWING"] = "swing";
31
31
  })(DaikinFanDirectionHorizontalModes || (exports.DaikinFanDirectionHorizontalModes = DaikinFanDirectionHorizontalModes = {}));
32
- var DaikinFanDirectionVerticalModes;
33
- (function (DaikinFanDirectionVerticalModes) {
34
- DaikinFanDirectionVerticalModes["STOP"] = "stop";
35
- DaikinFanDirectionVerticalModes["SWING"] = "swing";
36
- DaikinFanDirectionVerticalModes["WIND_NICE"] = "windNice";
37
- })(DaikinFanDirectionVerticalModes || (exports.DaikinFanDirectionVerticalModes = DaikinFanDirectionVerticalModes = {}));
38
32
  var DaikinPowerfulModes;
39
33
  (function (DaikinPowerfulModes) {
40
34
  DaikinPowerfulModes["ON"] = "on";
@@ -1 +1 @@
1
- {"version":3,"file":"daikin-enums.js","sourceRoot":"","sources":["../../../src/types/daikin-enums.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IACxB,6BAAS,CAAA;IACT,+BAAW,CAAA;AACf,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAED,IAAY,oBAMX;AAND,WAAY,oBAAoB;IAC5B,4CAAoB,CAAA;IACpB,2CAAmB,CAAA;IACnB,2CAAmB,CAAA;IACnB,qCAAa,CAAA;IACb,mCAAW,CAAA;AACf,CAAC,EANW,oBAAoB,oCAApB,oBAAoB,QAM/B;AAED,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC3B,oCAAa,CAAA;IACb,sCAAe,CAAA;IACf,sCAAe,CAAA;AACnB,CAAC,EAJW,mBAAmB,mCAAnB,mBAAmB,QAI9B;AAED,IAAY,iCAGX;AAHD,WAAY,iCAAiC;IACzC,kDAAa,CAAA;IACb,oDAAe,CAAA;AACnB,CAAC,EAHW,iCAAiC,iDAAjC,iCAAiC,QAG5C;AAED,IAAY,+BAIX;AAJD,WAAY,+BAA+B;IACvC,gDAAa,CAAA;IACb,kDAAe,CAAA;IACf,yDAAsB,CAAA;AAC1B,CAAC,EAJW,+BAA+B,+CAA/B,+BAA+B,QAI1C;AAED,IAAY,mBAGX;AAHD,WAAY,mBAAmB;IAC3B,gCAAS,CAAA;IACT,kCAAW,CAAA;AACf,CAAC,EAHW,mBAAmB,mCAAnB,mBAAmB,QAG9B;AAED,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IACxB,6BAAS,CAAA;IACT,+BAAW,CAAA;AACf,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAED,IAAY,mBAGX;AAHD,WAAY,mBAAmB;IAC3B,gCAAS,CAAA;IACT,kCAAW,CAAA;AACf,CAAC,EAHW,mBAAmB,mCAAnB,mBAAmB,QAG9B;AAED,IAAY,wBAGX;AAHD,WAAY,wBAAwB;IAChC,qCAAS,CAAA;IACT,uCAAW,CAAA;AACf,CAAC,EAHW,wBAAwB,wCAAxB,wBAAwB,QAGnC;AAED,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAC1B,0DAAoC,CAAA;IACpC,2EAAqD,CAAA;IACrD,2EAAqD,CAAA;AACzD,CAAC,EAJW,kBAAkB,kCAAlB,kBAAkB,QAI7B;AAED,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC3B,sCAAe,CAAA;IACf,sGAA+E,CAAA;IAC/E,6DAAsC,CAAA;AAC1C,CAAC,EAJW,mBAAmB,mCAAnB,mBAAmB,QAI9B;AAED,IAAY,iCAIX;AAJD,WAAY,iCAAiC;IACzC,yEAAoC,CAAA;IACpC,gFAA2C,CAAA;IAC3C,0FAAqD,CAAA;AACzD,CAAC,EAJW,iCAAiC,iDAAjC,iCAAiC,QAI5C"}
1
+ {"version":3,"file":"daikin-enums.js","sourceRoot":"","sources":["../../../src/types/daikin-enums.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IACxB,6BAAS,CAAA;IACT,+BAAW,CAAA;AACf,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAED,IAAY,oBAMX;AAND,WAAY,oBAAoB;IAC5B,4CAAoB,CAAA;IACpB,2CAAmB,CAAA;IACnB,2CAAmB,CAAA;IACnB,qCAAa,CAAA;IACb,mCAAW,CAAA;AACf,CAAC,EANW,oBAAoB,oCAApB,oBAAoB,QAM/B;AAED,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC3B,oCAAa,CAAA;IACb,sCAAe,CAAA;IACf,sCAAe,CAAA;AACnB,CAAC,EAJW,mBAAmB,mCAAnB,mBAAmB,QAI9B;AAED,IAAY,iCAGX;AAHD,WAAY,iCAAiC;IACzC,kDAAa,CAAA;IACb,oDAAe,CAAA;AACnB,CAAC,EAHW,iCAAiC,iDAAjC,iCAAiC,QAG5C;AAED,IAAY,mBAGX;AAHD,WAAY,mBAAmB;IAC3B,gCAAS,CAAA;IACT,kCAAW,CAAA;AACf,CAAC,EAHW,mBAAmB,mCAAnB,mBAAmB,QAG9B;AAED,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IACxB,6BAAS,CAAA;IACT,+BAAW,CAAA;AACf,CAAC,EAHW,gBAAgB,gCAAhB,gBAAgB,QAG3B;AAED,IAAY,mBAGX;AAHD,WAAY,mBAAmB;IAC3B,gCAAS,CAAA;IACT,kCAAW,CAAA;AACf,CAAC,EAHW,mBAAmB,mCAAnB,mBAAmB,QAG9B;AAED,IAAY,wBAGX;AAHD,WAAY,wBAAwB;IAChC,qCAAS,CAAA;IACT,uCAAW,CAAA;AACf,CAAC,EAHW,wBAAwB,wCAAxB,wBAAwB,QAGnC;AAED,IAAY,kBAIX;AAJD,WAAY,kBAAkB;IAC1B,0DAAoC,CAAA;IACpC,2EAAqD,CAAA;IACrD,2EAAqD,CAAA;AACzD,CAAC,EAJW,kBAAkB,kCAAlB,kBAAkB,QAI7B;AAED,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC3B,sCAAe,CAAA;IACf,sGAA+E,CAAA;IAC/E,6DAAsC,CAAA;AAC1C,CAAC,EAJW,mBAAmB,mCAAnB,mBAAmB,QAI9B;AAED,IAAY,iCAIX;AAJD,WAAY,iCAAiC;IACzC,yEAAoC,CAAA;IACpC,gFAA2C,CAAA;IAC3C,0FAAqD,CAAA;AACzD,CAAC,EAJW,iCAAiC,iDAAjC,iCAAiC,QAI5C"}
@@ -19,6 +19,7 @@ export interface DeviceCapabilities {
19
19
  hasSwingModeVertical: boolean;
20
20
  hasSwingModeHorizontal: boolean;
21
21
  hasFanControl: boolean;
22
+ hasHolidayMode: boolean;
22
23
  supportedOperationModes: DaikinOperationModes[];
23
24
  hasDryOperationMode: boolean;
24
25
  hasFanOnlyOperationMode: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"device-capabilities.d.ts","sourceRoot":"","sources":["../../../src/types/device-capabilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAE/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,uBAAuB,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IAGpB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,sBAAsB,EAAE,OAAO,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;IAGvB,uBAAuB,EAAE,oBAAoB,EAAE,CAAC;IAChD,mBAAmB,EAAE,OAAO,CAAC;IAC7B,uBAAuB,EAAE,OAAO,CAAC;IAGjC,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IAGrB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;CAC7C"}
1
+ {"version":3,"file":"device-capabilities.d.ts","sourceRoot":"","sources":["../../../src/types/device-capabilities.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAE/B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,uBAAuB,EAAE,OAAO,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IAGpB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,sBAAsB,EAAE,OAAO,CAAC;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IAGxB,uBAAuB,EAAE,oBAAoB,EAAE,CAAC;IAChD,mBAAmB,EAAE,OAAO,CAAC;IAC7B,uBAAuB,EAAE,OAAO,CAAC;IAGjC,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IAGrB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,OAAO,CAAC,EAAE,sBAAsB,CAAC;IACjC,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,gBAAgB,CAAC,EAAE,sBAAsB,CAAC;CAC7C"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Error helpers
3
+ */
4
+ /**
5
+ * Extract a human-readable message from an unknown thrown value.
6
+ * `JSON.stringify(new Error('x'))` yields `{}`, so always go through this.
7
+ */
8
+ export declare function toMessage(error: unknown): string;
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;GAGG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAYhD"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ /**
3
+ * Error helpers
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.toMessage = toMessage;
7
+ /**
8
+ * Extract a human-readable message from an unknown thrown value.
9
+ * `JSON.stringify(new Error('x'))` yields `{}`, so always go through this.
10
+ */
11
+ function toMessage(error) {
12
+ if (error instanceof Error) {
13
+ return error.message;
14
+ }
15
+ if (typeof error === 'string') {
16
+ return error;
17
+ }
18
+ try {
19
+ return JSON.stringify(error);
20
+ }
21
+ catch {
22
+ return String(error);
23
+ }
24
+ }
25
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/utils/errors.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAMH,8BAYC;AAhBD;;;GAGG;AACH,SAAgB,SAAS,CAAC,KAAc;IACtC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * HAP write helper
3
+ *
4
+ * Every HomeKit setter that talks to the Daikin cloud follows the same shape:
5
+ * run the write, schedule a (debounced) device refresh so the cache catches up
6
+ * with the cloud, and on failure log a warning and throw
7
+ * HapStatusError(SERVICE_COMMUNICATION_FAILURE) so HomeKit shows "No Response"
8
+ * instead of Homebridge logging "plugin threw an error".
9
+ */
10
+ import type { DaikinCloudPlatform } from '../platform';
11
+ export type HapWritePlatform = Pick<DaikinCloudPlatform, 'log' | 'api' | 'forceUpdateDevices'>;
12
+ export interface HapWriteOptions {
13
+ /** Schedule a device refresh after a successful write (default: true). */
14
+ refresh?: boolean;
15
+ }
16
+ /**
17
+ * Run `op` as a HomeKit-initiated device write.
18
+ *
19
+ * @param label - Prefix for the failure log line, e.g. `[Living room] CoolingThresholdTemperature`.
20
+ */
21
+ export declare function withHapWrite<T>(platform: HapWritePlatform, label: string, op: () => Promise<T>, options?: HapWriteOptions): Promise<T>;
22
+ //# sourceMappingURL=hap-write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hap-write.d.ts","sourceRoot":"","sources":["../../../src/utils/hap-write.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGvD,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,mBAAmB,EAAE,KAAK,GAAG,KAAK,GAAG,oBAAoB,CAAC,CAAC;AAE/F,MAAM,WAAW,eAAe;IAC9B,0EAA0E;IAC1E,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,QAAQ,EAAE,gBAAgB,EAC1B,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,CAAC,CAAC,CAYZ"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ /**
3
+ * HAP write helper
4
+ *
5
+ * Every HomeKit setter that talks to the Daikin cloud follows the same shape:
6
+ * run the write, schedule a (debounced) device refresh so the cache catches up
7
+ * with the cloud, and on failure log a warning and throw
8
+ * HapStatusError(SERVICE_COMMUNICATION_FAILURE) so HomeKit shows "No Response"
9
+ * instead of Homebridge logging "plugin threw an error".
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.withHapWrite = withHapWrite;
13
+ const errors_1 = require("./errors");
14
+ /**
15
+ * Run `op` as a HomeKit-initiated device write.
16
+ *
17
+ * @param label - Prefix for the failure log line, e.g. `[Living room] CoolingThresholdTemperature`.
18
+ */
19
+ async function withHapWrite(platform, label, op, options = {}) {
20
+ let result;
21
+ try {
22
+ result = await op();
23
+ }
24
+ catch (e) {
25
+ platform.log.warn(`${label}: write failed: ${(0, errors_1.toMessage)(e)}`);
26
+ throw new platform.api.hap.HapStatusError(-70402 /* platform.api.hap.HAPStatus.SERVICE_COMMUNICATION_FAILURE */);
27
+ }
28
+ if (options.refresh !== false) {
29
+ platform.forceUpdateDevices();
30
+ }
31
+ return result;
32
+ }
33
+ //# sourceMappingURL=hap-write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hap-write.js","sourceRoot":"","sources":["../../../src/utils/hap-write.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAiBH,oCAiBC;AA/BD,qCAAqC;AASrC;;;;GAIG;AACI,KAAK,UAAU,YAAY,CAChC,QAA0B,EAC1B,KAAa,EACb,EAAoB,EACpB,UAA2B,EAAE;IAE7B,IAAI,MAAS,CAAC;IACd,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,EAAE,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,mBAAmB,IAAA,kBAAS,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC7D,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,uEAA0D,CAAC;IACtG,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC9B,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IAChC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Resolve after `ms` milliseconds.
3
+ */
4
+ export declare function sleep(ms: number): Promise<void>;
5
+ //# sourceMappingURL=sleep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../../src/utils/sleep.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sleep = sleep;
4
+ /**
5
+ * Resolve after `ms` milliseconds.
6
+ */
7
+ function sleep(ms) {
8
+ return new Promise(resolve => setTimeout(resolve, ms));
9
+ }
10
+ //# sourceMappingURL=sleep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sleep.js","sourceRoot":"","sources":["../../../src/utils/sleep.ts"],"names":[],"mappings":";;AAGA,sBAEC;AALD;;GAEG;AACH,SAAgB,KAAK,CAAC,EAAU;IAC9B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -14,6 +14,7 @@ Custom UI for the Daikin Cloud plugin, providing an integrated authentication ex
14
14
 
15
15
  - `server.js` - Server-side handlers for OAuth flow and API communication
16
16
  - `public/index.html` - Custom UI with authentication wizard
17
+ - `public/script.js` - Client-side logic for the custom UI
17
18
 
18
19
  ## How It Works
19
20
 
@@ -28,8 +29,30 @@ Custom UI for the Daikin Cloud plugin, providing an integrated authentication ex
28
29
  | Endpoint | Description |
29
30
  |----------|-------------|
30
31
  | `/auth/status` | Get current authentication status |
31
- | `/auth/start` | Start OAuth authorization flow |
32
- | `/auth/callback` | Handle OAuth callback with auth code |
32
+ | `/auth/start` | Start the OAuth authorization flow and the HTTPS callback server |
33
+ | `/auth/` | Complete the flow manually from a pasted callback URL (code and `state` required) |
34
+ | `/auth/poll` | Poll for the result captured by the callback server |
35
+ | `/auth/stop-server` | Cancel the flow and stop the callback server |
36
+ | `/auth/mobile-test` | Test and store Mobile App (Onecta) credentials |
33
37
  | `/auth/revoke` | Revoke current authentication |
34
38
  | `/auth/test` | Test API connection |
35
39
  | `/config/validate` | Validate configuration |
40
+ | `/devices/list` | List devices (cached for 5 minutes per auth mode; pass `refresh: true` to bypass) |
41
+ | `/api/rate-limit` | Last rate limit status recorded by the running plugin (no API call) |
42
+ | `/server/info` | Host IP addresses, used to prefill the callback address |
43
+
44
+ ## Security Notes
45
+
46
+ - The callback server binds to `oidcCallbackServerBindAddr` (an IPv4/IPv6 literal, default `0.0.0.0`).
47
+ A loopback bind address is refused when the callback address is not loopback, because the
48
+ browser redirect could never reach it.
49
+ - The callback server stops automatically when the 10-minute authorization window expires.
50
+ - Callback requests are only honoured when their `state` matches the pending authorization; the
51
+ callback page is served with a restrictive Content-Security-Policy and escaped content.
52
+
53
+ ## API Quota
54
+
55
+ The Daikin API has a daily quota (200 requests for the Developer Portal). The UI shares one
56
+ `/devices/list` request between the Devices and Settings tabs, the server caches that result for
57
+ 5 minutes (cleared on any authentication change), and the rate limit check reads the status file
58
+ the plugin writes (`.daikin-rate-limit.json` in the Homebridge storage path) instead of calling the API.
@@ -24,7 +24,7 @@
24
24
  <div class="mp-header-title">Daikin Cloud</div>
25
25
  <div class="mp-header-subtitle">Onecta integration for HomeKit</div>
26
26
  </div>
27
- <div class="ms-auto d-flex align-items-center gap-2">
27
+ <div class="header-status ms-auto d-flex align-items-center gap-2">
28
28
  <span class="text-muted small" id="header-info">
29
29
  <span id="token-expires-label" class="d-none">Expires in: </span>
30
30
  <span id="token-expires" class="fw-medium"></span>
@@ -37,7 +37,7 @@
37
37
  </div>
38
38
 
39
39
  <!-- Tab Navigation -->
40
- <ul class="nav nav-pills mb-3" role="tablist">
40
+ <ul class="nav nav-pills app-tabs mb-3" role="tablist">
41
41
  <li class="nav-item" role="presentation">
42
42
  <button class="nav-link active" data-tab="devices" onclick="switchTab('devices')">
43
43
  Devices
@@ -91,7 +91,7 @@
91
91
  </div>
92
92
 
93
93
  <!-- Settings Sub-tabs -->
94
- <ul class="nav nav-tabs nav-fill mb-3">
94
+ <ul class="nav nav-tabs nav-fill app-tabs mb-3">
95
95
  <li class="nav-item">
96
96
  <button class="nav-link active" data-subtab="features" onclick="switchSettingsSubtab('features')">Features</button>
97
97
  </li>
@@ -113,7 +113,7 @@
113
113
  <div class="card-body">
114
114
  <p class="text-muted small mb-3">Enable switches for additional modes in HomeKit</p>
115
115
  <div class="list-group list-group-flush">
116
- <div class="list-group-item d-flex justify-content-between align-items-center">
116
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
117
117
  <div>
118
118
  <div class="fw-medium">Powerful Mode</div>
119
119
  <small class="text-muted">Boost heating/cooling performance</small>
@@ -122,7 +122,7 @@
122
122
  <input class="form-check-input" type="checkbox" role="switch" id="showPowerfulMode">
123
123
  </div>
124
124
  </div>
125
- <div class="list-group-item d-flex justify-content-between align-items-center">
125
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
126
126
  <div>
127
127
  <div class="fw-medium">Econo Mode</div>
128
128
  <small class="text-muted">Energy-saving operation</small>
@@ -131,7 +131,7 @@
131
131
  <input class="form-check-input" type="checkbox" role="switch" id="showEconoMode">
132
132
  </div>
133
133
  </div>
134
- <div class="list-group-item d-flex justify-content-between align-items-center">
134
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
135
135
  <div>
136
136
  <div class="fw-medium">Streamer Mode</div>
137
137
  <small class="text-muted">Air purification</small>
@@ -140,7 +140,7 @@
140
140
  <input class="form-check-input" type="checkbox" role="switch" id="showStreamerMode">
141
141
  </div>
142
142
  </div>
143
- <div class="list-group-item d-flex justify-content-between align-items-center">
143
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
144
144
  <div>
145
145
  <div class="fw-medium">Outdoor Silent Mode</div>
146
146
  <small class="text-muted">Reduce outdoor unit noise</small>
@@ -149,7 +149,7 @@
149
149
  <input class="form-check-input" type="checkbox" role="switch" id="showOutdoorSilentMode">
150
150
  </div>
151
151
  </div>
152
- <div class="list-group-item d-flex justify-content-between align-items-center">
152
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
153
153
  <div>
154
154
  <div class="fw-medium">Indoor Silent Mode</div>
155
155
  <small class="text-muted">Quiet fan operation</small>
@@ -158,7 +158,7 @@
158
158
  <input class="form-check-input" type="checkbox" role="switch" id="showIndoorSilentMode">
159
159
  </div>
160
160
  </div>
161
- <div class="list-group-item d-flex justify-content-between align-items-center">
161
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
162
162
  <div>
163
163
  <div class="fw-medium">Auto Fan Mode</div>
164
164
  <small class="text-muted">Automatic fan speed (switch)</small>
@@ -167,7 +167,7 @@
167
167
  <input class="form-check-input" type="checkbox" role="switch" id="showAutoFanMode">
168
168
  </div>
169
169
  </div>
170
- <div class="list-group-item d-flex justify-content-between align-items-center">
170
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
171
171
  <div>
172
172
  <div class="fw-medium">Oscillation Switch</div>
173
173
  <small class="text-muted">Swing as a separate switch (stays visible when grouped into a single tile)</small>
@@ -176,7 +176,7 @@
176
176
  <input class="form-check-input" type="checkbox" role="switch" id="showOscillationSwitch">
177
177
  </div>
178
178
  </div>
179
- <div class="list-group-item d-flex justify-content-between align-items-center">
179
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
180
180
  <div>
181
181
  <div class="fw-medium">Separate Fan Tile</div>
182
182
  <small class="text-muted">Fan speed + oscillation as a standalone Fan tile (stays visible when grouped into a single tile)</small>
@@ -185,7 +185,7 @@
185
185
  <input class="form-check-input" type="checkbox" role="switch" id="showSeparateFanControl">
186
186
  </div>
187
187
  </div>
188
- <div class="list-group-item d-flex justify-content-between align-items-center">
188
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
189
189
  <div>
190
190
  <div class="fw-medium">Dry Mode</div>
191
191
  <small class="text-muted">Dehumidification</small>
@@ -194,7 +194,7 @@
194
194
  <input class="form-check-input" type="checkbox" role="switch" id="showDryMode">
195
195
  </div>
196
196
  </div>
197
- <div class="list-group-item d-flex justify-content-between align-items-center">
197
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
198
198
  <div>
199
199
  <div class="fw-medium">Fan Only Mode</div>
200
200
  <small class="text-muted">Fan without heating/cooling</small>
@@ -203,7 +203,7 @@
203
203
  <input class="form-check-input" type="checkbox" role="switch" id="showFanOnlyMode">
204
204
  </div>
205
205
  </div>
206
- <div class="list-group-item d-flex justify-content-between align-items-center">
206
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
207
207
  <div>
208
208
  <div class="fw-medium">Holiday Mode</div>
209
209
  <small class="text-muted">Holiday / away mode as a switch</small>
@@ -212,7 +212,7 @@
212
212
  <input class="form-check-input" type="checkbox" role="switch" id="showHolidayMode">
213
213
  </div>
214
214
  </div>
215
- <div class="list-group-item d-flex justify-content-between align-items-center">
215
+ <div class="list-group-item d-flex justify-content-between align-items-center gap-3">
216
216
  <div>
217
217
  <div class="fw-medium">Firmware Update</div>
218
218
  <small class="text-muted">Install staged gateway firmware updates from HomeKit. Never enabled implicitly &mdash; the unit is unavailable while it updates</small>
@@ -265,7 +265,7 @@
265
265
  <label class="form-label" for="oidcCallbackServerBindAddr">OIDC Callback Bind Address</label>
266
266
  <input type="text" class="form-control" id="oidcCallbackServerBindAddr" placeholder="0.0.0.0" value="0.0.0.0"
267
267
  pattern="^((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}$">
268
- <div class="form-text">IPv4 address for OAuth callback server (use 0.0.0.0 for all interfaces)</div>
268
+ <div class="form-text">IPv4 address for OAuth callback server (use 0.0.0.0 for all interfaces). 127.0.0.1 only accepts connections from this host, so the login redirect cannot reach it.</div>
269
269
  </div>
270
270
  <div class="mt-3 mb-0">
271
271
  <label class="form-label" for="httpTransport">HTTP Transport</label>
@@ -317,7 +317,7 @@
317
317
  <!-- Auth Status -->
318
318
  <div class="card mb-3" id="auth-status-card">
319
319
  <div class="card-body">
320
- <div class="row mb-3">
320
+ <div class="row g-3 mb-3">
321
321
  <div class="col-auto">
322
322
  <div class="text-muted small text-uppercase">Status</div>
323
323
  <div class="fw-semibold" id="auth-status">Loading...</div>
@@ -534,6 +534,8 @@
534
534
  <div class="card-body">
535
535
  <div id="rate-limit-display" class="fw-semibold mb-1">200 requests/day</div>
536
536
  <div class="text-muted small" id="rate-limit-info">The Daikin API limits you to 200 requests per day.</div>
537
+ <div class="text-muted small d-none" id="rate-limit-updated"></div>
538
+ <div class="text-muted small mt-1">Check shows the quota reported on the plugin's most recent API call; it does not use an API request itself.</div>
537
539
  </div>
538
540
  </div>
539
541
 
@@ -1,4 +1,4 @@
1
- /* @mp-consulting/homebridge-ui-kit v1.0.0 */
1
+ /* @mp-consulting/homebridge-ui-kit v1.0.1 */
2
2
 
3
3
  /* ── Design tokens ──────────────────────────────────────────────────────────
4
4
  CSS custom properties used throughout the design system.