homebridge-tydom 0.25.0 → 0.26.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/dist/index.js ADDED
@@ -0,0 +1,4502 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ default: () => index_default
34
+ });
35
+ module.exports = __toCommonJS(index_exports);
36
+ var import_register = require("source-map-support/register");
37
+
38
+ // src/config/env.ts
39
+ var PLUGIN_NAME = "homebridge-tydom";
40
+ var PLATFORM_NAME = "Tydom";
41
+ var {
42
+ DEBUG,
43
+ HOMEBRIDGE_TYDOM_PASSWORD,
44
+ HOMEBRIDGE_TYDOM_PIN,
45
+ HOMEBRIDGE_TYDOM_LOCALE = "fr"
46
+ } = process.env;
47
+
48
+ // src/config/hap.ts
49
+ var import_homebridge = require("homebridge");
50
+ var Characteristic;
51
+ var Service;
52
+ var defineHAPGlobals = (homebridge) => {
53
+ Characteristic = homebridge.hap.Characteristic;
54
+ Service = homebridge.hap.Service;
55
+ };
56
+
57
+ // src/controller.ts
58
+ var import_events = require("events");
59
+ var import_homebridge2 = require("homebridge");
60
+ var import_kolorist3 = require("kolorist");
61
+ var import_lodash3 = require("lodash");
62
+
63
+ // src/helpers/tydom.ts
64
+ var import_lodash2 = require("lodash");
65
+
66
+ // src/utils/assert.ts
67
+ var import_assert = require("assert");
68
+ var assert = (value, message) => {
69
+ if (!value) {
70
+ throw new import_assert.AssertionError({ message });
71
+ }
72
+ };
73
+
74
+ // src/utils/basic.ts
75
+ var import_lodash = require("lodash");
76
+ var stringIncludes = (array, value) => array.includes(value) || array.includes(`${value}`);
77
+ var sameArrays = (source, array) => source.length === array.length && (0, import_lodash.xor)(source, array).length === 0;
78
+ var asNumber = (maybeNumber) => parseInt(`${maybeNumber}`, 10);
79
+ var timeouts = /* @__PURE__ */ new Map();
80
+ var waitFor = async (key, ms) => {
81
+ if (timeouts.has(key)) {
82
+ const { timeout, reject } = timeouts.get(key);
83
+ clearTimeout(timeout);
84
+ timeouts.delete(key);
85
+ reject();
86
+ }
87
+ await new Promise((resolve, reject) => {
88
+ const timeout = setTimeout(resolve, ms);
89
+ timeouts.set(key, { timeout, reject });
90
+ });
91
+ timeouts.delete(key);
92
+ };
93
+
94
+ // src/utils/color.ts
95
+ var import_kolorist = require("kolorist");
96
+ var chalkString = (s) => (0, import_kolorist.green)(`'${s}'`);
97
+ var chalkKeyword = (s) => (0, import_kolorist.blue)(`${s}`);
98
+ var chalkJson = (s) => (0, import_kolorist.gray)(JSON.stringify(s));
99
+ var chalkNumber = (n) => (0, import_kolorist.yellow)(`${n}`);
100
+ var chalkVal = (n) => (0, import_kolorist.yellow)(`${n}`);
101
+ var chalkGet = (n) => (0, import_kolorist.bold)((0, import_kolorist.green)(`${n}`));
102
+ var chalkUpd = (n) => (0, import_kolorist.bold)((0, import_kolorist.yellow)(`${n}`));
103
+ var chalkSet = (n) => (0, import_kolorist.bold)((0, import_kolorist.red)(`${n}`));
104
+
105
+ // src/utils/debug.ts
106
+ var import_debug = __toESM(require("debug"));
107
+ var import_kolorist2 = require("kolorist");
108
+ var debug = (0, import_debug.default)("homebridge-tydom");
109
+ var enableDebug = () => {
110
+ import_debug.default.enable("homebridge-tydom");
111
+ };
112
+ var debugGet = (characteristic, { displayName: name, UUID: id }) => {
113
+ debug(
114
+ `${chalkGet("\u2192GET")}:${(0, import_kolorist2.blue)(characteristic.name)} for accessory named=${chalkString(name)} with id=${chalkString(
115
+ id
116
+ )} ...`
117
+ );
118
+ };
119
+ var debugGetResult = (characteristic, { displayName: name, UUID: id }, value) => {
120
+ debug(
121
+ `${chalkGet("\u2190GET")}:${(0, import_kolorist2.blue)(characteristic.name)} value=${chalkVal(value)} for accessory named=${chalkString(
122
+ name
123
+ )} with id=${chalkString(id)} ...`
124
+ );
125
+ };
126
+ var debugSetUpdate = (characteristic, { displayName: name, UUID: id }, value) => {
127
+ debug(
128
+ `${chalkUpd("\u2190UPD")}:${(0, import_kolorist2.blue)(characteristic.name)} value=${chalkVal(value)} for accessory named=${chalkString(
129
+ name
130
+ )} with id=${chalkString(id)}`
131
+ );
132
+ };
133
+ var debugSet = (characteristic, { displayName: name, UUID: id }, value) => {
134
+ debug(
135
+ `${chalkSet("\u2192SET")}:${(0, import_kolorist2.blue)(characteristic.name)} value=${chalkVal(value)} for accessory named=${chalkString(
136
+ name
137
+ )} with id=${chalkString(id)} ...`
138
+ );
139
+ };
140
+ var debugSetResult = (characteristic, { displayName: name, UUID: id }, value, tydomValue) => {
141
+ debug(
142
+ `${chalkSet("\u2190SET")}:${(0, import_kolorist2.blue)(characteristic.name)} value=${chalkVal(value)}${tydomValue !== void 0 ? ` (tydomValue=${chalkVal(tydomValue)})` : ""} for accessory named=${chalkString(name)} with id=${chalkString(id)}`
143
+ );
144
+ };
145
+ var debugTydomPut = (property, { displayName: name, UUID: id }, value) => {
146
+ debug(
147
+ `${chalkSet("\u2192PUT")}:${(0, import_kolorist2.blue)(property)} value=${chalkVal(value)} for accessory named=${chalkString(
148
+ name
149
+ )} with id=${chalkString(id)}`
150
+ );
151
+ };
152
+ var debugAddSubService = (service, { displayName: name, UUID: id }) => {
153
+ debug(
154
+ `Adding new sub service ${chalkKeyword(service.constructor.name)} with name=${chalkString(
155
+ service.displayName
156
+ )}, subtype=${chalkString(service.subtype)} and id="${chalkString(service.UUID)}" for accessory named=${chalkString(
157
+ name
158
+ )} with id=${chalkString(id)}`
159
+ );
160
+ };
161
+
162
+ // src/utils/hash.ts
163
+ var import_crypto = __toESM(require("crypto"));
164
+ var decode = (string) => string ? Buffer.from(string, "base64").toString("ascii") : "";
165
+ var sha256Sync = (data) => {
166
+ const shasum = import_crypto.default.createHash("sha256");
167
+ shasum.update(data);
168
+ return shasum.digest("hex");
169
+ };
170
+
171
+ // src/utils/request.ts
172
+ var import_https = require("https");
173
+ var import_url = require("url");
174
+ var postJson = async (options) => {
175
+ const { url, json, ...otherOptions } = options;
176
+ const { headers: customHeaders = {} } = otherOptions;
177
+ const { hostname, port, protocol, pathname } = new import_url.URL(url);
178
+ const data = JSON.stringify(json);
179
+ const requestOptions = {
180
+ hostname,
181
+ port,
182
+ protocol,
183
+ path: pathname,
184
+ method: "POST",
185
+ headers: {
186
+ "Content-Type": "application/json",
187
+ "Content-Length": data.length,
188
+ ...customHeaders
189
+ }
190
+ };
191
+ return new Promise((resolve, reject) => {
192
+ const req = (0, import_https.request)(requestOptions, (res) => {
193
+ const chunks = [];
194
+ res.on("data", (chunk) => {
195
+ chunks.push(chunk);
196
+ });
197
+ res.on("end", () => {
198
+ resolve({
199
+ statusCode: res.statusCode,
200
+ statusMessage: res.statusMessage,
201
+ headers: res.headers,
202
+ body: chunks.length ? JSON.parse(Buffer.concat(chunks).toString()) : void 0
203
+ });
204
+ });
205
+ });
206
+ req.on("error", reject);
207
+ req.write(data);
208
+ req.end();
209
+ });
210
+ };
211
+
212
+ // src/helpers/tydom.ts
213
+ var import_url2 = require("url");
214
+ var cacheMap = /* @__PURE__ */ new Map();
215
+ var DEBOUNCE_TIME = 1 * 1e3;
216
+ var getTydomDeviceData = async (client, { deviceId, endpointId }) => {
217
+ const now = Date.now();
218
+ const uri = `/devices/${deviceId}/endpoints/${endpointId}/data`;
219
+ if (cacheMap.has(uri)) {
220
+ const { time, promise: promise2 } = cacheMap.get(uri);
221
+ if (now < time + DEBOUNCE_TIME) {
222
+ return promise2;
223
+ }
224
+ }
225
+ const promise = client.get(uri).then((res) => {
226
+ if (res.error > 0) {
227
+ debug(`Received non-zero error=${chalkNumber(res.error)} while querying uri=${chalkString(uri)}`);
228
+ if (res.error > 10) {
229
+ debug(`Accessory with uri=${chalkString(uri)} seems unreacheable (error=${chalkNumber(res.error)}).`);
230
+ throw new Error("UnreacheableAccessory");
231
+ } else {
232
+ debug(
233
+ `Accessory with uri=${chalkString(uri)} is reporting unknown issues (error=${chalkNumber(res.error)}).`
234
+ );
235
+ }
236
+ }
237
+ return res.data ? res.data : res;
238
+ });
239
+ cacheMap.set(uri, { time: now, promise });
240
+ return promise;
241
+ };
242
+ var runTydomDeviceCommand = async (client, name, { deviceId, endpointId, searchParams }) => {
243
+ const now = Date.now();
244
+ const uri = `/devices/${deviceId}/endpoints/${endpointId}/cdata?name=${name}${searchParams ? `&${new import_url2.URLSearchParams(searchParams).toString()}` : ""}`;
245
+ if (cacheMap.has(uri)) {
246
+ const { time, promise: promise2 } = cacheMap.get(uri);
247
+ if (now < time + DEBOUNCE_TIME) {
248
+ return promise2;
249
+ }
250
+ }
251
+ const promise = client.command(uri);
252
+ cacheMap.set(uri, { time: now, promise });
253
+ return promise;
254
+ };
255
+ var getTydomDataPropValue = (data, name) => {
256
+ const item = data.find((prop) => prop.name === name);
257
+ assert(item, `Missing property with name="${name}" in endpoint data`);
258
+ return item.value;
259
+ };
260
+ var getEndpointDetailsFromMeta = ({ id_endpoint: endpointId, id_device: deviceId }, meta) => {
261
+ const device = (0, import_lodash2.find)(meta, { id: deviceId });
262
+ assert(device, `Device with id="${deviceId}" not found in Tydom meta`);
263
+ const details = (0, import_lodash2.find)(device.endpoints, { id: endpointId });
264
+ assert(details, `Endpoint with id="${endpointId}" not found in device with id="${deviceId}" meta`);
265
+ return details;
266
+ };
267
+ var getEndpointGroupIdFromGroups = ({ id_endpoint: endpointId, id_device: deviceId }, groups) => {
268
+ const group = groups.groups.find(
269
+ ({ devices }) => devices.some(({ id, endpoints }) => id === deviceId && endpoints.some(({ id: id2 }) => id2 === endpointId))
270
+ );
271
+ return group ? group.id : null;
272
+ };
273
+ var getEndpointSignatureFromMetadata = (metadata) => metadata.map((value) => value.name).sort().join("|");
274
+ var LEGACY_SUPPORTED_CATEGORIES_MAP = {
275
+ alarm: import_homebridge.Categories.SECURITY_SYSTEM,
276
+ awning: import_homebridge.Categories.WINDOW_COVERING,
277
+ belmDoor: import_homebridge.Categories.DOOR,
278
+ gate: import_homebridge.Categories.GARAGE_DOOR_OPENER,
279
+ garage_door: import_homebridge.Categories.GARAGE_DOOR_OPENER,
280
+ hvac: import_homebridge.Categories.THERMOSTAT,
281
+ light: import_homebridge.Categories.LIGHTBULB,
282
+ shutter: import_homebridge.Categories.WINDOW_COVERING,
283
+ window: import_homebridge.Categories.WINDOW,
284
+ plug: import_homebridge.Categories.OUTLET
285
+ };
286
+ var ENDPOINTS_SIGNATURES_CATEGORIES = {
287
+ "alarm:0c6e1d33808fa50a0a921502f80d36430dfaeda5abfed2467f9f2b07821e4842": import_homebridge.Categories.SECURITY_SYSTEM,
288
+ // @maaxleop
289
+ "alarm:6e33f7ee5e62b58f4e888c91a13fd9b9d868f3751cead5ea1252578ba86523a5": [
290
+ import_homebridge.Categories.SECURITY_SYSTEM,
291
+ { legacy: true }
292
+ ],
293
+ // @StephanH27.1521931577 (CTX60) #50
294
+ "alarm:aad768ee0367013a974276117fd5ed4834cc26e4d31acc88d35134731331b0e7": import_homebridge.Categories.SECURITY_SYSTEM,
295
+ // @mgcrea.1521931577 (TYXAL+)
296
+ "awning:48f43ebab20eba438fa9cc2b6ce44311d3cfb01c5be84bf17599d9c152c348d3": import_homebridge.Categories.WINDOW_COVERING,
297
+ // @baschte_(TYXIA 5731)
298
+ "belmDoor:fb935867933d89b3058f09384f76fd63f3defb18cfb3172f60fa9f4f237f748b": import_homebridge.Categories.DOOR,
299
+ // @mgcrea (MDO)
300
+ "conso:16804a9994bce28275150db329a9c0b931ef7f20608c1a3d2ff248f58569f0d3": import_homebridge.Categories.SENSOR,
301
+ // @maaxleop (STE 2000)
302
+ "garage_door:83b0912c6fe14622219522922ea0347dcbf86bf9cfd3346a2eca8eac70ca8260": import_homebridge.Categories.GARAGE_DOOR_OPENER,
303
+ // @Benzoiiit (TYXIA 4620)
304
+ "gate:83b0912c6fe14622219522922ea0347dcbf86bf9cfd3346a2eca8eac70ca8260": import_homebridge.Categories.GARAGE_DOOR_OPENER,
305
+ // @mgcrea (TYXIA 4620)
306
+ "hvac:16804a9994bce28275150db329a9c0b931ef7f20608c1a3d2ff248f58569f0d3": import_homebridge.Categories.SENSOR,
307
+ // @D-Roch+@tanabay27 (Sonde TYBOX 2020 Wt)
308
+ "hvac:17f933bec8ed29f9b2a2cd5280fb5b64806cf8a1c064c83950e350f491d7cb9f": import_homebridge.Categories.THERMOSTAT,
309
+ // @Armen85 (RF6600FP) @FIXME
310
+ "hvac:1bab47d1dd7e898b5dc2e9867b14dfb8bc9272c4cb0b5d1221da962d43a6ffb4": import_homebridge.Categories.THERMOSTAT,
311
+ // @mgcrea (RF4890)
312
+ "light:449e2a60377094cde10224cee91d378fb0ae373ae6ceea0ac2cbc1ed011bffa7": import_homebridge.Categories.LIGHTBULB,
313
+ // @mgcrea (TYXIA 5610, TYXIA 6610)
314
+ "light:fce45085835f4f2790ea3b17d208b5ace34935444d2535e75ba3f0a2ce86de5f": import_homebridge.Categories.LIGHTBULB,
315
+ // @mgcrea (TYXIA 5650)
316
+ "others:449e2a60377094cde10224cee91d378fb0ae373ae6ceea0ac2cbc1ed011bffa7": import_homebridge.Categories.LIGHTBULB,
317
+ // @diegomarino (TYXIA 4600)
318
+ "plug:2534c497ff8fb013a88da28d341adff5bc0ba77e1fc8ea8dcb8b8f1c9d62ce19": import_homebridge.Categories.OUTLET,
319
+ // @Neo33ASM (Easy Plug)
320
+ "shutter:c3fe8e2afa864e1a7a5c6676b4287a7b2f2a886a466baec3df8a1ec4f898ad6c": import_homebridge.Categories.WINDOW_COVERING,
321
+ // @maaxleop
322
+ "window:fb935867933d89b3058f09384f76fd63f3defb18cfb3172f60fa9f4f237f748b": import_homebridge.Categories.WINDOW,
323
+ // @mgcrea (MDO)
324
+ "sensor:556f8aaf51e3807397b7e326d0aad4b61cceb8279166b50204f8a2e95464c9ba": [
325
+ import_homebridge.Categories.SENSOR,
326
+ { smokeDetector: true }
327
+ ]
328
+ // DFR TYXAL+
329
+ };
330
+ var resolveEndpointCategory = ({
331
+ firstUsage,
332
+ metadata,
333
+ settings
334
+ }) => {
335
+ const metaSignature = getEndpointSignatureFromMetadata(metadata);
336
+ const hash = `${firstUsage}:${sha256Sync(metaSignature)}`;
337
+ const category = ENDPOINTS_SIGNATURES_CATEGORIES[hash];
338
+ if (category) {
339
+ if (Array.isArray(category)) {
340
+ const [_category, overrides] = category;
341
+ Object.assign(settings, overrides);
342
+ return _category;
343
+ }
344
+ return category;
345
+ }
346
+ debug(`Unknown hash=${hash} with firstUsage="${firstUsage}"`);
347
+ if (LEGACY_SUPPORTED_CATEGORIES_MAP[firstUsage]) {
348
+ return LEGACY_SUPPORTED_CATEGORIES_MAP[firstUsage];
349
+ }
350
+ return null;
351
+ };
352
+ var asyncWait = (ms) => new Promise((resolve) => {
353
+ setTimeout(resolve, ms);
354
+ });
355
+
356
+ // src/utils/error.ts
357
+ var errorReplacer = (key, value) => {
358
+ if (value instanceof Error) {
359
+ return {
360
+ name: value.name,
361
+ message: value.message,
362
+ stack: value.stack
363
+ };
364
+ }
365
+ return `${value}`;
366
+ };
367
+ var stringifyError = (err) => JSON.stringify(err, errorReplacer);
368
+
369
+ // src/controller.ts
370
+ var import_tydom_client = require("tydom-client");
371
+ var DEFAULT_REFRESH_INTERVAL_SEC = 4 * 60 * 60;
372
+ var TydomController = class extends import_events.EventEmitter {
373
+ client;
374
+ config;
375
+ log;
376
+ devices = /* @__PURE__ */ new Map();
377
+ state = /* @__PURE__ */ new Map();
378
+ refreshInterval;
379
+ constructor(log, config) {
380
+ super();
381
+ this.config = config;
382
+ this.log = log;
383
+ const { hostname, username, password: configPassword } = config;
384
+ assert(hostname, 'Missing "hostname" config field for platform');
385
+ assert(username, 'Missing "username" config field for platform');
386
+ const password = HOMEBRIDGE_TYDOM_PASSWORD ? decode(HOMEBRIDGE_TYDOM_PASSWORD) : configPassword;
387
+ assert(password, 'Missing "password" config field for platform');
388
+ this.log.info(
389
+ `Creating tydom client with username=${chalkString(username)} and hostname=${chalkString(hostname)}`
390
+ );
391
+ this.client = (0, import_tydom_client.createClient)({ username, password, hostname, followUpDebounce: 500 });
392
+ this.client.on("message", (message) => {
393
+ try {
394
+ this.handleMessage(message);
395
+ } catch (err) {
396
+ this.log.error(
397
+ `Encountered an uncaught error=${stringifyError(err)} while processing message=${chalkJson(message)}"`
398
+ );
399
+ }
400
+ });
401
+ this.client.on("connect", () => {
402
+ this.log.info(
403
+ `Successfully connected to Tydom hostname=${chalkString(hostname)} with username=${chalkString(username)}`
404
+ );
405
+ this.emit("connect");
406
+ });
407
+ this.client.on("disconnect", () => {
408
+ this.log.warn(`Disconnected from Tydom hostname=${chalkString(hostname)}"`);
409
+ this.emit("disconnect");
410
+ });
411
+ }
412
+ getUniqueId(deviceId, endpointId) {
413
+ return deviceId === endpointId ? `${deviceId}` : `${deviceId}:${endpointId}`;
414
+ }
415
+ getAccessoryId(deviceId, endpointId) {
416
+ const { username } = this.config;
417
+ return `tydom:${username.slice(6)}:accessories:${this.getUniqueId(deviceId, endpointId)}`;
418
+ }
419
+ async connect() {
420
+ const { hostname, username } = this.config;
421
+ debug(`Connecting to hostname=${chalkString(hostname)}...`);
422
+ try {
423
+ await this.client.connect();
424
+ await asyncWait(250);
425
+ await this.client.get("/ping");
426
+ } catch (err) {
427
+ this.log.error(`Failed to connect to Tydom hostname=${hostname} with username="${username}"`);
428
+ throw err;
429
+ }
430
+ }
431
+ async sync() {
432
+ const { hostname, refreshInterval = DEFAULT_REFRESH_INTERVAL_SEC } = this.config;
433
+ debug(`Syncing state from hostname=${chalkString(hostname)}...`);
434
+ const config = await this.client.get("/configs/file");
435
+ const groups = await this.client.get("/groups/file");
436
+ const meta = await this.client.get("/devices/meta");
437
+ await this.refresh();
438
+ if (this.refreshInterval) {
439
+ debug(`Removing existing refresh interval`);
440
+ clearInterval(this.refreshInterval);
441
+ }
442
+ debug(`Configuring refresh interval of ${chalkNumber(Math.round(refreshInterval))}s`);
443
+ this.refreshInterval = setInterval(async () => {
444
+ try {
445
+ await this.refresh();
446
+ } catch (err) {
447
+ debug(`Failed interval refresh with err ${err}`);
448
+ }
449
+ }, refreshInterval * 1e3);
450
+ Object.assign(this.state, { config, groups, meta });
451
+ return { config, groups, meta };
452
+ }
453
+ async scan() {
454
+ const { hostname } = this.config;
455
+ this.log.info(`Scaning devices from hostname=${chalkString(hostname)}...`);
456
+ const {
457
+ settings,
458
+ includedDevices = [],
459
+ excludedDevices = [],
460
+ includedCategories = [],
461
+ excludedCategories = []
462
+ } = this.config;
463
+ const { config, groups, meta } = await this.sync();
464
+ const { endpoints, groups: configGroups } = config;
465
+ endpoints.forEach((endpoint) => {
466
+ const {
467
+ id_endpoint: endpointId,
468
+ id_device: deviceId,
469
+ name: deviceName,
470
+ first_usage: firstUsage
471
+ } = endpoint;
472
+ const uniqueId = this.getUniqueId(deviceId, endpointId);
473
+ const { metadata } = getEndpointDetailsFromMeta(endpoint, meta);
474
+ const groupId = getEndpointGroupIdFromGroups(endpoint, groups);
475
+ const group = groupId ? configGroups.find(({ id }) => id === groupId) : void 0;
476
+ const deviceSettings = settings[deviceId] || {};
477
+ const categoryFromSettings = deviceSettings.category;
478
+ this.log.info(
479
+ `Found new device with firstUsage=${chalkString(firstUsage)}, deviceId=${chalkNumber(
480
+ deviceId
481
+ )} and endpointId=${chalkNumber(endpointId)}`
482
+ );
483
+ if (includedDevices.length && !stringIncludes(includedDevices, deviceId)) {
484
+ return;
485
+ }
486
+ if (excludedDevices.length && stringIncludes(excludedDevices, deviceId)) {
487
+ return;
488
+ }
489
+ if (categoryFromSettings) {
490
+ this.log.info(
491
+ `Using overriden category=${chalkNumber(categoryFromSettings)} from settings for deviceId=${chalkNumber(
492
+ deviceId
493
+ )} and endpointId=${chalkNumber(endpointId)}`
494
+ );
495
+ }
496
+ const category = categoryFromSettings ?? resolveEndpointCategory({ firstUsage, metadata, settings: deviceSettings });
497
+ if (!category) {
498
+ this.log.warn(`Unsupported firstUsage="${firstUsage}" for endpoint with deviceId="${deviceId}"`);
499
+ debug({ endpoint });
500
+ return;
501
+ }
502
+ if (includedCategories.length && !stringIncludes(includedCategories, category)) {
503
+ return;
504
+ }
505
+ if (excludedCategories.length && stringIncludes(excludedCategories, category)) {
506
+ return;
507
+ }
508
+ if (!this.devices.has(uniqueId)) {
509
+ this.log.info(
510
+ `Adding new device with firstUsage=${chalkString(firstUsage)}, deviceId=${chalkNumber(
511
+ deviceId
512
+ )} and endpointId=${chalkNumber(endpointId)}`
513
+ );
514
+ const accessoryId = this.getAccessoryId(deviceId, endpointId);
515
+ const nameFromSetting = (0, import_lodash3.get)(settings, `${deviceId}.name`);
516
+ const name = nameFromSetting ?? deviceName;
517
+ this.devices.set(uniqueId, category);
518
+ const context = {
519
+ name,
520
+ category,
521
+ metadata,
522
+ settings: deviceSettings,
523
+ group,
524
+ deviceId,
525
+ endpointId,
526
+ accessoryId,
527
+ manufacturer: "Delta Dore",
528
+ serialNumber: `ID${deviceId}`,
529
+ // model: 'N/A',
530
+ state: {}
531
+ };
532
+ this.emit("device", context);
533
+ }
534
+ });
535
+ }
536
+ async refresh() {
537
+ debug(`Refreshing Tydom controller ...`);
538
+ await this.client.post("/refresh/all");
539
+ }
540
+ handleMessage(message) {
541
+ const { uri, method, body } = message;
542
+ const isDeviceUpdate = uri === "/devices/data" && method === "PUT";
543
+ if (isDeviceUpdate) {
544
+ this.handleDeviceDataUpdate(body, "data");
545
+ return;
546
+ }
547
+ const isDeviceCommandUpdate = uri === "/devices/cdata" && method === "PUT";
548
+ if (isDeviceCommandUpdate) {
549
+ this.handleDeviceDataUpdate(body, "cdata");
550
+ return;
551
+ }
552
+ debug(`Unkown message from Tydom client:
553
+ ${chalkJson(message)}`);
554
+ }
555
+ handleDeviceDataUpdate(body, type) {
556
+ if (!Array.isArray(body)) {
557
+ debug("Unsupported non-array device update", body);
558
+ return;
559
+ }
560
+ body.forEach((device) => {
561
+ const { id: deviceId, endpoints } = device;
562
+ for (const endpoint of endpoints) {
563
+ const { id: endpointId, data, cdata } = endpoint;
564
+ const updates = type === "data" ? data : cdata;
565
+ const uniqueId = this.getUniqueId(deviceId, endpointId);
566
+ if (!this.devices.has(uniqueId)) {
567
+ debug(
568
+ `${(0, import_kolorist3.bold)((0, import_kolorist3.yellow)("\u2190PUT"))}:${(0, import_kolorist3.blue)("ignored")} for device id=${chalkString(
569
+ deviceId
570
+ )} and endpointId=${chalkNumber(endpointId)}`
571
+ );
572
+ return;
573
+ }
574
+ const category = this.devices.get(uniqueId) ?? import_homebridge2.Categories.OTHER;
575
+ const accessoryId = this.getAccessoryId(deviceId, endpointId);
576
+ debug(
577
+ `${(0, import_kolorist3.bold)((0, import_kolorist3.green)("\u2190PUT"))}:${(0, import_kolorist3.blue)("update")} for deviceId=${chalkNumber(deviceId)} and endpointId=${chalkNumber(
578
+ endpointId
579
+ )}, updates:
580
+ ${chalkJson(updates)}`
581
+ );
582
+ const context = {
583
+ category,
584
+ deviceId,
585
+ endpointId,
586
+ accessoryId
587
+ };
588
+ this.emit("update", {
589
+ type,
590
+ updates,
591
+ context
592
+ });
593
+ }
594
+ });
595
+ }
596
+ };
597
+
598
+ // src/accessories/contactSensor.ts
599
+ var setupContactSensor = (accessory, controller) => {
600
+ const { context } = accessory;
601
+ const { client } = controller;
602
+ const { ContactSensorState } = Characteristic;
603
+ const { deviceId, endpointId } = context;
604
+ setupAccessoryInformationService(accessory, controller);
605
+ setupAccessoryIdentifyHandler(accessory, controller);
606
+ const service = addAccessoryService(accessory, Service.ContactSensor, accessory.displayName, true);
607
+ service.getCharacteristic(ContactSensorState).onGet(async () => {
608
+ debugGet(ContactSensorState, service);
609
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
610
+ const intrusionDetect = getTydomDataPropValue(data, "intrusionDetect");
611
+ debugGetResult(ContactSensorState, service, intrusionDetect);
612
+ return intrusionDetect;
613
+ });
614
+ };
615
+ var updateContactSensor = (accessory, _controller, updates) => {
616
+ updates.forEach((update) => {
617
+ const { name, value } = update;
618
+ const { ContactSensorState } = Characteristic;
619
+ switch (name) {
620
+ case "intrusionDetect": {
621
+ const service = getAccessoryService(accessory, Service.ContactSensor);
622
+ debugSetUpdate(ContactSensorState, service, value);
623
+ service.updateCharacteristic(ContactSensorState, value);
624
+ return;
625
+ }
626
+ default:
627
+ return;
628
+ }
629
+ });
630
+ };
631
+
632
+ // src/accessories/services/switchableService.ts
633
+ var addAccessorySwitchableService = (accessory, controller, serviceClass) => {
634
+ const { context } = accessory;
635
+ const { client } = controller;
636
+ const { On } = Characteristic;
637
+ const { deviceId, endpointId } = context;
638
+ const service = addAccessoryService(accessory, serviceClass, accessory.displayName, true);
639
+ service.getCharacteristic(On).onGet(async () => {
640
+ debugGet(On, service);
641
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
642
+ const level = getTydomDataPropValue(data, "level");
643
+ const nextValue = level === 100;
644
+ debugGetResult(On, service, nextValue);
645
+ return nextValue;
646
+ }).onSet(async (value) => {
647
+ debugSet(On, service, value);
648
+ const tydomValue = value ? 100 : 0;
649
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
650
+ {
651
+ name: "level",
652
+ value: tydomValue
653
+ }
654
+ ]);
655
+ debugSetResult(On, service, value, tydomValue);
656
+ });
657
+ return service;
658
+ };
659
+ var updateAccessorySwitchableService = (accessory, _controller, updates, ServiceClass2) => {
660
+ updates.forEach((update) => {
661
+ const { name, value } = update;
662
+ const { On } = Characteristic;
663
+ switch (name) {
664
+ case "level": {
665
+ const service = getAccessoryService(accessory, ServiceClass2);
666
+ const nextValue = value === 100;
667
+ debugSetUpdate(On, service, nextValue);
668
+ service.updateCharacteristic(On, nextValue);
669
+ return;
670
+ }
671
+ default:
672
+ return;
673
+ }
674
+ });
675
+ };
676
+
677
+ // src/accessories/fan.ts
678
+ var setupFan = (accessory, controller) => {
679
+ setupAccessoryInformationService(accessory, controller);
680
+ setupAccessoryIdentifyHandler(accessory, controller);
681
+ addAccessorySwitchableService(accessory, controller, Service.Fan);
682
+ };
683
+ var updateFan = (accessory, controller, updates) => {
684
+ updateAccessorySwitchableService(accessory, controller, updates, Service.Fan);
685
+ };
686
+
687
+ // src/accessories/garageDoorOpener.ts
688
+ var import_debug4 = __toESM(require("debug"));
689
+ var DEFAULT_GARAGE_DOOR_DELAY = 20 * 1e3;
690
+ var getTydomCurrentDoorState = async (client, deviceId, endpointId) => {
691
+ const { CurrentDoorState } = Characteristic;
692
+ const tydomDeviceData = await getTydomDeviceData(client, {
693
+ deviceId,
694
+ endpointId
695
+ });
696
+ const tydomDeviceLevel = getTydomDataPropValue(tydomDeviceData, "level") || 0;
697
+ let currentDoorState = CurrentDoorState.CLOSED;
698
+ if (tydomDeviceLevel === 0) {
699
+ currentDoorState = CurrentDoorState.CLOSED;
700
+ } else if (tydomDeviceLevel === 100) {
701
+ currentDoorState = CurrentDoorState.OPEN;
702
+ } else if (tydomDeviceLevel > 0 && tydomDeviceLevel < 100) {
703
+ (0, import_debug4.default)(`Encountered a ${chalkString("level")} update with value different from 0 or 100 !`);
704
+ }
705
+ return currentDoorState;
706
+ };
707
+ var setupGarageDoorOpener = (accessory, controller) => {
708
+ const { context } = accessory;
709
+ const { client } = controller;
710
+ const { CurrentDoorState, TargetDoorState } = Characteristic;
711
+ const { deviceId, endpointId, state, settings, metadata } = context;
712
+ const levelCmdValues = metadata.find((m) => m.name === "levelCmd")?.enum_values;
713
+ const IS_TOGGLE_ONLY = levelCmdValues?.length === 1 && levelCmdValues[0] === "TOGGLE";
714
+ const { delay: garageDoorDelay = DEFAULT_GARAGE_DOOR_DELAY, autoCloseDelay } = settings;
715
+ const assignState = (update) => {
716
+ Object.assign(state, update);
717
+ };
718
+ const getDoorStateLabel = (currentDoorState) => {
719
+ switch (currentDoorState) {
720
+ case CurrentDoorState.OPEN:
721
+ return "OPEN";
722
+ case CurrentDoorState.CLOSED:
723
+ return "CLOSED";
724
+ case CurrentDoorState.OPENING:
725
+ return "OPENING";
726
+ case CurrentDoorState.CLOSING:
727
+ return "CLOSING";
728
+ case CurrentDoorState.STOPPED:
729
+ return "STOPPED";
730
+ }
731
+ return "UNKNOWN";
732
+ };
733
+ const getLevelCmdForCurrentDoorState = (targetDoorState) => {
734
+ switch (state.currentDoorState) {
735
+ case CurrentDoorState.OPEN:
736
+ switch (targetDoorState) {
737
+ case TargetDoorState.CLOSED:
738
+ return "OFF";
739
+ case TargetDoorState.OPEN:
740
+ return "ON";
741
+ }
742
+ break;
743
+ case CurrentDoorState.CLOSED:
744
+ switch (targetDoorState) {
745
+ case TargetDoorState.CLOSED:
746
+ return "OFF";
747
+ case TargetDoorState.OPEN:
748
+ return "ON";
749
+ }
750
+ break;
751
+ case CurrentDoorState.OPENING:
752
+ case CurrentDoorState.CLOSING:
753
+ return "STOP";
754
+ case CurrentDoorState.STOPPED:
755
+ switch (targetDoorState) {
756
+ case TargetDoorState.CLOSED:
757
+ return "OFF";
758
+ case TargetDoorState.OPEN:
759
+ return "ON";
760
+ }
761
+ break;
762
+ }
763
+ return "UNKNOWN";
764
+ };
765
+ const assignCurrentDoorState = (currentDoorState) => {
766
+ (0, import_debug4.default)(`assignCurrentDoorState=${chalkString(getDoorStateLabel(currentDoorState))}`);
767
+ Object.assign(state, { currentDoorState });
768
+ service.updateCharacteristic(CurrentDoorState, currentDoorState);
769
+ };
770
+ const toggleGarageDoor = async (targetDoorState) => {
771
+ const cmdValue = IS_TOGGLE_ONLY ? "TOGGLE" : getLevelCmdForCurrentDoorState(targetDoorState);
772
+ (0, import_debug4.default)(`sending levelCmd=${cmdValue} for GarageDoor with deviceId:${deviceId}`);
773
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
774
+ {
775
+ name: "levelCmd",
776
+ value: cmdValue
777
+ }
778
+ ]);
779
+ };
780
+ setupAccessoryInformationService(accessory, controller);
781
+ setupAccessoryIdentifyHandler(accessory, controller);
782
+ assignState({
783
+ currentDoorState: CurrentDoorState.CLOSED,
784
+ targetDoorState: TargetDoorState.CLOSED,
785
+ lastUpdatedAt: 0,
786
+ computedPosition: 0
787
+ // 0 <-> 100%
788
+ });
789
+ const getNextCurrentDoorState = (targetDoorState) => {
790
+ switch (state.currentDoorState) {
791
+ case CurrentDoorState.OPEN: {
792
+ switch (targetDoorState) {
793
+ case TargetDoorState.CLOSED:
794
+ return CurrentDoorState.CLOSING;
795
+ case TargetDoorState.OPEN:
796
+ return CurrentDoorState.OPEN;
797
+ }
798
+ break;
799
+ }
800
+ case CurrentDoorState.CLOSED: {
801
+ switch (targetDoorState) {
802
+ case TargetDoorState.CLOSED:
803
+ return CurrentDoorState.CLOSED;
804
+ case TargetDoorState.OPEN:
805
+ return CurrentDoorState.OPENING;
806
+ }
807
+ break;
808
+ }
809
+ case CurrentDoorState.CLOSING:
810
+ case CurrentDoorState.OPENING: {
811
+ return CurrentDoorState.STOPPED;
812
+ }
813
+ case CurrentDoorState.STOPPED: {
814
+ switch (targetDoorState) {
815
+ case TargetDoorState.CLOSED:
816
+ return CurrentDoorState.CLOSING;
817
+ case TargetDoorState.OPEN:
818
+ return CurrentDoorState.OPENING;
819
+ }
820
+ break;
821
+ }
822
+ }
823
+ return CurrentDoorState.CLOSED;
824
+ };
825
+ const computeCurrentPosition = () => {
826
+ const { lastUpdatedAt, computedPosition: lastComputedPosition, currentDoorState } = state;
827
+ const elapsed = Date.now() - lastUpdatedAt;
828
+ switch (currentDoorState) {
829
+ case CurrentDoorState.STOPPED: {
830
+ return lastComputedPosition;
831
+ }
832
+ case CurrentDoorState.OPEN: {
833
+ return 100;
834
+ }
835
+ case CurrentDoorState.CLOSED: {
836
+ return 0;
837
+ }
838
+ case CurrentDoorState.OPENING: {
839
+ return Math.min(100, lastComputedPosition + 100 * (elapsed / garageDoorDelay));
840
+ }
841
+ case CurrentDoorState.CLOSING: {
842
+ return Math.max(0, lastComputedPosition - 100 * (elapsed / garageDoorDelay));
843
+ }
844
+ }
845
+ return 0;
846
+ };
847
+ const legacyService = accessory.getService(Service.Switch);
848
+ if (legacyService) {
849
+ accessory.removeService(legacyService);
850
+ }
851
+ const service = addAccessoryService(accessory, Service.GarageDoorOpener, accessory.displayName, true);
852
+ service.getCharacteristic(CurrentDoorState).onGet(async () => {
853
+ debugGet(CurrentDoorState, service);
854
+ if (IS_TOGGLE_ONLY) {
855
+ const currentDoorState2 = state.currentDoorState;
856
+ debugGetResult(CurrentDoorState, service, currentDoorState2);
857
+ return currentDoorState2;
858
+ }
859
+ const currentDoorState = await getTydomCurrentDoorState(client, deviceId, endpointId);
860
+ debugGetResult(CurrentDoorState, service, currentDoorState);
861
+ assignState({
862
+ currentDoorState,
863
+ lastUpdatedAt: Date.now(),
864
+ computedPosition: currentDoorState === CurrentDoorState.OPEN ? 100 : 0
865
+ });
866
+ (0, import_debug4.default)(`current state = ${state.currentDoorState === CurrentDoorState.OPEN ? "OPEN" : "CLOSE"}`);
867
+ return currentDoorState;
868
+ });
869
+ service.getCharacteristic(TargetDoorState).onGet(async () => {
870
+ debugGet(TargetDoorState, service);
871
+ if (IS_TOGGLE_ONLY) {
872
+ const targetDoorState2 = state.currentDoorState;
873
+ debugGetResult(TargetDoorState, service, targetDoorState2);
874
+ return targetDoorState2;
875
+ }
876
+ const targetDoorState = await getTydomCurrentDoorState(client, deviceId, endpointId);
877
+ debugGetResult(TargetDoorState, service, targetDoorState);
878
+ assignState({
879
+ targetDoorState,
880
+ lastUpdatedAt: Date.now(),
881
+ computedPosition: targetDoorState === TargetDoorState.OPEN ? 100 : 0
882
+ });
883
+ (0, import_debug4.default)(`target state = ${state.targetDoorState === TargetDoorState.OPEN ? "OPEN" : "CLOSE"}`);
884
+ return targetDoorState;
885
+ }).onSet(async (value) => {
886
+ debugSet(TargetDoorState, service, value);
887
+ debugSetResult(TargetDoorState, service, value);
888
+ const targetDoorState = asNumber(value);
889
+ assignState({
890
+ targetDoorState,
891
+ lastUpdatedAt: Date.now(),
892
+ computedPosition: computeCurrentPosition()
893
+ });
894
+ (0, import_debug4.default)(`computedPosition=${chalkNumber(state.computedPosition)}`);
895
+ let nextCurrentDoorState = getNextCurrentDoorState(targetDoorState);
896
+ (0, import_debug4.default)(`nextCurrentDoorState=${chalkString(getDoorStateLabel(nextCurrentDoorState))}`);
897
+ if (nextCurrentDoorState === state.currentDoorState) {
898
+ (0, import_debug4.default)(`nextCurrentDoorState=${chalkNumber(nextCurrentDoorState)} === state.currentDoorState`);
899
+ return;
900
+ }
901
+ await toggleGarageDoor(targetDoorState);
902
+ assignCurrentDoorState(nextCurrentDoorState);
903
+ if (nextCurrentDoorState === CurrentDoorState.STOPPED) {
904
+ await waitFor("stopping", 1e3);
905
+ assignState({
906
+ targetDoorState,
907
+ lastUpdatedAt: Date.now(),
908
+ computedPosition: computeCurrentPosition()
909
+ });
910
+ (0, import_debug4.default)(`computedPosition=${chalkNumber(state.computedPosition)}`);
911
+ nextCurrentDoorState = getNextCurrentDoorState(targetDoorState);
912
+ (0, import_debug4.default)(`nextCurrentDoorState=${chalkString(getDoorStateLabel(nextCurrentDoorState))}`);
913
+ await toggleGarageDoor(targetDoorState);
914
+ assignCurrentDoorState(nextCurrentDoorState);
915
+ }
916
+ void (async () => {
917
+ switch (nextCurrentDoorState) {
918
+ case CurrentDoorState.OPENING: {
919
+ const delay = (100 - state.computedPosition) * garageDoorDelay / 100;
920
+ (0, import_debug4.default)(`delay=${chalkNumber(delay)}`);
921
+ try {
922
+ await waitFor(`${deviceId}.pending`, delay);
923
+ assignCurrentDoorState(CurrentDoorState.OPEN);
924
+ if (autoCloseDelay) {
925
+ await waitFor(`${deviceId}.pending`, autoCloseDelay);
926
+ assignCurrentDoorState(CurrentDoorState.CLOSED);
927
+ }
928
+ } catch (err) {
929
+ (0, import_debug4.default)(`Aborted OPEN update with delay=${chalkNumber(delay)}`);
930
+ }
931
+ break;
932
+ }
933
+ case CurrentDoorState.CLOSING: {
934
+ const delay = state.computedPosition * garageDoorDelay / 100;
935
+ (0, import_debug4.default)(`delay=${chalkNumber(delay)}`);
936
+ try {
937
+ await waitFor(`${deviceId}.pending`, delay);
938
+ assignCurrentDoorState(CurrentDoorState.CLOSED);
939
+ } catch (err) {
940
+ (0, import_debug4.default)(`Aborted CLOSED update with delay=${chalkNumber(delay)}`);
941
+ }
942
+ break;
943
+ }
944
+ }
945
+ })();
946
+ });
947
+ };
948
+ var updateGarageDoorOpener = (accessory, _controller, updates, type) => {
949
+ const { context } = accessory;
950
+ const { state } = context;
951
+ const { CurrentDoorState, TargetDoorState } = Characteristic;
952
+ if (type === "cdata") {
953
+ updates.forEach((update) => {
954
+ const { values } = update;
955
+ const { event } = values;
956
+ (0, import_debug4.default)(`New ${chalkKeyword("GarageDoorOpener")} event=${chalkJson(event)}`);
957
+ });
958
+ return;
959
+ }
960
+ updates.forEach((update) => {
961
+ const { name, value } = update;
962
+ const service = getAccessoryService(accessory, Service.GarageDoorOpener);
963
+ (0, import_debug4.default)(
964
+ `New ${chalkKeyword("GarageDoorOpener")} update received from Tydom, name=${String(name)} / value=${String(value)}`
965
+ );
966
+ switch (name) {
967
+ case "level": {
968
+ if (state.currentDoorState === CurrentDoorState.OPENING || // 2
969
+ state.currentDoorState === CurrentDoorState.CLOSING) {
970
+ (0, import_debug4.default)(`GarageDoor state is OPENING or CLOSING, ignoring update.`);
971
+ }
972
+ const level = asNumber(value);
973
+ let doorState = CurrentDoorState.CLOSED;
974
+ let computedPosition = 0;
975
+ if (level === 0) {
976
+ doorState = CurrentDoorState.CLOSED;
977
+ computedPosition = 0;
978
+ } else if (level === 100) {
979
+ doorState = CurrentDoorState.OPEN;
980
+ computedPosition = 100;
981
+ } else if (level > 0 && level < 100) {
982
+ (0, import_debug4.default)(`Encountered a ${chalkString("level")} update with value different from 0 or 100 !`);
983
+ return;
984
+ }
985
+ debugSetResult(CurrentDoorState, service, doorState);
986
+ service.updateCharacteristic(CurrentDoorState, doorState);
987
+ debugSetResult(TargetDoorState, service, doorState);
988
+ service.updateCharacteristic(TargetDoorState, doorState);
989
+ Object.assign(state, {
990
+ currentDoorState: doorState,
991
+ targetDoorState: doorState,
992
+ lastUpdatedAt: Date.now(),
993
+ computedPosition
994
+ });
995
+ return;
996
+ }
997
+ default:
998
+ return;
999
+ }
1000
+ });
1001
+ };
1002
+
1003
+ // src/accessories/lightbulb.ts
1004
+ var import_debug5 = __toESM(require("debug"));
1005
+ var import_lodash4 = require("lodash");
1006
+ var setupLightbulb = (accessory, controller) => {
1007
+ const { context } = accessory;
1008
+ const { client } = controller;
1009
+ const { On, Brightness } = Characteristic;
1010
+ const { deviceId, endpointId, metadata, state } = context;
1011
+ setupAccessoryInformationService(accessory, controller);
1012
+ setupAccessoryIdentifyHandler(accessory, controller);
1013
+ Object.assign(state, {
1014
+ latestBrightness: 100,
1015
+ pendingUpdatedValues: [],
1016
+ lastUpdatedAt: 0
1017
+ });
1018
+ const levelMeta = (0, import_lodash4.find)(metadata, { name: "level" });
1019
+ if (levelMeta?.step === 100) {
1020
+ addAccessorySwitchableService(accessory, controller, Service.Lightbulb);
1021
+ return;
1022
+ }
1023
+ const service = addAccessoryService(accessory, Service.Lightbulb, accessory.displayName, true);
1024
+ const debouncedSetLevel = (0, import_lodash4.debounce)(
1025
+ async (value) => {
1026
+ debugTydomPut("level", accessory, value);
1027
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
1028
+ {
1029
+ name: "level",
1030
+ value
1031
+ }
1032
+ ]);
1033
+ Object.assign(state, {
1034
+ pendingUpdatedValues: state.pendingUpdatedValues.concat([value])
1035
+ });
1036
+ },
1037
+ 15,
1038
+ { leading: true, trailing: true }
1039
+ );
1040
+ service.getCharacteristic(Characteristic.On).onGet(async () => {
1041
+ debugGet(On, service);
1042
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
1043
+ const level = getTydomDataPropValue(data, "level");
1044
+ const nextValue = level > 0;
1045
+ debugGetResult(On, service, nextValue);
1046
+ return nextValue;
1047
+ }).onSet(async (value) => {
1048
+ debugSet(On, service, value);
1049
+ const nextLevel = value ? state.latestBrightness || 100 : 0;
1050
+ await debouncedSetLevel(nextLevel);
1051
+ service.updateCharacteristic(Brightness, nextLevel);
1052
+ debugSetResult(On, service, value);
1053
+ });
1054
+ service.getCharacteristic(Characteristic.Brightness).onGet(async () => {
1055
+ debugGet(Brightness, service);
1056
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
1057
+ const level = getTydomDataPropValue(data, "level");
1058
+ debugGetResult(Brightness, service, level);
1059
+ return level;
1060
+ }).onSet(async (value) => {
1061
+ debugSet(Brightness, service, value);
1062
+ const nextValue = value;
1063
+ Object.assign(state, {
1064
+ latestBrightness: nextValue,
1065
+ lastUpdatedAt: Date.now()
1066
+ });
1067
+ await debouncedSetLevel(nextValue);
1068
+ debugSetResult(Brightness, service, value);
1069
+ });
1070
+ };
1071
+ var updateLightbulb = (accessory, controller, updates) => {
1072
+ const { context } = accessory;
1073
+ const { metadata, state } = context;
1074
+ const { On, Brightness } = Characteristic;
1075
+ const levelMeta = (0, import_lodash4.find)(metadata, { name: "level" });
1076
+ if (levelMeta?.step === 100) {
1077
+ updateAccessorySwitchableService(accessory, controller, updates, Service.Lightbulb);
1078
+ return;
1079
+ }
1080
+ updates.forEach((update) => {
1081
+ const { name, value } = update;
1082
+ switch (name) {
1083
+ case "level": {
1084
+ const service = getAccessoryService(accessory, Service.Lightbulb);
1085
+ const level = value;
1086
+ if (level === null) {
1087
+ (0, import_debug5.default)(`Encountered a ${chalkString("level")} update with a null value!`);
1088
+ return;
1089
+ }
1090
+ if (state.pendingUpdatedValues.includes(level)) {
1091
+ (0, import_debug5.default)(`Ignoring a delayed ${chalkString("level")} update with value=${chalkNumber(level)}`);
1092
+ state.pendingUpdatedValues = [];
1093
+ return;
1094
+ }
1095
+ debugSetUpdate(On, service, level > 0);
1096
+ service.updateCharacteristic(On, level > 0);
1097
+ if (level > 0) {
1098
+ debugSetUpdate(Brightness, service, level);
1099
+ service.updateCharacteristic(Brightness, level);
1100
+ }
1101
+ return;
1102
+ }
1103
+ default:
1104
+ return;
1105
+ }
1106
+ });
1107
+ };
1108
+
1109
+ // src/accessories/outlet.ts
1110
+ var import_lodash5 = require("lodash");
1111
+ var setupOutlet = (accessory, controller) => {
1112
+ const { context } = accessory;
1113
+ const { client } = controller;
1114
+ const { On, OutletInUse } = Characteristic;
1115
+ const { deviceId, endpointId } = context;
1116
+ setupAccessoryInformationService(accessory, controller);
1117
+ setupAccessoryIdentifyHandler(accessory, controller);
1118
+ const service = addAccessoryService(accessory, Service.Outlet, accessory.displayName, true);
1119
+ service.getCharacteristic(On).onGet(async () => {
1120
+ debugGet(On, service);
1121
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
1122
+ const plugCmd = getTydomDataPropValue(data, "plugCmd");
1123
+ const nextValue = plugCmd === "ON";
1124
+ debugGetResult(On, service, nextValue);
1125
+ return nextValue;
1126
+ }).onSet(async (value) => {
1127
+ debugSet(On, service, value);
1128
+ const tydomValue = value ? "ON" : "OFF";
1129
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
1130
+ {
1131
+ name: "plugCmd",
1132
+ value: tydomValue
1133
+ }
1134
+ ]);
1135
+ debugSetResult(On, service, value, tydomValue);
1136
+ });
1137
+ service.getCharacteristic(OutletInUse).onGet(async () => {
1138
+ debugGet(OutletInUse, service);
1139
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
1140
+ const energyInstantTotElecP = getTydomDataPropValue(data, "energyInstantTotElecP");
1141
+ const nextValue = energyInstantTotElecP > 0;
1142
+ debugGetResult(OutletInUse, service, nextValue);
1143
+ return nextValue;
1144
+ });
1145
+ };
1146
+ var updateOutlet = (accessory, _controller, updates) => {
1147
+ updates.forEach((update) => {
1148
+ const { name, value } = update;
1149
+ const { On, OutletInUse } = Characteristic;
1150
+ switch (name) {
1151
+ case "level": {
1152
+ const service = getAccessoryService(accessory, Service.Outlet);
1153
+ const nextValue = value === "ON";
1154
+ debugSetUpdate(On, service, nextValue);
1155
+ service.updateCharacteristic(On, nextValue);
1156
+ return;
1157
+ }
1158
+ case "energyInstantTotElecP": {
1159
+ const service = getAccessoryService(accessory, Service.Outlet);
1160
+ const nextValue = (0, import_lodash5.toNumber)(value) > 0;
1161
+ debugSetUpdate(OutletInUse, service, nextValue);
1162
+ service.updateCharacteristic(OutletInUse, nextValue);
1163
+ return;
1164
+ }
1165
+ default:
1166
+ return;
1167
+ }
1168
+ });
1169
+ };
1170
+
1171
+ // src/accessories/securitySystem.ts
1172
+ var import_lodash6 = require("lodash");
1173
+
1174
+ // src/config/i18n/en.ts
1175
+ var en_default = {
1176
+ ABOUT_API_MODE: "API mode",
1177
+ ABOUT_BDDMIGRATION_FILE_VERSION: "bdd_mig.json version",
1178
+ ABOUT_BDD_FILE_VERSION: "bdd.json version",
1179
+ ABOUT_BOOT: "Boot software plan",
1180
+ ABOUT_BOOT_VERSION: "Boot software version",
1181
+ ABOUT_COLLECT_FILE_VERSION: "collect.json version",
1182
+ ABOUT_CONF: "Infrastructure",
1183
+ ABOUT_CONFIG_FILE_VERSION: "config.json version",
1184
+ ABOUT_DEFAULT_GATEWAY: "Default gateway",
1185
+ ABOUT_DEMO: "Demo",
1186
+ ABOUT_DHCP: "DHCP",
1187
+ ABOUT_DNS1: "DNS 1",
1188
+ ABOUT_DNS2: "DNS 2",
1189
+ ABOUT_GATEWAY_FILE_VERSION: "Gateway.json version",
1190
+ ABOUT_GROUPS_FILE_VERSION: "groups.json version",
1191
+ ABOUT_HARDWARE_KEY_VERSION: "Key hardware version",
1192
+ ABOUT_HARDWARE_TYDOM_VERSION: "Tydom hardware version",
1193
+ ABOUT_IDENTIFIANT: "Tydom reference",
1194
+ ABOUT_INFOMIGRATION_FILE_VERSION: "info_mig.json version",
1195
+ ABOUT_IP: "IP",
1196
+ ABOUT_KEY: "Key software plan",
1197
+ ABOUT_MAC: "MAC address",
1198
+ ABOUT_MOMAPI_FILE_VERSION: "mom_api.json version",
1199
+ ABOUT_MOM_FILE_VERSION: "mom.json version",
1200
+ ABOUT_NETWORK_MASK: "Network mask",
1201
+ ABOUT_PRODUCT_NAME: "TYDOM",
1202
+ ABOUT_REFERENCE: "Tydom software plan",
1203
+ ABOUT_SCENARIO_FILE_VERSION: "scenario.json version",
1204
+ ABOUT_SITE_FILE_VERSION: "site.json version",
1205
+ ABOUT_SOFTWARE_APP_VERSION: "Application software version",
1206
+ ABOUT_SOFTWARE_KEY_VERSION: "Key software version",
1207
+ ABOUT_SOFTWARE_TYDOM_VERSION: "Tydom software version",
1208
+ ABOUT_STACK_KEY_VERSION: "Stack software version",
1209
+ ABOUT_TYCAM: "Tycam",
1210
+ ABOUT_TYDOM_FILE_VERSION: "Tydom.dat version",
1211
+ ABOUT_UPDATE_AVAILABLE: "New version available",
1212
+ ABOUT_URL_MEDIATION: "URL mediation",
1213
+ ACTIVE_ALERTS_INTRUSION: "When you activate this function, your alarm system alerts you about any intruders detected",
1214
+ ACTIVE_ALERT_WITH_TYXAL_PLUS: "You must have an alarm system to activate these alerts",
1215
+ ADD_DETECTOR: "Add a detector",
1216
+ ALARME_ACCESS_CODE: "Access code",
1217
+ ALARME_ARRET: "Off",
1218
+ ALARME_CODE_MODIFIE: "The alarm access code has been changed successfully",
1219
+ ALARME_CODE_MODIFIE_TEXTE: "The alarm access code has been changed successfully",
1220
+ ALARME_CODE_MODIFIE_TITLE: "Code changed",
1221
+ ALARME_COUP_OEIL: "Check in",
1222
+ ALARME_DEFINIR_CODE: "Set an access code",
1223
+ ALARME_ENTER_CODE: "Enter code",
1224
+ ALARME_HISTORIQUES: "Histories",
1225
+ ALARME_ISSUES_OUVERTES: "Open openings",
1226
+ ALARME_MARCHE: "On",
1227
+ ALARME_MARCHE_TOTALE: "Complete activation",
1228
+ ALARME_NO_RESPONSE: "No response from the control unit",
1229
+ ALARME_ON_PARTIAL: "Partial activation",
1230
+ ALARME_PARTIAL: "Partial",
1231
+ ALARME_PASSAGE_MODE_MAINTENANCE: "To change the access code, switch the control unit to maintenance mode",
1232
+ ALARM_CODE_INSTALLER_TEXT: "The installer code is required for this action",
1233
+ ALARM_DEFAULTS_AUTOPROTECTION: "Devices in tamper alarm mode",
1234
+ ALARM_DEFAULTS_CLEAR_DIALOG: "Do you want to clear unacknowledged errors",
1235
+ ALARM_DEFAULTS_PENDING: "Current errors",
1236
+ ALARM_DEFAULTS_PRODUCTS_INACTIVE: "Disabled equipment",
1237
+ ALARM_DEFAULTS_UNACKED: "Errors not cleared",
1238
+ ALARM_HISTORIC_ALL: "All",
1239
+ ALARM_HISTORIC_ERROR_RESTART: "Re-launch",
1240
+ ALARM_HISTORIC_ERROR_TITLE: "Operation aborted",
1241
+ ALARM_HISTORIC_EVENTS: "Events",
1242
+ ALARM_HISTORIC_ON_OFF: "Activation/Deactivation",
1243
+ ALARM_INSTALLER: "Installer",
1244
+ ALARM_TELECHARGER_NOYAU: "Download the node",
1245
+ ALARM_USER: "User",
1246
+ ALARM_ZONE: "Zone",
1247
+ ALERTS: "Alerts",
1248
+ ALERTS_FAILED: "Activation failed",
1249
+ ALERTS_FAILED_DETAILS: "The notifications could not be sent, try again later",
1250
+ ALERTS_INTRUSION_ACTIVATED: "Intruder alerts activated",
1251
+ ALERTS_NOT_AVAILABLE: "Alerts unavailable",
1252
+ ALERT_CGU: "To continue using the Tydom application, please read and accept the General Terms of Use",
1253
+ ALERT_CGU1: "To continue using the Tydom application, please restart the application and accept the General Terms of Use",
1254
+ ALERT_INTRUSION_DETECTION: "Intruder detection alert",
1255
+ ALERT_TYCAM_NO_CALL_ANDROID_TEXT: "Cannot call with this device",
1256
+ ALERT_TYCAM_NO_CALL_WITH_NUMBER_ANDROID_TEXT: "Cannot call with this device. Dial %s on your phone for assistance",
1257
+ ALLEY: "Alley",
1258
+ ALL_PERIPHERALS_DELETION: "Deletion of all points",
1259
+ ALL_PERIPHERALS_DELETION_EXCEPT_SIREN: "Deletion of all points except the siren",
1260
+ ALL_PERIPHERALS_DELETION_EXCEPT_SIREN_V3: "Delete all except siren",
1261
+ ALL_PERIPHERALS_DELETION_V3: "Total deletion",
1262
+ AREA: "Zone",
1263
+ ARM_FAULT: "Activation denied",
1264
+ ARM_FAULT_RF: "No activ.- RF recept. Pb",
1265
+ ASSOCIATION_CURRENT_STEP_LABEL: "Step %d",
1266
+ ASSOCIATION_DISCONNECTED_ADD_EQUIPMENT: "You are disconnected, you cannot associate devices",
1267
+ ASSOCIATION_ERROR: "Association not possible. Check that an association is not in progress",
1268
+ ASSOCIATION_FINISHED: "Terminated",
1269
+ ASSOCIATION_FOUND_EQUIPMENT_PLURAL: "d Devices found",
1270
+ ASSOCIATION_FOUND_EQUIPMENT_SINGULAR: "d Device found",
1271
+ ASSOCIATION_LIMIT_TEXT: "You have reached the maximum number of equipment items",
1272
+ ASSOCIATION_LIMIT_TITLE: "Association impossible",
1273
+ ASSOCIATION_NO_EQUIPMENT_FOUND: "No device found",
1274
+ ASSOCIATION_PENDING_INFO: "Association in progress",
1275
+ ASSOCIATION_RESTART: "Re-launch",
1276
+ ASSOCIATION_START_ASSOCIATION_BUTTON: "To associate",
1277
+ ASSOCIATION_TOTAL_STEP_LABEL: "On %d",
1278
+ ATTIC: "Attic",
1279
+ AUTHORIZE_NOTIFICATIONS: "Authorize notifications to be sent in the following message",
1280
+ AUTOMATISM_COMMAND: "Control system command",
1281
+ AUTO_ARM_FAULT: "Automatic operation fault",
1282
+ AUTO_ARM_FAULT_V3: "Auto operation defect",
1283
+ AUTO_ARM_PREVENT: "Auto operation error",
1284
+ AUTO_ARM_REQUEST: "Auto operation warning",
1285
+ AVERTISSOR_TEST: "Warning device test",
1286
+ BALCONY: "Balcony",
1287
+ BAR: "Bar",
1288
+ BASEMENT: "Basement",
1289
+ BATHROOM: "Bath / shower",
1290
+ BATTERY_FAULT: "Battery fault",
1291
+ BATTERY_FAULT_2: "Battery error",
1292
+ BAY_WINDOW: "Bay window",
1293
+ BEDROOM: "Bedroom",
1294
+ BELEM_DOOR_CONTROLCLOSE: "Closed",
1295
+ BELEM_DOOR_CONTROLLOCK: "Locked",
1296
+ BELEM_DOOR_CONTROL_OPEN: "Open",
1297
+ BOILER_ROOM: "Boiler room",
1298
+ BREAK_ROOM: "Break room",
1299
+ CAMERA_LIST_VIDEO_WALL: "CAMERA_LIST_VIDEO_WALL",
1300
+ CAMERA_TIMELINE_EMPTY_ITEM: "CAMERA_TIMELINE_EMPTY_ITEM",
1301
+ CAR_PARK: "Car park",
1302
+ CELLAR: "Cellar",
1303
+ CENTRAL: "Alarm control unit",
1304
+ CENTRAL_ASSO: "Set the control unit to add product mode\n then press continue",
1305
+ CG_DD_5612_STEP1: "Press the receiver button for 3 seconds.\nThe red LED will flash.\nPress 'ASSOCIATE' to associate channel 1 only, otherwise move on to step 2",
1306
+ CG_DD_5612_STEP2: "Briefly press the receiver button for 3 seconds.\nThe red LED will flash twice.\nPress 'ASSOCIATE' to associate channel 2 only, otherwise move on to step 3",
1307
+ CG_DD_5612_STEP3: "Briefly press the receiver button.\nThe red BLIND will flash 3 times.\nNow press 'ASSOCIATE' to associate channel 1 and 2 simultaneously",
1308
+ CG_DD_BADGE_RIGHT: "Hold a badge to the right of the selector knob",
1309
+ CG_DD_BRISE_SOLEIL_EVENO: "Eveno Zigbee blackout blind",
1310
+ CG_DD_BRISE_SOLEIL_PROFALUX: "Profalux Zigbee blackout blind",
1311
+ CG_DD_BRISE_SOLEIL_WELLCOM: "Well\u2019Com\xAE BLACKOUT BLIND",
1312
+ CG_DD_CALYBOX_TURN_STOP_BUTTON_I: "On the Calybox, turn the selector knob to off.\nThen press the \u201Ci\u201Cbutton for 5 seconds",
1313
+ CG_DD_CAMERA: "Camera",
1314
+ CG_DD_CAMERA_ETH_STEP1: "CG_DD_CAMERA_ETH_STEP1",
1315
+ CG_DD_CAMERA_ETH_STEP2: "CG_DD_CAMERA_ETH_STEP2",
1316
+ CG_DD_CAMERA_WPS_STEP1: "CG_DD_CAMERA_WPS_STEP1",
1317
+ CG_DD_CHOOSE_ADD_OK: "Choose \u201CAdd\u201C then press \u201COK\u201C",
1318
+ CG_DD_CHOOSE_INSTALLATION_OK: "Choose \u201CInstallation\u201C then press \u201COK\u201C",
1319
+ CG_DD_CHOOSE_PRODUCTS_OK: "Choose \u201CProducts\u201C then press \u201COK\u201C",
1320
+ CG_DD_CODE_BUTTON_ON_OFF_KEYBOARD: "Enter the access code and then press the ON and OFF buttons on the keypad at the same time and hold for 5 seconds until the control unit emits a beep",
1321
+ CG_DD_CODE_BUTTON_ON_OFF_REMOTE: "Enter the access code and then press the ON and OFF buttons on the remote control at the same time and hold for 5 seconds until the control unit emits a beep",
1322
+ CG_DD_DISPLAY_RAD: "The screen displays \u201CrAd\u201C and the number of devices already associated.\nNow press \u201CASSOCIATE\u201C",
1323
+ CG_DD_DISPLAY_ZONE_TOUT: "The screen displays \u201Call zone\u201C and the number of devices already associated.\nNow press \u201CASSOCIATE\u201C",
1324
+ CG_DD_END_ACCESS_CODE: "To exit the mode, enter your access code then press OFF",
1325
+ CG_DD_END_ACCESS_CODE_OFF_BIP: "Once the device has been associated, enter the access code and press the OFF button.\nThe control unit confirms with a beep",
1326
+ CG_DD_END_OFF_BIP: "Once the device has been associated, press the OFF button.\nThe control unit confirms with a beep",
1327
+ CG_DD_END_OFF_BIP_TRAP: "Once finished, press the OFF button on the remote control, the control unit emits a beep.\nClose the control unit cover",
1328
+ CG_DD_END_TURN: "The device is associated.\nTurn the selector knob to exit the mode",
1329
+ CG_DD_ENGINE_ROUND_TRIP: "The motor is two-way.\nThen press \u201CASSOCIATE\u201C",
1330
+ CG_DD_EVOLOGY_2_ZONES: "EVOLOGY 2 ZONES",
1331
+ CG_DD_EVOLOGY_4_ZONES: "EVOLOGY 4 ZONES",
1332
+ CG_DD_GARAGE_EVENO: "Eveno Zigbee garage door",
1333
+ CG_DD_GARAGE_HORIZONTAL_WELLCOM: "Well\u2019Com\xAE WALL-MOUNT GARAGE DOOR",
1334
+ CG_DD_GARAGE_PROFALUX: "Profalux Zigbee garage door",
1335
+ CG_DD_GARAGE_VERTICAL_WELLCOM: "Well\u2019Com\xAE CEILING-MOUNT GARAGE DOOR",
1336
+ CG_DD_HORMAN_WPS_STEP1: "CG_DD_HORMAN_WPS_STEP1",
1337
+ CG_DD_HORMAN_WPS_STEP2: "CG_DD_HORMAN_WPS_STEP2",
1338
+ CG_DD_KEYBOARD_SETTINGS: "Access \u201CSettings\u201C on the keypad",
1339
+ CG_DD_KIT_HABITAT_10: "KIT HABITAT 10",
1340
+ CG_DD_KIT_HABITAT_20: "KIT HABITAT 20",
1341
+ CG_DD_LED_GREEN_REC: "The green LED flashes, now press on \u201CASSOCIATE\u201C",
1342
+ CG_DD_LED_RED_REC: "The red LED flashes, now press on \u201CASSOCIATE\u201C",
1343
+ CG_DD_MINOR1000_STEP1: "Make sure that the receivers are associated with the MINOR 1000",
1344
+ CG_DD_NOVOFERM_WPS_STEP1: "CG_DD_NOVOFERM_WPS_STEP1",
1345
+ CG_DD_NOVOFERM_WPS_STEP2: "CG_DD_NOVOFERM_WPS_STEP2",
1346
+ CG_DD_OPEN_TRAP: "Open the cover on the control unit; you have one minute to open it.\nIf you do not open it within this time you need to start from step 1 again",
1347
+ CG_DD_OUT_MODE: "The equipment is associated.\nBriefly press 'mode' and '+' to exit the mode",
1348
+ CG_DD_PACK_TYXAL_APPARTEMENT: "PACK TYXAL APPARTEMENT",
1349
+ CG_DD_PACK_TYXAL_MAISON: "PACK TYXAL MAISON",
1350
+ CG_DD_PACK_TYXAL_MAISON_ANIMAUX: "PACK TYXAL MAISON ANIMAUX",
1351
+ CG_DD_PORTE_BELEM: "Door module",
1352
+ CG_DD_PRESS_1_TIME_ON_R: "Press the remote control\u2019s R button (on the back) once",
1353
+ CG_DD_PRESS_ADD_DOMOTIC: "Press \u201CAdd a home automation link\u201C",
1354
+ CG_DD_PRESS_ADVANCED_SETTINGS: "Press \u201CAdvanced settings\u201C",
1355
+ CG_DD_PRESS_AGAIN_BUTTON: "Press the button again briefly.\nThe LED will flash more quickly",
1356
+ CG_DD_PRESS_ASSOCIATE: "Now press 'ASSOCIATE",
1357
+ CG_DD_PRESS_BUTTON_1_INT_3: "Press button 1 on the receiver for 3 seconds",
1358
+ CG_DD_PRESS_BUTTON_5: "Press and hold the button for 5 seconds",
1359
+ CG_DD_PRESS_BUTTON_ALL_REC_3: "Press each receiver's button for 3 seconds",
1360
+ CG_DD_PRESS_BUTTON_GATEWAY: "Press the RH button on the receiver for 3 seconds until LED 2 flashes, then release",
1361
+ CG_DD_PRESS_BUTTON_INT_3: "Press the switch button for 3 seconds",
1362
+ CG_DD_PRESS_BUTTON_MODE: "Press 'mode' and '+' together for 3 seconds",
1363
+ CG_DD_PRESS_BUTTON_MODE_AGAIN: "The unit is associated.\nBriefly press 'mode' and '+' to exit the mode",
1364
+ CG_DD_PRESS_BUTTON_OK_STEP: "Repeatedly press the OK button to progress to the next step",
1365
+ CG_DD_PRESS_BUTTON_ONE_OR_ALL: "Press the receiver buttons for 3 seconds.\nThe red LED will flash",
1366
+ CG_DD_PRESS_BUTTON_ON_5: "Press the remote control ON button for 5 seconds until the control unit emits a beep.\nThen press \u201CASSOCIATE\u201C",
1367
+ CG_DD_PRESS_BUTTON_ON_5_LED_RED: "Press the ON button for 5 seconds.\nThe light goes red then green to confirm the action.\nThe control unit emits a beep and its LED turns on and stays on.\nRelease",
1368
+ CG_DD_PRESS_BUTTON_ON_OFF_5: "Press the ON and OFF buttons on the remote control at the same time and hold for 5 seconds.nThe control unit emits a beep and its light flashes",
1369
+ CG_DD_PRESS_BUTTON_ON_OFF_5_BIP: "Press the ON and OFF buttons on the remote control at the same time and hold for 5 seconds.nThe control unit confirms with a series of beeps",
1370
+ CG_DD_PRESS_BUTTON_ON_OFF_5_LED_BLUE: "Press the ON and OFF buttons on the remote control at the same time and hold for 5 seconds.nThe LED on the control unit flashes blue",
1371
+ CG_DD_PRESS_BUTTON_ON_OFF_5_LED_RED_GREEN: "Press the ON and OFF buttons at the same time and hold for 5 seconds.\nThe light goes red then green to confirm the action.\nThe control unit emits a beep and its LED flashes.\nRelease",
1372
+ CG_DD_PRESS_BUTTON_O_3: "Press the \u201CO\u201C button for 3 seconds",
1373
+ CG_DD_PRESS_BUTTON_PLUS: "Press the \u201C+\u201C button to display \u201C1\u201C.\nPress OK to display rAd",
1374
+ CG_DD_PRESS_BUTTON_R: "Press the \u201CR\u201C button once",
1375
+ CG_DD_PRESS_BUTTON_REC_3: "Press the receiver's button for 3 seconds",
1376
+ CG_DD_PRESS_DOMOTIC: "Press \u201CHome automation\u201C",
1377
+ CG_DD_PRESS_EXTERNAL_ACTIONS: "Press \u201CExternal operations\u201C",
1378
+ CG_DD_PRESS_LEFT_BUTTON_LED: "Press the left button briefly twice, LED 2 should flash 3 times.\nNow press \u201CAssociate\u201C",
1379
+ CG_DD_PRESS_SETTINGS: "Press \u201CSettings\u201C",
1380
+ CG_DD_PRESS_STOP_BUTTON: "Press the remote control's STOP button",
1381
+ CG_DD_REMOTE_CONTROL_LIGHT_UP: "The remote control\u2019s LED lights up and at least one device responds.\nNow press ASSOCIATE",
1382
+ CG_DD_SOMMER_WPS_STEP1: "CG_DD_SOMMER_WPS_STEP1",
1383
+ CG_DD_STORE_WELLCOM: "Well\u2019Com\xAE BLIND",
1384
+ CG_DD_TURN_SETTINGS_BUTTON_OK: "Turn the selector knob to \u201CSettings\u201C, then press the \u201COK\u201Cbutton for 3 seconds",
1385
+ CG_DD_TURN_STOP_BUTTON_I: "Turn the selector knob to \u201Coff\u201C.\nThen press the \u201Ci\u201Cbutton for 5 seconds",
1386
+ CG_DD_TYXAL_PLUS_COMPACT: "TYXAL + COMPACT",
1387
+ CG_DD_USAGE_ALARM: "Alarm",
1388
+ CG_DD_USAGE_ALARM_NEW: "Alarm",
1389
+ CG_DD_USAGE_BELEM_DOOR: "Door",
1390
+ CG_DD_USAGE_BELEM_DOOR_NEW: "Door",
1391
+ CG_DD_USAGE_BOILER: "Hydraulic",
1392
+ CG_DD_USAGE_BOILER_NEW: "Heating",
1393
+ CG_DD_USAGE_CAMERA: "Camera",
1394
+ CG_DD_USAGE_CONSO: "Consumption",
1395
+ CG_DD_USAGE_CONSO_NEW: "Consumption",
1396
+ CG_DD_USAGE_ELECTRIC: "Electrical",
1397
+ CG_DD_USAGE_ELECTRIC_NEW: "Heating",
1398
+ CG_DD_USAGE_GARAGE_DOOR: "Garage",
1399
+ CG_DD_USAGE_GARAGE_DOOR_HORIZONTAL: "Horizontal",
1400
+ CG_DD_USAGE_GARAGE_DOOR_HORIZONTAL_NEW: "Garage",
1401
+ CG_DD_USAGE_GARAGE_DOOR_NEW: "Garage",
1402
+ CG_DD_USAGE_GATE: "Gate",
1403
+ CG_DD_USAGE_GATE_NEW: "Gate",
1404
+ CG_DD_USAGE_HVAC: "Heating",
1405
+ CG_DD_USAGE_HVAC_NEW: "Heating",
1406
+ CG_DD_USAGE_LIGHT: "Lighting",
1407
+ CG_DD_USAGE_LIGHT_NEW: "Lighting",
1408
+ CG_DD_USAGE_OTHERS: "Others",
1409
+ CG_DD_USAGE_OTHERS_NEW: "Other",
1410
+ CG_DD_USAGE_SHUTTER: "Shutters",
1411
+ CG_DD_USAGE_SHUTTER_NEW: "Shutter",
1412
+ CG_DD_USAGE_SWING_SHUTTER: "Hinged shutter",
1413
+ CG_DD_USAGE_SWING_SHUTTER_NEW: "Shutter",
1414
+ CG_DD_VOLET_BATTANT_WELLCOM: "Well\u2019Com\xAE HINGED SHUTTER",
1415
+ CG_DD_VOLET_PROJECTION_WELLCOM: "Well\u2019Com\xAE SWING SHUTTER",
1416
+ CG_DD_VOLET_ROULANT_EVENO: "Eveno Zigbee roller shutter",
1417
+ CG_DD_VOLET_ROULANT_PROFALUX: "Profalux Zigbee roller shutter",
1418
+ CG_DD_VOLET_ROULANT_WELLCOM: "Well\u2019Com\xAE SHUTTER",
1419
+ CG_DD_WAIT_ASSO: "Now press \u201CASSOCIATE\u201C",
1420
+ CHANGING_ROOM: "Changing room",
1421
+ CHILDS_BEDROOM: "Child's bedroom",
1422
+ CHOIX_CENTRALE: "Select the type of alarm you want to associate",
1423
+ CHOOSE_NETWORK: "CHOOSE_NETWORK",
1424
+ CLAVIER_BLOQUE: "Keypad locked",
1425
+ CLEARANCE: "Cupboard",
1426
+ CLOSE: "Close",
1427
+ CLOSED_ENTRANCE: "Door closed",
1428
+ CLOSET: "Closet",
1429
+ COMING_SOON: "Our developers are working hard\nto add this feature.\nWe will be ready soon",
1430
+ COMING_SOON_TITLE: "COMING SOON",
1431
+ COMMAND_AMBIENT_TEMPERATURE: "Room temperature",
1432
+ COMMAND_CLIM: "Air conditioning",
1433
+ COMMAND_FAVOURITE_ADD_MESSAGE: "Your device is\nnow directly accessible\nfrom the homepage",
1434
+ COMMAND_FAVOURITE_DELETE_MESSAGE: "Your device will no longer be accessible from the homepage",
1435
+ COMMAND_FAVOURITE_TITLE: "Favourites",
1436
+ COMMAND_HYGROMETRY: "Humidity",
1437
+ COMMAND_PERIPHERALS_DELETION: "Deletion of control elements",
1438
+ COMMAND_TEMPERATURE_MESURE: "measured",
1439
+ COMMON: "Common",
1440
+ COMMON_ACCEPT: "Accept",
1441
+ COMMON_ACTIVATE: "Activated",
1442
+ COMMON_ADD: "Add",
1443
+ COMMON_ATTENTION: "Caution",
1444
+ COMMON_BRIDGES: "Gateways",
1445
+ COMMON_CANCEL: "Cancel",
1446
+ COMMON_COMMAND_FAILURE: "Command unsuccessful, please try again",
1447
+ COMMON_COMMENCER: "Start",
1448
+ COMMON_CONFIRM: "Confirm",
1449
+ COMMON_CONNEXION: "Connection",
1450
+ COMMON_CONTINUE: "Continue",
1451
+ COMMON_DEACTIVATE: "Deactivated",
1452
+ COMMON_DEFAULTS: "Errors",
1453
+ COMMON_DEFAULT_UNKNOWN: "Unknown error",
1454
+ COMMON_EQUIPMENT: "Devices",
1455
+ COMMON_ERROR: "Error",
1456
+ COMMON_IMPOSSIBLE: "Impossible",
1457
+ COMMON_INVISIBLE: "Invisible",
1458
+ COMMON_NEW: "New",
1459
+ COMMON_NO: "No",
1460
+ COMMON_OK: "OK",
1461
+ COMMON_PHOTOS: "Photos",
1462
+ COMMON_PRODUCT: "Product",
1463
+ COMMON_PROG: "PROGRAMMING",
1464
+ COMMON_REFUS: "Refuse",
1465
+ COMMON_REMOVE: "Delete",
1466
+ COMMON_REPEATER: "Repeater",
1467
+ COMMON_SCENARIOS: "Scenarios",
1468
+ COMMON_TERMINER: "Finish",
1469
+ COMMON_YES: "Yes",
1470
+ COMMON_ZIGBEE_DONGLE: "Zigbee dongle",
1471
+ COMPANY: "Company",
1472
+ CONFIRM_DOWNLOAD: "Confirm download",
1473
+ CONFIRM_INIT_GEN: "Do you want to initialise the alarm?\n",
1474
+ CONFIRM_ON: "Activation denied. Do you want to override the activation",
1475
+ CONNECTION_FAILED_MESSAGE: "Check that your smartphone/tablet is connected to the Internet or to Tydom\u2019s local network.\nCheck that your TYDOM unit is updated by disconnecting and reconnecting the power cord. Remember to remove the batteries for the TYDOM 2.0",
1476
+ CONNECTION_FAILED_PASSWORD_MESSAGE: "Check your password or username and try again.\nIf you have forgotten your password or usernmae, press the TYDOM button for 15 seconds to reset the password",
1477
+ CONNECTION_FAILED_PASSWORD_TITLE: "Incorrect password or username",
1478
+ CONNECTION_FAILED_TITLE: "Login impossible",
1479
+ CONNEXION_STATE_CONNECTED: "Connected",
1480
+ CONNEXION_STATE_CONNECTING: "Connecting",
1481
+ CONNEXION_STATE_DISCONNECTED: "Disconnected",
1482
+ CONNEXION_STATE_DISCONNECTING: "Disconnecting",
1483
+ CONNEXION_STATE_RECONNECTING: "Login in progress",
1484
+ CONSO_AMPERE: "in Ampere",
1485
+ CONSO_ELECTRICITY: "Electricity",
1486
+ CONSO_ENERGY_COST: "Energy cost",
1487
+ CONSO_ENERGY_COST_DETAIL: "Unit price of each type of energy used.\nIMPORTANT: the price displayed is only for information.\nIt does not include the prices depending on the hours, local taxes, changes in time and fixed subscription price",
1488
+ CONSO_EURO: "in \u20AC",
1489
+ CONSO_GAZ: "Gas",
1490
+ CONSO_INSTANT_UNIT: "Instant unit",
1491
+ CONSO_INSTANT_UNIT_DETAIL: "Modify the unit used to display the instantaneous consumption",
1492
+ CONSO_KWH: "in kWh or m3",
1493
+ CONSO_UNDEF: "Undefined",
1494
+ CONSO_UNIT_CHOICE: "Unit selection",
1495
+ CONSO_UNIT_CHOICE_DETAIL: "Modify the unit used for consumption",
1496
+ CONSO_WATER: "Water",
1497
+ CONSO_WATT: "in Watt",
1498
+ CONTINUER: "Continue",
1499
+ CONTROLE_VOCAL: "Voice control",
1500
+ CONTROL_GROUP_UNKNOWN: "--",
1501
+ CONTROL_LIGHT_GROUP_UNKNOWN: "Unknown states",
1502
+ CONTROL_LIGHT_UNKNOWN: "State unknown",
1503
+ CONTROL_SHUTTER_GROUP_UNKNOWN: "Unknown positions",
1504
+ CORRIDOR: "Corridor",
1505
+ CREATE_WINDOW_TEXT: "Create a window by associating all its detectors.\nThen press FINISH",
1506
+ CUBIC_METER: "m3",
1507
+ CURRENT_DEFAULTS: "Current errors",
1508
+ CURRENT_DOWNLOAD: "Download in progress",
1509
+ CURRENT_FAULTS: "Error(s",
1510
+ CURRENT_INACTIVE_PERIPHERALS: "Inactive",
1511
+ CURRENT_OPEN_SELF_PROTECTIONS: "Tamper alarm(s",
1512
+ CURRENT_TESTING: "Warning device test in progress . . ",
1513
+ DAY_ALL_DAYS: "Every day",
1514
+ DAY_FRIDAY: "Friday",
1515
+ DAY_FRIDAY_SHORT: "Fr",
1516
+ DAY_MONDAY: "Monday",
1517
+ DAY_MONDAY_SHORT: "Mo",
1518
+ DAY_SATURDAY: "Saturday",
1519
+ DAY_SATURDAY_SHORT: "Sa",
1520
+ DAY_SUNDAY: "Sunday",
1521
+ DAY_SUNDAY_SHORT: "Su",
1522
+ DAY_THURSDAY: "Thursday",
1523
+ DAY_THURSDAY_SHORT: "Th",
1524
+ DAY_TUESDAY: "Tuesday",
1525
+ DAY_TUESDAY_SHORT: "Tu",
1526
+ DAY_WEDNESDAY: "Wednesday",
1527
+ DAY_WEDNESDAY_SHORT: "We",
1528
+ DELETE_ACCESS_CODE: "Delete access code",
1529
+ DELETE_ALL: "Total init",
1530
+ DELETE_ZONE: "Zone deletion",
1531
+ DEMO_ALERT_MESSAGE: "You are now in demo mode.\n To quit this mode, go back to the main menu and select 'Quit demo mode",
1532
+ DEPOT: "Depot",
1533
+ DETECTORS: "Detectors",
1534
+ DETECT_DOOR_ALERT_TEXT: "Do you confirm you want to open the door?\n(Door cannot be closed remotely",
1535
+ DETECT_DOOR_ALERT_TITLE: "Caution",
1536
+ DETECT_DOOR_CONTROLCLOSE: "Closed",
1537
+ DETECT_DOOR_CONTROLLOCK: "Locked",
1538
+ DETECT_DOOR_CONTROL_KEY_CLOSE: "Locked",
1539
+ DETECT_DOOR_CONTROL_KEY_JAIL: "Lockout",
1540
+ DETECT_DOOR_CONTROL_OPEN: "Open",
1541
+ DETECT_DOOR_CONTROL_OPEN_HOPPER: "Open for ventilation",
1542
+ DINING_ROOM: "Dining room",
1543
+ DISARMED: "Deactivate",
1544
+ DISARMED_V3: "Shutdown",
1545
+ DISCRETE_ALARM: "Discreet alarm",
1546
+ DISCRETE_ALARM_V3: "discreet SOS",
1547
+ DISTRESS: "Distress alarm",
1548
+ DISTRESS_V3: "SOS with siren",
1549
+ DOOR: "Door",
1550
+ DOOR_CHIME: "Doorbell",
1551
+ DOWNLOAD: "Download",
1552
+ DOWNLOAD_NOK: "Transfer failure, please repeat the operation",
1553
+ DOWNLOAD_OK: "Download successfully completed",
1554
+ DOWNLOAD_STOPPED: "You have asked to stop the download - you may lose data",
1555
+ DRESSING_ROOM: "Walk-in closet",
1556
+ EMERGENCY_EXIT: "Emergency exit",
1557
+ END_ALARM: "Alarm over",
1558
+ END_BATTERY_FAULT: "Battery fault over",
1559
+ END_BATTERY_FAULT_2: "Battery error end",
1560
+ END_DISCRETE_ALARM: "Discreet alarm over",
1561
+ END_DISTRESS: "Distress alarm over",
1562
+ END_FIRE_ALARM: "Fire fault over",
1563
+ END_FIRE_ALARM_V3: "Fire alarm end",
1564
+ END_GSM_LINE_FAULT: "GSM line error end",
1565
+ END_INTRUSION: "Intrusion over",
1566
+ END_IP_FAULT: "IP error end",
1567
+ END_MAINS_FAULT: "Mains error end",
1568
+ END_MONITORING_FAULT: "End of supervision fault",
1569
+ END_PERIPHERAL_EXCLUSION: "Product activation",
1570
+ END_PHONE_LINE_FAULT: "Telephone line fault over",
1571
+ END_PIN_FAULT: "PIN code error end",
1572
+ END_PUK_FAULT: "PUK code error end",
1573
+ END_RADIO_FAULT: "RF fault over",
1574
+ END_SELF_PROTECTION_EXCLUSION: "AP enabled",
1575
+ END_SELF_PROTECTION_FAULT: "Tamper alarm over",
1576
+ END_SIM_FAULT: "SIM card missing end",
1577
+ END_TECHNICAL_ALARM: "Technical fault over",
1578
+ END_TELECOM_LINE_FAULT: "PSTN line error end",
1579
+ END_TELEMONITORING_FAULT: "Telemonitoring fault over",
1580
+ END_VIDEO_LINK_FAULT: "End of video link defect",
1581
+ ENROLLMENT_DENY: "Association refused",
1582
+ ENTRY: "Entrance",
1583
+ EQUIPMENT_DISCONNECT: "Disconnected",
1584
+ EQUIPMENT_NOT_AVAILABLE: "Equipment unavailable",
1585
+ EQUIPT_ROOM: "Equipment room",
1586
+ ERROR_ASSO: "Association refused",
1587
+ EURO: "\u20AC",
1588
+ EXISTING_PERIPHERAL: "Existing point",
1589
+ FAULTS_ACKNOWLEDGMENT: "Unacknowledged by user",
1590
+ FAULTS_ACKNOWLEDGMENT_V3: "Clear",
1591
+ FIND_OPTIONS_ALERTS_IN_SETTINGS: "Find this option in the Alerts section of the settings menu",
1592
+ FIRE_ALARM: "Fire fault",
1593
+ FIRE_ALARM_V3: "Fire alarm",
1594
+ FIRST_CONNEXION_TEXT: "This is the first time you log in to this home automation box.\nSet the password that will be used to log in.\nThis password must contain at least 8 characters, at least one digit and at least one letter",
1595
+ FIRST_CONNEXION_TITLE: "First login",
1596
+ FLAT: "Flat",
1597
+ FLOOR: "Floor",
1598
+ FRENCH_WINDOW: "French window",
1599
+ FRONT_DESK: "Front desk",
1600
+ FULLY_ARMED: "Complete activation",
1601
+ FULLY_ARMED_V3: "Complete activation",
1602
+ GARAGE: "Garage",
1603
+ GARAGE_DOOR_CONTROL_CLOSE: "Closed",
1604
+ GARAGE_DOOR_CONTROL_OPEN: "Open",
1605
+ GARAGE_DOOR_CONTROL_POURCENT: "s %% closed",
1606
+ GARAGE_DOOR_CONTROL_STOP: "Deactivate",
1607
+ GARDEN: "Garden",
1608
+ GARDEN_SHED: "Garden shed",
1609
+ GATE: "Gate",
1610
+ GATE_CONTROL_CLOSE: "Closed",
1611
+ GATE_CONTROL_OPEN: "Open",
1612
+ GATE_CONTROL_POURCENT: "s %% closed",
1613
+ GATE_CONTROL_STOP: "Deactivate",
1614
+ GROUND_FLOOR: "Ground floor",
1615
+ GSM_LINE_FAULT: "GSM line error",
1616
+ HALL: "Hall",
1617
+ HALLWAY: "Corridor",
1618
+ HEATING_COMMAND: "Heating control",
1619
+ HOME_TILE_ALARM_MAINTENANCE_TEXT: "in maintenance",
1620
+ HOME_TILE_ALARM_MULTI_ZONE_TEXT: "d zones",
1621
+ HOME_TILE_ALARM_OFF_TEXT: "surveillance mode",
1622
+ HOME_TILE_ALARM_ONE_ZONE_TEXT: "d zone",
1623
+ HOME_TILE_ALARM_ON_TEXT: "the alarm",
1624
+ HOME_TILE_ALL_CLOSE_LOCK: "all locked",
1625
+ HOME_TILE_ALL_CLOSE_TEXT: "all closed",
1626
+ HOME_TILE_ALL_OFF_TEXT: "everything off",
1627
+ HOME_TILE_ALL_ON_TEXT: "everything on",
1628
+ HOME_TILE_ALL_OPEN_TEXT: "all open",
1629
+ HOME_TILE_DETECT_CLOSE_TEXT: "closed",
1630
+ HOME_TILE_DETECT_LOCK_TEXT: "locked",
1631
+ HOME_TILE_DETECT_ONE_OPEN_TEXT: "d open",
1632
+ HOME_TILE_DETECT_ULTI_OPEN_TEXT: "d open",
1633
+ HOME_TILE_MULTI_ON_TEXT: "d on",
1634
+ HOME_TILE_MULTI_OPEN_FEM_TEXT: "d open",
1635
+ HOME_TILE_MULTI_OPEN_TEXT: "d open",
1636
+ HOME_TILE_ONE_ON_TEXT: "d on",
1637
+ HOME_TILE_ONE_OPEN_FEM_TEXT: "d open",
1638
+ HOME_TILE_ONE_OPEN_TEXT: "d open",
1639
+ HOME_TILE_WAITING_TEXT: "pending",
1640
+ HOME_TITLE: "Home",
1641
+ HOUSE: "House",
1642
+ HVAC_CONTROL_GROUP_UNKNOWN: "different temperatures",
1643
+ HVAC_DEFAULT_SENSOR_BATT_DEFECT: "Battery defect",
1644
+ HVAC_DEFAULT_SENSOR_DEFECT: "Default sensor",
1645
+ HVAC_DEFAULT_SENSOR_OPENCIRC_DEFECT: "Sensor cut off",
1646
+ HVAC_DEFAULT_SENSOR_PROD_DEFECT: "Production fault",
1647
+ HVAC_DEFAULT_SENSOR_SHORTCUT_DEFECT: "Sensor has short circuit",
1648
+ HVAC_GENERAL: "General",
1649
+ HVAC_GENERAL_COMMAND_ABSENCE: "Absence",
1650
+ HVAC_GENERAL_COMMAND_COOLING: "Air conditioning",
1651
+ HVAC_GENERAL_COMMAND_HEATING: "Heating",
1652
+ HVAC_GENERAL_COMMAND_STOP: "Off",
1653
+ HVAC_GENERAL_STATUS_COOLING: "Air conditioning mode",
1654
+ HVAC_GENERAL_STATUS_HEATING: "Heat mode",
1655
+ HVAC_GENERAL_STATUS_STOP: "Off",
1656
+ HVAC_INFO_ABSENCE: "Absence mode",
1657
+ HVAC_INFO_ANTIFROST: "Frost protection",
1658
+ HVAC_INFO_OPENNING: "Open entry",
1659
+ HVAC_LEVEL_ANTI_FROST: "Frost Protection",
1660
+ HVAC_LEVEL_AUTO: "Auto",
1661
+ HVAC_LEVEL_COMFORT: "Comfort",
1662
+ HVAC_LEVEL_ECO: "Economy",
1663
+ HVAC_LEVEL_MEDIO: "Medio",
1664
+ HVAC_LEVEL_MODERATO: "Moderato",
1665
+ HVAC_LEVEL_STOP: "Off",
1666
+ HVAC_MODE_ANTI_FROST: "Frost Protection",
1667
+ HVAC_MODE_ECO: "Economy",
1668
+ HVAC_MODE_NORMAL: "Normal",
1669
+ HVAC_MODE_STOP: "Off",
1670
+ HVAC_MODE_UNKNOWN: "Unknown",
1671
+ INACTIVE_PRODUCTS: "Inactive products",
1672
+ INCOMING_DIGITAL_CALL: "Incoming digital communication",
1673
+ INCOMING_VOICE_CALL: "Incoming voice communication",
1674
+ INCOMING_VOICE_CALL_V3: "Incmg voice call validated",
1675
+ INIT_GENERAL: "Alarm initialisation",
1676
+ INTRUSION: "Intrusion",
1677
+ INTRUSION_DETECTION_NOTIFICATION_MESSAGE: "You will receive a notification each time an intruder is detected",
1678
+ IP_FAULT: "IP error start",
1679
+ KILOWATT: "kWh",
1680
+ KITCHEN: "Kitchen",
1681
+ LANDING: "Landing",
1682
+ LIBRARY: "Library",
1683
+ LIGHT_CONTROL_GROUP_UNKNOWN: "different states",
1684
+ LIGHT_CONTROL_OFF: "Off",
1685
+ LIGHT_CONTROL_ON: "On",
1686
+ LIGHT_CONTROL_POURCENT: "s %% on",
1687
+ LIGHT_DEFAULT_BATT_DEFECT: "Battery defect",
1688
+ LIGHT_DEFAULT_CMD_DEFECT: "Default command",
1689
+ LIGHT_DEFAULT_LOAD_DEFECT: "Default load",
1690
+ LIGHT_DEFAULT_THERMIC_DEFECT: "Overheat",
1691
+ LIGHT_TOGGLE: "Pulse",
1692
+ LIVING_ROOM: "Living room",
1693
+ LOBBY: "Reception",
1694
+ LOCALISATION_TAG: "en",
1695
+ LOCAL_ACCESS: "Local access",
1696
+ LOCKED_KEYBOARD: "Keypad locked",
1697
+ LOFT: "Loft",
1698
+ LOGIN_CREATE_ACCOUNT: "Create an account",
1699
+ LOGIN_FORGET_PASSWORD: "Password forgotten",
1700
+ LOGIN_INPUT_EMPTY: "Field %s empty",
1701
+ LOGIN_INPUT_ERROR: "Field %s not valid",
1702
+ LOGIN_MAC_ADDRESS: "MAC address",
1703
+ LOGIN_PASSWORD: "Password",
1704
+ LOGIN_SAVE_PASSWORD: "Store the password",
1705
+ LOGIN_SITE: "your home",
1706
+ LOG_CLEARANCE: "History deleted",
1707
+ LOG_VIEWING: "View history",
1708
+ LOUNGE: "Lounge",
1709
+ MAINS_FAULT: "Mains supply error",
1710
+ MAINTENANCE: "Maintenance",
1711
+ MAINTENANCE_ARRETER: "Stop",
1712
+ MAINTENANCE_BSO: "BSO",
1713
+ MAINTENANCE_COOL_LEVEL: "Allure F",
1714
+ MAINTENANCE_COOL_SET_POINT: "Setpoint F",
1715
+ MAINTENANCE_DEVICE_DELETE_MESSAGE: "The selected equipment will be removed from your installation as well as groups, scenarios, moments and photos",
1716
+ MAINTENANCE_DIMMER: "Dimmer",
1717
+ MAINTENANCE_ENDPOINT: "Update equipment",
1718
+ MAINTENANCE_ENDPOINT_TYPE: "Type",
1719
+ MAINTENANCE_EQUIPEMENTS: "EQUIPMENTS",
1720
+ MAINTENANCE_ERRORS: "Errors",
1721
+ MAINTENANCE_FONCTION: "Fonction",
1722
+ MAINTENANCE_GROUPES: "GROUPS",
1723
+ MAINTENANCE_HEAT_COOL_LEVEL: "Allure H/C",
1724
+ MAINTENANCE_HEAT_COOL_SET_POINT: "Setpoint H/C",
1725
+ MAINTENANCE_HEAT_LEVEL: "Allure C",
1726
+ MAINTENANCE_HEAT_SET_POINT: "Setpoint H",
1727
+ MAINTENANCE_IDENTIFIANT: "Identifier",
1728
+ MAINTENANCE_IMPULSE: "Impulse",
1729
+ MAINTENANCE_INCONNU: "Unknown",
1730
+ MAINTENANCE_INSTALLATION: "Installation",
1731
+ MAINTENANCE_MAX: "Max",
1732
+ MAINTENANCE_METIER: "Usage",
1733
+ MAINTENANCE_METIERS_DISPONIBLES: "AVAILABLE USAGES",
1734
+ MAINTENANCE_MIN: "Min",
1735
+ MAINTENANCE_MODE: "Maintenance mode",
1736
+ MAINTENANCE_MODE_V3: "Switch to maintenance mode",
1737
+ MAINTENANCE_MOMENTS: "Moments",
1738
+ MAINTENANCE_MOMENTS_PER_DAY: "Max moments per day",
1739
+ MAINTENANCE_MULTI_USAGES: "Multi usages",
1740
+ MAINTENANCE_M_D: "Up/Down",
1741
+ MAINTENANCE_NET: "Network",
1742
+ MAINTENANCE_ON_OFF: "On/Off",
1743
+ MAINTENANCE_OTHERS: "OTHERS",
1744
+ MAINTENANCE_PARAMETRES_RESEAU: "Network parameters",
1745
+ MAINTENANCE_PHOTOS: "Photos",
1746
+ MAINTENANCE_PROFILE: "Profile",
1747
+ MAINTENANCE_PROJECTION: "Projection",
1748
+ MAINTENANCE_PROTOCOL: "Protocol",
1749
+ MAINTENANCE_SCENARIOS: "Scenarios",
1750
+ MAINTENANCE_SLOPE: "Slope",
1751
+ MAINTENANCE_SLOT: "Slot",
1752
+ MAINTENANCE_STEP: "Step",
1753
+ MAINTENANCE_SYNTHESE: "Synthesis",
1754
+ MAINTENANCE_UPDATE: "Update",
1755
+ MAINTENANCE_UPDATE_ENDPOINT_MESSAGE: "Update the product? Caution: this operation is irreversible",
1756
+ MAINTENANCE_UPDATE_MESSAGE_ERROR: "The update failed",
1757
+ MAINTENANCE_UPDATE_MESSAGE_SUCCESS: "The update was done correctly",
1758
+ MAINTENANCE_UPDATE_TITLE: "Update",
1759
+ MAINTENANCE_UPDATE_USAGES_MESSAGE: "Applying the new usage ? Attention, this operation is irreversible",
1760
+ MAINTENANCE_USAGE: "Usage",
1761
+ MAINTENANCE_VARIATION: "Variation",
1762
+ MANAGEMENT: "Management",
1763
+ MASTER_BEDROOM: "Master bedroom",
1764
+ MA_MAISON: "My house",
1765
+ MEETING_ROOM: "Meeting room",
1766
+ MESSAGE_ALARME_VIDE: "Secure your home with a wireless Delta Dore alarm system.\n\nUse the settings menu to associate your alarm or consult our website for further information",
1767
+ MESSAGE_BELEM_DOOR_EMPTY: "Open your front door remotely.\n\nUse the setting menu to associate a device",
1768
+ MESSAGE_CONSO_EMPTY: "View and control your energy consumption on a daily basis.\n\nUse the settings menu to associate equipment or visit our website for further information",
1769
+ MESSAGE_DETECT_EMPTY: "With the WINDOWS products, secure your home.\n\nUse the settings menu to associate equipment or visit our website for further information",
1770
+ MESSAGE_GARAGE_EMPTY: "Automatically control your garage with Delta Dore solutions.\n\nUse the settings menu to associate equipment or visit our website for further information",
1771
+ MESSAGE_GATE_EMPTY: "Automatically control your gate with Delta Dore solutions.\n\nUse the settings menu to associate equipment or visit our website for further information",
1772
+ MESSAGE_HEATING_EMPTY: "Remotely control the temperature inside your home.\n\nUse the settings menu to associate equipment or visit our website for further information",
1773
+ MESSAGE_LIGHT_EMPTY: "Simply control your indoor and outdoor lights with the application\n\nUse the settings menu to associate equipment or visit our website for further information",
1774
+ MESSAGE_OTHERS_EMPTY: "With Delta Dore products, you can control your outdoor sprinkler system for example.\n\nUse the settings menu to associate equipment or visit our website for further information",
1775
+ MESSAGE_SHUTTER_EMPTY: "Motorise your roller shutters simply with Delta Dore solutions.\n\nUse the settings menu to associate equipment or visit our website for further information",
1776
+ MEZZANINE: "Mezzanine",
1777
+ MIGRATION_FAILED_MESSAGE: "You migration has failed, you may have lost your setup",
1778
+ MIGRATION_TEXT: "Your system is being updated to a new version.\nIn few minutes, you will be able to make the most of the brand new TYDOM experience.\nPlease DO NOT quit the App during this process",
1779
+ MIGRATION_TITLE: "Update",
1780
+ MONITORING_FAULT: "Supervision fault",
1781
+ MORE_INFO: "Find out more",
1782
+ NEED_TO_UPDATE_TYDOM: "For access to this feature, please update your home automation unit by disconnecting and reconnecting the power cable",
1783
+ NEED_TO_UPDATE_TYDOM_TITLE: "Update required",
1784
+ NETWORK: "NETWORK",
1785
+ NEW_ACCESS_CODE: "New access code",
1786
+ NEW_PERIPHERAL: "New peripheral",
1787
+ NEW_WINDOW: "New window",
1788
+ NEW_ZONE: "New zone",
1789
+ OFFICE: "Office",
1790
+ OFF_ZONE: "Zone shutdown",
1791
+ ON_ZONE: "Operation by zone",
1792
+ OPEN_ENTRANCE: "Door open",
1793
+ OPERATION_REFUSED: "Operation denied",
1794
+ OPERATION_REFUSED_INSTALLER: "The control unit cannot be switched off with an installer access code",
1795
+ OUTBUILDING: "Outbuilding",
1796
+ OUTGOING_CONNECTION_FAILURE: "Outgoing connection failure",
1797
+ OUTGOING_CONNECTION_FAILURE_DIGITAL: "digital com. output error",
1798
+ OUTGOING_CONNECTION_FAILURE_VOCAL: "voice com. output error",
1799
+ OUTGOING_DIGITAL_CALL: "Outgoing digital communication",
1800
+ OUTGOING_VOICE_CALL: "Outgoing voice communication",
1801
+ OVERRIDE_SETTING: "Manual override",
1802
+ OVERRIDE_SETTING_ZONE: "Override by zone",
1803
+ PANTRY: "Pantry",
1804
+ PARTIALLY_ARMED1: "Partial activation 1",
1805
+ PARTIALLY_ARMED2: "Partial activation 2",
1806
+ PARTIALLY_ARMED3: "Partial activation 3",
1807
+ PARTIALLY_ARMED4: "Partial activation 4",
1808
+ PARTIALLY_ARMED5: "Partial activation 5",
1809
+ PARTIALLY_ARMED6: "Partial activation 6",
1810
+ PARTIALLY_ARMED7: "Partial activation 7",
1811
+ PARTIALLY_ARMED8: "Partial activation 8",
1812
+ PATIO: "Patio",
1813
+ PERIMETER_ARMED: "Perimeter operating mode",
1814
+ PERIPHERAL_DELETION: "Delete peripheral",
1815
+ PERIPHERAL_DELETION_V3: "Product deletion",
1816
+ PERIPHERAL_EXCLUSION: "Exclude peripheral",
1817
+ PERIPHERAL_EXCLUSION_V3: "Product deactivation",
1818
+ PERIPHERAL_INSERTION: "Insert peripheral",
1819
+ PHONE_LINE_FAULT: "Telephone line fault",
1820
+ PHOTOS_EMPTY_TEXT: "Control your equipment directly from photos of the rooms in your home.\n\nUse the settings menu to add a new photo",
1821
+ PILE_FAULT_REPETITION: "Battery error",
1822
+ PIN_FAULT: "PIN code error",
1823
+ PLAY_ROOM: "Play room",
1824
+ POOL: "Pool",
1825
+ PORCH: "Porch",
1826
+ PRACTICE: "Practice",
1827
+ PREALARM: "Pre-alarm",
1828
+ PREMISES: "Premises",
1829
+ PROG_MOMENT_ACTIONS_EXPLICATION: "Define the action to take for the devices selected at the start time of the moment",
1830
+ PROG_MOMENT_ACTIONS_NO_EQUIPMENTS: "This moment does not contain any devices. Start by selecting devices to control then define an action",
1831
+ PROG_MOMENT_ACTIONS_TITLE: "Actions at start",
1832
+ PROG_MOMENT_ADD: "Add the new moment prior to quitting",
1833
+ PROG_MOMENT_ADD_NO_EQUIPMENTS: "This moment does not contain any devices. Would you like to add a device to the moment",
1834
+ PROG_MOMENT_ASTRO: "Astronomical function",
1835
+ PROG_MOMENT_ASTRO_CELL_STOP_DISABLE: "Disabled",
1836
+ PROG_MOMENT_ASTRO_EXPLICATION: "By activating the astronomical feature, you can trigger a moment based on the sunrise or sunset",
1837
+ PROG_MOMENT_ASTRO_HOUR_SUNRISE: "Sunrise time",
1838
+ PROG_MOMENT_ASTRO_HOUR_SUNSET: "Sunset time",
1839
+ PROG_MOMENT_ASTRO_NEVER_AFTER: "Never after",
1840
+ PROG_MOMENT_ASTRO_NEVER_BEFORE: "Never before",
1841
+ PROG_MOMENT_ASTRO_STOP_EXPLICATION_AFTER: "By selecting the 'never after' option, the latest the moment will start is the time set below",
1842
+ PROG_MOMENT_ASTRO_STOP_EXPLICATION_BEFORE: "By selecting the 'never before' option, the earliest the moment will start is the time set below",
1843
+ PROG_MOMENT_ASTRO_STOP_NEVER_AFTER: "Never after",
1844
+ PROG_MOMENT_ASTRO_STOP_NEVER_BEFORE: "Never before",
1845
+ PROG_MOMENT_ASTRO_STOP_TITLE: "Limit",
1846
+ PROG_MOMENT_ASTRO_SUNRISE: "Sunrise",
1847
+ PROG_MOMENT_ASTRO_SUNSET: "Sunset",
1848
+ PROG_MOMENT_ASTRO_TITLE: "Astronomical clock",
1849
+ PROG_MOMENT_ASTRO_TODAY: "Today",
1850
+ PROG_MOMENT_CELL_ACTIONS: "Define actions",
1851
+ PROG_MOMENT_CELL_ASTRO_CLOCK: "Astronomical clock",
1852
+ PROG_MOMENT_CELL_COLOR: "Colour",
1853
+ PROG_MOMENT_CELL_DEACTIVATE: "Deactivate this moment",
1854
+ PROG_MOMENT_CELL_EQUIPMENTS: "devices",
1855
+ PROG_MOMENT_CELL_HOUR: "Time",
1856
+ PROG_MOMENT_CELL_HOUR_MOMENT: "Time of moment",
1857
+ PROG_MOMENT_CELL_NAME: "Name",
1858
+ PROG_MOMENT_CELL_RECURRENCE: "Recurrence",
1859
+ PROG_MOMENT_CELL_REMOVE_MOMENT: "Delete the moment",
1860
+ PROG_MOMENT_CELL_SELECT_EQUIPMENTS: "Select devices",
1861
+ PROG_MOMENT_COLORS: "Colours",
1862
+ PROG_MOMENT_DEACTIVATE: "Moment deactivated",
1863
+ PROG_MOMENT_EQUIPMENTS_EXPLICATION: "Select the devices that you want to activate during this moment",
1864
+ PROG_MOMENT_EQUIPMENTS_TITLE: "List of devices",
1865
+ PROG_MOMENT_NAME_DEFAULT: "New moment",
1866
+ PROG_MOMENT_NAME_TITLE: "Name",
1867
+ PROG_MOMENT_NOT_PLAY: "This moment will no longer be played",
1868
+ PROG_MOMENT_NO_EQUIPMENTS: "No device",
1869
+ PROG_MOMENT_POPUP_DAY_LIMIT_MESSAGE: "You have reached the maximum number of 24 moments for the day",
1870
+ PROG_MOMENT_POPUP_LIMIT_TITLE: "Moment could not be created",
1871
+ PROG_MOMENT_POPUP_SAME_HOUR_LIMIT_MESSAGE: "You have reached the maximum number of 2 moments at the same time of the day for %s",
1872
+ PROG_MOMENT_POPUP_TOTAL_LIMIT_MESSAGE: "You have reached the maximum number of 48 moments in your programming",
1873
+ PROG_MOMENT_RECURRENCE_TITLE: "Recurrence",
1874
+ PROG_MOMENT_REMOVE: "This moment will be deleted from your programming",
1875
+ PROG_MOMENT_UPDATE_NO_EQUIPMENTS: "This moment does not contain any devices. Would you like to add a device to the moment",
1876
+ PROG_SUSPEND: "Suspending scheduling",
1877
+ PROG_SUSPEND_DATE: "Date",
1878
+ PROG_SUSPEND_EXPLICATION: "You can completely suspend the programming of your home. No moment will be applied for the period of your choice",
1879
+ PROG_SUSPEND_HOUR: "Time",
1880
+ PROG_SUSPEND_INDEFINITELY: "Indefinitely",
1881
+ PROG_SUSPEND_TITLE: "Suspend",
1882
+ PROG_SUSPEND_UNTIL: "Up until",
1883
+ PROG_SUSPEND_UNTIL_TEXT: "Programming will automatically resume the",
1884
+ PROG_TITLE_SHORT: "Prog",
1885
+ PUK_FAULT: "PUK code error",
1886
+ QR_CODE_SERIAL_TEXT: "QR_CODE_SERIAL_TEXT",
1887
+ QR_CODE_SERIAL_TITLE: "QR_CODE_SERIAL_TITLE",
1888
+ RADIO_FAULT: "RF fault",
1889
+ RECEPTION: "Reception",
1890
+ REMOTE_DELETION: "Commands deletion",
1891
+ ROOM: "Room",
1892
+ ROOMS_EMPTY_TEXT: "With the rooms, bring together the units of equipment for the same zone for quicker access.\n\nUse the settings menu to create a room",
1893
+ SCENARIOS_EMPTY_TEXT: "With the scenarios, you can combine several actions on your equipment. For example, the 'Leave' scenario switches off the lights and closes the shutters.\n\nUse the settings menu to generate a scenario",
1894
+ SCULLERY: "Scullery",
1895
+ SEARCH_PLACEHOLDER: "Search",
1896
+ SECRETARIAT: "Secretariat",
1897
+ SELF_PROTECTION_EXCLUSION: "AP disabled",
1898
+ SELF_PROTECTION_FAULT: "Tamper alarm",
1899
+ SELF_TEST_REQUEST: "Self-test request",
1900
+ SERVER_ACCESS: "Server access",
1901
+ SETTINGS_ABANDON_WITHOUT_SAVE_MESSAGE: "Do you wish to cancel without saving your changes",
1902
+ SETTINGS_ABOUT: "About",
1903
+ SETTINGS_ACCOUNT: "Account",
1904
+ SETTINGS_ADD: "Add",
1905
+ SETTINGS_ADD_PRODUCT: "Add a device",
1906
+ SETTINGS_ALARM_DELETE: "To be able to remove the control unit, you must first switch it to maintenance mode",
1907
+ SETTINGS_ALERTS_ACTIVATED: "Event notifications activated",
1908
+ SETTINGS_ALERTS_ACTIVATED_DETAILS: "You will be notified about events occurring in your home",
1909
+ SETTINGS_ALERTS_DESCRIPTION: "Be alerted about events occurring in your home",
1910
+ SETTINGS_ALERTS_EVENTS_ALERT: "Event notifications",
1911
+ SETTINGS_ALERTS_EVENTS_ALERT_DETAILS: "When you activate this function, your alarm system informs you about events occurring in your home",
1912
+ SETTINGS_ALERTS_FAMILY_CARE_ALERT: "Family care alerts",
1913
+ SETTINGS_ALERTS_INTRUSION_ALERT: "Intruder alerts",
1914
+ SETTINGS_ALERTS_SECTION_TITLE_SECURITY: "SECURITY",
1915
+ SETTINGS_ALERTS_TECHNIC_ALERT: "Technical alerts",
1916
+ SETTINGS_ASSOCIATE_WIFI_CONTENT_TITLE: "SETTINGS_ASSOCIATE_WIFI_CONTENT_TITLE",
1917
+ SETTINGS_ASSOCIATE_WIFI_DETAILS: "SETTINGS_ASSOCIATE_WIFI_DETAILS",
1918
+ SETTINGS_ASSOCIATE_WIFI_TITLE: "SETTINGS_ASSOCIATE_WIFI_TITLE",
1919
+ SETTINGS_CGU: "General conditions of use",
1920
+ SETTINGS_CGU_CANCEL: "Refuse",
1921
+ SETTINGS_CONNECT_DONGLE: "Connect the USB Zigbee dongle to the USB port of your TYDOM home automation unit",
1922
+ SETTINGS_CONTACT: "Contact us",
1923
+ SETTINGS_CONTACT_US: "Contact us",
1924
+ SETTINGS_COPYRIGHT: "Copyright",
1925
+ SETTINGS_DELETE: "Delete",
1926
+ SETTINGS_DELETE_DISCONNECTED: "You are logged out, you cannot remove equipment",
1927
+ SETTINGS_DELETE_ERROR: "Equipment cannot be removed",
1928
+ SETTINGS_EXPERT_MODE: "Expert mode",
1929
+ SETTINGS_FIND_SUPPORT: "Find an installer",
1930
+ SETTINGS_GROUPS: "Groups",
1931
+ SETTINGS_GROUPS_ADD_BEFORE_CANCEL_TEXT: "Add the new group prior to quitting",
1932
+ SETTINGS_GROUPS_ALL_NAME: "TOTAL",
1933
+ SETTINGS_GROUPS_CREATE: "Add a group",
1934
+ SETTINGS_GROUPS_CREATE_TEXT: "A group allows a single command to be made to multiple devices simultaneously",
1935
+ SETTINGS_GROUPS_DEFAULT_NAME: "New group",
1936
+ SETTINGS_GROUPS_DELETE: "Delete the group",
1937
+ SETTINGS_GROUPS_DELETE_MESSAGE: "This group will be removed from the group list",
1938
+ SETTINGS_GROUPS_EMPTY_ADD_TEXT: "This group contains no devices.\nWould you like to add a device to the group",
1939
+ SETTINGS_GROUPS_MAX_NUMBER: "The maximum number of 27 groups has been reached",
1940
+ SETTINGS_GROUPS_NONE_EQUIPMENT_TITLE: "No device",
1941
+ SETTINGS_GROUPS_SELECT_EQUIPMENTS_TEXT: "Select the devices to add to the group",
1942
+ SETTINGS_GROUPS_SELECT_HVAC_LEVEL_TEXT: "Mode",
1943
+ SETTINGS_GROUPS_SELECT_HVAC_SETPOINT_TEXT: "Setting",
1944
+ SETTINGS_GROUPS_SELECT_NONE_TEXT: "None",
1945
+ SETTINGS_GROUPS_SELECT_TYPE_GROUP: "SELECT A GROUP",
1946
+ SETTINGS_HOME_PAGE: "Homepage",
1947
+ SETTINGS_INSTALLER: "Install",
1948
+ SETTINGS_INSTALL_FAILURE: "Could not install Zigbee dongle. Please try again",
1949
+ SETTINGS_INSTALL_ON_GOING: "Installing\u2026",
1950
+ SETTINGS_INSTALL_ZIGBEE: "Before associating these devices, you must install the Zigbee protocol.\n\nPress INSTALL to continue",
1951
+ SETTINGS_INSTALL_ZIGBEE_FAILED_TEXT: "Could not install Zigbee protocol. Please try again",
1952
+ SETTINGS_INSTALL_ZIGBEE_FAILED_TITLE: "Installation error",
1953
+ SETTINGS_LEGAL_NOTICES: "Legal information",
1954
+ SETTINGS_MENU_SECTION_CUSTOMIZATION: "Personalisation",
1955
+ SETTINGS_MENU_SECTION_GENERAL: "General",
1956
+ SETTINGS_MENU_SECTION_HELP: "Help",
1957
+ SETTINGS_MENU_SECTION_INSTALLATION: "Installation",
1958
+ SETTINGS_MENU_SECTION_PROFILES: "Profiles",
1959
+ SETTINGS_MENU_SECTION_SUPPORT: "Support",
1960
+ SETTINGS_MY_GROUPS: "My groups",
1961
+ SETTINGS_MY_PHOTOS: "My photos",
1962
+ SETTINGS_MY_PROFILE: "My Profile",
1963
+ SETTINGS_MY_SCENARIOS: "My scenarios",
1964
+ SETTINGS_MY_SITES: "My homes",
1965
+ SETTINGS_NAME: "Name",
1966
+ SETTINGS_NEW: "New",
1967
+ SETTINGS_NOTIFICATIONS_ALERTS_DESCRIPTION: "Be alerted by notifications about events occurring in your home",
1968
+ SETTINGS_PHOTOS_ADD_TIP_TEXT: "Add equipment control",
1969
+ SETTINGS_PHOTOS_APPEARANCE_ALPHA: "Transparency",
1970
+ SETTINGS_PHOTOS_APPEARANCE_SCALE: "Scale",
1971
+ SETTINGS_PHOTOS_APPEARANCE_SHOW_NAME: "Display name",
1972
+ SETTINGS_PHOTOS_APPEARANCE_TEXT: "Adjust the control buttons to your photos",
1973
+ SETTINGS_PHOTOS_CANCEL_MESSAGE: "Add the new photo prior to quitting",
1974
+ SETTINGS_PHOTOS_CREATE: "Add a photo",
1975
+ SETTINGS_PHOTOS_CREATE_TEXT: "Control your equipment directly using photos of your home interior",
1976
+ SETTINGS_PHOTOS_DEFAULT_NAME: "New photo",
1977
+ SETTINGS_PHOTOS_DELETE: "Delete photo",
1978
+ SETTINGS_PHOTOS_DELETE_AREA_TEXT: "Drag here to delete a button",
1979
+ SETTINGS_PHOTOS_EDIT: "Edit photo",
1980
+ SETTINGS_PHOTOS_ITEMS_APPEARANCE: "Button design",
1981
+ SETTINGS_PHOTOS_MANAGE_ITEMS: "Manage buttons",
1982
+ SETTINGS_PHOTOS_SELECT_TARGET: "Select a unit, group or scenario",
1983
+ SETTINGS_PHOTOS_SELECT_TARGET_TEXT: "Select a unit, group or scenario you want to pair with the button",
1984
+ SETTINGS_PHOTOS_ZOOM: "Blocks the zoom",
1985
+ SETTINGS_PHOTOS_ZOOM_TEXT: "Block the resize function on your photo.\n\nIf this feature is disabled, you will no longer be able to pinch with two fingers to resize the photo",
1986
+ SETTINGS_PHOTO_LIBRARY: "Photo library",
1987
+ SETTINGS_PHOTO_TAKE_PICTURE: "Take a photo",
1988
+ SETTINGS_PICTO: "Icon",
1989
+ SETTINGS_PRIVACY_POLICY: "Confidentiality policy",
1990
+ SETTINGS_QR_CODE_SERIAL_ADD_TEXT: "SETTINGS_QR_CODE_SERIAL_ADD_TEXT",
1991
+ SETTINGS_ROOMS: "Rooms",
1992
+ SETTINGS_SCAN_ZIGBEE: "Press START to view your system\u2019s Zigbee devices",
1993
+ SETTINGS_SCENARIOS: "Scenarios",
1994
+ SETTINGS_SCENARIOS_CANCEL_MESSAGE: "Add the new scenario prior to quitting",
1995
+ SETTINGS_SCENARIOS_CREATE: "Create a scenario",
1996
+ SETTINGS_SCENARIOS_CREATE_TEXT: "The scenario enables the combination of several actions simultaneously.\nExample : The 'Leaving' scenario switches off the lighting, closes the roller shutters and activates surveillance (alarm",
1997
+ SETTINGS_SCENARIOS_DEFAULT_NAME: "New scenario",
1998
+ SETTINGS_SCENARIOS_DELETE: "Delete the scenario",
1999
+ SETTINGS_SCENARIOS_DELETE_MESSAGE: "This scenario will be deleted from the list of scenarios and moments if it had been added to programming",
2000
+ SETTINGS_SCENARIOS_MAX_MESSAGE: "The maximum number of %s scenarios has been reached",
2001
+ SETTINGS_SCENARIOS_MENU_ACTIONS: "Actions",
2002
+ SETTINGS_SCENARIOS_MENU_EQUIPMENTS: "Equipment",
2003
+ SETTINGS_SCENARIOS_SELECT_EQUIPMENTS: "Select the equipment",
2004
+ SETTINGS_SCENARIOS_SELECT_EQUIPMENTS_TEXT: "Select the equipment to play upon launch of scenario",
2005
+ SETTINGS_SCENARIOS_SET_ACTIONS: "Set actions",
2006
+ SETTINGS_SCENARIOS_SET_ACTIONS_TEXT: "Set actions for each device that will be affected upon launching the scenario",
2007
+ SETTINGS_SCENARIO_MAX: "The maximum number of 16 scenarios has been reached",
2008
+ SETTINGS_SELECT_PRODUCT: "Select a device",
2009
+ SETTINGS_SELECT_TYPE: "Select a type",
2010
+ SETTINGS_SERIAL_NUMBER: "SETTINGS_SERIAL_NUMBER",
2011
+ SETTINGS_SERVICES: "Services",
2012
+ SETTINGS_SITE_ADD: "Add an address",
2013
+ SETTINGS_SITE_ADD_TEXT: "Enter the name of your new home.\nFor example 'Main home' or 'Rennes",
2014
+ SETTINGS_SITE_ADVANCED_OPTIONS: "Advanced options",
2015
+ SETTINGS_SITE_DELETE: "Delete home",
2016
+ SETTINGS_SITE_DELETE_DIALOG_TITLE: "This home will be removed from the application and will not longer be available",
2017
+ SETTINGS_SITE_DELETE_IMPOSSIBLE_DIALOG_TEXT: "You cannot delete this home because you are connected to it",
2018
+ SETTINGS_SITE_DELETE_IMPOSSIBLE_DIALOG_TITLE: "Deletion impossible",
2019
+ SETTINGS_SITE_DELETE_TEXT: "Select the home or homes you want to delete from the application and press delete",
2020
+ SETTINGS_SITE_FORGOT_PASSWORD_TEXT: "The password TYDOM will be required when you next log in",
2021
+ SETTINGS_SITE_FORGOT_PASSWORD_TITLE: "Forget the password",
2022
+ SETTINGS_SITE_IDENDIFIER_ALERT: "Incorrect Mac address format",
2023
+ SETTINGS_SITE_IDENDIFIER_TEXT: "The site login is the last 6 characters of the MAC address on the back of your TYDOM box (e.g.: 00801E",
2024
+ SETTINGS_SITE_IDENTIFIER: "Identifier",
2025
+ SETTINGS_SITE_LOCALISATION_TEXT: "Locate your home on the map by pressing and holding the desired location",
2026
+ SETTINGS_SITE_LOCATION: "Localisation",
2027
+ SETTINGS_SITE_MAIN_SITE: "Main home",
2028
+ SETTINGS_SITE_PASSWORD: "Password",
2029
+ SETTINGS_SITE_PASSWORD_CONFIRMATION: "Password confirmation",
2030
+ SETTINGS_SITE_PASSWORD_ERROR: "The password does not meet the requirements",
2031
+ SETTINGS_SITE_PASSWORD_ERROR_SAME_PASSWORD: "The two passwords do not match",
2032
+ SETTINGS_SITE_PASSWORD_TEXT: "Enter a password for your TYDOM box then confirm your password.\nIt must contain at least 8 characters, at least one digit and at least one letter",
2033
+ SETTINGS_SITE_REPLACE: "Replace TYDOM",
2034
+ SETTINGS_SITE_REPLACE_IDENTIFIER_TEXT: "Once connected, enter the ID of the new TYDOM box.\nThe site ID is the last 6 characters of the MAC address, which can be found on the back of your TYDOM box (e.g. 00801E",
2035
+ SETTINGS_SITE_REPLACE_PASSWORD_ALERT: "Your password must be identical to the two entered",
2036
+ SETTINGS_SITE_REPLACE_PASSWORD_NEW: "New password",
2037
+ SETTINGS_SITE_REPLACE_PASSWORD_OLD: "Old password",
2038
+ SETTINGS_SITE_REPLACE_RESET: "Reset to zero",
2039
+ SETTINGS_SITE_REPLACE_RESET_ALERT: "The new TYDOM box will be reset to zero, and all information will be deleted",
2040
+ SETTINGS_SITE_REPLACE_TEXT: "Select the TYDOM you want to replace",
2041
+ SETTINGS_SITE_SAVE_PASSWORD_TEXT: "Store the password",
2042
+ SETTINGS_SITE_UPDATE_NEW_ERROR_PASSWORD_TITLE: "New password is incorrect",
2043
+ SETTINGS_SITE_UPDATE_OLD_ERROR_PASSWORD_TEXT: "The old password is incorrect, please try again",
2044
+ SETTINGS_SITE_UPDATE_OLD_ERROR_PASSWORD_TITLE: "Old password is incorrect",
2045
+ SETTINGS_SITE_UPDATE_PASSWORD_TEXT: "To log in to the TYDOM, use the new password",
2046
+ SETTINGS_SITE_UPDATE_PASSWORD_TITLE: "Modification successfully completed",
2047
+ SETTINGS_STARTUP_TAB: "Start tab",
2048
+ SETTINGS_SUPPORT: "Support",
2049
+ SETTINGS_TITLE: "SETTINGS",
2050
+ SETTINGS_UNMANAGED: "Not managed",
2051
+ SETTINGS_WEBSITE: "Website",
2052
+ SETTINGS_WIFI_GENERATED_QR_CODE_TEXT: "SETTINGS_WIFI_GENERATED_QR_CODE_TEXT",
2053
+ SETTINGS_WIFI_PASSWORD_ADD_TEXT: "SETTINGS_WIFI_PASSWORD_ADD_TEXT",
2054
+ SETTING_ASSOCIATE_CAMERA_ETH_ACTION_MSG: "SETTING_ASSOCIATE_CAMERA_ETH_ACTION_MSG",
2055
+ SETTING_ASSOCIATE_CAMERA_NETWORK: "SETTING_ASSOCIATE_CAMERA_NETWORK",
2056
+ SETTING_ASSOCIATE_CAMERA_POE_ACTION_MSG: "SETTING_ASSOCIATE_CAMERA_POE_ACTION_MSG",
2057
+ SETTING_ASSOCIATE_CAMERA_SCANQRCODE_INDICATION: "SETTING_ASSOCIATE_CAMERA_SCANQRCODE_INDICATION",
2058
+ SETTING_ASSOCIATE_CAMERA_SCANQRCODE_MANUAL_INPUT: "SETTING_ASSOCIATE_CAMERA_SCANQRCODE_MANUAL_INPUT",
2059
+ SETTING_ASSOCIATE_CAMERA_SCANQRCODE_TITLE: "SETTING_ASSOCIATE_CAMERA_SCANQRCODE_TITLE",
2060
+ SETTING_ASSOCIATE_CAMERA_TO_SERVER: "SETTING_ASSOCIATE_CAMERA_TO_SERVER",
2061
+ SETTING_ASSOCIATE_CAMERA_TO_YOUR_ACCOUNT: "SETTING_ASSOCIATE_CAMERA_TO_YOUR_ACCOUNT",
2062
+ SETTING_ASSOCIATE_CAMERA_WIFI_ACTION_MSG: "SETTING_ASSOCIATE_CAMERA_WIFI_ACTION_MSG",
2063
+ SETTING_ASSOCIATE_CAMERA_WPS_ACTION_MSG: "SETTING_ASSOCIATE_CAMERA_WPS_ACTION_MSG",
2064
+ SETTING_ASSOCIATE_REINITIALIZE_CAMERA: "SETTING_ASSOCIATE_REINITIALIZE_CAMERA",
2065
+ SETTING_ASSOCIATE_REINITIALIZE_DESCRIPTION: "SETTING_ASSOCIATE_REINITIALIZE_DESCRIPTION",
2066
+ SETTING_ASSOCIATE_REINITIALIZE_TITLE: "SETTING_ASSOCIATE_REINITIALIZE_TITLE",
2067
+ SETTING_EXPERT_FREE_EQUIPMENT: "s locations available",
2068
+ SETTING_EXPERT_MODE_NETWORK: "Network %s",
2069
+ SETTING_EXPERT_MODE_NETWORK_CHOICE: "Network selection",
2070
+ SETTING_EXPERT_MODE_NETWORK_DEFAULT: "By default",
2071
+ SETTING_EXPERT_MODE_TUTO: "Ensure that the device\n is waiting to be associated\n before continuing",
2072
+ SETTING_GROUP_FAVOURITE_ADD_MESSAGE: "Your group is directly accessible from the homepage",
2073
+ SETTING_GROUP_FAVOURITE_DELETE_MESSAGE: "Your group will no longer be accessible from the homepage",
2074
+ SETTING_GROUP_MODE_ASSO_MESSAGE: "The devices in the group are waiting to be associated",
2075
+ SETTING_GROUP_SUPPRIMER_MESSAGE: "This group will be deleted from your installation",
2076
+ SETTING_LABEL: "Label creation",
2077
+ SETTING_MY_EQUIPMENT: "My devices",
2078
+ SETTING_PARTIAL_DETECTOR: "Detector created in partial",
2079
+ SETTING_PHONE: "Modification to telephone parameters",
2080
+ SETTING_PRODUCT_CAMERA_DETECTION: "SETTING_PRODUCT_CAMERA_DETECTION",
2081
+ SETTING_PRODUCT_CAMERA_DOMAINE_NAME: "SETTING_PRODUCT_CAMERA_DOMAINE_NAME",
2082
+ SETTING_PRODUCT_CAMERA_FIRMWWARE: "SETTING_PRODUCT_CAMERA_FIRMWWARE",
2083
+ SETTING_PRODUCT_CAMERA_IMAGE: "SETTING_PRODUCT_CAMERA_IMAGE",
2084
+ SETTING_PRODUCT_CAMERA_INFO: "SETTING_PRODUCT_CAMERA_INFO",
2085
+ SETTING_PRODUCT_CAMERA_MODEL: "SETTING_PRODUCT_CAMERA_MODEL",
2086
+ SETTING_PRODUCT_CAMERA_NETWORK: "SETTING_PRODUCT_CAMERA_NETWORK",
2087
+ SETTING_PRODUCT_CAMERA_STATE: "SETTING_PRODUCT_CAMERA_STATE",
2088
+ SETTING_PRODUCT_CAMERA_STORAGE: "SETTING_PRODUCT_CAMERA_STORAGE",
2089
+ SETTING_PRODUCT_LOCALISER: "Locate",
2090
+ SETTING_PRODUCT_LOCALISER_MESSAGE: "Your device is now flashing where this is performed to help you find it",
2091
+ SETTING_PRODUCT_MASKED: "Hide",
2092
+ SETTING_PRODUCT_MASKED_MESSAGE: "This device is now hidden.\n It will not be visible any more,\n and can no longer be controlled",
2093
+ SETTING_PRODUCT_METIER: "Activity",
2094
+ SETTING_PRODUCT_MODE_ASSO: "Association mode",
2095
+ SETTING_PRODUCT_MODE_ASSO_MESSAGE: "Your device is now waiting to be associated",
2096
+ SETTING_PRODUCT_NAME: "Name",
2097
+ SETTING_PRODUCT_NO_MASKED_MESSAGE: "This device is no longer hidden",
2098
+ SETTING_PRODUCT_OPTION_AVANCEES: "Advanced options",
2099
+ SETTING_PRODUCT_PICTOGRAMME: "Icon",
2100
+ SETTING_PRODUCT_SELECT_METIER: "Select an activity",
2101
+ SETTING_PRODUCT_SUPPRIMER_MESSAGE: "This device will be deleted from your installation",
2102
+ SETTING_PRODUCT_WIDGET_BEHAVIOR_BSO_DIMMER: "90\xB0 / 180\xB0",
2103
+ SETTING_PRODUCT_WIDGET_BEHAVIOR_SHUTTER_DIMMER: "Roller-Swing",
2104
+ SETTING_SCENARIO_SUPPRIMER_MESSAGE: "This scenario will be deleted from the list of scenarios and moments if it had been added to programming",
2105
+ SETTING_TIME: "Setting the time",
2106
+ SETTING_WINDOW_FAVOURITE_ADD_MESSAGE: "Your window is directly accessible from the homepage",
2107
+ SETTING_WINDOW_FAVOURITE_DELETE_MESSAGE: "Your window will no longer be available from the homepage",
2108
+ SETTING_WINDOW_SUPPRIMER_MESSAGE: "This window will be deleted from your setup",
2109
+ SHOP: "Shop",
2110
+ SHOPWINDOW: "Window",
2111
+ SHOP_WINDOW: "Shop window",
2112
+ SHOWROOM: "Showroom",
2113
+ SHOW_WIFI_PASSWORD: "SHOW_WIFI_PASSWORD",
2114
+ SHUTDOWN_PRODUCT: "Shutdown",
2115
+ SHUTTER_CONTROL_CLOSE: "Closed",
2116
+ SHUTTER_CONTROL_GROUP_UNKNOWN: "different positions",
2117
+ SHUTTER_CONTROL_OPEN: "Open",
2118
+ SHUTTER_CONTROL_POURCENT: "s %% closed",
2119
+ SHUTTER_CONTROL_STOP: "Deactivate",
2120
+ SHUTTER_CONTROL_UNKNOWN: "Position unknown",
2121
+ SHUTTER_DEFAULT_BATTERY_DEFECT: "Battery defect",
2122
+ SHUTTER_DEFAULT_CLOSE_SLOPE_DEFECT: "Angle not authorised",
2123
+ SHUTTER_DEFAULT_DOWN_DEFECT: "Lower not authorised",
2124
+ SHUTTER_DEFAULT_OBSTACLE_DEFECT: "Obstacle detected",
2125
+ SHUTTER_DEFAULT_OBSTACLE_SLOPE_DEFECT: "Angle obstacle detected",
2126
+ SHUTTER_DEFAULT_OPEN_SLOPE_DEFECT: "Angle not authorised",
2127
+ SHUTTER_DEFAULT_THERMIC_DEFECT: "Motor overheated",
2128
+ SHUTTER_DEFAULT_THERMIC_SLOPE_DEFECT: "Tilt motor overheated",
2129
+ SHUTTER_DEFAULT_UP_DEFECT: "Raise not authorised",
2130
+ SHUTTER_INFO_INTRUSION: "Break-in attempt",
2131
+ SIM_FAULT: "SIM card missing",
2132
+ SITE_ADD_TEXT: "First, press 'New Home' to log in to your TYDOM home automation box",
2133
+ SITE_FAILED_CONNEXION_MESSAGE: "Check the data you have entered and make sure you are connected to the same network as your TYDOM box",
2134
+ SITE_FAILED_CONNEXION_TITLE: "Connection failed",
2135
+ SITE_LOCALISATION_POPUP_MESSAGE: "To have all the services, you must activate the location service.\nDo you want to activate this service",
2136
+ SITE_LOCALISATION_POPUP_TITLE: "Location service deactivated",
2137
+ SITE_MAC_ADDRESS_DIALOG_HEADER: "This login already exists",
2138
+ SITE_MAC_ADDRESS_DIALOG_MESSAGE: "The login is already used for one of your other homes",
2139
+ SITE_MODE_DEMO: "Demo mode",
2140
+ SITE_MODE_DEMO_ON: "Exit the demo mode",
2141
+ SITE_NAME_DIALOG_HEADER: "This name already exists",
2142
+ SITE_NAME_DIALOG_MESSAGE: "The name is already used for one of your other homes",
2143
+ SITE_NEW: "New home",
2144
+ SITE_NEW_DEFAULT_NAME: "My home",
2145
+ SITE_NEW_ERROR: "Please fill in all fields",
2146
+ SITE_NEW_TEXT: "Fill out the following fields and press 'Add' to complete the installation of your TYDOM box",
2147
+ SMS_VIDEO_MESSAGE: "An SMS with a link to the video will shortly be sent to the authorised numbers",
2148
+ SMS_VIDEO_TITLE: "Request sent",
2149
+ SOFT_UPDATED: "Update",
2150
+ SPA: "Spa",
2151
+ SPORT_HALL: "Sports hall",
2152
+ STAIRCASE: "Staircase",
2153
+ STAIRWAY: "Staircase",
2154
+ START_PRODUCT: "Start",
2155
+ STORAGE_ROOM: "Stockroom",
2156
+ STOREROOM: "Storeroom",
2157
+ SUMMER_KITCHEN: "Summer kitchen",
2158
+ SUPP_CURRENT_POINT: "Delete peripheral",
2159
+ SUPP_DANS_SCENARIOS: "the alarm will also be deleted in the scenarios",
2160
+ TECHNICAL_ALARM: "Technical fault",
2161
+ TELECHARGER_NOYAU: "Download",
2162
+ TELECOM_LINE_FAULT: "RTC line error",
2163
+ TELEMONITORING_FAULT: "Tele-surveillance fault",
2164
+ TERRACE: "Terrace",
2165
+ TEST_MODE: "Test mode",
2166
+ TIMELINE_CAMERA_LIVE: "TIMELINE_CAMERA_LIVE",
2167
+ TOILET: "Toilet",
2168
+ TYCAM_ECHEC_CONNEXION: "Connection to the server impossible",
2169
+ TYXAL_PLUS: "Tyxal ",
2170
+ UNACKNOWLEDGED_EVENTS: "Not cleared",
2171
+ UPDATE_TYDOM_INPROGRESS_MESSAGE: "The update of your home automation box may take a few minutes.\nClose the application and restart it",
2172
+ UPDATE_TYDOM_INPROGRESS_TITLE: "Update in progress",
2173
+ UPDATE_TYDOM_LATER: "Later",
2174
+ UPDATE_TYDOM_MESSAGE: "An update for your TYDOM home automation box is available.\nDo you want to update",
2175
+ UPDATE_TYDOM_TITLE: "Update",
2176
+ UTILITY_ROOM: "Utility room",
2177
+ VALID: "Confirm",
2178
+ VERANDA: "Veranda",
2179
+ VIDEO: "Video request",
2180
+ VIDEO_FAULT: "Video failed",
2181
+ VIDEO_LINK_FAULT: "Video link error",
2182
+ WAITING_ROOM: "Waiting room",
2183
+ WAREHOUSE: "Warehouse",
2184
+ WC: "WC",
2185
+ WIFI_PASSWORD: "WIFI_PASSWORD",
2186
+ WIFI_PASSWORD_EMPTY_FIELD: "WIFI_PASSWORD_EMPTY_FIELD",
2187
+ WIFI_PASSWORD_UPDATED: "WIFI_PASSWORD_UPDATED",
2188
+ WINDOW: "Window",
2189
+ WORKSHOP: "Workshop",
2190
+ WORK_SITE: "Work site",
2191
+ WRONG_ACCESS_CODE: "Incorrect access code",
2192
+ YARD: "Yard",
2193
+ ZONE_AUTRE: "Other zone"
2194
+ };
2195
+
2196
+ // src/config/i18n/fr.ts
2197
+ var fr_default = {
2198
+ ABOUT_API_MODE: "Mode API",
2199
+ ABOUT_BDDMIGRATION_FILE_VERSION: "Version bdd_mig.json",
2200
+ ABOUT_BDD_FILE_VERSION: "Version bdd.json",
2201
+ ABOUT_BOOT: "Plan logiciel boot",
2202
+ ABOUT_BOOT_VERSION: "Version logiciel boot",
2203
+ ABOUT_COLLECT_FILE_VERSION: "Version collect.json",
2204
+ ABOUT_CONF: "Infrastructure",
2205
+ ABOUT_CONFIG_FILE_VERSION: "Version config.json",
2206
+ ABOUT_DEFAULT_GATEWAY: "Passerelle par d\xE9faut",
2207
+ ABOUT_DEMO: "D\xE9monstration",
2208
+ ABOUT_DHCP: "DHCP",
2209
+ ABOUT_DNS1: "DNS 1",
2210
+ ABOUT_DNS2: "DNS 2",
2211
+ ABOUT_GATEWAY_FILE_VERSION: "Version gateway.json",
2212
+ ABOUT_GROUPS_FILE_VERSION: "Version groups.json",
2213
+ ABOUT_HARDWARE_KEY_VERSION: "Version mat\xE9riel cl\xE9",
2214
+ ABOUT_HARDWARE_TYDOM_VERSION: "Version mat\xE9riel Tydom",
2215
+ ABOUT_IDENTIFIANT: "R\xE9f\xE9rence Tydom",
2216
+ ABOUT_INFOMIGRATION_FILE_VERSION: "Version info_mig.json",
2217
+ ABOUT_IP: "IP",
2218
+ ABOUT_KEY: "Plan logiciel cl\xE9",
2219
+ ABOUT_MAC: "Adresse MAC",
2220
+ ABOUT_MOMAPI_FILE_VERSION: "Version mom_api.json",
2221
+ ABOUT_MOM_FILE_VERSION: "Version mom.json",
2222
+ ABOUT_NETWORK_MASK: "Masque r\xE9seau",
2223
+ ABOUT_PRODUCT_NAME: "TYDOM",
2224
+ ABOUT_REFERENCE: "Plan logiciel Tydom",
2225
+ ABOUT_SCENARIO_FILE_VERSION: "Version scenario.json",
2226
+ ABOUT_SITE_FILE_VERSION: "Version site.json",
2227
+ ABOUT_SOFTWARE_APP_VERSION: "Version logiciel Application",
2228
+ ABOUT_SOFTWARE_KEY_VERSION: "Version logiciel cl\xE9",
2229
+ ABOUT_SOFTWARE_TYDOM_VERSION: "Version logiciel Tydom",
2230
+ ABOUT_STACK_KEY_VERSION: "Version logiciel stack",
2231
+ ABOUT_TYCAM: "Tycam",
2232
+ ABOUT_TYDOM_FILE_VERSION: "Version Tydom.dat",
2233
+ ABOUT_UPDATE_AVAILABLE: "Nouvelle version disponible",
2234
+ ABOUT_URL_MEDIATION: "URL m\xE9diation",
2235
+ ACTIVE_ALERTS_INTRUSION: "En activant cette fonction, votre syst\xE8me d\u2019alarme vous alertera des d\xE9tections d\u2019intrusion.",
2236
+ ACTIVE_ALERT_WITH_TYXAL_PLUS: "Pour activer ces alertes, vous devez disposer d\u2019un syst\xE8me d\u2019alarme",
2237
+ ADD_DETECTOR: "Ajouter un d\xE9tecteur",
2238
+ ALARME_ACCESS_CODE: "Code d'acc\xE8s",
2239
+ ALARME_ARRET: "Arr\xEAt",
2240
+ ALARME_CODE_MODIFIE: "Le code d'acc\xE8s de l'alarme a bien \xE9t\xE9 modifi\xE9.",
2241
+ ALARME_CODE_MODIFIE_TEXTE: "Le code d'acc\xE8s de l'alarme a bien \xE9t\xE9 modifi\xE9.",
2242
+ ALARME_CODE_MODIFIE_TITLE: "Code modifi\xE9",
2243
+ ALARME_COUP_OEIL: "Coup d'oeil",
2244
+ ALARME_DEFINIR_CODE: "D\xE9finir un code d'acc\xE8s",
2245
+ ALARME_ENTER_CODE: "Saisie du code",
2246
+ ALARME_HISTORIQUES: "Historiques",
2247
+ ALARME_ISSUES_OUVERTES: "Issues ouvertes",
2248
+ ALARME_MARCHE: "Marche",
2249
+ ALARME_MARCHE_TOTALE: "Marche totale",
2250
+ ALARME_NO_RESPONSE: "Pas de r\xE9ponse de la centrale",
2251
+ ALARME_ON_PARTIAL: "Marche partielle",
2252
+ ALARME_PARTIAL: "Partielle",
2253
+ ALARME_PASSAGE_MODE_MAINTENANCE: "Pour changer le code d'acc\xE8s, passez la centrale en mode maintenance.",
2254
+ ALARM_CODE_INSTALLER_TEXT: "Cette action requiert le code installateur.",
2255
+ ALARM_DEFAULTS_AUTOPROTECTION: "\xC9quipements en autoprotection",
2256
+ ALARM_DEFAULTS_CLEAR_DIALOG: "Voulez-vous effacer les d\xE9fauts non acquitt\xE9s ?",
2257
+ ALARM_DEFAULTS_PENDING: "D\xE9fauts en cours",
2258
+ ALARM_DEFAULTS_PRODUCTS_INACTIVE: "\xC9quipements inactifs",
2259
+ ALARM_DEFAULTS_UNACKED: "D\xE9fauts non acquitt\xE9s",
2260
+ ALARM_HISTORIC_ALL: "Tous",
2261
+ ALARM_HISTORIC_ERROR_RESTART: "Relancer",
2262
+ ALARM_HISTORIC_ERROR_TITLE: "Op\xE9ration non aboutie",
2263
+ ALARM_HISTORIC_EVENTS: "\xC9v\xE8nements",
2264
+ ALARM_HISTORIC_ON_OFF: "Marche / Arr\xEAt",
2265
+ ALARM_INSTALLER: "Installateur",
2266
+ ALARM_TELECHARGER_NOYAU: "T\xE9l\xE9charger le noyau",
2267
+ ALARM_USER: "Utilisateur",
2268
+ ALARM_ZONE: "Zone",
2269
+ ALERTS: "Alertes",
2270
+ ALERTS_FAILED: "\xC9chec d'activation",
2271
+ ALERTS_FAILED_DETAILS: "L'envoi de notifications n'a pas pu \xEAtre activ\xE9, r\xE9essayez plus tard",
2272
+ ALERTS_INTRUSION_ACTIVATED: "Alertes intrusions activ\xE9es",
2273
+ ALERTS_NOT_AVAILABLE: "Alertes indisponibles",
2274
+ ALERT_CGU: "Pour continuer \xE0 utiliser l'application Tydom, veuillez lire et accepter les Conditions G\xE9n\xE9rales d'Utilisation.",
2275
+ ALERT_CGU1: "Pour continuer \xE0 utiliser l\u2019application Tydom, veuillez relancer l'application et accepter les Conditions G\xE9n\xE9rales d\u2019Utilisation.",
2276
+ ALERT_INTRUSION_DETECTION: "Alerte d\xE9tection intrusion",
2277
+ ALERT_TYCAM_NO_CALL_ANDROID_TEXT: "Impossible d'appeler avec cet appareil.",
2278
+ ALERT_TYCAM_NO_CALL_WITH_NUMBER_ANDROID_TEXT: "Impossible d'appeler avec cet appareil. Composez le %s sur votre t\xE9l\xE9phone pour obtenir de l'assistance",
2279
+ ALLEY: "All\xE9e",
2280
+ ALL_PERIPHERALS_DELETION: "Effacement de tous les points",
2281
+ ALL_PERIPHERALS_DELETION_EXCEPT_SIREN: "Eff. tous points sauf sir\xE8ne",
2282
+ ALL_PERIPHERALS_DELETION_EXCEPT_SIREN_V3: "Efface tout sauf sirene",
2283
+ ALL_PERIPHERALS_DELETION_V3: "Effacement total",
2284
+ AREA: "Zone",
2285
+ ARM_FAULT: "Refus de mise en marche",
2286
+ ARM_FAULT_RF: "Refus d\xE9faut r\xE9ception RF",
2287
+ ASSOCIATION_CURRENT_STEP_LABEL: "\xC9tape %d",
2288
+ ASSOCIATION_DISCONNECTED_ADD_EQUIPMENT: "Vous \xEAtes d\xE9connect\xE9, vous ne pouvez pas associer d'\xE9quipements",
2289
+ ASSOCIATION_ERROR: "Association impossible. V\xE9rifier qu'une association n'est pas d\xE9j\xE0 en cours",
2290
+ ASSOCIATION_FINISHED: "Termin\xE9",
2291
+ ASSOCIATION_FOUND_EQUIPMENT_PLURAL: "%d \xE9quipements trouv\xE9s",
2292
+ ASSOCIATION_FOUND_EQUIPMENT_SINGULAR: "%d \xE9quipement trouv\xE9",
2293
+ ASSOCIATION_LIMIT_TEXT: "Vous avez atteint le nombre maximum d'\xE9quipements.",
2294
+ ASSOCIATION_LIMIT_TITLE: "Association impossible",
2295
+ ASSOCIATION_NO_EQUIPMENT_FOUND: "Aucun \xE9quipement trouv\xE9",
2296
+ ASSOCIATION_PENDING_INFO: "Association en cours",
2297
+ ASSOCIATION_RESTART: "Relancer",
2298
+ ASSOCIATION_START_ASSOCIATION_BUTTON: "Associer",
2299
+ ASSOCIATION_TOTAL_STEP_LABEL: "Sur %d",
2300
+ ATTIC: "Grenier",
2301
+ AUTHORIZE_NOTIFICATIONS: "Autorisez l\u2019envoi de notifications dans le message suivant.",
2302
+ AUTOMATISM_COMMAND: "Commande automatisme",
2303
+ AUTO_ARM_FAULT: "D\xE9faut marche automatique",
2304
+ AUTO_ARM_FAULT_V3: "D\xE9faut marche auto",
2305
+ AUTO_ARM_PREVENT: "Defaut marche auto",
2306
+ AUTO_ARM_REQUEST: "Pr\xE9avis marche auto",
2307
+ AVERTISSOR_TEST: "Test avertisseurs",
2308
+ BALCONY: "Balcon",
2309
+ BAR: "Bar",
2310
+ BASEMENT: "Sous-sol",
2311
+ BATHROOM: "Bain-Douche",
2312
+ BATTERY_FAULT: "D\xE9faut pile",
2313
+ BATTERY_FAULT_2: "D\xE9faut batterie",
2314
+ BAY_WINDOW: "Baie vitr\xE9e",
2315
+ BEDROOM: "Chambre",
2316
+ BELEM_DOOR_CONTROLCLOSE: "Ferm\xE9e",
2317
+ BELEM_DOOR_CONTROLLOCK: "Verrouill\xE9e",
2318
+ BELEM_DOOR_CONTROL_OPEN: "Ouverte",
2319
+ BOILER_ROOM: "Chaufferie",
2320
+ BREAK_ROOM: "Salle de pause",
2321
+ CAMERA_LIST_VIDEO_WALL: "MUR VID\xC9O",
2322
+ CAMERA_TIMELINE_EMPTY_ITEM: "Tout est pour le mieux\ndans le meilleur des mondes",
2323
+ CAR_PARK: "Parking",
2324
+ CELLAR: "Cave",
2325
+ CENTRAL: "Centrale",
2326
+ CENTRAL_ASSO: "Mettez la centrale en ajout produit\n puis appuyez sur continuer.",
2327
+ CG_DD_5612_STEP1: "Appuyez 3 secondes sur la touche du r\xE9cepteur.\nLe voyant rouge clignote.\nAppuyez sur \u201CASSOCIER\u201C pour n'associer que la voie 1, sinon passez \xE0 l'\xE9tape 2.",
2328
+ CG_DD_5612_STEP2: "Appuyez bri\xE8vement sur la touche du r\xE9cepteur.\nLe voyant rouge clignote 2 fois.\nAppuyez sur \u201CASSOCIER\u201C pour n'associer que la voie 2, sinon passez \xE0 l'\xE9tape 3.",
2329
+ CG_DD_5612_STEP3: "Appuyez bri\xE8vement sur la touche du r\xE9cepteur.\nLe voyant rouge clignote 3 fois.\nMaintenant appuyez sur \u201CASSOCIER\u201C pour associer la voie 1 et 2 simultan\xE9ment.",
2330
+ CG_DD_BADGE_RIGHT: "Pr\xE9sentez un badge \xE0 droite de la molette.",
2331
+ CG_DD_BRISE_SOLEIL_EVENO: "Brise Soleil Orientable Eveno Zigbee",
2332
+ CG_DD_BRISE_SOLEIL_PROFALUX: "Brise Soleil Orientable Profalux Zigbee",
2333
+ CG_DD_BRISE_SOLEIL_WELLCOM: "BRISE SOLEIL Well\u2019Com\xAE",
2334
+ CG_DD_CALYBOX_TURN_STOP_BUTTON_I: "Sur le Calybox, tournez la molette sur arr\xEAt.\nEnsuite appuyez 5 secondes sur la touche \xABi\xBB.",
2335
+ CG_DD_CAMERA: "Camera",
2336
+ CG_DD_CAMERA_ETH_STEP1: "Branchez l\u2019alimentation \xE9lectrique de la cam\xE9ra.",
2337
+ CG_DD_CAMERA_ETH_STEP2: "Connectez la cam\xE9ra \xE0 votre box ADSL via un c\xE2ble RJ45. \nPuis appuyez sur CONTINUER.",
2338
+ CG_DD_CAMERA_WPS_STEP1: "Appuyez sur le bouton WPS de votre box ADSL et de la cam\xE9ra. \nPuis appuyez sur CONTINUER.",
2339
+ CG_DD_CHOOSE_ADD_OK: "Choisissez \xABAjouter\xBB puis appuyez sur \xABOK\xBB.",
2340
+ CG_DD_CHOOSE_INSTALLATION_OK: "Choisissez \xABInstallation\xBB puis appuyez sur \xABOK\xBB.",
2341
+ CG_DD_CHOOSE_PRODUCTS_OK: "Choisissez \xABProduits\xBB puis appuyez sur \xABOK\xBB.",
2342
+ CG_DD_CODE_BUTTON_ON_OFF_KEYBOARD: "Saisissez le code d'acc\xE8s puis appuyez 5 secondes simultan\xE9ment sur les touches ON et OFF du clavier jusqu'\xE0 ce que la centrale emette un BIP.",
2343
+ CG_DD_CODE_BUTTON_ON_OFF_REMOTE: "Saisissez le code d'acc\xE8s puis appuyez 5 secondes simultan\xE9ment sur les touches ON et OFF de la t\xE9l\xE9commande jusqu'\xE0 ce que la centrale emette un BIP.",
2344
+ CG_DD_DISPLAY_RAD: "l'\xE9cran affiche \xAB rAd \xBB et le nombre de produits d\xE9j\xE0 associ\xE9s.\nMaintenant appuyez sur \xABASSOCIER\xBB.",
2345
+ CG_DD_DISPLAY_ZONE_TOUT: "l'\xE9cran affiche \xABzone tout\xBB et le nombre d'\xE9quipements d\xE9j\xE0 associ\xE9s.\nMaintenant appuyez sur \xABASSOCIER\xBB.",
2346
+ CG_DD_END_ACCESS_CODE: "Pour sortir du mode, saisissez votre code d'acc\xE8s puis appuyez sur OFF.",
2347
+ CG_DD_END_ACCESS_CODE_OFF_BIP: "Une fois l'\xE9quipement associ\xE9, saisissez le code d'acc\xE8s et appuyez sur la touche OFF.\nLa centrale confirme par un BIP.",
2348
+ CG_DD_END_OFF_BIP: "Une fois l'\xE9quipement associ\xE9, appuyez sur la touche OFF.\nLa centrale confirme par un BIP.",
2349
+ CG_DD_END_OFF_BIP_TRAP: "Une fois termin\xE9, appuyez sur la touche OFF de la t\xE9l\xE9commande, la centrale emet un BIP.\nRefermez la trappe de la centrale.",
2350
+ CG_DD_END_TURN: "L'\xE9quipement est associ\xE9.\nTournez la molette pour sortir du mode.",
2351
+ CG_DD_ENGINE_ROUND_TRIP: "Le moteur fait un aller-retour.\nMaintenant appuyez sur \xABASSOCIER\xBB.",
2352
+ CG_DD_EVOLOGY_2_ZONES: "EVOLOGY 2 ZONES",
2353
+ CG_DD_EVOLOGY_4_ZONES: "EVOLOGY 4 ZONES",
2354
+ CG_DD_GARAGE_EVENO: "Porte de garage Eveno Zigbee",
2355
+ CG_DD_GARAGE_HORIZONTAL_WELLCOM: "PORTE DE GARAGE LATERALE Well\u2019Com\xAE",
2356
+ CG_DD_GARAGE_PROFALUX: "Porte de garage Profalux Zigbee",
2357
+ CG_DD_GARAGE_VERTICAL_WELLCOM: "PORTE DE GARAGE PLAFOND Well\u2019Com\xAE",
2358
+ CG_DD_HORMAN_WPS_STEP1: "Ouvrez la porte du garage.",
2359
+ CG_DD_HORMAN_WPS_STEP2: "Coupez le courant, puis r\xE9activez-le.",
2360
+ CG_DD_KEYBOARD_SETTINGS: "Sur le clavier, acc\xE9dez au menu \xABR\xE9glages\xBB.",
2361
+ CG_DD_KIT_HABITAT_10: "KIT HABITAT 10",
2362
+ CG_DD_KIT_HABITAT_20: "KIT HABITAT 20",
2363
+ CG_DD_LED_GREEN_REC: "La LED verte clignote, maintenant appuyez sur \xABASSOCIER\xBB.",
2364
+ CG_DD_LED_RED_REC: "La LED rouge clignote, maintenant appuyez sur \xABASSOCIER\xBB.",
2365
+ CG_DD_MINOR1000_STEP1: "Assurez-vous d'avoir associ\xE9 le ou les r\xE9cepteurs au MINOR 1000.",
2366
+ CG_DD_NOVOFERM_WPS_STEP1: "Assurez vous que le module Delta Dore est correctement connect\xE9 au moteur.",
2367
+ CG_DD_NOVOFERM_WPS_STEP2: "Ouvrez la porte du garage.",
2368
+ CG_DD_OPEN_TRAP: "Ouvrez la trappe de la centrale, vous disposez d'une minute pour l'ouvrir.\nAu-del\xE0, recommencez \xE0 l'\xE9tape 1.",
2369
+ CG_DD_OUT_MODE: "L\u2019\xE9quipement est associ\xE9.\nAppuyez brievement les touches \u201Cmode\u201D et \u201C+\u201D pour sortir du mode.",
2370
+ CG_DD_PACK_TYXAL_APPARTEMENT: "PACK TYXAL APPARTEMENT",
2371
+ CG_DD_PACK_TYXAL_MAISON: "PACK TYXAL MAISON",
2372
+ CG_DD_PACK_TYXAL_MAISON_ANIMAUX: "PACK TYXAL MAISON ANIMAUX",
2373
+ CG_DD_PORTE_BELEM: "Module de porte",
2374
+ CG_DD_PRESS_1_TIME_ON_R: "Appuyez 1 fois sur la touche R au dos de la t\xE9l\xE9commande.",
2375
+ CG_DD_PRESS_ADD_DOMOTIC: "Appuyez sur \xABAjouter un lien domotique\xBB.",
2376
+ CG_DD_PRESS_ADVANCED_SETTINGS: "Appuyez sur \xABR\xE9glages avanc\xE9s\xBB.",
2377
+ CG_DD_PRESS_AGAIN_BUTTON: "Appuyez \xE0 nouveau bri\xE8vement sur la touche.\nLe clignotement est plus rapide.",
2378
+ CG_DD_PRESS_ASSOCIATE: "Maintenant appuyez sur \u201CASSOCIER\u201C.",
2379
+ CG_DD_PRESS_BUTTON_1_INT_3: "Appuyez 3 secondes sur la touche 1 du r\xE9cepteur.",
2380
+ CG_DD_PRESS_BUTTON_5: "Appuyez 5 secondes sur le bouton.",
2381
+ CG_DD_PRESS_BUTTON_ALL_REC_3: "Appuyez 3 secondes sur la touche de chaque r\xE9cepteur.",
2382
+ CG_DD_PRESS_BUTTON_GATEWAY: "Appuyez 3 secondes sur la touche de droite du r\xE9cepteur jusqu'\xE0 ce que la LED 2 clignote, puis rel\xE2cher.",
2383
+ CG_DD_PRESS_BUTTON_INT_3: "Appuyez 3 secondes sur la touche de l'interrupteur.",
2384
+ CG_DD_PRESS_BUTTON_MODE: "Appuyez 3 secondes simultan\xE9ment sur les touches \u201Cmode\u201D et \u201C+\u201D.",
2385
+ CG_DD_PRESS_BUTTON_MODE_AGAIN: "L'\xE9quipement est associ\xE9.\nAppuyez bri\xE8vement les touches \u201Cmode\u201D et \u201C+\u201D pour sortir du mode.",
2386
+ CG_DD_PRESS_BUTTON_OK_STEP: "Appuyez successivement sur la touche OK pour s\xE9lectionner l'\xE9cran de l'\xE9tape suivante.",
2387
+ CG_DD_PRESS_BUTTON_ONE_OR_ALL: "Appuyez 3 secondes sur la touche du ou des r\xE9cepteurs.\nLa LED rouge clignote.",
2388
+ CG_DD_PRESS_BUTTON_ON_5: "Appuyez 5 secondes sur la touche ON de la t\xE9l\xE9commande jusqu'\xE0 ce que la centrale \xE9mette un BIP.\nMaintenant appuyez sur \xABASSOCIER\xBB.",
2389
+ CG_DD_PRESS_BUTTON_ON_5_LED_RED: "Appuyer 5 secondes sur la touche ON.\nLe voyant s'allume rouge puis vert pour valider l'action.\nLa centrale emet un BIP et son voyant s'allume fixe.\nRel\xE2chez.",
2390
+ CG_DD_PRESS_BUTTON_ON_OFF_5: "Appuyez 5 secondes simultan\xE9ment sur les touches ON et OFF de la t\xE9l\xE9commande.\nLa centrale emet un BIP et son voyant clignote.",
2391
+ CG_DD_PRESS_BUTTON_ON_OFF_5_BIP: "Appuyez 5 secondes simultan\xE9ment sur les touches ON et OFF de la t\xE9l\xE9commande.\nLa centrale confirme par une s\xE9rie de BIP.",
2392
+ CG_DD_PRESS_BUTTON_ON_OFF_5_LED_BLUE: "Appuyez 5 secondes simultan\xE9ment sur les touches ON et OFF de la t\xE9l\xE9commande.\nLe voyant de la centrale clignote bleu.",
2393
+ CG_DD_PRESS_BUTTON_ON_OFF_5_LED_RED_GREEN: "Appuyer 5 secondes simultan\xE9ment sur les touches ON et OFF.\nLe voyant s'allume rouge puis vert pour valider l'action.\nLa centrale emet un BIP et son voyant clignote.\nRel\xE2chez.",
2394
+ CG_DD_PRESS_BUTTON_O_3: "Appuyez 3 secondes sur la touche \xABO\xBB.",
2395
+ CG_DD_PRESS_BUTTON_PLUS: "Appuyez sur la touche \xAB+\xBB pour afficher \xAB1\xBB.\nAppuyez sur OK pour afficher rAd.",
2396
+ CG_DD_PRESS_BUTTON_R: "Appuyez sur la touche \xABR\xBB une fois.",
2397
+ CG_DD_PRESS_BUTTON_REC_3: "Appuyez 3 secondes sur la touche du r\xE9cepteur.",
2398
+ CG_DD_PRESS_DOMOTIC: "Appuyez sur \xABDomotique\xBB.",
2399
+ CG_DD_PRESS_EXTERNAL_ACTIONS: "Appuyez sur \xABActions externes\xBB.",
2400
+ CG_DD_PRESS_LEFT_BUTTON_LED: "Faites 2 appuis brefs sur la touche de gauche, la LED 2 doit faire 3 flashs.\nMaintenant appuyez sur \xABASSOCIER\xBB.",
2401
+ CG_DD_PRESS_SETTINGS: "Appuyez sur \xABR\xE9glages\xBB.",
2402
+ CG_DD_PRESS_STOP_BUTTON: "Appuyez sur le bouton STOP de la t\xE9l\xE9commande.",
2403
+ CG_DD_REMOTE_CONTROL_LIGHT_UP: "Le voyant de la t\xE9l\xE9commande s'allume, et au moins un \xE9quipement r\xE9agit.\nMaintenant appuyez sur ASSOCIER.",
2404
+ CG_DD_SOMMER_WPS_STEP1: "Coupez le courant, puis r\xE9activez-le.",
2405
+ CG_DD_STORE_WELLCOM: "STORE Well\u2019Com\xAE",
2406
+ CG_DD_TURN_SETTINGS_BUTTON_OK: "Tournez la molette sur \xABR\xE9glages\xBB, appuyez 3 secondes sur la touche \xABOK\xBB.",
2407
+ CG_DD_TURN_STOP_BUTTON_I: "Tournez la molette sur \xABArr\xEAt\xBB.\nEnsuite appuyez 5 secondes sur la touche \xABi\xBB.",
2408
+ CG_DD_TYXAL_PLUS_COMPACT: "TYXAL + COMPACT",
2409
+ CG_DD_USAGE_ALARM: "Alarme",
2410
+ CG_DD_USAGE_ALARM_NEW: "Alarme",
2411
+ CG_DD_USAGE_BELEM_DOOR: "Porte",
2412
+ CG_DD_USAGE_BELEM_DOOR_NEW: "Porte",
2413
+ CG_DD_USAGE_BOILER: "Hydraulique",
2414
+ CG_DD_USAGE_BOILER_NEW: "Chauffage",
2415
+ CG_DD_USAGE_CAMERA: "Cam\xE9ra",
2416
+ CG_DD_USAGE_CONSO: "Consommation",
2417
+ CG_DD_USAGE_CONSO_NEW: "Consommation",
2418
+ CG_DD_USAGE_ELECTRIC: "\xC9lectrique",
2419
+ CG_DD_USAGE_ELECTRIC_NEW: "Chauffage",
2420
+ CG_DD_USAGE_GARAGE_DOOR: "Garage",
2421
+ CG_DD_USAGE_GARAGE_DOOR_HORIZONTAL: "Horizontale",
2422
+ CG_DD_USAGE_GARAGE_DOOR_HORIZONTAL_NEW: "Garage",
2423
+ CG_DD_USAGE_GARAGE_DOOR_NEW: "Garage",
2424
+ CG_DD_USAGE_GATE: "Portail",
2425
+ CG_DD_USAGE_GATE_NEW: "Portail",
2426
+ CG_DD_USAGE_HVAC: "Chauffage",
2427
+ CG_DD_USAGE_HVAC_NEW: "Chauffage",
2428
+ CG_DD_USAGE_LIGHT: "\xC9clairages",
2429
+ CG_DD_USAGE_LIGHT_NEW: "\xC9clairage",
2430
+ CG_DD_USAGE_OTHERS: "Autres",
2431
+ CG_DD_USAGE_OTHERS_NEW: "Autre",
2432
+ CG_DD_USAGE_SHUTTER: "Volets",
2433
+ CG_DD_USAGE_SHUTTER_NEW: "Volet",
2434
+ CG_DD_USAGE_SWING_SHUTTER: "Battant",
2435
+ CG_DD_USAGE_SWING_SHUTTER_NEW: "Volet",
2436
+ CG_DD_VOLET_BATTANT_WELLCOM: "VOLET BATTANT Well\u2019Com\xAE",
2437
+ CG_DD_VOLET_PROJECTION_WELLCOM: "VOLET \xE0 PROJECTION Well\u2019Com\xAE",
2438
+ CG_DD_VOLET_ROULANT_EVENO: "Volet roulant Eveno Zigbee",
2439
+ CG_DD_VOLET_ROULANT_PROFALUX: "Volet roulant Profalux Zigbee",
2440
+ CG_DD_VOLET_ROULANT_WELLCOM: "VOLET Well\u2019Com\xAE",
2441
+ CG_DD_WAIT_ASSO: "Maintenant appuyez sur \xABASSOCIER\xBB.",
2442
+ CHANGING_ROOM: "Vestiaire",
2443
+ CHILDS_BEDROOM: "Chambre enfants",
2444
+ CHOIX_CENTRALE: "S\xE9lectionnez le type d'alarme que vous d\xE9sirez associer :",
2445
+ CHOOSE_NETWORK: "Choisissez un r\xE9seau",
2446
+ CLAVIER_BLOQUE: "Clavier bloqu\xE9",
2447
+ CLEARANCE: "D\xE9gagement",
2448
+ CLOSE: "Fermer",
2449
+ CLOSED_ENTRANCE: "Porte ferm\xE9e",
2450
+ CLOSET: "Placard",
2451
+ COMING_SOON: "Nos d\xE9veloppeurs travaillent dur\npour ajouter cette fonction.\nNous serons pr\xEAts rapidement !",
2452
+ COMING_SOON_TITLE: "PROCHAINEMENT",
2453
+ COMMAND_AMBIENT_TEMPERATURE: "Temp\xE9rature ambiante",
2454
+ COMMAND_CLIM: "Clim",
2455
+ COMMAND_FAVOURITE_ADD_MESSAGE: "Votre \xE9quipement est\nd\xE9sormais directement accessible\ndepuis la page d'accueil.",
2456
+ COMMAND_FAVOURITE_DELETE_MESSAGE: "Votre \xE9quipement ne sera plus accessible depuis la page d'accueil.",
2457
+ COMMAND_FAVOURITE_TITLE: "Favoris",
2458
+ COMMAND_HYGROMETRY: "Humidit\xE9",
2459
+ COMMAND_PERIPHERALS_DELETION: "Eff. des \xE9l\xE9ments de commandes",
2460
+ COMMAND_TEMPERATURE_MESURE: "mesur\xE9",
2461
+ COMMON: "Commune",
2462
+ COMMON_ACCEPT: "Accepter",
2463
+ COMMON_ACTIVATE: "Activ\xE9e",
2464
+ COMMON_ADD: "Ajouter",
2465
+ COMMON_ATTENTION: "Attention",
2466
+ COMMON_BRIDGES: "Passerelles",
2467
+ COMMON_CANCEL: "Annuler",
2468
+ COMMON_COMMAND_FAILURE: "Echec de la commande, veuillez r\xE9essayer.",
2469
+ COMMON_COMMENCER: "Commencer",
2470
+ COMMON_CONFIRM: "Confirmer",
2471
+ COMMON_CONNEXION: "Connexion",
2472
+ COMMON_CONTINUE: "Continuer",
2473
+ COMMON_DEACTIVATE: "D\xE9sactiv\xE9e",
2474
+ COMMON_DEFAULTS: "D\xE9fauts",
2475
+ COMMON_DEFAULT_UNKNOWN: "D\xE9faut inconnu",
2476
+ COMMON_EQUIPMENT: "\xC9quipement",
2477
+ COMMON_ERROR: "Erreur !",
2478
+ COMMON_IMPOSSIBLE: "Impossible",
2479
+ COMMON_INVISIBLE: "Invisible",
2480
+ COMMON_NEW: "Nouveau",
2481
+ COMMON_NO: "Non",
2482
+ COMMON_OK: "OK",
2483
+ COMMON_PHOTOS: "Photos",
2484
+ COMMON_PRODUCT: "Produit",
2485
+ COMMON_PROG: "PROGRAMMATION",
2486
+ COMMON_REFUS: "Refuser",
2487
+ COMMON_REMOVE: "Supprimer",
2488
+ COMMON_REPEATER: "R\xE9p\xE9teur",
2489
+ COMMON_SCENARIOS: "Sc\xE9narios",
2490
+ COMMON_TERMINER: "Terminer",
2491
+ COMMON_YES: "Oui",
2492
+ COMMON_ZIGBEE_DONGLE: "Dongle Zigbee",
2493
+ COMPANY: "Soci\xE9t\xE9",
2494
+ CONFIRM_DOWNLOAD: "Confirmer le t\xE9l\xE9chargement.",
2495
+ CONFIRM_INIT_GEN: "Voulez-vous initialiser l'alarme?\n",
2496
+ CONFIRM_ON: "Mise en marche refus\xE9e. Voulez-vous forcer la mise en marche ?",
2497
+ CONNECTION_FAILED_MESSAGE: "V\xE9rifiez que votre smartphone/tablette est connect\xE9 \xE0 Internet ou au r\xE9seau local du Tydom.\nV\xE9rifiez que votre box TYDOM est \xE0 jour en d\xE9branchant et en rebranchant l\u2019alimentation. Pensez \xE0 enlever les batteries pour le TYDOM 2.0.",
2498
+ CONNECTION_FAILED_PASSWORD_MESSAGE: "V\xE9rifiez la saisie de votre de mot de passe ou de votre identifiant et r\xE9essayez.\nEn cas d\u2019oubli, appuyez 15 secondes sur le bouton du TYDOM pour remettre \xE0 z\xE9ro le mot de passe.",
2499
+ CONNECTION_FAILED_PASSWORD_TITLE: "Mot de passe ou identifiant incorrects",
2500
+ CONNECTION_FAILED_TITLE: "Connexion impossible",
2501
+ CONNEXION_STATE_CONNECTED: "Connect\xE9",
2502
+ CONNEXION_STATE_CONNECTING: "En cours de connexion",
2503
+ CONNEXION_STATE_DISCONNECTED: "D\xE9connect\xE9",
2504
+ CONNEXION_STATE_DISCONNECTING: "En cours de d\xE9connexion",
2505
+ CONNEXION_STATE_RECONNECTING: "Reconnexion en cours",
2506
+ CONSO_AMPERE: "en Amp\xE8re",
2507
+ CONSO_ELECTRICITY: "\xC9lectricit\xE9",
2508
+ CONSO_ENERGY_COST: "Co\xFBt des \xE9nergies",
2509
+ CONSO_ENERGY_COST_DETAIL: "Co\xFBt unitaire de chacune des \xE9nergies utilis\xE9es.\nATTENTION : le co\xFBt que vous obtiendrez sera une indication.\nIl ne prendra pas en compte les diff\xE9rents tarifs en fonction des heures, les taxes locales, les \xE9volutions dans le temps et le co\xFBt fixe de l\u2019abonnement.",
2510
+ CONSO_EURO: "en \u20AC",
2511
+ CONSO_GAZ: "Gaz",
2512
+ CONSO_INSTANT_UNIT: "Unit\xE9 instantan\xE9e",
2513
+ CONSO_INSTANT_UNIT_DETAIL: "Modifier l'unit\xE9 utilis\xE9e pour l'affichage de la consommation instantan\xE9e",
2514
+ CONSO_KWH: "en kWh ou m3",
2515
+ CONSO_UNDEF: "Ind\xE9fini",
2516
+ CONSO_UNIT_CHOICE: "Choix de l'unit\xE9",
2517
+ CONSO_UNIT_CHOICE_DETAIL: "Modifier l'unit\xE9 utilis\xE9e pour les consommations",
2518
+ CONSO_WATER: "Eau",
2519
+ CONSO_WATT: "en Watt",
2520
+ CONTINUER: "Continuer",
2521
+ CONTROLE_VOCAL: "Contr\xF4le vocal",
2522
+ CONTROL_GROUP_UNKNOWN: "--",
2523
+ CONTROL_LIGHT_GROUP_UNKNOWN: "\xC9tats inconnus",
2524
+ CONTROL_LIGHT_UNKNOWN: "\xC9tat inconnu",
2525
+ CONTROL_SHUTTER_GROUP_UNKNOWN: "Positions inconnues",
2526
+ CORRIDOR: "Couloir",
2527
+ CREATE_WINDOW_TEXT: "Cr\xE9er une fen\xEAtre en associant tous ses d\xE9tecteurs.\nPuis touchez TERMINER.",
2528
+ CUBIC_METER: "m3",
2529
+ CURRENT_DEFAULTS: "D\xE9fauts en cours",
2530
+ CURRENT_DOWNLOAD: "T\xE9l\xE9chargement en cours.",
2531
+ CURRENT_FAULTS: "D\xE9faut(s)",
2532
+ CURRENT_INACTIVE_PERIPHERALS: "Inactif(s)",
2533
+ CURRENT_OPEN_SELF_PROTECTIONS: "Autoprotection(s)",
2534
+ CURRENT_TESTING: "Test avertisseurs en cours\u2026",
2535
+ DAY_ALL_DAYS: "Tous les jours",
2536
+ DAY_FRIDAY: "Vendredi",
2537
+ DAY_FRIDAY_SHORT: "Ve",
2538
+ DAY_MONDAY: "Lundi",
2539
+ DAY_MONDAY_SHORT: "Lu",
2540
+ DAY_SATURDAY: "Samedi",
2541
+ DAY_SATURDAY_SHORT: "Sa",
2542
+ DAY_SUNDAY: "Dimanche",
2543
+ DAY_SUNDAY_SHORT: "Di",
2544
+ DAY_THURSDAY: "Jeudi",
2545
+ DAY_THURSDAY_SHORT: "Je",
2546
+ DAY_TUESDAY: "Mardi",
2547
+ DAY_TUESDAY_SHORT: "Ma",
2548
+ DAY_WEDNESDAY: "Mercredi",
2549
+ DAY_WEDNESDAY_SHORT: "Me",
2550
+ DELETE_ACCESS_CODE: "Suppression code acc\xE8s",
2551
+ DELETE_ALL: "Init totale",
2552
+ DELETE_ZONE: "Suppression de zone",
2553
+ DEMO_ALERT_MESSAGE: "Vous entrez dans le mode d\xE9mo.\n Pour quitter, retournez dans le menu g\xE9n\xE9ral et s\xE9lectionnez Quitter le mode d\xE9mo.",
2554
+ DEPOT: "D\xE9p\xF4t",
2555
+ DETECTORS: "D\xE9tecteurs",
2556
+ DETECT_DOOR_ALERT_TEXT: "Confirmez-vous l'ouverture de la porte ?\n(Porte non refermable \xE0 distance)",
2557
+ DETECT_DOOR_ALERT_TITLE: "Attention",
2558
+ DETECT_DOOR_CONTROLCLOSE: "Ferm\xE9",
2559
+ DETECT_DOOR_CONTROLLOCK: "Verrouill\xE9",
2560
+ DETECT_DOOR_CONTROL_KEY_CLOSE: "Ferm\xE9 \xE0 cl\xE9",
2561
+ DETECT_DOOR_CONTROL_KEY_JAIL: "Condamn\xE9 \xE0 cl\xE9",
2562
+ DETECT_DOOR_CONTROL_OPEN: "Ouvert",
2563
+ DETECT_DOOR_CONTROL_OPEN_HOPPER: "Ouvert en a\xE9ration",
2564
+ DINING_ROOM: "Salle \xE0 manger",
2565
+ DISARMED: "Mise en Arr\xEAt",
2566
+ DISARMED_V3: "Mise en Arr\xEAt",
2567
+ DISCRETE_ALARM: "Alarme discr\xE8te",
2568
+ DISCRETE_ALARM_V3: "SOS discret",
2569
+ DISTRESS: "Alarme d\xE9tresse",
2570
+ DISTRESS_V3: "SOS sonore",
2571
+ DOOR: "Porte",
2572
+ DOOR_CHIME: "Sonnerie carillon",
2573
+ DOWNLOAD: "T\xE9l\xE9charger",
2574
+ DOWNLOAD_NOK: "Echec de transfert, veuillez renouveler l'op\xE9ration.",
2575
+ DOWNLOAD_OK: "T\xE9l\xE9chargement termin\xE9 avec succ\xE8s.",
2576
+ DOWNLOAD_STOPPED: "Vous demandez l'arr\xEAt du t\xE9l\xE9chargement, vous risquez de perdre des donn\xE9es.",
2577
+ DRESSING_ROOM: "Dressing",
2578
+ EMERGENCY_EXIT: "Issue de secours",
2579
+ END_ALARM: "Fin d'alarme",
2580
+ END_BATTERY_FAULT: "Fin de d\xE9faut pile",
2581
+ END_BATTERY_FAULT_2: "Fin d\xE9faut batterie",
2582
+ END_DISCRETE_ALARM: "Fin d'alarme discr\xE8te",
2583
+ END_DISTRESS: "Fin d'alarme d\xE9tresse",
2584
+ END_FIRE_ALARM: "Fin de d\xE9faut incendie",
2585
+ END_FIRE_ALARM_V3: "Fin alarme incendie",
2586
+ END_GSM_LINE_FAULT: "Fin d\xE9faut ligne GSM",
2587
+ END_INTRUSION: "Fin intrusion",
2588
+ END_IP_FAULT: "Fin d\xE9faut IP",
2589
+ END_MAINS_FAULT: "Fin d\xE9faut secteur",
2590
+ END_MONITORING_FAULT: "Fin d\xE9faut supervision",
2591
+ END_PERIPHERAL_EXCLUSION: "Activation produit",
2592
+ END_PHONE_LINE_FAULT: "Fin de d\xE9faut ligne t\xE9l\xE9phonique",
2593
+ END_PIN_FAULT: "Fin D\xE9faut code PIN",
2594
+ END_PUK_FAULT: "Fin d\xE9faut code PUK",
2595
+ END_RADIO_FAULT: "Fin de d\xE9faut radio",
2596
+ END_SELF_PROTECTION_EXCLUSION: "AP activ\xE9e",
2597
+ END_SELF_PROTECTION_FAULT: "Fin autoprotection",
2598
+ END_SIM_FAULT: "Fin carte SIM absente",
2599
+ END_TECHNICAL_ALARM: "Fin de d\xE9faut technique",
2600
+ END_TELECOM_LINE_FAULT: "Fin d\xE9faut ligne RTC",
2601
+ END_TELEMONITORING_FAULT: "Fin de d\xE9faut t\xE9l\xE9surveillance",
2602
+ END_VIDEO_LINK_FAULT: "Fin d\xE9faut lien vid\xE9o",
2603
+ ENROLLMENT_DENY: "Refus d'enr\xF4lement",
2604
+ ENTRY: "Entr\xE9e",
2605
+ EQUIPMENT_DISCONNECT: "D\xE9connect\xE9",
2606
+ EQUIPMENT_NOT_AVAILABLE: "Equipement inaccessible",
2607
+ EQUIPT_ROOM: "Local technique",
2608
+ ERROR_ASSO: "Association refus\xE9e",
2609
+ EURO: "\u20AC",
2610
+ EXISTING_PERIPHERAL: "Point existant",
2611
+ FAULTS_ACKNOWLEDGMENT: "Acquittement utilisateur",
2612
+ FAULTS_ACKNOWLEDGMENT_V3: "Acquittement",
2613
+ FIND_OPTIONS_ALERTS_IN_SETTINGS: "Retrouvez cette option dans le menu de r\xE9glages, section Alertes.",
2614
+ FIRE_ALARM: "D\xE9faut incendie",
2615
+ FIRE_ALARM_V3: "Alarme incendie",
2616
+ FIRST_CONNEXION_TEXT: "Il s\u2019agit de la premi\xE8re connexion \xE0 cette box domotique.\nD\xE9finissez le mot de passe qui sera utilis\xE9 pour la connexion.\nCe mot de passe doit contenir 8 caract\xE8res minimum, au moins un chiffre, au moins une lettre.",
2617
+ FIRST_CONNEXION_TITLE: "Premi\xE8re connexion",
2618
+ FLAT: "Appartement",
2619
+ FLOOR: "Etage",
2620
+ FRENCH_WINDOW: "Porte fen\xEAtre",
2621
+ FRONT_DESK: "R\xE9ception",
2622
+ FULLY_ARMED: "Mise en Marche Totale",
2623
+ FULLY_ARMED_V3: "Mise en Marche Totale",
2624
+ GARAGE: "Garage",
2625
+ GARAGE_DOOR_CONTROL_CLOSE: "Ferm\xE9",
2626
+ GARAGE_DOOR_CONTROL_OPEN: "Ouvert",
2627
+ GARAGE_DOOR_CONTROL_POURCENT: "%s %% ferm\xE9",
2628
+ GARAGE_DOOR_CONTROL_STOP: "Stop",
2629
+ GARDEN: "Jardin",
2630
+ GARDEN_SHED: "Abri de jardin",
2631
+ GATE: "Portail",
2632
+ GATE_CONTROL_CLOSE: "Ferm\xE9",
2633
+ GATE_CONTROL_OPEN: "Ouvert",
2634
+ GATE_CONTROL_POURCENT: "%s %% ferm\xE9",
2635
+ GATE_CONTROL_STOP: "Stop",
2636
+ GROUND_FLOOR: "Rez-de-chauss\xE9e",
2637
+ GSM_LINE_FAULT: "D\xE9faut ligne GSM",
2638
+ HALL: "Hall",
2639
+ HALLWAY: "Couloir",
2640
+ HEATING_COMMAND: "Commande chauffage",
2641
+ HOME_TILE_ALARM_MAINTENANCE_TEXT: "en maintenance",
2642
+ HOME_TILE_ALARM_MULTI_ZONE_TEXT: "%d zones",
2643
+ HOME_TILE_ALARM_OFF_TEXT: "hors surveillance",
2644
+ HOME_TILE_ALARM_ONE_ZONE_TEXT: "%d zone",
2645
+ HOME_TILE_ALARM_ON_TEXT: "en surveillance",
2646
+ HOME_TILE_ALL_CLOSE_LOCK: "tout verrouill\xE9",
2647
+ HOME_TILE_ALL_CLOSE_TEXT: "tout ferm\xE9",
2648
+ HOME_TILE_ALL_OFF_TEXT: "tout \xE9teint",
2649
+ HOME_TILE_ALL_ON_TEXT: "tout allum\xE9",
2650
+ HOME_TILE_ALL_OPEN_TEXT: "tout ouvert",
2651
+ HOME_TILE_DETECT_CLOSE_TEXT: "ferm\xE9",
2652
+ HOME_TILE_DETECT_LOCK_TEXT: "verrouill\xE9",
2653
+ HOME_TILE_DETECT_ONE_OPEN_TEXT: "%d ouvert",
2654
+ HOME_TILE_DETECT_ULTI_OPEN_TEXT: "%d ouverts",
2655
+ HOME_TILE_MULTI_ON_TEXT: "%d allum\xE9s",
2656
+ HOME_TILE_MULTI_OPEN_FEM_TEXT: "%d ouvertes",
2657
+ HOME_TILE_MULTI_OPEN_TEXT: "%d ouverts",
2658
+ HOME_TILE_ONE_ON_TEXT: "%d allum\xE9",
2659
+ HOME_TILE_ONE_OPEN_FEM_TEXT: "%d ouverte",
2660
+ HOME_TILE_ONE_OPEN_TEXT: "%d ouvert",
2661
+ HOME_TILE_WAITING_TEXT: "en attente",
2662
+ HOME_TITLE: "Accueil",
2663
+ HOUSE: "Maison",
2664
+ HVAC_CONTROL_GROUP_UNKNOWN: "temp\xE9ratures diff\xE9rentes",
2665
+ HVAC_DEFAULT_SENSOR_BATT_DEFECT: "D\xE9faut pile",
2666
+ HVAC_DEFAULT_SENSOR_DEFECT: "D\xE9faut sonde",
2667
+ HVAC_DEFAULT_SENSOR_OPENCIRC_DEFECT: "Sonde coup\xE9e",
2668
+ HVAC_DEFAULT_SENSOR_PROD_DEFECT: "D\xE9faut de production",
2669
+ HVAC_DEFAULT_SENSOR_SHORTCUT_DEFECT: "Sonde en court-circuit",
2670
+ HVAC_GENERAL: "G\xE9n\xE9ral",
2671
+ HVAC_GENERAL_COMMAND_ABSENCE: "Absence",
2672
+ HVAC_GENERAL_COMMAND_COOLING: "Clim",
2673
+ HVAC_GENERAL_COMMAND_HEATING: "Chauffage",
2674
+ HVAC_GENERAL_COMMAND_STOP: "Arr\xEAt",
2675
+ HVAC_GENERAL_STATUS_COOLING: "Mode Clim",
2676
+ HVAC_GENERAL_STATUS_HEATING: "Mode Chauffage",
2677
+ HVAC_GENERAL_STATUS_STOP: "Arr\xEAt",
2678
+ HVAC_INFO_ABSENCE: "Mode absence",
2679
+ HVAC_INFO_ANTIFROST: "Protection Hors Gel",
2680
+ HVAC_INFO_OPENNING: "Issue ouverte",
2681
+ HVAC_LEVEL_ANTI_FROST: "Hors-gel",
2682
+ HVAC_LEVEL_AUTO: "Auto",
2683
+ HVAC_LEVEL_COMFORT: "Confort",
2684
+ HVAC_LEVEL_ECO: "\xC9conomie",
2685
+ HVAC_LEVEL_MEDIO: "Medio",
2686
+ HVAC_LEVEL_MODERATO: "Moderato",
2687
+ HVAC_LEVEL_STOP: "Arr\xEAt",
2688
+ HVAC_MODE_ANTI_FROST: "Hors-gel",
2689
+ HVAC_MODE_ECO: "\xC9conomie",
2690
+ HVAC_MODE_NORMAL: "Normal",
2691
+ HVAC_MODE_STOP: "Arr\xEAt",
2692
+ HVAC_MODE_UNKNOWN: "Inconnu",
2693
+ INACTIVE_PRODUCTS: "Produits inactifs",
2694
+ INCOMING_DIGITAL_CALL: "Com. entrante digitale",
2695
+ INCOMING_VOICE_CALL: "Com. entrante vocale",
2696
+ INCOMING_VOICE_CALL_V3: "Com. entr. vocale valid\xE9e",
2697
+ INIT_GENERAL: "Initialisation alarme",
2698
+ INTRUSION: "Intrusion",
2699
+ INTRUSION_DETECTION_NOTIFICATION_MESSAGE: "Vous recevrez une notification \xE0 chaque d\xE9tection d\u2019intrusion.",
2700
+ IP_FAULT: "D\xE9but d\xE9faut IP",
2701
+ KILOWATT: "kWh",
2702
+ KITCHEN: "Cuisine",
2703
+ LANDING: "Palier",
2704
+ LIBRARY: "Biblioth\xE8que",
2705
+ LIGHT_CONTROL_GROUP_UNKNOWN: "\xE9tats diff\xE9rents",
2706
+ LIGHT_CONTROL_OFF: "\xC9teint",
2707
+ LIGHT_CONTROL_ON: "Allum\xE9",
2708
+ LIGHT_CONTROL_POURCENT: "%s %% allum\xE9",
2709
+ LIGHT_DEFAULT_BATT_DEFECT: "D\xE9faut pile",
2710
+ LIGHT_DEFAULT_CMD_DEFECT: "D\xE9faut commande",
2711
+ LIGHT_DEFAULT_LOAD_DEFECT: "D\xE9faut charge",
2712
+ LIGHT_DEFAULT_THERMIC_DEFECT: "Surchauffe",
2713
+ LIGHT_TOGGLE: "Impulsionnel",
2714
+ LIVING_ROOM: "Salon",
2715
+ LOBBY: "Accueil",
2716
+ LOCALISATION_TAG: "fr",
2717
+ LOCAL_ACCESS: "Acc\xE8s local",
2718
+ LOCKED_KEYBOARD: "Verrouillage clavier",
2719
+ LOFT: "Combles",
2720
+ LOGIN_CREATE_ACCOUNT: "Cr\xE9er un compte",
2721
+ LOGIN_FORGET_PASSWORD: "Mot de passe oubli\xE9",
2722
+ LOGIN_INPUT_EMPTY: "Champ %s vide",
2723
+ LOGIN_INPUT_ERROR: "Champ %s invalide",
2724
+ LOGIN_MAC_ADDRESS: "Adresse mac",
2725
+ LOGIN_PASSWORD: "Mot de passe",
2726
+ LOGIN_SAVE_PASSWORD: "M\xE9moriser le mot de passe",
2727
+ LOGIN_SITE: "votre domicile",
2728
+ LOG_CLEARANCE: "Effacement historique",
2729
+ LOG_VIEWING: "Consultation historique",
2730
+ LOUNGE: "S\xE9jour",
2731
+ MAINS_FAULT: "D\xE9faut secteur",
2732
+ MAINTENANCE: "Maintenance",
2733
+ MAINTENANCE_ARRETER: "Arr\xEAter",
2734
+ MAINTENANCE_BSO: "BSO",
2735
+ MAINTENANCE_COOL_LEVEL: "Allure F",
2736
+ MAINTENANCE_COOL_SET_POINT: "Consigne F",
2737
+ MAINTENANCE_DEVICE_DELETE_MESSAGE: "Les \xE9quipements s\xE9lectionn\xE9s seront supprim\xE9s de votre installation ainsi des groupes, sc\xE9narios, moments et photos.",
2738
+ MAINTENANCE_DIMMER: "Dimmer",
2739
+ MAINTENANCE_ENDPOINT: "Mettre \xE0 jour l",
2740
+ MAINTENANCE_ENDPOINT_TYPE: "Type",
2741
+ MAINTENANCE_EQUIPEMENTS: "EQUIPEMENTS",
2742
+ MAINTENANCE_ERRORS: "Erreurs",
2743
+ MAINTENANCE_FONCTION: "Fonction",
2744
+ MAINTENANCE_GROUPES: "GROUPES",
2745
+ MAINTENANCE_HEAT_COOL_LEVEL: "Allure C/F",
2746
+ MAINTENANCE_HEAT_COOL_SET_POINT: "Consigne C/F",
2747
+ MAINTENANCE_HEAT_LEVEL: "Allure C",
2748
+ MAINTENANCE_HEAT_SET_POINT: "Consigne C",
2749
+ MAINTENANCE_IDENTIFIANT: "Identifiant",
2750
+ MAINTENANCE_IMPULSE: "Impulsion",
2751
+ MAINTENANCE_INCONNU: "Inconnu",
2752
+ MAINTENANCE_INSTALLATION: "Installation",
2753
+ MAINTENANCE_MAX: "Max",
2754
+ MAINTENANCE_METIER: "M\xE9tier",
2755
+ MAINTENANCE_METIERS_DISPONIBLES: "METIERS",
2756
+ MAINTENANCE_MIN: "Min",
2757
+ MAINTENANCE_MODE: "Mode maintenance",
2758
+ MAINTENANCE_MODE_V3: "Passage en maintenance",
2759
+ MAINTENANCE_MOMENTS: "Moments",
2760
+ MAINTENANCE_MOMENTS_PER_DAY: "Max moments par jour",
2761
+ MAINTENANCE_MULTI_USAGES: "Multi usages",
2762
+ MAINTENANCE_M_D: "Up/Down",
2763
+ MAINTENANCE_NET: "R\xE9seau",
2764
+ MAINTENANCE_ON_OFF: "On/Off",
2765
+ MAINTENANCE_OTHERS: "AUTRES",
2766
+ MAINTENANCE_PARAMETRES_RESEAU: "Param\xE8tres r\xE9seau",
2767
+ MAINTENANCE_PHOTOS: "Photos",
2768
+ MAINTENANCE_PROFILE: "Profile",
2769
+ MAINTENANCE_PROJECTION: "Projection",
2770
+ MAINTENANCE_PROTOCOL: "Protocole",
2771
+ MAINTENANCE_SCENARIOS: "Sc\xE9narios",
2772
+ MAINTENANCE_SLOPE: "Slope",
2773
+ MAINTENANCE_SLOT: "Slot",
2774
+ MAINTENANCE_STEP: "Step",
2775
+ MAINTENANCE_SYNTHESE: "Synth\xE8se",
2776
+ MAINTENANCE_UPDATE: "Mise \xE0 jour",
2777
+ MAINTENANCE_UPDATE_ENDPOINT_MESSAGE: "Mettre \xE0 jour le produit ?\nAttention cette op\xE9ration est irr\xE9versible",
2778
+ MAINTENANCE_UPDATE_MESSAGE_ERROR: "La mise \xE0 jour a \xE9chou\xE9",
2779
+ MAINTENANCE_UPDATE_MESSAGE_SUCCESS: "La mise \xE0 jour a \xE9t\xE9 r\xE9alis\xE9e correctement",
2780
+ MAINTENANCE_UPDATE_TITLE: "Mise \xE0 jour",
2781
+ MAINTENANCE_UPDATE_USAGES_MESSAGE: "Appliquer le nouveau m\xE9tier ?\nAttention cette op\xE9ration est irr\xE9versible",
2782
+ MAINTENANCE_USAGE: "Usage",
2783
+ MAINTENANCE_VARIATION: "Variation",
2784
+ MANAGEMENT: "Direction",
2785
+ MASTER_BEDROOM: "Chambre parents",
2786
+ MA_MAISON: "Ma maison",
2787
+ MEETING_ROOM: "Salle de r\xE9union",
2788
+ MESSAGE_ALARME_VIDE: "S\xE9curisez votre habitation avec un syst\xE8me d'alarme sans fil Delta Dore.\n\nUtilisez le menu de r\xE9glages pour associer votre alarme ou rendez-vous sur notre site web pour plus d'information.",
2789
+ MESSAGE_BELEM_DOOR_EMPTY: "Ouvrez votre porte d'entr\xE9e \xE0 distance.\n\nUtilisez le menu de r\xE9glages pour associer un \xE9quipement.",
2790
+ MESSAGE_CONSO_EMPTY: "Visualisez et ma\xEEtrisez vos consommations d'\xE9nergies au quotidien.\n\nUtilisez le menu de r\xE9glages pour associer un \xE9quipement ou rendez-vous sur notre site web pour plus d\u2019information.",
2791
+ MESSAGE_DETECT_EMPTY: "\xE9Gr\xE2ce aux produits FEN\xCATRES, surveillez la s\xE9curit\xE9 de votre maison.\n\nUtilisez le menu de r\xE9glages pour associerun \xE9quipement ou rendez-vous sur notre site web pour plus d\u2019information.",
2792
+ MESSAGE_GARAGE_EMPTY: "Automatisez votre garage simplement avec les solutions Delta Dore.\n\nUtilisez le menu de r\xE9glages pour associer un \xE9quipement ou rendez-vous sur notre site web pour plus d'information.",
2793
+ MESSAGE_GATE_EMPTY: "Automatisez votre portail simplement avec les solutions Delta Dore.\n\nUtilisez le menu de r\xE9glages pour associer un \xE9quipement ou rendez-vous sur notre site web pour plus d'information",
2794
+ MESSAGE_HEATING_EMPTY: "Pilotez la temp\xE9rature de votre logement \xE0 distance.\n\nUtilisez le menu de r\xE9glages pour associer un \xE9quipement ou rendez-vous sur notre site web pour plus d\u2019information.",
2795
+ MESSAGE_LIGHT_EMPTY: "G\xE9rez simplement tous vos \xE9clairages int\xE9rieurs et ext\xE9rieurs depuis l'application.\n\nUtilisez le menu de r\xE9glages pour associer un \xE9quipement ou rendez-vous sur notre site web pour plus d'information.",
2796
+ MESSAGE_OTHERS_EMPTY: "Gr\xE2ce aux produits Delta Dore, pilotez par exemple votre arrosage ext\xE9rieur.\n\nUtilisez le menu de r\xE9glages pour associer un \xE9quipement ou rendez-vous sur notre site web pour plus d'information.",
2797
+ MESSAGE_SHUTTER_EMPTY: "Motorisez vos volets roulants simplement avec les solutions Delta Dore.\n\nUtilisez le menu de r\xE9glages pour associer un \xE9quipement ou rendez-vous sur notre site web pour plus d'information.",
2798
+ MEZZANINE: "Mezzanine",
2799
+ MIGRATION_FAILED_MESSAGE: "Votre migration s\u2019est mal pass\xE9e, vous risquez de ne pas retrouver votre installation.",
2800
+ MIGRATION_TEXT: "Votre installation se met \xE0 jour vers une nouvelle version.\nD\u2019ici quelques minutes, vous pourrez profiter de la toute nouvelle exp\xE9rience TYDOM.\nNe quittez pas l\u2019application durant cette op\xE9ration.",
2801
+ MIGRATION_TITLE: "Mise \xE0 jour",
2802
+ MONITORING_FAULT: "D\xE9faut supervision",
2803
+ MORE_INFO: "En savoir plus",
2804
+ NEED_TO_UPDATE_TYDOM: "Pour acc\xE9der \xE0 cette fonctionnalit\xE9, veuillez mettre \xE0 jour votre box domotique Tydom en d\xE9branchant puis en rebranchant le c\xE2ble d'alimentation.",
2805
+ NEED_TO_UPDATE_TYDOM_TITLE: "Mise \xE0 jour n\xE9cessaire",
2806
+ NETWORK: "R\xE9seau",
2807
+ NEW_ACCESS_CODE: "Nouveau code d'acc\xE8s",
2808
+ NEW_PERIPHERAL: "Nouveau p\xE9riph\xE9rique",
2809
+ NEW_WINDOW: "Nouvelle fen\xEAtre",
2810
+ NEW_ZONE: "Nouvelle zone",
2811
+ OFFICE: "Bureau",
2812
+ OFF_ZONE: "Arret zone",
2813
+ ON_ZONE: "Marche par zone",
2814
+ OPEN_ENTRANCE: "Porte ouverte",
2815
+ OPERATION_REFUSED: "Op\xE9ration refus\xE9e",
2816
+ OPERATION_REFUSED_INSTALLER: "La centrale ne peut pas \xEAtre mise en arr\xEAt avec un code d'acc\xE8s installateur.",
2817
+ OUTBUILDING: "D\xE9pendance",
2818
+ OUTGOING_CONNECTION_FAILURE: "Echec de connexion sortante",
2819
+ OUTGOING_CONNECTION_FAILURE_DIGITAL: "echec com. sort. digitale",
2820
+ OUTGOING_CONNECTION_FAILURE_VOCAL: "echec com. sort. vocale",
2821
+ OUTGOING_DIGITAL_CALL: "Com. sortante digitale",
2822
+ OUTGOING_VOICE_CALL: "Com. sortante vocale",
2823
+ OVERRIDE_SETTING: "Marche forc\xE9e",
2824
+ OVERRIDE_SETTING_ZONE: "Marche par zone forc\xE9e",
2825
+ PANTRY: "Cellier",
2826
+ PARTIALLY_ARMED1: "Mise en Marche Partielle 1",
2827
+ PARTIALLY_ARMED2: "Mise en Marche Partielle 2",
2828
+ PARTIALLY_ARMED3: "Mise en Marche Partielle 3",
2829
+ PARTIALLY_ARMED4: "Mise en Marche Partielle 4",
2830
+ PARTIALLY_ARMED5: "Mise en Marche Partielle 5",
2831
+ PARTIALLY_ARMED6: "Mise en Marche Partielle 6",
2832
+ PARTIALLY_ARMED7: "Mise en Marche Partielle 7",
2833
+ PARTIALLY_ARMED8: "Mise en Marche Partielle 8",
2834
+ PATIO: "Patio",
2835
+ PERIMETER_ARMED: "Marche p\xE9rim\xE9trique",
2836
+ PERIPHERAL_DELETION: "Suppression p\xE9riph\xE9rique",
2837
+ PERIPHERAL_DELETION_V3: "Suppression produit",
2838
+ PERIPHERAL_EXCLUSION: "Exclusion p\xE9riph\xE9rique",
2839
+ PERIPHERAL_EXCLUSION_V3: "D\xE9sactivation produit",
2840
+ PERIPHERAL_INSERTION: "Insertion p\xE9riph\xE9rique",
2841
+ PHONE_LINE_FAULT: "D\xE9faut ligne t\xE9l\xE9phonique",
2842
+ PHOTOS_EMPTY_TEXT: "Pilotez vos \xE9quipements directement \xE0 partir des photos des pi\xE8ces de votre maison.\n\nUtilisez le menu de r\xE9glages pour ajouter une nouvelle photo.",
2843
+ PILE_FAULT_REPETITION: "D\xE9faut pile",
2844
+ PIN_FAULT: "D\xE9faut code PIN",
2845
+ PLAY_ROOM: "Salle de jeux",
2846
+ POOL: "Piscine",
2847
+ PORCH: "Porche",
2848
+ PRACTICE: "Cabinet",
2849
+ PREALARM: "Pr\xE9-alarme",
2850
+ PREMISES: "Local",
2851
+ PROG_MOMENT_ACTIONS_EXPLICATION: "D\xE9finissez l'action \xE0 faire sur les \xE9quipements s\xE9lectionn\xE9s \xE0 l'heure de d\xE9but du moment.",
2852
+ PROG_MOMENT_ACTIONS_NO_EQUIPMENTS: "Ce moment ne contient aucun \xE9quipement. Commencez par s\xE9lectionner des \xE9quipements \xE0 piloter puis d\xE9finissez une action.",
2853
+ PROG_MOMENT_ACTIONS_TITLE: "Actions au d\xE9but",
2854
+ PROG_MOMENT_ADD: "Ajouter le nouveau moment avant de quitter ?",
2855
+ PROG_MOMENT_ADD_NO_EQUIPMENTS: "Ce moment ne contient aucun \xE9quipement. Souhaitez vous ajouter un \xE9quipement au moment ?",
2856
+ PROG_MOMENT_ASTRO: "Fonction astronomique",
2857
+ PROG_MOMENT_ASTRO_CELL_STOP_DISABLE: "Inactif",
2858
+ PROG_MOMENT_ASTRO_EXPLICATION: "En activant la fonction astronomique, vous pouvez d\xE9clencher un moment en fonction du lever ou du coucher du soleil.",
2859
+ PROG_MOMENT_ASTRO_HOUR_SUNRISE: "Heure de lever du soleil",
2860
+ PROG_MOMENT_ASTRO_HOUR_SUNSET: "Heure de coucher du soleil",
2861
+ PROG_MOMENT_ASTRO_NEVER_AFTER: "Jamais apr\xE8s",
2862
+ PROG_MOMENT_ASTRO_NEVER_BEFORE: "Jamais avant",
2863
+ PROG_MOMENT_ASTRO_STOP_EXPLICATION_AFTER: "En activant la but\xE9e 'Jamais apr\xE8s', le moment se d\xE9clenche au plus tard \xE0 l'heure r\xE9gl\xE9e ci-dessous.",
2864
+ PROG_MOMENT_ASTRO_STOP_EXPLICATION_BEFORE: "En activant la but\xE9e 'Jamais avant', le moment se d\xE9clenche au plus t\xF4t \xE0 l'heure r\xE9gl\xE9e ci-dessous.",
2865
+ PROG_MOMENT_ASTRO_STOP_NEVER_AFTER: "Jamais apr\xE8s",
2866
+ PROG_MOMENT_ASTRO_STOP_NEVER_BEFORE: "Jamais avant",
2867
+ PROG_MOMENT_ASTRO_STOP_TITLE: "Limite",
2868
+ PROG_MOMENT_ASTRO_SUNRISE: "Lever",
2869
+ PROG_MOMENT_ASTRO_SUNSET: "Coucher",
2870
+ PROG_MOMENT_ASTRO_TITLE: "Horloge astronomique",
2871
+ PROG_MOMENT_ASTRO_TODAY: "Aujourd'hui",
2872
+ PROG_MOMENT_CELL_ACTIONS: "D\xE9finir les actions",
2873
+ PROG_MOMENT_CELL_ASTRO_CLOCK: "Horloge astronomique",
2874
+ PROG_MOMENT_CELL_COLOR: "Couleur",
2875
+ PROG_MOMENT_CELL_DEACTIVATE: "D\xE9sactiver ce moment",
2876
+ PROG_MOMENT_CELL_EQUIPMENTS: "\xE9quipements",
2877
+ PROG_MOMENT_CELL_HOUR: "Heure",
2878
+ PROG_MOMENT_CELL_HOUR_MOMENT: "Heure du moment",
2879
+ PROG_MOMENT_CELL_NAME: "Nom",
2880
+ PROG_MOMENT_CELL_RECURRENCE: "R\xE9currence",
2881
+ PROG_MOMENT_CELL_REMOVE_MOMENT: "Supprimer le moment",
2882
+ PROG_MOMENT_CELL_SELECT_EQUIPMENTS: "S\xE9lectionner des \xE9quipements",
2883
+ PROG_MOMENT_COLORS: "Couleurs",
2884
+ PROG_MOMENT_DEACTIVATE: "Moment d\xE9sactiv\xE9",
2885
+ PROG_MOMENT_EQUIPMENTS_EXPLICATION: "S\xE9lectionnez les \xE9quipements que vous souhaitez activer lors de ce moment.",
2886
+ PROG_MOMENT_EQUIPMENTS_TITLE: "Liste \xE9quipements",
2887
+ PROG_MOMENT_NAME_DEFAULT: "Nouveau moment",
2888
+ PROG_MOMENT_NAME_TITLE: "Nom",
2889
+ PROG_MOMENT_NOT_PLAY: "Ce moment ne sera plus jou\xE9.",
2890
+ PROG_MOMENT_NO_EQUIPMENTS: "Aucun \xE9quipement",
2891
+ PROG_MOMENT_POPUP_DAY_LIMIT_MESSAGE: "Vous avez atteint le nombre maximum de 24 moments sur cette journ\xE9e.",
2892
+ PROG_MOMENT_POPUP_LIMIT_TITLE: "Impossible de cr\xE9er le moment",
2893
+ PROG_MOMENT_POPUP_SAME_HOUR_LIMIT_MESSAGE: "Vous avez atteint le nombre maximum de 2 moments a\u0300 la m\xEAme heure la journe\u0301e du %s.",
2894
+ PROG_MOMENT_POPUP_TOTAL_LIMIT_MESSAGE: "Vous avez atteint le nombre maximum de 48 moments dans votre programmation.",
2895
+ PROG_MOMENT_RECURRENCE_TITLE: "R\xE9currence",
2896
+ PROG_MOMENT_REMOVE: "Ce moment va \xEAtre supprim\xE9 de votre programmation.",
2897
+ PROG_MOMENT_UPDATE_NO_EQUIPMENTS: "Ce moment ne contient aucun \xE9quipement. Souhaitez vous ajouter un \xE9quipement au moment ?",
2898
+ PROG_SUSPEND: "Suspendre la programmation",
2899
+ PROG_SUSPEND_DATE: "Date",
2900
+ PROG_SUSPEND_EXPLICATION: "Vous pouvez suspendre int\xE9gralement la programmation de votre logement. Aucun moment ne sera jou\xE9 pendant la dur\xE9e de votre choix.",
2901
+ PROG_SUSPEND_HOUR: "Heure",
2902
+ PROG_SUSPEND_INDEFINITELY: "Ind\xE9finiment",
2903
+ PROG_SUSPEND_TITLE: "Suspendre",
2904
+ PROG_SUSPEND_UNTIL: "Jusqu'au :",
2905
+ PROG_SUSPEND_UNTIL_TEXT: "La programmation reprendra automatiquement le",
2906
+ PROG_TITLE_SHORT: "Prog.",
2907
+ PUK_FAULT: "D\xE9faut code PUK",
2908
+ QR_CODE_SERIAL_TEXT: "Le format du num\xE9ro de s\xE9rie saisi n'est pas valide.",
2909
+ QR_CODE_SERIAL_TITLE: "Num\xE9ro de s\xE9rie incorrect",
2910
+ RADIO_FAULT: "D\xE9faut radio",
2911
+ RECEPTION: "R\xE9ception",
2912
+ REMOTE_DELETION: "Suppression commandes",
2913
+ ROOM: "Salle",
2914
+ ROOMS_EMPTY_TEXT: "Avec les pi\xE8ces, regroupez les diff\xE9rents \xE9quipements d\u2019une m\xEAme zone pour y acc\xE9der plus rapidement.\n\nUtilisez le menu de r\xE9glages pour cr\xE9er une pi\xE8ce.",
2915
+ SCENARIOS_EMPTY_TEXT: "Avec les sc\xE9narios, combinez plusieurs actions sur vos \xE9quipements. Par exemple, le sc\xE9nario \xAB D\xE9part \xBB \xE9teint les lumi\xE8res et ferme les volets.\n\nUtilisez le menu de r\xE9glages pour cr\xE9er un sc\xE9nario.",
2916
+ SCULLERY: "Arri\xE8re cuisine",
2917
+ SEARCH_PLACEHOLDER: "Rechercher",
2918
+ SECRETARIAT: "Secr\xE9tariat",
2919
+ SELF_PROTECTION_EXCLUSION: "AP d\xE9sactiv\xE9e",
2920
+ SELF_PROTECTION_FAULT: "Autoprotection",
2921
+ SELF_TEST_REQUEST: "Demande d'autotest",
2922
+ SERVER_ACCESS: "Acc\xE8s serveur",
2923
+ SETTINGS_ABANDON_WITHOUT_SAVE_MESSAGE: "Souhaitez-vous abandonner sans sauvegarder vos modifications ?",
2924
+ SETTINGS_ABOUT: "A propos",
2925
+ SETTINGS_ACCOUNT: "Compte",
2926
+ SETTINGS_ADD: "Ajouter",
2927
+ SETTINGS_ADD_PRODUCT: "Ajouter un \xE9quipement",
2928
+ SETTINGS_ALARM_DELETE: "Pour pouvoir supprimer la centrale, il faut d'abord la placer en maintenance",
2929
+ SETTINGS_ALERTS_ACTIVATED: "Notifications \xE9v\xE8nements activ\xE9es",
2930
+ SETTINGS_ALERTS_ACTIVATED_DETAILS: "Vous serez notifi\xE9 des \xE9v\xE8nements de votre domicile.",
2931
+ SETTINGS_ALERTS_DESCRIPTION: "Soyez alert\xE9 des \xE9v\xE8nements de votre domicile.",
2932
+ SETTINGS_ALERTS_EVENTS_ALERT: "Notifications \xE9v\xE8nements",
2933
+ SETTINGS_ALERTS_EVENTS_ALERT_DETAILS: "En activant cette fonction, votre syst\xE8me d'alarme vous informera des \xE9v\xE8nements de votre domicile.",
2934
+ SETTINGS_ALERTS_FAMILY_CARE_ALERT: "Alertes family care",
2935
+ SETTINGS_ALERTS_INTRUSION_ALERT: "Alertes intrusion",
2936
+ SETTINGS_ALERTS_SECTION_TITLE_SECURITY: "S\xC9CURIT\xC9",
2937
+ SETTINGS_ALERTS_TECHNIC_ALERT: "Alertes techniques",
2938
+ SETTINGS_ASSOCIATE_WIFI_CONTENT_TITLE: "CONNEXION WI-FI",
2939
+ SETTINGS_ASSOCIATE_WIFI_DETAILS: "Renseignez ici les informations de connexion au r\xE9seau\nWi-Fi et appuyez sur CONTINUER,\nou s\xE9lectionnez une connexion filaire.",
2940
+ SETTINGS_ASSOCIATE_WIFI_TITLE: "Connexion r\xE9seau",
2941
+ SETTINGS_CGU: "Conditions G\xE9n\xE9rales d'utilisation",
2942
+ SETTINGS_CGU_CANCEL: "Refuser",
2943
+ SETTINGS_CONNECT_DONGLE: "Connectez le dongle USB Zigbee au port USB de votre box domotique TYDOM.",
2944
+ SETTINGS_CONTACT: "Nous contacter",
2945
+ SETTINGS_CONTACT_US: "Nous contacter",
2946
+ SETTINGS_COPYRIGHT: "Copyright",
2947
+ SETTINGS_DELETE: "Supprimer",
2948
+ SETTINGS_DELETE_DISCONNECTED: "Vous \xEAtes d\xE9connect\xE9, vous ne pouvez pas supprimer d'\xE9quipement",
2949
+ SETTINGS_DELETE_ERROR: "Impossible de supprimer l'\xE9quipement",
2950
+ SETTINGS_EXPERT_MODE: "Mode expert",
2951
+ SETTINGS_FIND_SUPPORT: "Trouver un installateur",
2952
+ SETTINGS_GROUPS: "Groupes",
2953
+ SETTINGS_GROUPS_ADD_BEFORE_CANCEL_TEXT: "Ajouter le nouveau groupe avant de quitter ?",
2954
+ SETTINGS_GROUPS_ALL_NAME: "TOTAL",
2955
+ SETTINGS_GROUPS_CREATE: "Ajouter un groupe",
2956
+ SETTINGS_GROUPS_CREATE_TEXT: "Un groupe permet de passer une commande, en une seule fois, \xE0 un ensemble d'\xE9quipements.",
2957
+ SETTINGS_GROUPS_DEFAULT_NAME: "Nouveau groupe",
2958
+ SETTINGS_GROUPS_DELETE: "Supprimer le groupe",
2959
+ SETTINGS_GROUPS_DELETE_MESSAGE: "Ce groupe sera supprim\xE9 de la liste des groupes.",
2960
+ SETTINGS_GROUPS_EMPTY_ADD_TEXT: "Ce groupe ne contient aucun \xE9quipement.\nSouhaitez-vous ajouter un \xE9quipement au groupe ?",
2961
+ SETTINGS_GROUPS_MAX_NUMBER: "Le nombre maximum de 27 groupes est atteint.",
2962
+ SETTINGS_GROUPS_NONE_EQUIPMENT_TITLE: "Aucun \xE9quipement",
2963
+ SETTINGS_GROUPS_SELECT_EQUIPMENTS_TEXT: "S\xE9lectionnez les \xE9quipements \xE0 ajouter au groupe.",
2964
+ SETTINGS_GROUPS_SELECT_HVAC_LEVEL_TEXT: "Allure",
2965
+ SETTINGS_GROUPS_SELECT_HVAC_SETPOINT_TEXT: "Consigne",
2966
+ SETTINGS_GROUPS_SELECT_NONE_TEXT: "Aucun",
2967
+ SETTINGS_GROUPS_SELECT_TYPE_GROUP: "S\xC9LECTIONNER UN GROUPE",
2968
+ SETTINGS_HOME_PAGE: "Page d'accueil",
2969
+ SETTINGS_INSTALLER: "Installer",
2970
+ SETTINGS_INSTALL_FAILURE: "Le dongle Zigbee n'a pas pu \xEAtre install\xE9, veuillez r\xE9essayer.",
2971
+ SETTINGS_INSTALL_ON_GOING: "Installation en cours",
2972
+ SETTINGS_INSTALL_ZIGBEE: "Avant d'associer ces \xE9quipements, vous devez installer le protocole Zigbee.\n\nAppuyer sur INSTALLER pour continuer.",
2973
+ SETTINGS_INSTALL_ZIGBEE_FAILED_TEXT: "Le protocol Zigbee n'a pas pu \xEAtre install\xE9, veuillez r\xE9essayer.",
2974
+ SETTINGS_INSTALL_ZIGBEE_FAILED_TITLE: "\xC9chec d'installation",
2975
+ SETTINGS_LEGAL_NOTICES: "Mentions l\xE9gales",
2976
+ SETTINGS_MENU_SECTION_CUSTOMIZATION: "Personnalisation",
2977
+ SETTINGS_MENU_SECTION_GENERAL: "G\xE9n\xE9ral",
2978
+ SETTINGS_MENU_SECTION_HELP: "Aide",
2979
+ SETTINGS_MENU_SECTION_INSTALLATION: "Installation",
2980
+ SETTINGS_MENU_SECTION_PROFILES: "Profils",
2981
+ SETTINGS_MENU_SECTION_SUPPORT: "Support",
2982
+ SETTINGS_MY_GROUPS: "Mes groupes",
2983
+ SETTINGS_MY_PHOTOS: "Mes photos",
2984
+ SETTINGS_MY_PROFILE: "Mon Profil",
2985
+ SETTINGS_MY_SCENARIOS: "Mes sc\xE9narios",
2986
+ SETTINGS_MY_SITES: "Mes domiciles",
2987
+ SETTINGS_NAME: "Nom",
2988
+ SETTINGS_NEW: "Nouveau",
2989
+ SETTINGS_NOTIFICATIONS_ALERTS_DESCRIPTION: "Soyez alert\xE9 des \xE9venements de votre domicile par notification.",
2990
+ SETTINGS_PHOTOS_ADD_TIP_TEXT: "Ajouter une commmande d'\xE9quipement",
2991
+ SETTINGS_PHOTOS_APPEARANCE_ALPHA: "Transparence",
2992
+ SETTINGS_PHOTOS_APPEARANCE_SCALE: "\xC9chelle",
2993
+ SETTINGS_PHOTOS_APPEARANCE_SHOW_NAME: "Afficher le nom",
2994
+ SETTINGS_PHOTOS_APPEARANCE_TEXT: "Ajustez les touches de commandes \xE0 vos photos.",
2995
+ SETTINGS_PHOTOS_CANCEL_MESSAGE: "Ajouter la nouvelle photo avant de quitter ?",
2996
+ SETTINGS_PHOTOS_CREATE: "Ajouter une photo",
2997
+ SETTINGS_PHOTOS_CREATE_TEXT: "Commandez vos \xE9quipements directement depuis les photos de votre int\xE9rieur.",
2998
+ SETTINGS_PHOTOS_DEFAULT_NAME: "Nouvelle photo",
2999
+ SETTINGS_PHOTOS_DELETE: "Supprimer la photo",
3000
+ SETTINGS_PHOTOS_DELETE_AREA_TEXT: "Glisser ici pour supprimer une touche",
3001
+ SETTINGS_PHOTOS_EDIT: "Modifier la photo",
3002
+ SETTINGS_PHOTOS_ITEMS_APPEARANCE: "Apparence des touches",
3003
+ SETTINGS_PHOTOS_MANAGE_ITEMS: "G\xE9rer les touches",
3004
+ SETTINGS_PHOTOS_SELECT_TARGET: "S\xE9lectionner un \xE9quipement, un groupe ou un sc\xE9nario",
3005
+ SETTINGS_PHOTOS_SELECT_TARGET_TEXT: "S\xE9lectionnez un \xE9quipement, un groupe ou un sc\xE9nario que vous souhaitez lier \xE0 la touche.",
3006
+ SETTINGS_PHOTOS_ZOOM: "Bloque le zoom",
3007
+ SETTINGS_PHOTOS_ZOOM_TEXT: "Bloquer l'agrandissement de votre photo.\n\nSi cette option est active, vous ne pourrez plus pincer avec deux doigts pour agrandir ou r\xE9tr\xE9cir la photo.",
3008
+ SETTINGS_PHOTO_LIBRARY: "Phototh\xE8que",
3009
+ SETTINGS_PHOTO_TAKE_PICTURE: "Prendre une photo",
3010
+ SETTINGS_PICTO: "Pictogramme",
3011
+ SETTINGS_PRIVACY_POLICY: "Politique de confidentialit\xE9",
3012
+ SETTINGS_QR_CODE_SERIAL_ADD_TEXT: "Saisissez le num\xE9ro de s\xE9rie situ\xE9 sous le pied de votre cam\xE9ra (ex : 730180186).",
3013
+ SETTINGS_ROOMS: "Pi\xE8ces",
3014
+ SETTINGS_SCAN_ZIGBEE: "Appuyer sur COMMENCER pour d\xE9couvrir les \xE9quipements Zigbee de votre installation.",
3015
+ SETTINGS_SCENARIOS: "Sc\xE9narios",
3016
+ SETTINGS_SCENARIOS_CANCEL_MESSAGE: "Ajouter le nouveau sc\xE9nario avant de quitter ?",
3017
+ SETTINGS_SCENARIOS_CREATE: "Cr\xE9er un sc\xE9nario",
3018
+ SETTINGS_SCENARIOS_CREATE_TEXT: "Le sc\xE9nario permet de combiner plusieurs actions simultan\xE9ment.\nExemple : Le sc\xE9nario \xABD\xE9part\xBB combine l'extinction de l'\xE9clairage, la fermeture des volets roulants.",
3019
+ SETTINGS_SCENARIOS_DEFAULT_NAME: "Nouveau sc\xE9nario",
3020
+ SETTINGS_SCENARIOS_DELETE: "Supprimer le sc\xE9nario",
3021
+ SETTINGS_SCENARIOS_DELETE_MESSAGE: "Ce sc\xE9nario sera supprim\xE9 de la liste des sc\xE9narios et des moments s'il avait \xE9t\xE9 ajout\xE9 \xE0 la programmation.",
3022
+ SETTINGS_SCENARIOS_MAX_MESSAGE: "Le nombre maximum de %s sc\xE9narios est atteint.",
3023
+ SETTINGS_SCENARIOS_MENU_ACTIONS: "Actions",
3024
+ SETTINGS_SCENARIOS_MENU_EQUIPMENTS: "\xC9quipements",
3025
+ SETTINGS_SCENARIOS_SELECT_EQUIPMENTS: "S\xE9lectionner les \xE9quipements",
3026
+ SETTINGS_SCENARIOS_SELECT_EQUIPMENTS_TEXT: "S\xE9lectionnez les \xE9quipements \xE0 jouer au lancement du sc\xE9nario.",
3027
+ SETTINGS_SCENARIOS_SET_ACTIONS: "R\xE9gler les actions",
3028
+ SETTINGS_SCENARIOS_SET_ACTIONS_TEXT: "R\xE9glez les actions sur chaque \xE9quipement qui seront jou\xE9es au lancement du sc\xE9nario.",
3029
+ SETTINGS_SCENARIO_MAX: "Le nombre maximum de 16 sc\xE9narios est atteint",
3030
+ SETTINGS_SELECT_PRODUCT: "S\xE9lectionnez un \xE9quipement",
3031
+ SETTINGS_SELECT_TYPE: "S\xE9lectionnez un type",
3032
+ SETTINGS_SERIAL_NUMBER: "Num\xE9ro de s\xE9rie",
3033
+ SETTINGS_SERVICES: "Services",
3034
+ SETTINGS_SITE_ADD: "Ajouter un domicile",
3035
+ SETTINGS_SITE_ADD_TEXT: "Donnez un nom \xE0 votre nouveau domicile.\nPar exemple 'Maison principale' ou 'Rennes'.",
3036
+ SETTINGS_SITE_ADVANCED_OPTIONS: "Options avanc\xE9es",
3037
+ SETTINGS_SITE_DELETE: "Supprimer domicile",
3038
+ SETTINGS_SITE_DELETE_DIALOG_TITLE: "Ce domicile sera supprim\xE9 de cette application et ne sera plus accessible.",
3039
+ SETTINGS_SITE_DELETE_IMPOSSIBLE_DIALOG_TEXT: "Vous ne pouvez pas supprimer ce domicile car vous y \xEAtes connect\xE9.",
3040
+ SETTINGS_SITE_DELETE_IMPOSSIBLE_DIALOG_TITLE: "Suppression impossible",
3041
+ SETTINGS_SITE_DELETE_TEXT: "S\xE9lectionnez le ou les domiciles que vous souhaitez supprimer de cette application et appuyez sur supprimer.",
3042
+ SETTINGS_SITE_FORGOT_PASSWORD_TEXT: "Le mot de passe TYDOM vous sera demand\xE9 lors de votre prochaine connexion.",
3043
+ SETTINGS_SITE_FORGOT_PASSWORD_TITLE: "Oublier le mot de passe",
3044
+ SETTINGS_SITE_IDENDIFIER_ALERT: "Format de l'adresse mac incorrecte",
3045
+ SETTINGS_SITE_IDENDIFIER_TEXT: "L'identifiant du site correspond aux 6 derniers caract\xE8res de l'adresse MAC qui se trouvent \xE0 l'arri\xE8re de votre box TYDOM (ex : 00801E).",
3046
+ SETTINGS_SITE_IDENTIFIER: "Identifiant",
3047
+ SETTINGS_SITE_LOCALISATION_TEXT: "Positionnez votre domicile sur la carte en faisant un appui long sur l'emplacement d\xE9sir\xE9.",
3048
+ SETTINGS_SITE_LOCATION: "Localisation",
3049
+ SETTINGS_SITE_MAIN_SITE: "Domicile Principal",
3050
+ SETTINGS_SITE_PASSWORD: "Mot de passe",
3051
+ SETTINGS_SITE_PASSWORD_CONFIRMATION: "Confirmation mot de passe",
3052
+ SETTINGS_SITE_PASSWORD_ERROR: "Vous ne respectez pas les conditions pour le mot de passe.",
3053
+ SETTINGS_SITE_PASSWORD_ERROR_SAME_PASSWORD: "Les mots de passe ne sont pas identiques.",
3054
+ SETTINGS_SITE_PASSWORD_TEXT: "Saisissez un mot de passe pour votre box TYDOM, puis confirmez le.\nIl doit contenir 8 caract\xE8res minimum, au moins un chiffre, au moins une lettre.",
3055
+ SETTINGS_SITE_REPLACE: "Remplacer TYDOM",
3056
+ SETTINGS_SITE_REPLACE_IDENTIFIER_TEXT: "Une fois branch\xE9e, entrez l'identifiant de la nouvelle box TYDOM.\nL'identifiant du site correspond aux 6 derniers caract\xE8res de l'adresse MAC qui se trouve \xE0 l'arri\xE8re de votre box TYDOM (ex: 00801E).",
3057
+ SETTINGS_SITE_REPLACE_PASSWORD_ALERT: "Votre mot de passe doit \xEAtre identique entre les deux saisies.",
3058
+ SETTINGS_SITE_REPLACE_PASSWORD_NEW: "Nouveau mot de passe",
3059
+ SETTINGS_SITE_REPLACE_PASSWORD_OLD: "Ancien mot de passe",
3060
+ SETTINGS_SITE_REPLACE_RESET: "Remise \xE0 z\xE9ro",
3061
+ SETTINGS_SITE_REPLACE_RESET_ALERT: "La nouvelle box TYDOM va \xEAtre remise \xE0 z\xE9ro, toutes ses informations seront supprim\xE9es.",
3062
+ SETTINGS_SITE_REPLACE_TEXT: "S\xE9lectionnez le TYDOM que vous souhaitez remplacer.",
3063
+ SETTINGS_SITE_SAVE_PASSWORD_TEXT: "M\xE9moriser le mot de passe de connexion",
3064
+ SETTINGS_SITE_UPDATE_NEW_ERROR_PASSWORD_TITLE: "Nouveau mot de passe incorrect",
3065
+ SETTINGS_SITE_UPDATE_OLD_ERROR_PASSWORD_TEXT: "L'ancien mot de passe saisi est incorrect, veuillez r\xE9essayer",
3066
+ SETTINGS_SITE_UPDATE_OLD_ERROR_PASSWORD_TITLE: "Ancien mot de passe incorrect",
3067
+ SETTINGS_SITE_UPDATE_PASSWORD_TEXT: "Pour vous connecter au TYDOM, utilisez d\xE9sormais le nouveau mot de passe saisi.",
3068
+ SETTINGS_SITE_UPDATE_PASSWORD_TITLE: "Modification r\xE9ussie",
3069
+ SETTINGS_STARTUP_TAB: "Onglet de d\xE9marrage",
3070
+ SETTINGS_SUPPORT: "Support",
3071
+ SETTINGS_TITLE: "R\xC9GLAGES",
3072
+ SETTINGS_UNMANAGED: "Non g\xE9r\xE9",
3073
+ SETTINGS_WEBSITE: "Site Internet",
3074
+ SETTINGS_WIFI_GENERATED_QR_CODE_TEXT: "Pointer l'\xE9cran de votre smartphone\nvers l'objectif de la cam\xE9ra.\nAppuyez sur CONTINUER quand\nla cam\xE9ra sonne ou clignote.",
3075
+ SETTINGS_WIFI_PASSWORD_ADD_TEXT: "Saisissez le mot de passe du r\xE9seau Wi-Fi s\xE9lectionn\xE9.",
3076
+ SETTING_ASSOCIATE_CAMERA_ETH_ACTION_MSG: "Connectez la cam\xE9ra \xE0 votre box ADSL via un\nc\xE2ble RJ45.\nPuis appuyez sur CONTINUER.",
3077
+ SETTING_ASSOCIATE_CAMERA_NETWORK: "Connexion au r\xE9seau",
3078
+ SETTING_ASSOCIATE_CAMERA_POE_ACTION_MSG: "Branchez l\u2019alimentation \xE9lectrique\nde la cam\xE9ra.\nPuis appuyez sur CONTINUER.",
3079
+ SETTING_ASSOCIATE_CAMERA_SCANQRCODE_INDICATION: "Placez le QR Code de la cam\xE9ra\nau centre du carr\xE9",
3080
+ SETTING_ASSOCIATE_CAMERA_SCANQRCODE_MANUAL_INPUT: "Saisie manuelle",
3081
+ SETTING_ASSOCIATE_CAMERA_SCANQRCODE_TITLE: "Scanner le QR Code",
3082
+ SETTING_ASSOCIATE_CAMERA_TO_SERVER: "Enregistrement sur le serveur",
3083
+ SETTING_ASSOCIATE_CAMERA_TO_YOUR_ACCOUNT: "Association de l'appareil \xE0 votre compte",
3084
+ SETTING_ASSOCIATE_CAMERA_WIFI_ACTION_MSG: "Renseignez ici les informations de connexion au r\xE9seau\nWi-Fi et appuyez sur CONTINUER,\nou s\xE9lectionnez une connexion filaire.",
3085
+ SETTING_ASSOCIATE_CAMERA_WPS_ACTION_MSG: "Appuyer sur le bouton WPS\nde votre box ADSL\net de la cam\xE9ra.\nPuis appuyez sur CONTINUER",
3086
+ SETTING_ASSOCIATE_REINITIALIZE_CAMERA: "R\xE9initialiser la cam\xE9ra",
3087
+ SETTING_ASSOCIATE_REINITIALIZE_DESCRIPTION: "Appuyez sur le bouton RESET situ\xE9 derri\xE8re la cam\xE9ra\npendant environ 15 secondes apr\xE8s avoir allum\xE9 la cam\xE9ra\npour restaurer les r\xE9glages par d\xE9faut,\npuis appuyez sur R\xC9INITIALISER.",
3088
+ SETTING_ASSOCIATE_REINITIALIZE_TITLE: "R\xE9initialisation",
3089
+ SETTING_EXPERT_FREE_EQUIPMENT: "%s emplacements disponibles",
3090
+ SETTING_EXPERT_MODE_NETWORK: "R\xE9seau %s",
3091
+ SETTING_EXPERT_MODE_NETWORK_CHOICE: "Choix du r\xE9seau",
3092
+ SETTING_EXPERT_MODE_NETWORK_DEFAULT: "Par d\xE9faut",
3093
+ SETTING_EXPERT_MODE_TUTO: "Assurez-vous que l'\xE9quipement\n est en attente d'association\n avant de continuer",
3094
+ SETTING_GROUP_FAVOURITE_ADD_MESSAGE: "Votre groupe est directement accessible depuis la page d'accueil.",
3095
+ SETTING_GROUP_FAVOURITE_DELETE_MESSAGE: "Votre groupe ne sera plus accessible depuis la page d'accueil.",
3096
+ SETTING_GROUP_MODE_ASSO_MESSAGE: "Les \xE9quipements du groupe sont en attente d'association.",
3097
+ SETTING_GROUP_SUPPRIMER_MESSAGE: "Ce groupe va \xEAtre supprim\xE9 de votre installation",
3098
+ SETTING_LABEL: "Cr\xE9ation \xE9tiquette",
3099
+ SETTING_MY_EQUIPMENT: "Mes \xE9quipements",
3100
+ SETTING_PARTIAL_DETECTOR: "Cr\xE9ation d\xE9tecteur dans partielle",
3101
+ SETTING_PHONE: "Modification param\xE8tres t\xE9l\xE9phoniques",
3102
+ SETTING_PRODUCT_CAMERA_DETECTION: "D\xE9tection",
3103
+ SETTING_PRODUCT_CAMERA_DOMAINE_NAME: "NOM DE DOMAINE",
3104
+ SETTING_PRODUCT_CAMERA_FIRMWWARE: "VERSION FIRMWWARE",
3105
+ SETTING_PRODUCT_CAMERA_IMAGE: "Image",
3106
+ SETTING_PRODUCT_CAMERA_INFO: "Informations",
3107
+ SETTING_PRODUCT_CAMERA_MODEL: "MOD\xC8LE CAM\xC9RA",
3108
+ SETTING_PRODUCT_CAMERA_NETWORK: "R\xE9seau WIFI",
3109
+ SETTING_PRODUCT_CAMERA_STATE: "\xC9TAT",
3110
+ SETTING_PRODUCT_CAMERA_STORAGE: "Stockage",
3111
+ SETTING_PRODUCT_LOCALISER: "Localiser",
3112
+ SETTING_PRODUCT_LOCALISER_MESSAGE: "Pour vous aider \xE0 le localiser, votre \xE9quipement clignote ou s'actionne",
3113
+ SETTING_PRODUCT_MASKED: "Masquer",
3114
+ SETTING_PRODUCT_MASKED_MESSAGE: "Cet \xE9quipement est d\xE9sormais masqu\xE9.\n Il ne sera plus visible,\n et ne pourra plus \xEAtre pilot\xE9.",
3115
+ SETTING_PRODUCT_METIER: "M\xE9tier",
3116
+ SETTING_PRODUCT_MODE_ASSO: "Mode association",
3117
+ SETTING_PRODUCT_MODE_ASSO_MESSAGE: "Votre \xE9quipement est d\xE9sormais en attente d'association.",
3118
+ SETTING_PRODUCT_NAME: "Nom",
3119
+ SETTING_PRODUCT_NO_MASKED_MESSAGE: "D\xE9sormais, cet \xE9quipement n'est plus masqu\xE9.",
3120
+ SETTING_PRODUCT_OPTION_AVANCEES: "Options avanc\xE9es",
3121
+ SETTING_PRODUCT_PICTOGRAMME: "Pictogramme",
3122
+ SETTING_PRODUCT_SELECT_METIER: "S\xE9lectionnez un m\xE9tier",
3123
+ SETTING_PRODUCT_SUPPRIMER_MESSAGE: "Cet \xE9quipement va \xEAtre supprim\xE9 de votre installation",
3124
+ SETTING_PRODUCT_WIDGET_BEHAVIOR_BSO_DIMMER: "90\xB0 / 180\xB0",
3125
+ SETTING_PRODUCT_WIDGET_BEHAVIOR_SHUTTER_DIMMER: "Roulant - Battant",
3126
+ SETTING_SCENARIO_SUPPRIMER_MESSAGE: "Ce sc\xE9nario sera supprim\xE9 de la liste des sc\xE9narios et des moments s'il avait \xE9t\xE9 ajout\xE9 \xE0 la programmation.",
3127
+ SETTING_TIME: "Mise \xE0 l'heure",
3128
+ SETTING_WINDOW_FAVOURITE_ADD_MESSAGE: "Votre fen\xEAtre est directement accessible depuis la page d'accueil.",
3129
+ SETTING_WINDOW_FAVOURITE_DELETE_MESSAGE: "Votre fen\xEAtre ne sera plus accessible depuis la page d'accueil.",
3130
+ SETTING_WINDOW_SUPPRIMER_MESSAGE: "Cette fen\xEAtre va \xEAtre supprim\xE9e de votre installation.",
3131
+ SHOP: "Magasin",
3132
+ SHOPWINDOW: "Vitrine",
3133
+ SHOP_WINDOW: "Vitrine",
3134
+ SHOWROOM: "Showroom",
3135
+ SHOW_WIFI_PASSWORD: "Afficher le mot de passe",
3136
+ SHUTDOWN_PRODUCT: "Extinction",
3137
+ SHUTTER_CONTROL_CLOSE: "Ferm\xE9",
3138
+ SHUTTER_CONTROL_GROUP_UNKNOWN: "positions diff\xE9rentes",
3139
+ SHUTTER_CONTROL_OPEN: "Ouvert",
3140
+ SHUTTER_CONTROL_POURCENT: "%s %% ferm\xE9",
3141
+ SHUTTER_CONTROL_STOP: "Stop",
3142
+ SHUTTER_CONTROL_UNKNOWN: "Position inconnue",
3143
+ SHUTTER_DEFAULT_BATTERY_DEFECT: "D\xE9faut pile",
3144
+ SHUTTER_DEFAULT_CLOSE_SLOPE_DEFECT: "Inclinaison non autoris\xE9e",
3145
+ SHUTTER_DEFAULT_DOWN_DEFECT: "Descente non autoris\xE9e",
3146
+ SHUTTER_DEFAULT_OBSTACLE_DEFECT: "Obstacle d\xE9tect\xE9",
3147
+ SHUTTER_DEFAULT_OBSTACLE_SLOPE_DEFECT: "Obstacle inclinaison d\xE9tect\xE9",
3148
+ SHUTTER_DEFAULT_OPEN_SLOPE_DEFECT: "Inclinaison non autoris\xE9e",
3149
+ SHUTTER_DEFAULT_THERMIC_DEFECT: "Surchauffe moteur",
3150
+ SHUTTER_DEFAULT_THERMIC_SLOPE_DEFECT: "Surchauffe moteur inclinaison",
3151
+ SHUTTER_DEFAULT_UP_DEFECT: "Mont\xE9e non autoris\xE9e",
3152
+ SHUTTER_INFO_INTRUSION: "Tentative d'intrusion",
3153
+ SIM_FAULT: "Carte SIM absente",
3154
+ SITE_ADD_TEXT: "Pour commencer, appuyez sur Nouveau Domicile pour vous connecter \xE0 votre box domotique TYDOM.",
3155
+ SITE_FAILED_CONNEXION_MESSAGE: "V\xE9rifiez les informations saisies et assurez vous d'\xEAtre connect\xE9 au m\xEAme r\xE9seau que votre box TYDOM.",
3156
+ SITE_FAILED_CONNEXION_TITLE: "\xC9chec de connexion",
3157
+ SITE_LOCALISATION_POPUP_MESSAGE: "Pour profiter de tous les services, vous devez activer le service de localisation.\nVoulez-vous activer ce service ?",
3158
+ SITE_LOCALISATION_POPUP_TITLE: "Service de localisation d\xE9sactiv\xE9",
3159
+ SITE_MAC_ADDRESS_DIALOG_HEADER: "Identifiant d\xE9j\xE0 utilis\xE9",
3160
+ SITE_MAC_ADDRESS_DIALOG_MESSAGE: "L'identifiant saisi est d\xE9j\xE0 utilis\xE9 pour un autre de vos domiciles",
3161
+ SITE_MODE_DEMO: "Mode D\xE9mo",
3162
+ SITE_MODE_DEMO_ON: "Quittez le mode d\xE9mo",
3163
+ SITE_NAME_DIALOG_HEADER: "Nom d\xE9j\xE0 utilis\xE9",
3164
+ SITE_NAME_DIALOG_MESSAGE: "Le nom saisi est d\xE9j\xE0 utilis\xE9 pour un autre de vos domiciles",
3165
+ SITE_NEW: "Nouveau domicile",
3166
+ SITE_NEW_DEFAULT_NAME: "Chez moi",
3167
+ SITE_NEW_ERROR: "Veuillez remplir tous les champs.",
3168
+ SITE_NEW_TEXT: "Remplissez les champs suivants, et appuyez sur Ajouter pour terminer l'installation de votre box TYDOM.",
3169
+ SMS_VIDEO_MESSAGE: "D'ici quelques instants, un SMS contenant un lien vers la vid\xE9o sera envoy\xE9 aux num\xE9ros autoris\xE9s.",
3170
+ SMS_VIDEO_TITLE: "Demande envoy\xE9e",
3171
+ SOFT_UPDATED: "Mise \xE0 jour",
3172
+ SPA: "Spa",
3173
+ SPORT_HALL: "Salle de sport",
3174
+ STAIRCASE: "Escalier",
3175
+ STAIRWAY: "Escalier",
3176
+ START_PRODUCT: "D\xE9marrage",
3177
+ STORAGE_ROOM: "R\xE9serve",
3178
+ STOREROOM: "R\xE9serve",
3179
+ SUMMER_KITCHEN: "Cuisine \xE9t\xE9",
3180
+ SUPP_CURRENT_POINT: "Suppression p\xE9riph\xE9rique :",
3181
+ SUPP_DANS_SCENARIOS: "l'alarme sera aussi supprim\xE9e dans les sc\xE9narios.",
3182
+ TECHNICAL_ALARM: "D\xE9faut technique",
3183
+ TELECHARGER_NOYAU: "T\xE9l\xE9chargement",
3184
+ TELECOM_LINE_FAULT: "D\xE9faut ligne RTC",
3185
+ TELEMONITORING_FAULT: "D\xE9faut t\xE9l\xE9surveillance",
3186
+ TERRACE: "Terrasse",
3187
+ TEST_MODE: "Mode test",
3188
+ TIMELINE_CAMERA_LIVE: "LIVE",
3189
+ TOILET: "Toilette",
3190
+ TYCAM_ECHEC_CONNEXION: "Connexion au serveur impossible.",
3191
+ TYXAL_PLUS: "Tyxal +",
3192
+ UNACKNOWLEDGED_EVENTS: "Non acquitt\xE9(s)",
3193
+ UPDATE_TYDOM_INPROGRESS_MESSAGE: "La mise \xE0 jour de votre box domotique peut prendre quelques instants.\nQuittez l'application et relancez l'application.",
3194
+ UPDATE_TYDOM_INPROGRESS_TITLE: "Mise \xE0 jour en cours",
3195
+ UPDATE_TYDOM_LATER: "Plus tard",
3196
+ UPDATE_TYDOM_MESSAGE: "Une mise \xE0 jour est disponible pour votre box domotique TYDOM.\nVoulez-vous effectuer la mise \xE0 jour ?",
3197
+ UPDATE_TYDOM_TITLE: "Mise \xE0 jour",
3198
+ URL_ALARM: "https://www.deltadore.fr/domotique/alarme",
3199
+ URL_BELM_DOOR: "https://www.deltadore.fr/domotique/suivi-consommations",
3200
+ URL_CONSO: "https://www.deltadore.fr/domotique/suivi-consommations",
3201
+ URL_CONTACT_US: "http://www.deltadore.fr/services/contact",
3202
+ URL_FIND_INSTALLER: "http://www.deltadore.fr/services/entreprise-domotique-devis",
3203
+ URL_GARAGE: "https://www.deltadore.fr/domotique/pilotage-volets-store-portail-garage",
3204
+ URL_GATE: "https://www.deltadore.fr/domotique/pilotage-volets-store-portail-garage",
3205
+ URL_HEATING: "https://www.deltadore.fr/domotique/gestion-chauffage",
3206
+ URL_HELP: "https://www.deltadore.fr/app-tydom/notice-utilisation",
3207
+ URL_INTERNET_SITE: "http://www.deltadore.fr/",
3208
+ URL_LIGHT: "https://www.deltadore.fr/domotique/pilotage-eclairage",
3209
+ URL_OTHER: "https://www.deltadore.fr/",
3210
+ URL_SHUTTER: "https://www.deltadore.fr/domotique/pilotage-volets-store-portail-garage",
3211
+ URL_VOCAL_CONTROL: "https://www.deltadore.fr/compatibilite-commande-vocale",
3212
+ UTILITY_ROOM: "Buanderie",
3213
+ VALID: "Valider",
3214
+ VERANDA: "Veranda",
3215
+ VIDEO: "Demande vid\xE9o",
3216
+ VIDEO_FAULT: "Echec vid\xE9o",
3217
+ VIDEO_LINK_FAULT: "D\xE9faut lien vid\xE9o",
3218
+ WAITING_ROOM: "Salle d'attente",
3219
+ WAREHOUSE: "Hangar",
3220
+ WC: "WC",
3221
+ WIFI_PASSWORD: "Mot de passe WI-FI",
3222
+ WIFI_PASSWORD_EMPTY_FIELD: "Non Renseign\xE9",
3223
+ WIFI_PASSWORD_UPDATED: "Renseign\xE9",
3224
+ WINDOW: "Fen\xEAtre",
3225
+ WORKSHOP: "Atelier",
3226
+ WORK_SITE: "Chantier",
3227
+ WRONG_ACCESS_CODE: "Code d'acc\xE8s erron\xE9",
3228
+ YARD: "Cour",
3229
+ ZONE_AUTRE: "Zone autre"
3230
+ };
3231
+
3232
+ // src/config/locale.ts
3233
+ var locales = { en: en_default, fr: fr_default };
3234
+ var locale = locales[HOMEBRIDGE_TYDOM_LOCALE];
3235
+ var locale_default = locale;
3236
+
3237
+ // src/accessories/securitySystem.ts
3238
+ var getActiveZones = (alarmData, settings) => {
3239
+ const { legacy } = settings;
3240
+ return alarmData.reduce((soFar, { name, value }) => {
3241
+ const matches = name.match(!legacy ? /zone([1-8])State/i : /part([1-4])State/i);
3242
+ if (matches && value === "ON") {
3243
+ soFar.push(asNumber(matches[1]));
3244
+ }
3245
+ return soFar;
3246
+ }, []);
3247
+ };
3248
+ var getStateForActiveZones = (activeZones, zoneAliases) => {
3249
+ const { SecuritySystemCurrentState } = Characteristic;
3250
+ if (zoneAliases.stay && sameArrays(activeZones, zoneAliases.stay)) {
3251
+ return SecuritySystemCurrentState.STAY_ARM;
3252
+ }
3253
+ if (zoneAliases.night && sameArrays(activeZones, zoneAliases.night)) {
3254
+ return SecuritySystemCurrentState.NIGHT_ARM;
3255
+ }
3256
+ return SecuritySystemCurrentState.DISARMED;
3257
+ };
3258
+ var getStateForAlarmData = (alarmData, zoneAliases, settings) => {
3259
+ const { SecuritySystemCurrentState } = Characteristic;
3260
+ const alarmMode = getTydomDataPropValue(alarmData, "alarmMode");
3261
+ const alarmState = getTydomDataPropValue(alarmData, "alarmState");
3262
+ if (["DELAYED", "ON", "QUIET"].includes(alarmState)) {
3263
+ return SecuritySystemCurrentState.ALARM_TRIGGERED;
3264
+ }
3265
+ if (alarmMode === "ON") {
3266
+ return SecuritySystemCurrentState.AWAY_ARM;
3267
+ }
3268
+ if (["ZONE", "PART"].includes(alarmMode)) {
3269
+ const activeZones = getActiveZones(alarmData, settings);
3270
+ return getStateForActiveZones(activeZones, zoneAliases);
3271
+ }
3272
+ return SecuritySystemCurrentState.DISARMED;
3273
+ };
3274
+ var setupSecuritySystem = async (accessory, controller) => {
3275
+ const { context } = accessory;
3276
+ const { client, log } = controller;
3277
+ const { SecuritySystemTargetState, SecuritySystemCurrentState, StatusTampered, ContactSensorState, On } = Characteristic;
3278
+ const { deviceId, endpointId, settings } = context;
3279
+ setupAccessoryInformationService(accessory, controller);
3280
+ setupAccessoryIdentifyHandler(accessory, controller);
3281
+ const { aliases = {}, pin: settingsPin, legacy: isLegacy = false } = settings;
3282
+ if (settings.sensors !== false) {
3283
+ const { accessoryId } = context;
3284
+ const extraDevice = {
3285
+ ...context,
3286
+ name: (0, import_lodash6.get)(locale_default, "ALARME_ISSUES_OUVERTES", "N/A"),
3287
+ category: SECURITY_SYSTEM_SENSORS,
3288
+ accessoryId: `${accessoryId}:sensors`
3289
+ };
3290
+ controller.emit("device", extraDevice);
3291
+ }
3292
+ let zones = [];
3293
+ const initialData = await getTydomDeviceData(client, {
3294
+ deviceId,
3295
+ endpointId
3296
+ });
3297
+ const setTydomZones = async (zones2, value) => {
3298
+ if (!isLegacy) {
3299
+ return await client.put(`/devices/${deviceId}/endpoints/${endpointId}/cdata?name=zoneCmd`, {
3300
+ value,
3301
+ pwd: pin,
3302
+ zones: zones2
3303
+ });
3304
+ } else {
3305
+ for (const zone of zones2) {
3306
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/cdata?name=partCmd`, {
3307
+ value,
3308
+ part: zone
3309
+ });
3310
+ }
3311
+ }
3312
+ };
3313
+ if (!isLegacy) {
3314
+ try {
3315
+ const labelResults = await client.command(
3316
+ `/devices/${deviceId}/endpoints/${endpointId}/cdata?name=label`
3317
+ );
3318
+ zones = labelResults[0].zones;
3319
+ } catch (err) {
3320
+ log.warn(`Failed to query labels for security system`);
3321
+ zones = [];
3322
+ }
3323
+ } else {
3324
+ log.warn(`Setting up legacy zones`);
3325
+ zones = [
3326
+ { id: 0, nameCustom: "Zone 1" },
3327
+ { id: 1, nameCustom: "Zone 2" },
3328
+ { id: 2, nameCustom: "Zone 3" },
3329
+ { id: 3, nameCustom: "Zone 4" }
3330
+ ];
3331
+ }
3332
+ const pin = HOMEBRIDGE_TYDOM_PIN ? decode(HOMEBRIDGE_TYDOM_PIN) : settingsPin;
3333
+ if (!pin) {
3334
+ log.warn(
3335
+ `Missing pin for device securitySystem, add either {"settings": {"${deviceId}": {"pin": "123456"}}} or HOMEBRIDGE_TYDOM_PIN env var (base64 encoded)`
3336
+ );
3337
+ }
3338
+ const service = addAccessoryService(accessory, Service.SecuritySystem, accessory.displayName, true);
3339
+ service.getCharacteristic(SecuritySystemCurrentState).updateValue(SecuritySystemCurrentState.DISARMED).onGet(async () => {
3340
+ debugGet(SecuritySystemCurrentState, service);
3341
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3342
+ const nextValue = getStateForAlarmData(data, aliases, settings);
3343
+ debugGetResult(SecuritySystemCurrentState, service, nextValue);
3344
+ return nextValue;
3345
+ });
3346
+ service.getCharacteristic(StatusTampered).onGet(async () => {
3347
+ debugGet(StatusTampered, service);
3348
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3349
+ const systAutoProtect = getTydomDataPropValue(data, "systAutoProtect");
3350
+ debugGetResult(StatusTampered, service, systAutoProtect);
3351
+ return systAutoProtect;
3352
+ });
3353
+ service.getCharacteristic(SecuritySystemTargetState).onGet(async () => {
3354
+ debugGet(SecuritySystemTargetState, service);
3355
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3356
+ const nextValue = getStateForAlarmData(data, aliases, settings);
3357
+ debugGetResult(SecuritySystemTargetState, service, nextValue);
3358
+ return nextValue;
3359
+ }).onSet(async (value) => {
3360
+ debugSet(SecuritySystemTargetState, service, value);
3361
+ if (!pin) {
3362
+ return;
3363
+ }
3364
+ if ([SecuritySystemTargetState.DISARM].includes(value)) {
3365
+ preAlarmService.updateCharacteristic(ContactSensorState, false);
3366
+ }
3367
+ if ([SecuritySystemTargetState.AWAY_ARM, SecuritySystemTargetState.DISARM].includes(value)) {
3368
+ const tydomValue = value === SecuritySystemTargetState.DISARM ? "OFF" : "ON";
3369
+ if (!isLegacy) {
3370
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/cdata?name=alarmCmd`, {
3371
+ value: tydomValue,
3372
+ pwd: pin
3373
+ });
3374
+ } else {
3375
+ for (const zone of [1, 2, 3, 4]) {
3376
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/cdata?name=partCmd`, {
3377
+ value: tydomValue,
3378
+ part: zone
3379
+ });
3380
+ }
3381
+ }
3382
+ debugSetResult(SecuritySystemTargetState, service, value, tydomValue);
3383
+ return;
3384
+ }
3385
+ if ([SecuritySystemTargetState.STAY_ARM, SecuritySystemTargetState.NIGHT_ARM].includes(value)) {
3386
+ const targetZones = value === SecuritySystemTargetState.STAY_ARM ? aliases.stay : aliases.night;
3387
+ const tydomValue = value === SecuritySystemTargetState.DISARM ? "OFF" : "ON";
3388
+ if (Array.isArray(targetZones) && targetZones.length > 0) {
3389
+ await setTydomZones(targetZones, tydomValue);
3390
+ }
3391
+ debugSetResult(SecuritySystemTargetState, service, value, tydomValue);
3392
+ return;
3393
+ }
3394
+ });
3395
+ const systOpenIssueId = `systOpenIssue`;
3396
+ const systOpenIssueName = (0, import_lodash6.get)(locale_default, "ALARME_ISSUES_OUVERTES", "N/A");
3397
+ const systOpenIssueService = addAccessoryServiceWithSubtype(
3398
+ accessory,
3399
+ Service.ContactSensor,
3400
+ systOpenIssueName,
3401
+ systOpenIssueId,
3402
+ true
3403
+ );
3404
+ debugAddSubService(systOpenIssueService, accessory);
3405
+ service.addLinkedService(systOpenIssueService);
3406
+ systOpenIssueService.getCharacteristic(ContactSensorState).onGet(async () => {
3407
+ debugGet(ContactSensorState, systOpenIssueService);
3408
+ const data = await getTydomDeviceData(client, {
3409
+ deviceId,
3410
+ endpointId
3411
+ });
3412
+ const systOpenIssue = getTydomDataPropValue(data, "systOpenIssue");
3413
+ debugGetResult(ContactSensorState, systOpenIssueService, systOpenIssue);
3414
+ return systOpenIssue;
3415
+ });
3416
+ systOpenIssueService.getCharacteristic(Characteristic.StatusActive).updateValue(true);
3417
+ systOpenIssueService.getCharacteristic(Characteristic.StatusFault).updateValue(false);
3418
+ const alarmSOSId = `alarmSOS`;
3419
+ const alarmSOSName = (0, import_lodash6.get)(locale_default, "DISCRETE_ALARM_V3", "N/A");
3420
+ const alarmSOSService = addAccessoryServiceWithSubtype(
3421
+ accessory,
3422
+ Service.ContactSensor,
3423
+ alarmSOSName,
3424
+ alarmSOSId,
3425
+ true
3426
+ );
3427
+ debugAddSubService(alarmSOSService, accessory);
3428
+ service.addLinkedService(alarmSOSService);
3429
+ alarmSOSService.getCharacteristic(ContactSensorState).onGet(async () => {
3430
+ debugGet(ContactSensorState, alarmSOSService);
3431
+ const data = await getTydomDeviceData(client, {
3432
+ deviceId,
3433
+ endpointId
3434
+ });
3435
+ const alarmSOS = getTydomDataPropValue(data, "alarmSOS");
3436
+ debugGetResult(ContactSensorState, alarmSOSService, alarmSOS);
3437
+ return alarmSOS;
3438
+ });
3439
+ alarmSOSService.getCharacteristic(Characteristic.StatusActive).updateValue(true);
3440
+ alarmSOSService.getCharacteristic(Characteristic.StatusFault).updateValue(false);
3441
+ const preAlarmId = `preAlarm`;
3442
+ const preAlarmName = (0, import_lodash6.get)(locale_default, "PREALARM", "N/A");
3443
+ const preAlarmService = addAccessoryServiceWithSubtype(
3444
+ accessory,
3445
+ Service.ContactSensor,
3446
+ preAlarmName,
3447
+ preAlarmId,
3448
+ true
3449
+ );
3450
+ debugAddSubService(preAlarmService, accessory);
3451
+ service.addLinkedService(preAlarmService);
3452
+ preAlarmService.getCharacteristic(ContactSensorState).updateValue(false);
3453
+ preAlarmService.getCharacteristic(Characteristic.StatusActive).updateValue(true);
3454
+ preAlarmService.getCharacteristic(Characteristic.StatusFault).updateValue(false);
3455
+ const zonesCount = isLegacy ? 4 : 8;
3456
+ for (let zoneIndex = 1; zoneIndex <= zonesCount; zoneIndex++) {
3457
+ const zoneProp = `${isLegacy ? "part" : "zone"}${zoneIndex}State`;
3458
+ const zoneState = getTydomDataPropValue(initialData, zoneProp);
3459
+ if (zoneState === "UNUSED") {
3460
+ continue;
3461
+ }
3462
+ assert(zones[zoneIndex - 1], `Unexpected missing zone label data for index ${zoneIndex}`);
3463
+ const { id: productId, nameStd, nameCustom } = zones[zoneIndex - 1];
3464
+ const subDeviceId = `zone_${productId}`;
3465
+ const subDeviceName = nameCustom ?? (nameStd ? (0, import_lodash6.get)(locale_default, nameStd, "N/A") : `Zone ${zoneIndex}`);
3466
+ const zoneService = addAccessoryServiceWithSubtype(
3467
+ accessory,
3468
+ Service.Switch,
3469
+ subDeviceName,
3470
+ subDeviceId,
3471
+ true
3472
+ );
3473
+ debugAddSubService(zoneService, accessory);
3474
+ service.addLinkedService(zoneService);
3475
+ zoneService.getCharacteristic(On).onGet(async () => {
3476
+ debugGet(On, zoneService);
3477
+ const data = await getTydomDeviceData(client, {
3478
+ deviceId,
3479
+ endpointId
3480
+ });
3481
+ const zoneState2 = getTydomDataPropValue(data, zoneProp);
3482
+ const nextValue = zoneState2 === "ON";
3483
+ debugGetResult(On, zoneService, nextValue);
3484
+ return nextValue;
3485
+ }).onSet(async (value) => {
3486
+ debugSet(On, zoneService, value);
3487
+ if (!pin) {
3488
+ return;
3489
+ }
3490
+ const targetZones = [zoneIndex];
3491
+ const tydomValue = value ? "ON" : "OFF";
3492
+ await setTydomZones(targetZones, tydomValue);
3493
+ debugSetResult(On, zoneService, value, tydomValue);
3494
+ });
3495
+ }
3496
+ };
3497
+ var updateSecuritySystem = (accessory, controller, updates, type) => {
3498
+ const { deviceId, endpointId, accessoryId, settings } = accessory.context;
3499
+ const { aliases = {}, legacy: isLegacy = false } = settings;
3500
+ const { SecuritySystemCurrentState, ContactSensorState, On } = Characteristic;
3501
+ if (settings.sensors !== false) {
3502
+ const extraUpdateContext = {
3503
+ category: SECURITY_SYSTEM_SENSORS,
3504
+ deviceId,
3505
+ endpointId,
3506
+ accessoryId: `${accessoryId}:sensors`
3507
+ };
3508
+ controller.emit("update", {
3509
+ type,
3510
+ updates,
3511
+ context: extraUpdateContext
3512
+ });
3513
+ }
3514
+ if (type === "cdata") {
3515
+ updates.forEach((update) => {
3516
+ const { name, parameters, values } = update;
3517
+ switch (name) {
3518
+ case "eventAlarm": {
3519
+ const { event } = values;
3520
+ debug(`New ${chalkKeyword("SecuritySystem")} alarm event=${chalkJson(event)}`);
3521
+ controller.emit("notification", {
3522
+ level: "warn",
3523
+ message: `SecuritySystem \`${name}\` event, name=\`${event.name}\` parameters=\`${JSON.stringify(
3524
+ parameters
3525
+ )}\`, values=\`${JSON.stringify(values)}\``
3526
+ });
3527
+ switch (event.name) {
3528
+ case "arret": {
3529
+ const service = getAccessoryService(accessory, Service.SecuritySystem);
3530
+ debugSetUpdate(SecuritySystemCurrentState, service, SecuritySystemCurrentState.DISARMED);
3531
+ service.updateCharacteristic(SecuritySystemCurrentState, SecuritySystemCurrentState.DISARMED);
3532
+ return;
3533
+ }
3534
+ case "marcheTotale": {
3535
+ const service = getAccessoryService(accessory, Service.SecuritySystem);
3536
+ debugSetUpdate(SecuritySystemCurrentState, service, SecuritySystemCurrentState.AWAY_ARM);
3537
+ service.updateCharacteristic(SecuritySystemCurrentState, SecuritySystemCurrentState.AWAY_ARM);
3538
+ return;
3539
+ }
3540
+ case "marcheZone": {
3541
+ const service = getAccessoryService(accessory, Service.SecuritySystem);
3542
+ const activeZones = event.zones.map((zone) => zone.id + 1);
3543
+ const nextValue = getStateForActiveZones(activeZones, aliases);
3544
+ debugSetUpdate(SecuritySystemCurrentState, service, nextValue);
3545
+ service.updateCharacteristic(SecuritySystemCurrentState, nextValue);
3546
+ return;
3547
+ }
3548
+ case "preAlarm": {
3549
+ const service = getAccessoryServiceWithSubtype(accessory, Service.ContactSensor, "preAlarm");
3550
+ debugSetUpdate(ContactSensorState, service, true);
3551
+ service.updateCharacteristic(ContactSensorState, true);
3552
+ return;
3553
+ }
3554
+ default: {
3555
+ return;
3556
+ }
3557
+ }
3558
+ }
3559
+ default: {
3560
+ controller.emit("notification", {
3561
+ level: "debug",
3562
+ message: `SecuritySystem \`${name}\` event parameters=\`${JSON.stringify(
3563
+ parameters
3564
+ )}\`, values=\`${JSON.stringify(values)}\``
3565
+ });
3566
+ return;
3567
+ }
3568
+ }
3569
+ });
3570
+ return;
3571
+ }
3572
+ updates.forEach((update) => {
3573
+ const { name, value } = update;
3574
+ switch (name) {
3575
+ case "alarmMode": {
3576
+ const service = getAccessoryService(accessory, Service.SecuritySystem);
3577
+ switch (value) {
3578
+ case "OFF": {
3579
+ const nextValue = SecuritySystemCurrentState.DISARMED;
3580
+ debugSetUpdate(SecuritySystemCurrentState, service, nextValue);
3581
+ service.updateCharacteristic(SecuritySystemCurrentState, nextValue);
3582
+ return;
3583
+ }
3584
+ case "ON": {
3585
+ const nextValue = SecuritySystemCurrentState.AWAY_ARM;
3586
+ debugSetUpdate(SecuritySystemCurrentState, service, nextValue);
3587
+ service.updateCharacteristic(SecuritySystemCurrentState, nextValue);
3588
+ return;
3589
+ }
3590
+ case "PART":
3591
+ case "ZONE": {
3592
+ const activeZones = getActiveZones(updates, settings);
3593
+ const nextValue = getStateForActiveZones(activeZones, aliases);
3594
+ debugSetUpdate(SecuritySystemCurrentState, service, nextValue);
3595
+ service.updateCharacteristic(SecuritySystemCurrentState, nextValue);
3596
+ return;
3597
+ }
3598
+ default:
3599
+ return;
3600
+ }
3601
+ }
3602
+ case "alarmSOS": {
3603
+ const service = getAccessoryServiceWithSubtype(accessory, Service.ContactSensor, "alarmSOS");
3604
+ const alarmSOS = !!value;
3605
+ debugSetUpdate(ContactSensorState, service, alarmSOS);
3606
+ service.updateCharacteristic(ContactSensorState, alarmSOS);
3607
+ return;
3608
+ }
3609
+ case "zone1State":
3610
+ case "zone2State":
3611
+ case "zone3State":
3612
+ case "zone4State":
3613
+ case "zone5State":
3614
+ case "zone6State":
3615
+ case "zone7State":
3616
+ case "zone8State":
3617
+ case "part1State":
3618
+ case "part2State":
3619
+ case "part3State":
3620
+ case "part4State": {
3621
+ const zoneState = value;
3622
+ if (zoneState === "UNUSED") {
3623
+ return;
3624
+ }
3625
+ const match = name.match(isLegacy ? /part(\d+)State/ : /zone(\d+)State/);
3626
+ if (!match) return;
3627
+ const zoneIndex = parseInt(match[1], 10) - 1;
3628
+ const service = getAccessoryServiceWithSubtype(accessory, Service.Switch, `zone_${zoneIndex}`);
3629
+ const nextValue = zoneState === "ON";
3630
+ debugSetUpdate(On, service, nextValue);
3631
+ service.updateCharacteristic(On, nextValue);
3632
+ return;
3633
+ }
3634
+ case "systOpenIssue": {
3635
+ const service = getAccessoryServiceWithSubtype(accessory, Service.ContactSensor, "systOpenIssue");
3636
+ const systOpenIssue = !!value;
3637
+ debugSetUpdate(ContactSensorState, service, systOpenIssue);
3638
+ service.updateCharacteristic(ContactSensorState, systOpenIssue);
3639
+ return;
3640
+ }
3641
+ default:
3642
+ return;
3643
+ }
3644
+ });
3645
+ };
3646
+
3647
+ // src/accessories/securitySystemSensors.ts
3648
+ var import_lodash7 = require("lodash");
3649
+ var getOpenedIssues = (commandResults) => (0, import_lodash7.keyBy)(
3650
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
3651
+ commandResults.filter((result) => result.product).map((result) => result.product),
3652
+ "id"
3653
+ );
3654
+ var contactSensorProducts = [];
3655
+ var histoSearchParams;
3656
+ var setupSecuritySystemSensors = async (accessory, controller) => {
3657
+ const { context } = accessory;
3658
+ const { client } = controller;
3659
+ const { ContactSensorState } = Characteristic;
3660
+ const { deviceId, endpointId } = context;
3661
+ setupAccessoryInformationService(accessory, controller);
3662
+ setupAccessoryIdentifyHandler(accessory, controller);
3663
+ const labelResults = await client.command(
3664
+ `/devices/${deviceId}/endpoints/${endpointId}/cdata?name=label`
3665
+ );
3666
+ const { products } = labelResults[0];
3667
+ contactSensorProducts = products.filter((product) => ["MDO"].includes(product.typeLong));
3668
+ histoSearchParams = { type: "OPEN_ISSUES", indexStart: "0", nbElem: `${contactSensorProducts.length}` };
3669
+ const initialOpenedIssues = getOpenedIssues(
3670
+ await runTydomDeviceCommand(client, "histo", {
3671
+ deviceId,
3672
+ endpointId,
3673
+ searchParams: histoSearchParams
3674
+ })
3675
+ );
3676
+ contactSensorProducts.forEach((contactSensorProduct) => {
3677
+ const { id: productId, nameStd, nameCustom, number } = contactSensorProduct;
3678
+ const subDeviceId = `systOpenIssue_${productId}`;
3679
+ const subDeviceName = nameCustom ?? `${(0, import_lodash7.get)(locale_default, nameStd, "N/A")}${number ? ` ${number}` : ""}`;
3680
+ const contactSensorService = addAccessoryServiceWithSubtype(
3681
+ accessory,
3682
+ Service.ContactSensor,
3683
+ subDeviceName,
3684
+ subDeviceId,
3685
+ true
3686
+ );
3687
+ debugAddSubService(contactSensorService, accessory);
3688
+ contactSensorService.getCharacteristic(ContactSensorState).setValue(initialOpenedIssues[productId] ? 1 : 0).onGet(async () => {
3689
+ debugGet(ContactSensorState, contactSensorService);
3690
+ const openedIssues = getOpenedIssues(
3691
+ await runTydomDeviceCommand(client, "histo", {
3692
+ deviceId,
3693
+ endpointId,
3694
+ searchParams: histoSearchParams
3695
+ })
3696
+ );
3697
+ const nextValue = openedIssues[productId] ? 1 : 0;
3698
+ debugGetResult(ContactSensorState, contactSensorService, nextValue);
3699
+ return nextValue;
3700
+ });
3701
+ contactSensorService.getCharacteristic(Characteristic.StatusActive).setValue(1);
3702
+ contactSensorService.getCharacteristic(Characteristic.StatusFault).setValue(0);
3703
+ });
3704
+ };
3705
+ var updateSecuritySystemSensors = (accessory, controller, updates, type) => {
3706
+ const { client } = controller;
3707
+ if (type === "cdata") {
3708
+ return;
3709
+ }
3710
+ updates.forEach(async (update) => {
3711
+ const { context } = accessory;
3712
+ const { deviceId, endpointId } = context;
3713
+ const { ContactSensorState } = Characteristic;
3714
+ const { name, value } = update;
3715
+ switch (name) {
3716
+ case "systOpenIssue": {
3717
+ const systOpenIssue = value;
3718
+ if (!systOpenIssue) {
3719
+ contactSensorProducts.forEach(({ id: productId }) => {
3720
+ const subDeviceId = `systOpenIssue_${productId}`;
3721
+ const service = getAccessoryServiceWithSubtype(accessory, Service.ContactSensor, subDeviceId);
3722
+ const nextValue = 0;
3723
+ debugSetUpdate(ContactSensorState, service, nextValue);
3724
+ service.updateCharacteristic(ContactSensorState, nextValue);
3725
+ });
3726
+ } else {
3727
+ const openedIssues = getOpenedIssues(
3728
+ await runTydomDeviceCommand(client, "histo", {
3729
+ deviceId,
3730
+ endpointId,
3731
+ searchParams: histoSearchParams
3732
+ })
3733
+ );
3734
+ contactSensorProducts.forEach(({ id: productId }) => {
3735
+ const subDeviceId = `systOpenIssue_${productId}`;
3736
+ const service = getAccessoryServiceWithSubtype(accessory, Service.ContactSensor, subDeviceId);
3737
+ const nextValue = openedIssues[productId] ? 1 : 0;
3738
+ debugSetUpdate(ContactSensorState, service, nextValue);
3739
+ service.updateCharacteristic(ContactSensorState, nextValue);
3740
+ });
3741
+ }
3742
+ return;
3743
+ }
3744
+ default:
3745
+ return;
3746
+ }
3747
+ });
3748
+ };
3749
+
3750
+ // src/accessories/smokeDetector.ts
3751
+ var import_homebridge3 = require("homebridge");
3752
+ var setupSmokeDetector = (accessory, controller) => {
3753
+ const { context } = accessory;
3754
+ const { client } = controller;
3755
+ const { SmokeDetected, StatusLowBattery } = Characteristic;
3756
+ const { deviceId, endpointId } = context;
3757
+ setupAccessoryInformationService(accessory, controller);
3758
+ setupAccessoryIdentifyHandler(accessory, controller);
3759
+ const service = addAccessoryService(accessory, Service.SmokeSensor, accessory.displayName, true);
3760
+ service.getCharacteristic(SmokeDetected).setProps({
3761
+ format: import_homebridge3.Formats.BOOL
3762
+ }).onGet(async () => {
3763
+ debugGet(SmokeDetected, service);
3764
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3765
+ const smokeDefect = getTydomDataPropValue(data, "techSmokeDefect");
3766
+ debugGetResult(SmokeDetected, service, smokeDefect);
3767
+ return smokeDefect;
3768
+ });
3769
+ service.getCharacteristic(StatusLowBattery).onGet(async () => {
3770
+ debugGet(StatusLowBattery, service);
3771
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3772
+ const battDefect = getTydomDataPropValue(data, "battDefect");
3773
+ debugGetResult(StatusLowBattery, service, battDefect);
3774
+ return battDefect ? StatusLowBattery.BATTERY_LEVEL_LOW : StatusLowBattery.BATTERY_LEVEL_NORMAL;
3775
+ });
3776
+ };
3777
+ var updateSmokeDetector = (accessory, _controller, updates) => {
3778
+ updates.forEach((update) => {
3779
+ const { name, value } = update;
3780
+ const { SmokeDetected, StatusLowBattery } = Characteristic;
3781
+ switch (name) {
3782
+ case "techSmokeDefect": {
3783
+ const service = getAccessoryService(accessory, Service.SmokeSensor);
3784
+ debugSetUpdate(SmokeDetected, service, value);
3785
+ service.updateCharacteristic(SmokeDetected, value);
3786
+ return;
3787
+ }
3788
+ case "battDefect": {
3789
+ const service = getAccessoryService(accessory, Service.SmokeSensor);
3790
+ debugSetUpdate(StatusLowBattery, service, value);
3791
+ service.updateCharacteristic(StatusLowBattery, value);
3792
+ return;
3793
+ }
3794
+ default:
3795
+ return;
3796
+ }
3797
+ });
3798
+ };
3799
+
3800
+ // src/accessories/switch.ts
3801
+ var setupSwitch = (accessory, controller) => {
3802
+ setupAccessoryInformationService(accessory, controller);
3803
+ setupAccessoryIdentifyHandler(accessory, controller);
3804
+ addAccessorySwitchableService(accessory, controller, Service.Switch);
3805
+ };
3806
+ var updateSwitch = (accessory, controller, updates) => {
3807
+ updateAccessorySwitchableService(accessory, controller, updates, Service.Switch);
3808
+ };
3809
+
3810
+ // src/accessories/temperatureSensor.ts
3811
+ var setupTemperatureSensor = (accessory, controller) => {
3812
+ const { context } = accessory;
3813
+ const { client } = controller;
3814
+ const { CurrentTemperature } = Characteristic;
3815
+ const { deviceId, endpointId } = context;
3816
+ setupAccessoryInformationService(accessory, controller);
3817
+ setupAccessoryIdentifyHandler(accessory, controller);
3818
+ const service = addAccessoryService(accessory, Service.TemperatureSensor, accessory.displayName, true);
3819
+ service.getCharacteristic(CurrentTemperature).setProps({
3820
+ minValue: -100
3821
+ }).onGet(async () => {
3822
+ debugGet(CurrentTemperature, service);
3823
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3824
+ const outTemperature = getTydomDataPropValue(data, "outTemperature");
3825
+ debugGetResult(CurrentTemperature, service, outTemperature);
3826
+ return outTemperature;
3827
+ });
3828
+ };
3829
+ var updateTemperatureSensor = (accessory, _controller, updates) => {
3830
+ updates.forEach((update) => {
3831
+ const { name, value } = update;
3832
+ const { CurrentTemperature } = Characteristic;
3833
+ switch (name) {
3834
+ case "outTemperature": {
3835
+ const service = getAccessoryService(accessory, Service.TemperatureSensor);
3836
+ debugSetUpdate(CurrentTemperature, service, value);
3837
+ service.updateCharacteristic(CurrentTemperature, value);
3838
+ return;
3839
+ }
3840
+ default:
3841
+ return;
3842
+ }
3843
+ });
3844
+ };
3845
+
3846
+ // src/accessories/thermostat.ts
3847
+ var import_lodash8 = require("lodash");
3848
+ var setupThermostat = (accessory, controller) => {
3849
+ const { context } = accessory;
3850
+ const { client } = controller;
3851
+ const { TargetHeatingCoolingState, CurrentHeatingCoolingState, TargetTemperature, CurrentTemperature, On } = Characteristic;
3852
+ const { deviceId, endpointId, metadata } = context;
3853
+ setupAccessoryInformationService(accessory, controller);
3854
+ setupAccessoryIdentifyHandler(accessory, controller);
3855
+ const service = addAccessoryService(accessory, Service.Thermostat, accessory.displayName, true);
3856
+ service.getCharacteristic(CurrentHeatingCoolingState).setProps({ validValues: [0, 1] }).onGet(async () => {
3857
+ debugGet(CurrentHeatingCoolingState, service);
3858
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3859
+ const authorization = getTydomDataPropValue(data, "authorization");
3860
+ const setpoint = getTydomDataPropValue(data, "setpoint");
3861
+ const temperature = getTydomDataPropValue(data, "temperature");
3862
+ const nextValue = authorization === "HEATING" && setpoint > temperature ? CurrentHeatingCoolingState.HEAT : CurrentHeatingCoolingState.OFF;
3863
+ debugGetResult(CurrentHeatingCoolingState, service, nextValue);
3864
+ return nextValue;
3865
+ });
3866
+ service.getCharacteristic(TargetHeatingCoolingState).setProps({ validValues: [0, 1] }).onGet(async () => {
3867
+ debugGet(TargetHeatingCoolingState, service);
3868
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3869
+ const hvacMode = getTydomDataPropValue(data, "hvacMode");
3870
+ const authorization = getTydomDataPropValue(data, "authorization");
3871
+ const nextValue = authorization === "HEATING" && ["NORMAL"].includes(hvacMode) ? TargetHeatingCoolingState.HEAT : TargetHeatingCoolingState.OFF;
3872
+ debugGetResult(TargetHeatingCoolingState, service, nextValue);
3873
+ return nextValue;
3874
+ }).onSet(async (value) => {
3875
+ debugSet(TargetHeatingCoolingState, service, value);
3876
+ const shouldHeat = [TargetHeatingCoolingState.HEAT, TargetHeatingCoolingState.AUTO].includes(
3877
+ value
3878
+ );
3879
+ const tydomValue = shouldHeat ? "NORMAL" : "STOP";
3880
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
3881
+ {
3882
+ name: "hvacMode",
3883
+ value: tydomValue
3884
+ }
3885
+ ]);
3886
+ debugSetResult(TargetHeatingCoolingState, service, value, tydomValue);
3887
+ service.getCharacteristic(CurrentHeatingCoolingState).updateValue(shouldHeat ? CurrentHeatingCoolingState.HEAT : CurrentHeatingCoolingState.OFF);
3888
+ });
3889
+ service.getCharacteristic(CurrentTemperature).onGet(async () => {
3890
+ debugGet(CurrentTemperature, service);
3891
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3892
+ const temperature = getTydomDataPropValue(data, "temperature");
3893
+ debugGetResult(CurrentTemperature, service, temperature);
3894
+ return temperature;
3895
+ });
3896
+ service.getCharacteristic(TargetTemperature).onGet(async () => {
3897
+ debugGet(TargetTemperature, service);
3898
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3899
+ const setpoint = getTydomDataPropValue(data, "setpoint");
3900
+ debugGetResult(TargetTemperature, service, setpoint);
3901
+ return setpoint;
3902
+ }).onSet(async (value) => {
3903
+ debugSet(TargetTemperature, service, value);
3904
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
3905
+ {
3906
+ name: "setpoint",
3907
+ value
3908
+ }
3909
+ ]);
3910
+ debugSetResult(TargetTemperature, service, value);
3911
+ });
3912
+ const thermicLevelData = metadata.find(({ name }) => name === "thermicLevel");
3913
+ if (!thermicLevelData) {
3914
+ controller.log.error(
3915
+ `Failed to properly create the thermostat accesory for device ${deviceId}, did not found object in array that matches {"name": "thermicLevel"} in ${JSON.stringify(
3916
+ metadata
3917
+ )}`
3918
+ );
3919
+ return;
3920
+ }
3921
+ const thermicLevelValues = thermicLevelData.enum_values;
3922
+ if (thermicLevelValues.length === 1) {
3923
+ const absenceModeId = `hvacMode_absence`;
3924
+ const absenceModeName = (0, import_lodash8.get)(locale_default, "HVAC_INFO_ABSENCE", "N/A");
3925
+ const absenceModeService = addAccessoryServiceWithSubtype(
3926
+ accessory,
3927
+ Service.Switch,
3928
+ absenceModeName,
3929
+ absenceModeId,
3930
+ true
3931
+ );
3932
+ debugAddSubService(absenceModeService, accessory);
3933
+ service.addLinkedService(absenceModeService);
3934
+ absenceModeService.getCharacteristic(On).onGet(async () => {
3935
+ debugGet(On, absenceModeService);
3936
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
3937
+ const hvacMode = getTydomDataPropValue(data, "hvacMode");
3938
+ const nextValue = hvacMode === "ANTI_FROST";
3939
+ debugGetResult(On, absenceModeService, nextValue);
3940
+ return nextValue;
3941
+ }).onSet(async (value) => {
3942
+ debugSet(On, absenceModeService, value);
3943
+ const tydomValue = value ? "ANTI_FROST" : "NORMAL";
3944
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
3945
+ {
3946
+ name: "hvacMode",
3947
+ value: tydomValue
3948
+ }
3949
+ ]);
3950
+ debugSetResult(On, absenceModeService, value, tydomValue);
3951
+ });
3952
+ }
3953
+ if (thermicLevelValues.length > 1) {
3954
+ const THERMIC_LEVELS_WHITELIST = ["ANTI_FROST", "ECO", "COMFORT"];
3955
+ const thermicLevelServices = thermicLevelValues.filter((value) => THERMIC_LEVELS_WHITELIST.includes(value)).map((thermicLevelValue) => {
3956
+ const thermicLevelId = `thermicLevel_${thermicLevelValue.toLowerCase()}`;
3957
+ const thermicLevelName = (0, import_lodash8.get)(locale_default, `HVAC_LEVEL_${thermicLevelValue}`, "N/A");
3958
+ const thermicLevelService = addAccessoryServiceWithSubtype(
3959
+ accessory,
3960
+ Service.Switch,
3961
+ thermicLevelName,
3962
+ thermicLevelId,
3963
+ true
3964
+ );
3965
+ debugAddSubService(thermicLevelService, accessory);
3966
+ service.addLinkedService(thermicLevelService);
3967
+ thermicLevelService.getCharacteristic(On).onGet(async () => {
3968
+ debugGet(On, thermicLevelService);
3969
+ const data = await getTydomDeviceData(client, {
3970
+ deviceId,
3971
+ endpointId
3972
+ });
3973
+ const thermicLevel = getTydomDataPropValue(
3974
+ data,
3975
+ "thermicLevel"
3976
+ );
3977
+ const nextValue = thermicLevel === thermicLevelValue;
3978
+ debugGetResult(On, thermicLevelService, nextValue);
3979
+ return nextValue;
3980
+ }).onSet(async (value) => {
3981
+ debugSet(On, thermicLevelService, value);
3982
+ const tydomValue = value ? thermicLevelValue : "NORMAL";
3983
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
3984
+ {
3985
+ name: "hvacMode",
3986
+ value: tydomValue
3987
+ }
3988
+ ]);
3989
+ debugSetResult(On, thermicLevelService, tydomValue);
3990
+ thermicLevelServices.filter(({ value: value2 }) => value2 !== thermicLevelValue).forEach(({ service: service2 }) => {
3991
+ service2.updateCharacteristic(On, false);
3992
+ });
3993
+ });
3994
+ return { value: thermicLevelValue, service: thermicLevelService };
3995
+ });
3996
+ }
3997
+ };
3998
+ var updateThermostat = (accessory, _controller, updates) => {
3999
+ const { TargetHeatingCoolingState, CurrentHeatingCoolingState, TargetTemperature, CurrentTemperature, On } = Characteristic;
4000
+ updates.forEach((update) => {
4001
+ const { name, value } = update;
4002
+ switch (name) {
4003
+ case "authorization": {
4004
+ const service = getAccessoryService(accessory, Service.Thermostat);
4005
+ const authorization = value;
4006
+ if (authorization === "HEATING") {
4007
+ return;
4008
+ }
4009
+ if (authorization === "STOP") {
4010
+ debugSetUpdate(CurrentHeatingCoolingState, service, CurrentHeatingCoolingState.OFF);
4011
+ service.updateCharacteristic(CurrentHeatingCoolingState, CurrentHeatingCoolingState.OFF);
4012
+ debugSetUpdate(TargetHeatingCoolingState, service, TargetHeatingCoolingState.OFF);
4013
+ service.updateCharacteristic(TargetHeatingCoolingState, TargetHeatingCoolingState.OFF);
4014
+ return;
4015
+ }
4016
+ return;
4017
+ }
4018
+ case "hvacMode": {
4019
+ const service = getAccessoryService(accessory, Service.Thermostat);
4020
+ const hvacMode = value;
4021
+ if (hvacMode === "NORMAL") {
4022
+ return;
4023
+ }
4024
+ service.updateCharacteristic(TargetHeatingCoolingState, CurrentHeatingCoolingState.OFF);
4025
+ if (hvacMode === "ANTI_FROST") {
4026
+ const subtype = "hvacMode_absence";
4027
+ const service2 = accessory.getServiceById(Service.Switch, subtype);
4028
+ if (service2) {
4029
+ debugSetUpdate(On, service2, true);
4030
+ service2.updateCharacteristic(On, true);
4031
+ return;
4032
+ }
4033
+ }
4034
+ return;
4035
+ }
4036
+ case "thermicLevel": {
4037
+ const thermicLevel = value;
4038
+ if (thermicLevel === null) {
4039
+ debug(`Encountered a ${chalkString("thermicLevel")} update with a null value!`);
4040
+ return;
4041
+ }
4042
+ const service = accessory.getServiceById(Service.Switch, `thermicLevel_${thermicLevel.toLowerCase()}`);
4043
+ if (service) {
4044
+ debugSetUpdate(On, service, true);
4045
+ service.updateCharacteristic(On, true);
4046
+ return;
4047
+ }
4048
+ return;
4049
+ }
4050
+ // case 'antifrostOn': {
4051
+ // const subtype = 'antifrostOn';
4052
+ // const service = accessory.getServiceByUUIDAndSubType(Service.Switch, subtype);
4053
+ // assert(service, `Unexpected missing service "Service.Switch" with subtype="${subtype}" in accessory`);
4054
+ // const antifrostOn = value as boolean;
4055
+ // service.updateCharacteristic(Characteristic, antifrostOn);
4056
+ // return;
4057
+ // }
4058
+ case "setpoint": {
4059
+ const setpoint = value;
4060
+ if (setpoint === null) {
4061
+ debug(`Encountered a ${chalkString("setpoint")} update with a null value!`);
4062
+ return;
4063
+ }
4064
+ const service = getAccessoryService(accessory, Service.Thermostat);
4065
+ debugSetUpdate(TargetTemperature, service, setpoint);
4066
+ service.updateCharacteristic(TargetTemperature, setpoint);
4067
+ return;
4068
+ }
4069
+ case "temperature": {
4070
+ const service = getAccessoryService(accessory, Service.Thermostat);
4071
+ debugSetUpdate(CurrentTemperature, service, value);
4072
+ service.updateCharacteristic(CurrentTemperature, value);
4073
+ return;
4074
+ }
4075
+ default:
4076
+ return;
4077
+ }
4078
+ });
4079
+ };
4080
+
4081
+ // src/accessories/triggerSwitch.ts
4082
+ var TRIGGER_SWITCH_DEFAULT_DELAY = 1e3;
4083
+ var setupTriggerSwitch = (accessory, controller) => {
4084
+ const { context } = accessory;
4085
+ const { client } = controller;
4086
+ const { deviceId, endpointId, settings } = context;
4087
+ const { delay = TRIGGER_SWITCH_DEFAULT_DELAY } = settings;
4088
+ setupAccessoryInformationService(accessory, controller);
4089
+ setupAccessoryIdentifyHandler(accessory, controller);
4090
+ const service = addAccessoryService(accessory, Service.Switch, accessory.displayName, true);
4091
+ service.getCharacteristic(Characteristic.On).onSet(async (value) => {
4092
+ debugSet(Characteristic.On, service, value);
4093
+ if (!value) {
4094
+ return;
4095
+ }
4096
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
4097
+ {
4098
+ name: "levelCmd",
4099
+ value: "TOGGLE"
4100
+ }
4101
+ ]);
4102
+ debugSetResult(Characteristic.On, service, value);
4103
+ setTimeout(() => {
4104
+ service.updateCharacteristic(Characteristic.On, false);
4105
+ }, delay);
4106
+ }).updateValue(false);
4107
+ };
4108
+ var updateTriggerSwitch = (_accessory, _controller, _updates) => {
4109
+ };
4110
+
4111
+ // src/accessories/windowCovering.ts
4112
+ var import_lodash9 = require("lodash");
4113
+ var setupWindowCovering = (accessory, controller) => {
4114
+ const { context } = accessory;
4115
+ const { client } = controller;
4116
+ const { CurrentPosition, TargetPosition, PositionState, HoldPosition } = Characteristic;
4117
+ const { deviceId, endpointId, state } = context;
4118
+ setupAccessoryInformationService(accessory, controller);
4119
+ setupAccessoryIdentifyHandler(accessory, controller);
4120
+ Object.assign(state, {
4121
+ latestPosition: 100,
4122
+ pendingUpdatedValues: [],
4123
+ lastUpdatedAt: 0
4124
+ });
4125
+ const service = addAccessoryService(accessory, Service.WindowCovering, accessory.displayName, true);
4126
+ const debouncedSetPosition = (0, import_lodash9.debounce)(
4127
+ async (value) => {
4128
+ debugTydomPut("position", accessory, value);
4129
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
4130
+ {
4131
+ name: "position",
4132
+ value
4133
+ }
4134
+ ]);
4135
+ Object.assign(state, {
4136
+ pendingUpdatedValues: state.pendingUpdatedValues.concat([value])
4137
+ });
4138
+ },
4139
+ 250,
4140
+ { leading: true, trailing: true }
4141
+ );
4142
+ service.getCharacteristic(PositionState).onGet(() => {
4143
+ debugGet(PositionState, service);
4144
+ const nextValue = PositionState.STOPPED;
4145
+ debugGetResult(CurrentPosition, service, nextValue);
4146
+ return nextValue;
4147
+ });
4148
+ service.getCharacteristic(HoldPosition).onSet(async (value) => {
4149
+ debugSet(HoldPosition, service, value);
4150
+ if (!value) {
4151
+ return;
4152
+ }
4153
+ const nextValue = "STOP";
4154
+ debugTydomPut("positionCmd", accessory, nextValue);
4155
+ await client.put(`/devices/${deviceId}/endpoints/${endpointId}/data`, [
4156
+ {
4157
+ name: "positionCmd",
4158
+ value: nextValue
4159
+ }
4160
+ ]);
4161
+ debugSetResult(HoldPosition, service, value, nextValue);
4162
+ });
4163
+ service.getCharacteristic(CurrentPosition).onGet(async () => {
4164
+ debugGet(CurrentPosition, service);
4165
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
4166
+ const position = getTydomDataPropValue(data, "position") || 0;
4167
+ const nextValue = asNumber(position);
4168
+ debugGetResult(CurrentPosition, service, nextValue);
4169
+ return nextValue;
4170
+ });
4171
+ service.getCharacteristic(TargetPosition).onGet(async () => {
4172
+ debugGet(TargetPosition, service);
4173
+ const data = await getTydomDeviceData(client, { deviceId, endpointId });
4174
+ const position = getTydomDataPropValue(data, "position") || 0;
4175
+ const nextValue = asNumber(position);
4176
+ debugGetResult(CurrentPosition, service, nextValue);
4177
+ return nextValue;
4178
+ }).onSet(async (value) => {
4179
+ debugSet(TargetPosition, service, value);
4180
+ const nextValue = value;
4181
+ Object.assign(state, {
4182
+ latestPosition: nextValue,
4183
+ lastUpdatedAt: Date.now()
4184
+ });
4185
+ await debouncedSetPosition(nextValue);
4186
+ debugSetResult(TargetPosition, service, value, nextValue);
4187
+ });
4188
+ };
4189
+ var updateWindowCovering = (accessory, _controller, updates, type) => {
4190
+ const { context } = accessory;
4191
+ const { state } = context;
4192
+ const { CurrentPosition, TargetPosition, ObstructionDetected } = Characteristic;
4193
+ if (type === "cdata") {
4194
+ updates.forEach((update) => {
4195
+ const { values } = update;
4196
+ const { event } = values;
4197
+ debug(`New ${chalkKeyword("WindowCovering")} event=${chalkJson(event)}`);
4198
+ });
4199
+ return;
4200
+ }
4201
+ updates.forEach((update) => {
4202
+ const { name, value } = update;
4203
+ switch (name) {
4204
+ case "position": {
4205
+ const service = getAccessoryService(accessory, Service.WindowCovering);
4206
+ const position = asNumber(value);
4207
+ if (position === null) {
4208
+ debug(`Encountered a ${chalkString("position")} update with a null value!`);
4209
+ return;
4210
+ }
4211
+ debugSetUpdate(CurrentPosition, service, position);
4212
+ service.updateCharacteristic(CurrentPosition, position);
4213
+ if (state.pendingUpdatedValues.includes(position)) {
4214
+ debug(`Ignoring a pending ${chalkString("position")} update with value=${chalkNumber(position)} !`);
4215
+ state.pendingUpdatedValues = [];
4216
+ return;
4217
+ }
4218
+ debugSetUpdate(TargetPosition, service, position);
4219
+ service.updateCharacteristic(TargetPosition, position);
4220
+ return;
4221
+ }
4222
+ case "obstacleDefect": {
4223
+ const service = getAccessoryService(accessory, Service.WindowCovering);
4224
+ debugSetUpdate(ObstructionDetected, service, value);
4225
+ service.updateCharacteristic(ObstructionDetected, value);
4226
+ return;
4227
+ }
4228
+ default:
4229
+ return;
4230
+ }
4231
+ });
4232
+ };
4233
+
4234
+ // src/helpers/accessory.ts
4235
+ var SECURITY_SYSTEM_SENSORS = parseInt(`${import_homebridge.Categories.SECURITY_SYSTEM}0`);
4236
+ var getAccessoryService = (accessory, ServiceClass2) => {
4237
+ const service = accessory.getService(ServiceClass2);
4238
+ assert(service, `Unexpected missing service "${ServiceClass2.name}" in accessory`);
4239
+ return service;
4240
+ };
4241
+ var getAccessoryServiceWithSubtype = (accessory, ServiceClass2, subtype) => {
4242
+ const service = accessory.getServiceById(ServiceClass2, subtype);
4243
+ assert(service, `Unexpected missing service "${ServiceClass2.name}" with subtype="${subtype}" in accessory`);
4244
+ return service;
4245
+ };
4246
+ var addAccessoryService = (accessory, service, name, removeExisting = false) => {
4247
+ const existingService = accessory.getService(service);
4248
+ if (existingService) {
4249
+ if (!removeExisting) {
4250
+ return existingService;
4251
+ }
4252
+ accessory.removeService(existingService);
4253
+ }
4254
+ return accessory.addService(service, name);
4255
+ };
4256
+ var addAccessoryServiceWithSubtype = (accessory, service, name, subtype, removeExisting = false) => {
4257
+ const existingService = accessory.getServiceById(service, subtype);
4258
+ if (existingService) {
4259
+ if (!removeExisting) {
4260
+ return existingService;
4261
+ }
4262
+ accessory.removeService(existingService);
4263
+ }
4264
+ return accessory.addService(service, name, subtype);
4265
+ };
4266
+ var getTydomAccessorySetup = (accessory, context) => {
4267
+ const { category } = accessory;
4268
+ const settings = context.settings;
4269
+ if (category === SECURITY_SYSTEM_SENSORS) {
4270
+ return setupSecuritySystemSensors;
4271
+ }
4272
+ switch (category) {
4273
+ case import_homebridge.Categories.LIGHTBULB:
4274
+ return setupLightbulb;
4275
+ case import_homebridge.Categories.OUTLET:
4276
+ return setupOutlet;
4277
+ case import_homebridge.Categories.THERMOSTAT:
4278
+ return setupThermostat;
4279
+ case import_homebridge.Categories.FAN:
4280
+ return setupFan;
4281
+ case import_homebridge.Categories.GARAGE_DOOR_OPENER:
4282
+ return setupGarageDoorOpener;
4283
+ case import_homebridge.Categories.SWITCH:
4284
+ return settings.trigger ? setupTriggerSwitch : setupSwitch;
4285
+ case import_homebridge.Categories.WINDOW_COVERING:
4286
+ return setupWindowCovering;
4287
+ case import_homebridge.Categories.SECURITY_SYSTEM:
4288
+ return setupSecuritySystem;
4289
+ case import_homebridge.Categories.SENSOR:
4290
+ return settings.smokeDetector ? setupSmokeDetector : setupTemperatureSensor;
4291
+ case import_homebridge.Categories.WINDOW:
4292
+ case import_homebridge.Categories.DOOR:
4293
+ return setupContactSensor;
4294
+ default:
4295
+ throw new Error(`Unsupported accessory category=${category}`);
4296
+ }
4297
+ };
4298
+ var getTydomAccessoryDataUpdate = (accessory, context) => {
4299
+ const { category } = accessory;
4300
+ const settings = context.settings;
4301
+ if (category === SECURITY_SYSTEM_SENSORS) {
4302
+ return updateSecuritySystemSensors;
4303
+ }
4304
+ switch (category) {
4305
+ case import_homebridge.Categories.LIGHTBULB:
4306
+ return updateLightbulb;
4307
+ case import_homebridge.Categories.OUTLET:
4308
+ return updateOutlet;
4309
+ case import_homebridge.Categories.THERMOSTAT:
4310
+ return updateThermostat;
4311
+ case import_homebridge.Categories.FAN:
4312
+ return updateFan;
4313
+ case import_homebridge.Categories.GARAGE_DOOR_OPENER:
4314
+ return updateGarageDoorOpener;
4315
+ case import_homebridge.Categories.SWITCH:
4316
+ return settings.trigger ? updateTriggerSwitch : updateSwitch;
4317
+ case import_homebridge.Categories.WINDOW_COVERING:
4318
+ return updateWindowCovering;
4319
+ case import_homebridge.Categories.SECURITY_SYSTEM:
4320
+ return updateSecuritySystem;
4321
+ case import_homebridge.Categories.SENSOR:
4322
+ return settings.smokeDetector ? updateSmokeDetector : updateTemperatureSensor;
4323
+ case import_homebridge.Categories.WINDOW:
4324
+ case import_homebridge.Categories.DOOR:
4325
+ return updateContactSensor;
4326
+ default:
4327
+ throw new Error(`Unsupported accessory category=${category}`);
4328
+ }
4329
+ };
4330
+ var setupAccessoryInformationService = (accessory, _controller) => {
4331
+ const { context } = accessory;
4332
+ const {
4333
+ manufacturer = "Delta Dore",
4334
+ serialNumber = "N/A",
4335
+ model = "N/A"
4336
+ } = context;
4337
+ const informationService = accessory.getService(Service.AccessoryInformation);
4338
+ assert(informationService, `Did not found AccessoryInformation service`);
4339
+ informationService.setCharacteristic(Characteristic.Manufacturer, manufacturer).setCharacteristic(Characteristic.SerialNumber, serialNumber).setCharacteristic(Characteristic.Model, model);
4340
+ };
4341
+ var setupAccessoryIdentifyHandler = (accessory, _controller) => {
4342
+ const { displayName: name, UUID: id } = accessory;
4343
+ accessory.on(import_homebridge.AccessoryEventTypes.IDENTIFY, () => {
4344
+ debug(`New identify request for device named="${name}" with id="${id}"`);
4345
+ });
4346
+ };
4347
+
4348
+ // src/helpers/webhook.ts
4349
+ var asDiscordPayload = ({ level, message }) => {
4350
+ let prefix = "";
4351
+ switch (level) {
4352
+ case "warn":
4353
+ prefix = ":warning: ";
4354
+ break;
4355
+ default:
4356
+ prefix = ":question: ";
4357
+ break;
4358
+ }
4359
+ return {
4360
+ content: `${prefix}${message}`
4361
+ };
4362
+ };
4363
+ var triggerWebhook = async (webhook, { message, level = "info" }) => {
4364
+ const { url, type } = webhook;
4365
+ switch (type) {
4366
+ case "discord": {
4367
+ await postJson({ url, json: asDiscordPayload({ message, level }) });
4368
+ break;
4369
+ }
4370
+ default:
4371
+ break;
4372
+ }
4373
+ };
4374
+
4375
+ // src/platform.ts
4376
+ var TydomPlatform = class {
4377
+ cleanupAccessoriesIds = /* @__PURE__ */ new Set();
4378
+ accessories = /* @__PURE__ */ new Map();
4379
+ controller;
4380
+ api;
4381
+ config;
4382
+ disabled = false;
4383
+ log;
4384
+ constructor(log, config, api) {
4385
+ this.config = config;
4386
+ this.log = log;
4387
+ this.api = api;
4388
+ if (!config) {
4389
+ log.warn("Ignoring Tydom platform setup because it is not configured");
4390
+ this.disabled = true;
4391
+ return;
4392
+ }
4393
+ if (config.debug) {
4394
+ enableDebug();
4395
+ }
4396
+ this.controller = new TydomController(log, this.config);
4397
+ this.api.on("didFinishLaunching", () => setTimeout(() => this.didFinishLaunching(), 16));
4398
+ this.controller.on("device", this.handleControllerDevice.bind(this));
4399
+ this.controller.on("update", this.handleControllerDataUpdate.bind(this));
4400
+ this.controller.on("notification", this.handleControllerNotification.bind(this));
4401
+ }
4402
+ async didFinishLaunching() {
4403
+ assert(this.controller);
4404
+ this.cleanupAccessoriesIds = new Set(this.accessories.keys());
4405
+ await this.controller.connect();
4406
+ await this.controller.scan();
4407
+ this.cleanupAccessoriesIds.forEach((accessoryId) => {
4408
+ const accessory = this.accessories.get(accessoryId);
4409
+ if (!accessory) return;
4410
+ this.log.warn(`Deleting missing accessory with id=${chalkNumber(accessoryId)}`);
4411
+ this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
4412
+ });
4413
+ this.log.info(`Properly loaded ${this.accessories.size}-accessories`);
4414
+ }
4415
+ async handleControllerDevice(context) {
4416
+ const { name, deviceId, category, accessoryId } = context;
4417
+ const id = this.api.hap.uuid.generate(accessoryId);
4418
+ this.log.info(
4419
+ `Found new tydom device named=${chalkString(name)} with deviceId=${chalkNumber(deviceId)} (id=${chalkKeyword(
4420
+ id
4421
+ )})`
4422
+ );
4423
+ this.log.debug(
4424
+ `Tydom with deviceId=${chalkNumber(deviceId)} (id=${chalkKeyword(id)}) context="${JSON.stringify(context)}"`
4425
+ );
4426
+ const existingAccessory = this.accessories.get(id);
4427
+ const hasNewCategory = existingAccessory?.category !== category;
4428
+ debug(`[${deviceId}] ${existingAccessory?.category} vs ${category}`);
4429
+ this.cleanupAccessoriesIds.delete(id);
4430
+ if (existingAccessory) {
4431
+ if (!hasNewCategory) {
4432
+ await this.updateAccessory(existingAccessory, context);
4433
+ return;
4434
+ } else {
4435
+ this.log.warn(`Deleting accessory with new category with id=${chalkNumber(accessoryId)}`);
4436
+ this.api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [existingAccessory]);
4437
+ }
4438
+ }
4439
+ const accessory = await this.createAccessory(name, id, category, context);
4440
+ this.accessories.set(id, accessory);
4441
+ this.api.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [accessory]);
4442
+ }
4443
+ handleControllerDataUpdate({ type, updates, context }) {
4444
+ const id = this.api.hap.uuid.generate(context.accessoryId);
4445
+ const accessory = this.accessories.get(id);
4446
+ if (!accessory || !this.controller) return;
4447
+ const tydomAccessoryUpdate = getTydomAccessoryDataUpdate(accessory, context);
4448
+ if (tydomAccessoryUpdate) {
4449
+ void tydomAccessoryUpdate(accessory, this.controller, updates, type);
4450
+ }
4451
+ }
4452
+ handleControllerNotification({ level, message }) {
4453
+ const { webhooks = [] } = this.config;
4454
+ webhooks.forEach((webhook) => {
4455
+ void triggerWebhook(webhook, { level, message }).catch((err) => {
4456
+ if (err instanceof Error) {
4457
+ this.log.error(`${err.name} ${err.message}`);
4458
+ this.log.debug(`${err.stack}`);
4459
+ }
4460
+ });
4461
+ });
4462
+ }
4463
+ async createAccessory(name, id, category, context) {
4464
+ const { platformAccessory: PlatformAccessory } = this.api;
4465
+ const { group } = context;
4466
+ const accessoryName = category === import_homebridge.Categories.WINDOW && group ? group.name || name : name;
4467
+ this.log.info(
4468
+ `Creating accessory named=${chalkString(accessoryName)}, deviceId="${chalkNumber(
4469
+ context.deviceId
4470
+ )} (id=${chalkKeyword(id)})"`
4471
+ );
4472
+ const accessory = new PlatformAccessory(accessoryName, id, category);
4473
+ Object.assign(accessory.context, context);
4474
+ await this.updateAccessory(accessory, context);
4475
+ return accessory;
4476
+ }
4477
+ async updateAccessory(accessory, context) {
4478
+ const { displayName: accessoryName, UUID: id } = accessory;
4479
+ this.log.info(
4480
+ `Updating accessory named=${chalkString(accessoryName)}, deviceId=${chalkNumber(
4481
+ context.deviceId
4482
+ )} (id=${chalkKeyword(id)})"`
4483
+ );
4484
+ Object.assign(accessory.context, context);
4485
+ const tydomAccessorySetup = getTydomAccessorySetup(accessory, context);
4486
+ assert(this.controller);
4487
+ await tydomAccessorySetup(accessory, this.controller);
4488
+ this.api.updatePlatformAccessories([accessory]);
4489
+ }
4490
+ // Called by homebridge with existing cached accessories
4491
+ configureAccessory(accessory) {
4492
+ this.log.debug(`Found cached accessory with id="${accessory.UUID}"`);
4493
+ this.accessories.set(accessory.UUID, accessory);
4494
+ }
4495
+ };
4496
+
4497
+ // src/index.ts
4498
+ var index_default = (homebridge) => {
4499
+ defineHAPGlobals(homebridge);
4500
+ homebridge.registerPlatform(PLUGIN_NAME, PLATFORM_NAME, TydomPlatform);
4501
+ };
4502
+ //# sourceMappingURL=index.js.map