homebridge-ac-freedom 2.3.2 → 2.3.4
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/CHANGELOG.md +13 -0
- package/README.md +94 -38
- package/homebridge-ui/public/index.html +46 -42
- package/package.json +1 -1
- package/src/platform.js +17 -1
- package/homebridge-ui/public/i18n/ar.json +0 -30
- package/homebridge-ui/public/i18n/de.json +0 -30
- package/homebridge-ui/public/i18n/en.json +0 -30
- package/homebridge-ui/public/i18n/es.json +0 -30
- package/homebridge-ui/public/i18n/fr.json +0 -30
- package/homebridge-ui/public/i18n/it.json +0 -30
- package/homebridge-ui/public/i18n/ja.json +0 -30
- package/homebridge-ui/public/i18n/ko.json +0 -30
- package/homebridge-ui/public/i18n/nl.json +0 -30
- package/homebridge-ui/public/i18n/pl.json +0 -30
- package/homebridge-ui/public/i18n/pt.json +0 -30
- package/homebridge-ui/public/i18n/ru.json +0 -30
- package/homebridge-ui/public/i18n/tr.json +0 -30
- package/homebridge-ui/public/i18n/zh-CN.json +0 -30
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.3.4
|
|
4
|
+
|
|
5
|
+
- **UI: badge colors** — Cloud (teal), Hybrid (green), Local (yellow) — clearly distinct from each other
|
|
6
|
+
- **UI: card colors** — all device cards now use the same neutral color regardless of connection mode
|
|
7
|
+
- **UI: Local device numbering** — Local devices now always start from Local #1, independent of cloud device count
|
|
8
|
+
- **UI: Poll Interval label** — removed "(seconds)" from the label; dropdown options now show "5 seconds", "10 seconds", etc.
|
|
9
|
+
- **UI: English only** — removed all 14 language files; strings are now embedded directly in the UI (no i18n fetch on load)
|
|
10
|
+
|
|
11
|
+
## 2.3.3
|
|
12
|
+
|
|
13
|
+
- **Hybrid offline startup** — if cloud is unavailable at Homebridge startup and the device has a local IP + MAC configured, the device now starts in local-only mode instead of failing. Full hybrid mode resumes automatically on the next restart when internet is available.
|
|
14
|
+
- **Hybrid endpoint fallback** — if a configured `endpointId` is not found in the cloud device list (e.g. after a cloud outage), the device also falls back to local-only mode when IP + MAC are set.
|
|
15
|
+
|
|
3
16
|
## 2.3.2
|
|
4
17
|
|
|
5
18
|
- **Fix AUTO mode byte overflow** — local protocol uses 3-bit mode field; AUTO is now correctly encoded as 0 (not 8, which silently truncated to 0 in the wrong byte position)
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
# Homebridge AC Freedom
|
|
8
8
|
|
|
9
|
-
A [Homebridge](https://homebridge.io) plugin for controlling **AUX-based air conditioners** via **Apple HomeKit**. Works with any AC that uses the **AC Freedom** app. Supports **
|
|
9
|
+
A [Homebridge](https://homebridge.io) plugin for controlling **AUX-based air conditioners** via **Apple HomeKit**. Works with any AC that uses the **AC Freedom** app. Supports **Hybrid** (AUX Cloud + optional local Broadlink UDP) and **Local** (Broadlink UDP only) connection modes — no extra hub required.
|
|
10
10
|
|
|
11
11
|
[](https://github.com/homebridge/homebridge/wiki/Verified-Plugins)
|
|
12
12
|
[](https://www.npmjs.com/package/homebridge-ac-freedom)
|
|
@@ -31,11 +31,13 @@ A [Homebridge](https://homebridge.io) plugin for controlling **AUX-based air con
|
|
|
31
31
|
- Self Clean
|
|
32
32
|
- Comfortable Wind
|
|
33
33
|
- **Display** switch — LED display on/off
|
|
34
|
-
- **Auto-reset** — fan and sleep reset to default when AC turns on or
|
|
35
|
-
- **
|
|
36
|
-
- **Local** — Direct Broadlink UDP, no internet required
|
|
34
|
+
- **Auto-reset** — fan and sleep reset to default when AC turns on/off or mode changes
|
|
35
|
+
- **Hybrid** — single cloud login at platform level; optional IP + MAC per device for local Broadlink UDP (local preferred, cloud fallback)
|
|
36
|
+
- **Local** — Direct Broadlink UDP only, no internet required
|
|
37
37
|
- **Multi-device** — configure as many ACs as needed
|
|
38
|
+
- **Custom config UI** — built-in Homebridge UI with Fetch Devices button
|
|
38
39
|
- Homebridge v1 & v2 compatible
|
|
40
|
+
- English UI
|
|
39
41
|
|
|
40
42
|
---
|
|
41
43
|
|
|
@@ -56,7 +58,7 @@ Any air conditioner compatible with the **AC Freedom** app is supported:
|
|
|
56
58
|
- [Homebridge](https://homebridge.io) v1.6.0 or later (v2 supported)
|
|
57
59
|
- Node.js v18.0.0 or later
|
|
58
60
|
- An AUX-compatible AC with Wi-Fi (Broadlink module)
|
|
59
|
-
- **
|
|
61
|
+
- **Hybrid:** AC Freedom app account (email registration)
|
|
60
62
|
- **Local:** AC's IP and MAC address on your local network
|
|
61
63
|
|
|
62
64
|
---
|
|
@@ -68,6 +70,7 @@ Any air conditioner compatible with the **AC Freedom** app is supported:
|
|
|
68
70
|
1. Open the Homebridge UI → **Plugins**
|
|
69
71
|
2. Search for `homebridge-ac-freedom`
|
|
70
72
|
3. Click **Install**
|
|
73
|
+
4. Open plugin settings, enter your cloud credentials and press **Fetch** to auto-discover your devices
|
|
71
74
|
|
|
72
75
|
**Via terminal:**
|
|
73
76
|
|
|
@@ -77,9 +80,50 @@ npm install -g homebridge-ac-freedom
|
|
|
77
80
|
|
|
78
81
|
---
|
|
79
82
|
|
|
83
|
+
## Connection Modes
|
|
84
|
+
|
|
85
|
+
### Hybrid (recommended)
|
|
86
|
+
|
|
87
|
+
Cloud credentials are configured **once at platform level**. All your devices are auto-discovered via the cloud. Optionally add an IP + MAC per device for direct local Broadlink UDP control — local is used when available and automatically falls back to cloud.
|
|
88
|
+
|
|
89
|
+
### Local Only
|
|
90
|
+
|
|
91
|
+
Direct Broadlink UDP communication only. No cloud account needed, but Homebridge must be on the same network as the AC.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
80
95
|
## Configuration
|
|
81
96
|
|
|
82
|
-
|
|
97
|
+
The easiest way to configure is through the **Homebridge UI** — enter your credentials and press **Fetch** to auto-populate your devices.
|
|
98
|
+
|
|
99
|
+
For manual JSON configuration:
|
|
100
|
+
|
|
101
|
+
### Hybrid Mode
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"platforms": [
|
|
106
|
+
{
|
|
107
|
+
"platform": "AcFreedom",
|
|
108
|
+
"name": "AC Freedom",
|
|
109
|
+
"cloud": {
|
|
110
|
+
"email": "your-email@example.com",
|
|
111
|
+
"password": "your-password",
|
|
112
|
+
"region": "eu"
|
|
113
|
+
},
|
|
114
|
+
"devices": [
|
|
115
|
+
{
|
|
116
|
+
"name": "Living Room AC",
|
|
117
|
+
"connection": "hybrid",
|
|
118
|
+
"endpointId": "your-device-endpoint-id"
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Hybrid Mode with Local Override
|
|
83
127
|
|
|
84
128
|
```json
|
|
85
129
|
{
|
|
@@ -87,14 +131,19 @@ npm install -g homebridge-ac-freedom
|
|
|
87
131
|
{
|
|
88
132
|
"platform": "AcFreedom",
|
|
89
133
|
"name": "AC Freedom",
|
|
134
|
+
"cloud": {
|
|
135
|
+
"email": "your-email@example.com",
|
|
136
|
+
"password": "your-password",
|
|
137
|
+
"region": "eu"
|
|
138
|
+
},
|
|
90
139
|
"devices": [
|
|
91
140
|
{
|
|
92
141
|
"name": "Living Room AC",
|
|
93
|
-
"connection": "
|
|
94
|
-
"
|
|
95
|
-
|
|
96
|
-
"
|
|
97
|
-
"
|
|
142
|
+
"connection": "hybrid",
|
|
143
|
+
"endpointId": "your-device-endpoint-id",
|
|
144
|
+
"local": {
|
|
145
|
+
"ip": "192.168.1.100",
|
|
146
|
+
"mac": "AA:BB:CC:DD:EE:FF"
|
|
98
147
|
}
|
|
99
148
|
}
|
|
100
149
|
]
|
|
@@ -103,7 +152,7 @@ npm install -g homebridge-ac-freedom
|
|
|
103
152
|
}
|
|
104
153
|
```
|
|
105
154
|
|
|
106
|
-
### Local Mode
|
|
155
|
+
### Local Only Mode
|
|
107
156
|
|
|
108
157
|
```json
|
|
109
158
|
{
|
|
@@ -130,42 +179,46 @@ npm install -g homebridge-ac-freedom
|
|
|
130
179
|
|
|
131
180
|
## Configuration Options
|
|
132
181
|
|
|
133
|
-
###
|
|
134
|
-
|
|
135
|
-
| Option | Type | Required | Default | Description |
|
|
136
|
-
|--------|------|----------|---------|-------------|
|
|
137
|
-
| `name` | string | Yes | — | Device name in HomeKit |
|
|
138
|
-
| `connection` | string | Yes | `"cloud"` | Connection mode: `cloud` or `local` |
|
|
139
|
-
| `pollInterval` | integer | No | `30` | Polling interval in seconds (5–300) |
|
|
140
|
-
| `tempStep` | number | No | `0.5` | Temperature step: `0.5` or `1` |
|
|
182
|
+
### Platform-level Cloud Credentials (`cloud` object)
|
|
141
183
|
|
|
142
|
-
|
|
184
|
+
Required for Hybrid mode. Configured once, shared by all hybrid devices.
|
|
143
185
|
|
|
144
186
|
| Option | Type | Required | Default | Description |
|
|
145
187
|
|--------|------|----------|---------|-------------|
|
|
146
188
|
| `email` | string | Yes | — | AC Freedom app email |
|
|
147
189
|
| `password` | string | Yes | — | AC Freedom app password |
|
|
148
190
|
| `region` | string | No | `"eu"` | Server region: `eu`, `usa`, `cn`, `rus` |
|
|
149
|
-
| `deviceId` | string | No | — | Specific device ID (leave empty to auto-detect) |
|
|
150
191
|
|
|
151
|
-
###
|
|
192
|
+
### Device Options
|
|
152
193
|
|
|
153
194
|
| Option | Type | Required | Default | Description |
|
|
154
195
|
|--------|------|----------|---------|-------------|
|
|
155
|
-
| `
|
|
156
|
-
| `
|
|
196
|
+
| `name` | string | Yes | — | Device name in HomeKit |
|
|
197
|
+
| `connection` | string | No | `"hybrid"` | `"hybrid"` or `"local"` |
|
|
198
|
+
| `endpointId` | string | No | — | Cloud device ID (auto-detected if empty) |
|
|
199
|
+
| `pollInterval` | integer | No | `30` | Polling interval in seconds (5–300) |
|
|
200
|
+
| `tempStep` | number | No | `0.5` | Temperature step: `0.5` or `1` |
|
|
201
|
+
|
|
202
|
+
### Local Settings (`local` object, per device)
|
|
203
|
+
|
|
204
|
+
| Option | Type | Required | Description |
|
|
205
|
+
|--------|------|----------|-------------|
|
|
206
|
+
| `ip` | string | Yes | AC unit's local IP address |
|
|
207
|
+
| `mac` | string | Yes | AC unit's MAC address (`AA:BB:CC:DD:EE:FF`) |
|
|
157
208
|
|
|
158
209
|
### Feature Switches
|
|
159
210
|
|
|
160
211
|
| Option | Type | Default | Description |
|
|
161
212
|
|--------|------|---------|-------------|
|
|
162
|
-
| `presets.sleep` | boolean | `true` | Sleep Mode switch |
|
|
163
|
-
| `presets.health` | boolean | `true` | Health / Ionizer switch |
|
|
164
|
-
| `presets.eco` | boolean | `true` | Eco / Mildew Prevention switch |
|
|
165
|
-
| `presets.clean` | boolean | `true` | Self Clean switch |
|
|
166
|
-
| `showComfWind` | boolean | `true` | Comfortable Wind switch |
|
|
167
|
-
| `showDisplay` | boolean | `true` | Display (LED) switch |
|
|
168
213
|
| `showFan` | boolean | `true` | Fan speed slider |
|
|
214
|
+
| `presets.sleep` | boolean | `true` | Sleep Mode switch |
|
|
215
|
+
| `presets.health` | boolean | `false` | Health / Ionizer switch |
|
|
216
|
+
| `presets.eco` | boolean | `false` | Eco / Mildew Prevention switch |
|
|
217
|
+
| `presets.clean` | boolean | `false` | Self Clean switch |
|
|
218
|
+
| `showComfWind` | boolean | `false` | Comfortable Wind switch |
|
|
219
|
+
| `showDisplay` | boolean | `false` | Display (LED) switch |
|
|
220
|
+
|
|
221
|
+
> **Tip:** For a clean HomeKit appearance, enable **Fan** and only one preset mode — **Sleep** is the recommended choice.
|
|
169
222
|
|
|
170
223
|
---
|
|
171
224
|
|
|
@@ -183,14 +236,17 @@ All linked services appear as tiles inside the climate card.
|
|
|
183
236
|
|
|
184
237
|
---
|
|
185
238
|
|
|
186
|
-
##
|
|
239
|
+
## Hybrid vs Local
|
|
187
240
|
|
|
188
|
-
| |
|
|
241
|
+
| | Hybrid | Local Only |
|
|
189
242
|
|---|---|---|
|
|
190
|
-
| Internet required |
|
|
191
|
-
| Setup | Easy
|
|
192
|
-
| Response time | ~1–2 s | ~0.5 s |
|
|
243
|
+
| Internet required | For setup only¹ | No |
|
|
244
|
+
| Setup | Easy — Fetch button auto-fills | Moderate (IP + MAC required) |
|
|
245
|
+
| Response time | ~1–2 s (cloud) / ~0.5 s (local) | ~0.5 s |
|
|
193
246
|
| Works remotely | Yes | No |
|
|
247
|
+
| Local fallback | Yes (when IP + MAC configured) | — |
|
|
248
|
+
|
|
249
|
+
> ¹ **Hybrid + IP/MAC:** if internet is unavailable at startup, the device starts in local-only mode automatically. Full hybrid resumes on the next restart when internet is available.
|
|
194
250
|
|
|
195
251
|
---
|
|
196
252
|
|
|
@@ -203,8 +259,8 @@ All linked services appear as tiles inside the climate card.
|
|
|
203
259
|
- Logging into the AC Freedom app may invalidate the plugin session — restart Homebridge after using the app
|
|
204
260
|
|
|
205
261
|
**Device not found**
|
|
206
|
-
-
|
|
207
|
-
-
|
|
262
|
+
- Leave `endpointId` empty for auto-detection (first discovered device is used)
|
|
263
|
+
- Use the **Fetch** button in the Homebridge UI to discover and auto-fill your device IDs
|
|
208
264
|
|
|
209
265
|
**"Server busy" errors**
|
|
210
266
|
- These are transient and automatically suppressed
|
|
@@ -3,12 +3,15 @@
|
|
|
3
3
|
--accent: #0095c8;
|
|
4
4
|
--accent-light: rgba(0,149,200,0.10);
|
|
5
5
|
--accent-border: rgba(0,149,200,0.28);
|
|
6
|
-
--hybrid: #
|
|
7
|
-
--hybrid-light: rgba(
|
|
8
|
-
--hybrid-border: rgba(
|
|
9
|
-
--
|
|
10
|
-
--
|
|
11
|
-
--
|
|
6
|
+
--hybrid: #16a34a;
|
|
7
|
+
--hybrid-light: rgba(22,163,74,0.08);
|
|
8
|
+
--hybrid-border: rgba(22,163,74,0.22);
|
|
9
|
+
--cloud-badge: #0095c8;
|
|
10
|
+
--cloud-badge-light: rgba(0,149,200,0.08);
|
|
11
|
+
--cloud-badge-border: rgba(0,149,200,0.28);
|
|
12
|
+
--local: #a16207;
|
|
13
|
+
--local-light: rgba(161,98,7,0.08);
|
|
14
|
+
--local-border: rgba(161,98,7,0.25);
|
|
12
15
|
--text: #1a1a2e;
|
|
13
16
|
--text-muted: #6b7280;
|
|
14
17
|
--border: #e5e7eb;
|
|
@@ -22,12 +25,15 @@
|
|
|
22
25
|
--accent: #00b4d8;
|
|
23
26
|
--accent-light: rgba(0,180,216,0.08);
|
|
24
27
|
--accent-border: rgba(0,180,216,0.26);
|
|
25
|
-
--hybrid: #
|
|
26
|
-
--hybrid-light: rgba(
|
|
27
|
-
--hybrid-border: rgba(
|
|
28
|
-
--
|
|
29
|
-
--
|
|
30
|
-
--
|
|
28
|
+
--hybrid: #4ade80;
|
|
29
|
+
--hybrid-light: rgba(74,222,128,0.08);
|
|
30
|
+
--hybrid-border: rgba(74,222,128,0.22);
|
|
31
|
+
--cloud-badge: #00b4d8;
|
|
32
|
+
--cloud-badge-light: rgba(0,180,216,0.08);
|
|
33
|
+
--cloud-badge-border: rgba(0,180,216,0.26);
|
|
34
|
+
--local: #facc15;
|
|
35
|
+
--local-light: rgba(250,204,21,0.08);
|
|
36
|
+
--local-border: rgba(250,204,21,0.22);
|
|
31
37
|
--text: #e2e8f0;
|
|
32
38
|
--text-muted: #94a3b8;
|
|
33
39
|
--border: #334155;
|
|
@@ -102,8 +108,6 @@
|
|
|
102
108
|
border: 1.5px solid var(--accent-border); border-radius: 12px;
|
|
103
109
|
margin-bottom: 12px; background: var(--accent-light); overflow: hidden;
|
|
104
110
|
}
|
|
105
|
-
.device-card.hybrid-card { border-color: var(--hybrid-border); background: var(--hybrid-light); }
|
|
106
|
-
.device-card.local-card { border-color: var(--local-border); background: var(--local-light); }
|
|
107
111
|
|
|
108
112
|
.device-header {
|
|
109
113
|
display: flex; justify-content: space-between; align-items: center;
|
|
@@ -115,14 +119,12 @@
|
|
|
115
119
|
.chevron.open { transform: rotate(90deg); }
|
|
116
120
|
.dev-name { font-size: 14px; font-weight: 700; color: var(--accent);
|
|
117
121
|
white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
118
|
-
.device-card.hybrid-card .dev-name { color: var(--hybrid); }
|
|
119
|
-
.device-card.local-card .dev-name { color: var(--local); }
|
|
120
122
|
|
|
121
123
|
.conn-badge {
|
|
122
124
|
font-size: 10px; font-weight: 700; letter-spacing: .5px;
|
|
123
125
|
padding: 2px 7px; border-radius: 20px; flex-shrink: 0; text-transform: uppercase;
|
|
124
126
|
}
|
|
125
|
-
.conn-badge.cloud { background: var(--
|
|
127
|
+
.conn-badge.cloud { background: var(--cloud-badge-light); color: var(--cloud-badge); border: 1px solid var(--cloud-badge-border); }
|
|
126
128
|
.conn-badge.hybrid { background: var(--hybrid-light); color: var(--hybrid); border: 1px solid var(--hybrid-border); }
|
|
127
129
|
.conn-badge.local { background: var(--local-light); color: var(--local); border: 1px solid var(--local-border); }
|
|
128
130
|
.dev-meta { font-size: 11px; color: var(--text-muted); white-space: nowrap; }
|
|
@@ -131,8 +133,6 @@
|
|
|
131
133
|
padding: 14px 16px 18px;
|
|
132
134
|
border-top: 1px solid var(--accent-border);
|
|
133
135
|
}
|
|
134
|
-
.device-card.hybrid-card .device-body { border-color: var(--hybrid-border); }
|
|
135
|
-
.device-card.local-card .device-body { border-color: var(--local-border); }
|
|
136
136
|
.device-body.collapsed { display: none; }
|
|
137
137
|
|
|
138
138
|
/* ── Connection toggle (segmented) ── */
|
|
@@ -215,19 +215,22 @@
|
|
|
215
215
|
}
|
|
216
216
|
});
|
|
217
217
|
|
|
218
|
-
/* ──
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
218
|
+
/* ── Strings ──────────────────────────────────────────────── */
|
|
219
|
+
const t = {
|
|
220
|
+
deviceName: 'Device Name', connection: 'Connection Mode',
|
|
221
|
+
cloud: 'Cloud', local: 'Local',
|
|
222
|
+
email: 'Email', password: 'Password', region: 'Region',
|
|
223
|
+
ip: 'IP Address', mac: 'MAC Address',
|
|
224
|
+
fan: 'Fan', sleep: 'Sleep', display: 'Display',
|
|
225
|
+
health: 'Health', clean: 'Clean', eco: 'Eco',
|
|
226
|
+
comfWind: 'Comf. Wind',
|
|
227
|
+
tempStep: 'Temperature Step', pollInterval: 'Poll Interval',
|
|
228
|
+
addDevice: 'Add Device', remove: 'Remove',
|
|
229
|
+
hybrid: 'Hybrid', cloudCredentials: 'Cloud Credentials',
|
|
230
|
+
fetching: 'Fetching…', devicesFound: 'devices found',
|
|
231
|
+
fetchFailed: 'Fetch failed', fetch: 'Fetch',
|
|
232
|
+
cloudDevices: 'Cloud Devices', localDevices: 'Local Devices',
|
|
233
|
+
};
|
|
231
234
|
|
|
232
235
|
/* ── Config ───────────────────────────────────────────────── */
|
|
233
236
|
let config = {};
|
|
@@ -289,11 +292,11 @@
|
|
|
289
292
|
<div class="fg" style="margin-bottom:0">
|
|
290
293
|
<label>${t.pollInterval||'Poll Interval'}</label>
|
|
291
294
|
<select class="d-field" data-i="${i}" data-f="pollInterval">
|
|
292
|
-
<option value="5" ${poll==5 ?'selected':''}>5
|
|
293
|
-
<option value="10" ${poll==10?'selected':''}>10
|
|
294
|
-
<option value="20" ${poll==20?'selected':''}>20
|
|
295
|
-
<option value="30" ${poll==30?'selected':''}>30
|
|
296
|
-
<option value="60" ${poll==60?'selected':''}>60
|
|
295
|
+
<option value="5" ${poll==5 ?'selected':''}>5 seconds</option>
|
|
296
|
+
<option value="10" ${poll==10?'selected':''}>10 seconds</option>
|
|
297
|
+
<option value="20" ${poll==20?'selected':''}>20 seconds</option>
|
|
298
|
+
<option value="30" ${poll==30?'selected':''}>30 seconds</option>
|
|
299
|
+
<option value="60" ${poll==60?'selected':''}>60 seconds</option>
|
|
297
300
|
</select>
|
|
298
301
|
</div>
|
|
299
302
|
</div>
|
|
@@ -375,9 +378,9 @@
|
|
|
375
378
|
}
|
|
376
379
|
|
|
377
380
|
/* ── Render local-only device card ───────────────────────── */
|
|
378
|
-
function renderLocalDevice(d, i) {
|
|
381
|
+
function renderLocalDevice(d, i, li) {
|
|
379
382
|
const isOpen = expanded.has(i);
|
|
380
|
-
const name = d.name || `Local #${
|
|
383
|
+
const name = d.name || `Local #${li + 1}`;
|
|
381
384
|
const local = d.local || {};
|
|
382
385
|
const step = d.tempStep !== undefined ? d.tempStep : 0.5;
|
|
383
386
|
const poll = d.pollInterval || 30;
|
|
@@ -390,7 +393,7 @@
|
|
|
390
393
|
<span class="dev-name">${esc(name)}</span>
|
|
391
394
|
</div>
|
|
392
395
|
<div style="display:flex;align-items:center;gap:8px;flex-shrink:0;margin-left:8px">
|
|
393
|
-
<span class="conn-badge
|
|
396
|
+
<span class="conn-badge local">${t.local||'Local'}</span>
|
|
394
397
|
<button class="btn btn-danger btn-sm btn-remove" data-i="${i}">${t.remove||'Remove'}</button>
|
|
395
398
|
</div>
|
|
396
399
|
</div>
|
|
@@ -431,7 +434,8 @@
|
|
|
431
434
|
.filter(({ d }) => d.connection !== 'local');
|
|
432
435
|
const localDevs = config.devices
|
|
433
436
|
.map((d, i) => ({ d, i }))
|
|
434
|
-
.filter(({ d }) => d.connection === 'local')
|
|
437
|
+
.filter(({ d }) => d.connection === 'local')
|
|
438
|
+
.map((item, li) => ({ ...item, li }));
|
|
435
439
|
|
|
436
440
|
app.innerHTML = `
|
|
437
441
|
<!-- Cloud Credentials -->
|
|
@@ -486,7 +490,7 @@
|
|
|
486
490
|
${t.localDevices||'Local Devices'}
|
|
487
491
|
</div>
|
|
488
492
|
<div id="local-device-list">
|
|
489
|
-
${localDevs.map(({ d, i }) => renderLocalDevice(d, i)).join('')}
|
|
493
|
+
${localDevs.map(({ d, i, li }) => renderLocalDevice(d, i, li)).join('')}
|
|
490
494
|
</div>
|
|
491
495
|
<div class="fieldset" style="margin-top:10px">
|
|
492
496
|
<button class="btn btn-primary" id="btn-add-local"
|
package/package.json
CHANGED
package/src/platform.js
CHANGED
|
@@ -141,8 +141,16 @@ class AcFreedomPlatform {
|
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
if (!sharedCloud) {
|
|
144
|
+
// Cloud unavailable — fall back to local if IP+MAC is configured
|
|
145
|
+
if (deviceConfig.local?.ip && deviceConfig.local?.mac) {
|
|
146
|
+
this.log.warn(
|
|
147
|
+
'Hybrid device %s: cloud unavailable — starting in local-only mode at %s',
|
|
148
|
+
deviceConfig.name, deviceConfig.local.ip,
|
|
149
|
+
);
|
|
150
|
+
return this.setupLocalDevice(deviceConfig);
|
|
151
|
+
}
|
|
144
152
|
this.log.error(
|
|
145
|
-
'Hybrid device %s:
|
|
153
|
+
'Hybrid device %s: cloud unavailable and no local IP/MAC configured',
|
|
146
154
|
deviceConfig.name,
|
|
147
155
|
);
|
|
148
156
|
return null;
|
|
@@ -154,6 +162,14 @@ class AcFreedomPlatform {
|
|
|
154
162
|
if (endpointId) {
|
|
155
163
|
cloudDevice = sharedCloud.devices.find(d => d.endpointId === endpointId);
|
|
156
164
|
if (!cloudDevice) {
|
|
165
|
+
// endpointId not found in cloud — fall back to local if available
|
|
166
|
+
if (deviceConfig.local?.ip && deviceConfig.local?.mac) {
|
|
167
|
+
this.log.warn(
|
|
168
|
+
'Hybrid device %s: endpointId "%s" not found in cloud — starting in local-only mode',
|
|
169
|
+
deviceConfig.name, endpointId,
|
|
170
|
+
);
|
|
171
|
+
return this.setupLocalDevice(deviceConfig);
|
|
172
|
+
}
|
|
157
173
|
this.log.error(
|
|
158
174
|
'Hybrid device %s: endpointId "%s" not found among cloud devices',
|
|
159
175
|
deviceConfig.name, endpointId,
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "اسم الجهاز",
|
|
3
|
-
"connection": "الاتصال",
|
|
4
|
-
"cloud": "السحابة",
|
|
5
|
-
"local": "محلي",
|
|
6
|
-
"email": "البريد الإلكتروني",
|
|
7
|
-
"password": "كلمة المرور",
|
|
8
|
-
"region": "المنطقة",
|
|
9
|
-
"ip": "عنوان IP",
|
|
10
|
-
"mac": "عنوان MAC",
|
|
11
|
-
"fan": "مروحة",
|
|
12
|
-
"sleep": "نوم",
|
|
13
|
-
"display": "شاشة",
|
|
14
|
-
"health": "صحة",
|
|
15
|
-
"clean": "تنظيف",
|
|
16
|
-
"eco": "اقتصادي",
|
|
17
|
-
"comfWind": "رياح مريحة",
|
|
18
|
-
"tempStep": "خطوة الحرارة",
|
|
19
|
-
"pollInterval": "فترة الاستطلاع (ثانية)",
|
|
20
|
-
"addDevice": "إضافة جهاز",
|
|
21
|
-
"remove": "إزالة",
|
|
22
|
-
"hybrid": "هجين",
|
|
23
|
-
"cloudCredentials": "بيانات اعتماد السحابة",
|
|
24
|
-
"fetching": "جارٍ الجلب...",
|
|
25
|
-
"devicesFound": "أجهزة تم العثور عليها",
|
|
26
|
-
"fetchFailed": "فشل الجلب",
|
|
27
|
-
"fetch": "جلب",
|
|
28
|
-
"cloudDevices": "أجهزة السحابة",
|
|
29
|
-
"localDevices": "الأجهزة المحلية"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "Gerätename",
|
|
3
|
-
"connection": "Verbindung",
|
|
4
|
-
"cloud": "Cloud",
|
|
5
|
-
"local": "Lokal",
|
|
6
|
-
"email": "E-Mail",
|
|
7
|
-
"password": "Passwort",
|
|
8
|
-
"region": "Region",
|
|
9
|
-
"ip": "IP-Adresse",
|
|
10
|
-
"mac": "MAC-Adresse",
|
|
11
|
-
"fan": "Lüfter",
|
|
12
|
-
"sleep": "Schlaf",
|
|
13
|
-
"display": "Display",
|
|
14
|
-
"health": "Gesundheit",
|
|
15
|
-
"clean": "Reinigung",
|
|
16
|
-
"eco": "Eco",
|
|
17
|
-
"comfWind": "Komfortwind",
|
|
18
|
-
"tempStep": "Temperaturschritt",
|
|
19
|
-
"pollInterval": "Abfrageintervall (Sekunden)",
|
|
20
|
-
"addDevice": "Gerät hinzufügen",
|
|
21
|
-
"remove": "Entfernen",
|
|
22
|
-
"hybrid": "Hybrid",
|
|
23
|
-
"cloudCredentials": "Cloud-Anmeldeinformationen",
|
|
24
|
-
"fetching": "Wird abgerufen...",
|
|
25
|
-
"devicesFound": "Geräte gefunden",
|
|
26
|
-
"fetchFailed": "Abruf fehlgeschlagen",
|
|
27
|
-
"fetch": "Abrufen",
|
|
28
|
-
"cloudDevices": "Cloud-Geräte",
|
|
29
|
-
"localDevices": "Lokale Geräte"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "Device Name",
|
|
3
|
-
"connection": "Connection Mode",
|
|
4
|
-
"cloud": "Cloud",
|
|
5
|
-
"local": "Local",
|
|
6
|
-
"email": "Email",
|
|
7
|
-
"password": "Password",
|
|
8
|
-
"region": "Region",
|
|
9
|
-
"ip": "IP Address",
|
|
10
|
-
"mac": "MAC Address",
|
|
11
|
-
"fan": "Fan",
|
|
12
|
-
"sleep": "Sleep",
|
|
13
|
-
"display": "Display",
|
|
14
|
-
"health": "Health",
|
|
15
|
-
"clean": "Clean",
|
|
16
|
-
"eco": "Eco",
|
|
17
|
-
"comfWind": "Comf. Wind",
|
|
18
|
-
"tempStep": "Temperature Step",
|
|
19
|
-
"pollInterval": "Poll Interval (seconds)",
|
|
20
|
-
"addDevice": "Add Device",
|
|
21
|
-
"remove": "Remove",
|
|
22
|
-
"hybrid": "Hybrid",
|
|
23
|
-
"cloudCredentials": "Cloud Credentials",
|
|
24
|
-
"fetching": "Fetching...",
|
|
25
|
-
"devicesFound": "devices found",
|
|
26
|
-
"fetchFailed": "Fetch failed",
|
|
27
|
-
"fetch": "Fetch",
|
|
28
|
-
"cloudDevices": "Cloud Devices",
|
|
29
|
-
"localDevices": "Local Devices"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "Nombre del dispositivo",
|
|
3
|
-
"connection": "Conexión",
|
|
4
|
-
"cloud": "Nube",
|
|
5
|
-
"local": "Local",
|
|
6
|
-
"email": "Correo electrónico",
|
|
7
|
-
"password": "Contraseña",
|
|
8
|
-
"region": "Región",
|
|
9
|
-
"ip": "Dirección IP",
|
|
10
|
-
"mac": "Dirección MAC",
|
|
11
|
-
"fan": "Ventilador",
|
|
12
|
-
"sleep": "Sueño",
|
|
13
|
-
"display": "Pantalla",
|
|
14
|
-
"health": "Salud",
|
|
15
|
-
"clean": "Limpieza",
|
|
16
|
-
"eco": "Eco",
|
|
17
|
-
"comfWind": "Viento confort",
|
|
18
|
-
"tempStep": "Paso de temperatura",
|
|
19
|
-
"pollInterval": "Intervalo de consulta (segundos)",
|
|
20
|
-
"addDevice": "Agregar dispositivo",
|
|
21
|
-
"remove": "Eliminar",
|
|
22
|
-
"hybrid": "Híbrido",
|
|
23
|
-
"cloudCredentials": "Credenciales de nube",
|
|
24
|
-
"fetching": "Obteniendo...",
|
|
25
|
-
"devicesFound": "dispositivos encontrados",
|
|
26
|
-
"fetchFailed": "Error al obtener",
|
|
27
|
-
"fetch": "Obtener",
|
|
28
|
-
"cloudDevices": "Dispositivos en la nube",
|
|
29
|
-
"localDevices": "Dispositivos locales"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "Nom de l'appareil",
|
|
3
|
-
"connection": "Connexion",
|
|
4
|
-
"cloud": "Cloud",
|
|
5
|
-
"local": "Local",
|
|
6
|
-
"email": "E-mail",
|
|
7
|
-
"password": "Mot de passe",
|
|
8
|
-
"region": "Région",
|
|
9
|
-
"ip": "Adresse IP",
|
|
10
|
-
"mac": "Adresse MAC",
|
|
11
|
-
"fan": "Ventilateur",
|
|
12
|
-
"sleep": "Sommeil",
|
|
13
|
-
"display": "Affichage",
|
|
14
|
-
"health": "Santé",
|
|
15
|
-
"clean": "Nettoyage",
|
|
16
|
-
"eco": "Éco",
|
|
17
|
-
"comfWind": "Vent confort",
|
|
18
|
-
"tempStep": "Pas de température",
|
|
19
|
-
"pollInterval": "Intervalle d'interrogation (secondes)",
|
|
20
|
-
"addDevice": "Ajouter un appareil",
|
|
21
|
-
"remove": "Supprimer",
|
|
22
|
-
"hybrid": "Hybride",
|
|
23
|
-
"cloudCredentials": "Identifiants cloud",
|
|
24
|
-
"fetching": "Récupération...",
|
|
25
|
-
"devicesFound": "appareils trouvés",
|
|
26
|
-
"fetchFailed": "Échec de la récupération",
|
|
27
|
-
"fetch": "Récupérer",
|
|
28
|
-
"cloudDevices": "Appareils cloud",
|
|
29
|
-
"localDevices": "Appareils locaux"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "Nome dispositivo",
|
|
3
|
-
"connection": "Connessione",
|
|
4
|
-
"cloud": "Cloud",
|
|
5
|
-
"local": "Locale",
|
|
6
|
-
"email": "E-mail",
|
|
7
|
-
"password": "Password",
|
|
8
|
-
"region": "Regione",
|
|
9
|
-
"ip": "Indirizzo IP",
|
|
10
|
-
"mac": "Indirizzo MAC",
|
|
11
|
-
"fan": "Ventilatore",
|
|
12
|
-
"sleep": "Sonno",
|
|
13
|
-
"display": "Display",
|
|
14
|
-
"health": "Salute",
|
|
15
|
-
"clean": "Pulizia",
|
|
16
|
-
"eco": "Eco",
|
|
17
|
-
"comfWind": "Vento confort",
|
|
18
|
-
"tempStep": "Passo temperatura",
|
|
19
|
-
"pollInterval": "Intervallo polling (secondi)",
|
|
20
|
-
"addDevice": "Aggiungi dispositivo",
|
|
21
|
-
"remove": "Rimuovi",
|
|
22
|
-
"hybrid": "Ibrido",
|
|
23
|
-
"cloudCredentials": "Credenziali cloud",
|
|
24
|
-
"fetching": "Recupero in corso...",
|
|
25
|
-
"devicesFound": "dispositivi trovati",
|
|
26
|
-
"fetchFailed": "Recupero non riuscito",
|
|
27
|
-
"fetch": "Recupera",
|
|
28
|
-
"cloudDevices": "Dispositivi cloud",
|
|
29
|
-
"localDevices": "Dispositivi locali"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "デバイス名",
|
|
3
|
-
"connection": "接続",
|
|
4
|
-
"cloud": "クラウド",
|
|
5
|
-
"local": "ローカル",
|
|
6
|
-
"email": "メールアドレス",
|
|
7
|
-
"password": "パスワード",
|
|
8
|
-
"region": "リージョン",
|
|
9
|
-
"ip": "IPアドレス",
|
|
10
|
-
"mac": "MACアドレス",
|
|
11
|
-
"fan": "ファン",
|
|
12
|
-
"sleep": "スリープ",
|
|
13
|
-
"display": "ディスプレイ",
|
|
14
|
-
"health": "健康",
|
|
15
|
-
"clean": "クリーン",
|
|
16
|
-
"eco": "エコ",
|
|
17
|
-
"comfWind": "快適風",
|
|
18
|
-
"tempStep": "温度ステップ",
|
|
19
|
-
"pollInterval": "ポーリング間隔(秒)",
|
|
20
|
-
"addDevice": "デバイスを追加",
|
|
21
|
-
"remove": "削除",
|
|
22
|
-
"hybrid": "ハイブリッド",
|
|
23
|
-
"cloudCredentials": "クラウド認証情報",
|
|
24
|
-
"fetching": "取得中...",
|
|
25
|
-
"devicesFound": "台のデバイスが見つかりました",
|
|
26
|
-
"fetchFailed": "取得に失敗しました",
|
|
27
|
-
"fetch": "取得",
|
|
28
|
-
"cloudDevices": "クラウドデバイス",
|
|
29
|
-
"localDevices": "ローカルデバイス"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "기기 이름",
|
|
3
|
-
"connection": "연결",
|
|
4
|
-
"cloud": "클라우드",
|
|
5
|
-
"local": "로컬",
|
|
6
|
-
"email": "이메일",
|
|
7
|
-
"password": "비밀번호",
|
|
8
|
-
"region": "지역",
|
|
9
|
-
"ip": "IP 주소",
|
|
10
|
-
"mac": "MAC 주소",
|
|
11
|
-
"fan": "팬",
|
|
12
|
-
"sleep": "수면",
|
|
13
|
-
"display": "디스플레이",
|
|
14
|
-
"health": "건강",
|
|
15
|
-
"clean": "청소",
|
|
16
|
-
"eco": "에코",
|
|
17
|
-
"comfWind": "쾌적 바람",
|
|
18
|
-
"tempStep": "온도 단계",
|
|
19
|
-
"pollInterval": "폴링 간격 (초)",
|
|
20
|
-
"addDevice": "기기 추가",
|
|
21
|
-
"remove": "제거",
|
|
22
|
-
"hybrid": "하이브리드",
|
|
23
|
-
"cloudCredentials": "클라우드 자격 증명",
|
|
24
|
-
"fetching": "가져오는 중...",
|
|
25
|
-
"devicesFound": "기기 발견됨",
|
|
26
|
-
"fetchFailed": "가져오기 실패",
|
|
27
|
-
"fetch": "가져오기",
|
|
28
|
-
"cloudDevices": "클라우드 기기",
|
|
29
|
-
"localDevices": "로컬 기기"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "Apparaatnaam",
|
|
3
|
-
"connection": "Verbinding",
|
|
4
|
-
"cloud": "Cloud",
|
|
5
|
-
"local": "Lokaal",
|
|
6
|
-
"email": "E-mail",
|
|
7
|
-
"password": "Wachtwoord",
|
|
8
|
-
"region": "Regio",
|
|
9
|
-
"ip": "IP-adres",
|
|
10
|
-
"mac": "MAC-adres",
|
|
11
|
-
"fan": "Ventilator",
|
|
12
|
-
"sleep": "Slaap",
|
|
13
|
-
"display": "Display",
|
|
14
|
-
"health": "Gezondheid",
|
|
15
|
-
"clean": "Reinigen",
|
|
16
|
-
"eco": "Eco",
|
|
17
|
-
"comfWind": "Comfortwind",
|
|
18
|
-
"tempStep": "Temperatuurstap",
|
|
19
|
-
"pollInterval": "Poll-interval (seconden)",
|
|
20
|
-
"addDevice": "Apparaat toevoegen",
|
|
21
|
-
"remove": "Verwijderen",
|
|
22
|
-
"hybrid": "Hybride",
|
|
23
|
-
"cloudCredentials": "Cloudinloggegevens",
|
|
24
|
-
"fetching": "Ophalen...",
|
|
25
|
-
"devicesFound": "apparaten gevonden",
|
|
26
|
-
"fetchFailed": "Ophalen mislukt",
|
|
27
|
-
"fetch": "Ophalen",
|
|
28
|
-
"cloudDevices": "Cloud-apparaten",
|
|
29
|
-
"localDevices": "Lokale apparaten"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "Nazwa urządzenia",
|
|
3
|
-
"connection": "Połączenie",
|
|
4
|
-
"cloud": "Chmura",
|
|
5
|
-
"local": "Lokalny",
|
|
6
|
-
"email": "E-mail",
|
|
7
|
-
"password": "Hasło",
|
|
8
|
-
"region": "Region",
|
|
9
|
-
"ip": "Adres IP",
|
|
10
|
-
"mac": "Adres MAC",
|
|
11
|
-
"fan": "Wentylator",
|
|
12
|
-
"sleep": "Sen",
|
|
13
|
-
"display": "Wyświetlacz",
|
|
14
|
-
"health": "Zdrowie",
|
|
15
|
-
"clean": "Czyszczenie",
|
|
16
|
-
"eco": "Eko",
|
|
17
|
-
"comfWind": "Komfortowy wiatr",
|
|
18
|
-
"tempStep": "Krok temperatury",
|
|
19
|
-
"pollInterval": "Interwał odpytywania (sekundy)",
|
|
20
|
-
"addDevice": "Dodaj urządzenie",
|
|
21
|
-
"remove": "Usuń",
|
|
22
|
-
"hybrid": "Hybrydowy",
|
|
23
|
-
"cloudCredentials": "Dane logowania do chmury",
|
|
24
|
-
"fetching": "Pobieranie...",
|
|
25
|
-
"devicesFound": "urządzeń znaleziono",
|
|
26
|
-
"fetchFailed": "Pobieranie nie powiodło się",
|
|
27
|
-
"fetch": "Pobierz",
|
|
28
|
-
"cloudDevices": "Urządzenia chmurowe",
|
|
29
|
-
"localDevices": "Urządzenia lokalne"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "Nome do dispositivo",
|
|
3
|
-
"connection": "Conexão",
|
|
4
|
-
"cloud": "Nuvem",
|
|
5
|
-
"local": "Local",
|
|
6
|
-
"email": "E-mail",
|
|
7
|
-
"password": "Senha",
|
|
8
|
-
"region": "Região",
|
|
9
|
-
"ip": "Endereço IP",
|
|
10
|
-
"mac": "Endereço MAC",
|
|
11
|
-
"fan": "Ventilador",
|
|
12
|
-
"sleep": "Sono",
|
|
13
|
-
"display": "Display",
|
|
14
|
-
"health": "Saúde",
|
|
15
|
-
"clean": "Limpeza",
|
|
16
|
-
"eco": "Eco",
|
|
17
|
-
"comfWind": "Vento conforto",
|
|
18
|
-
"tempStep": "Passo de temperatura",
|
|
19
|
-
"pollInterval": "Intervalo de consulta (segundos)",
|
|
20
|
-
"addDevice": "Adicionar dispositivo",
|
|
21
|
-
"remove": "Remover",
|
|
22
|
-
"hybrid": "Híbrido",
|
|
23
|
-
"cloudCredentials": "Credenciais da nuvem",
|
|
24
|
-
"fetching": "Buscando...",
|
|
25
|
-
"devicesFound": "dispositivos encontrados",
|
|
26
|
-
"fetchFailed": "Falha ao buscar",
|
|
27
|
-
"fetch": "Buscar",
|
|
28
|
-
"cloudDevices": "Dispositivos na nuvem",
|
|
29
|
-
"localDevices": "Dispositivos locais"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "Имя устройства",
|
|
3
|
-
"connection": "Подключение",
|
|
4
|
-
"cloud": "Облако",
|
|
5
|
-
"local": "Локально",
|
|
6
|
-
"email": "E-mail",
|
|
7
|
-
"password": "Пароль",
|
|
8
|
-
"region": "Регион",
|
|
9
|
-
"ip": "IP-адрес",
|
|
10
|
-
"mac": "MAC-адрес",
|
|
11
|
-
"fan": "Вентилятор",
|
|
12
|
-
"sleep": "Сон",
|
|
13
|
-
"display": "Дисплей",
|
|
14
|
-
"health": "Здоровье",
|
|
15
|
-
"clean": "Очистка",
|
|
16
|
-
"eco": "Эко",
|
|
17
|
-
"comfWind": "Комф. ветер",
|
|
18
|
-
"tempStep": "Шаг температуры",
|
|
19
|
-
"pollInterval": "Интервал опроса (сек)",
|
|
20
|
-
"addDevice": "Добавить устройство",
|
|
21
|
-
"remove": "Удалить",
|
|
22
|
-
"hybrid": "Гибридный",
|
|
23
|
-
"cloudCredentials": "Данные облачного аккаунта",
|
|
24
|
-
"fetching": "Загрузка...",
|
|
25
|
-
"devicesFound": "устройств найдено",
|
|
26
|
-
"fetchFailed": "Не удалось получить",
|
|
27
|
-
"fetch": "Получить",
|
|
28
|
-
"cloudDevices": "Облачные устройства",
|
|
29
|
-
"localDevices": "Локальные устройства"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "Cihaz Adı",
|
|
3
|
-
"connection": "Bağlantı",
|
|
4
|
-
"cloud": "Bulut",
|
|
5
|
-
"local": "Yerel",
|
|
6
|
-
"email": "E-posta",
|
|
7
|
-
"password": "Şifre",
|
|
8
|
-
"region": "Bölge",
|
|
9
|
-
"ip": "IP Adresi",
|
|
10
|
-
"mac": "MAC Adresi",
|
|
11
|
-
"fan": "Fan",
|
|
12
|
-
"sleep": "Uyku",
|
|
13
|
-
"display": "Ekran",
|
|
14
|
-
"health": "Sağlık",
|
|
15
|
-
"clean": "Temizlik",
|
|
16
|
-
"eco": "Eko",
|
|
17
|
-
"comfWind": "Konfor Rüzgarı",
|
|
18
|
-
"tempStep": "Sıcaklık Adımı",
|
|
19
|
-
"pollInterval": "Sorgulama Aralığı (saniye)",
|
|
20
|
-
"addDevice": "Cihaz Ekle",
|
|
21
|
-
"remove": "Kaldır",
|
|
22
|
-
"hybrid": "Hybrid",
|
|
23
|
-
"cloudCredentials": "Bulut Giriş Bilgileri",
|
|
24
|
-
"fetching": "Getiriliyor...",
|
|
25
|
-
"devicesFound": "cihaz bulundu",
|
|
26
|
-
"fetchFailed": "Getirme başarısız",
|
|
27
|
-
"fetch": "Getir",
|
|
28
|
-
"cloudDevices": "Bulut Cihazlar",
|
|
29
|
-
"localDevices": "Yerel Cihazlar"
|
|
30
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"deviceName": "设备名称",
|
|
3
|
-
"connection": "连接方式",
|
|
4
|
-
"cloud": "云端",
|
|
5
|
-
"local": "本地",
|
|
6
|
-
"email": "电子邮件",
|
|
7
|
-
"password": "密码",
|
|
8
|
-
"region": "地区",
|
|
9
|
-
"ip": "IP 地址",
|
|
10
|
-
"mac": "MAC 地址",
|
|
11
|
-
"fan": "风扇",
|
|
12
|
-
"sleep": "睡眠",
|
|
13
|
-
"display": "显示屏",
|
|
14
|
-
"health": "健康",
|
|
15
|
-
"clean": "自清洁",
|
|
16
|
-
"eco": "节能",
|
|
17
|
-
"comfWind": "舒适风",
|
|
18
|
-
"tempStep": "温度步进",
|
|
19
|
-
"pollInterval": "轮询间隔(秒)",
|
|
20
|
-
"addDevice": "添加设备",
|
|
21
|
-
"remove": "删除",
|
|
22
|
-
"hybrid": "混合",
|
|
23
|
-
"cloudCredentials": "云端凭据",
|
|
24
|
-
"fetching": "获取中...",
|
|
25
|
-
"devicesFound": "个设备已找到",
|
|
26
|
-
"fetchFailed": "获取失败",
|
|
27
|
-
"fetch": "获取",
|
|
28
|
-
"cloudDevices": "云端设备",
|
|
29
|
-
"localDevices": "本地设备"
|
|
30
|
-
}
|