iobroker.mg-saic 0.0.4 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -41,6 +41,12 @@ The adapter is published on npm but has not yet been added to the ioBroker adapt
41
41
  [![Donate](https://camo.githubusercontent.com/ef8c60305542390406855547e32850909812a73c4abada236de22a6dc88b313f/68747470733a2f2f7777772e70617970616c6f626a656374732e636f6d2f64655f44452f44452f692f62746e2f62746e5f646f6e61746543435f4c472e676966)](https://www.paypal.com/donate/?hosted_button_id=3RJQGSJNRSHUJ)
42
42
 
43
43
  ## Changelog
44
+ ### 0.1.0 (2026-11-01)
45
+
46
+ - (Voodoo2man) Reported real-time charging power in kW using the pack current and voltage.
47
+ - (Voodoo2man) Applied confirmed profile-specific charging conversions.
48
+ - (Voodoo2man) Calculated available battery energy from battery level and usable capacity.
49
+
44
50
  ### 0.0.4 (2026-10-24)
45
51
 
46
52
  - (Voodoo2man) Corrected GPS coordinates.
package/build/main.js CHANGED
@@ -329,7 +329,7 @@ class MgSaic extends utils.Adapter {
329
329
  vehicle.vin,
330
330
  this.abortController.signal
331
331
  );
332
- await this.createVehicleChargingObjects(vehicle.vin, charging);
332
+ await this.createVehicleChargingObjects(vehicle.vin, charging, vehicle.series);
333
333
  } catch (error) {
334
334
  if (this.stopping) {
335
335
  break;
@@ -861,16 +861,17 @@ class MgSaic extends utils.Adapter {
861
861
  await this.delObjectAsync(`${statusId}.${key}`);
862
862
  }
863
863
  }
864
- async createVehicleChargingObjects(vin, charging) {
864
+ async createVehicleChargingObjects(vin, charging, series) {
865
865
  await this.ensureVehicleChargingGroups(vin);
866
866
  const rootId = `vehicles.${vin}.status.charging`;
867
867
  for (const { source, id } of chargingGroups) {
868
868
  const groupId = `${rootId}.${id}`;
869
869
  const excludedFields = id === "session" ? import_status_metadata.excludedChargingSessionFields : import_status_metadata.excludedChargingStatisticsFields;
870
+ const fields = source === "chrgMgmtData" ? (0, import_status_metadata.getChargingManagementFields)(charging.chrgMgmtData) : (0, import_status_metadata.getChargingStatisticsFields)(charging[source]);
870
871
  for (const field of excludedFields) {
871
872
  await this.delObjectAsync(`${groupId}.${field}`);
872
873
  }
873
- for (const [field, value] of Object.entries(charging[source])) {
874
+ for (const [field, value] of fields) {
874
875
  if (this.stopping) {
875
876
  return;
876
877
  }
@@ -879,15 +880,20 @@ class MgSaic extends utils.Adapter {
879
880
  continue;
880
881
  }
881
882
  const stateId = `${groupId}.${field}`;
882
- if (value === void 0) {
883
+ if (value === void 0 && field !== "realtimePower" && field !== "batteryAvailableEnergy") {
883
884
  await this.delObjectAsync(stateId);
884
885
  continue;
885
886
  }
886
- const metadata = (0, import_status_metadata.getChargingFieldMetadata)(field);
887
+ const normalizedValue = field === "realtimePower" ? (0, import_status_metadata.calculateRealtimePower)(charging.chrgMgmtData.bmsPackCrnt, charging.chrgMgmtData.bmsPackVol) : value === void 0 ? void 0 : (0, import_status_metadata.normalizeChargingValue)(field, value, series);
888
+ if (normalizedValue === void 0 && field !== "batteryAvailableEnergy") {
889
+ await this.delObjectAsync(stateId);
890
+ continue;
891
+ }
892
+ const metadata = (0, import_status_metadata.getChargingFieldMetadata)(field, series);
887
893
  const common = {
888
894
  name: (0, import_runtime_translations.getChargingFieldName)(field),
889
- type: metadata.type === "boolean" ? "boolean" : typeof value === "string" ? "string" : "number",
890
- role: typeof value === "string" ? "text" : metadata.role,
895
+ type: metadata.type === "boolean" ? "boolean" : typeof normalizedValue === "string" ? "string" : "number",
896
+ role: typeof normalizedValue === "string" ? "text" : metadata.role,
891
897
  read: true,
892
898
  write: false
893
899
  };
@@ -896,8 +902,11 @@ class MgSaic extends utils.Adapter {
896
902
  }
897
903
  await this.setObjectNotExistsAsync(stateId, { type: "state", common, native: {} });
898
904
  await this.extendObjectAsync(stateId, { common });
905
+ if (normalizedValue === void 0) {
906
+ continue;
907
+ }
899
908
  await this.setStateAsync(stateId, {
900
- val: (0, import_status_metadata.normalizeChargingValue)(field, value),
909
+ val: normalizedValue,
901
910
  ack: true
902
911
  });
903
912
  if (field === "bmsOnBdChrgTrgtSOCDspCmd" && typeof value === "number" && value >= 1 && value <= 7) {
@@ -905,13 +914,31 @@ class MgSaic extends utils.Adapter {
905
914
  const targetSocState = await this.getStateAsync(targetSocId);
906
915
  if ((0, import_status_metadata.shouldApplySettingFeedback)(targetSocState, this.pendingSettingEdits.has(targetSocId))) {
907
916
  await this.setStateAsync(targetSocId, {
908
- val: (0, import_status_metadata.normalizeChargingValue)(field, value),
917
+ val: (0, import_status_metadata.normalizeChargingValue)(field, value, series),
909
918
  ack: true
910
919
  });
911
920
  }
912
921
  }
913
922
  }
914
923
  }
924
+ const capacityState = await this.getStateAsync(`${rootId}.statistics.totalBatteryCapacity`);
925
+ const socState = await this.getStateAsync(`${rootId}.session.bmsPackSOCDsp`);
926
+ const availableEnergy = (0, import_status_metadata.calculateAvailableBatteryEnergy)(
927
+ capacityState == null ? void 0 : capacityState.val,
928
+ socState == null ? void 0 : socState.val,
929
+ charging.rvsChargeStatus.packEnergyKwh
930
+ );
931
+ if (availableEnergy !== void 0) {
932
+ await this.setStateAsync(`${rootId}.statistics.batteryAvailableEnergy`, {
933
+ val: availableEnergy,
934
+ ack: true
935
+ });
936
+ } else {
937
+ await this.setStateAsync(`${rootId}.statistics.batteryAvailableEnergy`, {
938
+ val: null,
939
+ ack: true
940
+ });
941
+ }
915
942
  for (const [setting, value] of Object.entries((0, import_status_metadata.getChargingSettingFeedback)(charging.chrgMgmtData))) {
916
943
  const stateId = vehicleCommandPath(vin, setting);
917
944
  const state = await this.getStateAsync(stateId);
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 { 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 { parsePendingSettingEdits, serializePendingSettingEdits } from './pending-setting-edits';\nimport {\n\tgetVehicleStatusGroup,\n\tgetVehicleStatusMetadata,\n\tgetChargingSettingFeedback,\n\tgetChargingFieldMetadata,\n\texcludedChargingSessionFields,\n\texcludedChargingStatisticsFields,\n\texcludedVehicleStatusFields,\n\tnormalizeChargingValue,\n\tnormalizeVehicleStatusValue,\n\tresolveOdometerValue,\n\tshouldApplySettingFeedback,\n\tshouldDeleteUnavailableStatusValue,\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;\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.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 pollTimer?: ioBroker.Interval;\n\tprivate pollInProgress = false;\n\tprivate refreshQueued = false;\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 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\tawait this.setObjectNotExistsAsync('internal', {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: 'Internal' },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.setObjectNotExistsAsync('internal.pendingSettingEdits', {\n\t\t\ttype: 'state',\n\t\t\tcommon: { name: 'Pending setting edits', type: 'string', role: 'json', read: true, write: false },\n\t\t\tnative: {},\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\tawait this.restorePendingSettingEdits();\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\tawait this.refreshVehicleStatuses();\n\t\t\tconst intervalSeconds = config.pollIntervalSeconds ?? DEFAULT_POLL_INTERVAL_SECONDS;\n\t\t\tif (!this.stopping) {\n\t\t\t\tthis.pollTimer = this.setInterval(() => this.triggerRefresh(), intervalSeconds * 1000);\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 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\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 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.pollInProgress) {\n\t\t\tthis.refreshQueued = true;\n\t\t\treturn;\n\t\t}\n\t\tthis.pollInProgress = true;\n\t\tconst statusErrors: string[] = [];\n\t\tlet followUpUsed = false;\n\t\ttry {\n\t\t\tdo {\n\t\t\t\tthis.refreshQueued = false;\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);\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. SAIC message: ${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.refreshQueued && followUpUsed) {\n\t\t\t\t\tthis.refreshQueued = false;\n\t\t\t\t} else if (this.refreshQueued) {\n\t\t\t\t\tfollowUpUsed = true;\n\t\t\t\t}\n\t\t\t} while (this.refreshQueued && !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.pollInProgress = false;\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 serialized = serializePendingSettingEdits(this.pendingSettingEdits.keys());\n\t\tconst write = this.pendingSettingEditsWrite\n\t\t\t.catch(() => undefined)\n\t\t\t.then(async () => {\n\t\t\t\tawait this.setStateAsync('internal.pendingSettingEdits', { val: serialized, ack: true });\n\t\t\t});\n\t\tthis.pendingSettingEditsWrite = write;\n\t\tawait write;\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 savedState = await this.getStateAsync('internal.pendingSettingEdits');\n\t\tfor (const stateId of parsePendingSettingEdits(savedState?.val, 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 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\tfor (const key of excludedVehicleStatusFields) {\n\t\t\tconst stateId = `${statusId}.${getVehicleStatusGroup(key)}.${key}`;\n\t\t\tawait this.delObjectAsync(stateId);\n\t\t}\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\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\tif (excludedVehicleStatusFields.some(excludedKey => excludedKey === key)) {\n\t\t\t\tawait this.delObjectAsync(`${statusId}.${getVehicleStatusGroup(key)}.${key}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst group = getVehicleStatusGroup(key);\n\t\t\tconst groupId = `${statusId}.${group}`;\n\t\t\tconst stateId = `${groupId}.${key}`;\n\t\t\tif (value === undefined) {\n\t\t\t\tif (shouldDeleteUnavailableStatusValue(key)) {\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(key, 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(key);\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\tkey === 'frontLeftSeatHeatLevel'\n\t\t\t\t\t? 'driverSeatHeatLevel'\n\t\t\t\t\t: key === '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}.${key}`);\n\t\t}\n\t}\n\n\tprivate async createVehicleChargingObjects(vin: string, charging: SaicChargingStatus): Promise<void> {\n\t\tawait this.ensureVehicleChargingGroups(vin);\n\t\tconst rootId = `vehicles.${vin}.status.charging`;\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\tfor (const field of excludedFields) {\n\t\t\t\tawait this.delObjectAsync(`${groupId}.${field}`);\n\t\t\t}\n\t\t\tfor (const [field, value] of Object.entries(charging[source])) {\n\t\t\t\tif (this.stopping) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (excludedFields.some(excludedField => excludedField === field)) {\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 (value === undefined) {\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(field);\n\t\t\t\tconst common: ioBroker.StateCommon = {\n\t\t\t\t\tname: getChargingFieldName(field),\n\t\t\t\t\ttype: metadata.type === 'boolean' ? 'boolean' : typeof value === 'string' ? 'string' : 'number',\n\t\t\t\t\trole: typeof value === '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\tawait this.setStateAsync(stateId, {\n\t\t\t\t\tval: normalizeChargingValue(field, value),\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) 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\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.refreshQueued = false;\n\t\tif (this.pollTimer) {\n\t\t\tthis.clearInterval(this.pollTimer);\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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",
4
+ "sourcesContent": ["import * as utils from '@iobroker/adapter-core';\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 { parsePendingSettingEdits, serializePendingSettingEdits } from './pending-setting-edits';\nimport {\n\tgetVehicleStatusGroup,\n\tgetVehicleStatusMetadata,\n\tgetChargingSettingFeedback,\n\tcalculateRealtimePower,\n\tgetChargingFieldMetadata,\n\tgetChargingManagementFields,\n\tgetChargingStatisticsFields,\n\tcalculateAvailableBatteryEnergy,\n\texcludedChargingSessionFields,\n\texcludedChargingStatisticsFields,\n\texcludedVehicleStatusFields,\n\tnormalizeChargingValue,\n\tnormalizeVehicleStatusValue,\n\tresolveOdometerValue,\n\tshouldApplySettingFeedback,\n\tshouldDeleteUnavailableStatusValue,\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;\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.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 pollTimer?: ioBroker.Interval;\n\tprivate pollInProgress = false;\n\tprivate refreshQueued = false;\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 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\tawait this.setObjectNotExistsAsync('internal', {\n\t\t\ttype: 'channel',\n\t\t\tcommon: { name: 'Internal' },\n\t\t\tnative: {},\n\t\t});\n\t\tawait this.setObjectNotExistsAsync('internal.pendingSettingEdits', {\n\t\t\ttype: 'state',\n\t\t\tcommon: { name: 'Pending setting edits', type: 'string', role: 'json', read: true, write: false },\n\t\t\tnative: {},\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\tawait this.restorePendingSettingEdits();\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\tawait this.refreshVehicleStatuses();\n\t\t\tconst intervalSeconds = config.pollIntervalSeconds ?? DEFAULT_POLL_INTERVAL_SECONDS;\n\t\t\tif (!this.stopping) {\n\t\t\t\tthis.pollTimer = this.setInterval(() => this.triggerRefresh(), intervalSeconds * 1000);\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 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\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 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.pollInProgress) {\n\t\t\tthis.refreshQueued = true;\n\t\t\treturn;\n\t\t}\n\t\tthis.pollInProgress = true;\n\t\tconst statusErrors: string[] = [];\n\t\tlet followUpUsed = false;\n\t\ttry {\n\t\t\tdo {\n\t\t\t\tthis.refreshQueued = false;\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. SAIC message: ${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.refreshQueued && followUpUsed) {\n\t\t\t\t\tthis.refreshQueued = false;\n\t\t\t\t} else if (this.refreshQueued) {\n\t\t\t\t\tfollowUpUsed = true;\n\t\t\t\t}\n\t\t\t} while (this.refreshQueued && !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.pollInProgress = false;\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 serialized = serializePendingSettingEdits(this.pendingSettingEdits.keys());\n\t\tconst write = this.pendingSettingEditsWrite\n\t\t\t.catch(() => undefined)\n\t\t\t.then(async () => {\n\t\t\t\tawait this.setStateAsync('internal.pendingSettingEdits', { val: serialized, ack: true });\n\t\t\t});\n\t\tthis.pendingSettingEditsWrite = write;\n\t\tawait write;\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 savedState = await this.getStateAsync('internal.pendingSettingEdits');\n\t\tfor (const stateId of parsePendingSettingEdits(savedState?.val, 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 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\tfor (const key of excludedVehicleStatusFields) {\n\t\t\tconst stateId = `${statusId}.${getVehicleStatusGroup(key)}.${key}`;\n\t\t\tawait this.delObjectAsync(stateId);\n\t\t}\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\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\tif (excludedVehicleStatusFields.some(excludedKey => excludedKey === key)) {\n\t\t\t\tawait this.delObjectAsync(`${statusId}.${getVehicleStatusGroup(key)}.${key}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst group = getVehicleStatusGroup(key);\n\t\t\tconst groupId = `${statusId}.${group}`;\n\t\t\tconst stateId = `${groupId}.${key}`;\n\t\t\tif (value === undefined) {\n\t\t\t\tif (shouldDeleteUnavailableStatusValue(key)) {\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(key, 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(key);\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\tkey === 'frontLeftSeatHeatLevel'\n\t\t\t\t\t? 'driverSeatHeatLevel'\n\t\t\t\t\t: key === '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}.${key}`);\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\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\tfor (const [field, value] of fields) {\n\t\t\t\tif (this.stopping) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (excludedFields.some(excludedField => excludedField === field)) {\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 (value === undefined && field !== 'realtimePower' && field !== '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 normalizedValue =\n\t\t\t\t\tfield === '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(field, value, series);\n\t\t\t\tif (normalizedValue === undefined && field !== '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(field, series);\n\t\t\t\tconst common: ioBroker.StateCommon = {\n\t\t\t\t\tname: getChargingFieldName(field),\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.refreshQueued = false;\n\t\tif (this.pollTimer) {\n\t\t\tthis.clearInterval(this.pollTimer);\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
  }
@@ -1016,6 +1016,7 @@ const chargingFieldNames = {
1016
1016
  chargingGunState: { en: "Charging connector state", de: "Ladesteckerstatus" },
1017
1017
  chargingType: { en: "Charging type", de: "Ladeart" },
1018
1018
  endTime: { en: "Charge end time", de: "Ladeende" },
1019
+ batteryAvailableEnergy: { en: "Available battery energy", de: "Verf\xFCgbare Batterieenergie" },
1019
1020
  fuelRangeElec: { en: "Electric range", de: "Elektrische Reichweite" },
1020
1021
  mileage: { en: "Odometer", de: "Kilometerstand" },
1021
1022
  mileageOfDay: { en: "Distance today", de: "Tageskilometer" },