@thecloudseeker/homebridge-skoda 0.1.3 → 0.3.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/README.md +42 -26
  3. package/config.schema.json +148 -69
  4. package/dist/accessory/services/battery.d.ts +21 -0
  5. package/dist/accessory/services/battery.js +38 -1
  6. package/dist/accessory/services/battery.js.map +1 -1
  7. package/dist/accessory/services/body.d.ts +5 -6
  8. package/dist/accessory/services/body.js +45 -8
  9. package/dist/accessory/services/body.js.map +1 -1
  10. package/dist/accessory/services/charging.js +31 -13
  11. package/dist/accessory/services/charging.js.map +1 -1
  12. package/dist/accessory/services/climate.js +51 -23
  13. package/dist/accessory/services/climate.js.map +1 -1
  14. package/dist/accessory/services/common.d.ts +10 -5
  15. package/dist/accessory/services/common.js +17 -8
  16. package/dist/accessory/services/common.js.map +1 -1
  17. package/dist/accessory/vehicleAccessory.d.ts +11 -2
  18. package/dist/accessory/vehicleAccessory.js +54 -5
  19. package/dist/accessory/vehicleAccessory.js.map +1 -1
  20. package/dist/api/client.d.ts +2 -2
  21. package/dist/api/client.js +8 -6
  22. package/dist/api/client.js.map +1 -1
  23. package/dist/api/rateBudget.d.ts +3 -3
  24. package/dist/api/rateBudget.js +1 -1
  25. package/dist/config.d.ts +10 -4
  26. package/dist/config.js +24 -8
  27. package/dist/config.js.map +1 -1
  28. package/dist/platform.js +19 -25
  29. package/dist/platform.js.map +1 -1
  30. package/dist/vehicle/mapping.d.ts +12 -0
  31. package/dist/vehicle/mapping.js +42 -0
  32. package/dist/vehicle/mapping.js.map +1 -1
  33. package/dist/vehicle/snapshot.js +47 -0
  34. package/dist/vehicle/snapshot.js.map +1 -1
  35. package/dist/vehicle/vehicleController.d.ts +30 -10
  36. package/dist/vehicle/vehicleController.js +92 -30
  37. package/dist/vehicle/vehicleController.js.map +1 -1
  38. package/package.json +1 -1
@@ -1,16 +1,53 @@
1
- import { bodyValues, isAtHome, } from "../../vehicle/mapping.js";
1
+ import { bodyValues, isAtHome, isPlugLocked, isWindowHeatingOn, } from "../../vehicle/mapping.js";
2
2
  import { ServiceBinding, } from "./common.js";
3
+ const negate = (value) => value === undefined ? undefined : !value;
3
4
  const CONTACTS = [
4
- { feature: "doors", displayName: "Doors", isOpen: (v) => v.doorsOpen },
5
- { feature: "windows", displayName: "Windows", isOpen: (v) => v.windowsOpen },
6
- { feature: "trunk", displayName: "Trunk", isOpen: (v) => v.trunkOpen },
7
- { feature: "bonnet", displayName: "Bonnet", isOpen: (v) => v.bonnetOpen },
8
- { feature: "sunroof", displayName: "Sunroof", isOpen: (v) => v.sunroofOpen },
5
+ {
6
+ feature: "doors",
7
+ displayName: "Doors",
8
+ isOpen: (v) => bodyValues(v).doorsOpen,
9
+ },
10
+ {
11
+ feature: "windows",
12
+ displayName: "Windows",
13
+ isOpen: (v) => bodyValues(v).windowsOpen,
14
+ },
15
+ {
16
+ feature: "trunk",
17
+ displayName: "Trunk",
18
+ isOpen: (v) => bodyValues(v).trunkOpen,
19
+ },
20
+ {
21
+ feature: "bonnet",
22
+ displayName: "Bonnet",
23
+ isOpen: (v) => bodyValues(v).bonnetOpen,
24
+ },
25
+ {
26
+ feature: "sunroof",
27
+ displayName: "Sunroof",
28
+ isOpen: (v) => bodyValues(v).sunroofOpen,
29
+ },
9
30
  // The API cannot lock or unlock, so the lock state is a read-only sensor: closed = locked.
10
31
  {
11
32
  feature: "lock",
12
33
  displayName: "Locked",
13
- isOpen: (v) => (v.locked === undefined ? undefined : !v.locked),
34
+ isOpen: (v) => negate(bodyValues(v).locked),
35
+ },
36
+ {
37
+ feature: "lights",
38
+ displayName: "Lights",
39
+ isOpen: (v) => bodyValues(v).lightsOn,
40
+ },
41
+ // The API has no command for the window heating, so it is a read-only sensor: open = on.
42
+ {
43
+ feature: "windowHeating",
44
+ displayName: "Window Heating",
45
+ isOpen: isWindowHeatingOn,
46
+ },
47
+ {
48
+ feature: "plugLock",
49
+ displayName: "Plug Locked",
50
+ isOpen: (v) => negate(isPlugLocked(v)),
14
51
  },
15
52
  ];
