iobroker.mg-saic 0.1.2 → 0.1.3

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/README.md CHANGED
@@ -43,6 +43,10 @@ The adapter is published on npm and available from ioBroker's Latest adapter rep
43
43
  [![Donate](https://camo.githubusercontent.com/ef8c60305542390406855547e32850909812a73c4abada236de22a6dc88b313f/68747470733a2f2f7777772e70617970616c6f626a656374732e636f6d2f64655f44452f44452f692f62746e2f62746e5f646f6e61746543435f4c472e676966)](https://www.paypal.com/donate/?hosted_button_id=3RJQGSJNRSHUJ)
44
44
 
45
45
  ## Changelog
46
+ ### 0.1.3 (2026-11-08)
47
+
48
+ - (Voodoo2man) Retry startup initialization after temporary cloud login and vehicle-list outages with bounded backoff, prevent false setting writes from triggering remote setting actions, and add the missing region labels in the Admin UI.
49
+
46
50
  ### 0.1.2 (2026-11-08)
47
51
 
48
52
  - (Voodoo2man) Prevented unsafe or case-colliding API fields and vehicle IDs from creating duplicate datapoints, kept status IDs stable across field-casing changes, scheduled polling after each completed cycle while honoring queued manual refreshes, and removed an unused cloud-backend translation.
@@ -67,12 +71,6 @@ The adapter is published on npm and available from ioBroker's Latest adapter rep
67
71
  - (Voodoo2man) Removed duplicate and irrelevant datapoints.
68
72
  - (Voodoo2man) Set min version of admin to 8.2.0, js-controller 7.2.2, node.js 24
69
73
 
70
- ### 0.0.3 (2026-10-21)
71
-
72
- - (Voodoo2man) Improved release automation, updated Node.js release checks, and removed unpublished version metadata.
73
- - (Voodoo2man) Added charging data
74
- - (Voodoo2man) Fixed vehicle datapoint units and roles
75
-
76
74
  Older changelog entries are available in [CHANGELOG_OLD.md](CHANGELOG_OLD.md).
77
75
 
78
76
  ## License
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "Um mögliche Konflikte mit der mobilen App zu vermeiden, verwenden Sie nach Möglichkeit ein separates iSmart-Konto für ioBroker. Teilen Sie das Fahrzeug mit diesem Konto und erteilen Sie die für die gewünschte Nutzung erforderlichen Berechtigungen.",
7
7
  "Region": "Region",
8
8
  "European Union": "Europäische Union",
9
+ "China": "China",
10
+ "Australia": "Australien",
11
+ "Brazil": "Brasilien",
12
+ "Israel": "Israel",
13
+ "Turkey": "Türkei",
14
+ "Thailand": "Thailand",
9
15
  "Rest of World": "Rest der Welt",
10
16
  "Login type": "Anmeldetyp",
11
17
  "Email": "E-Mail",
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.",
7
7
  "Region": "Region",
8
8
  "European Union": "European Union",
9
+ "China": "China",
10
+ "Australia": "Australia",
11
+ "Brazil": "Brazil",
12
+ "Israel": "Israel",
13
+ "Turkey": "Turkey",
14
+ "Thailand": "Thailand",
9
15
  "Rest of World": "Rest of World",
10
16
  "Login type": "Login type",
11
17
  "Email": "Email",
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "Para evitar posibles interferencias de sesión con la aplicación móvil, utiliza una cuenta iSmart independiente para ioBroker siempre que sea posible. Comparte el vehículo con esa cuenta y concede los permisos necesarios para el uso previsto.",
7
7
  "Region": "Región",
8
8
  "European Union": "Unión Europea",
9
+ "China": "China",
10
+ "Australia": "Australia",
11
+ "Brazil": "Brasil",
12
+ "Israel": "Israel",
13
+ "Turkey": "Turquía",
14
+ "Thailand": "Tailandia",
9
15
  "Rest of World": "Resto del mundo",
10
16
  "Login type": "Tipo de inicio de sesión",
11
17
  "Email": "Correo electrónico",
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "Pour éviter toute interférence de session avec l'application mobile, utilisez si possible un compte iSmart distinct pour ioBroker. Partagez le véhicule avec ce compte et accordez les autorisations nécessaires à l'utilisation souhaitée.",
7
7
  "Region": "Région",
8
8
  "European Union": "Union européenne",
9
+ "China": "Chine",
10
+ "Australia": "Australie",
11
+ "Brazil": "Brésil",
12
+ "Israel": "Israël",
13
+ "Turkey": "Turquie",
14
+ "Thailand": "Thaïlande",
9
15
  "Rest of World": "Reste du monde",
10
16
  "Login type": "Type de connexion",
11
17
  "Email": "E-mail",
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "Per evitare possibili interferenze di sessione con l'app mobile, utilizza, se possibile, un account iSmart separato per ioBroker. Condividi il veicolo con quell'account e concedi le autorizzazioni necessarie per l'uso previsto.",
7
7
  "Region": "Regione",
8
8
  "European Union": "Unione europea",
9
+ "China": "Cina",
10
+ "Australia": "Australia",
11
+ "Brazil": "Brasile",
12
+ "Israel": "Israele",
13
+ "Turkey": "Turchia",
14
+ "Thailand": "Thailandia",
9
15
  "Rest of World": "Resto del mondo",
10
16
  "Login type": "Tipo di accesso",
11
17
  "Email": "E-mail",
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "Gebruik waar mogelijk een apart iSmart-account voor ioBroker om mogelijke sessieproblemen met de mobiele app te voorkomen. Deel het voertuig met dat account en verleen de benodigde rechten voor het beoogde gebruik.",
7
7
  "Region": "Regio",
8
8
  "European Union": "Europese Unie",
9
+ "China": "China",
10
+ "Australia": "Australië",
11
+ "Brazil": "Brazilië",
12
+ "Israel": "Israël",
13
+ "Turkey": "Turkije",
14
+ "Thailand": "Thailand",
9
15
  "Rest of World": "Rest van de wereld",
10
16
  "Login type": "Aanmeldtype",
11
17
  "Email": "E-mailadres",
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "Aby uniknąć możliwych konfliktów sesji z aplikacją mobilną, w miarę możliwości użyj osobnego konta iSmart dla ioBroker. Udostępnij temu kontu pojazd i nadaj uprawnienia wymagane do planowanego użycia.",
7
7
  "Region": "Region",
8
8
  "European Union": "Unia Europejska",
9
+ "China": "Chiny",
10
+ "Australia": "Australia",
11
+ "Brazil": "Brazylia",
12
+ "Israel": "Izrael",
13
+ "Turkey": "Turcja",
14
+ "Thailand": "Tajlandia",
9
15
  "Rest of World": "Reszta świata",
10
16
  "Login type": "Typ logowania",
11
17
  "Email": "E-mail",
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "Para evitar possíveis interferências de sessão com a aplicação móvel, utilize, sempre que possível, uma conta iSmart separada para o ioBroker. Partilhe o veículo com essa conta e conceda as permissões necessárias para a utilização pretendida.",
7
7
  "Region": "Região",
8
8
  "European Union": "União Europeia",
9
+ "China": "China",
10
+ "Australia": "Austrália",
11
+ "Brazil": "Brasil",
12
+ "Israel": "Israel",
13
+ "Turkey": "Turquia",
14
+ "Thailand": "Tailândia",
9
15
  "Rest of World": "Resto do mundo",
10
16
  "Login type": "Tipo de início de sessão",
11
17
  "Email": "E-mail",
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "Чтобы избежать возможных конфликтов сеанса с мобильным приложением, по возможности используйте отдельную учетную запись iSmart для ioBroker. Предоставьте этой учетной записи доступ к автомобилю и необходимые для использования разрешения.",
7
7
  "Region": "Регион",
8
8
  "European Union": "Европейский союз",
9
+ "China": "Китай",
10
+ "Australia": "Австралия",
11
+ "Brazil": "Бразилия",
12
+ "Israel": "Израиль",
13
+ "Turkey": "Турция",
14
+ "Thailand": "Таиланд",
9
15
  "Rest of World": "Остальной мир",
10
16
  "Login type": "Тип входа",
11
17
  "Email": "Электронная почта",
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "Щоб уникнути можливих конфліктів сеансів із мобільним застосунком, за можливості використовуйте окремий обліковий запис iSmart для ioBroker. Надайте йому доступ до автомобіля та необхідні для використання дозволи.",
7
7
  "Region": "Регіон",
8
8
  "European Union": "Європейський Союз",
9
+ "China": "Китай",
10
+ "Australia": "Австралія",
11
+ "Brazil": "Бразилія",
12
+ "Israel": "Ізраїль",
13
+ "Turkey": "Туреччина",
14
+ "Thailand": "Таїланд",
9
15
  "Rest of World": "Решта світу",
10
16
  "Login type": "Тип входу",
11
17
  "Email": "Електронна пошта",
@@ -6,6 +6,12 @@
6
6
  "To avoid possible session interference with the mobile app, use a separate iSmart account for ioBroker where possible. Share the vehicle with that account and grant the permissions needed for your intended use.": "为避免与手机应用的会话发生冲突,请尽可能为 ioBroker 使用单独的 iSmart 账户。将车辆共享给该账户,并授予预期用途所需的权限。",
7
7
  "Region": "地区",
8
8
  "European Union": "欧盟",
9
+ "China": "中国",
10
+ "Australia": "澳大利亚",
11
+ "Brazil": "巴西",
12
+ "Israel": "以色列",
13
+ "Turkey": "土耳其",
14
+ "Thailand": "泰国",
9
15
  "Rest of World": "其他地区",
10
16
  "Login type": "登录类型",
11
17
  "Email": "电子邮箱",
package/build/main.js CHANGED
@@ -5,6 +5,10 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
6
  var __getProtoOf = Object.getPrototypeOf;
7
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
+ };
8
12
  var __copyProps = (to, from, except, desc) => {
9
13
  if (from && typeof from === "object" || typeof from === "function") {
10
14
  for (let key of __getOwnPropNames(from))
@@ -21,6 +25,12 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
21
25
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
22
26
  mod
23
27
  ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var main_exports = {};
30
+ __export(main_exports, {
31
+ calculateInitializationRetryDelayMs: () => calculateInitializationRetryDelayMs
32
+ });
33
+ module.exports = __toCommonJS(main_exports);
24
34
  var utils = __toESM(require("@iobroker/adapter-core"));
25
35
  var import_promises = require("node:fs/promises");
26
36
  var import_node_path = require("node:path");
@@ -110,6 +120,15 @@ const settingInputsByAction = {
110
120
  };
111
121
  const EXPOSE_SOURCE_STATUS_DATAPOINTS = false;
112
122
  const PENDING_SETTING_EDITS_FILE = "pending-setting-edits.json";
123
+ const INITIALIZATION_RETRY_DELAY_MS = 6e4;
124
+ const MAX_INITIALIZATION_RETRY_DELAY_MS = 5 * INITIALIZATION_RETRY_DELAY_MS;
125
+ function calculateInitializationRetryDelayMs(retryCount) {
126
+ const attempts = Math.max(1, retryCount);
127
+ if (attempts <= 3) {
128
+ return INITIALIZATION_RETRY_DELAY_MS * attempts;
129
+ }
130
+ return MAX_INITIALIZATION_RETRY_DELAY_MS;
131
+ }
113
132
  class MgSaic extends utils.Adapter {
114
133
  constructor(options = {}) {
115
134
  super({
@@ -126,6 +145,8 @@ class MgSaic extends utils.Adapter {
126
145
  }
127
146
  pollTimer;
128
147
  pollIntervalMilliseconds;
148
+ initializationRetryCount = 0;
149
+ initializationRetryTimer;
129
150
  refreshPollQueue = new import_refresh_poll_queue.RefreshPollQueue();
130
151
  stopping = false;
131
152
  unloadCallbackCalled = false;
@@ -243,6 +264,7 @@ class MgSaic extends utils.Adapter {
243
264
  await this.setState("info.connection", false, true);
244
265
  await this.setState("info.lastError", message, true);
245
266
  this.log.warn(message);
267
+ this.scheduleInitializationRetry();
246
268
  return;
247
269
  }
248
270
  try {
@@ -263,6 +285,7 @@ class MgSaic extends utils.Adapter {
263
285
  this.log.warn(`Could not restore pending setting edits: ${details}`);
264
286
  }
265
287
  await this.setState("info.connection", true, true);
288
+ this.initializationRetryCount = 0;
266
289
  this.log.info(`SAIC account authenticated; discovered ${this.vehicles.length} vehicle(s).`);
267
290
  if (this.vehicles.length === 0) {
268
291
  await this.setState("info.lastError", "No vehicles are linked to this SAIC account", true);
@@ -281,6 +304,25 @@ class MgSaic extends utils.Adapter {
281
304
  this.log.error(`Could not initialize vehicle objects: ${details}`);
282
305
  }
283
306
  }
307
+ scheduleInitializationRetry() {
308
+ if (this.stopping) {
309
+ return;
310
+ }
311
+ this.initializationRetryCount += 1;
312
+ const retryDelayMs = calculateInitializationRetryDelayMs(this.initializationRetryCount);
313
+ if (this.initializationRetryTimer !== void 0) {
314
+ this.clearTimeout(this.initializationRetryTimer);
315
+ }
316
+ this.log.info(
317
+ `Retrying SAIC initialization in ${retryDelayMs / 1e3} seconds (${this.initializationRetryCount})`
318
+ );
319
+ this.initializationRetryTimer = this.setTimeout(() => {
320
+ this.initializationRetryTimer = void 0;
321
+ if (!this.stopping) {
322
+ void this.onReady();
323
+ }
324
+ }, retryDelayMs);
325
+ }
284
326
  async authenticate() {
285
327
  if (!this.client || !this.loginOptions || this.stopping) {
286
328
  throw new Error("Adapter is stopping or not initialized");
@@ -528,7 +570,9 @@ class MgSaic extends utils.Adapter {
528
570
  ({ vin }) => settingAction && eventId === `${this.namespace}.${vehicleCommandPath(vin, settingAction.id)}`
529
571
  );
530
572
  if (settingAction && settingVehicle) {
531
- void this.executeVehicleSetting(settingVehicle.vin, settingAction.id);
573
+ if (state.val === true) {
574
+ void this.executeVehicleSetting(settingVehicle.vin, settingAction.id);
575
+ }
532
576
  return;
533
577
  }
534
578
  const settingInput = this.vehicles.flatMap(
@@ -1375,6 +1419,10 @@ class MgSaic extends utils.Adapter {
1375
1419
  this.abortController.abort(new DOMException("Adapter is stopping", "AbortError"));
1376
1420
  this.refreshPollQueue.clearQueuedRefresh();
1377
1421
  this.pollTimer.clear();
1422
+ if (this.initializationRetryTimer !== void 0) {
1423
+ this.clearTimeout(this.initializationRetryTimer);
1424
+ this.initializationRetryTimer = void 0;
1425
+ }
1378
1426
  callback();
1379
1427
  }
1380
1428
  }
@@ -1383,4 +1431,8 @@ if (require.main !== module) {
1383
1431
  } else {
1384
1432
  (() => new MgSaic())();
1385
1433
  }
1434
+ // Annotate the CommonJS export names for ESM import in node:
1435
+ 0 && (module.exports = {
1436
+ calculateInitializationRetryDelayMs
1437
+ });
1386
1438
  //# sourceMappingURL=main.js.map
package/build/main.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/main.ts"],
4
- "sourcesContent": ["import * as utils from '@iobroker/adapter-core';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { DEFAULT_POLL_INTERVAL_SECONDS, validateConfig, type MgSaicConfig } from './config';\nimport {\n\tSaicApiClient,\n\tSaicHttpError,\n\tSaicRemoteInstructionError,\n\tclimateTemperatureToIndex,\n\tgetClimateTemperatureRange,\n\tisVehicleStatusNotOlder,\n\ttargetSocPercentToCode,\n\ttype SaicVehicleSetting,\n\ttype SaicVehicleCommand,\n\ttype SaicVehicle,\n\ttype SaicVehicleStatus,\n\ttype SaicChargingStatus,\n} from './saic-client';\nimport { resolveSaicRegion } from './regions';\nimport { isRefreshCommand, normalizeStateChangeId } from './refresh-command';\nimport { RefreshPollQueue } from './refresh-poll-queue';\nimport { RefreshPollTimer } from './refresh-poll-timer';\nimport {\n\tmigrateLegacyPendingSettingEdits,\n\tparsePendingSettingEdits,\n\tserializePendingSettingEdits,\n} from './pending-setting-edits';\nimport {\n\tgetVehicleStatusGroup,\n\tgetVehicleStatusMetadata,\n\tgetChargingSettingFeedback,\n\tresolveChargingFieldIds,\n\tcalculateRealtimePower,\n\tgetChargingFieldMetadata,\n\tgetChargingManagementFields,\n\tresolveChargingFieldName,\n\tgetChargingStatisticsFields,\n\tcalculateAvailableBatteryEnergy,\n\texcludedChargingSessionFields,\n\texcludedChargingStatisticsFields,\n\texcludedVehicleStatusFields,\n\tnormalizeChargingValue,\n\tnormalizeVehicleStatusValue,\n\tresolveOdometerValue,\n\tshouldApplySettingFeedback,\n\tshouldDeleteUnavailableStatusValue,\n\tindexVehicleStatusFieldIds,\n\tresolveVehicleStatusFieldId,\n} from './status-metadata';\nimport { getChargingFieldName, getRuntimeName } from './runtime-translations';\n\nconst chargingGroups = [\n\t{ source: 'chrgMgmtData', id: 'session', name: 'chargingManagement' },\n\t{ source: 'rvsChargeStatus', id: 'statistics', name: 'chargeStatus' },\n] as const;\n\nconst vehicleCommands: Array<{ id: SaicVehicleCommand }> = [\n\t{ id: 'lock' },\n\t{ id: 'unlock' },\n\t{ id: 'openBoot' },\n\t{ id: 'climateStart' },\n\t{ id: 'climateStop' },\n\t{ id: 'frontDefrost' },\n\t{ id: 'rearWindowHeatStart' },\n\t{ id: 'rearWindowHeatStop' },\n\t{ id: 'batteryHeatStart' },\n\t{ id: 'batteryHeatStop' },\n\t{ id: 'chargingStart' },\n\t{ id: 'chargingStop' },\n\t{ id: 'chargingPortLock' },\n\t{ id: 'chargingPortUnlock' },\n\t{ id: 'findMyCar' },\n];\n\nconst commandGroups: Partial<Record<SaicVehicleCommand, string>> = {\n\tlock: 'access',\n\tunlock: 'access',\n\topenBoot: 'access',\n\tclimateStart: 'climate',\n\tclimateStop: 'climate',\n\tfrontDefrost: 'climate',\n\trearWindowHeatStart: 'heating',\n\trearWindowHeatStop: 'heating',\n\tbatteryHeatStart: 'heating',\n\tbatteryHeatStop: 'heating',\n\tchargingStart: 'charging',\n\tchargingStop: 'charging',\n\tchargingPortLock: 'charging',\n\tchargingPortUnlock: 'charging',\n\tfindMyCar: 'vehicle',\n};\n\nconst settingGroups: Record<string, string> = {\n\tdriverSeatHeatLevel: 'heating',\n\tpassengerSeatHeatLevel: 'heating',\n\tclimateTemperature: 'climate',\n\tchargeTargetSoc: 'charging',\n\tchargingCurrentLimit: 'charging',\n\tchargingScheduleStart: 'charging',\n\tchargingScheduleEnd: 'charging',\n\tchargingScheduleMode: 'charging',\n\tbatteryHeatingScheduleEnabled: 'schedules',\n\tbatteryHeatingScheduleStart: 'schedules',\n};\n\nconst actionGroups: Record<SettingAction, string> = {\n\tclimateTemperatureApply: 'climate',\n\tchargingSettingsApply: 'charging',\n\tchargingScheduleApply: 'charging',\n\tbatteryHeatingScheduleApply: 'schedules',\n};\n\nfunction vehicleCommandPath(vin: string, id: string): string {\n\tconst group =\n\t\tid in commandGroups\n\t\t\t? commandGroups[id as SaicVehicleCommand]\n\t\t\t: id in settingGroups\n\t\t\t\t? settingGroups[id]\n\t\t\t\t: actionGroups[id as SettingAction];\n\tif (!group) {\n\t\tthrow new Error(`Missing command group for ${id}`);\n\t}\n\treturn `vehicles.${vin}.commands.${group}.${id}`;\n}\n\nconst settingActions = [\n\t{ id: 'climateTemperatureApply' },\n\t{ id: 'chargingSettingsApply' },\n\t{ id: 'chargingScheduleApply' },\n\t{ id: 'batteryHeatingScheduleApply' },\n] as const;\n\ntype SettingAction = (typeof settingActions)[number]['id'];\n\nconst settingInputsByAction: Record<SettingAction, string[]> = {\n\tclimateTemperatureApply: ['climateTemperature'],\n\tchargingSettingsApply: ['chargeTargetSoc', 'chargingCurrentLimit'],\n\tchargingScheduleApply: ['chargingScheduleStart', 'chargingScheduleEnd', 'chargingScheduleMode'],\n\tbatteryHeatingScheduleApply: ['batteryHeatingScheduleEnabled', 'batteryHeatingScheduleStart'],\n};\n\nconst EXPOSE_SOURCE_STATUS_DATAPOINTS = false;\nconst PENDING_SETTING_EDITS_FILE = 'pending-setting-edits.json';\n\nclass MgSaic extends utils.Adapter {\n\tpublic constructor(options: Partial<utils.AdapterOptions> = {}) {\n\t\tsuper({\n\t\t\t...options,\n\t\t\tname: 'mg-saic',\n\t\t});\n\t\tthis.pollTimer = new RefreshPollTimer(\n\t\t\t(callback, milliseconds) => this.setTimeout(callback, milliseconds),\n\t\t\ttimer => this.clearTimeout(timer),\n\t\t);\n\t\tthis.on('ready', this.onReady.bind(this));\n\t\tthis.on('stateChange', this.onStateChange.bind(this));\n\t\tthis.on('unload', this.onUnload.bind(this));\n\t}\n\n\tprivate readonly pollTimer: RefreshPollTimer<ioBroker.Timeout>;\n\tprivate pollIntervalMilliseconds?: number;\n\tprivate readonly refreshPollQueue = new RefreshPollQueue();\n\tprivate stopping = false;\n\tprivate unloadCallbackCalled = false;\n\tprivate readonly abortController = new AbortController();\n\tprivate client?: SaicApiClient;\n\tprivate loginOptions?: {\n\t\tbaseUrl: string;\n\t\tregionCode: string;\n\t\ttenantId: string;\n\t\taccountType: 'email' | 'phone';\n\t\taccountIdentifier: string;\n\t\tphoneCountryCode?: string;\n\t\tpassword: string;\n\t};\n\tprivate accessToken?: string;\n\tprivate accessTokenExpiresAt = 0;\n\tprivate vehicles: SaicVehicle[] = [];\n\tprivate readonly vehicleStatusFieldIds = new Map<string, Map<string, string>>();\n\tprivate readonly lastStatusTimes = new Map<string, number>();\n\tprivate readonly lastCanonicalStatusTimes = new Map<string, number>();\n\tprivate readonly vehicleCommandsInProgress = new Set<string>();\n\tprivate readonly pendingSettingEdits = new Map<string, number>();\n\tprivate pendingSettingEditsWrite: Promise<void> = Promise.resolve();\n\tprivate settingEditSequence = 0;\n\n\tprivate async onReady(): Promise<void> {\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tconst config = this.config as unknown as MgSaicConfig;\n\t\tawait this.extendObjectAsync('info', { common: { name: getRuntimeName('info') } });\n\t\tawait this.extendObjectAsync('info.backend', { common: { name: getRuntimeName('backend') } });\n\t\tawait this.extendObjectAsync('info.connection', { common: { name: getRuntimeName('connection') } });\n\t\tawait this.extendObjectAsync('info.lastError', { common: { name: getRuntimeName('lastError') } });\n\t\ttry {\n\t\t\tawait this.migrateLegacyPendingSettingEdits();\n\t\t} catch (error) {\n\t\t\tconst details = error instanceof Error ? error.message : 'Unknown storage error';\n\t\t\tthis.log.warn(`Could not migrate pending setting edits: ${details}`);\n\t\t}\n\t\tawait this.setObjectNotExistsAsync('commands', {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: getRuntimeName('commands') },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.setObjectAsync('vehicles', {\n\t\t\ttype: 'folder',\n\t\t\tcommon: { name: 'Vehicles' },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.setObjectNotExistsAsync('commands.refresh', {\n\t\t\ttype: 'state',\n\t\t\tcommon: {\n\t\t\t\tname: getRuntimeName('refresh'),\n\t\t\t\ttype: 'boolean',\n\t\t\t\trole: 'button',\n\t\t\t\tread: false,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.extendObjectAsync('commands.refresh', { common: { name: getRuntimeName('refresh') } });\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.setStateAsync('commands.refresh', { val: false, ack: true });\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tthis.subscribeStates('commands.refresh');\n\t\tawait this.setState('info.connection', false, true);\n\t\tawait this.setState('info.backend', config.region?.trim() || 'not configured', true);\n\t\tconst errors = validateConfig(config);\n\t\tawait this.setState('info.lastError', errors.join('; '), true);\n\t\tif (errors.length) {\n\t\t\tthis.log.warn(`Configuration is incomplete: ${errors.join('; ')}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst region = resolveSaicRegion(config.region ?? '');\n\t\tif (!region) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.client = new SaicApiClient(\n\t\t\t\tundefined,\n\t\t\t\tDate.now,\n\t\t\t\tundefined,\n\t\t\t\tmessage => this.log.debug(message),\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\tsetTimeout: (callback, milliseconds) => {\n\t\t\t\t\t\tconst timer = this.setTimeout(callback, milliseconds);\n\t\t\t\t\t\treturn () => {\n\t\t\t\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\t\t\t\tthis.clearTimeout(timer);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tthis.loginOptions = {\n\t\t\t\t...region,\n\t\t\t\taccountType: config.accountType as 'email' | 'phone',\n\t\t\t\taccountIdentifier: config.accountIdentifier ?? '',\n\t\t\t\tphoneCountryCode: config.phoneCountryCode,\n\t\t\t\tpassword: config.password ?? '',\n\t\t\t};\n\t\t\tawait this.authenticate();\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.vehicles = await this.client.listVehicles(\n\t\t\t\tthis.loginOptions,\n\t\t\t\tthis.accessToken!,\n\t\t\t\tthis.abortController.signal,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst details = error instanceof Error ? error.message : 'Unknown initialization error';\n\t\t\tconst message = `SAIC initialization failed: ${details}`;\n\t\t\tawait this.setState('info.connection', false, true);\n\t\t\tawait this.setState('info.lastError', message, true);\n\t\t\tthis.log.warn(message);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tfor (const vehicle of this.vehicles) {\n\t\t\t\tif (this.stopping) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait this.createVehicleObjects(vehicle);\n\t\t\t\tif (!EXPOSE_SOURCE_STATUS_DATAPOINTS) {\n\t\t\t\t\tawait this.delObjectAsync(`vehicles.${vehicle.vin}.cachedStatus`, { recursive: true });\n\t\t\t\t}\n\t\t\t\tawait this.delObjectAsync(`vehicles.${vehicle.vin}.canonicalStatus`, { recursive: true });\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.restorePendingSettingEdits();\n\t\t\t} catch (error) {\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown storage error';\n\t\t\t\tthis.log.warn(`Could not restore pending setting edits: ${details}`);\n\t\t\t}\n\t\t\tawait this.setState('info.connection', true, true);\n\t\t\tthis.log.info(`SAIC account authenticated; discovered ${this.vehicles.length} vehicle(s).`);\n\t\t\tif (this.vehicles.length === 0) {\n\t\t\t\tawait this.setState('info.lastError', 'No vehicles are linked to this SAIC account', true);\n\t\t\t\tthis.log.warn('No vehicles are linked to this SAIC account.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst intervalSeconds = config.pollIntervalSeconds ?? DEFAULT_POLL_INTERVAL_SECONDS;\n\t\t\tthis.pollIntervalMilliseconds = intervalSeconds * 1000;\n\t\t\tawait this.refreshVehicleStatuses();\n\t\t} catch (error) {\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst details = error instanceof Error ? error.message : 'Unknown local adapter error';\n\t\t\tawait this.setState('info.lastError', `Could not initialize vehicle objects: ${details}`, true);\n\t\t\tthis.log.error(`Could not initialize vehicle objects: ${details}`);\n\t\t}\n\t}\n\n\tprivate async authenticate(): Promise<void> {\n\t\tif (!this.client || !this.loginOptions || this.stopping) {\n\t\t\tthrow new Error('Adapter is stopping or not initialized');\n\t\t}\n\t\tconst login = await this.client.login(this.loginOptions, this.abortController.signal);\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tthis.accessToken = login.accessToken;\n\t\tthis.accessTokenExpiresAt = Date.now() + login.expiresIn * 1000;\n\t\tawait this.setState('info.connection', true, true);\n\t}\n\n\tprivate triggerRefresh(): void {\n\t\tthis.pollTimer.clear();\n\t\tvoid this.refreshVehicleStatuses().catch(error => {\n\t\t\tconst details = error instanceof Error ? error.message : 'Unknown refresh error';\n\t\t\tthis.log.error(`Vehicle status refresh failed: ${details}`);\n\t\t});\n\t}\n\n\tprivate scheduleNextPoll(): void {\n\t\tif (this.stopping || this.pollIntervalMilliseconds === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis.pollTimer.schedule(() => this.triggerRefresh(), this.pollIntervalMilliseconds);\n\t}\n\n\tprivate async refreshVehicleStatuses(): Promise<void> {\n\t\tif (this.stopping || !this.client || !this.loginOptions || !this.accessToken) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this.refreshPollQueue.request()) {\n\t\t\treturn;\n\t\t}\n\t\tconst statusErrors: string[] = [];\n\t\tlet followUpUsed = false;\n\t\ttry {\n\t\t\tdo {\n\t\t\t\tthis.refreshPollQueue.clearQueuedRefresh();\n\t\t\t\tfor (const vehicle of this.vehicles) {\n\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (Date.now() >= this.accessTokenExpiresAt - 60_000) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.authenticate();\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown authentication error';\n\t\t\t\t\t\t\tstatusErrors.push(`SAIC re-authentication failed: ${details}`);\n\t\t\t\t\t\t\tawait this.setState('info.connection', false, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst charging = await this.client.getVehicleChargingStatus(\n\t\t\t\t\t\t\tthis.loginOptions,\n\t\t\t\t\t\t\tthis.accessToken,\n\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait this.createVehicleChargingObjects(vehicle.vin, charging, vehicle.series);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown charging data error';\n\t\t\t\t\t\tstatusErrors.push(`Charging data request failed for ${vehicle.vin}: ${details}`);\n\t\t\t\t\t\tthis.log.warn(`Could not retrieve charging data for vehicle ${vehicle.vin}: ${details}`);\n\t\t\t\t\t}\n\t\t\t\t\tlet status: SaicVehicleStatus;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.log.debug(`Refreshing live status for ${vehicle.vin}`);\n\t\t\t\t\t\tstatus = await this.client.getVehicleStatus(\n\t\t\t\t\t\t\tthis.loginOptions,\n\t\t\t\t\t\t\tthis.accessToken,\n\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (error instanceof SaicHttpError && (error.status === 401 || error.status === 403)) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait this.authenticate();\n\t\t\t\t\t\t\t\tstatus = await this.client.getVehicleStatus(\n\t\t\t\t\t\t\t\t\tthis.loginOptions,\n\t\t\t\t\t\t\t\t\tthis.accessToken,\n\t\t\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} catch (reauthError) {\n\t\t\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst details =\n\t\t\t\t\t\t\t\t\treauthError instanceof Error ? reauthError.message : 'Unknown authentication error';\n\t\t\t\t\t\t\t\tstatusErrors.push(`SAIC re-authentication failed for ${vehicle.vin}: ${details}`);\n\t\t\t\t\t\t\t\tawait this.setState('info.connection', false, true);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown error';\n\t\t\t\t\t\t\tconst diagnostic =\n\t\t\t\t\t\t\t\terror instanceof SaicRemoteInstructionError\n\t\t\t\t\t\t\t\t\t? `SAIC/MG returned remote instruction code 4 for ${vehicle.vin}; this is a response from the MG/SAIC service or vehicle, not an adapter parsing/processing error. Diagnostic: ${details}`\n\t\t\t\t\t\t\t\t\t: details;\n\t\t\t\t\t\t\tstatusErrors.push(`Vehicle status request failed for ${vehicle.vin}: ${diagnostic}`);\n\t\t\t\t\t\t\tthis.log.warn(\n\t\t\t\t\t\t\t\t`Could not retrieve current status for vehicle ${vehicle.vin}: ${diagnostic}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tlet cachedStatus: SaicVehicleStatus;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tthis.log.debug(`Refreshing cached status as fallback for ${vehicle.vin}`);\n\t\t\t\t\t\t\t\tcachedStatus = await this.client.getCachedVehicleStatus(\n\t\t\t\t\t\t\t\t\tthis.loginOptions,\n\t\t\t\t\t\t\t\t\tthis.accessToken,\n\t\t\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} catch (cacheError) {\n\t\t\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst cacheDetails = cacheError instanceof Error ? cacheError.message : 'Unknown error';\n\t\t\t\t\t\t\t\tstatusErrors.push(\n\t\t\t\t\t\t\t\t\t`Cached vehicle status request failed for ${vehicle.vin}: ${cacheDetails}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tthis.log.warn(\n\t\t\t\t\t\t\t\t\t`Could not retrieve cached status for vehicle ${vehicle.vin}: ${cacheDetails}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif (EXPOSE_SOURCE_STATUS_DATAPOINTS) {\n\t\t\t\t\t\t\t\t\tawait this.createVehicleStatusObjects(\n\t\t\t\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\t\t\t\tcachedStatus,\n\t\t\t\t\t\t\t\t\t\t'cachedStatus',\n\t\t\t\t\t\t\t\t\t\t'cachedStatus',\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tawait this.createCanonicalVehicleStatusObjects(vehicle.vin, cachedStatus, 'cached');\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tconst writeDetails =\n\t\t\t\t\t\t\t\t\terror instanceof Error ? error.message : 'Unknown state write error';\n\t\t\t\t\t\t\t\tstatusErrors.push(`Could not write cached status for ${vehicle.vin}: ${writeDetails}`);\n\t\t\t\t\t\t\t\tthis.log.error(`Could not write cached status for ${vehicle.vin}: ${writeDetails}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (!isVehicleStatusNotOlder(status.statusTime, this.lastStatusTimes.get(vehicle.vin))) {\n\t\t\t\t\t\tstatusErrors.push(`Ignored older live status for ${vehicle.vin}`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (status.basicVehicleStatus.mileage === undefined) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst cachedStatus = await this.client.getCachedVehicleStatus(\n\t\t\t\t\t\t\t\tthis.loginOptions,\n\t\t\t\t\t\t\t\tthis.accessToken,\n\t\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst cachedMileage = cachedStatus.basicVehicleStatus.mileage;\n\t\t\t\t\t\t\tconst mileage = resolveOdometerValue(undefined, cachedMileage);\n\t\t\t\t\t\t\tif (mileage !== undefined) {\n\t\t\t\t\t\t\t\tstatus = {\n\t\t\t\t\t\t\t\t\t...status,\n\t\t\t\t\t\t\t\t\tbasicVehicleStatus: { ...status.basicVehicleStatus, mileage },\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tthis.log.debug(\n\t\t\t\t\t\t\t\t\t`Used cached odometer for ${vehicle.vin} because live status omitted mileage`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (cacheError) {\n\t\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst details = cacheError instanceof Error ? cacheError.message : 'Unknown cache error';\n\t\t\t\t\t\t\tthis.log.debug(`Could not retrieve cached odometer for ${vehicle.vin}: ${details}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.log.debug(\n\t\t\t\t\t\t\t`Received live status for ${vehicle.vin}: ${Object.keys(status.basicVehicleStatus).length} basic fields, statusTime ${status.statusTime ?? 'missing'}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (EXPOSE_SOURCE_STATUS_DATAPOINTS) {\n\t\t\t\t\t\t\tawait this.createVehicleStatusObjects(vehicle.vin, status, 'liveStatus', 'liveStatus');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait this.createCanonicalVehicleStatusObjects(vehicle.vin, status, 'live');\n\t\t\t\t\t\tif (!this.stopping && status.statusTime !== undefined) {\n\t\t\t\t\t\t\tthis.lastStatusTimes.set(vehicle.vin, status.statusTime);\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tisVehicleStatusNotOlder(\n\t\t\t\t\t\t\t\t\tstatus.statusTime,\n\t\t\t\t\t\t\t\t\tthis.lastCanonicalStatusTimes.get(vehicle.vin),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthis.lastCanonicalStatusTimes.set(vehicle.vin, status.statusTime);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.log.debug(`Created/updated live status objects for ${vehicle.vin}`);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown state write error';\n\t\t\t\t\t\tstatusErrors.push(`Could not write live status for ${vehicle.vin}: ${details}`);\n\t\t\t\t\t\tthis.log.error(`Could not write live status for ${vehicle.vin}: ${details}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this.refreshPollQueue.hasQueuedRefresh && followUpUsed) {\n\t\t\t\t\tthis.refreshPollQueue.clearQueuedRefresh();\n\t\t\t\t} else if (this.refreshPollQueue.hasQueuedRefresh) {\n\t\t\t\t\tfollowUpUsed = true;\n\t\t\t\t}\n\t\t\t} while (this.refreshPollQueue.hasQueuedRefresh && !this.stopping);\n\t\t\tif (!this.stopping) {\n\t\t\t\tawait this.setState('info.lastError', statusErrors.join('; '), true);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.refreshPollQueue.finish(\n\t\t\t\tthis.stopping,\n\t\t\t\t() => this.triggerRefresh(),\n\t\t\t\t() => this.scheduleNextPoll(),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate onStateChange(id: string, state: ioBroker.State | null | undefined): void {\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tconst eventId = normalizeStateChangeId(id, this.namespace);\n\t\tif (isRefreshCommand(id, this.namespace, state)) {\n\t\t\tvoid this.setStateAsync('commands.refresh', { val: false, ack: true }).catch(error => {\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown state error';\n\t\t\t\tthis.log.error(`Could not acknowledge refresh command: ${details}`);\n\t\t\t});\n\t\t\tthis.triggerRefresh();\n\t\t\treturn;\n\t\t}\n\t\tif (!state || state.ack) {\n\t\t\treturn;\n\t\t}\n\t\tconst settingAction = settingActions.find(({ id: actionId }) =>\n\t\t\tthis.vehicles.some(({ vin }) => eventId === `${this.namespace}.${vehicleCommandPath(vin, actionId)}`),\n\t\t);\n\t\tconst settingVehicle = this.vehicles.find(\n\t\t\t({ vin }) => settingAction && eventId === `${this.namespace}.${vehicleCommandPath(vin, settingAction.id)}`,\n\t\t);\n\t\tif (settingAction && settingVehicle) {\n\t\t\tvoid this.executeVehicleSetting(settingVehicle.vin, settingAction.id);\n\t\t\treturn;\n\t\t}\n\t\tconst settingInput = this.vehicles\n\t\t\t.flatMap(({ vin }) =>\n\t\t\t\tObject.keys(settingGroups)\n\t\t\t\t\t.filter(stateId => stateId !== 'driverSeatHeatLevel' && stateId !== 'passengerSeatHeatLevel')\n\t\t\t\t\t.map(stateId => ({ vin, stateId })),\n\t\t\t)\n\t\t\t.find(({ vin, stateId }) => eventId === `${this.namespace}.${vehicleCommandPath(vin, stateId)}`);\n\t\tif (settingInput) {\n\t\t\tconst stateId = vehicleCommandPath(settingInput.vin, settingInput.stateId);\n\t\t\tthis.pendingSettingEdits.set(stateId, ++this.settingEditSequence);\n\t\t\tvoid this.acknowledgeSettingEdit(stateId, state.val);\n\t\t\treturn;\n\t\t}\n\t\tconst seatHeating = this.vehicles\n\t\t\t.flatMap(({ vin }) =>\n\t\t\t\t(['driverSeatHeatLevel', 'passengerSeatHeatLevel'] as const).map(stateId => ({ vin, stateId })),\n\t\t\t)\n\t\t\t.find(({ vin, stateId }) => eventId === `${this.namespace}.${vehicleCommandPath(vin, stateId)}`);\n\t\tif (seatHeating) {\n\t\t\tconst seat = seatHeating.stateId === 'driverSeatHeatLevel' ? 'driver' : 'passenger';\n\t\t\tvoid this.executeSeatHeating(seatHeating.vin, seat, state.val);\n\t\t\treturn;\n\t\t}\n\t\tif (state.val !== true) {\n\t\t\treturn;\n\t\t}\n\t\tconst commandEntry = vehicleCommands.find(({ id: commandId }) =>\n\t\t\tthis.vehicles.some(({ vin }) => eventId === `${this.namespace}.${vehicleCommandPath(vin, commandId)}`),\n\t\t);\n\t\tconst vehicle = this.vehicles.find(\n\t\t\t({ vin }) => commandEntry && eventId === `${this.namespace}.${vehicleCommandPath(vin, commandEntry.id)}`,\n\t\t);\n\t\tif (!commandEntry || !vehicle) {\n\t\t\treturn;\n\t\t}\n\t\tvoid this.executeVehicleCommand(vehicle.vin, commandEntry.id);\n\t}\n\n\tprivate async acknowledgeSettingEdit(stateId: string, value: ioBroker.StateValue): Promise<void> {\n\t\ttry {\n\t\t\tawait this.persistPendingSettingEdits();\n\t\t\tawait this.setStateAsync(stateId, { val: value, ack: true });\n\t\t} catch (error) {\n\t\t\tconst details = error instanceof Error ? error.message : 'Unknown state error';\n\t\t\tthis.log.error(`Could not persist pending setting ${stateId}: ${details}`);\n\t\t}\n\t}\n\n\tprivate async persistPendingSettingEdits(): Promise<void> {\n\t\tconst write = this.pendingSettingEditsWrite\n\t\t\t.catch(() => undefined)\n\t\t\t.then(async () => {\n\t\t\t\tawait this.writePendingSettingEditsFile(serializePendingSettingEdits(this.pendingSettingEdits.keys()));\n\t\t\t});\n\t\tthis.pendingSettingEditsWrite = write;\n\t\tawait write;\n\t}\n\n\tprivate async migrateLegacyPendingSettingEdits(): Promise<void> {\n\t\tconst legacyObject = await this.getObjectAsync('internal.pendingSettingEdits');\n\t\tif (legacyObject) {\n\t\t\tconst legacyState = await this.getStateAsync('internal.pendingSettingEdits');\n\t\t\tconst savedFileValue = await this.readPendingSettingEditsFile();\n\t\t\tawait migrateLegacyPendingSettingEdits(\n\t\t\t\tsavedFileValue,\n\t\t\t\t{ exists: true, value: legacyState?.val },\n\t\t\t\tserialized => this.writePendingSettingEditsFile(serialized),\n\t\t\t\t() => this.delObjectAsync('internal.pendingSettingEdits'),\n\t\t\t);\n\t\t}\n\n\t\tconst internalObject = await this.getObjectAsync('internal');\n\t\tif (!internalObject) {\n\t\t\treturn;\n\t\t}\n\t\tconst children = await this.getObjectListAsync({\n\t\t\tstartkey: `${this.namespace}.internal.`,\n\t\t\tendkey: `${this.namespace}.internal.\\u9999`,\n\t\t});\n\t\tif (children.rows.length === 0) {\n\t\t\tawait this.delObjectAsync('internal');\n\t\t}\n\t}\n\n\tprivate async readPendingSettingEditsFile(): Promise<string | undefined> {\n\t\ttry {\n\t\t\treturn await readFile(this.getPendingSettingEditsFilePath(), 'utf8');\n\t\t} catch (error) {\n\t\t\tif (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate async writePendingSettingEditsFile(serialized: string): Promise<void> {\n\t\tconst directory = utils.getAbsoluteInstanceDataDir(this);\n\t\tawait mkdir(directory, { recursive: true });\n\t\tawait writeFile(this.getPendingSettingEditsFilePath(), serialized, 'utf8');\n\t}\n\n\tprivate getPendingSettingEditsFilePath(): string {\n\t\treturn join(utils.getAbsoluteInstanceDataDir(this), PENDING_SETTING_EDITS_FILE);\n\t}\n\n\tprivate async restorePendingSettingEdits(): Promise<void> {\n\t\tconst validStateIds = new Set(\n\t\t\tthis.vehicles.flatMap(({ vin }) =>\n\t\t\t\tObject.keys(settingGroups)\n\t\t\t\t\t.filter(stateId => stateId !== 'driverSeatHeatLevel' && stateId !== 'passengerSeatHeatLevel')\n\t\t\t\t\t.map(stateId => vehicleCommandPath(vin, stateId)),\n\t\t\t),\n\t\t);\n\t\tconst savedFileValue = await this.readPendingSettingEditsFile();\n\t\tfor (const stateId of parsePendingSettingEdits(savedFileValue, validStateIds)) {\n\t\t\tthis.pendingSettingEdits.set(stateId, ++this.settingEditSequence);\n\t\t}\n\t\tfor (const stateId of validStateIds) {\n\t\t\tconst currentState = await this.getStateAsync(stateId);\n\t\t\tif (currentState && !currentState.ack && !this.pendingSettingEdits.has(stateId)) {\n\t\t\t\tthis.pendingSettingEdits.set(stateId, ++this.settingEditSequence);\n\t\t\t}\n\t\t}\n\t\tawait this.persistPendingSettingEdits();\n\t}\n\n\tprivate async executeSeatHeating(\n\t\tvin: string,\n\t\tseat: 'driver' | 'passenger',\n\t\tvalue: ioBroker.StateValue,\n\t): Promise<void> {\n\t\tconst stateId = vehicleCommandPath(vin, `${seat}SeatHeatLevel`);\n\t\tif (typeof value !== 'number' || !Number.isInteger(value) || value < 0 || value > 3) {\n\t\t\tawait this.setStateAsync(stateId, { ack: true });\n\t\t\tthis.log.warn(`Ignored ${seat} seat heating level for ${vin}: expected an integer from 0 to 3`);\n\t\t\treturn;\n\t\t}\n\t\tif (this.vehicleCommandsInProgress.has(vin)) {\n\t\t\tawait this.setStateAsync(stateId, { ack: true });\n\t\t\tthis.log.warn(`Ignored ${seat} seat heating for ${vin}: another vehicle command is still running`);\n\t\t\treturn;\n\t\t}\n\t\tthis.vehicleCommandsInProgress.add(vin);\n\t\ttry {\n\t\t\tif (!this.client || !this.loginOptions) {\n\t\t\t\tthrow new Error('SAIC client is not initialized');\n\t\t\t}\n\t\t\tif (!this.accessToken || this.accessTokenExpiresAt <= Date.now() + 30_000) {\n\t\t\t\tawait this.authenticate();\n\t\t\t}\n\t\t\tawait this.client.sendVehicleSeatHeating(\n\t\t\t\tthis.loginOptions,\n\t\t\t\tthis.accessToken!,\n\t\t\t\tvin,\n\t\t\t\tseat,\n\t\t\t\tvalue,\n\t\t\t\tthis.abortController.signal,\n\t\t\t);\n\t\t\tawait this.setStateAsync(stateId, { val: value, ack: true });\n\t\t\tthis.log.info(`SAIC ${seat} seat heating level ${value} completed for ${vin}`);\n\t\t} catch (error) {\n\t\t\tif (!this.stopping) {\n\t\t\t\tawait this.setStateAsync(stateId, { val: value, ack: true });\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown command error';\n\t\t\t\tthis.log.warn(`SAIC ${seat} seat heating failed for ${vin}: ${details}`);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.vehicleCommandsInProgress.delete(vin);\n\t\t}\n\t}\n\n\tprivate async executeVehicleSetting(vin: string, action: SettingAction): Promise<void> {\n\t\tconst stateId = vehicleCommandPath(vin, action);\n\t\tconst editVersions = new Map(\n\t\t\tsettingInputsByAction[action]\n\t\t\t\t.map(settingId => vehicleCommandPath(vin, settingId))\n\t\t\t\t.filter(settingId => this.pendingSettingEdits.has(settingId))\n\t\t\t\t.map(settingId => [settingId, this.pendingSettingEdits.get(settingId)!]),\n\t\t);\n\t\tif (this.vehicleCommandsInProgress.has(vin)) {\n\t\t\tawait this.setStateAsync(stateId, { val: false, ack: true });\n\t\t\tthis.log.warn(`Ignored ${action} for ${vin}: another vehicle command is still running`);\n\t\t\treturn;\n\t\t}\n\t\tthis.vehicleCommandsInProgress.add(vin);\n\t\ttry {\n\t\t\tawait this.setStateAsync(stateId, { val: false, ack: true });\n\t\t\tif (!this.client || !this.loginOptions) {\n\t\t\t\tthrow new Error('SAIC client is not initialized');\n\t\t\t}\n\t\t\tconst setting = await this.readVehicleSetting(vin, action);\n\t\t\tif (!this.accessToken || this.accessTokenExpiresAt <= Date.now() + 30_000) {\n\t\t\t\tawait this.authenticate();\n\t\t\t}\n\t\t\tawait this.client.sendVehicleSetting(\n\t\t\t\tthis.loginOptions,\n\t\t\t\tthis.accessToken!,\n\t\t\t\tvin,\n\t\t\t\tsetting,\n\t\t\t\tthis.abortController.signal,\n\t\t\t);\n\t\t\tconst clearedEdits: Array<[string, number]> = [];\n\t\t\tfor (const [settingId, version] of editVersions) {\n\t\t\t\tif (this.pendingSettingEdits.get(settingId) === version) {\n\t\t\t\t\tthis.pendingSettingEdits.delete(settingId);\n\t\t\t\t\tclearedEdits.push([settingId, version]);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.persistPendingSettingEdits();\n\t\t\t} catch (error) {\n\t\t\t\tfor (const [settingId, version] of clearedEdits) {\n\t\t\t\t\tif (!this.pendingSettingEdits.has(settingId)) {\n\t\t\t\t\t\tthis.pendingSettingEdits.set(settingId, version);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown state error';\n\t\t\t\tthis.log.warn(\n\t\t\t\t\t`SAIC ${action} completed for ${vin}, but pending edits could not be persisted: ${details}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.log.info(`SAIC ${action} completed for ${vin}`);\n\t\t} catch (error) {\n\t\t\tif (!this.stopping) {\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown settings error';\n\t\t\t\tthis.log.warn(`SAIC ${action} failed for ${vin}: ${details}`);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.vehicleCommandsInProgress.delete(vin);\n\t\t}\n\t}\n\n\tprivate async readVehicleSetting(vin: string, action: SettingAction): Promise<SaicVehicleSetting> {\n\t\tconst readNumber = async (id: string): Promise<number> => {\n\t\t\tconst state = await this.getStateAsync(vehicleCommandPath(vin, id));\n\t\t\tif (!state || typeof state.val !== 'number' || !Number.isFinite(state.val)) {\n\t\t\t\tthrow new Error(`Setting ${id} must contain a finite number`);\n\t\t\t}\n\t\t\treturn state.val;\n\t\t};\n\t\tconst readString = async (id: string): Promise<string> => {\n\t\t\tconst state = await this.getStateAsync(vehicleCommandPath(vin, id));\n\t\t\tif (!state || typeof state.val !== 'string') {\n\t\t\t\tthrow new Error(`Setting ${id} must contain a time in HH:MM format`);\n\t\t\t}\n\t\t\treturn state.val;\n\t\t};\n\t\tif (action === 'climateTemperatureApply') {\n\t\t\tconst vehicle = this.vehicles.find(item => item.vin === vin);\n\t\t\treturn {\n\t\t\t\ttype: 'climateTemperature',\n\t\t\t\tvalue: climateTemperatureToIndex(await readNumber('climateTemperature'), vehicle?.series),\n\t\t\t};\n\t\t}\n\t\tif (action === 'chargingSettingsApply') {\n\t\t\treturn {\n\t\t\t\ttype: 'chargingSettings',\n\t\t\t\ttargetSoc: targetSocPercentToCode(await readNumber('chargeTargetSoc')),\n\t\t\t\tcurrentLimit: await readNumber('chargingCurrentLimit'),\n\t\t\t};\n\t\t}\n\t\tif (action === 'chargingScheduleApply') {\n\t\t\treturn {\n\t\t\t\ttype: 'chargingSchedule',\n\t\t\t\tstart: await readString('chargingScheduleStart'),\n\t\t\t\tend: await readString('chargingScheduleEnd'),\n\t\t\t\tmode: await readNumber('chargingScheduleMode'),\n\t\t\t};\n\t\t}\n\t\tconst enabled = await this.getStateAsync(vehicleCommandPath(vin, 'batteryHeatingScheduleEnabled'));\n\t\tif (!enabled || typeof enabled.val !== 'boolean') {\n\t\t\tthrow new Error('Battery heating schedule enabled must be boolean');\n\t\t}\n\t\treturn {\n\t\t\ttype: 'batteryHeatingSchedule',\n\t\t\tenabled: enabled.val,\n\t\t\tstart: await readString('batteryHeatingScheduleStart'),\n\t\t};\n\t}\n\n\tprivate async executeVehicleCommand(vin: string, command: SaicVehicleCommand): Promise<void> {\n\t\tconst stateId = vehicleCommandPath(vin, command);\n\t\tif (this.vehicleCommandsInProgress.has(vin)) {\n\t\t\tawait this.setStateAsync(stateId, { val: false, ack: true });\n\t\t\tthis.log.warn(`Ignored ${command} command for ${vin}: another vehicle command is still running`);\n\t\t\treturn;\n\t\t}\n\t\tthis.vehicleCommandsInProgress.add(vin);\n\t\ttry {\n\t\t\tawait this.setStateAsync(stateId, { val: false, ack: true });\n\t\t\tif (!this.client || !this.loginOptions) {\n\t\t\t\tthrow new Error('SAIC client is not initialized');\n\t\t\t}\n\t\t\tif (!this.accessToken || this.accessTokenExpiresAt <= Date.now() + 30_000) {\n\t\t\t\tawait this.authenticate();\n\t\t\t}\n\t\t\tawait this.client.sendVehicleCommand(\n\t\t\t\tthis.loginOptions,\n\t\t\t\tthis.accessToken!,\n\t\t\t\tvin,\n\t\t\t\tcommand,\n\t\t\t\tthis.abortController.signal,\n\t\t\t);\n\t\t\tthis.log.info(`SAIC ${command} command completed for ${vin}`);\n\t\t} catch (error) {\n\t\t\tif (!this.stopping) {\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown command error';\n\t\t\t\tthis.log.warn(`SAIC ${command} command failed for ${vin}: ${details}`);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.vehicleCommandsInProgress.delete(vin);\n\t\t}\n\t}\n\n\tprivate async getVehicleStatusFieldIds(channelId: string): Promise<Map<string, string>> {\n\t\tconst cachedIds = this.vehicleStatusFieldIds.get(channelId);\n\t\tif (cachedIds) {\n\t\t\treturn cachedIds;\n\t\t}\n\t\tconst objectIdPrefix = `${this.namespace}.${channelId}.`;\n\t\tconst objects = await this.getObjectListAsync({\n\t\t\tstartkey: objectIdPrefix,\n\t\t\tendkey: `${objectIdPrefix}\\u9999`,\n\t\t});\n\t\tconst stateIds = objects.rows\n\t\t\t.filter(row => row.value.type === 'state' && row.id.startsWith(`${this.namespace}.`))\n\t\t\t.map(row => row.id.slice(this.namespace.length + 1));\n\t\tconst fieldIds = indexVehicleStatusFieldIds(stateIds, channelId);\n\t\tthis.vehicleStatusFieldIds.set(channelId, fieldIds);\n\t\treturn fieldIds;\n\t}\n\n\tprivate async createVehicleStatusObjects(\n\t\tvin: string,\n\t\tstatus: SaicVehicleStatus,\n\t\tchannel = 'status',\n\t\tchannelName = 'currentStatus',\n\t): Promise<void> {\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tif (!EXPOSE_SOURCE_STATUS_DATAPOINTS && (channel === 'liveStatus' || channel === 'cachedStatus')) {\n\t\t\treturn;\n\t\t}\n\t\tconst statusId = `vehicles.${vin}.${channel}`;\n\t\tawait this.setObjectNotExistsAsync(statusId, {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: getRuntimeName(channelName) },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.extendObjectAsync(statusId, { common: { name: getRuntimeName(channelName) } });\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tconst fieldIds = await this.getVehicleStatusFieldIds(statusId);\n\t\tfor (const key of excludedVehicleStatusFields) {\n\t\t\tconst stateId = resolveVehicleStatusFieldId(fieldIds, statusId, getVehicleStatusGroup(key), key);\n\t\t\tawait this.delObjectAsync(stateId);\n\t\t}\n\n\t\tconst values: Record<string, number | undefined> = { ...status.basicVehicleStatus };\n\t\tif (status.statusTime !== undefined) {\n\t\t\tvalues.statusTime = status.statusTime;\n\t\t}\n\t\tif (status.onlineStatus !== undefined) {\n\t\t\tvalues.onlineStatus = status.onlineStatus;\n\t\t}\n\t\tthis.log.debug(`Writing ${Object.keys(values).length} values under ${statusId}`);\n\t\tfor (const [key, value] of Object.entries(values)) {\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst stateId = resolveVehicleStatusFieldId(fieldIds, statusId, getVehicleStatusGroup(key), key);\n\t\t\tconst separator = stateId.lastIndexOf('.');\n\t\t\tconst fieldName = stateId.slice(separator + 1);\n\t\t\tconst groupId = stateId.slice(0, separator);\n\t\t\tconst group = groupId.slice(statusId.length + 1);\n\t\t\tif (\n\t\t\t\texcludedVehicleStatusFields.some(excludedKey => excludedKey.toLowerCase() === fieldName.toLowerCase())\n\t\t\t) {\n\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (value === undefined) {\n\t\t\t\tif (shouldDeleteUnavailableStatusValue(fieldName)) {\n\t\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\t} else {\n\t\t\t\t\tconst previousState = await this.getStateAsync(stateId);\n\t\t\t\t\tif (previousState?.val === null) {\n\t\t\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst normalizedValue = normalizeVehicleStatusValue(fieldName, value);\n\t\t\tif (normalizedValue === undefined) {\n\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait this.setObjectNotExistsAsync(groupId, {\n\t\t\t\ttype: 'channel',\n\t\t\t\tcommon: { name: getRuntimeName(group) },\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(groupId, { common: { name: getRuntimeName(group) } });\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst metadata = getVehicleStatusMetadata(fieldName);\n\t\t\tconst common = {\n\t\t\t\tname: metadata.name,\n\t\t\t\ttype: metadata.type,\n\t\t\t\trole: metadata.role,\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\t...(metadata.unit ? { unit: metadata.unit } : {}),\n\t\t\t};\n\t\t\tawait this.setObjectNotExistsAsync(stateId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon,\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.extendObjectAsync(stateId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon,\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.setStateAsync(stateId, { val: normalizedValue, ack: true });\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst seatSetting =\n\t\t\t\tfieldName === 'frontLeftSeatHeatLevel'\n\t\t\t\t\t? 'driverSeatHeatLevel'\n\t\t\t\t\t: fieldName === 'frontRightSeatHeatLevel'\n\t\t\t\t\t\t? 'passengerSeatHeatLevel'\n\t\t\t\t\t\t: undefined;\n\t\t\tif (seatSetting && Number.isInteger(value) && value >= 0 && value <= 3) {\n\t\t\t\tconst settingId = vehicleCommandPath(vin, seatSetting);\n\t\t\t\tconst settingState = await this.getStateAsync(settingId);\n\t\t\t\tif (!settingState || settingState.ack) {\n\t\t\t\t\tawait this.setStateAsync(settingId, { val: value, ack: true });\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.delObjectAsync(`${statusId}.${fieldName}`);\n\t\t}\n\t}\n\n\tprivate async createVehicleChargingObjects(\n\t\tvin: string,\n\t\tcharging: SaicChargingStatus,\n\t\tseries?: string,\n\t): Promise<void> {\n\t\tawait this.ensureVehicleChargingGroups(vin);\n\t\tconst rootId = `vehicles.${vin}.status.charging`;\n\t\tconst existingObjects = await this.getObjectListAsync({\n\t\t\tstartkey: `${this.namespace}.${rootId}.`,\n\t\t\tendkey: `${this.namespace}.${rootId}.\\u9999`,\n\t\t});\n\t\tconst existingFieldIds = new Map<string, string[]>(chargingGroups.map(({ id }) => [id, []]));\n\t\tfor (const { id: objectId, value: object } of existingObjects.rows) {\n\t\t\tif (object.type !== 'state') {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst group = chargingGroups.find(({ id }) => objectId.startsWith(`${this.namespace}.${rootId}.${id}.`));\n\t\t\tif (!group) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst prefix = `${this.namespace}.${rootId}.${group.id}.`;\n\t\t\tconst fieldId = objectId.slice(prefix.length);\n\t\t\tif (fieldId && !fieldId.includes('.')) {\n\t\t\t\texistingFieldIds.get(group.id)?.push(fieldId);\n\t\t\t}\n\t\t}\n\t\tfor (const { source, id } of chargingGroups) {\n\t\t\tconst groupId = `${rootId}.${id}`;\n\t\t\tconst excludedFields = id === 'session' ? excludedChargingSessionFields : excludedChargingStatisticsFields;\n\t\t\tconst fields =\n\t\t\t\tsource === 'chrgMgmtData'\n\t\t\t\t\t? getChargingManagementFields(charging.chrgMgmtData)\n\t\t\t\t\t: getChargingStatisticsFields(charging[source]);\n\t\t\tfor (const field of excludedFields) {\n\t\t\t\tawait this.delObjectAsync(`${groupId}.${field}`);\n\t\t\t}\n\t\t\tconst valuesByField = new Map(fields);\n\t\t\tconst resolvedFieldIds = resolveChargingFieldIds(\n\t\t\t\tfields.map(([field]) => field),\n\t\t\t\texistingFieldIds.get(id) ?? [],\n\t\t\t);\n\t\t\tfor (const [responseField, field] of resolvedFieldIds) {\n\t\t\t\tif (this.stopping) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst value = valuesByField.get(responseField);\n\t\t\t\tconst canonicalField = resolveChargingFieldName(field);\n\t\t\t\tif (excludedFields.some(excludedField => excludedField === canonicalField)) {\n\t\t\t\t\tawait this.delObjectAsync(`${groupId}.${field}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst stateId = `${groupId}.${field}`;\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined &&\n\t\t\t\t\tcanonicalField !== 'realtimePower' &&\n\t\t\t\t\tcanonicalField !== 'batteryAvailableEnergy'\n\t\t\t\t) {\n\t\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst normalizedValue =\n\t\t\t\t\tcanonicalField === 'realtimePower'\n\t\t\t\t\t\t? calculateRealtimePower(charging.chrgMgmtData.bmsPackCrnt, charging.chrgMgmtData.bmsPackVol)\n\t\t\t\t\t\t: value === undefined\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: normalizeChargingValue(canonicalField, value, series);\n\t\t\t\tif (normalizedValue === undefined && canonicalField !== 'batteryAvailableEnergy') {\n\t\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst metadata = getChargingFieldMetadata(canonicalField, series);\n\t\t\t\tconst common: ioBroker.StateCommon = {\n\t\t\t\t\tname: getChargingFieldName(canonicalField),\n\t\t\t\t\ttype:\n\t\t\t\t\t\tmetadata.type === 'boolean'\n\t\t\t\t\t\t\t? 'boolean'\n\t\t\t\t\t\t\t: typeof normalizedValue === 'string'\n\t\t\t\t\t\t\t\t? 'string'\n\t\t\t\t\t\t\t\t: 'number',\n\t\t\t\t\trole: typeof normalizedValue === 'string' ? 'text' : metadata.role,\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: false,\n\t\t\t\t};\n\t\t\t\tif (metadata.unit) {\n\t\t\t\t\tcommon.unit = metadata.unit;\n\t\t\t\t}\n\t\t\t\tawait this.setObjectNotExistsAsync(stateId, { type: 'state', common, native: {} });\n\t\t\t\tawait this.extendObjectAsync(stateId, { common });\n\t\t\t\tif (normalizedValue === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tawait this.setStateAsync(stateId, {\n\t\t\t\t\tval: normalizedValue,\n\t\t\t\t\tack: true,\n\t\t\t\t});\n\t\t\t\tif (field === 'bmsOnBdChrgTrgtSOCDspCmd' && typeof value === 'number' && value >= 1 && value <= 7) {\n\t\t\t\t\tconst targetSocId = vehicleCommandPath(vin, 'chargeTargetSoc');\n\t\t\t\t\tconst targetSocState = await this.getStateAsync(targetSocId);\n\t\t\t\t\tif (shouldApplySettingFeedback(targetSocState, this.pendingSettingEdits.has(targetSocId))) {\n\t\t\t\t\t\tawait this.setStateAsync(targetSocId, {\n\t\t\t\t\t\t\tval: normalizeChargingValue(field, value, series) as number,\n\t\t\t\t\t\t\tack: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst capacityState = await this.getStateAsync(`${rootId}.statistics.totalBatteryCapacity`);\n\t\tconst socState = await this.getStateAsync(`${rootId}.session.bmsPackSOCDsp`);\n\t\tconst availableEnergy = calculateAvailableBatteryEnergy(\n\t\t\tcapacityState?.val,\n\t\t\tsocState?.val,\n\t\t\tcharging.rvsChargeStatus.packEnergyKwh,\n\t\t);\n\t\tif (availableEnergy !== undefined) {\n\t\t\tawait this.setStateAsync(`${rootId}.statistics.batteryAvailableEnergy`, {\n\t\t\t\tval: availableEnergy,\n\t\t\t\tack: true,\n\t\t\t});\n\t\t} else {\n\t\t\tawait this.setStateAsync(`${rootId}.statistics.batteryAvailableEnergy`, {\n\t\t\t\tval: null,\n\t\t\t\tack: true,\n\t\t\t});\n\t\t}\n\t\tfor (const [setting, value] of Object.entries(getChargingSettingFeedback(charging.chrgMgmtData))) {\n\t\t\tconst stateId = vehicleCommandPath(vin, setting);\n\t\t\tconst state = await this.getStateAsync(stateId);\n\t\t\tif (shouldApplySettingFeedback(state, this.pendingSettingEdits.has(stateId))) {\n\t\t\t\tawait this.setStateAsync(stateId, { val: value, ack: true });\n\t\t\t}\n\t\t}\n\t\tawait this.delObjectAsync(`vehicles.${vin}.charging`, { recursive: true });\n\t}\n\n\tprivate async ensureVehicleChargingGroups(vin: string): Promise<void> {\n\t\tconst statusId = `vehicles.${vin}.status`;\n\t\tconst rootId = `${statusId}.charging`;\n\t\tawait this.setObjectNotExistsAsync(statusId, {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: getRuntimeName('currentStatus') },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.setObjectNotExistsAsync(rootId, {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: getRuntimeName('commandGroup_charging') },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.extendObjectAsync(rootId, { common: { name: getRuntimeName('commandGroup_charging') } });\n\t\tfor (const { source, id, name } of chargingGroups) {\n\t\t\tconst groupId = `${rootId}.${id}`;\n\t\t\tconst groupName = getRuntimeName(name);\n\t\t\tawait this.setObjectNotExistsAsync(groupId, {\n\t\t\t\ttype: 'channel',\n\t\t\t\tcommon: { name: groupName },\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(groupId, { common: { name: groupName } });\n\t\t\tawait this.delObjectAsync(`${rootId}.${source}`, { recursive: true });\n\t\t}\n\t}\n\n\tprivate async createCanonicalVehicleStatusObjects(\n\t\tvin: string,\n\t\tstatus: SaicVehicleStatus,\n\t\tsource: 'live' | 'cached',\n\t): Promise<void> {\n\t\tif (this.stopping || !isVehicleStatusNotOlder(status.statusTime, this.lastCanonicalStatusTimes.get(vin))) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.createVehicleStatusObjects(vin, status);\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tconst sourceId = `vehicles.${vin}.status.source`;\n\t\tawait this.setObjectNotExistsAsync(sourceId, {\n\t\t\ttype: 'state',\n\t\t\tcommon: { name: getRuntimeName('statusSource'), type: 'string', role: 'text', read: true, write: false },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.extendObjectAsync(sourceId, { common: { name: getRuntimeName('statusSource') } });\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.setStateAsync(sourceId, { val: source, ack: true });\n\t\tif (status.statusTime !== undefined) {\n\t\t\tconst sourceTimestampId = `vehicles.${vin}.status.sourceTimestamp`;\n\t\t\tawait this.setObjectNotExistsAsync(sourceTimestampId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: {\n\t\t\t\t\tname: getRuntimeName('statusSourceTimestamp'),\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\trole: 'date',\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: false,\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(sourceTimestampId, {\n\t\t\t\tcommon: { name: getRuntimeName('statusSourceTimestamp') },\n\t\t\t});\n\t\t\tawait this.setStateAsync(sourceTimestampId, { val: status.statusTime * 1000, ack: true });\n\t\t\tthis.lastCanonicalStatusTimes.set(vin, status.statusTime);\n\t\t}\n\t}\n\n\tprivate async createVehicleObjects(vehicle: SaicVehicle): Promise<void> {\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tconst deviceId = `vehicles.${vehicle.vin}`;\n\t\tconst values: Record<string, string | boolean | undefined> = {\n\t\t\tvin: vehicle.vin,\n\t\t\tname: vehicle.name,\n\t\t\tbrandName: vehicle.brandName,\n\t\t\tmodelName: vehicle.modelName,\n\t\t\tseries: vehicle.series,\n\t\t\tmodelYear: vehicle.modelYear,\n\t\t\tcolorName: vehicle.colorName,\n\t\t\tisCurrentVehicle: vehicle.isCurrentVehicle,\n\t\t\tisSubaccount: vehicle.isSubaccount,\n\t\t};\n\n\t\tawait this.setObjectNotExistsAsync(deviceId, {\n\t\t\ttype: 'device',\n\t\t\tcommon: { name: vehicle.name || vehicle.modelName || vehicle.vin },\n\t\t\tnative: {},\n\t\t});\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.ensureVehicleChargingGroups(vehicle.vin);\n\t\tconst commandsId = `${deviceId}.commands`;\n\t\tawait this.setObjectNotExistsAsync(commandsId, {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: getRuntimeName('commands') },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.extendObjectAsync(commandsId, { common: { name: getRuntimeName('commands') } });\n\t\tfor (const group of ['access', 'climate', 'heating', 'charging', 'schedules', 'vehicle']) {\n\t\t\tconst groupId = `${commandsId}.${group}`;\n\t\t\tconst groupName = getRuntimeName(`commandGroup_${group}`);\n\t\t\tawait this.setObjectNotExistsAsync(groupId, {\n\t\t\t\ttype: 'channel',\n\t\t\t\tcommon: { name: groupName },\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(groupId, { common: { name: groupName } });\n\t\t}\n\t\tfor (const command of vehicleCommands) {\n\t\t\tconst commandId = vehicleCommandPath(vehicle.vin, command.id);\n\t\t\tawait this.setObjectNotExistsAsync(commandId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: {\n\t\t\t\t\tname: getRuntimeName(command.id),\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\trole: 'button',\n\t\t\t\t\tread: false,\n\t\t\t\t\twrite: true,\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(commandId, {\n\t\t\t\tcommon: { name: getRuntimeName(command.id) },\n\t\t\t});\n\t\t\tawait this.setStateAsync(commandId, { val: false, ack: true });\n\t\t}\n\t\tconst settingStates: Array<{\n\t\t\tid: string;\n\t\t\ttype: 'number' | 'string' | 'boolean';\n\t\t\trole: string;\n\t\t\tdef: number | string | boolean;\n\t\t\tmin?: number;\n\t\t\tmax?: number;\n\t\t\tstep?: number;\n\t\t\tunit?: string;\n\t\t\tstates?: Record<string, string>;\n\t\t}> = [\n\t\t\t{\n\t\t\t\tid: 'driverSeatHeatLevel',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level',\n\t\t\t\tdef: 0,\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 3,\n\t\t\t\tstates: { 0: 'Off', 1: 'Low', 2: 'Medium', 3: 'High' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'passengerSeatHeatLevel',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level',\n\t\t\t\tdef: 0,\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 3,\n\t\t\t\tstates: { 0: 'Off', 1: 'Low', 2: 'Medium', 3: 'High' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'climateTemperature',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level.temperature',\n\t\t\t\tdef: 22,\n\t\t\t\tmin: getClimateTemperatureRange(vehicle.series).min,\n\t\t\t\tmax: getClimateTemperatureRange(vehicle.series).max,\n\t\t\t\tunit: '\u00B0C',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'chargeTargetSoc',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level',\n\t\t\t\tdef: 80,\n\t\t\t\tmin: 40,\n\t\t\t\tmax: 100,\n\t\t\t\tstep: 10,\n\t\t\t\tunit: '%',\n\t\t\t\tstates: { 40: '40%', 50: '50%', 60: '60%', 70: '70%', 80: '80%', 90: '90%', 100: '100%' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'chargingCurrentLimit',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level',\n\t\t\t\tdef: 4,\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 4,\n\t\t\t\tstates: { 1: '6 A', 2: '8 A', 3: '16 A', 4: 'Maximum' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'chargingScheduleStart',\n\t\t\t\ttype: 'string',\n\t\t\t\trole: 'text',\n\t\t\t\tdef: '00:00',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'chargingScheduleEnd',\n\t\t\t\ttype: 'string',\n\t\t\t\trole: 'text',\n\t\t\t\tdef: '06:00',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'chargingScheduleMode',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level',\n\t\t\t\tdef: 2,\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 3,\n\t\t\t\tstates: { 1: 'Until configured time', 2: 'Disabled', 3: 'Until configured SOC' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'batteryHeatingScheduleEnabled',\n\t\t\t\ttype: 'boolean',\n\t\t\t\trole: 'switch',\n\t\t\t\tdef: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'batteryHeatingScheduleStart',\n\t\t\t\ttype: 'string',\n\t\t\t\trole: 'text',\n\t\t\t\tdef: '00:00',\n\t\t\t},\n\t\t];\n\t\tfor (const setting of settingStates) {\n\t\t\tconst stateId = vehicleCommandPath(vehicle.vin, setting.id);\n\t\t\tconst legacyStateId = `${commandsId}.${setting.id}`;\n\t\t\tconst stateObject = await this.getObjectAsync(stateId);\n\t\t\tconst legacyState = await this.getStateAsync(legacyStateId);\n\t\t\tconst previousScheduleState = setting.id.startsWith('chargingSchedule')\n\t\t\t\t? await this.getStateAsync(`${commandsId}.schedules.${setting.id}`)\n\t\t\t\t: null;\n\t\t\tawait this.setObjectNotExistsAsync(stateId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: {\n\t\t\t\t\tname: getRuntimeName(setting.id),\n\t\t\t\t\ttype: setting.type,\n\t\t\t\t\trole: setting.role,\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: true,\n\t\t\t\t\tdef: setting.def,\n\t\t\t\t\t...(setting.min === undefined ? {} : { min: setting.min }),\n\t\t\t\t\t...(setting.max === undefined ? {} : { max: setting.max }),\n\t\t\t\t\t...(setting.step === undefined ? {} : { step: setting.step }),\n\t\t\t\t\t...(setting.unit === undefined ? {} : { unit: setting.unit }),\n\t\t\t\t\t...(setting.states ? { states: setting.states } : {}),\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tconst currentState = await this.getStateAsync(stateId);\n\t\t\tif (!currentState || currentState.val === null) {\n\t\t\t\tawait this.setStateAsync(stateId, {\n\t\t\t\t\tval: legacyState?.val ?? previousScheduleState?.val ?? setting.def,\n\t\t\t\t\tack: true,\n\t\t\t\t});\n\t\t\t} else if (typeof currentState.val === 'number' && stateObject?.common.unit !== setting.unit) {\n\t\t\t\tif (setting.id === 'chargeTargetSoc' && currentState.val >= 1 && currentState.val <= 7) {\n\t\t\t\t\tawait this.setStateAsync(stateId, { val: (currentState.val + 3) * 10, ack: true });\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.extendObjectAsync(stateId, {\n\t\t\t\tcommon: {\n\t\t\t\t\tname: getRuntimeName(setting.id),\n\t\t\t\t\ttype: setting.type,\n\t\t\t\t\trole: setting.role,\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: true,\n\t\t\t\t\tdef: setting.def,\n\t\t\t\t\t...(setting.min === undefined ? {} : { min: setting.min }),\n\t\t\t\t\t...(setting.max === undefined ? {} : { max: setting.max }),\n\t\t\t\t\t...(setting.step === undefined ? {} : { step: setting.step }),\n\t\t\t\t\t...(setting.unit === undefined ? {} : { unit: setting.unit }),\n\t\t\t\t\t...(setting.states ? { states: setting.states } : {}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait this.delObjectAsync(legacyStateId);\n\t\t}\n\t\tfor (const action of settingActions) {\n\t\t\tconst actionId = vehicleCommandPath(vehicle.vin, action.id);\n\t\t\tawait this.setObjectNotExistsAsync(actionId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: { name: getRuntimeName(action.id), type: 'boolean', role: 'button', read: false, write: true },\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(actionId, {\n\t\t\t\tcommon: { name: getRuntimeName(action.id) },\n\t\t\t});\n\t\t\tawait this.setStateAsync(actionId, { val: false, ack: true });\n\t\t\tawait this.delObjectAsync(`${commandsId}.${action.id}`);\n\t\t}\n\t\tfor (const id of [\n\t\t\t'chargingScheduleStart',\n\t\t\t'chargingScheduleEnd',\n\t\t\t'chargingScheduleMode',\n\t\t\t'chargingScheduleApply',\n\t\t]) {\n\t\t\tawait this.delObjectAsync(`${commandsId}.schedules.${id}`);\n\t\t}\n\t\tfor (const command of vehicleCommands) {\n\t\t\tawait this.delObjectAsync(`${commandsId}.${command.id}`);\n\t\t}\n\t\tthis.subscribeStates(`${commandsId}.*`);\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const [key, value] of Object.entries(values)) {\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isBoolean = typeof value === 'boolean';\n\t\t\tconst name = getRuntimeName(key);\n\t\t\tawait this.setObjectNotExistsAsync(`${deviceId}.${key}`, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: {\n\t\t\t\t\tname,\n\t\t\t\t\ttype: isBoolean ? 'boolean' : 'string',\n\t\t\t\t\trole: isBoolean ? 'indicator' : key === 'vin' ? 'text' : 'info.name',\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: false,\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(`${deviceId}.${key}`, { common: { name } });\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.setStateAsync(`${deviceId}.${key}`, { val: value, ack: true });\n\t\t}\n\t}\n\n\tprivate onUnload(callback: () => void): void {\n\t\tif (this.unloadCallbackCalled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.unloadCallbackCalled = true;\n\t\tthis.stopping = true;\n\t\tthis.abortController.abort(new DOMException('Adapter is stopping', 'AbortError'));\n\t\tthis.refreshPollQueue.clearQueuedRefresh();\n\t\tthis.pollTimer.clear();\n\t\tcallback();\n\t}\n}\nif (require.main !== module) {\n\t// Export the constructor in compact mode\n\tmodule.exports = (options: Partial<utils.AdapterOptions> | undefined) => new MgSaic(options);\n} else {\n\t// otherwise start the instance directly\n\t(() => new MgSaic())();\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import * as utils from '@iobroker/adapter-core';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { DEFAULT_POLL_INTERVAL_SECONDS, validateConfig, type MgSaicConfig } from './config';\nimport {\n\tSaicApiClient,\n\tSaicHttpError,\n\tSaicRemoteInstructionError,\n\tclimateTemperatureToIndex,\n\tgetClimateTemperatureRange,\n\tisVehicleStatusNotOlder,\n\ttargetSocPercentToCode,\n\ttype SaicVehicleSetting,\n\ttype SaicVehicleCommand,\n\ttype SaicVehicle,\n\ttype SaicVehicleStatus,\n\ttype SaicChargingStatus,\n} from './saic-client';\nimport { resolveSaicRegion } from './regions';\nimport { isRefreshCommand, normalizeStateChangeId } from './refresh-command';\nimport { RefreshPollQueue } from './refresh-poll-queue';\nimport { RefreshPollTimer } from './refresh-poll-timer';\nimport {\n\tmigrateLegacyPendingSettingEdits,\n\tparsePendingSettingEdits,\n\tserializePendingSettingEdits,\n} from './pending-setting-edits';\nimport {\n\tgetVehicleStatusGroup,\n\tgetVehicleStatusMetadata,\n\tgetChargingSettingFeedback,\n\tresolveChargingFieldIds,\n\tcalculateRealtimePower,\n\tgetChargingFieldMetadata,\n\tgetChargingManagementFields,\n\tresolveChargingFieldName,\n\tgetChargingStatisticsFields,\n\tcalculateAvailableBatteryEnergy,\n\texcludedChargingSessionFields,\n\texcludedChargingStatisticsFields,\n\texcludedVehicleStatusFields,\n\tnormalizeChargingValue,\n\tnormalizeVehicleStatusValue,\n\tresolveOdometerValue,\n\tshouldApplySettingFeedback,\n\tshouldDeleteUnavailableStatusValue,\n\tindexVehicleStatusFieldIds,\n\tresolveVehicleStatusFieldId,\n} from './status-metadata';\nimport { getChargingFieldName, getRuntimeName } from './runtime-translations';\n\nconst chargingGroups = [\n\t{ source: 'chrgMgmtData', id: 'session', name: 'chargingManagement' },\n\t{ source: 'rvsChargeStatus', id: 'statistics', name: 'chargeStatus' },\n] as const;\n\nconst vehicleCommands: Array<{ id: SaicVehicleCommand }> = [\n\t{ id: 'lock' },\n\t{ id: 'unlock' },\n\t{ id: 'openBoot' },\n\t{ id: 'climateStart' },\n\t{ id: 'climateStop' },\n\t{ id: 'frontDefrost' },\n\t{ id: 'rearWindowHeatStart' },\n\t{ id: 'rearWindowHeatStop' },\n\t{ id: 'batteryHeatStart' },\n\t{ id: 'batteryHeatStop' },\n\t{ id: 'chargingStart' },\n\t{ id: 'chargingStop' },\n\t{ id: 'chargingPortLock' },\n\t{ id: 'chargingPortUnlock' },\n\t{ id: 'findMyCar' },\n];\n\nconst commandGroups: Partial<Record<SaicVehicleCommand, string>> = {\n\tlock: 'access',\n\tunlock: 'access',\n\topenBoot: 'access',\n\tclimateStart: 'climate',\n\tclimateStop: 'climate',\n\tfrontDefrost: 'climate',\n\trearWindowHeatStart: 'heating',\n\trearWindowHeatStop: 'heating',\n\tbatteryHeatStart: 'heating',\n\tbatteryHeatStop: 'heating',\n\tchargingStart: 'charging',\n\tchargingStop: 'charging',\n\tchargingPortLock: 'charging',\n\tchargingPortUnlock: 'charging',\n\tfindMyCar: 'vehicle',\n};\n\nconst settingGroups: Record<string, string> = {\n\tdriverSeatHeatLevel: 'heating',\n\tpassengerSeatHeatLevel: 'heating',\n\tclimateTemperature: 'climate',\n\tchargeTargetSoc: 'charging',\n\tchargingCurrentLimit: 'charging',\n\tchargingScheduleStart: 'charging',\n\tchargingScheduleEnd: 'charging',\n\tchargingScheduleMode: 'charging',\n\tbatteryHeatingScheduleEnabled: 'schedules',\n\tbatteryHeatingScheduleStart: 'schedules',\n};\n\nconst actionGroups: Record<SettingAction, string> = {\n\tclimateTemperatureApply: 'climate',\n\tchargingSettingsApply: 'charging',\n\tchargingScheduleApply: 'charging',\n\tbatteryHeatingScheduleApply: 'schedules',\n};\n\nfunction vehicleCommandPath(vin: string, id: string): string {\n\tconst group =\n\t\tid in commandGroups\n\t\t\t? commandGroups[id as SaicVehicleCommand]\n\t\t\t: id in settingGroups\n\t\t\t\t? settingGroups[id]\n\t\t\t\t: actionGroups[id as SettingAction];\n\tif (!group) {\n\t\tthrow new Error(`Missing command group for ${id}`);\n\t}\n\treturn `vehicles.${vin}.commands.${group}.${id}`;\n}\n\nconst settingActions = [\n\t{ id: 'climateTemperatureApply' },\n\t{ id: 'chargingSettingsApply' },\n\t{ id: 'chargingScheduleApply' },\n\t{ id: 'batteryHeatingScheduleApply' },\n] as const;\n\ntype SettingAction = (typeof settingActions)[number]['id'];\n\nconst settingInputsByAction: Record<SettingAction, string[]> = {\n\tclimateTemperatureApply: ['climateTemperature'],\n\tchargingSettingsApply: ['chargeTargetSoc', 'chargingCurrentLimit'],\n\tchargingScheduleApply: ['chargingScheduleStart', 'chargingScheduleEnd', 'chargingScheduleMode'],\n\tbatteryHeatingScheduleApply: ['batteryHeatingScheduleEnabled', 'batteryHeatingScheduleStart'],\n};\n\nconst EXPOSE_SOURCE_STATUS_DATAPOINTS = false;\nconst PENDING_SETTING_EDITS_FILE = 'pending-setting-edits.json';\nconst INITIALIZATION_RETRY_DELAY_MS = 60_000;\nconst MAX_INITIALIZATION_RETRY_DELAY_MS = 5 * INITIALIZATION_RETRY_DELAY_MS;\n\nexport function calculateInitializationRetryDelayMs(retryCount: number): number {\n\tconst attempts = Math.max(1, retryCount);\n\tif (attempts <= 3) {\n\t\treturn INITIALIZATION_RETRY_DELAY_MS * attempts;\n\t}\n\treturn MAX_INITIALIZATION_RETRY_DELAY_MS;\n}\n\nclass MgSaic extends utils.Adapter {\n\tpublic constructor(options: Partial<utils.AdapterOptions> = {}) {\n\t\tsuper({\n\t\t\t...options,\n\t\t\tname: 'mg-saic',\n\t\t});\n\t\tthis.pollTimer = new RefreshPollTimer(\n\t\t\t(callback, milliseconds) => this.setTimeout(callback, milliseconds),\n\t\t\ttimer => this.clearTimeout(timer),\n\t\t);\n\t\tthis.on('ready', this.onReady.bind(this));\n\t\tthis.on('stateChange', this.onStateChange.bind(this));\n\t\tthis.on('unload', this.onUnload.bind(this));\n\t}\n\n\tprivate readonly pollTimer: RefreshPollTimer<ioBroker.Timeout>;\n\tprivate pollIntervalMilliseconds?: number;\n\tprivate initializationRetryCount = 0;\n\tprivate initializationRetryTimer?: ioBroker.Timeout;\n\tprivate readonly refreshPollQueue = new RefreshPollQueue();\n\tprivate stopping = false;\n\tprivate unloadCallbackCalled = false;\n\tprivate readonly abortController = new AbortController();\n\tprivate client?: SaicApiClient;\n\tprivate loginOptions?: {\n\t\tbaseUrl: string;\n\t\tregionCode: string;\n\t\ttenantId: string;\n\t\taccountType: 'email' | 'phone';\n\t\taccountIdentifier: string;\n\t\tphoneCountryCode?: string;\n\t\tpassword: string;\n\t};\n\tprivate accessToken?: string;\n\tprivate accessTokenExpiresAt = 0;\n\tprivate vehicles: SaicVehicle[] = [];\n\tprivate readonly vehicleStatusFieldIds = new Map<string, Map<string, string>>();\n\tprivate readonly lastStatusTimes = new Map<string, number>();\n\tprivate readonly lastCanonicalStatusTimes = new Map<string, number>();\n\tprivate readonly vehicleCommandsInProgress = new Set<string>();\n\tprivate readonly pendingSettingEdits = new Map<string, number>();\n\tprivate pendingSettingEditsWrite: Promise<void> = Promise.resolve();\n\tprivate settingEditSequence = 0;\n\n\tprivate async onReady(): Promise<void> {\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tconst config = this.config as unknown as MgSaicConfig;\n\t\tawait this.extendObjectAsync('info', { common: { name: getRuntimeName('info') } });\n\t\tawait this.extendObjectAsync('info.backend', { common: { name: getRuntimeName('backend') } });\n\t\tawait this.extendObjectAsync('info.connection', { common: { name: getRuntimeName('connection') } });\n\t\tawait this.extendObjectAsync('info.lastError', { common: { name: getRuntimeName('lastError') } });\n\t\ttry {\n\t\t\tawait this.migrateLegacyPendingSettingEdits();\n\t\t} catch (error) {\n\t\t\tconst details = error instanceof Error ? error.message : 'Unknown storage error';\n\t\t\tthis.log.warn(`Could not migrate pending setting edits: ${details}`);\n\t\t}\n\t\tawait this.setObjectNotExistsAsync('commands', {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: getRuntimeName('commands') },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.setObjectAsync('vehicles', {\n\t\t\ttype: 'folder',\n\t\t\tcommon: { name: 'Vehicles' },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.setObjectNotExistsAsync('commands.refresh', {\n\t\t\ttype: 'state',\n\t\t\tcommon: {\n\t\t\t\tname: getRuntimeName('refresh'),\n\t\t\t\ttype: 'boolean',\n\t\t\t\trole: 'button',\n\t\t\t\tread: false,\n\t\t\t\twrite: true,\n\t\t\t},\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.extendObjectAsync('commands.refresh', { common: { name: getRuntimeName('refresh') } });\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.setStateAsync('commands.refresh', { val: false, ack: true });\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tthis.subscribeStates('commands.refresh');\n\t\tawait this.setState('info.connection', false, true);\n\t\tawait this.setState('info.backend', config.region?.trim() || 'not configured', true);\n\t\tconst errors = validateConfig(config);\n\t\tawait this.setState('info.lastError', errors.join('; '), true);\n\t\tif (errors.length) {\n\t\t\tthis.log.warn(`Configuration is incomplete: ${errors.join('; ')}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst region = resolveSaicRegion(config.region ?? '');\n\t\tif (!region) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.client = new SaicApiClient(\n\t\t\t\tundefined,\n\t\t\t\tDate.now,\n\t\t\t\tundefined,\n\t\t\t\tmessage => this.log.debug(message),\n\t\t\t\tundefined,\n\t\t\t\t{\n\t\t\t\t\tsetTimeout: (callback, milliseconds) => {\n\t\t\t\t\t\tconst timer = this.setTimeout(callback, milliseconds);\n\t\t\t\t\t\treturn () => {\n\t\t\t\t\t\t\tif (timer !== undefined) {\n\t\t\t\t\t\t\t\tthis.clearTimeout(timer);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t\tthis.loginOptions = {\n\t\t\t\t...region,\n\t\t\t\taccountType: config.accountType as 'email' | 'phone',\n\t\t\t\taccountIdentifier: config.accountIdentifier ?? '',\n\t\t\t\tphoneCountryCode: config.phoneCountryCode,\n\t\t\t\tpassword: config.password ?? '',\n\t\t\t};\n\t\t\tawait this.authenticate();\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.vehicles = await this.client.listVehicles(\n\t\t\t\tthis.loginOptions,\n\t\t\t\tthis.accessToken!,\n\t\t\t\tthis.abortController.signal,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst details = error instanceof Error ? error.message : 'Unknown initialization error';\n\t\t\tconst message = `SAIC initialization failed: ${details}`;\n\t\t\tawait this.setState('info.connection', false, true);\n\t\t\tawait this.setState('info.lastError', message, true);\n\t\t\tthis.log.warn(message);\n\t\t\tthis.scheduleInitializationRetry();\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tfor (const vehicle of this.vehicles) {\n\t\t\t\tif (this.stopping) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait this.createVehicleObjects(vehicle);\n\t\t\t\tif (!EXPOSE_SOURCE_STATUS_DATAPOINTS) {\n\t\t\t\t\tawait this.delObjectAsync(`vehicles.${vehicle.vin}.cachedStatus`, { recursive: true });\n\t\t\t\t}\n\t\t\t\tawait this.delObjectAsync(`vehicles.${vehicle.vin}.canonicalStatus`, { recursive: true });\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.restorePendingSettingEdits();\n\t\t\t} catch (error) {\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown storage error';\n\t\t\t\tthis.log.warn(`Could not restore pending setting edits: ${details}`);\n\t\t\t}\n\t\t\tawait this.setState('info.connection', true, true);\n\t\t\tthis.initializationRetryCount = 0;\n\t\t\tthis.log.info(`SAIC account authenticated; discovered ${this.vehicles.length} vehicle(s).`);\n\t\t\tif (this.vehicles.length === 0) {\n\t\t\t\tawait this.setState('info.lastError', 'No vehicles are linked to this SAIC account', true);\n\t\t\t\tthis.log.warn('No vehicles are linked to this SAIC account.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst intervalSeconds = config.pollIntervalSeconds ?? DEFAULT_POLL_INTERVAL_SECONDS;\n\t\t\tthis.pollIntervalMilliseconds = intervalSeconds * 1000;\n\t\t\tawait this.refreshVehicleStatuses();\n\t\t} catch (error) {\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst details = error instanceof Error ? error.message : 'Unknown local adapter error';\n\t\t\tawait this.setState('info.lastError', `Could not initialize vehicle objects: ${details}`, true);\n\t\t\tthis.log.error(`Could not initialize vehicle objects: ${details}`);\n\t\t}\n\t}\n\n\tprivate scheduleInitializationRetry(): void {\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tthis.initializationRetryCount += 1;\n\t\tconst retryDelayMs = calculateInitializationRetryDelayMs(this.initializationRetryCount);\n\t\tif (this.initializationRetryTimer !== undefined) {\n\t\t\tthis.clearTimeout(this.initializationRetryTimer);\n\t\t}\n\t\tthis.log.info(\n\t\t\t`Retrying SAIC initialization in ${retryDelayMs / 1000} seconds (${this.initializationRetryCount})`,\n\t\t);\n\t\tthis.initializationRetryTimer = this.setTimeout(() => {\n\t\t\tthis.initializationRetryTimer = undefined;\n\t\t\tif (!this.stopping) {\n\t\t\t\tvoid this.onReady();\n\t\t\t}\n\t\t}, retryDelayMs);\n\t}\n\n\tprivate async authenticate(): Promise<void> {\n\t\tif (!this.client || !this.loginOptions || this.stopping) {\n\t\t\tthrow new Error('Adapter is stopping or not initialized');\n\t\t}\n\t\tconst login = await this.client.login(this.loginOptions, this.abortController.signal);\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tthis.accessToken = login.accessToken;\n\t\tthis.accessTokenExpiresAt = Date.now() + login.expiresIn * 1000;\n\t\tawait this.setState('info.connection', true, true);\n\t}\n\n\tprivate triggerRefresh(): void {\n\t\tthis.pollTimer.clear();\n\t\tvoid this.refreshVehicleStatuses().catch(error => {\n\t\t\tconst details = error instanceof Error ? error.message : 'Unknown refresh error';\n\t\t\tthis.log.error(`Vehicle status refresh failed: ${details}`);\n\t\t});\n\t}\n\n\tprivate scheduleNextPoll(): void {\n\t\tif (this.stopping || this.pollIntervalMilliseconds === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis.pollTimer.schedule(() => this.triggerRefresh(), this.pollIntervalMilliseconds);\n\t}\n\n\tprivate async refreshVehicleStatuses(): Promise<void> {\n\t\tif (this.stopping || !this.client || !this.loginOptions || !this.accessToken) {\n\t\t\treturn;\n\t\t}\n\t\tif (!this.refreshPollQueue.request()) {\n\t\t\treturn;\n\t\t}\n\t\tconst statusErrors: string[] = [];\n\t\tlet followUpUsed = false;\n\t\ttry {\n\t\t\tdo {\n\t\t\t\tthis.refreshPollQueue.clearQueuedRefresh();\n\t\t\t\tfor (const vehicle of this.vehicles) {\n\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (Date.now() >= this.accessTokenExpiresAt - 60_000) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tawait this.authenticate();\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown authentication error';\n\t\t\t\t\t\t\tstatusErrors.push(`SAIC re-authentication failed: ${details}`);\n\t\t\t\t\t\t\tawait this.setState('info.connection', false, true);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst charging = await this.client.getVehicleChargingStatus(\n\t\t\t\t\t\t\tthis.loginOptions,\n\t\t\t\t\t\t\tthis.accessToken,\n\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tawait this.createVehicleChargingObjects(vehicle.vin, charging, vehicle.series);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown charging data error';\n\t\t\t\t\t\tstatusErrors.push(`Charging data request failed for ${vehicle.vin}: ${details}`);\n\t\t\t\t\t\tthis.log.warn(`Could not retrieve charging data for vehicle ${vehicle.vin}: ${details}`);\n\t\t\t\t\t}\n\t\t\t\t\tlet status: SaicVehicleStatus;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.log.debug(`Refreshing live status for ${vehicle.vin}`);\n\t\t\t\t\t\tstatus = await this.client.getVehicleStatus(\n\t\t\t\t\t\t\tthis.loginOptions,\n\t\t\t\t\t\t\tthis.accessToken,\n\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t\t);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (error instanceof SaicHttpError && (error.status === 401 || error.status === 403)) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tawait this.authenticate();\n\t\t\t\t\t\t\t\tstatus = await this.client.getVehicleStatus(\n\t\t\t\t\t\t\t\t\tthis.loginOptions,\n\t\t\t\t\t\t\t\t\tthis.accessToken,\n\t\t\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} catch (reauthError) {\n\t\t\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst details =\n\t\t\t\t\t\t\t\t\treauthError instanceof Error ? reauthError.message : 'Unknown authentication error';\n\t\t\t\t\t\t\t\tstatusErrors.push(`SAIC re-authentication failed for ${vehicle.vin}: ${details}`);\n\t\t\t\t\t\t\t\tawait this.setState('info.connection', false, true);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown error';\n\t\t\t\t\t\t\tconst diagnostic =\n\t\t\t\t\t\t\t\terror instanceof SaicRemoteInstructionError\n\t\t\t\t\t\t\t\t\t? `SAIC/MG returned remote instruction code 4 for ${vehicle.vin}; this is a response from the MG/SAIC service or vehicle, not an adapter parsing/processing error. Diagnostic: ${details}`\n\t\t\t\t\t\t\t\t\t: details;\n\t\t\t\t\t\t\tstatusErrors.push(`Vehicle status request failed for ${vehicle.vin}: ${diagnostic}`);\n\t\t\t\t\t\t\tthis.log.warn(\n\t\t\t\t\t\t\t\t`Could not retrieve current status for vehicle ${vehicle.vin}: ${diagnostic}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tlet cachedStatus: SaicVehicleStatus;\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tthis.log.debug(`Refreshing cached status as fallback for ${vehicle.vin}`);\n\t\t\t\t\t\t\t\tcachedStatus = await this.client.getCachedVehicleStatus(\n\t\t\t\t\t\t\t\t\tthis.loginOptions,\n\t\t\t\t\t\t\t\t\tthis.accessToken,\n\t\t\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} catch (cacheError) {\n\t\t\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconst cacheDetails = cacheError instanceof Error ? cacheError.message : 'Unknown error';\n\t\t\t\t\t\t\t\tstatusErrors.push(\n\t\t\t\t\t\t\t\t\t`Cached vehicle status request failed for ${vehicle.vin}: ${cacheDetails}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tthis.log.warn(\n\t\t\t\t\t\t\t\t\t`Could not retrieve cached status for vehicle ${vehicle.vin}: ${cacheDetails}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tif (EXPOSE_SOURCE_STATUS_DATAPOINTS) {\n\t\t\t\t\t\t\t\t\tawait this.createVehicleStatusObjects(\n\t\t\t\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\t\t\t\tcachedStatus,\n\t\t\t\t\t\t\t\t\t\t'cachedStatus',\n\t\t\t\t\t\t\t\t\t\t'cachedStatus',\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tawait this.createCanonicalVehicleStatusObjects(vehicle.vin, cachedStatus, 'cached');\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tconst writeDetails =\n\t\t\t\t\t\t\t\t\terror instanceof Error ? error.message : 'Unknown state write error';\n\t\t\t\t\t\t\t\tstatusErrors.push(`Could not write cached status for ${vehicle.vin}: ${writeDetails}`);\n\t\t\t\t\t\t\t\tthis.log.error(`Could not write cached status for ${vehicle.vin}: ${writeDetails}`);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif (!isVehicleStatusNotOlder(status.statusTime, this.lastStatusTimes.get(vehicle.vin))) {\n\t\t\t\t\t\tstatusErrors.push(`Ignored older live status for ${vehicle.vin}`);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (status.basicVehicleStatus.mileage === undefined) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst cachedStatus = await this.client.getCachedVehicleStatus(\n\t\t\t\t\t\t\t\tthis.loginOptions,\n\t\t\t\t\t\t\t\tthis.accessToken,\n\t\t\t\t\t\t\t\tvehicle.vin,\n\t\t\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tconst cachedMileage = cachedStatus.basicVehicleStatus.mileage;\n\t\t\t\t\t\t\tconst mileage = resolveOdometerValue(undefined, cachedMileage);\n\t\t\t\t\t\t\tif (mileage !== undefined) {\n\t\t\t\t\t\t\t\tstatus = {\n\t\t\t\t\t\t\t\t\t...status,\n\t\t\t\t\t\t\t\t\tbasicVehicleStatus: { ...status.basicVehicleStatus, mileage },\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tthis.log.debug(\n\t\t\t\t\t\t\t\t\t`Used cached odometer for ${vehicle.vin} because live status omitted mileage`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (cacheError) {\n\t\t\t\t\t\t\tif (this.stopping) {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst details = cacheError instanceof Error ? cacheError.message : 'Unknown cache error';\n\t\t\t\t\t\t\tthis.log.debug(`Could not retrieve cached odometer for ${vehicle.vin}: ${details}`);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.log.debug(\n\t\t\t\t\t\t\t`Received live status for ${vehicle.vin}: ${Object.keys(status.basicVehicleStatus).length} basic fields, statusTime ${status.statusTime ?? 'missing'}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (EXPOSE_SOURCE_STATUS_DATAPOINTS) {\n\t\t\t\t\t\t\tawait this.createVehicleStatusObjects(vehicle.vin, status, 'liveStatus', 'liveStatus');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait this.createCanonicalVehicleStatusObjects(vehicle.vin, status, 'live');\n\t\t\t\t\t\tif (!this.stopping && status.statusTime !== undefined) {\n\t\t\t\t\t\t\tthis.lastStatusTimes.set(vehicle.vin, status.statusTime);\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\tisVehicleStatusNotOlder(\n\t\t\t\t\t\t\t\t\tstatus.statusTime,\n\t\t\t\t\t\t\t\t\tthis.lastCanonicalStatusTimes.get(vehicle.vin),\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tthis.lastCanonicalStatusTimes.set(vehicle.vin, status.statusTime);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.log.debug(`Created/updated live status objects for ${vehicle.vin}`);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown state write error';\n\t\t\t\t\t\tstatusErrors.push(`Could not write live status for ${vehicle.vin}: ${details}`);\n\t\t\t\t\t\tthis.log.error(`Could not write live status for ${vehicle.vin}: ${details}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (this.refreshPollQueue.hasQueuedRefresh && followUpUsed) {\n\t\t\t\t\tthis.refreshPollQueue.clearQueuedRefresh();\n\t\t\t\t} else if (this.refreshPollQueue.hasQueuedRefresh) {\n\t\t\t\t\tfollowUpUsed = true;\n\t\t\t\t}\n\t\t\t} while (this.refreshPollQueue.hasQueuedRefresh && !this.stopping);\n\t\t\tif (!this.stopping) {\n\t\t\t\tawait this.setState('info.lastError', statusErrors.join('; '), true);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.refreshPollQueue.finish(\n\t\t\t\tthis.stopping,\n\t\t\t\t() => this.triggerRefresh(),\n\t\t\t\t() => this.scheduleNextPoll(),\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate onStateChange(id: string, state: ioBroker.State | null | undefined): void {\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tconst eventId = normalizeStateChangeId(id, this.namespace);\n\t\tif (isRefreshCommand(id, this.namespace, state)) {\n\t\t\tvoid this.setStateAsync('commands.refresh', { val: false, ack: true }).catch(error => {\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown state error';\n\t\t\t\tthis.log.error(`Could not acknowledge refresh command: ${details}`);\n\t\t\t});\n\t\t\tthis.triggerRefresh();\n\t\t\treturn;\n\t\t}\n\t\tif (!state || state.ack) {\n\t\t\treturn;\n\t\t}\n\t\tconst settingAction = settingActions.find(({ id: actionId }) =>\n\t\t\tthis.vehicles.some(({ vin }) => eventId === `${this.namespace}.${vehicleCommandPath(vin, actionId)}`),\n\t\t);\n\t\tconst settingVehicle = this.vehicles.find(\n\t\t\t({ vin }) => settingAction && eventId === `${this.namespace}.${vehicleCommandPath(vin, settingAction.id)}`,\n\t\t);\n\t\tif (settingAction && settingVehicle) {\n\t\t\tif (state.val === true) {\n\t\t\t\tvoid this.executeVehicleSetting(settingVehicle.vin, settingAction.id);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tconst settingInput = this.vehicles\n\t\t\t.flatMap(({ vin }) =>\n\t\t\t\tObject.keys(settingGroups)\n\t\t\t\t\t.filter(stateId => stateId !== 'driverSeatHeatLevel' && stateId !== 'passengerSeatHeatLevel')\n\t\t\t\t\t.map(stateId => ({ vin, stateId })),\n\t\t\t)\n\t\t\t.find(({ vin, stateId }) => eventId === `${this.namespace}.${vehicleCommandPath(vin, stateId)}`);\n\t\tif (settingInput) {\n\t\t\tconst stateId = vehicleCommandPath(settingInput.vin, settingInput.stateId);\n\t\t\tthis.pendingSettingEdits.set(stateId, ++this.settingEditSequence);\n\t\t\tvoid this.acknowledgeSettingEdit(stateId, state.val);\n\t\t\treturn;\n\t\t}\n\t\tconst seatHeating = this.vehicles\n\t\t\t.flatMap(({ vin }) =>\n\t\t\t\t(['driverSeatHeatLevel', 'passengerSeatHeatLevel'] as const).map(stateId => ({ vin, stateId })),\n\t\t\t)\n\t\t\t.find(({ vin, stateId }) => eventId === `${this.namespace}.${vehicleCommandPath(vin, stateId)}`);\n\t\tif (seatHeating) {\n\t\t\tconst seat = seatHeating.stateId === 'driverSeatHeatLevel' ? 'driver' : 'passenger';\n\t\t\tvoid this.executeSeatHeating(seatHeating.vin, seat, state.val);\n\t\t\treturn;\n\t\t}\n\t\tif (state.val !== true) {\n\t\t\treturn;\n\t\t}\n\t\tconst commandEntry = vehicleCommands.find(({ id: commandId }) =>\n\t\t\tthis.vehicles.some(({ vin }) => eventId === `${this.namespace}.${vehicleCommandPath(vin, commandId)}`),\n\t\t);\n\t\tconst vehicle = this.vehicles.find(\n\t\t\t({ vin }) => commandEntry && eventId === `${this.namespace}.${vehicleCommandPath(vin, commandEntry.id)}`,\n\t\t);\n\t\tif (!commandEntry || !vehicle) {\n\t\t\treturn;\n\t\t}\n\t\tvoid this.executeVehicleCommand(vehicle.vin, commandEntry.id);\n\t}\n\n\tprivate async acknowledgeSettingEdit(stateId: string, value: ioBroker.StateValue): Promise<void> {\n\t\ttry {\n\t\t\tawait this.persistPendingSettingEdits();\n\t\t\tawait this.setStateAsync(stateId, { val: value, ack: true });\n\t\t} catch (error) {\n\t\t\tconst details = error instanceof Error ? error.message : 'Unknown state error';\n\t\t\tthis.log.error(`Could not persist pending setting ${stateId}: ${details}`);\n\t\t}\n\t}\n\n\tprivate async persistPendingSettingEdits(): Promise<void> {\n\t\tconst write = this.pendingSettingEditsWrite\n\t\t\t.catch(() => undefined)\n\t\t\t.then(async () => {\n\t\t\t\tawait this.writePendingSettingEditsFile(serializePendingSettingEdits(this.pendingSettingEdits.keys()));\n\t\t\t});\n\t\tthis.pendingSettingEditsWrite = write;\n\t\tawait write;\n\t}\n\n\tprivate async migrateLegacyPendingSettingEdits(): Promise<void> {\n\t\tconst legacyObject = await this.getObjectAsync('internal.pendingSettingEdits');\n\t\tif (legacyObject) {\n\t\t\tconst legacyState = await this.getStateAsync('internal.pendingSettingEdits');\n\t\t\tconst savedFileValue = await this.readPendingSettingEditsFile();\n\t\t\tawait migrateLegacyPendingSettingEdits(\n\t\t\t\tsavedFileValue,\n\t\t\t\t{ exists: true, value: legacyState?.val },\n\t\t\t\tserialized => this.writePendingSettingEditsFile(serialized),\n\t\t\t\t() => this.delObjectAsync('internal.pendingSettingEdits'),\n\t\t\t);\n\t\t}\n\n\t\tconst internalObject = await this.getObjectAsync('internal');\n\t\tif (!internalObject) {\n\t\t\treturn;\n\t\t}\n\t\tconst children = await this.getObjectListAsync({\n\t\t\tstartkey: `${this.namespace}.internal.`,\n\t\t\tendkey: `${this.namespace}.internal.\\u9999`,\n\t\t});\n\t\tif (children.rows.length === 0) {\n\t\t\tawait this.delObjectAsync('internal');\n\t\t}\n\t}\n\n\tprivate async readPendingSettingEditsFile(): Promise<string | undefined> {\n\t\ttry {\n\t\t\treturn await readFile(this.getPendingSettingEditsFilePath(), 'utf8');\n\t\t} catch (error) {\n\t\t\tif (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tprivate async writePendingSettingEditsFile(serialized: string): Promise<void> {\n\t\tconst directory = utils.getAbsoluteInstanceDataDir(this);\n\t\tawait mkdir(directory, { recursive: true });\n\t\tawait writeFile(this.getPendingSettingEditsFilePath(), serialized, 'utf8');\n\t}\n\n\tprivate getPendingSettingEditsFilePath(): string {\n\t\treturn join(utils.getAbsoluteInstanceDataDir(this), PENDING_SETTING_EDITS_FILE);\n\t}\n\n\tprivate async restorePendingSettingEdits(): Promise<void> {\n\t\tconst validStateIds = new Set(\n\t\t\tthis.vehicles.flatMap(({ vin }) =>\n\t\t\t\tObject.keys(settingGroups)\n\t\t\t\t\t.filter(stateId => stateId !== 'driverSeatHeatLevel' && stateId !== 'passengerSeatHeatLevel')\n\t\t\t\t\t.map(stateId => vehicleCommandPath(vin, stateId)),\n\t\t\t),\n\t\t);\n\t\tconst savedFileValue = await this.readPendingSettingEditsFile();\n\t\tfor (const stateId of parsePendingSettingEdits(savedFileValue, validStateIds)) {\n\t\t\tthis.pendingSettingEdits.set(stateId, ++this.settingEditSequence);\n\t\t}\n\t\tfor (const stateId of validStateIds) {\n\t\t\tconst currentState = await this.getStateAsync(stateId);\n\t\t\tif (currentState && !currentState.ack && !this.pendingSettingEdits.has(stateId)) {\n\t\t\t\tthis.pendingSettingEdits.set(stateId, ++this.settingEditSequence);\n\t\t\t}\n\t\t}\n\t\tawait this.persistPendingSettingEdits();\n\t}\n\n\tprivate async executeSeatHeating(\n\t\tvin: string,\n\t\tseat: 'driver' | 'passenger',\n\t\tvalue: ioBroker.StateValue,\n\t): Promise<void> {\n\t\tconst stateId = vehicleCommandPath(vin, `${seat}SeatHeatLevel`);\n\t\tif (typeof value !== 'number' || !Number.isInteger(value) || value < 0 || value > 3) {\n\t\t\tawait this.setStateAsync(stateId, { ack: true });\n\t\t\tthis.log.warn(`Ignored ${seat} seat heating level for ${vin}: expected an integer from 0 to 3`);\n\t\t\treturn;\n\t\t}\n\t\tif (this.vehicleCommandsInProgress.has(vin)) {\n\t\t\tawait this.setStateAsync(stateId, { ack: true });\n\t\t\tthis.log.warn(`Ignored ${seat} seat heating for ${vin}: another vehicle command is still running`);\n\t\t\treturn;\n\t\t}\n\t\tthis.vehicleCommandsInProgress.add(vin);\n\t\ttry {\n\t\t\tif (!this.client || !this.loginOptions) {\n\t\t\t\tthrow new Error('SAIC client is not initialized');\n\t\t\t}\n\t\t\tif (!this.accessToken || this.accessTokenExpiresAt <= Date.now() + 30_000) {\n\t\t\t\tawait this.authenticate();\n\t\t\t}\n\t\t\tawait this.client.sendVehicleSeatHeating(\n\t\t\t\tthis.loginOptions,\n\t\t\t\tthis.accessToken!,\n\t\t\t\tvin,\n\t\t\t\tseat,\n\t\t\t\tvalue,\n\t\t\t\tthis.abortController.signal,\n\t\t\t);\n\t\t\tawait this.setStateAsync(stateId, { val: value, ack: true });\n\t\t\tthis.log.info(`SAIC ${seat} seat heating level ${value} completed for ${vin}`);\n\t\t} catch (error) {\n\t\t\tif (!this.stopping) {\n\t\t\t\tawait this.setStateAsync(stateId, { val: value, ack: true });\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown command error';\n\t\t\t\tthis.log.warn(`SAIC ${seat} seat heating failed for ${vin}: ${details}`);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.vehicleCommandsInProgress.delete(vin);\n\t\t}\n\t}\n\n\tprivate async executeVehicleSetting(vin: string, action: SettingAction): Promise<void> {\n\t\tconst stateId = vehicleCommandPath(vin, action);\n\t\tconst editVersions = new Map(\n\t\t\tsettingInputsByAction[action]\n\t\t\t\t.map(settingId => vehicleCommandPath(vin, settingId))\n\t\t\t\t.filter(settingId => this.pendingSettingEdits.has(settingId))\n\t\t\t\t.map(settingId => [settingId, this.pendingSettingEdits.get(settingId)!]),\n\t\t);\n\t\tif (this.vehicleCommandsInProgress.has(vin)) {\n\t\t\tawait this.setStateAsync(stateId, { val: false, ack: true });\n\t\t\tthis.log.warn(`Ignored ${action} for ${vin}: another vehicle command is still running`);\n\t\t\treturn;\n\t\t}\n\t\tthis.vehicleCommandsInProgress.add(vin);\n\t\ttry {\n\t\t\tawait this.setStateAsync(stateId, { val: false, ack: true });\n\t\t\tif (!this.client || !this.loginOptions) {\n\t\t\t\tthrow new Error('SAIC client is not initialized');\n\t\t\t}\n\t\t\tconst setting = await this.readVehicleSetting(vin, action);\n\t\t\tif (!this.accessToken || this.accessTokenExpiresAt <= Date.now() + 30_000) {\n\t\t\t\tawait this.authenticate();\n\t\t\t}\n\t\t\tawait this.client.sendVehicleSetting(\n\t\t\t\tthis.loginOptions,\n\t\t\t\tthis.accessToken!,\n\t\t\t\tvin,\n\t\t\t\tsetting,\n\t\t\t\tthis.abortController.signal,\n\t\t\t);\n\t\t\tconst clearedEdits: Array<[string, number]> = [];\n\t\t\tfor (const [settingId, version] of editVersions) {\n\t\t\t\tif (this.pendingSettingEdits.get(settingId) === version) {\n\t\t\t\t\tthis.pendingSettingEdits.delete(settingId);\n\t\t\t\t\tclearedEdits.push([settingId, version]);\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.persistPendingSettingEdits();\n\t\t\t} catch (error) {\n\t\t\t\tfor (const [settingId, version] of clearedEdits) {\n\t\t\t\t\tif (!this.pendingSettingEdits.has(settingId)) {\n\t\t\t\t\t\tthis.pendingSettingEdits.set(settingId, version);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown state error';\n\t\t\t\tthis.log.warn(\n\t\t\t\t\t`SAIC ${action} completed for ${vin}, but pending edits could not be persisted: ${details}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.log.info(`SAIC ${action} completed for ${vin}`);\n\t\t} catch (error) {\n\t\t\tif (!this.stopping) {\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown settings error';\n\t\t\t\tthis.log.warn(`SAIC ${action} failed for ${vin}: ${details}`);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.vehicleCommandsInProgress.delete(vin);\n\t\t}\n\t}\n\n\tprivate async readVehicleSetting(vin: string, action: SettingAction): Promise<SaicVehicleSetting> {\n\t\tconst readNumber = async (id: string): Promise<number> => {\n\t\t\tconst state = await this.getStateAsync(vehicleCommandPath(vin, id));\n\t\t\tif (!state || typeof state.val !== 'number' || !Number.isFinite(state.val)) {\n\t\t\t\tthrow new Error(`Setting ${id} must contain a finite number`);\n\t\t\t}\n\t\t\treturn state.val;\n\t\t};\n\t\tconst readString = async (id: string): Promise<string> => {\n\t\t\tconst state = await this.getStateAsync(vehicleCommandPath(vin, id));\n\t\t\tif (!state || typeof state.val !== 'string') {\n\t\t\t\tthrow new Error(`Setting ${id} must contain a time in HH:MM format`);\n\t\t\t}\n\t\t\treturn state.val;\n\t\t};\n\t\tif (action === 'climateTemperatureApply') {\n\t\t\tconst vehicle = this.vehicles.find(item => item.vin === vin);\n\t\t\treturn {\n\t\t\t\ttype: 'climateTemperature',\n\t\t\t\tvalue: climateTemperatureToIndex(await readNumber('climateTemperature'), vehicle?.series),\n\t\t\t};\n\t\t}\n\t\tif (action === 'chargingSettingsApply') {\n\t\t\treturn {\n\t\t\t\ttype: 'chargingSettings',\n\t\t\t\ttargetSoc: targetSocPercentToCode(await readNumber('chargeTargetSoc')),\n\t\t\t\tcurrentLimit: await readNumber('chargingCurrentLimit'),\n\t\t\t};\n\t\t}\n\t\tif (action === 'chargingScheduleApply') {\n\t\t\treturn {\n\t\t\t\ttype: 'chargingSchedule',\n\t\t\t\tstart: await readString('chargingScheduleStart'),\n\t\t\t\tend: await readString('chargingScheduleEnd'),\n\t\t\t\tmode: await readNumber('chargingScheduleMode'),\n\t\t\t};\n\t\t}\n\t\tconst enabled = await this.getStateAsync(vehicleCommandPath(vin, 'batteryHeatingScheduleEnabled'));\n\t\tif (!enabled || typeof enabled.val !== 'boolean') {\n\t\t\tthrow new Error('Battery heating schedule enabled must be boolean');\n\t\t}\n\t\treturn {\n\t\t\ttype: 'batteryHeatingSchedule',\n\t\t\tenabled: enabled.val,\n\t\t\tstart: await readString('batteryHeatingScheduleStart'),\n\t\t};\n\t}\n\n\tprivate async executeVehicleCommand(vin: string, command: SaicVehicleCommand): Promise<void> {\n\t\tconst stateId = vehicleCommandPath(vin, command);\n\t\tif (this.vehicleCommandsInProgress.has(vin)) {\n\t\t\tawait this.setStateAsync(stateId, { val: false, ack: true });\n\t\t\tthis.log.warn(`Ignored ${command} command for ${vin}: another vehicle command is still running`);\n\t\t\treturn;\n\t\t}\n\t\tthis.vehicleCommandsInProgress.add(vin);\n\t\ttry {\n\t\t\tawait this.setStateAsync(stateId, { val: false, ack: true });\n\t\t\tif (!this.client || !this.loginOptions) {\n\t\t\t\tthrow new Error('SAIC client is not initialized');\n\t\t\t}\n\t\t\tif (!this.accessToken || this.accessTokenExpiresAt <= Date.now() + 30_000) {\n\t\t\t\tawait this.authenticate();\n\t\t\t}\n\t\t\tawait this.client.sendVehicleCommand(\n\t\t\t\tthis.loginOptions,\n\t\t\t\tthis.accessToken!,\n\t\t\t\tvin,\n\t\t\t\tcommand,\n\t\t\t\tthis.abortController.signal,\n\t\t\t);\n\t\t\tthis.log.info(`SAIC ${command} command completed for ${vin}`);\n\t\t} catch (error) {\n\t\t\tif (!this.stopping) {\n\t\t\t\tconst details = error instanceof Error ? error.message : 'Unknown command error';\n\t\t\t\tthis.log.warn(`SAIC ${command} command failed for ${vin}: ${details}`);\n\t\t\t}\n\t\t} finally {\n\t\t\tthis.vehicleCommandsInProgress.delete(vin);\n\t\t}\n\t}\n\n\tprivate async getVehicleStatusFieldIds(channelId: string): Promise<Map<string, string>> {\n\t\tconst cachedIds = this.vehicleStatusFieldIds.get(channelId);\n\t\tif (cachedIds) {\n\t\t\treturn cachedIds;\n\t\t}\n\t\tconst objectIdPrefix = `${this.namespace}.${channelId}.`;\n\t\tconst objects = await this.getObjectListAsync({\n\t\t\tstartkey: objectIdPrefix,\n\t\t\tendkey: `${objectIdPrefix}\\u9999`,\n\t\t});\n\t\tconst stateIds = objects.rows\n\t\t\t.filter(row => row.value.type === 'state' && row.id.startsWith(`${this.namespace}.`))\n\t\t\t.map(row => row.id.slice(this.namespace.length + 1));\n\t\tconst fieldIds = indexVehicleStatusFieldIds(stateIds, channelId);\n\t\tthis.vehicleStatusFieldIds.set(channelId, fieldIds);\n\t\treturn fieldIds;\n\t}\n\n\tprivate async createVehicleStatusObjects(\n\t\tvin: string,\n\t\tstatus: SaicVehicleStatus,\n\t\tchannel = 'status',\n\t\tchannelName = 'currentStatus',\n\t): Promise<void> {\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tif (!EXPOSE_SOURCE_STATUS_DATAPOINTS && (channel === 'liveStatus' || channel === 'cachedStatus')) {\n\t\t\treturn;\n\t\t}\n\t\tconst statusId = `vehicles.${vin}.${channel}`;\n\t\tawait this.setObjectNotExistsAsync(statusId, {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: getRuntimeName(channelName) },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.extendObjectAsync(statusId, { common: { name: getRuntimeName(channelName) } });\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tconst fieldIds = await this.getVehicleStatusFieldIds(statusId);\n\t\tfor (const key of excludedVehicleStatusFields) {\n\t\t\tconst stateId = resolveVehicleStatusFieldId(fieldIds, statusId, getVehicleStatusGroup(key), key);\n\t\t\tawait this.delObjectAsync(stateId);\n\t\t}\n\n\t\tconst values: Record<string, number | undefined> = { ...status.basicVehicleStatus };\n\t\tif (status.statusTime !== undefined) {\n\t\t\tvalues.statusTime = status.statusTime;\n\t\t}\n\t\tif (status.onlineStatus !== undefined) {\n\t\t\tvalues.onlineStatus = status.onlineStatus;\n\t\t}\n\t\tthis.log.debug(`Writing ${Object.keys(values).length} values under ${statusId}`);\n\t\tfor (const [key, value] of Object.entries(values)) {\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst stateId = resolveVehicleStatusFieldId(fieldIds, statusId, getVehicleStatusGroup(key), key);\n\t\t\tconst separator = stateId.lastIndexOf('.');\n\t\t\tconst fieldName = stateId.slice(separator + 1);\n\t\t\tconst groupId = stateId.slice(0, separator);\n\t\t\tconst group = groupId.slice(statusId.length + 1);\n\t\t\tif (\n\t\t\t\texcludedVehicleStatusFields.some(excludedKey => excludedKey.toLowerCase() === fieldName.toLowerCase())\n\t\t\t) {\n\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (value === undefined) {\n\t\t\t\tif (shouldDeleteUnavailableStatusValue(fieldName)) {\n\t\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\t} else {\n\t\t\t\t\tconst previousState = await this.getStateAsync(stateId);\n\t\t\t\t\tif (previousState?.val === null) {\n\t\t\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst normalizedValue = normalizeVehicleStatusValue(fieldName, value);\n\t\t\tif (normalizedValue === undefined) {\n\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tawait this.setObjectNotExistsAsync(groupId, {\n\t\t\t\ttype: 'channel',\n\t\t\t\tcommon: { name: getRuntimeName(group) },\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(groupId, { common: { name: getRuntimeName(group) } });\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst metadata = getVehicleStatusMetadata(fieldName);\n\t\t\tconst common = {\n\t\t\t\tname: metadata.name,\n\t\t\t\ttype: metadata.type,\n\t\t\t\trole: metadata.role,\n\t\t\t\tread: true,\n\t\t\t\twrite: false,\n\t\t\t\t...(metadata.unit ? { unit: metadata.unit } : {}),\n\t\t\t};\n\t\t\tawait this.setObjectNotExistsAsync(stateId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon,\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.extendObjectAsync(stateId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon,\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.setStateAsync(stateId, { val: normalizedValue, ack: true });\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst seatSetting =\n\t\t\t\tfieldName === 'frontLeftSeatHeatLevel'\n\t\t\t\t\t? 'driverSeatHeatLevel'\n\t\t\t\t\t: fieldName === 'frontRightSeatHeatLevel'\n\t\t\t\t\t\t? 'passengerSeatHeatLevel'\n\t\t\t\t\t\t: undefined;\n\t\t\tif (seatSetting && Number.isInteger(value) && value >= 0 && value <= 3) {\n\t\t\t\tconst settingId = vehicleCommandPath(vin, seatSetting);\n\t\t\t\tconst settingState = await this.getStateAsync(settingId);\n\t\t\t\tif (!settingState || settingState.ack) {\n\t\t\t\t\tawait this.setStateAsync(settingId, { val: value, ack: true });\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.delObjectAsync(`${statusId}.${fieldName}`);\n\t\t}\n\t}\n\n\tprivate async createVehicleChargingObjects(\n\t\tvin: string,\n\t\tcharging: SaicChargingStatus,\n\t\tseries?: string,\n\t): Promise<void> {\n\t\tawait this.ensureVehicleChargingGroups(vin);\n\t\tconst rootId = `vehicles.${vin}.status.charging`;\n\t\tconst existingObjects = await this.getObjectListAsync({\n\t\t\tstartkey: `${this.namespace}.${rootId}.`,\n\t\t\tendkey: `${this.namespace}.${rootId}.\\u9999`,\n\t\t});\n\t\tconst existingFieldIds = new Map<string, string[]>(chargingGroups.map(({ id }) => [id, []]));\n\t\tfor (const { id: objectId, value: object } of existingObjects.rows) {\n\t\t\tif (object.type !== 'state') {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst group = chargingGroups.find(({ id }) => objectId.startsWith(`${this.namespace}.${rootId}.${id}.`));\n\t\t\tif (!group) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst prefix = `${this.namespace}.${rootId}.${group.id}.`;\n\t\t\tconst fieldId = objectId.slice(prefix.length);\n\t\t\tif (fieldId && !fieldId.includes('.')) {\n\t\t\t\texistingFieldIds.get(group.id)?.push(fieldId);\n\t\t\t}\n\t\t}\n\t\tfor (const { source, id } of chargingGroups) {\n\t\t\tconst groupId = `${rootId}.${id}`;\n\t\t\tconst excludedFields = id === 'session' ? excludedChargingSessionFields : excludedChargingStatisticsFields;\n\t\t\tconst fields =\n\t\t\t\tsource === 'chrgMgmtData'\n\t\t\t\t\t? getChargingManagementFields(charging.chrgMgmtData)\n\t\t\t\t\t: getChargingStatisticsFields(charging[source]);\n\t\t\tfor (const field of excludedFields) {\n\t\t\t\tawait this.delObjectAsync(`${groupId}.${field}`);\n\t\t\t}\n\t\t\tconst valuesByField = new Map(fields);\n\t\t\tconst resolvedFieldIds = resolveChargingFieldIds(\n\t\t\t\tfields.map(([field]) => field),\n\t\t\t\texistingFieldIds.get(id) ?? [],\n\t\t\t);\n\t\t\tfor (const [responseField, field] of resolvedFieldIds) {\n\t\t\t\tif (this.stopping) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst value = valuesByField.get(responseField);\n\t\t\t\tconst canonicalField = resolveChargingFieldName(field);\n\t\t\t\tif (excludedFields.some(excludedField => excludedField === canonicalField)) {\n\t\t\t\t\tawait this.delObjectAsync(`${groupId}.${field}`);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst stateId = `${groupId}.${field}`;\n\t\t\t\tif (\n\t\t\t\t\tvalue === undefined &&\n\t\t\t\t\tcanonicalField !== 'realtimePower' &&\n\t\t\t\t\tcanonicalField !== 'batteryAvailableEnergy'\n\t\t\t\t) {\n\t\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst normalizedValue =\n\t\t\t\t\tcanonicalField === 'realtimePower'\n\t\t\t\t\t\t? calculateRealtimePower(charging.chrgMgmtData.bmsPackCrnt, charging.chrgMgmtData.bmsPackVol)\n\t\t\t\t\t\t: value === undefined\n\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t: normalizeChargingValue(canonicalField, value, series);\n\t\t\t\tif (normalizedValue === undefined && canonicalField !== 'batteryAvailableEnergy') {\n\t\t\t\t\tawait this.delObjectAsync(stateId);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst metadata = getChargingFieldMetadata(canonicalField, series);\n\t\t\t\tconst common: ioBroker.StateCommon = {\n\t\t\t\t\tname: getChargingFieldName(canonicalField),\n\t\t\t\t\ttype:\n\t\t\t\t\t\tmetadata.type === 'boolean'\n\t\t\t\t\t\t\t? 'boolean'\n\t\t\t\t\t\t\t: typeof normalizedValue === 'string'\n\t\t\t\t\t\t\t\t? 'string'\n\t\t\t\t\t\t\t\t: 'number',\n\t\t\t\t\trole: typeof normalizedValue === 'string' ? 'text' : metadata.role,\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: false,\n\t\t\t\t};\n\t\t\t\tif (metadata.unit) {\n\t\t\t\t\tcommon.unit = metadata.unit;\n\t\t\t\t}\n\t\t\t\tawait this.setObjectNotExistsAsync(stateId, { type: 'state', common, native: {} });\n\t\t\t\tawait this.extendObjectAsync(stateId, { common });\n\t\t\t\tif (normalizedValue === undefined) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tawait this.setStateAsync(stateId, {\n\t\t\t\t\tval: normalizedValue,\n\t\t\t\t\tack: true,\n\t\t\t\t});\n\t\t\t\tif (field === 'bmsOnBdChrgTrgtSOCDspCmd' && typeof value === 'number' && value >= 1 && value <= 7) {\n\t\t\t\t\tconst targetSocId = vehicleCommandPath(vin, 'chargeTargetSoc');\n\t\t\t\t\tconst targetSocState = await this.getStateAsync(targetSocId);\n\t\t\t\t\tif (shouldApplySettingFeedback(targetSocState, this.pendingSettingEdits.has(targetSocId))) {\n\t\t\t\t\t\tawait this.setStateAsync(targetSocId, {\n\t\t\t\t\t\t\tval: normalizeChargingValue(field, value, series) as number,\n\t\t\t\t\t\t\tack: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst capacityState = await this.getStateAsync(`${rootId}.statistics.totalBatteryCapacity`);\n\t\tconst socState = await this.getStateAsync(`${rootId}.session.bmsPackSOCDsp`);\n\t\tconst availableEnergy = calculateAvailableBatteryEnergy(\n\t\t\tcapacityState?.val,\n\t\t\tsocState?.val,\n\t\t\tcharging.rvsChargeStatus.packEnergyKwh,\n\t\t);\n\t\tif (availableEnergy !== undefined) {\n\t\t\tawait this.setStateAsync(`${rootId}.statistics.batteryAvailableEnergy`, {\n\t\t\t\tval: availableEnergy,\n\t\t\t\tack: true,\n\t\t\t});\n\t\t} else {\n\t\t\tawait this.setStateAsync(`${rootId}.statistics.batteryAvailableEnergy`, {\n\t\t\t\tval: null,\n\t\t\t\tack: true,\n\t\t\t});\n\t\t}\n\t\tfor (const [setting, value] of Object.entries(getChargingSettingFeedback(charging.chrgMgmtData))) {\n\t\t\tconst stateId = vehicleCommandPath(vin, setting);\n\t\t\tconst state = await this.getStateAsync(stateId);\n\t\t\tif (shouldApplySettingFeedback(state, this.pendingSettingEdits.has(stateId))) {\n\t\t\t\tawait this.setStateAsync(stateId, { val: value, ack: true });\n\t\t\t}\n\t\t}\n\t\tawait this.delObjectAsync(`vehicles.${vin}.charging`, { recursive: true });\n\t}\n\n\tprivate async ensureVehicleChargingGroups(vin: string): Promise<void> {\n\t\tconst statusId = `vehicles.${vin}.status`;\n\t\tconst rootId = `${statusId}.charging`;\n\t\tawait this.setObjectNotExistsAsync(statusId, {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: getRuntimeName('currentStatus') },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.setObjectNotExistsAsync(rootId, {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: getRuntimeName('commandGroup_charging') },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.extendObjectAsync(rootId, { common: { name: getRuntimeName('commandGroup_charging') } });\n\t\tfor (const { source, id, name } of chargingGroups) {\n\t\t\tconst groupId = `${rootId}.${id}`;\n\t\t\tconst groupName = getRuntimeName(name);\n\t\t\tawait this.setObjectNotExistsAsync(groupId, {\n\t\t\t\ttype: 'channel',\n\t\t\t\tcommon: { name: groupName },\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(groupId, { common: { name: groupName } });\n\t\t\tawait this.delObjectAsync(`${rootId}.${source}`, { recursive: true });\n\t\t}\n\t}\n\n\tprivate async createCanonicalVehicleStatusObjects(\n\t\tvin: string,\n\t\tstatus: SaicVehicleStatus,\n\t\tsource: 'live' | 'cached',\n\t): Promise<void> {\n\t\tif (this.stopping || !isVehicleStatusNotOlder(status.statusTime, this.lastCanonicalStatusTimes.get(vin))) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.createVehicleStatusObjects(vin, status);\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tconst sourceId = `vehicles.${vin}.status.source`;\n\t\tawait this.setObjectNotExistsAsync(sourceId, {\n\t\t\ttype: 'state',\n\t\t\tcommon: { name: getRuntimeName('statusSource'), type: 'string', role: 'text', read: true, write: false },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.extendObjectAsync(sourceId, { common: { name: getRuntimeName('statusSource') } });\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.setStateAsync(sourceId, { val: source, ack: true });\n\t\tif (status.statusTime !== undefined) {\n\t\t\tconst sourceTimestampId = `vehicles.${vin}.status.sourceTimestamp`;\n\t\t\tawait this.setObjectNotExistsAsync(sourceTimestampId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: {\n\t\t\t\t\tname: getRuntimeName('statusSourceTimestamp'),\n\t\t\t\t\ttype: 'number',\n\t\t\t\t\trole: 'date',\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: false,\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(sourceTimestampId, {\n\t\t\t\tcommon: { name: getRuntimeName('statusSourceTimestamp') },\n\t\t\t});\n\t\t\tawait this.setStateAsync(sourceTimestampId, { val: status.statusTime * 1000, ack: true });\n\t\t\tthis.lastCanonicalStatusTimes.set(vin, status.statusTime);\n\t\t}\n\t}\n\n\tprivate async createVehicleObjects(vehicle: SaicVehicle): Promise<void> {\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tconst deviceId = `vehicles.${vehicle.vin}`;\n\t\tconst values: Record<string, string | boolean | undefined> = {\n\t\t\tvin: vehicle.vin,\n\t\t\tname: vehicle.name,\n\t\t\tbrandName: vehicle.brandName,\n\t\t\tmodelName: vehicle.modelName,\n\t\t\tseries: vehicle.series,\n\t\t\tmodelYear: vehicle.modelYear,\n\t\t\tcolorName: vehicle.colorName,\n\t\t\tisCurrentVehicle: vehicle.isCurrentVehicle,\n\t\t\tisSubaccount: vehicle.isSubaccount,\n\t\t};\n\n\t\tawait this.setObjectNotExistsAsync(deviceId, {\n\t\t\ttype: 'device',\n\t\t\tcommon: { name: vehicle.name || vehicle.modelName || vehicle.vin },\n\t\t\tnative: {},\n\t\t});\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tawait this.ensureVehicleChargingGroups(vehicle.vin);\n\t\tconst commandsId = `${deviceId}.commands`;\n\t\tawait this.setObjectNotExistsAsync(commandsId, {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: getRuntimeName('commands') },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.extendObjectAsync(commandsId, { common: { name: getRuntimeName('commands') } });\n\t\tfor (const group of ['access', 'climate', 'heating', 'charging', 'schedules', 'vehicle']) {\n\t\t\tconst groupId = `${commandsId}.${group}`;\n\t\t\tconst groupName = getRuntimeName(`commandGroup_${group}`);\n\t\t\tawait this.setObjectNotExistsAsync(groupId, {\n\t\t\t\ttype: 'channel',\n\t\t\t\tcommon: { name: groupName },\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(groupId, { common: { name: groupName } });\n\t\t}\n\t\tfor (const command of vehicleCommands) {\n\t\t\tconst commandId = vehicleCommandPath(vehicle.vin, command.id);\n\t\t\tawait this.setObjectNotExistsAsync(commandId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: {\n\t\t\t\t\tname: getRuntimeName(command.id),\n\t\t\t\t\ttype: 'boolean',\n\t\t\t\t\trole: 'button',\n\t\t\t\t\tread: false,\n\t\t\t\t\twrite: true,\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(commandId, {\n\t\t\t\tcommon: { name: getRuntimeName(command.id) },\n\t\t\t});\n\t\t\tawait this.setStateAsync(commandId, { val: false, ack: true });\n\t\t}\n\t\tconst settingStates: Array<{\n\t\t\tid: string;\n\t\t\ttype: 'number' | 'string' | 'boolean';\n\t\t\trole: string;\n\t\t\tdef: number | string | boolean;\n\t\t\tmin?: number;\n\t\t\tmax?: number;\n\t\t\tstep?: number;\n\t\t\tunit?: string;\n\t\t\tstates?: Record<string, string>;\n\t\t}> = [\n\t\t\t{\n\t\t\t\tid: 'driverSeatHeatLevel',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level',\n\t\t\t\tdef: 0,\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 3,\n\t\t\t\tstates: { 0: 'Off', 1: 'Low', 2: 'Medium', 3: 'High' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'passengerSeatHeatLevel',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level',\n\t\t\t\tdef: 0,\n\t\t\t\tmin: 0,\n\t\t\t\tmax: 3,\n\t\t\t\tstates: { 0: 'Off', 1: 'Low', 2: 'Medium', 3: 'High' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'climateTemperature',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level.temperature',\n\t\t\t\tdef: 22,\n\t\t\t\tmin: getClimateTemperatureRange(vehicle.series).min,\n\t\t\t\tmax: getClimateTemperatureRange(vehicle.series).max,\n\t\t\t\tunit: '\u00B0C',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'chargeTargetSoc',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level',\n\t\t\t\tdef: 80,\n\t\t\t\tmin: 40,\n\t\t\t\tmax: 100,\n\t\t\t\tstep: 10,\n\t\t\t\tunit: '%',\n\t\t\t\tstates: { 40: '40%', 50: '50%', 60: '60%', 70: '70%', 80: '80%', 90: '90%', 100: '100%' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'chargingCurrentLimit',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level',\n\t\t\t\tdef: 4,\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 4,\n\t\t\t\tstates: { 1: '6 A', 2: '8 A', 3: '16 A', 4: 'Maximum' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'chargingScheduleStart',\n\t\t\t\ttype: 'string',\n\t\t\t\trole: 'text',\n\t\t\t\tdef: '00:00',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'chargingScheduleEnd',\n\t\t\t\ttype: 'string',\n\t\t\t\trole: 'text',\n\t\t\t\tdef: '06:00',\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'chargingScheduleMode',\n\t\t\t\ttype: 'number',\n\t\t\t\trole: 'level',\n\t\t\t\tdef: 2,\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 3,\n\t\t\t\tstates: { 1: 'Until configured time', 2: 'Disabled', 3: 'Until configured SOC' },\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'batteryHeatingScheduleEnabled',\n\t\t\t\ttype: 'boolean',\n\t\t\t\trole: 'switch',\n\t\t\t\tdef: false,\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: 'batteryHeatingScheduleStart',\n\t\t\t\ttype: 'string',\n\t\t\t\trole: 'text',\n\t\t\t\tdef: '00:00',\n\t\t\t},\n\t\t];\n\t\tfor (const setting of settingStates) {\n\t\t\tconst stateId = vehicleCommandPath(vehicle.vin, setting.id);\n\t\t\tconst legacyStateId = `${commandsId}.${setting.id}`;\n\t\t\tconst stateObject = await this.getObjectAsync(stateId);\n\t\t\tconst legacyState = await this.getStateAsync(legacyStateId);\n\t\t\tconst previousScheduleState = setting.id.startsWith('chargingSchedule')\n\t\t\t\t? await this.getStateAsync(`${commandsId}.schedules.${setting.id}`)\n\t\t\t\t: null;\n\t\t\tawait this.setObjectNotExistsAsync(stateId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: {\n\t\t\t\t\tname: getRuntimeName(setting.id),\n\t\t\t\t\ttype: setting.type,\n\t\t\t\t\trole: setting.role,\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: true,\n\t\t\t\t\tdef: setting.def,\n\t\t\t\t\t...(setting.min === undefined ? {} : { min: setting.min }),\n\t\t\t\t\t...(setting.max === undefined ? {} : { max: setting.max }),\n\t\t\t\t\t...(setting.step === undefined ? {} : { step: setting.step }),\n\t\t\t\t\t...(setting.unit === undefined ? {} : { unit: setting.unit }),\n\t\t\t\t\t...(setting.states ? { states: setting.states } : {}),\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tconst currentState = await this.getStateAsync(stateId);\n\t\t\tif (!currentState || currentState.val === null) {\n\t\t\t\tawait this.setStateAsync(stateId, {\n\t\t\t\t\tval: legacyState?.val ?? previousScheduleState?.val ?? setting.def,\n\t\t\t\t\tack: true,\n\t\t\t\t});\n\t\t\t} else if (typeof currentState.val === 'number' && stateObject?.common.unit !== setting.unit) {\n\t\t\t\tif (setting.id === 'chargeTargetSoc' && currentState.val >= 1 && currentState.val <= 7) {\n\t\t\t\t\tawait this.setStateAsync(stateId, { val: (currentState.val + 3) * 10, ack: true });\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait this.extendObjectAsync(stateId, {\n\t\t\t\tcommon: {\n\t\t\t\t\tname: getRuntimeName(setting.id),\n\t\t\t\t\ttype: setting.type,\n\t\t\t\t\trole: setting.role,\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: true,\n\t\t\t\t\tdef: setting.def,\n\t\t\t\t\t...(setting.min === undefined ? {} : { min: setting.min }),\n\t\t\t\t\t...(setting.max === undefined ? {} : { max: setting.max }),\n\t\t\t\t\t...(setting.step === undefined ? {} : { step: setting.step }),\n\t\t\t\t\t...(setting.unit === undefined ? {} : { unit: setting.unit }),\n\t\t\t\t\t...(setting.states ? { states: setting.states } : {}),\n\t\t\t\t},\n\t\t\t});\n\t\t\tawait this.delObjectAsync(legacyStateId);\n\t\t}\n\t\tfor (const action of settingActions) {\n\t\t\tconst actionId = vehicleCommandPath(vehicle.vin, action.id);\n\t\t\tawait this.setObjectNotExistsAsync(actionId, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: { name: getRuntimeName(action.id), type: 'boolean', role: 'button', read: false, write: true },\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(actionId, {\n\t\t\t\tcommon: { name: getRuntimeName(action.id) },\n\t\t\t});\n\t\t\tawait this.setStateAsync(actionId, { val: false, ack: true });\n\t\t\tawait this.delObjectAsync(`${commandsId}.${action.id}`);\n\t\t}\n\t\tfor (const id of [\n\t\t\t'chargingScheduleStart',\n\t\t\t'chargingScheduleEnd',\n\t\t\t'chargingScheduleMode',\n\t\t\t'chargingScheduleApply',\n\t\t]) {\n\t\t\tawait this.delObjectAsync(`${commandsId}.schedules.${id}`);\n\t\t}\n\t\tfor (const command of vehicleCommands) {\n\t\t\tawait this.delObjectAsync(`${commandsId}.${command.id}`);\n\t\t}\n\t\tthis.subscribeStates(`${commandsId}.*`);\n\t\tif (this.stopping) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const [key, value] of Object.entries(values)) {\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (value === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isBoolean = typeof value === 'boolean';\n\t\t\tconst name = getRuntimeName(key);\n\t\t\tawait this.setObjectNotExistsAsync(`${deviceId}.${key}`, {\n\t\t\t\ttype: 'state',\n\t\t\t\tcommon: {\n\t\t\t\t\tname,\n\t\t\t\t\ttype: isBoolean ? 'boolean' : 'string',\n\t\t\t\t\trole: isBoolean ? 'indicator' : key === 'vin' ? 'text' : 'info.name',\n\t\t\t\t\tread: true,\n\t\t\t\t\twrite: false,\n\t\t\t\t},\n\t\t\t\tnative: {},\n\t\t\t});\n\t\t\tawait this.extendObjectAsync(`${deviceId}.${key}`, { common: { name } });\n\t\t\tif (this.stopping) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.setStateAsync(`${deviceId}.${key}`, { val: value, ack: true });\n\t\t}\n\t}\n\n\tprivate onUnload(callback: () => void): void {\n\t\tif (this.unloadCallbackCalled) {\n\t\t\treturn;\n\t\t}\n\t\tthis.unloadCallbackCalled = true;\n\t\tthis.stopping = true;\n\t\tthis.abortController.abort(new DOMException('Adapter is stopping', 'AbortError'));\n\t\tthis.refreshPollQueue.clearQueuedRefresh();\n\t\tthis.pollTimer.clear();\n\t\tif (this.initializationRetryTimer !== undefined) {\n\t\t\tthis.clearTimeout(this.initializationRetryTimer);\n\t\t\tthis.initializationRetryTimer = undefined;\n\t\t}\n\t\tcallback();\n\t}\n}\nif (require.main !== module) {\n\t// Export the constructor in compact mode\n\tmodule.exports = (options: Partial<utils.AdapterOptions> | undefined) => new MgSaic(options);\n} else {\n\t// otherwise start the instance directly\n\t(() => new MgSaic())();\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["error"]
7
7
  }
package/io-package.json CHANGED
@@ -1,8 +1,21 @@
1
1
  {
2
2
  "common": {
3
3
  "name": "mg-saic",
4
- "version": "0.1.2",
4
+ "version": "0.1.3",
5
5
  "news": {
6
+ "0.1.3": {
7
+ "en": "Retry startup initialization after temporary cloud login and vehicle-list outages with bounded backoff, prevent false setting writes from triggering remote setting actions, and add the missing region labels in the Admin UI.",
8
+ "de": "Starte den Start nach temporärem Cloud-Login und Ausfall der Fahrzeugliste mit begrenztem Backoff erneut, vermeide Ferneinstellungen durch Fehleingaben und füge fehlende Regionsbezeichnungen in der Admin-UI hinzu.",
9
+ "ru": "Повторите инициализацию запуска после временного входа в облако и перебоев со списком транспортных средств с ограниченным перерывом, предотвратите запуск при неправильной записи настроек, запускающих удаленные действия по настройке, и добавьте недостающие метки регионов в пользовательский интерфейс администратора.",
10
+ "pt": "Tente reinicializar após login temporário na nuvem e interrupções na lista de veículos com atraso limitado, evite que gravações falsas acionem ações remotas e adicione os rótulos de região ausentes na IU do administrador.",
11
+ "nl": "Probeer de opstartinitialisatie opnieuw na tijdelijke aanmelding in de cloud en uitval van de voertuiglijst met beperkte backoff, voorkom dat verkeerde schrijfbewerkingen op afstand leiden tot acties voor instellingen, en voeg de ontbrekende regiolabels toe aan de gebruikersinterface voor beheerders.",
12
+ "fr": "Réessayez de démarrer après une connexion temporaire au cloud et une panne de la liste des véhicules, évitez que de fausses écritures ne déclenchent des actions de réglage à distance et ajoutez les libellés de régions manquants dans l'interface d'administration.",
13
+ "it": "Riprova ad avviare l'avvio dopo l'accesso temporaneo al cloud e all'elenco veicoli con backoff limitato, evita che false scritture attivino azioni remote e aggiunga le etichette regionali mancanti nell'interfaccia di amministrazione.",
14
+ "es": "Vuelva a iniciar la inicialización tras interrupciones temporales de inicio de sesión en la nube y de la lista de vehículos con un retraso limitado, evite que las escrituras falsas activen acciones de configuración remota y añada las etiquetas de región que faltan en la interfaz de usuario.",
15
+ "pl": "Spróbuj ponownie zainicjować uruchamianie po tymczasowym logowaniu w chmurze i przerwach na liście pojazdów z ograniczonym cofaniem, zapobiegaj uruchamianiu operacji ustawień zdalnych przez fałszywe zapisy ustawień i dodaj brakujące etykiety regionu w interfejsie administratora.",
16
+ "uk": "Повторно спробуйте ініціалізацію запуску після тимчасового відключення входу в хмару та перемикання списку транспортних засобів із обмеженим зворотним зв'язком, запобігайте запуску помилкових записів налаштувань від запуску дій віддалених налаштувань та додайте відсутні мітки регіонів у інтерфейсі адміністратора.",
17
+ "zh-cn": "在临时云登录和车辆清单中断后,使用限定退避重试启动初始化,防止错误设置写入触发远程设置操作,并在管理界面中添加缺失的区域标签。"
18
+ },
6
19
  "0.1.2": {
7
20
  "en": "Prevented unsafe or case-colliding API fields and vehicle IDs from creating duplicate datapoints, kept status IDs stable across field-casing changes, scheduled polling after each completed cycle while honoring queued manual refreshes, and removed an unused cloud-backend translation.\nReplaced untrusted cloud error text with English code-based diagnostics and standardized the product title as MG/SAIC across locales.\nReused dynamic charging datapoints across field-name casing changes and normalized known status fields.",
8
21
  "de": "Verhinderte, dass unsichere API-Felder und Fahrzeug-IDs doppelte Datenpunkte erzeugten, Status-IDs stabil blieben, Abfragen nach jedem Zyklus unter Berücksichtigung manueller Aktualisierungen geplant und ungenutzte Cloud-Backend-Übersetzungen entfernt.\nErsetzte den Fehlertext „Untrusted Cloud“ durch englische Codediagnosen und vereinheitlichte den Produkttitel in MG/SAIC.\nDynamische Ladedaten bei Groß- und Kleinschreibung und normalisierten Statusfeldern wiederverwendet.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iobroker.mg-saic",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Connect MG and SAIC vehicles to ioBroker through regional iSmart cloud APIs",
5
5
  "author": {
6
6
  "name": "Voodoo2man",