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 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 **Cloud** (AUX API) and **Local** (Broadlink UDP) connections — no extra hub required.
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
  [![verified-by-homebridge](https://img.shields.io/badge/homebridge-verified-blueviolet?color=%23491F59&style=flat&logoColor=%23FFFFFF&logo=homebridge)](https://github.com/homebridge/homebridge/wiki/Verified-Plugins)
12
12
  [![npm](https://img.shields.io/npm/v/homebridge-ac-freedom)](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 off
35
- - **Cloud** — AUX Cloud API via AC Freedom app credentials
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
- - **Cloud:** AC Freedom app account (email registration)
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
- ### Cloud Mode
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": "cloud",
94
- "cloud": {
95
- "email": "your-email@example.com",
96
- "password": "your-password",
97
- "region": "eu"
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
- ### Device Options (all modes)
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
- ### Cloud Settings (`cloud` object)
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
- ### Local Settings (`local` object)
192
+ ### Device Options
152
193
 
153
194
  | Option | Type | Required | Default | Description |
154
195
  |--------|------|----------|---------|-------------|
155
- | `ip` | string | Yes | — | AC unit's local IP address |
156
- | `mac` | string | Yes | | AC unit's MAC address (`AA:BB:CC:DD:EE:FF`) |
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
- ## Cloud vs Local
239
+ ## Hybrid vs Local
187
240
 
188
- | | Cloud | Local |
241
+ | | Hybrid | Local Only |
189
242
  |---|---|---|
190
- | Internet required | Yes | No |
191
- | Setup | Easy (email + password) | Moderate (IP + MAC) |
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
- - Cloud: leave `deviceId` empty for auto-detect, or find it in Homebridge logs
207
- - Local: confirm the AC is on your Wi-Fi and the IP/MAC are correct
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: #7c3aed;
7
- --hybrid-light: rgba(124,58,237,0.08);
8
- --hybrid-border: rgba(124,58,237,0.22);
9
- --local: #16a34a;
10
- --local-light: rgba(22,163,74,0.07);
11
- --local-border: rgba(22,163,74,0.22);
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: #a78bfa;
26
- --hybrid-light: rgba(167,139,250,0.08);
27
- --hybrid-border: rgba(167,139,250,0.22);
28
- --local: #4ade80;
29
- --local-light: rgba(74,222,128,0.08);
30
- --local-border: rgba(74,222,128,0.22);
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(--accent-light); color: var(--accent); border: 1px solid var(--accent-border); }
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
- /* ── i18n ─────────────────────────────────────────────────── */
219
- let t = {};
220
- async function loadTranslations() {
221
- let lang = 'en';
222
- try { lang = await homebridge.i18nCurrentLang(); } catch {}
223
- for (const l of [lang, lang.split('-')[0], 'en']) {
224
- try {
225
- const r = await fetch(`./i18n/${l}.json`);
226
- if (r.ok) { t = await r.json(); return; }
227
- } catch {}
228
- }
229
- }
230
- await loadTranslations();
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 s</option>
293
- <option value="10" ${poll==10?'selected':''}>10 s</option>
294
- <option value="20" ${poll==20?'selected':''}>20 s</option>
295
- <option value="30" ${poll==30?'selected':''}>30 s</option>
296
- <option value="60" ${poll==60?'selected':''}>60 s</option>
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 #${i + 1}`;
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 cloud">${t.local||'Local'}</span>
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "homebridge-ac-freedom",
3
- "version": "2.3.2",
3
+ "version": "2.3.4",
4
4
  "displayName": "Homebridge AC Freedom",
5
5
  "description": "Homebridge plugin for AUX air conditioners via Broadlink (local UDP) and AUX Cloud API",
6
6
  "main": "index.js",
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: no cloud credentials configured (add cloud.email/password at platform level)',
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
- }