16
53
  export class ContactBinding extends ServiceBinding {
@@ -31,7 +68,7 @@ export class ContactBinding extends ServiceBinding {
31
68
  }
32
69
  render(_service, vehicle) {
33
70
  const { ContactSensorState } = this.ctx.hap.Characteristic;
34
- const open = this.definition.isOpen(bodyValues(vehicle));
71
+ const open = this.definition.isOpen(vehicle);
35
72
  if (open !== undefined) {
36
73
  this.set(ContactSensorState, open
37
74
  ? ContactSensorState.CONTACT_NOT_DETECTED
@@ -1 +1 @@
1
- {"version":3,"file":"body.js","sourceRoot":"","sources":["../../../src/accessory/services/body.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"body.js","sourceRoot":"","sources":["../../../src/accessory/services/body.ts"],"names":[],"mappings":"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"}
@@ -12,16 +12,28 @@ export class ChargingBinding extends ServiceBinding {
12
12
  .getCharacteristic(this.ctx.hap.Characteristic.On)
13
13
  .onSet(async (value) => {
14
14
  if (value === true) {
15
- await this.command("Start charging", (client) => client.startCharging(), (vehicle) => {
16
- patchChargingStatus(vehicle, { state: "CHARGING" });
15
+ await this.command("Start charging", (client) => client.startCharging(), {
16
+ operations: ["startCharging"],
17
+ optimistic: {
18
+ part: "charging",
19
+ apply: (vehicle) => {
20
+ patchChargingStatus(vehicle, { state: "CHARGING" });
21
+ },
22
+ },
17
23
  });
18
24
  }
19
25
  else {
20
- await this.command("Stop charging", (client) => client.stopCharging(), (vehicle) => {
21
- patchChargingStatus(vehicle, {
22
- state: "READY_FOR_CHARGING",
23
- chargePowerInKw: 0,
24
- });
26
+ await this.command("Stop charging", (client) => client.stopCharging(), {
27
+ operations: ["stopCharging"],
28
+ optimistic: {
29
+ part: "charging",
30
+ apply: (vehicle) => {
31
+ patchChargingStatus(vehicle, {
32
+ state: "READY_FOR_CHARGING",
33
+ chargePowerInKw: 0,
34
+ });
35
+ },
36
+ },
25
37
  });
26
38
  }
27
39
  });
@@ -43,12 +55,18 @@ export class ChargingLimitBinding extends ServiceBinding {
43
55
  subtype = "charging-limit";
44
56
  displayName = "Charge Limit";
45
57
  sendLimit = debounce(SLIDER_DEBOUNCE_MS, (percent) => {
46
- this.command(`Set charging limit to ${percent} %`, (client) => client.setChargingLimit(percent), (vehicle) => {
47
- vehicle.charging ??= { isVehicleInSavedLocation: false };
48
- vehicle.charging.settings = {
49
- ...vehicle.charging.settings,
50
- targetStateOfChargeInPercent: percent,
51
- };
58
+ this.command(`Set charging limit to ${percent} %`, (client) => client.setChargingLimit(percent), {
59
+ operations: ["setChargingLimit"],
60
+ optimistic: {
61
+ part: "charging",
62
+ apply: (vehicle) => {
63
+ vehicle.charging ??= { isVehicleInSavedLocation: false };
64
+ vehicle.charging.settings = {
65
+ ...vehicle.charging.settings,
66
+ targetStateOfChargeInPercent: percent,
67
+ };
68
+ },
69
+ },
52
70
  }).catch(() => {
53
71
  // Already logged and reverted.
54
72
  });
@@ -1 +1 @@
1
- {"version":3,"file":"charging.js","sourceRoot":"","sources":["../../../src/accessory/services/charging.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"charging.js","sourceRoot":"","sources":["../../../src/accessory/services/charging.ts"],"names":[],"mappings":"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"}
@@ -44,10 +44,16 @@ export class ClimateBinding extends ServiceBinding {
44
44
  await this.start();
45
45
  }
46
46
  else {
47
- await this.command("Stop air conditioning", (client) => client.stopAirConditioning(), (vehicle) => {
48
- if (vehicle.airConditioning) {
49
- vehicle.airConditioning.state = "OFF";
50
- }
47
+ await this.command("Stop air conditioning", (client) => client.stopAirConditioning(), {
48
+ operations: ["stopAirConditioning"],
49
+ optimistic: {
50
+ part: "airConditioning",
51
+ apply: (vehicle) => {
52
+ if (vehicle.airConditioning) {
53
+ vehicle.airConditioning.state = "OFF";
54
+ }
55
+ },
56
+ },
51
57
  });
52
58
  }
53
59
  });
@@ -108,13 +114,19 @@ export class ClimateBinding extends ServiceBinding {
108
114
  ...(airConditioningWithoutExternalPower === undefined
109
115
  ? {}
110
116
  : { airConditioningWithoutExternalPower }),
111
- }), (vehicle) => {
112
- // Heating or cooling is not known until the vehicle reports back.
113
- vehicle.airConditioning = {
114
- ...vehicle.airConditioning,
115
- state: "VENTILATION",
116
- targetTemperature: { value: celsius, unit: "CELSIUS" },
117
- };
117
+ }), {
118
+ operations: ["startAirConditioning"],
119
+ optimistic: {
120
+ part: "airConditioning",
121
+ apply: (vehicle) => {
122
+ // Heating or cooling is not known until the vehicle reports back.
123
+ vehicle.airConditioning = {
124
+ ...vehicle.airConditioning,
125
+ state: "VENTILATION",
126
+ targetTemperature: { value: celsius, unit: "CELSIUS" },
127
+ };
128
+ },
129
+ },
118
130
  });
119
131
  }
120
132
  /** A new temperature only takes effect on a restart; while off it is kept for the next start. */
@@ -125,7 +137,7 @@ export class ClimateBinding extends ServiceBinding {
125
137
  return;
126
138
  }
127
139
  try {
128
- await this.ctx.controller.runCommand("Stop air conditioning for new temperature", (client) => client.stopAirConditioning());
140
+ await this.ctx.controller.runCommand("Stop air conditioning for new temperature", (client) => client.stopAirConditioning(), { operations: ["stopAirConditioning"] });
129
141
  await new Promise((resolve) => setTimeout(resolve, RESTART_PAUSE_MS).unref());
130
142
  await this.start();
131
143
  }
@@ -153,19 +165,31 @@ export class AuxiliaryHeatingBinding extends ServiceBinding {
153
165
  : {
154
166
  durationInSeconds: auxiliaryHeatingDurationMinutes * 60,
155
167
  }),
156
- }), (vehicle) => {
157
- vehicle.auxiliaryHeating = {
158
- ...vehicle.auxiliaryHeating,
159
- state: "HEATING_AUXILIARY",
160
- };
168
+ }), {
169
+ operations: ["startAuxiliaryHeating"],
170
+ optimistic: {
171
+ part: "auxiliaryHeating",
172
+ apply: (vehicle) => {
173
+ vehicle.auxiliaryHeating = {
174
+ ...vehicle.auxiliaryHeating,
175
+ state: "HEATING_AUXILIARY",
176
+ };
177
+ },
178
+ },
161
179
  });
162
180
  }
163
181
  else if (value !== true) {
164
- await this.command("Stop auxiliary heating", (client) => client.stopAuxiliaryHeating(), (vehicle) => {
165
- vehicle.auxiliaryHeating = {
166
- ...vehicle.auxiliaryHeating,
167
- state: "OFF",
168
- };
182
+ await this.command("Stop auxiliary heating", (client) => client.stopAuxiliaryHeating(), {
183
+ operations: ["stopAuxiliaryHeating"],
184
+ optimistic: {
185
+ part: "auxiliaryHeating",
186
+ apply: (vehicle) => {
187
+ vehicle.auxiliaryHeating = {
188
+ ...vehicle.auxiliaryHeating,
189
+ state: "OFF",
190
+ };
191
+ },
192
+ },
169
193
  });
170
194
  }
171
195
  });
@@ -193,7 +217,11 @@ export class ActiveVentilationBinding extends ServiceBinding {
193
217
  const on = value === true;
194
218
  await this.command(on ? "Start active ventilation" : "Stop active ventilation", (client) => on
195
219
  ? client.startActiveVentilation()
196
- : client.stopActiveVentilation());
220
+ : client.stopActiveVentilation(), {
221
+ operations: [
222
+ on ? "startActiveVentilation" : "stopActiveVentilation",
223
+ ],
224
+ });
197
225
  setTimeout(() => {
198
226
  this.rerender();
199
227
  }, 500).unref();
@@ -1 +1 @@
1
- {"version":3,"file":"climate.js","sourceRoot":"","sources":["../../../src/accessory/services/climate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"climate.js","sourceRoot":"","sources":["../../../src/accessory/services/climate.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,7 @@ import type { Vehicle } from "../../api/types.js";
4
4
  import type { FeatureToggles, VehicleSettings } from "../../config.js";
5
5
  import type { Logger } from "../../util/logger.js";
6
6
  import type { VehicleSnapshot } from "../../vehicle/snapshot.js";
7
- import type { VehicleController } from "../../vehicle/vehicleController.js";
7
+ import type { CommandOptions, VehicleController } from "../../vehicle/vehicleController.js";
8
8
  export type HAP = API["hap"];
9
9
  export type ServiceType = WithUUID<typeof Service>;
10
10
  type CharacteristicType = Parameters<Service["updateCharacteristic"]>[0];
@@ -14,6 +14,8 @@ export interface BindingContext {
14
14
  controller: VehicleController;
15
15
  settings: VehicleSettings;
16
16
  log: Logger;
17
+ /** Called after services were added or removed, so Homebridge can save its accessory cache. */
18
+ onServicesChanged?: () => void;
17
19
  }
18
20
  /**
19
21
  * One HomeKit service backed by the vehicle cache. Values are pushed into the characteristics on
@@ -27,11 +29,14 @@ export declare abstract class ServiceBinding {
27
29
  protected abstract readonly displayName: string;
28
30
  protected service: Service | undefined;
29
31
  constructor(ctx: BindingContext);
32
+ /** Name of the service in HomeKit. */
33
+ get name(): string;
30
34
  /** Whether the service exists on the (possibly cached) accessory. */
31
35
  exists(): boolean;
32
- /** Creates the service if needed and registers handlers once. */
33
- attach(): void;
34
- detach(): void;
36
+ /** Creates the service if needed and registers handlers once. Returns whether it was added. */
37
+ attach(): boolean;
38
+ /** Removes the service if it exists. Returns whether it was removed. */
39
+ detach(): boolean;
35
40
  update(snapshot: VehicleSnapshot | undefined, stale: boolean): void;
36
41
  /** Services that support `StatusFault` signal stale data with it. */
37
42
  protected get hasStatusFault(): boolean;
@@ -47,7 +52,7 @@ export declare abstract class ServiceBinding {
47
52
  * Runs a command for a set handler. A failure is reported to HomeKit as "no response" and the
48
53
  * characteristic is reverted to the cached value.
49
54
  */
50
- protected command(label: string, send: (client: SkodaApiClient) => Promise<void>, optimistic?: (vehicle: Vehicle) => void): Promise<void>;
55
+ protected command(label: string, send: (client: SkodaApiClient) => Promise<void>, options?: CommandOptions): Promise<void>;
51
56
  }
52
57
  /** Delays an action until the value has not changed for `delayMs` (sliders send many updates). */
53
58
  export declare function debounce<T>(delayMs: number, action: (value: T) => void): (value: T) => void;
@@ -11,18 +11,23 @@ export class ServiceBinding {
11
11
  constructor(ctx) {
12
12
  this.ctx = ctx;
13
13
  }
14
+ /** Name of the service in HomeKit. */
15
+ get name() {
16
+ return this.displayName;
17
+ }
14
18
  /** Whether the service exists on the (possibly cached) accessory. */
15
19
  exists() {
16
20
  return (this.ctx.accessory.getServiceById(this.serviceType, this.subtype) !==
17
21
  undefined);
18
22
  }
19
- /** Creates the service if needed and registers handlers once. */
23
+ /** Creates the service if needed and registers handlers once. Returns whether it was added. */
20
24
  attach() {
21
25
  if (this.service) {
22
- return;
26
+ return false;
23
27
  }
24
28
  const { accessory, hap } = this.ctx;
25
29
  let service = accessory.getServiceById(this.serviceType, this.subtype);
30
+ const added = !service;
26
31
  if (!service) {
27
32
  service = accessory.addService(this.serviceType, this.displayName, this.subtype);
28
33
  service.addOptionalCharacteristic(hap.Characteristic.ConfiguredName);
@@ -31,14 +36,18 @@ export class ServiceBinding {
31
36
  }
32
37
  this.service = service;
33
38
  this.configure?.(service);
39
+ return added;
34
40
  }
41
+ /** Removes the service if it exists. Returns whether it was removed. */
35
42
  detach() {
36
43
  const service = this.ctx.accessory.getServiceById(this.serviceType, this.subtype);
37
- if (service) {
38
- this.ctx.accessory.removeService(service);
39
- this.ctx.log.info(`Removed ${this.displayName}`);
40
- }
41
44
  this.service = undefined;
45
+ if (!service) {
46
+ return false;
47
+ }
48
+ this.ctx.accessory.removeService(service);
49
+ this.ctx.log.info(`Removed ${this.displayName}`);
50
+ return true;
42
51
  }
43
52
  update(snapshot, stale) {
44
53
  if (!this.service) {
@@ -73,9 +82,9 @@ export class ServiceBinding {
73
82
  * Runs a command for a set handler. A failure is reported to HomeKit as "no response" and the
74
83
  * characteristic is reverted to the cached value.
75
84
  */
76
- async command(label, send, optimistic) {
85
+ async command(label, send, options) {
77
86
  try {
78
- await this.ctx.controller.runCommand(label, send, optimistic);
87
+ await this.ctx.controller.runCommand(label, send, options);
79
88
  }
80
89
  catch {
81
90
  setTimeout(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/accessory/services/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/accessory/services/common.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,22 @@
1
1
  import type { BindingContext } from "./services/common.js";
2
2
  /**
3
3
  * One HomeKit accessory per vehicle. Services are created only for features that are enabled in
4
- * the config and that the vehicle reports as supported, and removed when the vehicle explicitly
5
- * reports them unsupported. While support is unknown (e.g. the API is unreachable), cached
4
+ * the config and that the vehicle reports as supported, and removed when two updates report them
5
+ * unsupported, so a single odd response does not cost the user the service's room and automations. While support is unknown (e.g. the API is unreachable), cached
6
6
  * services are kept as they are.
7
7
  */
8
8
  export declare class VehicleAccessory {
9
9
  private readonly ctx;
10
10
  private readonly bindings;
11
+ private readonly unsupportedUpdates;
12
+ /** `fetchedAt` of the last snapshot, so optimistic updates and stale notices are not counted. */
13
+ private lastFetchedAt;
14
+ private lastSupportSummary;
11
15
  constructor(ctx: BindingContext);
12
16
  private sync;
17
+ /**
18
+ * Logs what the vehicle supports whenever that changes, so users can see which features exist
19
+ * for their vehicle without trying each one, and which of them are turned off in the config.
20
+ */
21
+ private logSupport;
13
22
  }
@@ -1,24 +1,32 @@
1
1
  import { maskVin } from "../util/redact.js";
2
2
  import { PLUGIN_VERSION } from "../settings.js";
3
3
  import { featureSupport } from "../vehicle/snapshot.js";
4
- import { BatteryBinding, StateOfChargeSensorBinding, } from "./services/battery.js";
4
+ import { BatteryBinding, FuelBinding, FuelLevelSensorBinding, StateOfChargeSensorBinding, } from "./services/battery.js";
5
5
  import { PresenceBinding, contactBindings } from "./services/body.js";
6
6
  import { ChargingBinding, ChargingLimitBinding } from "./services/charging.js";
7
7
  import { ActiveVentilationBinding, AuxiliaryHeatingBinding, ClimateBinding, } from "./services/climate.js";
8
+ /** A service is removed only after this many updates report it unsupported, with none supported in between. */
9
+ const REMOVE_AFTER_UNSUPPORTED_UPDATES = 2;
8
10
  /**
9
11
  * One HomeKit accessory per vehicle. Services are created only for features that are enabled in
10
- * the config and that the vehicle reports as supported, and removed when the vehicle explicitly
11
- * reports them unsupported. While support is unknown (e.g. the API is unreachable), cached
12
+ * the config and that the vehicle reports as supported, and removed when two updates report them
13
+ * unsupported, so a single odd response does not cost the user the service's room and automations. While support is unknown (e.g. the API is unreachable), cached
12
14
  * services are kept as they are.
13
15
  */
14
16
  export class VehicleAccessory {
15
17
  ctx;
16
18
  bindings;
19
+ unsupportedUpdates = new Map();
20
+ /** `fetchedAt` of the last snapshot, so optimistic updates and stale notices are not counted. */
21
+ lastFetchedAt;
22
+ lastSupportSummary;
17
23
  constructor(ctx) {
18
24
  this.ctx = ctx;
19
25
  this.bindings = [
20
26
  new BatteryBinding(ctx),
21
27
  new StateOfChargeSensorBinding(ctx),
28
+ new FuelBinding(ctx),
29
+ new FuelLevelSensorBinding(ctx),
22
30
  new ChargingBinding(ctx),
23
31
  new ChargingLimitBinding(ctx),
24
32
  new ClimateBinding(ctx),
@@ -41,20 +49,61 @@ export class VehicleAccessory {
41
49
  }
42
50
  sync(snapshot) {
43
51
  const stale = this.ctx.controller.isStale();
52
+ const newUpdate = snapshot !== undefined && snapshot.fetchedAt !== this.lastFetchedAt;
53
+ this.lastFetchedAt = snapshot?.fetchedAt ?? this.lastFetchedAt;
54
+ let changed = false;
44
55
  for (const binding of this.bindings) {
45
56
  const enabled = this.ctx.settings.features[binding.feature];
46
57
  const supported = snapshot
47
58
  ? featureSupport(snapshot, binding.feature)
48
59
  : undefined;
60
+ if (enabled && supported === false && binding.exists()) {
61
+ const count = (this.unsupportedUpdates.get(binding.feature) ?? 0) +
62
+ (newUpdate ? 1 : 0);
63
+ this.unsupportedUpdates.set(binding.feature, count);
64
+ if (count < REMOVE_AFTER_UNSUPPORTED_UPDATES) {
65
+ binding.attach();
66
+ binding.update(snapshot, stale);
67
+ continue;
68
+ }
69
+ }
49
70
  if (!enabled || supported === false) {
50
- binding.detach();
71
+ this.unsupportedUpdates.delete(binding.feature);
72
+ changed = binding.detach() || changed;
51
73
  continue;
52
74
  }
75
+ if (supported === true) {
76
+ this.unsupportedUpdates.delete(binding.feature);
77
+ }
53
78
  if (supported === true || binding.exists()) {
54
- binding.attach();
79
+ changed = binding.attach() || changed;
55
80
  binding.update(snapshot, stale);
56
81
  }
57
82
  }
83
+ if (changed) {
84
+ this.ctx.onServicesChanged?.();
85
+ }
86
+ if (snapshot && newUpdate) {
87
+ this.logSupport(snapshot);
88
+ }
89
+ }
90
+ /**
91
+ * Logs what the vehicle supports whenever that changes, so users can see which features exist
92
+ * for their vehicle without trying each one, and which of them are turned off in the config.
93
+ */
94
+ logSupport(snapshot) {
95
+ const supported = this.bindings.filter((binding) => featureSupport(snapshot, binding.feature) === true);
96
+ const { features } = this.ctx.settings;
97
+ const shown = supported.filter((binding) => features[binding.feature]);
98
+ const off = supported.filter((binding) => !features[binding.feature]);
99
+ let summary = `Supported by the vehicle: ${shown.map((b) => b.name).join(", ") || "none"}`;
100
+ if (off.length > 0) {
101
+ summary += `. Also supported, but turned off: ${off.map((b) => `${b.name} (features.${b.feature})`).join(", ")}`;
102
+ }
103
+ if (summary !== this.lastSupportSummary) {
104
+ this.lastSupportSummary = summary;
105
+ this.ctx.log.info(summary);
106
+ }
58
107
  }
59
108
  }
60
109
  //# sourceMappingURL=vehicleAccessory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vehicleAccessory.js","sourceRoot":"","sources":["../../src/accessory/vehicleAccessory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAwB,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EACL,cAAc,EACd,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAG/B;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IAGE;IAFZ,QAAQ,CAAmB;IAE5C,YAA6B,GAAmB;QAAnB,QAAG,GAAH,GAAG,CAAgB;QAC9C,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,cAAc,CAAC,GAAG,CAAC;YACvB,IAAI,0BAA0B,CAAC,GAAG,CAAC;YACnC,IAAI,eAAe,CAAC,GAAG,CAAC;YACxB,IAAI,oBAAoB,CAAC,GAAG,CAAC;YAC7B,IAAI,cAAc,CAAC,GAAG,CAAC;YACvB,IAAI,uBAAuB,CAAC,GAAG,CAAC;YAChC,IAAI,wBAAwB,CAAC,GAAG,CAAC;YACjC,IAAI,eAAe,CAAC,GAAG,CAAC;YACxB,GAAG,eAAe,CAAC,GAAG,CAAC;SACxB,CAAC;QAEF,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC;QAC5C,GAAG,CAAC,SAAS;aACV,UAAU,CAAC,OAAO,CAAC,oBAAoB,CAAC;YACzC,EAAE,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC;aACxD,iBAAiB,CAAC,cAAc,CAAC,KAAK,EAAE,iBAAiB,CAAC;aAC1D,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aACzE,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAEtE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,QAAqC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC5C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,QAAQ;gBACxB,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC;gBAC3C,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,CAAC,OAAO,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBACpC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjB,SAAS;YACX,CAAC;YACD,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC3C,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"vehicleAccessory.js","sourceRoot":"","sources":["../../src/accessory/vehicleAccessory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAwB,MAAM,wBAAwB,CAAC;AAC9E,OAAO,EACL,cAAc,EACd,WAAW,EACX,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EACL,wBAAwB,EACxB,uBAAuB,EACvB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAG/B,+GAA+G;AAC/G,MAAM,gCAAgC,GAAG,CAAC,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IAOE;IANZ,QAAQ,CAAmB;IAC3B,kBAAkB,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC9E,iGAAiG;IACzF,aAAa,CAAqB;IAClC,kBAAkB,CAAqB;IAE/C,YAA6B,GAAmB;QAAnB,QAAG,GAAH,GAAG,CAAgB;QAC9C,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI,cAAc,CAAC,GAAG,CAAC;YACvB,IAAI,0BAA0B,CAAC,GAAG,CAAC;YACnC,IAAI,WAAW,CAAC,GAAG,CAAC;YACpB,IAAI,sBAAsB,CAAC,GAAG,CAAC;YAC/B,IAAI,eAAe,CAAC,GAAG,CAAC;YACxB,IAAI,oBAAoB,CAAC,GAAG,CAAC;YAC7B,IAAI,cAAc,CAAC,GAAG,CAAC;YACvB,IAAI,uBAAuB,CAAC,GAAG,CAAC;YAChC,IAAI,wBAAwB,CAAC,GAAG,CAAC;YACjC,IAAI,eAAe,CAAC,GAAG,CAAC;YACxB,GAAG,eAAe,CAAC,GAAG,CAAC;SACxB,CAAC;QAEF,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC;QAC5C,GAAG,CAAC,SAAS;aACV,UAAU,CAAC,OAAO,CAAC,oBAAoB,CAAC;YACzC,EAAE,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC;aACxD,iBAAiB,CAAC,cAAc,CAAC,KAAK,EAAE,iBAAiB,CAAC;aAC1D,iBAAiB,CAAC,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;aACzE,iBAAiB,CAAC,cAAc,CAAC,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAEtE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACnC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,IAAI,CAAC,QAAqC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC5C,MAAM,SAAS,GACb,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,SAAS,KAAK,IAAI,CAAC,aAAa,CAAC;QACtE,IAAI,CAAC,aAAa,GAAG,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC,aAAa,CAAC;QAC/D,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,SAAS,GAAG,QAAQ;gBACxB,CAAC,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC;gBAC3C,CAAC,CAAC,SAAS,CAAC;YACd,IAAI,OAAO,IAAI,SAAS,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBACvD,MAAM,KAAK,GACT,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBACnD,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACpD,IAAI,KAAK,GAAG,gCAAgC,EAAE,CAAC;oBAC7C,OAAO,CAAC,MAAM,EAAE,CAAC;oBACjB,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;oBAChC,SAAS;gBACX,CAAC;YACH,CAAC;YACD,IAAI,CAAC,OAAO,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;gBACpC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAChD,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC;gBACtC,SAAS;YACX,CAAC;YACD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC3C,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,IAAI,OAAO,CAAC;gBACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,UAAU,CAAC,QAAyB;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CACpC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAChE,CAAC;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QACvC,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACtE,IAAI,OAAO,GAAG,6BAA6B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;QAC3F,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,IAAI,qCAAqC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnH,CAAC;QACD,IAAI,OAAO,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CACF"}
@@ -4,7 +4,7 @@ export declare const DEFAULT_BASE_URL = "https://public.api.connect.skoda-auto.c
4
4
  export interface SkodaApiClientOptions {
5
5
  token: string;
6
6
  vin: string;
7
- /** Shared by all clients of the same vehicle, because the rate limit applies per VIN. */
7
+ /** The vehicle's request budget; the rate limit applies per VIN. */
8
8
  budget: RateBudget;
9
9
  baseUrl?: string;
10
10
  timeoutMs?: number;
@@ -24,7 +24,7 @@ export declare class SkodaApiClient {
24
24
  private readonly fetchImpl;
25
25
  constructor(options: SkodaApiClientOptions);
26
26
  /** `GET /api/v1/vehicles/{vin}` with an explicit `include`, so unsupported parts are reported as errors. */
27
- getVehicle(kind?: "poll" | "refresh", parts?: readonly VehiclePart[]): Promise<VehicleResponse>;
27
+ getVehicle(parts?: readonly VehiclePart[]): Promise<VehicleResponse>;
28
28
  startCharging(): Promise<void>;
29
29
  stopCharging(): Promise<void>;
30
30
  setChargingLimit(targetStateOfChargeInPercent: number): Promise<void>;