@mp-consulting/homebridge-daikin-cloud 1.3.5 → 1.3.7
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.
- package/LICENSE +39 -1
- package/README.md +5 -3
- package/dist/src/accessories/air-conditioning-accessory.d.ts +2 -2
- package/dist/src/accessories/air-conditioning-accessory.d.ts.map +1 -1
- package/dist/src/accessories/air-conditioning-accessory.js.map +1 -1
- package/dist/src/accessories/altherma-accessory.d.ts +2 -2
- package/dist/src/accessories/altherma-accessory.d.ts.map +1 -1
- package/dist/src/accessories/altherma-accessory.js.map +1 -1
- package/dist/src/accessories/base-accessory.d.ts +6 -6
- package/dist/src/accessories/base-accessory.d.ts.map +1 -1
- package/dist/src/accessories/base-accessory.js +15 -15
- package/dist/src/accessories/base-accessory.js.map +1 -1
- package/dist/src/api/daikin-api.d.ts +26 -26
- package/dist/src/api/daikin-api.d.ts.map +1 -1
- package/dist/src/api/daikin-api.js +68 -42
- package/dist/src/api/daikin-api.js.map +1 -1
- package/dist/src/api/daikin-cloud.repository.d.ts.map +1 -1
- package/dist/src/api/daikin-cloud.repository.js +22 -14
- package/dist/src/api/daikin-cloud.repository.js.map +1 -1
- package/dist/src/api/daikin-controller.d.ts +41 -47
- package/dist/src/api/daikin-controller.d.ts.map +1 -1
- package/dist/src/api/daikin-controller.js +40 -64
- package/dist/src/api/daikin-controller.js.map +1 -1
- package/dist/src/api/daikin-device.d.ts +36 -31
- package/dist/src/api/daikin-device.d.ts.map +1 -1
- package/dist/src/api/daikin-device.js +45 -31
- package/dist/src/api/daikin-device.js.map +1 -1
- package/dist/src/api/daikin-mobile-oauth.d.ts +20 -20
- package/dist/src/api/daikin-mobile-oauth.d.ts.map +1 -1
- package/dist/src/api/daikin-mobile-oauth.js +49 -44
- package/dist/src/api/daikin-mobile-oauth.js.map +1 -1
- package/dist/src/api/daikin-oauth.d.ts +32 -32
- package/dist/src/api/daikin-oauth.d.ts.map +1 -1
- package/dist/src/api/daikin-oauth.js +64 -56
- package/dist/src/api/daikin-oauth.js.map +1 -1
- package/dist/src/api/daikin-schemas.d.ts +476 -351
- package/dist/src/api/daikin-schemas.d.ts.map +1 -1
- package/dist/src/api/daikin-schemas.js +11 -42
- package/dist/src/api/daikin-schemas.js.map +1 -1
- package/dist/src/api/daikin-types.d.ts +5 -1
- package/dist/src/api/daikin-types.d.ts.map +1 -1
- package/dist/src/api/daikin-types.js.map +1 -1
- package/dist/src/api/daikin-websocket.d.ts +31 -32
- package/dist/src/api/daikin-websocket.d.ts.map +1 -1
- package/dist/src/api/daikin-websocket.js +55 -35
- package/dist/src/api/daikin-websocket.js.map +1 -1
- package/dist/src/api/index.d.ts +2 -1
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +3 -1
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/api/token-storage.d.ts +21 -0
- package/dist/src/api/token-storage.d.ts.map +1 -0
- package/dist/src/api/token-storage.js +90 -0
- package/dist/src/api/token-storage.js.map +1 -0
- package/dist/src/config/config-manager.d.ts +33 -33
- package/dist/src/config/config-manager.d.ts.map +1 -1
- package/dist/src/config/config-manager.js +33 -33
- package/dist/src/config/config-manager.js.map +1 -1
- package/dist/src/constants/api.constants.d.ts +4 -0
- package/dist/src/constants/api.constants.d.ts.map +1 -1
- package/dist/src/constants/api.constants.js +5 -1
- package/dist/src/constants/api.constants.js.map +1 -1
- package/dist/src/constants/device.constants.d.ts +4 -0
- package/dist/src/constants/device.constants.d.ts.map +1 -1
- package/dist/src/constants/device.constants.js +5 -1
- package/dist/src/constants/device.constants.js.map +1 -1
- package/dist/src/device/accessory-factory.d.ts +10 -10
- package/dist/src/device/accessory-factory.d.ts.map +1 -1
- package/dist/src/device/accessory-factory.js +7 -7
- package/dist/src/device/accessory-factory.js.map +1 -1
- package/dist/src/device/capability-detector.d.ts +8 -8
- package/dist/src/device/capability-detector.d.ts.map +1 -1
- package/dist/src/device/capability-detector.js +6 -6
- package/dist/src/device/capability-detector.js.map +1 -1
- package/dist/src/device/capability-docs.d.ts +1 -9
- package/dist/src/device/capability-docs.d.ts.map +1 -1
- package/dist/src/device/capability-docs.js +19 -73
- package/dist/src/device/capability-docs.js.map +1 -1
- package/dist/src/device/profiles/device-profile.d.ts +1 -1
- package/dist/src/device/profiles/device-profile.d.ts.map +1 -1
- package/dist/src/device/profiles/device-profile.js +4 -4
- package/dist/src/device/profiles/device-profile.js.map +1 -1
- package/dist/src/features/base-feature.d.ts +2 -2
- package/dist/src/features/base-feature.d.ts.map +1 -1
- package/dist/src/features/base-feature.js +2 -3
- package/dist/src/features/base-feature.js.map +1 -1
- package/dist/src/features/feature-manager.d.ts +8 -16
- package/dist/src/features/feature-manager.d.ts.map +1 -1
- package/dist/src/features/feature-manager.js +5 -17
- package/dist/src/features/feature-manager.js.map +1 -1
- package/dist/src/features/modes/dry-operation-mode.feature.d.ts +1 -1
- package/dist/src/features/modes/dry-operation-mode.feature.d.ts.map +1 -1
- package/dist/src/features/modes/dry-operation-mode.feature.js.map +1 -1
- package/dist/src/features/modes/econo-mode.feature.d.ts +1 -1
- package/dist/src/features/modes/econo-mode.feature.d.ts.map +1 -1
- package/dist/src/features/modes/econo-mode.feature.js.map +1 -1
- package/dist/src/features/modes/fan-only-operation-mode.feature.d.ts +1 -1
- package/dist/src/features/modes/fan-only-operation-mode.feature.d.ts.map +1 -1
- package/dist/src/features/modes/fan-only-operation-mode.feature.js.map +1 -1
- package/dist/src/features/modes/indoor-silent-mode.feature.d.ts +1 -1
- package/dist/src/features/modes/indoor-silent-mode.feature.d.ts.map +1 -1
- package/dist/src/features/modes/indoor-silent-mode.feature.js.map +1 -1
- package/dist/src/features/modes/outdoor-silent-mode.feature.d.ts +1 -1
- package/dist/src/features/modes/outdoor-silent-mode.feature.d.ts.map +1 -1
- package/dist/src/features/modes/outdoor-silent-mode.feature.js.map +1 -1
- package/dist/src/features/modes/powerful-mode.feature.d.ts +1 -1
- package/dist/src/features/modes/powerful-mode.feature.d.ts.map +1 -1
- package/dist/src/features/modes/powerful-mode.feature.js.map +1 -1
- package/dist/src/features/modes/streamer-mode.feature.d.ts +1 -1
- package/dist/src/features/modes/streamer-mode.feature.d.ts.map +1 -1
- package/dist/src/features/modes/streamer-mode.feature.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/platform.d.ts +11 -8
- package/dist/src/platform.d.ts.map +1 -1
- package/dist/src/platform.js +64 -15
- package/dist/src/platform.js.map +1 -1
- package/dist/src/services/climate-control.service.d.ts +8 -2
- package/dist/src/services/climate-control.service.d.ts.map +1 -1
- package/dist/src/services/climate-control.service.js +59 -58
- package/dist/src/services/climate-control.service.js.map +1 -1
- package/dist/src/services/hot-water-tank.service.d.ts +6 -2
- package/dist/src/services/hot-water-tank.service.d.ts.map +1 -1
- package/dist/src/services/hot-water-tank.service.js +33 -31
- package/dist/src/services/hot-water-tank.service.js.map +1 -1
- package/dist/src/types/daikin-enums.js +12 -12
- package/dist/src/types/daikin-enums.js.map +1 -1
- package/dist/src/types/device-capabilities.d.ts +1 -1
- package/dist/src/types/device-capabilities.d.ts.map +1 -1
- package/dist/src/utils/log-context.d.ts +23 -23
- package/dist/src/utils/log-context.d.ts.map +1 -1
- package/dist/src/utils/log-context.js +28 -28
- package/dist/src/utils/log-context.js.map +1 -1
- package/dist/src/utils/strings.d.ts.map +1 -1
- package/dist/src/utils/strings.js.map +1 -1
- package/dist/src/utils/update-mapper.d.ts +16 -16
- package/dist/src/utils/update-mapper.d.ts.map +1 -1
- package/dist/src/utils/update-mapper.js +14 -14
- package/dist/src/utils/update-mapper.js.map +1 -1
- package/homebridge-ui/public/index.html +2 -2
- package/homebridge-ui/public/script.js +957 -898
- package/homebridge-ui/server.js +746 -678
- package/package.json +29 -27
- package/.claude/settings.json +0 -3
- package/.claude/settings.local.json +0 -29
- package/CHANGELOG.md +0 -103
- package/CLAUDE.md +0 -269
- package/config.md +0 -2
- package/dist/src/api/daikin-device-tracker.d.ts +0 -97
- package/dist/src/api/daikin-device-tracker.d.ts.map +0 -1
- package/dist/src/api/daikin-device-tracker.js +0 -136
- package/dist/src/api/daikin-device-tracker.js.map +0 -1
- package/dist/src/api/http-interceptor.d.ts +0 -99
- package/dist/src/api/http-interceptor.d.ts.map +0 -1
- package/dist/src/api/http-interceptor.js +0 -177
- package/dist/src/api/http-interceptor.js.map +0 -1
- package/dist/src/di/service-container.d.ts +0 -92
- package/dist/src/di/service-container.d.ts.map +0 -1
- package/dist/src/di/service-container.js +0 -156
- package/dist/src/di/service-container.js.map +0 -1
- package/dist/src/features/feature-registry.d.ts +0 -100
- package/dist/src/features/feature-registry.d.ts.map +0 -1
- package/dist/src/features/feature-registry.js +0 -142
- package/dist/src/features/feature-registry.js.map +0 -1
- package/dist/src/services/service-factory.d.ts +0 -46
- package/dist/src/services/service-factory.d.ts.map +0 -1
- package/dist/src/services/service-factory.js +0 -72
- package/dist/src/services/service-factory.js.map +0 -1
- package/dist/src/utils/error-handler.d.ts +0 -101
- package/dist/src/utils/error-handler.d.ts.map +0 -1
- package/dist/src/utils/error-handler.js +0 -251
- package/dist/src/utils/error-handler.js.map +0 -1
- package/dist/src/utils/retry.d.ts +0 -42
- package/dist/src/utils/retry.d.ts.map +0 -1
- package/dist/src/utils/retry.js +0 -70
- package/dist/src/utils/retry.js.map +0 -1
- package/docs/ARCHITECTURE.md +0 -645
- package/docs/IMPLEMENTATION_GUIDE.md +0 -899
- package/docs/IMPROVEMENTS_SUMMARY.md +0 -415
- package/docs/NEXT_STEPS.md +0 -368
- package/docs/Screenshot 2024-07-04 at 18.41.28.png +0 -0
- package/docs/TROUBLESHOOTING.md +0 -475
- package/docs/api-response-for-BRP069A8x.json +0 -520
- package/docs/api-response-for-BRP069C4x-2.json +0 -881
- package/docs/api-response-for-BRP069C4x.json +0 -916
- package/docs/api-response-for-altherma.json +0 -759
- package/docs/api-response-for-altherma2.json +0 -2735
- package/docs/api-response-with-multiple-devices-incl-heatpump.json +0 -2544
- package/docs/cr-insance-altherma-id-0.json +0 -834
- package/docs/mock-air-to-air-dx23.json +0 -759
- package/docs/mock-air-to-air-dx4.json +0 -1134
- package/docs/mock-airpurifier-with-humidifier.json +0 -732
- package/docs/mock-airpurifier.json +0 -450
- package/docs/mock-altherma-air-to-water-lan.json +0 -845
- package/docs/mock-altherma-air-to-water-wlan.json +0 -845
- package/docs/mock-d2cnd-gas-boiler.json +0 -649
- package/docs/setpointmode-vs-controlmode-vs-setpoints-vs-sensorydata.txt +0 -6
- package/images/fan-speed.jpeg +0 -0
- package/images/homekit-controls.jpeg +0 -0
- package/images/homekit-settings.jpeg +0 -0
- package/images/swing-mode.png +0 -0
- package/jest.config.ts +0 -13
- package/test/fixtures/altherma-crSense-2.ts +0 -834
- package/test/fixtures/altherma-fraction.ts +0 -718
- package/test/fixtures/altherma-heat-pump-2.ts +0 -479
- package/test/fixtures/altherma-heat-pump.ts +0 -757
- package/test/fixtures/altherma-miladcerkic-off.ts +0 -524
- package/test/fixtures/altherma-miladcerkic.ts +0 -524
- package/test/fixtures/altherma-v1ckoeln.ts +0 -644
- package/test/fixtures/altherma-with-embedded-id-zero.ts +0 -834
- package/test/fixtures/dx23-airco-2.ts +0 -343
- package/test/fixtures/dx23-airco.ts +0 -518
- package/test/fixtures/dx4-airco.ts +0 -914
- package/test/fixtures/unknown-jan.ts +0 -488
- package/test/fixtures/unknown-kitchen-guests.ts +0 -488
- package/test/helpers/test-isolation.ts +0 -228
- package/test/integration/air-conditioning.test.ts +0 -410
- package/test/integration/altherma.test.ts +0 -289
- package/test/integration/platform.test.ts +0 -118
- package/test/mocks/index.ts +0 -27
- package/test/test-gigya-auth.js +0 -443
- package/test/test-mobile-oauth.js +0 -175
- package/test/test-websocket-mobile.js +0 -123
- package/test/test-websocket.js +0 -116
- package/test/unit/api/__snapshots__/daikinCloud.test.ts.snap +0 -1320
- package/test/unit/api/daikin-api.test.ts +0 -384
- package/test/unit/api/daikin-oauth.test.ts +0 -214
- package/test/unit/api/daikinCloud.test.ts +0 -12
- package/test/unit/config/config-manager.test.ts +0 -271
- package/test/unit/device/daikin-device.test.ts +0 -79
- package/test/unit/services/hot-water-tank.service.test.ts +0 -123
- package/test/unit/utils/error-handler.test.ts +0 -274
- package/test/unit/utils/log-context.test.ts +0 -271
package/LICENSE
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
Copyright 2022 Jeroen Van den Berghe
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
|
14
|
+
|
|
1
15
|
Apache License
|
|
2
16
|
Version 2.0, January 2004
|
|
3
17
|
http://www.apache.org/licenses/
|
|
@@ -173,4 +187,28 @@
|
|
|
173
187
|
incurred by, or claims asserted against, such Contributor by reason
|
|
174
188
|
of your accepting any such warranty or additional liability.
|
|
175
189
|
|
|
176
|
-
END OF TERMS AND CONDITIONS
|
|
190
|
+
END OF TERMS AND CONDITIONS
|
|
191
|
+
|
|
192
|
+
==============================================================================
|
|
193
|
+
|
|
194
|
+
MIT License for Modifications
|
|
195
|
+
|
|
196
|
+
Copyright (c) 2025 Mickael Palma / MP Consulting
|
|
197
|
+
|
|
198
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
199
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
200
|
+
in the Software without restriction, including without limitation the rights
|
|
201
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
202
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
203
|
+
furnished to do so, subject to the following conditions:
|
|
204
|
+
|
|
205
|
+
The above copyright notice and this permission notice shall be included in all
|
|
206
|
+
copies or substantial portions of the Software.
|
|
207
|
+
|
|
208
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
209
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
210
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
211
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
212
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
213
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
214
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
A [Homebridge](https://homebridge.io) plugin that integrates Daikin air conditioning units via the Daikin Cloud (Onecta) API, allowing you to control your devices through Apple HomeKit.
|
|
8
8
|
|
|
9
|
+
> Originally based on [homebridge-daikin-cloud](https://github.com/JeroenVdb/homebridge-daikin-cloud) by [Jeroen Van den Berghe](https://github.com/JeroenVdb), licensed under the Apache License 2.0. This fork has been substantially rewritten by [MP Consulting](https://github.com/mp-consulting).
|
|
10
|
+
|
|
9
11
|
 
|
|
10
12
|
|
|
11
13
|
## Features
|
|
@@ -32,7 +34,7 @@ This plugin supports two authentication methods:
|
|
|
32
34
|
|
|
33
35
|
| Method | API Calls/Day | WebSocket | Setup |
|
|
34
36
|
|--------|--------------|-----------|-------|
|
|
35
|
-
| **Mobile App** |
|
|
37
|
+
| **Mobile App** | 3000 | Yes | Email/password (same as Onecta app) |
|
|
36
38
|
| **Developer Portal** | 200 | No | OAuth with developer credentials |
|
|
37
39
|
|
|
38
40
|
**Recommended**: Mobile App authentication provides more API calls and real-time WebSocket updates.
|
|
@@ -132,7 +134,7 @@ Add the platform to your Homebridge `config.json`:
|
|
|
132
134
|
| Mode | Daily Limit | Recommended Polling |
|
|
133
135
|
|------|-------------|---------------------|
|
|
134
136
|
| Developer Portal | 200 calls/day | 15+ minutes |
|
|
135
|
-
| Mobile App |
|
|
137
|
+
| Mobile App | 3000 calls/day | 1-5 minutes |
|
|
136
138
|
|
|
137
139
|
The plugin manages rate limits by:
|
|
138
140
|
- Polling at configurable intervals
|
|
@@ -237,4 +239,4 @@ For development workflows and coding conventions, see [CLAUDE.md](CLAUDE.md).
|
|
|
237
239
|
|
|
238
240
|
## License
|
|
239
241
|
|
|
240
|
-
[Apache-2.0](LICENSE)
|
|
242
|
+
The original work by [Jeroen Van den Berghe](https://github.com/JeroenVdb) is licensed under the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). Modifications and new code by [MP Consulting](https://github.com/mp-consulting) are licensed under the [MIT License](https://opensource.org/licenses/MIT). See the [LICENSE](LICENSE) file for full details.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PlatformAccessory } from 'homebridge';
|
|
2
|
-
import { DaikinCloudAccessoryContext, DaikinCloudPlatform } from '../platform';
|
|
1
|
+
import type { PlatformAccessory } from 'homebridge';
|
|
2
|
+
import type { DaikinCloudAccessoryContext, DaikinCloudPlatform } from '../platform';
|
|
3
3
|
import { BaseAccessory } from './base-accessory';
|
|
4
4
|
import { ClimateControlService } from '../services';
|
|
5
5
|
export declare class AirConditioningAccessory extends BaseAccessory {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"air-conditioning-accessory.d.ts","sourceRoot":"","sources":["../../../src/accessories/air-conditioning-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"air-conditioning-accessory.d.ts","sourceRoot":"","sources":["../../../src/accessories/air-conditioning-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEpD,qBAAa,wBAAyB,SAAQ,aAAa;IACzD,OAAO,EAAE,qBAAqB,CAAC;gBAG7B,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAE,iBAAiB,CAAC,2BAA2B,CAAC;CAY5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"air-conditioning-accessory.js","sourceRoot":"","sources":["../../../src/accessories/air-conditioning-accessory.ts"],"names":[],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"air-conditioning-accessory.js","sourceRoot":"","sources":["../../../src/accessories/air-conditioning-accessory.ts"],"names":[],"mappings":";;;AAEA,qDAAiD;AACjD,0CAAoD;AAEpD,MAAa,wBAAyB,SAAQ,8BAAa;IACzD,OAAO,CAAwB;IAE/B,YACE,QAA6B,EAC7B,SAAyD;QAEzD,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3B,MAAM,wBAAwB,GAAG,IAAI,CAAC,kCAAkC,CAAC,gBAAgB,CAAC,CAAC;QAE3F,IAAI,wBAAwB,KAAK,IAAI,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,gCAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;QAClG,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;IACjD,CAAC;CACF;AAjBD,4DAiBC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PlatformAccessory } from 'homebridge';
|
|
2
|
-
import { DaikinCloudAccessoryContext, DaikinCloudPlatform } from '../platform';
|
|
1
|
+
import type { PlatformAccessory } from 'homebridge';
|
|
2
|
+
import type { DaikinCloudAccessoryContext, DaikinCloudPlatform } from '../platform';
|
|
3
3
|
import { BaseAccessory } from './base-accessory';
|
|
4
4
|
import { ClimateControlService, HotWaterTankService } from '../services';
|
|
5
5
|
export declare class AlthermaAccessory extends BaseAccessory {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"altherma-accessory.d.ts","sourceRoot":"","sources":["../../../src/accessories/altherma-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"altherma-accessory.d.ts","sourceRoot":"","sources":["../../../src/accessories/altherma-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEzE,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAChC,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;gBAGxC,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAE,iBAAiB,CAAC,2BAA2B,CAAC;CAsB5D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"altherma-accessory.js","sourceRoot":"","sources":["../../../src/accessories/altherma-accessory.ts"],"names":[],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"altherma-accessory.js","sourceRoot":"","sources":["../../../src/accessories/altherma-accessory.ts"],"names":[],"mappings":";;;AAEA,qDAAiD;AACjD,0CAAyE;AAEzE,MAAa,iBAAkB,SAAQ,8BAAa;IACjC,IAAI,CAAS;IAC9B,OAAO,CAAyB;IAChC,mBAAmB,CAAuB;IAE1C,YACE,QAA6B,EAC7B,SAAyD;QAEzD,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAE3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;QAEvC,MAAM,wBAAwB,GAAG,IAAI,CAAC,kCAAkC,CAAC,gBAAgB,CAAC,CAAC;QAC3F,MAAM,8BAA8B,GAAG,IAAI,CAAC,kCAAkC,CAAC,sBAAsB,CAAC,CAAC;QAEvG,IAAI,wBAAwB,KAAK,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,GAAG,IAAI,gCAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAAC;YAClG,IAAI,CAAC,eAAe,CAAC,wBAAwB,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,6CAA6C,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,8BAA8B,KAAK,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,mBAAmB,GAAG,IAAI,8BAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,CAAC;QACpH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,qDAAqD,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;CACF;AA7BD,8CA6BC"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { PlatformAccessory } from 'homebridge';
|
|
2
|
-
import { DaikinCloudAccessoryContext, DaikinCloudPlatform } from '../platform';
|
|
1
|
+
import type { PlatformAccessory } from 'homebridge';
|
|
2
|
+
import type { DaikinCloudAccessoryContext, DaikinCloudPlatform } from '../platform';
|
|
3
3
|
export declare class BaseAccessory {
|
|
4
4
|
readonly platform: DaikinCloudPlatform;
|
|
5
5
|
readonly accessory: PlatformAccessory<DaikinCloudAccessoryContext>;
|
|
6
6
|
readonly gatewayManagementPointId: string | null;
|
|
7
7
|
constructor(platform: DaikinCloudPlatform, accessory: PlatformAccessory<DaikinCloudAccessoryContext>);
|
|
8
|
-
printDeviceInfo
|
|
8
|
+
private printDeviceInfo;
|
|
9
9
|
/**
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
* Log device capabilities for the given management point.
|
|
11
|
+
* Call this from subclasses after determining the management point ID.
|
|
12
|
+
*/
|
|
13
13
|
protected logCapabilities(managementPointId: string): void;
|
|
14
14
|
getEmbeddedIdByManagementPointType(managementPointType: string): string | null;
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-accessory.d.ts","sourceRoot":"","sources":["../../../src/accessories/base-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"base-accessory.d.ts","sourceRoot":"","sources":["../../../src/accessories/base-accessory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGpF,qBAAa,aAAa;IACxB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,2BAA2B,CAAC,CAAC;IACnE,SAAgB,wBAAwB,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEtD,QAAQ,EAAE,mBAAmB,EAC7B,SAAS,EAAE,iBAAiB,CAAC,2BAA2B,CAAC;IAiC3D,OAAO,CAAC,eAAe;IASvB;;;SAGK;IACL,SAAS,CAAC,eAAe,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI;IAY1D,kCAAkC,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAgB/E"}
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BaseAccessory = void 0;
|
|
4
4
|
const device_1 = require("../device");
|
|
5
|
-
const device_2 = require("../device");
|
|
6
5
|
class BaseAccessory {
|
|
7
6
|
platform;
|
|
8
7
|
accessory;
|
|
@@ -11,7 +10,6 @@ class BaseAccessory {
|
|
|
11
10
|
this.platform = platform;
|
|
12
11
|
this.accessory = accessory;
|
|
13
12
|
this.gatewayManagementPointId = this.getEmbeddedIdByManagementPointType('gateway');
|
|
14
|
-
this.printDeviceInfo();
|
|
15
13
|
const modelInfo = this.gatewayManagementPointId
|
|
16
14
|
? accessory.context.device.getData(this.gatewayManagementPointId, 'modelInfo', undefined).value || 'Unknown'
|
|
17
15
|
: 'Unknown';
|
|
@@ -19,33 +17,36 @@ class BaseAccessory {
|
|
|
19
17
|
? accessory.context.device.getData(this.gatewayManagementPointId, 'serialNumber', undefined)
|
|
20
18
|
: null;
|
|
21
19
|
const serialNumber = serialData ? serialData.value || 'NOT_AVAILABLE' : 'NOT_AVAILABLE';
|
|
20
|
+
this.printDeviceInfo(modelInfo);
|
|
22
21
|
this.accessory.getService(this.platform.Service.AccessoryInformation)
|
|
23
22
|
.setCharacteristic(this.platform.Characteristic.Manufacturer, 'Daikin')
|
|
24
23
|
.setCharacteristic(this.platform.Characteristic.Model, modelInfo)
|
|
25
24
|
.setCharacteristic(this.platform.Characteristic.SerialNumber, serialNumber);
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
const updateListener = () => {
|
|
26
|
+
const name = this.accessory.displayName;
|
|
27
|
+
const uuid = this.accessory.UUID;
|
|
28
|
+
const lastUpdated = this.accessory.context.device.getLastUpdated();
|
|
29
|
+
this.platform.log.debug(`[API Syncing] Updated ${name} (${uuid}), LastUpdated: ${lastUpdated}`);
|
|
30
|
+
};
|
|
31
|
+
this.accessory.context.device.on('updated', updateListener);
|
|
32
|
+
this.platform.registerDeviceListener(this.accessory, updateListener);
|
|
29
33
|
}
|
|
30
|
-
printDeviceInfo() {
|
|
34
|
+
printDeviceInfo(modelInfo) {
|
|
31
35
|
this.platform.log.info('[Platform] Device found with id: ' + this.accessory.UUID);
|
|
32
36
|
this.platform.log.info('[Platform] id: ' + this.accessory.UUID);
|
|
33
37
|
this.platform.log.info('[Platform] name: ' + this.accessory.displayName);
|
|
34
38
|
this.platform.log.info('[Platform] last updated: ' + this.accessory.context.device.getLastUpdated());
|
|
35
|
-
const modelInfo = this.gatewayManagementPointId
|
|
36
|
-
? this.accessory.context.device.getData(this.gatewayManagementPointId, 'modelInfo', undefined).value
|
|
37
|
-
: 'Unknown';
|
|
38
39
|
this.platform.log.info('[Platform] modelInfo: ' + modelInfo);
|
|
39
40
|
this.platform.log.info('[Platform] deviceModel: ' + this.accessory.context.device.getDescription().deviceModel);
|
|
40
41
|
}
|
|
41
42
|
/**
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
* Log device capabilities for the given management point.
|
|
44
|
+
* Call this from subclasses after determining the management point ID.
|
|
45
|
+
*/
|
|
45
46
|
logCapabilities(managementPointId) {
|
|
46
47
|
const detector = new device_1.DeviceCapabilityDetector(this.accessory.context.device, managementPointId);
|
|
47
48
|
const capabilities = detector.getCapabilities();
|
|
48
|
-
const summary = (0,
|
|
49
|
+
const summary = (0, device_1.getCapabilitySummary)(capabilities);
|
|
49
50
|
this.platform.log.info(`[Platform] capabilities: ${summary}`);
|
|
50
51
|
this.platform.log.debug(`[Platform] operation modes: ${capabilities.supportedOperationModes.join(', ')}`);
|
|
51
52
|
}
|
|
@@ -56,8 +57,7 @@ class BaseAccessory {
|
|
|
56
57
|
return null;
|
|
57
58
|
}
|
|
58
59
|
if (managementPoints.length >= 2) {
|
|
59
|
-
this.platform.log.warn(`[Platform] Found more
|
|
60
|
-
return null;
|
|
60
|
+
this.platform.log.warn(`[Platform] Found more than one management point for managementPointType ${managementPointType}, using first one. Please open an issue on https://github.com/mp-consulting/homebridge-daikin-cloud/issues`);
|
|
61
61
|
}
|
|
62
62
|
return managementPoints[0].embeddedId;
|
|
63
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-accessory.js","sourceRoot":"","sources":["../../../src/accessories/base-accessory.ts"],"names":[],"mappings":";;;AAEA,
|
|
1
|
+
{"version":3,"file":"base-accessory.js","sourceRoot":"","sources":["../../../src/accessories/base-accessory.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles REST API calls to the Daikin Cloud.
|
|
5
5
|
*/
|
|
6
|
-
import { RateLimitStatus, GatewayDevice, OAuthProvider } from './daikin-types';
|
|
6
|
+
import type { RateLimitStatus, GatewayDevice, OAuthProvider } from './daikin-types';
|
|
7
7
|
export declare class RateLimitedError extends Error {
|
|
8
8
|
readonly retryAfter: number;
|
|
9
9
|
constructor(message: string, retryAfter: number);
|
|
@@ -17,11 +17,11 @@ export declare class DaikinApi {
|
|
|
17
17
|
private readonly oauth;
|
|
18
18
|
private readonly onRateLimitStatus?;
|
|
19
19
|
private blockedUntil;
|
|
20
|
-
private
|
|
20
|
+
private refreshPromise;
|
|
21
21
|
constructor(oauth: OAuthProvider, onRateLimitStatus?: ((status: RateLimitStatus) => void) | undefined);
|
|
22
22
|
/**
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
* Make a static GET request with access token (for UI)
|
|
24
|
+
*/
|
|
25
25
|
static requestStatic(path: string, accessToken: string): Promise<{
|
|
26
26
|
data: unknown;
|
|
27
27
|
headers: Record<string, string | string[] | undefined>;
|
|
@@ -30,42 +30,42 @@ export declare class DaikinApi {
|
|
|
30
30
|
private static parseHeaderStatic;
|
|
31
31
|
private static makeStaticRequest;
|
|
32
32
|
/**
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
* Get all gateway devices with runtime validation
|
|
34
|
+
*/
|
|
35
35
|
getDevices(): Promise<GatewayDevice[]>;
|
|
36
36
|
/**
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
37
|
+
* Update device data (PATCH request)
|
|
38
|
+
*
|
|
39
|
+
* @param deviceId - The device ID
|
|
40
|
+
* @param embeddedId - The management point embedded ID (e.g., 'climateControl')
|
|
41
|
+
* @param dataPoint - The data point/characteristic name (e.g., 'temperatureControl')
|
|
42
|
+
* @param value - The value to set
|
|
43
|
+
* @param dataPath - Optional path within the data point (e.g., '/operationModes/heating/setpoints/roomTemperature')
|
|
44
|
+
*/
|
|
45
45
|
updateDevice(deviceId: string, embeddedId: string, dataPoint: string, value: unknown, dataPath?: string): Promise<void>;
|
|
46
46
|
/**
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
* Check if we're rate limited
|
|
48
|
+
*/
|
|
49
49
|
isRateLimited(): boolean;
|
|
50
50
|
/**
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
* Get time until rate limit is lifted
|
|
52
|
+
*/
|
|
53
53
|
getRateLimitRetryAfter(): number;
|
|
54
54
|
/**
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
* Calculate delay for exponential backoff with jitter
|
|
56
|
+
*/
|
|
57
57
|
private getRetryDelay;
|
|
58
58
|
/**
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
* Sleep for a specified duration
|
|
60
|
+
*/
|
|
61
61
|
private sleep;
|
|
62
62
|
/**
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
* Get human-readable name for gateway error status codes
|
|
64
|
+
*/
|
|
65
65
|
private getGatewayErrorName;
|
|
66
66
|
/**
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
* Make an authenticated API request
|
|
68
|
+
*/
|
|
69
69
|
private request;
|
|
70
70
|
private parseHeader;
|
|
71
71
|
private makeRequest;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daikin-api.d.ts","sourceRoot":"","sources":["../../../src/api/daikin-api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"daikin-api.d.ts","sourceRoot":"","sources":["../../../src/api/daikin-api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAcpF,qBAAa,gBAAiB,SAAQ,KAAK;aAGnB,UAAU,EAAE,MAAM;gBADtC,OAAO,EAAE,MAAM,EACK,UAAU,EAAE,MAAM;CAKzC;AAED,qBAAa,eAAgB,SAAQ,KAAK;aAGlB,UAAU,EAAE,MAAM;aAClB,YAAY,EAAE,MAAM;gBAFxC,OAAO,EAAE,MAAM,EACK,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM;CAK3C;AAED,qBAAa,SAAS;IAKd,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IALzC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,cAAc,CAA8B;gBAG7B,KAAK,EAAE,aAAa,EACpB,iBAAiB,CAAC,GAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,aAAA;IAO5E;;SAEK;WACQ,aAAa,CACxB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;QAAC,SAAS,EAAE,eAAe,CAAA;KAAE,CAAC;IA6BjH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAShC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAyChC;;SAEK;IACC,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAK5C;;;;;;;;SAQK;IACC,YAAY,CAChB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAOhB;;SAEK;IACL,aAAa,IAAI,OAAO;IAIxB;;SAEK;IACL,sBAAsB,IAAI,MAAM;IAIhC;;SAEK;IACL,OAAO,CAAC,aAAa;IAMrB;;SAEK;IACL,OAAO,CAAC,KAAK;IAIb;;SAEK;IACL,OAAO,CAAC,mBAAmB;IAa3B;;SAEK;YACS,OAAO;IA8GrB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,WAAW;CAgDpB"}
|
|
@@ -20,17 +20,29 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
|
|
|
20
20
|
}) : function(o, v) {
|
|
21
21
|
o["default"] = v;
|
|
22
22
|
});
|
|
23
|
-
var __importStar = (this && this.__importStar) || function (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
};
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
30
40
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
41
|
exports.DaikinApi = exports.ApiTimeoutError = exports.RateLimitedError = void 0;
|
|
32
42
|
const https = __importStar(require("node:https"));
|
|
43
|
+
const zod_1 = require("zod");
|
|
33
44
|
const daikin_types_1 = require("./daikin-types");
|
|
45
|
+
const daikin_schemas_1 = require("./daikin-schemas");
|
|
34
46
|
const constants_1 = require("../constants");
|
|
35
47
|
class RateLimitedError extends Error {
|
|
36
48
|
retryAfter;
|
|
@@ -56,7 +68,7 @@ class DaikinApi {
|
|
|
56
68
|
oauth;
|
|
57
69
|
onRateLimitStatus;
|
|
58
70
|
blockedUntil = 0;
|
|
59
|
-
|
|
71
|
+
refreshPromise = null;
|
|
60
72
|
constructor(oauth, onRateLimitStatus) {
|
|
61
73
|
this.oauth = oauth;
|
|
62
74
|
this.onRateLimitStatus = onRateLimitStatus;
|
|
@@ -65,8 +77,8 @@ class DaikinApi {
|
|
|
65
77
|
// Static utility methods (for use by homebridge-ui)
|
|
66
78
|
// =========================================================================
|
|
67
79
|
/**
|
|
68
|
-
|
|
69
|
-
|
|
80
|
+
* Make a static GET request with access token (for UI)
|
|
81
|
+
*/
|
|
70
82
|
static async requestStatic(path, accessToken) {
|
|
71
83
|
const url = `${daikin_types_1.DAIKIN_OIDC_CONFIG.apiBaseUrl}${path}`;
|
|
72
84
|
const response = await DaikinApi.makeStaticRequest(url, accessToken);
|
|
@@ -92,8 +104,9 @@ class DaikinApi {
|
|
|
92
104
|
};
|
|
93
105
|
}
|
|
94
106
|
static parseHeaderStatic(value) {
|
|
95
|
-
if (!value)
|
|
107
|
+
if (!value) {
|
|
96
108
|
return undefined;
|
|
109
|
+
}
|
|
97
110
|
const str = Array.isArray(value) ? value[0] : value;
|
|
98
111
|
const num = parseInt(str, 10);
|
|
99
112
|
return isNaN(num) ? undefined : num;
|
|
@@ -120,6 +133,9 @@ class DaikinApi {
|
|
|
120
133
|
headers: res.headers,
|
|
121
134
|
}));
|
|
122
135
|
});
|
|
136
|
+
req.setTimeout(constants_1.HTTP_REQUEST_TIMEOUT_MS, () => {
|
|
137
|
+
req.destroy(new Error(`Request timed out after ${constants_1.HTTP_REQUEST_TIMEOUT_MS}ms`));
|
|
138
|
+
});
|
|
123
139
|
req.on('error', reject);
|
|
124
140
|
req.end();
|
|
125
141
|
});
|
|
@@ -128,20 +144,21 @@ class DaikinApi {
|
|
|
128
144
|
// Instance methods
|
|
129
145
|
// =========================================================================
|
|
130
146
|
/**
|
|
131
|
-
|
|
132
|
-
|
|
147
|
+
* Get all gateway devices with runtime validation
|
|
148
|
+
*/
|
|
133
149
|
async getDevices() {
|
|
134
|
-
|
|
150
|
+
const rawDevices = await this.request('/v1/gateway-devices');
|
|
151
|
+
return zod_1.z.array(daikin_schemas_1.GatewayDeviceSchema).parse(rawDevices);
|
|
135
152
|
}
|
|
136
153
|
/**
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
154
|
+
* Update device data (PATCH request)
|
|
155
|
+
*
|
|
156
|
+
* @param deviceId - The device ID
|
|
157
|
+
* @param embeddedId - The management point embedded ID (e.g., 'climateControl')
|
|
158
|
+
* @param dataPoint - The data point/characteristic name (e.g., 'temperatureControl')
|
|
159
|
+
* @param value - The value to set
|
|
160
|
+
* @param dataPath - Optional path within the data point (e.g., '/operationModes/heating/setpoints/roomTemperature')
|
|
161
|
+
*/
|
|
145
162
|
async updateDevice(deviceId, embeddedId, dataPoint, value, dataPath) {
|
|
146
163
|
const urlPath = `/v1/gateway-devices/${deviceId}/management-points/${embeddedId}/characteristics/${dataPoint}`;
|
|
147
164
|
// Include path in body if provided (matches mobile app format)
|
|
@@ -149,34 +166,34 @@ class DaikinApi {
|
|
|
149
166
|
await this.request(urlPath, 'PATCH', body);
|
|
150
167
|
}
|
|
151
168
|
/**
|
|
152
|
-
|
|
153
|
-
|
|
169
|
+
* Check if we're rate limited
|
|
170
|
+
*/
|
|
154
171
|
isRateLimited() {
|
|
155
172
|
return this.blockedUntil > Date.now();
|
|
156
173
|
}
|
|
157
174
|
/**
|
|
158
|
-
|
|
159
|
-
|
|
175
|
+
* Get time until rate limit is lifted
|
|
176
|
+
*/
|
|
160
177
|
getRateLimitRetryAfter() {
|
|
161
178
|
return Math.max(0, Math.ceil((this.blockedUntil - Date.now()) / constants_1.MS_PER_SECOND));
|
|
162
179
|
}
|
|
163
180
|
/**
|
|
164
|
-
|
|
165
|
-
|
|
181
|
+
* Calculate delay for exponential backoff with jitter
|
|
182
|
+
*/
|
|
166
183
|
getRetryDelay(attempt) {
|
|
167
184
|
const exponentialDelay = constants_1.RETRY_BASE_DELAY_MS * Math.pow(2, attempt);
|
|
168
185
|
const jitter = Math.random() * constants_1.RETRY_BASE_DELAY_MS;
|
|
169
186
|
return Math.min(exponentialDelay + jitter, constants_1.RETRY_MAX_DELAY_MS);
|
|
170
187
|
}
|
|
171
188
|
/**
|
|
172
|
-
|
|
173
|
-
|
|
189
|
+
* Sleep for a specified duration
|
|
190
|
+
*/
|
|
174
191
|
sleep(ms) {
|
|
175
192
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
176
193
|
}
|
|
177
194
|
/**
|
|
178
|
-
|
|
179
|
-
|
|
195
|
+
* Get human-readable name for gateway error status codes
|
|
196
|
+
*/
|
|
180
197
|
getGatewayErrorName(statusCode) {
|
|
181
198
|
switch (statusCode) {
|
|
182
199
|
case constants_1.HTTP_STATUS.BAD_GATEWAY:
|
|
@@ -190,8 +207,8 @@ class DaikinApi {
|
|
|
190
207
|
}
|
|
191
208
|
}
|
|
192
209
|
/**
|
|
193
|
-
|
|
194
|
-
|
|
210
|
+
* Make an authenticated API request
|
|
211
|
+
*/
|
|
195
212
|
async request(path, method = 'GET', body, retryCount = 0) {
|
|
196
213
|
// Check rate limit
|
|
197
214
|
if (this.isRateLimited()) {
|
|
@@ -219,22 +236,27 @@ class DaikinApi {
|
|
|
219
236
|
case constants_1.HTTP_STATUS.BAD_REQUEST:
|
|
220
237
|
throw new Error(`Bad Request (${constants_1.HTTP_STATUS.BAD_REQUEST}): ${response.body || 'No response body'}`);
|
|
221
238
|
case constants_1.HTTP_STATUS.UNAUTHORIZED:
|
|
222
|
-
// If we've exhausted retries
|
|
223
|
-
if (retryCount >= constants_1.MAX_RETRY_ATTEMPTS
|
|
239
|
+
// If we've exhausted retries, give up
|
|
240
|
+
if (retryCount >= constants_1.MAX_RETRY_ATTEMPTS) {
|
|
224
241
|
throw new Error(`Unauthorized (${constants_1.HTTP_STATUS.UNAUTHORIZED}): Token expired or invalid`);
|
|
225
242
|
}
|
|
226
|
-
//
|
|
243
|
+
// Deduplicate concurrent refresh requests using a shared promise
|
|
227
244
|
try {
|
|
228
|
-
this.
|
|
229
|
-
|
|
230
|
-
|
|
245
|
+
if (!this.refreshPromise) {
|
|
246
|
+
this.refreshPromise = this.oauth.refreshToken().then(() => {
|
|
247
|
+
this.refreshPromise = null;
|
|
248
|
+
}, (err) => {
|
|
249
|
+
this.refreshPromise = null;
|
|
250
|
+
throw err;
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
await this.refreshPromise;
|
|
231
254
|
// Apply exponential backoff delay before retry
|
|
232
255
|
const delay = this.getRetryDelay(retryCount);
|
|
233
256
|
await this.sleep(delay);
|
|
234
257
|
return this.request(path, method, body, retryCount + 1);
|
|
235
258
|
}
|
|
236
259
|
catch {
|
|
237
|
-
this.isRefreshing = false;
|
|
238
260
|
throw new Error(`Unauthorized (${constants_1.HTTP_STATUS.UNAUTHORIZED}): Token refresh failed. Please re-authenticate.`);
|
|
239
261
|
}
|
|
240
262
|
case constants_1.HTTP_STATUS.NOT_FOUND:
|
|
@@ -267,8 +289,9 @@ class DaikinApi {
|
|
|
267
289
|
}
|
|
268
290
|
}
|
|
269
291
|
parseHeader(value) {
|
|
270
|
-
if (!value)
|
|
292
|
+
if (!value) {
|
|
271
293
|
return undefined;
|
|
294
|
+
}
|
|
272
295
|
const str = Array.isArray(value) ? value[0] : value;
|
|
273
296
|
const num = parseInt(str, 10);
|
|
274
297
|
return isNaN(num) ? undefined : num;
|
|
@@ -300,6 +323,9 @@ class DaikinApi {
|
|
|
300
323
|
headers: res.headers,
|
|
301
324
|
}));
|
|
302
325
|
});
|
|
326
|
+
req.setTimeout(constants_1.HTTP_REQUEST_TIMEOUT_MS, () => {
|
|
327
|
+
req.destroy(new Error(`Request timed out after ${constants_1.HTTP_REQUEST_TIMEOUT_MS}ms`));
|
|
328
|
+
});
|
|
303
329
|
req.on('error', reject);
|
|
304
330
|
if (bodyStr) {
|
|
305
331
|
req.write(bodyStr);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daikin-api.js","sourceRoot":"","sources":["../../../src/api/daikin-api.ts"],"names":[],"mappings":";AAAA;;;;GAIG
|
|
1
|
+
{"version":3,"file":"daikin-api.js","sourceRoot":"","sources":["../../../src/api/daikin-api.ts"],"names":[],"mappings":"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"}
|