homebridge-rivian 1.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 (80) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/LICENSE +21 -0
  3. package/README.md +233 -0
  4. package/config.schema.json +123 -0
  5. package/dist/accessories/battery.d.ts +17 -0
  6. package/dist/accessories/battery.js +52 -0
  7. package/dist/accessories/battery.js.map +1 -0
  8. package/dist/accessories/climate.d.ts +24 -0
  9. package/dist/accessories/climate.js +104 -0
  10. package/dist/accessories/climate.js.map +1 -0
  11. package/dist/accessories/frontSeats.d.ts +18 -0
  12. package/dist/accessories/frontSeats.js +103 -0
  13. package/dist/accessories/frontSeats.js.map +1 -0
  14. package/dist/accessories/frunk.d.ts +16 -0
  15. package/dist/accessories/frunk.js +48 -0
  16. package/dist/accessories/frunk.js.map +1 -0
  17. package/dist/accessories/gearTunnel.d.ts +20 -0
  18. package/dist/accessories/gearTunnel.js +54 -0
  19. package/dist/accessories/gearTunnel.js.map +1 -0
  20. package/dist/accessories/liftgate.d.ts +17 -0
  21. package/dist/accessories/liftgate.js +49 -0
  22. package/dist/accessories/liftgate.js.map +1 -0
  23. package/dist/accessories/lock.d.ts +12 -0
  24. package/dist/accessories/lock.js +52 -0
  25. package/dist/accessories/lock.js.map +1 -0
  26. package/dist/accessories/rearSeatHeat.d.ts +13 -0
  27. package/dist/accessories/rearSeatHeat.js +40 -0
  28. package/dist/accessories/rearSeatHeat.js.map +1 -0
  29. package/dist/accessories/steeringHeat.d.ts +13 -0
  30. package/dist/accessories/steeringHeat.js +35 -0
  31. package/dist/accessories/steeringHeat.js.map +1 -0
  32. package/dist/accessories/tailgate.d.ts +16 -0
  33. package/dist/accessories/tailgate.js +42 -0
  34. package/dist/accessories/tailgate.js.map +1 -0
  35. package/dist/accessories/thirdRowHeat.d.ts +17 -0
  36. package/dist/accessories/thirdRowHeat.js +44 -0
  37. package/dist/accessories/thirdRowHeat.js.map +1 -0
  38. package/dist/accessories/tonneau.d.ts +17 -0
  39. package/dist/accessories/tonneau.js +49 -0
  40. package/dist/accessories/tonneau.js.map +1 -0
  41. package/dist/accessories/util.d.ts +11 -0
  42. package/dist/accessories/util.js +20 -0
  43. package/dist/accessories/util.js.map +1 -0
  44. package/dist/accessories/windows.d.ts +17 -0
  45. package/dist/accessories/windows.js +51 -0
  46. package/dist/accessories/windows.js.map +1 -0
  47. package/dist/auth-cli.d.ts +2 -0
  48. package/dist/auth-cli.js +155 -0
  49. package/dist/auth-cli.js.map +1 -0
  50. package/dist/commands.d.ts +35 -0
  51. package/dist/commands.js +80 -0
  52. package/dist/commands.js.map +1 -0
  53. package/dist/crypto.d.ts +21 -0
  54. package/dist/crypto.js +43 -0
  55. package/dist/crypto.js.map +1 -0
  56. package/dist/enroll.d.ts +17 -0
  57. package/dist/enroll.js +72 -0
  58. package/dist/enroll.js.map +1 -0
  59. package/dist/index.d.ts +3 -0
  60. package/dist/index.js +7 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/persist.d.ts +34 -0
  63. package/dist/persist.js +54 -0
  64. package/dist/persist.js.map +1 -0
  65. package/dist/platform.d.ts +58 -0
  66. package/dist/platform.js +272 -0
  67. package/dist/platform.js.map +1 -0
  68. package/dist/rivianClient.d.ts +97 -0
  69. package/dist/rivianClient.js +226 -0
  70. package/dist/rivianClient.js.map +1 -0
  71. package/dist/settings.d.ts +18 -0
  72. package/dist/settings.js +22 -0
  73. package/dist/settings.js.map +1 -0
  74. package/dist/state.d.ts +24 -0
  75. package/dist/state.js +96 -0
  76. package/dist/state.js.map +1 -0
  77. package/homebridge-ui/public/index.html +242 -0
  78. package/homebridge-ui/server.js +194 -0
  79. package/package.json +75 -0
  80. package/scripts/pair_rivian_ble.py +292 -0
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClimateAccessory = void 0;
4
+ const commands_1 = require("../commands");
5
+ const state_1 = require("../state");
6
+ // Rivian cabin preconditioning accepts target temps of 16-29 C (or LO/HI).
7
+ const MIN_TEMP_C = 16;
8
+ const MAX_TEMP_C = 29;
9
+ const DEFAULT_TEMP_C = 21;
10
+ /**
11
+ * Cabin preconditioning as a Thermostat tile.
12
+ *
13
+ * Rivian's cloud API does not expose a true live thermostat: it can enable /
14
+ * disable preconditioning and set a target temperature, and the vehicle decides
15
+ * whether to heat or cool to reach it. We therefore map:
16
+ * - Off -> disable preconditioning
17
+ * - Heat / Cool / Auto -> enable preconditioning + set target temperature
18
+ * Current temperature is the reported cabin interior temperature.
19
+ */
20
+ class ClimateAccessory {
21
+ platform;
22
+ vehicle;
23
+ service;
24
+ targetTempC = DEFAULT_TEMP_C;
25
+ constructor(platform, accessory, vehicle) {
26
+ this.platform = platform;
27
+ this.vehicle = vehicle;
28
+ const { Service, Characteristic } = this.platform;
29
+ // Remove the old Switch-based climate service from earlier versions.
30
+ const stale = accessory.getServiceById(Service.Switch, 'rivian-climate');
31
+ if (stale) {
32
+ accessory.removeService(stale);
33
+ }
34
+ this.service =
35
+ accessory.getServiceById(Service.Thermostat, 'rivian-climate') ||
36
+ accessory.addService(Service.Thermostat, `${vehicle.name} Climate`, 'rivian-climate');
37
+ this.service.setCharacteristic(Characteristic.Name, `${vehicle.name} Climate`);
38
+ if (!this.service.testCharacteristic(Characteristic.ConfiguredName)) {
39
+ this.service.addOptionalCharacteristic(Characteristic.ConfiguredName);
40
+ }
41
+ this.service.setCharacteristic(Characteristic.ConfiguredName, `${vehicle.name} Climate`);
42
+ this.service
43
+ .getCharacteristic(Characteristic.TargetTemperature)
44
+ .setProps({ minValue: MIN_TEMP_C, maxValue: MAX_TEMP_C, minStep: 0.5 });
45
+ this.service.setCharacteristic(Characteristic.TemperatureDisplayUnits, Characteristic.TemperatureDisplayUnits.CELSIUS);
46
+ this.service
47
+ .getCharacteristic(Characteristic.TargetHeatingCoolingState)
48
+ .onSet(this.setMode.bind(this));
49
+ this.service
50
+ .getCharacteristic(Characteristic.TargetTemperature)
51
+ .onSet(this.setTargetTemp.bind(this));
52
+ }
53
+ async setMode(value) {
54
+ const { Characteristic } = this.platform;
55
+ if (value === Characteristic.TargetHeatingCoolingState.OFF) {
56
+ await this.platform.sendCommand(this.vehicle, commands_1.Command.PRECONDITION_DISABLE);
57
+ return;
58
+ }
59
+ await this.platform.sendCommand(this.vehicle, commands_1.Command.PRECONDITION_ENABLE);
60
+ await this.platform.sendCommand(this.vehicle, commands_1.Command.SET_CABIN_TEMP, {
61
+ HVAC_set_temp: String(this.targetTempC),
62
+ });
63
+ }
64
+ async setTargetTemp(value) {
65
+ const temp = Math.min(MAX_TEMP_C, Math.max(MIN_TEMP_C, Number(value)));
66
+ this.targetTempC = temp;
67
+ await this.platform.sendCommand(this.vehicle, commands_1.Command.SET_CABIN_TEMP, {
68
+ HVAC_set_temp: String(temp),
69
+ });
70
+ }
71
+ update(values) {
72
+ const { Characteristic } = this.platform;
73
+ const interior = (0, state_1.toNumber)(values.cabinClimateInteriorTemperature);
74
+ if (interior !== undefined) {
75
+ this.service.updateCharacteristic(Characteristic.CurrentTemperature, interior);
76
+ }
77
+ const driverSet = (0, state_1.toNumber)(values.cabinClimateDriverTemperature);
78
+ if (driverSet !== undefined && driverSet >= MIN_TEMP_C && driverSet <= MAX_TEMP_C) {
79
+ this.targetTempC = driverSet;
80
+ this.service.updateCharacteristic(Characteristic.TargetTemperature, driverSet);
81
+ }
82
+ const on = (0, state_1.isPreconditioning)(values.cabinPreconditioningStatus);
83
+ if (on === undefined) {
84
+ return;
85
+ }
86
+ if (!on) {
87
+ this.service.updateCharacteristic(Characteristic.CurrentHeatingCoolingState, Characteristic.CurrentHeatingCoolingState.OFF);
88
+ this.service.updateCharacteristic(Characteristic.TargetHeatingCoolingState, Characteristic.TargetHeatingCoolingState.OFF);
89
+ return;
90
+ }
91
+ // Preconditioning is on: infer heating vs cooling from interior vs target.
92
+ const cooling = interior !== undefined && interior > this.targetTempC;
93
+ this.service.updateCharacteristic(Characteristic.CurrentHeatingCoolingState, cooling
94
+ ? Characteristic.CurrentHeatingCoolingState.COOL
95
+ : Characteristic.CurrentHeatingCoolingState.HEAT);
96
+ // Don't clobber an explicit Heat/Cool choice; only promote from Off.
97
+ const currentTarget = this.service.getCharacteristic(Characteristic.TargetHeatingCoolingState).value;
98
+ if (currentTarget === Characteristic.TargetHeatingCoolingState.OFF) {
99
+ this.service.updateCharacteristic(Characteristic.TargetHeatingCoolingState, Characteristic.TargetHeatingCoolingState.AUTO);
100
+ }
101
+ }
102
+ }
103
+ exports.ClimateAccessory = ClimateAccessory;
104
+ //# sourceMappingURL=climate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"climate.js","sourceRoot":"","sources":["../../src/accessories/climate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { PlatformAccessory } from 'homebridge';
2
+ import type { RivianHomebridgePlatform, RivianAccessory } from '../platform';
3
+ import type { StoredVehicle } from '../persist';
4
+ import { VehicleStateValues } from '../commands';
5
+ /**
6
+ * Front seats as Heater/Cooler tiles (Driver + Passenger). Each tile is a
7
+ * single on/off control that switches between Heat and Cool, mapping to
8
+ * Rivian's per-seat heat and vent commands. The temperature shown mirrors the
9
+ * cabin interior temp (seats have no setpoint of their own).
10
+ */
11
+ export declare class FrontSeatsAccessory implements RivianAccessory {
12
+ private readonly platform;
13
+ private readonly vehicle;
14
+ private readonly seats;
15
+ constructor(platform: RivianHomebridgePlatform, accessory: PlatformAccessory, vehicle: StoredVehicle);
16
+ private apply;
17
+ update(values: VehicleStateValues): void;
18
+ }
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FrontSeatsAccessory = void 0;
4
+ const commands_1 = require("../commands");
5
+ const state_1 = require("../state");
6
+ const util_1 = require("./util");
7
+ const ON_LEVEL = 3;
8
+ const OFF_LEVEL = 0;
9
+ /**
10
+ * Front seats as Heater/Cooler tiles (Driver + Passenger). Each tile is a
11
+ * single on/off control that switches between Heat and Cool, mapping to
12
+ * Rivian's per-seat heat and vent commands. The temperature shown mirrors the
13
+ * cabin interior temp (seats have no setpoint of their own).
14
+ */
15
+ class FrontSeatsAccessory {
16
+ platform;
17
+ vehicle;
18
+ seats = [];
19
+ constructor(platform, accessory, vehicle) {
20
+ this.platform = platform;
21
+ this.vehicle = vehicle;
22
+ const { Service, Characteristic } = this.platform;
23
+ // Remove the old single "Seat Cooling" switch from earlier versions.
24
+ const staleCool = accessory.getServiceById(Service.Switch, 'rivian-seat-cooling');
25
+ if (staleCool) {
26
+ accessory.removeService(staleCool);
27
+ }
28
+ const defs = [
29
+ {
30
+ subtype: 'rivian-seat-driver',
31
+ name: `${vehicle.name} Driver Seat`,
32
+ heatCmd: commands_1.Command.SEAT_FRONT_LEFT_HEAT,
33
+ ventCmd: commands_1.Command.SEAT_FRONT_LEFT_VENT,
34
+ heatProp: 'seatFrontLeftHeat',
35
+ ventProp: 'seatFrontLeftVent',
36
+ },
37
+ {
38
+ subtype: 'rivian-seat-passenger',
39
+ name: `${vehicle.name} Passenger Seat`,
40
+ heatCmd: commands_1.Command.SEAT_FRONT_RIGHT_HEAT,
41
+ ventCmd: commands_1.Command.SEAT_FRONT_RIGHT_VENT,
42
+ heatProp: 'seatFrontRightHeat',
43
+ ventProp: 'seatFrontRightVent',
44
+ },
45
+ ];
46
+ for (const def of defs) {
47
+ const service = accessory.getServiceById(Service.HeaterCooler, def.subtype) ||
48
+ accessory.addService(Service.HeaterCooler, def.name, def.subtype);
49
+ (0, util_1.nameService)(this.platform, service, def.name);
50
+ service
51
+ .getCharacteristic(Characteristic.TargetHeaterCoolerState)
52
+ .setProps({
53
+ validValues: [
54
+ Characteristic.TargetHeaterCoolerState.HEAT,
55
+ Characteristic.TargetHeaterCoolerState.COOL,
56
+ ],
57
+ });
58
+ service.updateCharacteristic(Characteristic.CurrentTemperature, 21);
59
+ service.getCharacteristic(Characteristic.Active).onSet(() => this.apply(def, service));
60
+ service.getCharacteristic(Characteristic.TargetHeaterCoolerState).onSet(() => this.apply(def, service));
61
+ this.seats.push({ def, service });
62
+ }
63
+ }
64
+ async apply(def, service) {
65
+ const { Characteristic } = this.platform;
66
+ const active = service.getCharacteristic(Characteristic.Active).value === Characteristic.Active.ACTIVE;
67
+ const mode = service.getCharacteristic(Characteristic.TargetHeaterCoolerState).value;
68
+ const heat = active && mode === Characteristic.TargetHeaterCoolerState.HEAT;
69
+ const cool = active && mode === Characteristic.TargetHeaterCoolerState.COOL;
70
+ await this.platform.sendCommand(this.vehicle, def.heatCmd, { level: heat ? ON_LEVEL : OFF_LEVEL });
71
+ await this.platform.sendCommand(this.vehicle, def.ventCmd, { level: cool ? ON_LEVEL : OFF_LEVEL });
72
+ service.updateCharacteristic(Characteristic.CurrentHeaterCoolerState, heat
73
+ ? Characteristic.CurrentHeaterCoolerState.HEATING
74
+ : cool
75
+ ? Characteristic.CurrentHeaterCoolerState.COOLING
76
+ : Characteristic.CurrentHeaterCoolerState.INACTIVE);
77
+ }
78
+ update(values) {
79
+ const { Characteristic } = this.platform;
80
+ const temp = (0, state_1.toNumber)(values.cabinClimateInteriorTemperature);
81
+ for (const { def, service } of this.seats) {
82
+ if (temp !== undefined) {
83
+ service.updateCharacteristic(Characteristic.CurrentTemperature, temp);
84
+ }
85
+ const heat = (0, state_1.isSeatActive)(values[def.heatProp]) === true;
86
+ const cool = (0, state_1.isSeatActive)(values[def.ventProp]) === true;
87
+ service.updateCharacteristic(Characteristic.Active, heat || cool ? Characteristic.Active.ACTIVE : Characteristic.Active.INACTIVE);
88
+ if (heat) {
89
+ service.updateCharacteristic(Characteristic.TargetHeaterCoolerState, Characteristic.TargetHeaterCoolerState.HEAT);
90
+ }
91
+ else if (cool) {
92
+ service.updateCharacteristic(Characteristic.TargetHeaterCoolerState, Characteristic.TargetHeaterCoolerState.COOL);
93
+ }
94
+ service.updateCharacteristic(Characteristic.CurrentHeaterCoolerState, heat
95
+ ? Characteristic.CurrentHeaterCoolerState.HEATING
96
+ : cool
97
+ ? Characteristic.CurrentHeaterCoolerState.COOLING
98
+ : Characteristic.CurrentHeaterCoolerState.INACTIVE);
99
+ }
100
+ }
101
+ }
102
+ exports.FrontSeatsAccessory = FrontSeatsAccessory;
103
+ //# sourceMappingURL=frontSeats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontSeats.js","sourceRoot":"","sources":["../../src/accessories/frontSeats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { PlatformAccessory } from 'homebridge';
2
+ import type { RivianHomebridgePlatform, RivianAccessory } from '../platform';
3
+ import type { StoredVehicle } from '../persist';
4
+ import { VehicleStateValues } from '../commands';
5
+ /**
6
+ * Front trunk as a Garage Door tile so the Home app shows a clear
7
+ * Open / Closed (and Opening / Closing) state.
8
+ */
9
+ export declare class FrunkAccessory implements RivianAccessory {
10
+ private readonly platform;
11
+ private readonly vehicle;
12
+ private readonly service;
13
+ constructor(platform: RivianHomebridgePlatform, accessory: PlatformAccessory, vehicle: StoredVehicle);
14
+ private setTarget;
15
+ update(values: VehicleStateValues): void;
16
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FrunkAccessory = void 0;
4
+ const commands_1 = require("../commands");
5
+ const state_1 = require("../state");
6
+ const util_1 = require("./util");
7
+ /**
8
+ * Front trunk as a Garage Door tile so the Home app shows a clear
9
+ * Open / Closed (and Opening / Closing) state.
10
+ */
11
+ class FrunkAccessory {
12
+ platform;
13
+ vehicle;
14
+ service;
15
+ constructor(platform, accessory, vehicle) {
16
+ this.platform = platform;
17
+ this.vehicle = vehicle;
18
+ const { Service, Characteristic } = this.platform;
19
+ // Remove the old Switch-based service from earlier versions, if present.
20
+ const stale = accessory.getServiceById(Service.Switch, 'rivian-frunk');
21
+ if (stale) {
22
+ accessory.removeService(stale);
23
+ }
24
+ this.service =
25
+ accessory.getServiceById(Service.GarageDoorOpener, 'rivian-frunk') ||
26
+ accessory.addService(Service.GarageDoorOpener, `${vehicle.name} Frunk`, 'rivian-frunk');
27
+ (0, util_1.nameService)(this.platform, this.service, `${vehicle.name} Frunk`);
28
+ this.service.setCharacteristic(Characteristic.ObstructionDetected, false);
29
+ this.service.getCharacteristic(Characteristic.TargetDoorState).onSet(this.setTarget.bind(this));
30
+ }
31
+ async setTarget(value) {
32
+ const { Characteristic } = this.platform;
33
+ const open = value === Characteristic.TargetDoorState.OPEN;
34
+ await this.platform.sendCommand(this.vehicle, open ? commands_1.Command.OPEN_FRUNK : commands_1.Command.CLOSE_FRUNK);
35
+ this.service.updateCharacteristic(Characteristic.CurrentDoorState, open ? Characteristic.CurrentDoorState.OPENING : Characteristic.CurrentDoorState.CLOSING);
36
+ }
37
+ update(values) {
38
+ const { Characteristic } = this.platform;
39
+ const open = (0, state_1.isOpen)(values.closureFrunkClosed);
40
+ if (open === undefined) {
41
+ return;
42
+ }
43
+ this.service.updateCharacteristic(Characteristic.CurrentDoorState, open ? Characteristic.CurrentDoorState.OPEN : Characteristic.CurrentDoorState.CLOSED);
44
+ this.service.updateCharacteristic(Characteristic.TargetDoorState, open ? Characteristic.TargetDoorState.OPEN : Characteristic.TargetDoorState.CLOSED);
45
+ }
46
+ }
47
+ exports.FrunkAccessory = FrunkAccessory;
48
+ //# sourceMappingURL=frunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frunk.js","sourceRoot":"","sources":["../../src/accessories/frunk.ts"],"names":[],"mappings":";;;AAGA,0CAA0D;AAC1D,oCAAkC;AAClC,iCAAqC;AAErC;;;GAGG;AACH,MAAa,cAAc;IAIN;IAEA;IALF,OAAO,CAAU;IAElC,YACmB,QAAkC,EACnD,SAA4B,EACX,OAAsB;QAFtB,aAAQ,GAAR,QAAQ,CAA0B;QAElC,YAAO,GAAP,OAAO,CAAe;QAEvC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QAElD,yEAAyE;QACzE,MAAM,KAAK,GAAG,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACvE,IAAI,KAAK,EAAE,CAAC;YACV,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,OAAO;YACV,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,cAAc,CAAC;gBAClE,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,QAAQ,EAAE,cAAc,CAAC,CAAC;QAC1F,IAAA,kBAAW,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClG,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAA0B;QAChD,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,KAAK,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC;QAC3D,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAO,CAAC,UAAU,CAAC,CAAC,CAAC,kBAAO,CAAC,WAAW,CAAC,CAAC;QAC/F,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC/B,cAAc,CAAC,gBAAgB,EAC/B,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CACzF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAA0B;QAC/B,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzC,MAAM,IAAI,GAAG,IAAA,cAAM,EAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;QAC/C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC/B,cAAc,CAAC,gBAAgB,EAC/B,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,CACrF,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC/B,cAAc,CAAC,eAAe,EAC9B,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,MAAM,CACnF,CAAC;IACJ,CAAC;CACF;AAlDD,wCAkDC"}
@@ -0,0 +1,20 @@
1
+ import type { PlatformAccessory } from 'homebridge';
2
+ import type { RivianHomebridgePlatform, RivianAccessory } from '../platform';
3
+ import type { StoredVehicle } from '../persist';
4
+ import { VehicleStateValues } from '../commands';
5
+ /**
6
+ * R1T gear tunnel access (the two side-bin doors), as two Switches.
7
+ *
8
+ * The API can only *release* (open) a side bin - there is no close command (you
9
+ * push the door shut by hand). So turning a switch on opens that side; the
10
+ * switch otherwise reflects the door's actual open/closed state from polling.
11
+ */
12
+ export declare class GearTunnelAccessory implements RivianAccessory {
13
+ private readonly platform;
14
+ private readonly vehicle;
15
+ private readonly left;
16
+ private readonly right;
17
+ constructor(platform: RivianHomebridgePlatform, accessory: PlatformAccessory, vehicle: StoredVehicle);
18
+ private release;
19
+ update(values: VehicleStateValues): void;
20
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GearTunnelAccessory = void 0;
4
+ const commands_1 = require("../commands");
5
+ const state_1 = require("../state");
6
+ const util_1 = require("./util");
7
+ /**
8
+ * R1T gear tunnel access (the two side-bin doors), as two Switches.
9
+ *
10
+ * The API can only *release* (open) a side bin - there is no close command (you
11
+ * push the door shut by hand). So turning a switch on opens that side; the
12
+ * switch otherwise reflects the door's actual open/closed state from polling.
13
+ */
14
+ class GearTunnelAccessory {
15
+ platform;
16
+ vehicle;
17
+ left;
18
+ right;
19
+ constructor(platform, accessory, vehicle) {
20
+ this.platform = platform;
21
+ this.vehicle = vehicle;
22
+ const { Service, Characteristic } = this.platform;
23
+ this.left =
24
+ accessory.getServiceById(Service.Switch, 'rivian-gear-left') ||
25
+ accessory.addService(Service.Switch, `${vehicle.name} Gear Tunnel Left`, 'rivian-gear-left');
26
+ this.right =
27
+ accessory.getServiceById(Service.Switch, 'rivian-gear-right') ||
28
+ accessory.addService(Service.Switch, `${vehicle.name} Gear Tunnel Right`, 'rivian-gear-right');
29
+ (0, util_1.nameService)(this.platform, this.left, `${vehicle.name} Gear Tunnel Left`);
30
+ (0, util_1.nameService)(this.platform, this.right, `${vehicle.name} Gear Tunnel Right`);
31
+ this.left.getCharacteristic(Characteristic.On).onSet((v) => this.release(commands_1.Command.RELEASE_LEFT_SIDE_BIN, v));
32
+ this.right.getCharacteristic(Characteristic.On).onSet((v) => this.release(commands_1.Command.RELEASE_RIGHT_SIDE_BIN, v));
33
+ }
34
+ async release(command, value) {
35
+ // Only "open" is supported; closing is manual, so off is a no-op (the next
36
+ // state poll keeps the switch in sync with the actual door).
37
+ if (value) {
38
+ await this.platform.sendCommand(this.vehicle, command);
39
+ }
40
+ }
41
+ update(values) {
42
+ const { Characteristic } = this.platform;
43
+ const l = (0, state_1.isOpen)(values.closureSideBinLeftClosed);
44
+ if (l !== undefined) {
45
+ this.left.updateCharacteristic(Characteristic.On, l);
46
+ }
47
+ const r = (0, state_1.isOpen)(values.closureSideBinRightClosed);
48
+ if (r !== undefined) {
49
+ this.right.updateCharacteristic(Characteristic.On, r);
50
+ }
51
+ }
52
+ }
53
+ exports.GearTunnelAccessory = GearTunnelAccessory;
54
+ //# sourceMappingURL=gearTunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gearTunnel.js","sourceRoot":"","sources":["../../src/accessories/gearTunnel.ts"],"names":[],"mappings":";;;AAGA,0CAA0D;AAC1D,oCAAkC;AAClC,iCAAqC;AAErC;;;;;;GAMG;AACH,MAAa,mBAAmB;IAKX;IAEA;IANF,IAAI,CAAU;IACd,KAAK,CAAU;IAEhC,YACmB,QAAkC,EACnD,SAA4B,EACX,OAAsB;QAFtB,aAAQ,GAAR,QAAQ,CAA0B;QAElC,YAAO,GAAP,OAAO,CAAe;QAEvC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QAElD,IAAI,CAAC,IAAI;YACP,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,kBAAkB,CAAC;gBAC5D,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,mBAAmB,EAAE,kBAAkB,CAAC,CAAC;QAC/F,IAAI,CAAC,KAAK;YACR,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC;gBAC7D,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,oBAAoB,EAAE,mBAAmB,CAAC,CAAC;QACjG,IAAA,kBAAW,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,mBAAmB,CAAC,CAAC;QAC1E,IAAA,kBAAW,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,oBAAoB,CAAC,CAAC;QAE5E,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5G,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAC;IAChH,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,KAA0B;QAC/D,2EAA2E;QAC3E,6DAA6D;QAC7D,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,MAAM,CAAC,MAA0B;QAC/B,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzC,MAAM,CAAC,GAAG,IAAA,cAAM,EAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,CAAC,GAAG,IAAA,cAAM,EAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;QACnD,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;CACF;AA3CD,kDA2CC"}
@@ -0,0 +1,17 @@
1
+ import type { PlatformAccessory } from 'homebridge';
2
+ import type { RivianHomebridgePlatform, RivianAccessory } from '../platform';
3
+ import type { StoredVehicle } from '../persist';
4
+ import { VehicleStateValues } from '../commands';
5
+ /**
6
+ * Rear trunk / powered liftgate for the R1S, as a Garage Door tile
7
+ * (open + close with Open/Closed state). The R1T uses the tailgate accessory
8
+ * instead (a drop tailgate that the API can't close or report position for).
9
+ */
10
+ export declare class LiftgateAccessory implements RivianAccessory {
11
+ private readonly platform;
12
+ private readonly vehicle;
13
+ private readonly service;
14
+ constructor(platform: RivianHomebridgePlatform, accessory: PlatformAccessory, vehicle: StoredVehicle);
15
+ private setTarget;
16
+ update(values: VehicleStateValues): void;
17
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LiftgateAccessory = void 0;
4
+ const commands_1 = require("../commands");
5
+ const state_1 = require("../state");
6
+ const util_1 = require("./util");
7
+ /**
8
+ * Rear trunk / powered liftgate for the R1S, as a Garage Door tile
9
+ * (open + close with Open/Closed state). The R1T uses the tailgate accessory
10
+ * instead (a drop tailgate that the API can't close or report position for).
11
+ */
12
+ class LiftgateAccessory {
13
+ platform;
14
+ vehicle;
15
+ service;
16
+ constructor(platform, accessory, vehicle) {
17
+ this.platform = platform;
18
+ this.vehicle = vehicle;
19
+ const { Service, Characteristic } = this.platform;
20
+ // Remove a tailgate Switch if this vehicle was previously treated as an R1T.
21
+ const staleTailgate = accessory.getServiceById(Service.Switch, 'rivian-tailgate');
22
+ if (staleTailgate) {
23
+ accessory.removeService(staleTailgate);
24
+ }
25
+ this.service =
26
+ accessory.getServiceById(Service.GarageDoorOpener, 'rivian-liftgate') ||
27
+ accessory.addService(Service.GarageDoorOpener, `${vehicle.name} Trunk`, 'rivian-liftgate');
28
+ (0, util_1.nameService)(this.platform, this.service, `${vehicle.name} Trunk`);
29
+ this.service.setCharacteristic(Characteristic.ObstructionDetected, false);
30
+ this.service.getCharacteristic(Characteristic.TargetDoorState).onSet(this.setTarget.bind(this));
31
+ }
32
+ async setTarget(value) {
33
+ const { Characteristic } = this.platform;
34
+ const open = value === Characteristic.TargetDoorState.OPEN;
35
+ await this.platform.sendCommand(this.vehicle, open ? commands_1.Command.OPEN_TAILGATE : commands_1.Command.CLOSE_LIFTGATE);
36
+ this.service.updateCharacteristic(Characteristic.CurrentDoorState, open ? Characteristic.CurrentDoorState.OPENING : Characteristic.CurrentDoorState.CLOSING);
37
+ }
38
+ update(values) {
39
+ const { Characteristic } = this.platform;
40
+ const open = (0, state_1.isOpen)(values.closureLiftgateClosed);
41
+ if (open === undefined) {
42
+ return;
43
+ }
44
+ this.service.updateCharacteristic(Characteristic.CurrentDoorState, open ? Characteristic.CurrentDoorState.OPEN : Characteristic.CurrentDoorState.CLOSED);
45
+ this.service.updateCharacteristic(Characteristic.TargetDoorState, open ? Characteristic.TargetDoorState.OPEN : Characteristic.TargetDoorState.CLOSED);
46
+ }
47
+ }
48
+ exports.LiftgateAccessory = LiftgateAccessory;
49
+ //# sourceMappingURL=liftgate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"liftgate.js","sourceRoot":"","sources":["../../src/accessories/liftgate.ts"],"names":[],"mappings":";;;AAGA,0CAA0D;AAC1D,oCAAkC;AAClC,iCAAqC;AAErC;;;;GAIG;AACH,MAAa,iBAAiB;IAIT;IAEA;IALF,OAAO,CAAU;IAElC,YACmB,QAAkC,EACnD,SAA4B,EACX,OAAsB;QAFtB,aAAQ,GAAR,QAAQ,CAA0B;QAElC,YAAO,GAAP,OAAO,CAAe;QAEvC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QAElD,6EAA6E;QAC7E,MAAM,aAAa,GAAG,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAClF,IAAI,aAAa,EAAE,CAAC;YAClB,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,CAAC,OAAO;YACV,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;gBACrE,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAC7F,IAAA,kBAAW,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC;QAClE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAE1E,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClG,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAA0B;QAChD,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,KAAK,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC;QAC3D,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAO,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAO,CAAC,cAAc,CAAC,CAAC;QACrG,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC/B,cAAc,CAAC,gBAAgB,EAC/B,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CACzF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAA0B;QAC/B,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzC,MAAM,IAAI,GAAG,IAAA,cAAM,EAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAClD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC/B,cAAc,CAAC,gBAAgB,EAC/B,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,CACrF,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC/B,cAAc,CAAC,eAAe,EAC9B,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,MAAM,CACnF,CAAC;IACJ,CAAC;CACF;AAlDD,8CAkDC"}
@@ -0,0 +1,12 @@
1
+ import type { PlatformAccessory } from 'homebridge';
2
+ import type { RivianHomebridgePlatform, RivianAccessory } from '../platform';
3
+ import type { StoredVehicle } from '../persist';
4
+ import { VehicleStateValues } from '../commands';
5
+ export declare class LockAccessory implements RivianAccessory {
6
+ private readonly platform;
7
+ private readonly vehicle;
8
+ private readonly service;
9
+ constructor(platform: RivianHomebridgePlatform, accessory: PlatformAccessory, vehicle: StoredVehicle);
10
+ private setTarget;
11
+ update(values: VehicleStateValues): void;
12
+ }
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LockAccessory = void 0;
4
+ const commands_1 = require("../commands");
5
+ const state_1 = require("../state");
6
+ const util_1 = require("./util");
7
+ const DOOR_LOCK_PROPS = [
8
+ 'doorFrontLeftLocked',
9
+ 'doorFrontRightLocked',
10
+ 'doorRearLeftLocked',
11
+ 'doorRearRightLocked',
12
+ ];
13
+ class LockAccessory {
14
+ platform;
15
+ vehicle;
16
+ service;
17
+ constructor(platform, accessory, vehicle) {
18
+ this.platform = platform;
19
+ this.vehicle = vehicle;
20
+ const { Service, Characteristic } = this.platform;
21
+ this.service =
22
+ accessory.getServiceById(Service.LockMechanism, 'rivian-lock') ||
23
+ accessory.addService(Service.LockMechanism, `${vehicle.name} Lock`, 'rivian-lock');
24
+ (0, util_1.nameService)(this.platform, this.service, `${vehicle.name} Lock`);
25
+ this.service.getCharacteristic(Characteristic.LockTargetState).onSet(this.setTarget.bind(this));
26
+ }
27
+ async setTarget(value) {
28
+ const { Characteristic } = this.platform;
29
+ const lock = value === Characteristic.LockTargetState.SECURED;
30
+ await this.platform.sendCommand(this.vehicle, lock ? commands_1.Command.LOCK_ALL : commands_1.Command.UNLOCK_ALL);
31
+ // Optimistically reflect the requested state.
32
+ this.service.updateCharacteristic(Characteristic.LockCurrentState, lock ? Characteristic.LockCurrentState.SECURED : Characteristic.LockCurrentState.UNSECURED);
33
+ }
34
+ update(values) {
35
+ const { Characteristic } = this.platform;
36
+ const states = DOOR_LOCK_PROPS.map((p) => (0, state_1.isLocked)(values[p])).filter((s) => s !== undefined);
37
+ if (!states.length) {
38
+ return;
39
+ }
40
+ const allLocked = states.every((s) => s === true);
41
+ const current = allLocked
42
+ ? Characteristic.LockCurrentState.SECURED
43
+ : Characteristic.LockCurrentState.UNSECURED;
44
+ const target = allLocked
45
+ ? Characteristic.LockTargetState.SECURED
46
+ : Characteristic.LockTargetState.UNSECURED;
47
+ this.service.updateCharacteristic(Characteristic.LockCurrentState, current);
48
+ this.service.updateCharacteristic(Characteristic.LockTargetState, target);
49
+ }
50
+ }
51
+ exports.LockAccessory = LockAccessory;
52
+ //# sourceMappingURL=lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.js","sourceRoot":"","sources":["../../src/accessories/lock.ts"],"names":[],"mappings":";;;AAGA,0CAA0D;AAC1D,oCAAoC;AACpC,iCAAqC;AAErC,MAAM,eAAe,GAAG;IACtB,qBAAqB;IACrB,sBAAsB;IACtB,oBAAoB;IACpB,qBAAqB;CACtB,CAAC;AAEF,MAAa,aAAa;IAIL;IAEA;IALF,OAAO,CAAU;IAElC,YACmB,QAAkC,EACnD,SAA4B,EACX,OAAsB;QAFtB,aAAQ,GAAR,QAAQ,CAA0B;QAElC,YAAO,GAAP,OAAO,CAAe;QAEvC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClD,IAAI,CAAC,OAAO;YACV,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,CAAC;gBAC9D,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,OAAO,EAAE,aAAa,CAAC,CAAC;QACrF,IAAA,kBAAW,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC;QAEjE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAClG,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAA0B;QAChD,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzC,MAAM,IAAI,GAAG,KAAK,KAAK,cAAc,CAAC,eAAe,CAAC,OAAO,CAAC;QAC9D,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAO,CAAC,UAAU,CAAC,CAAC;QAC5F,8CAA8C;QAC9C,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAC/B,cAAc,CAAC,gBAAgB,EAC/B,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAC3F,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,MAA0B;QAC/B,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,gBAAQ,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC9F,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,SAAS;YACvB,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO;YACzC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,SAAS,CAAC;QAC9C,MAAM,MAAM,GAAG,SAAS;YACtB,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,OAAO;YACxC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,cAAc,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QAC5E,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,cAAc,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;CACF;AA5CD,sCA4CC"}
@@ -0,0 +1,13 @@
1
+ import type { PlatformAccessory } from 'homebridge';
2
+ import type { RivianHomebridgePlatform, RivianAccessory } from '../platform';
3
+ import type { StoredVehicle } from '../persist';
4
+ import { VehicleStateValues } from '../commands';
5
+ /** Second-row seat heating as a Switch (both rear seats together). */
6
+ export declare class RearSeatHeatAccessory implements RivianAccessory {
7
+ private readonly platform;
8
+ private readonly vehicle;
9
+ private readonly service;
10
+ constructor(platform: RivianHomebridgePlatform, accessory: PlatformAccessory, vehicle: StoredVehicle);
11
+ private setOn;
12
+ update(values: VehicleStateValues): void;
13
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RearSeatHeatAccessory = void 0;
4
+ const commands_1 = require("../commands");
5
+ const state_1 = require("../state");
6
+ const util_1 = require("./util");
7
+ const ON_LEVEL = 3;
8
+ const OFF_LEVEL = 0;
9
+ /** Second-row seat heating as a Switch (both rear seats together). */
10
+ class RearSeatHeatAccessory {
11
+ platform;
12
+ vehicle;
13
+ service;
14
+ constructor(platform, accessory, vehicle) {
15
+ this.platform = platform;
16
+ this.vehicle = vehicle;
17
+ const { Service, Characteristic } = this.platform;
18
+ this.service =
19
+ accessory.getServiceById(Service.Switch, 'rivian-rear-heat') ||
20
+ accessory.addService(Service.Switch, `${vehicle.name} Rear Seat Heat`, 'rivian-rear-heat');
21
+ (0, util_1.nameService)(this.platform, this.service, `${vehicle.name} Rear Seat Heat`);
22
+ this.service.getCharacteristic(Characteristic.On).onSet(this.setOn.bind(this));
23
+ }
24
+ async setOn(value) {
25
+ const level = value ? ON_LEVEL : OFF_LEVEL;
26
+ await this.platform.sendCommand(this.vehicle, commands_1.Command.SEAT_REAR_LEFT_HEAT, { level });
27
+ await this.platform.sendCommand(this.vehicle, commands_1.Command.SEAT_REAR_RIGHT_HEAT, { level });
28
+ }
29
+ update(values) {
30
+ const states = [values.seatRearLeftHeat, values.seatRearRightHeat]
31
+ .map((v) => (0, state_1.isSeatActive)(v))
32
+ .filter((s) => s !== undefined);
33
+ if (!states.length) {
34
+ return;
35
+ }
36
+ this.service.updateCharacteristic(this.platform.Characteristic.On, states.some((s) => s === true));
37
+ }
38
+ }
39
+ exports.RearSeatHeatAccessory = RearSeatHeatAccessory;
40
+ //# sourceMappingURL=rearSeatHeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rearSeatHeat.js","sourceRoot":"","sources":["../../src/accessories/rearSeatHeat.ts"],"names":[],"mappings":";;;AAGA,0CAA0D;AAC1D,oCAAwC;AACxC,iCAAqC;AAErC,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB,sEAAsE;AACtE,MAAa,qBAAqB;IAIb;IAEA;IALF,OAAO,CAAU;IAElC,YACmB,QAAkC,EACnD,SAA4B,EACX,OAAsB;QAFtB,aAAQ,GAAR,QAAQ,CAA0B;QAElC,YAAO,GAAP,OAAO,CAAe;QAEvC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClD,IAAI,CAAC,OAAO;YACV,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,kBAAkB,CAAC;gBAC5D,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,iBAAiB,EAAE,kBAAkB,CAAC,CAAC;QAC7F,IAAA,kBAAW,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,iBAAiB,CAAC,CAAC;QAE3E,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,CAAC;IAEO,KAAK,CAAC,KAAK,CAAC,KAA0B;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC3C,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAO,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACtF,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAO,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,CAAC,MAA0B;QAC/B,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,iBAAiB,CAAC;aAC/D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,oBAAY,EAAC,CAAC,CAAC,CAAC;aAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACrG,CAAC;CACF;AAhCD,sDAgCC"}
@@ -0,0 +1,13 @@
1
+ import type { PlatformAccessory } from 'homebridge';
2
+ import type { RivianHomebridgePlatform, RivianAccessory } from '../platform';
3
+ import type { StoredVehicle } from '../persist';
4
+ import { VehicleStateValues } from '../commands';
5
+ /** Heated steering wheel as a Switch. */
6
+ export declare class SteeringHeatAccessory implements RivianAccessory {
7
+ private readonly platform;
8
+ private readonly vehicle;
9
+ private readonly service;
10
+ constructor(platform: RivianHomebridgePlatform, accessory: PlatformAccessory, vehicle: StoredVehicle);
11
+ private setOn;
12
+ update(values: VehicleStateValues): void;
13
+ }