@mp-consulting/homebridge-daikin-cloud 1.0.2 → 1.1.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.
- package/.claude/settings.local.json +3 -1
- package/CHANGELOG.md +37 -0
- package/README.md +49 -10
- package/config.schema.json +75 -15
- package/dist/src/api/daikin-api.d.ts +2 -3
- package/dist/src/api/daikin-api.d.ts.map +1 -1
- package/dist/src/api/daikin-api.js +20 -19
- package/dist/src/api/daikin-api.js.map +1 -1
- package/dist/src/api/daikin-controller.d.ts +49 -5
- package/dist/src/api/daikin-controller.d.ts.map +1 -1
- package/dist/src/api/daikin-controller.js +136 -7
- package/dist/src/api/daikin-controller.js.map +1 -1
- package/dist/src/api/daikin-device.d.ts +6 -1
- package/dist/src/api/daikin-device.d.ts.map +1 -1
- package/dist/src/api/daikin-device.js +43 -0
- package/dist/src/api/daikin-device.js.map +1 -1
- package/dist/src/api/daikin-mobile-oauth.d.ts +62 -0
- package/dist/src/api/daikin-mobile-oauth.d.ts.map +1 -0
- package/dist/src/api/daikin-mobile-oauth.js +409 -0
- package/dist/src/api/daikin-mobile-oauth.js.map +1 -0
- package/dist/src/api/daikin-types.d.ts +49 -1
- package/dist/src/api/daikin-types.d.ts.map +1 -1
- package/dist/src/api/daikin-types.js +14 -2
- package/dist/src/api/daikin-types.js.map +1 -1
- package/dist/src/api/daikin-websocket.d.ts +140 -0
- package/dist/src/api/daikin-websocket.d.ts.map +1 -0
- package/dist/src/api/daikin-websocket.js +261 -0
- package/dist/src/api/daikin-websocket.js.map +1 -0
- package/dist/src/api/index.d.ts +2 -0
- package/dist/src/api/index.d.ts.map +1 -1
- package/dist/src/api/index.js +2 -0
- package/dist/src/api/index.js.map +1 -1
- package/dist/src/constants.d.ts +52 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +73 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/platform.d.ts +6 -0
- package/dist/src/platform.d.ts.map +1 -1
- package/dist/src/platform.js +202 -21
- package/dist/src/platform.js.map +1 -1
- package/dist/src/services/climate-control.service.d.ts.map +1 -1
- package/dist/src/services/climate-control.service.js +7 -5
- package/dist/src/services/climate-control.service.js.map +1 -1
- package/dist/src/services/hot-water-tank.service.d.ts.map +1 -1
- package/dist/src/services/hot-water-tank.service.js +6 -3
- package/dist/src/services/hot-water-tank.service.js.map +1 -1
- package/homebridge-ui/public/index.html +105 -12
- package/homebridge-ui/public/script.js +385 -4
- package/homebridge-ui/public/styles.css +42 -0
- package/homebridge-ui/server.js +170 -18
- package/package.json +4 -2
- package/test/hbConfig/.daikin-mobile-tokenset +8 -0
- package/test/hbConfig/accessories/.cachedAccessories.bak +1 -1
- package/test/hbConfig/accessories/cachedAccessories +1 -1
- package/test/hbConfig/backups/config-backups/config.json.1767965217715 +44 -0
- package/test/hbConfig/backups/config-backups/config.json.1767965419624 +25 -0
- package/test/hbConfig/backups/config-backups/config.json.1767965870934 +32 -0
- package/test/hbConfig/backups/config-backups/config.json.1767977675045 +32 -0
- package/test/hbConfig/backups/config-backups/config.json.1767977677222 +33 -0
- package/test/hbConfig/backups/config-backups/config.json.1767977710226 +33 -0
- package/test/hbConfig/backups/config-backups/config.json.1767977741397 +33 -0
- package/test/hbConfig/backups/config-backups/config.json.1767977977093 +35 -0
- package/test/hbConfig/backups/config-backups/config.json.1767977981773 +35 -0
- package/test/hbConfig/backups/config-backups/config.json.1767977986514 +35 -0
- package/test/hbConfig/backups/config-backups/config.json.1767977991174 +35 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979424487 +35 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979424987 +35 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979432646 +47 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979433150 +47 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979436933 +47 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979437438 +47 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979441676 +47 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979442180 +47 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979466735 +47 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979903636 +47 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979904135 +47 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979906606 +47 -0
- package/test/hbConfig/backups/config-backups/config.json.1767979907108 +47 -0
- package/test/hbConfig/config.json +6 -3
- package/test/hbConfig/persist/AccessoryInfo.1E4A432551BA.json +1 -1
- package/test/hbConfig/tmp/daikin_request/api.onecta.daikineurope.com_01-09-2026-16-09-04/request_12214 +1 -0
- package/test/hbConfig/tmp/daikin_request/api.onecta.daikineurope.com_01-09-2026-16-09-04/request_12215 +1 -0
- package/test/hbConfig/tmp/daikin_request/api.onecta.daikineurope.com_01-09-2026-16-09-04/request_12216 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12195 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12196 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12197 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12198 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12200 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12201 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12202 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12203 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12204 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12205 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12206 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12207 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12208 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12209 +1 -0
- package/test/hbConfig/tmp/daikin_request/cdc.daikin.eu_01-09-2026-16-08-45/request_12210 +1 -0
- package/test/hbConfig/tmp/daikin_request/idp.onecta.daikineurope.com_01-09-2026-16-08-54/request_12211 +1 -0
- package/test/hbConfig/tmp/daikin_request/idp.onecta.daikineurope.com_01-09-2026-16-08-54/request_12212 +1 -0
- package/test/hbConfig/tmp/daikin_request/idp.onecta.daikineurope.com_01-09-2026-16-08-54/request_12213 +1 -0
- package/test/hbConfig/tmp/daikin_request/request_12217 +1 -0
- package/test/mobile-tokens.json +8 -0
- package/test/test-gigya-auth.js +443 -0
- package/test/test-mobile-oauth.js +175 -0
- package/test/test-websocket-mobile.js +123 -0
- package/test/test-websocket.js +116 -0
- package/test/hbConfig/.daikin-controller-cloud-tokenset +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,43 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/) and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## [1.1.0] - 2026-01-09
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- **Mobile App Authentication**: New authentication method using Daikin Onecta mobile app credentials
|
|
11
|
+
- 5000 API calls/day (vs 200 for Developer Portal)
|
|
12
|
+
- No developer portal account required
|
|
13
|
+
- Uses same credentials as Daikin Onecta mobile app
|
|
14
|
+
- **WebSocket Real-time Updates**: Instant device state changes without polling (Mobile App mode)
|
|
15
|
+
- Temperature updates pushed to HomeKit immediately
|
|
16
|
+
- Operation mode changes reflected instantly
|
|
17
|
+
- On/off state synchronization in real-time
|
|
18
|
+
- **Dynamic Settings UI**: Settings automatically adjust based on authentication mode
|
|
19
|
+
- Recommended values shown for each mode
|
|
20
|
+
- WebSocket toggle (Mobile App only)
|
|
21
|
+
- Settings subtabs for better organization (Features, Polling, Network, Devices)
|
|
22
|
+
- **Constants Module**: Centralized configuration constants for better maintainability
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
- Settings page now uses tabbed layout for better organization
|
|
26
|
+
- Update interval can now be as low as 1 minute (Mobile App mode)
|
|
27
|
+
- Force update delay can now be as low as 5 seconds
|
|
28
|
+
- Improved rate limit display in UI shows auth mode limits
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
- Temperature validation to prevent undefined value warnings
|
|
32
|
+
- Default temperature values when sensors are unavailable
|
|
33
|
+
|
|
34
|
+
## [1.0.3] - 2026-01-09
|
|
35
|
+
|
|
36
|
+
### Added
|
|
37
|
+
- Auto-detection of server IP address for OAuth callback configuration
|
|
38
|
+
- Server info endpoint (`/server/info`) to retrieve Homebridge server IP
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
- Improved OAuth callback response page with modern styling
|
|
42
|
+
- Callback server address field now auto-populates with detected IP
|
|
43
|
+
|
|
7
44
|
## [1.0.2] - 2026-01-09
|
|
8
45
|
|
|
9
46
|
### Added
|
package/README.md
CHANGED
|
@@ -10,6 +10,7 @@ A [Homebridge](https://homebridge.io) plugin that integrates Daikin air conditio
|
|
|
10
10
|
- **Operation Modes**: Cooling, heating, and auto modes
|
|
11
11
|
- **Fan Control**: Adjust fan speed from the accessory settings
|
|
12
12
|
- **Swing Mode**: Enable/disable swing (if supported by your device)
|
|
13
|
+
- **Real-time Updates**: WebSocket support for instant device state changes (Mobile App mode)
|
|
13
14
|
- **Extra Features** (individually configurable):
|
|
14
15
|
- Powerful mode (`showPowerfulMode`)
|
|
15
16
|
- Econo mode (`showEconoMode`)
|
|
@@ -21,12 +22,22 @@ A [Homebridge](https://homebridge.io) plugin that integrates Daikin air conditio
|
|
|
21
22
|
|
|
22
23
|
> **Note**: HomeKit doesn't natively support all Daikin operation modes. Extra features appear as switches in the Home app. Enable them individually in the plugin settings UI.
|
|
23
24
|
|
|
25
|
+
## Authentication Methods
|
|
26
|
+
|
|
27
|
+
This plugin supports two authentication methods:
|
|
28
|
+
|
|
29
|
+
| Method | API Calls/Day | WebSocket | Setup |
|
|
30
|
+
|--------|--------------|-----------|-------|
|
|
31
|
+
| **Mobile App** | 5000 | Yes | Email/password (same as Onecta app) |
|
|
32
|
+
| **Developer Portal** | 200 | No | OAuth with developer credentials |
|
|
33
|
+
|
|
34
|
+
**Recommended**: Mobile App authentication provides more API calls and real-time WebSocket updates.
|
|
35
|
+
|
|
24
36
|
## Requirements
|
|
25
37
|
|
|
26
38
|
- Node.js >= 18.15.0
|
|
27
39
|
- Homebridge >= 1.5.0
|
|
28
40
|
- A Daikin account with devices registered in the Onecta app
|
|
29
|
-
- Daikin Developer Portal credentials (see [Setup](#setup))
|
|
30
41
|
|
|
31
42
|
## Installation
|
|
32
43
|
|
|
@@ -38,7 +49,19 @@ npm install -g @mp-consulting/homebridge-daikin-cloud
|
|
|
38
49
|
|
|
39
50
|
## Setup
|
|
40
51
|
|
|
41
|
-
### 1
|
|
52
|
+
### Option 1: Mobile App Authentication (Recommended)
|
|
53
|
+
|
|
54
|
+
1. Open the Homebridge UI and go to the plugin settings
|
|
55
|
+
2. Go to the **Authentication** tab
|
|
56
|
+
3. Select **Mobile App** from the authentication method dropdown
|
|
57
|
+
4. Click **Configure Credentials**
|
|
58
|
+
5. Enter your Daikin Onecta account email and password
|
|
59
|
+
6. Click **Test & Save Credentials**
|
|
60
|
+
7. Restart Homebridge
|
|
61
|
+
|
|
62
|
+
### Option 2: Developer Portal Authentication
|
|
63
|
+
|
|
64
|
+
#### 1. Create a Daikin Developer App
|
|
42
65
|
|
|
43
66
|
1. Go to the [Daikin Developer Portal](https://developer.cloud.daikineurope.com/)
|
|
44
67
|
2. Sign in and navigate to **My Apps** (top-right menu)
|
|
@@ -49,7 +72,7 @@ npm install -g @mp-consulting/homebridge-daikin-cloud
|
|
|
49
72
|
- **Redirect URI**: `https://<your-homebridge-ip>:<callback-port>` (e.g., `https://192.168.1.100:8582`)
|
|
50
73
|
5. Save and note your **Client ID** and **Client Secret**
|
|
51
74
|
|
|
52
|
-
|
|
75
|
+
#### 2. Configure the Plugin
|
|
53
76
|
|
|
54
77
|
Add the platform to your Homebridge `config.json`:
|
|
55
78
|
|
|
@@ -58,6 +81,7 @@ Add the platform to your Homebridge `config.json`:
|
|
|
58
81
|
"platforms": [
|
|
59
82
|
{
|
|
60
83
|
"platform": "DaikinCloud",
|
|
84
|
+
"authMode": "developer_portal",
|
|
61
85
|
"clientId": "<your-client-id>",
|
|
62
86
|
"clientSecret": "<your-client-secret>",
|
|
63
87
|
"oidcCallbackServerBindAddr": "0.0.0.0",
|
|
@@ -68,7 +92,7 @@ Add the platform to your Homebridge `config.json`:
|
|
|
68
92
|
}
|
|
69
93
|
```
|
|
70
94
|
|
|
71
|
-
|
|
95
|
+
#### 3. Authenticate
|
|
72
96
|
|
|
73
97
|
1. Restart Homebridge
|
|
74
98
|
2. Open the Homebridge UI and go to the plugin settings
|
|
@@ -79,13 +103,17 @@ Add the platform to your Homebridge `config.json`:
|
|
|
79
103
|
|
|
80
104
|
| Option | Type | Default | Description |
|
|
81
105
|
|--------|------|---------|-------------|
|
|
82
|
-
| `
|
|
83
|
-
| `
|
|
84
|
-
| `
|
|
106
|
+
| `authMode` | string | `developer_portal` | Authentication method: `developer_portal` or `mobile_app` |
|
|
107
|
+
| `email` | string | - | Daikin account email (Mobile App mode) |
|
|
108
|
+
| `password` | string | - | Daikin account password (Mobile App mode) |
|
|
109
|
+
| `clientId` | string | - | Daikin Developer App Client ID (Developer Portal mode) |
|
|
110
|
+
| `clientSecret` | string | - | Daikin Developer App Client Secret (Developer Portal mode) |
|
|
111
|
+
| `callbackServerExternalAddress` | string | auto-detected | External IP/hostname for OAuth callback |
|
|
85
112
|
| `callbackServerPort` | number | `8582` | Port for OAuth callback server (1-65535) |
|
|
86
113
|
| `oidcCallbackServerBindAddr` | string | `0.0.0.0` | Address to bind callback server (valid IPv4) |
|
|
87
|
-
| `updateIntervalInMinutes` | number | `15` | Polling interval
|
|
114
|
+
| `updateIntervalInMinutes` | number | `15` | Polling interval (Developer Portal: 15+ min, Mobile App: 1-5 min) |
|
|
88
115
|
| `forceUpdateDelay` | number | `60000` | Delay (ms) before refreshing after a change |
|
|
116
|
+
| `enableWebSocket` | boolean | `true` | Enable real-time updates (Mobile App mode only) |
|
|
89
117
|
| `excludedDevicesByDeviceId` | string[] | `[]` | Device IDs to exclude from HomeKit |
|
|
90
118
|
| `showPowerfulMode` | boolean | `false` | Show Powerful mode switch |
|
|
91
119
|
| `showEconoMode` | boolean | `false` | Show Econo mode switch |
|
|
@@ -97,11 +125,16 @@ Add the platform to your Homebridge `config.json`:
|
|
|
97
125
|
|
|
98
126
|
## API Rate Limits
|
|
99
127
|
|
|
100
|
-
|
|
128
|
+
| Mode | Daily Limit | Recommended Polling |
|
|
129
|
+
|------|-------------|---------------------|
|
|
130
|
+
| Developer Portal | 200 calls/day | 15+ minutes |
|
|
131
|
+
| Mobile App | 5000 calls/day | 1-5 minutes |
|
|
101
132
|
|
|
102
|
-
|
|
133
|
+
The plugin manages rate limits by:
|
|
134
|
+
- Polling at configurable intervals
|
|
103
135
|
- Triggering immediate updates after changes
|
|
104
136
|
- Blocking requests when the rate limit is reached
|
|
137
|
+
- Using WebSocket for real-time updates (Mobile App mode)
|
|
105
138
|
|
|
106
139
|
## Fan Speed
|
|
107
140
|
|
|
@@ -142,6 +175,12 @@ rm ~/.homebridge/.daikin-controller-cloud-tokenset
|
|
|
142
175
|
- Verify the device is registered in the Daikin Onecta app
|
|
143
176
|
- Check if the device ID is in `excludedDevicesByDeviceId`
|
|
144
177
|
|
|
178
|
+
### WebSocket Not Connecting (Mobile App Mode)
|
|
179
|
+
|
|
180
|
+
- Ensure `enableWebSocket` is set to `true`
|
|
181
|
+
- Check Homebridge logs for WebSocket connection errors
|
|
182
|
+
- Verify your credentials are valid by testing the connection in the UI
|
|
183
|
+
|
|
145
184
|
## Supported Devices
|
|
146
185
|
|
|
147
186
|
Any device compatible with the [Daikin Onecta app](https://www.daikin.eu/en_us/product-group/control-systems/onecta/connectable-units.html), including:
|
package/config.schema.json
CHANGED
|
@@ -3,37 +3,47 @@
|
|
|
3
3
|
"pluginType": "platform",
|
|
4
4
|
"singular": true,
|
|
5
5
|
"customUi": true,
|
|
6
|
-
"headerDisplay": "Use the **Custom UI** tab above to authenticate with Daikin Cloud.
|
|
7
|
-
"footerDisplay": "For help, visit the [GitHub repository](https://github.com/mp-consulting/homebridge-daikin-cloud).
|
|
6
|
+
"headerDisplay": "Use the **Custom UI** tab above to authenticate with Daikin Cloud. Choose your authentication method below.",
|
|
7
|
+
"footerDisplay": "For help, visit the [GitHub repository](https://github.com/mp-consulting/homebridge-daikin-cloud).",
|
|
8
8
|
"schema": {
|
|
9
9
|
"type": "object",
|
|
10
10
|
"properties": {
|
|
11
|
+
"authMode": {
|
|
12
|
+
"title": "Authentication Method",
|
|
13
|
+
"description": "Choose how to authenticate with Daikin Cloud",
|
|
14
|
+
"type": "string",
|
|
15
|
+
"default": "developer_portal",
|
|
16
|
+
"oneOf": [
|
|
17
|
+
{"title": "Developer Portal (200 API calls/day)", "enum": ["developer_portal"]},
|
|
18
|
+
{"title": "Mobile App (5000 API calls/day + WebSocket)", "enum": ["mobile_app"]}
|
|
19
|
+
]
|
|
20
|
+
},
|
|
11
21
|
"clientId": {
|
|
12
22
|
"title": "Client ID",
|
|
13
23
|
"description": "From your Daikin Developer Portal application",
|
|
14
24
|
"type": "string",
|
|
15
|
-
"required": true,
|
|
16
25
|
"x-schema-form": {
|
|
17
|
-
"placeholder": "Enter your Client ID"
|
|
26
|
+
"placeholder": "Enter your Client ID",
|
|
27
|
+
"condition": "model.authMode !== 'mobile_app'"
|
|
18
28
|
}
|
|
19
29
|
},
|
|
20
30
|
"clientSecret": {
|
|
21
31
|
"title": "Client Secret",
|
|
22
32
|
"description": "Keep this secret and never share it",
|
|
23
33
|
"type": "string",
|
|
24
|
-
"required": true,
|
|
25
34
|
"x-schema-form": {
|
|
26
35
|
"type": "password",
|
|
27
|
-
"placeholder": "Enter your Client Secret"
|
|
36
|
+
"placeholder": "Enter your Client Secret",
|
|
37
|
+
"condition": "model.authMode !== 'mobile_app'"
|
|
28
38
|
}
|
|
29
39
|
},
|
|
30
40
|
"callbackServerExternalAddress": {
|
|
31
41
|
"title": "Callback Server Address",
|
|
32
42
|
"description": "Your Homebridge server's external IP or domain (not localhost)",
|
|
33
43
|
"type": "string",
|
|
34
|
-
"required": true,
|
|
35
44
|
"x-schema-form": {
|
|
36
|
-
"placeholder": "e.g., 192.168.1.100"
|
|
45
|
+
"placeholder": "e.g., 192.168.1.100",
|
|
46
|
+
"condition": "model.authMode !== 'mobile_app'"
|
|
37
47
|
}
|
|
38
48
|
},
|
|
39
49
|
"callbackServerPort": {
|
|
@@ -43,7 +53,8 @@
|
|
|
43
53
|
"required": false,
|
|
44
54
|
"default": "8582",
|
|
45
55
|
"x-schema-form": {
|
|
46
|
-
"placeholder": "8582"
|
|
56
|
+
"placeholder": "8582",
|
|
57
|
+
"condition": "model.authMode !== 'mobile_app'"
|
|
47
58
|
}
|
|
48
59
|
},
|
|
49
60
|
"oidcCallbackServerBindAddr": {
|
|
@@ -57,7 +68,27 @@
|
|
|
57
68
|
"titleMap": {
|
|
58
69
|
"127.0.0.1": "127.0.0.1 (localhost only - recommended)",
|
|
59
70
|
"0.0.0.0": "0.0.0.0 (all network interfaces)"
|
|
60
|
-
}
|
|
71
|
+
},
|
|
72
|
+
"condition": "model.authMode !== 'mobile_app'"
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
"daikinEmail": {
|
|
76
|
+
"title": "Daikin Account Email",
|
|
77
|
+
"description": "Your Daikin Onecta account email address",
|
|
78
|
+
"type": "string",
|
|
79
|
+
"x-schema-form": {
|
|
80
|
+
"placeholder": "your@email.com",
|
|
81
|
+
"condition": "model.authMode === 'mobile_app'"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"daikinPassword": {
|
|
85
|
+
"title": "Daikin Account Password",
|
|
86
|
+
"description": "Your Daikin Onecta account password",
|
|
87
|
+
"type": "string",
|
|
88
|
+
"x-schema-form": {
|
|
89
|
+
"type": "password",
|
|
90
|
+
"placeholder": "Enter your password",
|
|
91
|
+
"condition": "model.authMode === 'mobile_app'"
|
|
61
92
|
}
|
|
62
93
|
},
|
|
63
94
|
"showExtraFeatures": {
|
|
@@ -83,26 +114,53 @@
|
|
|
83
114
|
"title": "Update Interval (minutes)",
|
|
84
115
|
"type": "integer",
|
|
85
116
|
"default": 15,
|
|
86
|
-
"minimum":
|
|
117
|
+
"minimum": 1,
|
|
87
118
|
"maximum": 60,
|
|
88
|
-
"description": "How often to poll the Daikin API.
|
|
119
|
+
"description": "How often to poll the Daikin API. Developer Portal: 15+ min recommended (200 calls/day limit). Mobile App: 1-5 min recommended (5000 calls/day)."
|
|
89
120
|
},
|
|
90
121
|
"forceUpdateDelay": {
|
|
91
122
|
"title": "Force Update Delay (ms)",
|
|
92
123
|
"type": "integer",
|
|
93
|
-
"minimum":
|
|
124
|
+
"minimum": 5000,
|
|
94
125
|
"maximum": 300000,
|
|
95
126
|
"default": 60000,
|
|
96
|
-
"description": "Delay after a change before refreshing data from API.
|
|
127
|
+
"description": "Delay after a change before refreshing data from API. Developer Portal: 60s recommended. Mobile App: 10s recommended."
|
|
128
|
+
},
|
|
129
|
+
"enableWebSocket": {
|
|
130
|
+
"title": "Enable WebSocket (Mobile App only)",
|
|
131
|
+
"type": "boolean",
|
|
132
|
+
"default": true,
|
|
133
|
+
"description": "Enable real-time updates via WebSocket. Only available with Mobile App authentication. Provides instant device state updates."
|
|
97
134
|
}
|
|
98
135
|
}
|
|
99
136
|
},
|
|
100
137
|
"layout": [
|
|
101
138
|
{
|
|
102
139
|
"type": "fieldset",
|
|
103
|
-
"title": "Authentication",
|
|
140
|
+
"title": "Authentication Method",
|
|
141
|
+
"description": "Choose your authentication method",
|
|
142
|
+
"expandable": false,
|
|
143
|
+
"items": [
|
|
144
|
+
"authMode"
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"type": "fieldset",
|
|
149
|
+
"title": "Mobile App Authentication",
|
|
150
|
+
"description": "Use your Daikin Onecta account credentials (same as the mobile app). Benefits: 5000 API calls/day + real-time WebSocket updates.",
|
|
151
|
+
"expandable": false,
|
|
152
|
+
"condition": "model.authMode === 'mobile_app'",
|
|
153
|
+
"items": [
|
|
154
|
+
"daikinEmail",
|
|
155
|
+
"daikinPassword"
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"type": "fieldset",
|
|
160
|
+
"title": "Developer Portal Authentication",
|
|
104
161
|
"description": "Daikin Developer Portal credentials",
|
|
105
162
|
"expandable": false,
|
|
163
|
+
"condition": "model.authMode !== 'mobile_app'",
|
|
106
164
|
"items": [
|
|
107
165
|
"clientId",
|
|
108
166
|
"clientSecret"
|
|
@@ -114,6 +172,7 @@
|
|
|
114
172
|
"description": "OAuth callback server configuration",
|
|
115
173
|
"expandable": true,
|
|
116
174
|
"expanded": true,
|
|
175
|
+
"condition": "model.authMode !== 'mobile_app'",
|
|
117
176
|
"items": [
|
|
118
177
|
"callbackServerExternalAddress",
|
|
119
178
|
"callbackServerPort",
|
|
@@ -137,6 +196,7 @@
|
|
|
137
196
|
"expandable": true,
|
|
138
197
|
"expanded": false,
|
|
139
198
|
"items": [
|
|
199
|
+
"enableWebSocket",
|
|
140
200
|
"updateIntervalInMinutes",
|
|
141
201
|
"forceUpdateDelay",
|
|
142
202
|
"excludedDevicesByDeviceId"
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Handles REST API calls to the Daikin Cloud.
|
|
5
5
|
*/
|
|
6
|
-
import { RateLimitStatus, GatewayDevice } from './daikin-types';
|
|
7
|
-
import { DaikinOAuth } from './daikin-oauth';
|
|
6
|
+
import { RateLimitStatus, GatewayDevice, OAuthProvider } from './daikin-types';
|
|
8
7
|
export declare class RateLimitedError extends Error {
|
|
9
8
|
readonly retryAfter: number;
|
|
10
9
|
constructor(message: string, retryAfter: number);
|
|
@@ -13,7 +12,7 @@ export declare class DaikinApi {
|
|
|
13
12
|
private readonly oauth;
|
|
14
13
|
private readonly onRateLimitStatus?;
|
|
15
14
|
private blockedUntil;
|
|
16
|
-
constructor(oauth:
|
|
15
|
+
constructor(oauth: OAuthProvider, onRateLimitStatus?: ((status: RateLimitStatus) => void) | undefined);
|
|
17
16
|
/**
|
|
18
17
|
* Make a static GET request with access token (for UI)
|
|
19
18
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daikin-api.d.ts","sourceRoot":"","sources":["../../../src/api/daikin-api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAqB,eAAe,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"daikin-api.d.ts","sourceRoot":"","sources":["../../../src/api/daikin-api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAqB,eAAe,EAAE,aAAa,EAAE,aAAa,EAAC,MAAM,gBAAgB,CAAC;AAGjG,qBAAa,gBAAiB,SAAQ,KAAK;aAGnB,UAAU,EAAE,MAAM;gBADlC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM;CAKzC;AAED,qBAAa,SAAS;IAId,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAJvC,OAAO,CAAC,YAAY,CAAK;gBAGJ,KAAK,EAAE,aAAa,EACpB,iBAAiB,CAAC,YAAW,eAAe,KAAK,IAAI,aAAA;IAO1E;;OAEG;WACU,aAAa,CACtB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GACpB,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;IAOhC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAqChC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAI5C;;OAEG;IACG,YAAY,CACd,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;IAKhB;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,sBAAsB,IAAI,MAAM;IAIhC;;OAEG;YACW,OAAO;IAmErB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,WAAW;CA4CtB"}
|
|
@@ -31,6 +31,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
31
31
|
exports.DaikinApi = exports.RateLimitedError = void 0;
|
|
32
32
|
const https = __importStar(require("node:https"));
|
|
33
33
|
const daikin_types_1 = require("./daikin-types");
|
|
34
|
+
const constants_1 = require("../constants");
|
|
34
35
|
class RateLimitedError extends Error {
|
|
35
36
|
retryAfter;
|
|
36
37
|
constructor(message, retryAfter) {
|
|
@@ -63,10 +64,10 @@ class DaikinApi {
|
|
|
63
64
|
limitDay: DaikinApi.parseHeaderStatic(response.headers['x-ratelimit-limit-day']),
|
|
64
65
|
remainingDay: DaikinApi.parseHeaderStatic(response.headers['x-ratelimit-remaining-day']),
|
|
65
66
|
};
|
|
66
|
-
if (response.statusCode ===
|
|
67
|
+
if (response.statusCode === constants_1.HTTP_STATUS.UNAUTHORIZED) {
|
|
67
68
|
throw new Error('Token expired or invalid');
|
|
68
69
|
}
|
|
69
|
-
if (response.statusCode ===
|
|
70
|
+
if (response.statusCode === constants_1.HTTP_STATUS.TOO_MANY_REQUESTS) {
|
|
70
71
|
throw new Error('Rate limit exceeded');
|
|
71
72
|
}
|
|
72
73
|
if (response.statusCode >= 400) {
|
|
@@ -137,7 +138,7 @@ class DaikinApi {
|
|
|
137
138
|
* Get time until rate limit is lifted
|
|
138
139
|
*/
|
|
139
140
|
getRateLimitRetryAfter() {
|
|
140
|
-
return Math.max(0, Math.ceil((this.blockedUntil - Date.now()) /
|
|
141
|
+
return Math.max(0, Math.ceil((this.blockedUntil - Date.now()) / constants_1.MS_PER_SECOND));
|
|
141
142
|
}
|
|
142
143
|
/**
|
|
143
144
|
* Make an authenticated API request
|
|
@@ -163,23 +164,23 @@ class DaikinApi {
|
|
|
163
164
|
}
|
|
164
165
|
// Handle response codes
|
|
165
166
|
switch (response.statusCode) {
|
|
166
|
-
case
|
|
167
|
-
case
|
|
167
|
+
case constants_1.HTTP_STATUS.OK:
|
|
168
|
+
case constants_1.HTTP_STATUS.NO_CONTENT:
|
|
168
169
|
return response.body ? JSON.parse(response.body) : null;
|
|
169
|
-
case
|
|
170
|
-
throw new Error(`Bad Request (
|
|
171
|
-
case
|
|
172
|
-
throw new Error(
|
|
173
|
-
case
|
|
174
|
-
throw new Error(`Not Found (
|
|
175
|
-
case
|
|
176
|
-
throw new Error(`Conflict (
|
|
177
|
-
case
|
|
178
|
-
throw new Error(`Unprocessable Entity (
|
|
179
|
-
case
|
|
180
|
-
const retryAfter = this.parseHeader(response.headers['retry-after']) ||
|
|
181
|
-
const blockedFor = Math.min(retryAfter,
|
|
182
|
-
this.blockedUntil = Date.now() + blockedFor *
|
|
170
|
+
case constants_1.HTTP_STATUS.BAD_REQUEST:
|
|
171
|
+
throw new Error(`Bad Request (${constants_1.HTTP_STATUS.BAD_REQUEST}): ${response.body || 'No response body'}`);
|
|
172
|
+
case constants_1.HTTP_STATUS.UNAUTHORIZED:
|
|
173
|
+
throw new Error(`Unauthorized (${constants_1.HTTP_STATUS.UNAUTHORIZED}): Token expired or invalid`);
|
|
174
|
+
case constants_1.HTTP_STATUS.NOT_FOUND:
|
|
175
|
+
throw new Error(`Not Found (${constants_1.HTTP_STATUS.NOT_FOUND}): ${response.body || 'Resource not found'}`);
|
|
176
|
+
case constants_1.HTTP_STATUS.CONFLICT:
|
|
177
|
+
throw new Error(`Conflict (${constants_1.HTTP_STATUS.CONFLICT}): ${response.body || 'Request conflict'}`);
|
|
178
|
+
case constants_1.HTTP_STATUS.UNPROCESSABLE_ENTITY:
|
|
179
|
+
throw new Error(`Unprocessable Entity (${constants_1.HTTP_STATUS.UNPROCESSABLE_ENTITY}): ${response.body || 'Invalid request'}`);
|
|
180
|
+
case constants_1.HTTP_STATUS.TOO_MANY_REQUESTS: {
|
|
181
|
+
const retryAfter = this.parseHeader(response.headers['retry-after']) || constants_1.DEFAULT_RETRY_AFTER_SECONDS;
|
|
182
|
+
const blockedFor = Math.min(retryAfter, constants_1.MAX_RATE_LIMIT_BLOCK_SECONDS);
|
|
183
|
+
this.blockedUntil = Date.now() + blockedFor * constants_1.MS_PER_SECOND;
|
|
183
184
|
throw new RateLimitedError(`Rate limited. Retry after ${retryAfter} seconds.`, blockedFor);
|
|
184
185
|
}
|
|
185
186
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daikin-api.js","sourceRoot":"","sources":["../../../src/api/daikin-api.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,kDAAoC;AACpC,
|
|
1
|
+
{"version":3,"file":"daikin-api.js","sourceRoot":"","sources":["../../../src/api/daikin-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Daikin Cloud Controller
|
|
3
3
|
*
|
|
4
|
-
* Main controller that ties together OAuth, API, and device management.
|
|
4
|
+
* Main controller that ties together OAuth, API, WebSocket, and device management.
|
|
5
|
+
* Supports both Developer Portal and Mobile App authentication methods.
|
|
5
6
|
*/
|
|
6
7
|
/// <reference types="node" />
|
|
7
8
|
import { EventEmitter } from 'node:events';
|
|
8
|
-
import { DaikinClientConfig, TokenSet } from './daikin-types';
|
|
9
|
+
import { DaikinClientConfig, DaikinControllerConfig, TokenSet } from './daikin-types';
|
|
9
10
|
import { DaikinCloudDevice } from './daikin-device';
|
|
11
|
+
import { WebSocketState } from './daikin-websocket';
|
|
10
12
|
export declare class DaikinCloudController extends EventEmitter {
|
|
11
13
|
private readonly oauth;
|
|
14
|
+
private readonly mobileOAuth?;
|
|
15
|
+
private readonly devPortalOAuth?;
|
|
12
16
|
private readonly api;
|
|
17
|
+
private readonly websocket;
|
|
18
|
+
private readonly authMode;
|
|
13
19
|
private devices;
|
|
14
|
-
|
|
20
|
+
private websocketEnabled;
|
|
21
|
+
constructor(config: DaikinControllerConfig | DaikinClientConfig);
|
|
22
|
+
/**
|
|
23
|
+
* Get the authentication mode
|
|
24
|
+
*/
|
|
25
|
+
getAuthMode(): 'developer_portal' | 'mobile_app';
|
|
26
|
+
/**
|
|
27
|
+
* Authenticate with mobile app credentials (only for mobile_app mode)
|
|
28
|
+
* Must be called before using the API when using mobile_app mode without existing tokens.
|
|
29
|
+
*/
|
|
30
|
+
authenticateMobile(): Promise<TokenSet>;
|
|
31
|
+
/**
|
|
32
|
+
* Set up WebSocket event handlers
|
|
33
|
+
*/
|
|
34
|
+
private setupWebSocketHandlers;
|
|
35
|
+
/**
|
|
36
|
+
* Handle device updates from WebSocket
|
|
37
|
+
*/
|
|
38
|
+
private handleWebSocketDeviceUpdate;
|
|
15
39
|
/**
|
|
16
40
|
* Check if authenticated
|
|
17
41
|
*/
|
|
@@ -25,14 +49,14 @@ export declare class DaikinCloudController extends EventEmitter {
|
|
|
25
49
|
*/
|
|
26
50
|
getTokenSet(): TokenSet | null;
|
|
27
51
|
/**
|
|
28
|
-
* Build authorization URL
|
|
52
|
+
* Build authorization URL (Developer Portal mode only)
|
|
29
53
|
*/
|
|
30
54
|
buildAuthUrl(state?: string): {
|
|
31
55
|
url: string;
|
|
32
56
|
state: string;
|
|
33
57
|
};
|
|
34
58
|
/**
|
|
35
|
-
* Exchange authorization code for tokens
|
|
59
|
+
* Exchange authorization code for tokens (Developer Portal mode only)
|
|
36
60
|
*/
|
|
37
61
|
exchangeCode(code: string): Promise<TokenSet>;
|
|
38
62
|
/**
|
|
@@ -55,6 +79,26 @@ export declare class DaikinCloudController extends EventEmitter {
|
|
|
55
79
|
* Get rate limit retry time
|
|
56
80
|
*/
|
|
57
81
|
getRateLimitRetryAfter(): number;
|
|
82
|
+
/**
|
|
83
|
+
* Enable and connect WebSocket for real-time updates
|
|
84
|
+
*/
|
|
85
|
+
enableWebSocket(): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Disable and disconnect WebSocket
|
|
88
|
+
*/
|
|
89
|
+
disableWebSocket(): void;
|
|
90
|
+
/**
|
|
91
|
+
* Check if WebSocket is enabled
|
|
92
|
+
*/
|
|
93
|
+
isWebSocketEnabled(): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Check if WebSocket is connected
|
|
96
|
+
*/
|
|
97
|
+
isWebSocketConnected(): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Get WebSocket connection state
|
|
100
|
+
*/
|
|
101
|
+
getWebSocketState(): WebSocketState;
|
|
58
102
|
}
|
|
59
103
|
export { DaikinCloudDevice } from './daikin-device';
|
|
60
104
|
export { RateLimitedError } from './daikin-api';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daikin-controller.d.ts","sourceRoot":"","sources":["../../../src/api/daikin-controller.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"daikin-controller.d.ts","sourceRoot":"","sources":["../../../src/api/daikin-controller.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;;AAEH,OAAO,EAAC,YAAY,EAAC,MAAM,aAAa,CAAC;AACzC,OAAO,EACH,kBAAkB,EAClB,sBAAsB,EAGtB,QAAQ,EAEX,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EAAC,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAkB,cAAc,EAAC,MAAM,oBAAoB,CAAC;AAEnE,qBAAa,qBAAsB,SAAQ,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwF;IAC9G,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,gBAAgB,CAAS;gBAErB,MAAM,EAAE,sBAAsB,GAAG,kBAAkB;IAoD/D;;OAEG;IACH,WAAW,IAAI,kBAAkB,GAAG,YAAY;IAIhD;;;OAGG;IACG,kBAAkB,IAAI,OAAO,CAAC,QAAQ,CAAC;IAO7C;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAkB9B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAYnC;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,kBAAkB,IAAI,IAAI,GAAG,IAAI;IAIjC;;OAEG;IACH,WAAW,IAAI,QAAQ,GAAG,IAAI;IAI9B;;OAEG;IACH,YAAY,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAO5D;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAOnD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAoBrD;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI1C;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,sBAAsB,IAAI,MAAM;IAQhC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAStC;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAKxB;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAI/B;;OAEG;IACH,iBAAiB,IAAI,cAAc;CAGtC;AAGD,OAAO,EAAC,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAC,gBAAgB,EAAC,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAC,WAAW,EAAC,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,cAAc,gBAAgB,CAAC"}
|