rivian-python-client 2.2.0b0__tar.gz → 2.2.0b1__tar.gz

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 (95) hide show
  1. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/PKG-INFO +1 -1
  2. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/__version__.py +1 -1
  3. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/__init__.py +2 -0
  4. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/charging.py +29 -9
  5. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/holiday_celebration.py +1 -1
  6. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/navigation.py +6 -3
  7. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/ota.py +15 -8
  8. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/charging.proto +16 -7
  9. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/charging_pb2.py +12 -10
  10. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/charging_pb2.pyi +19 -6
  11. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/holiday_celebration.proto +4 -1
  12. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/holiday_celebration_pb2.py +4 -4
  13. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/holiday_celebration_pb2.pyi +8 -2
  14. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/navigation.proto +8 -1
  15. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/navigation_pb2.py +19 -17
  16. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/navigation_pb2.pyi +15 -4
  17. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/ota.proto +12 -7
  18. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/ota_pb2.py +15 -13
  19. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/ota_pb2.pyi +14 -9
  20. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/ws_monitor.py +31 -0
  21. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/.gitignore +0 -0
  22. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/README.md +0 -0
  23. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/pyproject.toml +0 -0
  24. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/__init__.py +0 -0
  25. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/ble.py +0 -0
  26. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/const.py +0 -0
  27. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/exceptions.py +0 -0
  28. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/body.py +0 -0
  29. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/comfort.py +0 -0
  30. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/core.py +0 -0
  31. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/departure.py +0 -0
  32. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/device_table.py +0 -0
  33. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/dynamics.py +0 -0
  34. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/energy.py +0 -0
  35. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/energy_edge_compute.py +0 -0
  36. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/gearguard_streaming.py +0 -0
  37. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/geofence.py +0 -0
  38. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/parallax.py +0 -0
  39. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/__init__.py +0 -0
  40. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/body.proto +0 -0
  41. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/body_pb2.py +0 -0
  42. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/body_pb2.pyi +0 -0
  43. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/comfort.proto +0 -0
  44. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/comfort_pb2.py +0 -0
  45. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/comfort_pb2.pyi +0 -0
  46. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/departure.proto +0 -0
  47. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/departure_pb2.py +0 -0
  48. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/departure_pb2.pyi +0 -0
  49. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/device_table.proto +0 -0
  50. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/device_table_pb2.py +0 -0
  51. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/device_table_pb2.pyi +0 -0
  52. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/dynamics.proto +0 -0
  53. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/dynamics_pb2.py +0 -0
  54. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/dynamics_pb2.pyi +0 -0
  55. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/energy.proto +0 -0
  56. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/energy_edge_compute.proto +0 -0
  57. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/energy_edge_compute_pb2.py +0 -0
  58. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/energy_edge_compute_pb2.pyi +0 -0
  59. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/energy_pb2.py +0 -0
  60. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/energy_pb2.pyi +0 -0
  61. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/gearguard_streaming.proto +0 -0
  62. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/gearguard_streaming_pb2.py +0 -0
  63. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/gearguard_streaming_pb2.pyi +0 -0
  64. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/geofence.proto +0 -0
  65. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/geofence_pb2.py +0 -0
  66. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/geofence_pb2.pyi +0 -0
  67. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/parallax.proto +0 -0
  68. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/parallax_pb2.py +0 -0
  69. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/parallax_pb2.pyi +0 -0
  70. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/secure_file_transfer.proto +0 -0
  71. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/secure_file_transfer_pb2.py +0 -0
  72. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/secure_file_transfer_pb2.pyi +0 -0
  73. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/security.proto +0 -0
  74. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/security_pb2.py +0 -0
  75. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/security_pb2.pyi +0 -0
  76. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/user_passcodes.proto +0 -0
  77. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/user_passcodes_pb2.py +0 -0
  78. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/user_passcodes_pb2.pyi +0 -0
  79. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/vehicle.proto +0 -0
  80. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/vehicle_access.proto +0 -0
  81. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/vehicle_access_pb2.py +0 -0
  82. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/vehicle_access_pb2.pyi +0 -0
  83. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/vehicle_pb2.py +0 -0
  84. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/proto/vehicle_pb2.pyi +0 -0
  85. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/secure_file_transfer.py +0 -0
  86. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/security.py +0 -0
  87. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/user_passcodes.py +0 -0
  88. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/vehicle.py +0 -0
  89. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/parallax/vehicle_access.py +0 -0
  90. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/py.typed +0 -0
  91. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/rivian.py +0 -0
  92. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/schemas/charging.graphql +0 -0
  93. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/schemas/gateway.graphql +0 -0
  94. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/schemas/orders.graphql +0 -0
  95. {rivian_python_client-2.2.0b0 → rivian_python_client-2.2.0b1}/src/rivian/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: rivian-python-client
3
- Version: 2.2.0b0
3
+ Version: 2.2.0b1
4
4
  Summary: Rivian API Client (Unofficial)
5
5
  Author-email: Brian Retterer <bretterer@gmail.com>, "J.R. Gutierrez" <jrgutier@gmail.com>, Nathan Spencer <natekspencer@gmail.com>, Trevor Mack <drummer8001@gmail.com>
6
6
  License-Expression: MIT
@@ -1,4 +1,4 @@
1
1
  # This file is auto-generated by Hatchling. As such, do not:
2
2
  # - modify
3
3
  # - track in version control e.g. be sure to add to .gitignore
4
- __version__ = VERSION = '2.2.0b0'
4
+ __version__ = VERSION = '2.2.0b1'
@@ -50,7 +50,9 @@ from .core import (
50
50
  PARALLAX_RVMS: list[str] = list(RVMDecoder.decoders)
51
51
 
52
52
  CHARGING_RVMS: list[str] = [
53
+ "charging.energy.state",
53
54
  "charging.session.notification",
55
+ "charging.session.power",
54
56
  "charging.session.remote_command",
55
57
  "charging.session.soc_slider",
56
58
  "charging.session.status",
@@ -210,17 +210,37 @@ def decode_time_estimation(m: charging_pb2.TimeEstimation) -> dict[str, Any]:
210
210
  return {"timeToEndOfCharge": m.estimated_time_remaining}
211
211
 
212
212
 
213
+ _CHARGER_STATUS_MAP: Final[dict[int, str]] = {
214
+ 1: "chrgr_sts_not_connected",
215
+ 2: "chrgr_sts_connected_no_chrg",
216
+ 3: "chrgr_sts_connected_charging",
217
+ }
218
+
219
+
213
220
  @RVMDecoder.register("charging.energy.state", charging_pb2.EnergyState)
214
221
  def decode_energy_state(m: charging_pb2.EnergyState) -> dict[str, Any]:
215
- """charging.energy.state — unmapped; `_field1`-`_field3`, `_field11` raw."""
216
- return {
217
- f"_field{num}": v
218
- for num in (1, 2, 3, 11)
219
- if (v := _present(m, f"field_{num}")) is not None
220
- }
222
+ """charging.energy.state — charger connection status.
223
+
224
+ Fields:
225
+ chargerStatus: str — GraphQL chargerStatus values
226
+ ("chrgr_sts_not_connected" | "chrgr_sts_connected_no_chrg" |
227
+ "chrgr_sts_connected_charging"); inferred
228
+ _field1, _field3, _field11: int — raw
229
+ """
230
+ result: dict[str, Any] = {}
231
+ if (v := _present(m, "charger_status")) is not None:
232
+ result["chargerStatus"] = _enum(_CHARGER_STATUS_MAP, v, what="charger status")
233
+ for num in (1, 3, 11):
234
+ if (v := _present(m, f"field_{num}")) is not None:
235
+ result[f"_field{num}"] = v
236
+ return result
221
237
 
222
238
 
223
239
  @RVMDecoder.register("charging.session.power", charging_pb2.SessionPower)
224
- def decode_session_power(_m: charging_pb2.SessionPower) -> dict[str, Any]:
225
- """charging.session.power — unmapped; empty so far."""
226
- return {}
240
+ def decode_session_power(m: charging_pb2.SessionPower) -> dict[str, Any]:
241
+ """charging.session.power — live charging power, about every 5 seconds.
242
+
243
+ Fields:
244
+ power: float (kW; 0 when not charging)
245
+ """
246
+ return {"power": round(m.power, 2)}
@@ -62,7 +62,7 @@ def decode_halloween_celebration_settings(
62
62
  Each field's wrapped value, when set, as a raw `_fieldN`.
63
63
  """
64
64
  result: dict[str, Any] = {}
65
- for num in (1, 2, 3, 4, 7, 8, 9, 10):
65
+ for num in (1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12):
66
66
  field = f"field_{num}"
67
67
  if (
68
68
  m.HasField(field)
@@ -149,6 +149,8 @@ def _decode_index_ranges(leg: TripInfo.Leg) -> list[dict[str, Any]]:
149
149
  return [
150
150
  {
151
151
  **_copy_present(seg, (("start", "start"), ("end", "end"))),
152
+ "startFraction": round(seg.start_fraction, 4),
153
+ "endFraction": round(seg.end_fraction, 4),
152
154
  "flagged": seg.HasField("flag"),
153
155
  }
154
156
  for seg in leg.index_range_segment
@@ -255,9 +257,10 @@ def decode_trip_info(m: navigation_pb2.TripInfo) -> dict[str, Any]:
255
257
  RangeRemaining (percent, meters), departureTime
256
258
  legs: list[dict] — distance, duration (meters, seconds),
257
259
  roadLabel, polyline (Google-encoded), energyUsed (kWh;
258
- unverified), indexRangeSegments ({start, end, flagged}) and
259
- categorizedIndexRanges ({start, end, category}), index ranges
260
- into the polyline whose meaning is unknown
260
+ unverified), indexRangeSegments ({start, startFraction, end,
261
+ endFraction, flagged}; fractions are 0-1 positions past those
262
+ points) and categorizedIndexRanges ({start, end, category}),
263
+ index ranges into the polyline whose meaning is unknown
261
264
  overviewPolyline: str — Google-encoded, whole trip
262
265
  nextWaypointDepartureTime: datetime — the next stop's departure if
263
266
  it's a charging stop, else its arrival
@@ -122,20 +122,25 @@ def decode_deployment_state(m: ota_pb2.DeploymentState) -> dict[str, Any]:
122
122
 
123
123
  @RVMDecoder.register("ota.user_schedule.ota_config", ota_pb2.OtaConfig)
124
124
  def decode_ota_config(m: ota_pb2.OtaConfig) -> dict[str, Any]:
125
- """ota.user_schedule.ota_config — the auto-install schedule.
125
+ """ota.user_schedule.ota_config — install schedules.
126
126
 
127
127
  Fields:
128
128
  otaSchedules: list[dict] (empty when none is set), each with:
129
+ type: str — "one_time" (a scheduled install) or "recurring"
130
+ (auto-install)
129
131
  id: str — UUID, when sent
130
- enabled: bool — whether auto-install is on
131
- startTime: int — minutes after local midnight
132
- location: str — a saved location (e.g. "home") or "anywhere"
133
- _field4: unknown; on the entry with no install time
132
+ enabled: bool
133
+ installTime: datetime — one-time only, once a time is picked;
134
+ kept after the install or a cancel
135
+ startTime: int — recurring only; minutes after local midnight
136
+ location: str — recurring only; a saved location (e.g.
137
+ "home") or "anywhere"
134
138
  otaScheduleUpdatedAt: datetime
135
139
  """
136
140
  schedules: list[dict[str, Any]] = []
137
141
  for schedule in m.schedule:
138
- entry: dict[str, Any] = {}
142
+ one_time = schedule.HasField("one_time")
143
+ entry: dict[str, Any] = {"type": "one_time" if one_time else "recurring"}
139
144
  if (v := _present(schedule, "id")) is not None:
140
145
  entry["id"] = v
141
146
  if schedule.HasField("time_of_day"):
@@ -147,9 +152,11 @@ def decode_ota_config(m: ota_pb2.OtaConfig) -> dict[str, Any]:
147
152
  and (v := _present(time_of_day.location, "name")) is not None
148
153
  ):
149
154
  entry["location"] = v
155
+ if one_time and (
156
+ seconds := _present(schedule.one_time.install_time, "seconds")
157
+ ):
158
+ entry["installTime"] = from_epoch(seconds)
150
159
  entry["enabled"] = schedule.enabled
151
- if schedule.HasField("field_4"):
152
- entry["_field4"] = schedule.field_4.field_1
153
160
  schedules.append(entry)
154
161
 
155
162
  result: dict[str, Any] = {"otaSchedules": schedules}
@@ -122,14 +122,23 @@ message TimeEstimation {
122
122
  int32 estimated_time_remaining = 2; // minutes
123
123
  }
124
124
 
125
- // charging.energy.state -- unmapped.
125
+ // charging.energy.state
126
126
  message EnergyState {
127
- optional int32 field_1 = 1;
128
- optional int32 field_2 = 2;
129
- optional int32 field_3 = 3;
127
+ optional int32 field_1 = 1; // inferred: ChargingState (1 ready ... 4 complete)
128
+ optional ChargerStatus charger_status = 2; // inferred
129
+ optional int32 field_3 = 3; // unknown; 1 so far
130
130
  string field_10 = 10; // always empty so far
131
- optional int32 field_11 = 11;
131
+ optional int32 field_11 = 11; // unknown; 1 or 2
132
132
  }
133
133
 
134
- // charging.session.power -- unmapped; empty so far.
135
- message SessionPower {}
134
+ enum ChargerStatus {
135
+ CHARGER_STATUS_UNSPECIFIED = 0;
136
+ CHARGER_STATUS_NOT_CONNECTED = 1;
137
+ CHARGER_STATUS_CONNECTED_NO_CHARGE = 2;
138
+ CHARGER_STATUS_CONNECTED_CHARGING = 3;
139
+ }
140
+
141
+ // charging.session.power -- live charging power; empty when not charging.
142
+ message SessionPower {
143
+ optional float power = 1; // kW
144
+ }
@@ -24,19 +24,21 @@ _sym_db = _symbol_database.Default()
24
24
 
25
25
 
26
26
 
27
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$rivian/parallax/proto/charging.proto\x12\x18rivian.parallax.charging\"\xe8\x04\n\x12ScheduleTimeWindow\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x43\n\x06window\x18\x02 \x01(\x0b\x32\x33.rivian.parallax.charging.ScheduleTimeWindow.Window\x1a\xbe\x02\n\x06Window\x12\x12\n\nstart_time\x18\x01 \x01(\x05\x12\x10\n\x08\x65nd_time\x18\x02 \x01(\x05\x12\x10\n\x08\x64uration\x18\x03 \x01(\x05\x12\x11\n\x04\x61mps\x18\x04 \x01(\x05H\x00\x88\x01\x01\x12L\n\x08location\x18\x05 \x01(\x0b\x32:.rivian.parallax.charging.ScheduleTimeWindow.GeoCoordinate\x12I\n\tstart_day\x18\x06 \x01(\x0e\x32\x36.rivian.parallax.charging.ScheduleTimeWindow.DayOfWeek\x12G\n\x07\x65nd_day\x18\x07 \x01(\x0e\x32\x36.rivian.parallax.charging.ScheduleTimeWindow.DayOfWeekB\x07\n\x05_amps\x1a\x34\n\rGeoCoordinate\x12\x10\n\x08latitude\x18\x01 \x01(\x01\x12\x11\n\tlongitude\x18\x02 \x01(\x01\"\x84\x01\n\tDayOfWeek\x12\x1b\n\x17\x44\x41Y_OF_WEEK_UNSPECIFIED\x10\x00\x12\n\n\x06SUNDAY\x10\x01\x12\n\n\x06MONDAY\x10\x02\x12\x0b\n\x07TUESDAY\x10\x03\x12\r\n\tWEDNESDAY\x10\x04\x12\x0c\n\x08THURSDAY\x10\x05\x12\n\n\x06\x46RIDAY\x10\x06\x12\x0c\n\x08SATURDAY\x10\x07\"5\n\x13SessionNotification\x12\x13\n\x06\x66ield1\x18\x01 \x01(\x05H\x00\x88\x01\x01\x42\t\n\x07_field1\"a\n\x14SessionRemoteCommand\x12=\n\x07\x63ommand\x18\x01 \x01(\x0e\x32\'.rivian.parallax.charging.RemoteCommandH\x00\x88\x01\x01\x42\n\n\x08_command\"1\n\tSocSlider\x12\x16\n\tsoc_limit\x18\x01 \x01(\x05H\x00\x88\x01\x01\x42\x0c\n\n_soc_limit\",\n\nTripTarget\x12\x13\n\x06\x66ield2\x18\x02 \x01(\x05H\x00\x88\x01\x01\x42\t\n\x07_field2\"\x17\n\x15SmartChargingSettings\"\x13\n\x11SmartChargingInfo\"\x1a\n\x18WeightedChargingForecast\"\xda\x01\n\rSessionStatus\x12H\n\x10\x63onnection_state\x18\x01 \x01(\x0e\x32).rivian.parallax.charging.ConnectionStateH\x00\x88\x01\x01\x12\x44\n\x0e\x63harging_state\x18\x02 \x01(\x0e\x32\'.rivian.parallax.charging.ChargingStateH\x01\x88\x01\x01\x12\x11\n\tis_active\x18\x03 \x01(\x08\x42\x13\n\x11_connection_stateB\x11\n\x0f_charging_state\"2\n\x0eTimeEstimation\x12 \n\x18\x65stimated_time_remaining\x18\x02 \x01(\x05\"\xa9\x01\n\x0b\x45nergyState\x12\x14\n\x07\x66ield_1\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x14\n\x07\x66ield_3\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x10\n\x08\x66ield_10\x18\n \x01(\t\x12\x15\n\x08\x66ield_11\x18\x0b \x01(\x05H\x03\x88\x01\x01\x42\n\n\x08_field_1B\n\n\x08_field_2B\n\n\x08_field_3B\x0b\n\t_field_11\"\x0e\n\x0cSessionPower*b\n\rRemoteCommand\x12\x1e\n\x1aREMOTE_COMMAND_UNSPECIFIED\x10\x00\x12\x18\n\x14REMOTE_COMMAND_START\x10\x01\x12\x17\n\x13REMOTE_COMMAND_STOP\x10\x02*v\n\x0f\x43onnectionState\x12 \n\x1c\x43ONNECTION_STATE_UNSPECIFIED\x10\x00\x12!\n\x1d\x43ONNECTION_STATE_DISCONNECTED\x10\x01\x12\x1e\n\x1a\x43ONNECTION_STATE_CONNECTED\x10\x02*\xfc\x05\n\rChargingState\x12\x1e\n\x1a\x43HARGING_STATE_UNSPECIFIED\x10\x00\x12\x12\n\x0e\x43HARGING_READY\x10\x01\x12\x17\n\x13\x43HARGING_CONNECTING\x10\x02\x12\x13\n\x0f\x43HARGING_ACTIVE\x10\x03\x12\x15\n\x11\x43HARGING_COMPLETE\x10\x04\x12\x16\n\x12\x43HARGING_SCHEDULED\x10\x05\x12\x1a\n\x16\x43HARGING_VEHICLE_ERROR\x10\x06\x12\x1a\n\x16\x43HARGING_STATION_ERROR\x10\x07\x12\x19\n\x15\x43HARGING_USER_STOPPED\x10\x08\x12\x1c\n\x18\x43HARGING_STATION_STOPPED\x10\t\x12\x1a\n\x16\x43HARGING_PAYMENT_ERROR\x10\n\x12\x17\n\x13\x43HARGING_CERT_ERROR\x10\x0b\x12\x16\n\x12\x43HARGING_TLS_ERROR\x10\x0c\x12(\n$CHARGING_ERROR_AC_ADAPTER_USED_ON_DC\x10\r\x12(\n$CHARGING_ERROR_DC_ADAPTER_USED_ON_AC\x10\x0e\x12\'\n#CHARGING_ERROR_INCOMPATIBLE_CHARGER\x10\x0f\x12\x1c\n\x18\x43HARGING_SD_COMPENSATION\x10\x10\x12\x16\n\x12WAITING_ON_CHARGER\x10\x11\x12%\n!CHARGER_NOT_READY_OR_INCOMPATIBLE\x10\x12\x12\x1c\n\x18\x43HARGING_VEHICLE_STOPPED\x10\x13\x12+\n\'CHARGING_PAYMENT_ERROR_START_RIVIAN_APP\x10\x14\x12&\n\"CHARGING_TLS_ERROR_UNKNOWN_CHARGER\x10\x15\x12&\n\"CHARGING_TLS_ERROR_UNEXPECTED_FAIL\x10\x16\x12\'\n#CHARGING_TLS_ERROR_START_RIVIAN_APP\x10\x17\x62\x06proto3')
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$rivian/parallax/proto/charging.proto\x12\x18rivian.parallax.charging\"\xe8\x04\n\x12ScheduleTimeWindow\x12\x0f\n\x07\x65nabled\x18\x01 \x01(\x08\x12\x43\n\x06window\x18\x02 \x01(\x0b\x32\x33.rivian.parallax.charging.ScheduleTimeWindow.Window\x1a\xbe\x02\n\x06Window\x12\x12\n\nstart_time\x18\x01 \x01(\x05\x12\x10\n\x08\x65nd_time\x18\x02 \x01(\x05\x12\x10\n\x08\x64uration\x18\x03 \x01(\x05\x12\x11\n\x04\x61mps\x18\x04 \x01(\x05H\x00\x88\x01\x01\x12L\n\x08location\x18\x05 \x01(\x0b\x32:.rivian.parallax.charging.ScheduleTimeWindow.GeoCoordinate\x12I\n\tstart_day\x18\x06 \x01(\x0e\x32\x36.rivian.parallax.charging.ScheduleTimeWindow.DayOfWeek\x12G\n\x07\x65nd_day\x18\x07 \x01(\x0e\x32\x36.rivian.parallax.charging.ScheduleTimeWindow.DayOfWeekB\x07\n\x05_amps\x1a\x34\n\rGeoCoordinate\x12\x10\n\x08latitude\x18\x01 \x01(\x01\x12\x11\n\tlongitude\x18\x02 \x01(\x01\"\x84\x01\n\tDayOfWeek\x12\x1b\n\x17\x44\x41Y_OF_WEEK_UNSPECIFIED\x10\x00\x12\n\n\x06SUNDAY\x10\x01\x12\n\n\x06MONDAY\x10\x02\x12\x0b\n\x07TUESDAY\x10\x03\x12\r\n\tWEDNESDAY\x10\x04\x12\x0c\n\x08THURSDAY\x10\x05\x12\n\n\x06\x46RIDAY\x10\x06\x12\x0c\n\x08SATURDAY\x10\x07\"5\n\x13SessionNotification\x12\x13\n\x06\x66ield1\x18\x01 \x01(\x05H\x00\x88\x01\x01\x42\t\n\x07_field1\"a\n\x14SessionRemoteCommand\x12=\n\x07\x63ommand\x18\x01 \x01(\x0e\x32\'.rivian.parallax.charging.RemoteCommandH\x00\x88\x01\x01\x42\n\n\x08_command\"1\n\tSocSlider\x12\x16\n\tsoc_limit\x18\x01 \x01(\x05H\x00\x88\x01\x01\x42\x0c\n\n_soc_limit\",\n\nTripTarget\x12\x13\n\x06\x66ield2\x18\x02 \x01(\x05H\x00\x88\x01\x01\x42\t\n\x07_field2\"\x17\n\x15SmartChargingSettings\"\x13\n\x11SmartChargingInfo\"\x1a\n\x18WeightedChargingForecast\"\xda\x01\n\rSessionStatus\x12H\n\x10\x63onnection_state\x18\x01 \x01(\x0e\x32).rivian.parallax.charging.ConnectionStateH\x00\x88\x01\x01\x12\x44\n\x0e\x63harging_state\x18\x02 \x01(\x0e\x32\'.rivian.parallax.charging.ChargingStateH\x01\x88\x01\x01\x12\x11\n\tis_active\x18\x03 \x01(\x08\x42\x13\n\x11_connection_stateB\x11\n\x0f_charging_state\"2\n\x0eTimeEstimation\x12 \n\x18\x65stimated_time_remaining\x18\x02 \x01(\x05\"\xe0\x01\n\x0b\x45nergyState\x12\x14\n\x07\x66ield_1\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x44\n\x0e\x63harger_status\x18\x02 \x01(\x0e\x32\'.rivian.parallax.charging.ChargerStatusH\x01\x88\x01\x01\x12\x14\n\x07\x66ield_3\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x10\n\x08\x66ield_10\x18\n \x01(\t\x12\x15\n\x08\x66ield_11\x18\x0b \x01(\x05H\x03\x88\x01\x01\x42\n\n\x08_field_1B\x11\n\x0f_charger_statusB\n\n\x08_field_3B\x0b\n\t_field_11\",\n\x0cSessionPower\x12\x12\n\x05power\x18\x01 \x01(\x02H\x00\x88\x01\x01\x42\x08\n\x06_power*b\n\rRemoteCommand\x12\x1e\n\x1aREMOTE_COMMAND_UNSPECIFIED\x10\x00\x12\x18\n\x14REMOTE_COMMAND_START\x10\x01\x12\x17\n\x13REMOTE_COMMAND_STOP\x10\x02*v\n\x0f\x43onnectionState\x12 \n\x1c\x43ONNECTION_STATE_UNSPECIFIED\x10\x00\x12!\n\x1d\x43ONNECTION_STATE_DISCONNECTED\x10\x01\x12\x1e\n\x1a\x43ONNECTION_STATE_CONNECTED\x10\x02*\xfc\x05\n\rChargingState\x12\x1e\n\x1a\x43HARGING_STATE_UNSPECIFIED\x10\x00\x12\x12\n\x0e\x43HARGING_READY\x10\x01\x12\x17\n\x13\x43HARGING_CONNECTING\x10\x02\x12\x13\n\x0f\x43HARGING_ACTIVE\x10\x03\x12\x15\n\x11\x43HARGING_COMPLETE\x10\x04\x12\x16\n\x12\x43HARGING_SCHEDULED\x10\x05\x12\x1a\n\x16\x43HARGING_VEHICLE_ERROR\x10\x06\x12\x1a\n\x16\x43HARGING_STATION_ERROR\x10\x07\x12\x19\n\x15\x43HARGING_USER_STOPPED\x10\x08\x12\x1c\n\x18\x43HARGING_STATION_STOPPED\x10\t\x12\x1a\n\x16\x43HARGING_PAYMENT_ERROR\x10\n\x12\x17\n\x13\x43HARGING_CERT_ERROR\x10\x0b\x12\x16\n\x12\x43HARGING_TLS_ERROR\x10\x0c\x12(\n$CHARGING_ERROR_AC_ADAPTER_USED_ON_DC\x10\r\x12(\n$CHARGING_ERROR_DC_ADAPTER_USED_ON_AC\x10\x0e\x12\'\n#CHARGING_ERROR_INCOMPATIBLE_CHARGER\x10\x0f\x12\x1c\n\x18\x43HARGING_SD_COMPENSATION\x10\x10\x12\x16\n\x12WAITING_ON_CHARGER\x10\x11\x12%\n!CHARGER_NOT_READY_OR_INCOMPATIBLE\x10\x12\x12\x1c\n\x18\x43HARGING_VEHICLE_STOPPED\x10\x13\x12+\n\'CHARGING_PAYMENT_ERROR_START_RIVIAN_APP\x10\x14\x12&\n\"CHARGING_TLS_ERROR_UNKNOWN_CHARGER\x10\x15\x12&\n\"CHARGING_TLS_ERROR_UNEXPECTED_FAIL\x10\x16\x12\'\n#CHARGING_TLS_ERROR_START_RIVIAN_APP\x10\x17*\xa0\x01\n\rChargerStatus\x12\x1e\n\x1a\x43HARGER_STATUS_UNSPECIFIED\x10\x00\x12 \n\x1c\x43HARGER_STATUS_NOT_CONNECTED\x10\x01\x12&\n\"CHARGER_STATUS_CONNECTED_NO_CHARGE\x10\x02\x12%\n!CHARGER_STATUS_CONNECTED_CHARGING\x10\x03\x62\x06proto3')
28
28
 
29
29
  _globals = globals()
30
30
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
31
31
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'rivian.parallax.proto.charging_pb2', _globals)
32
32
  if not _descriptor._USE_C_DESCRIPTORS:
33
33
  DESCRIPTOR._loaded_options = None
34
- _globals['_REMOTECOMMAND']._serialized_start=1471
35
- _globals['_REMOTECOMMAND']._serialized_end=1569
36
- _globals['_CONNECTIONSTATE']._serialized_start=1571
37
- _globals['_CONNECTIONSTATE']._serialized_end=1689
38
- _globals['_CHARGINGSTATE']._serialized_start=1692
39
- _globals['_CHARGINGSTATE']._serialized_end=2456
34
+ _globals['_REMOTECOMMAND']._serialized_start=1556
35
+ _globals['_REMOTECOMMAND']._serialized_end=1654
36
+ _globals['_CONNECTIONSTATE']._serialized_start=1656
37
+ _globals['_CONNECTIONSTATE']._serialized_end=1774
38
+ _globals['_CHARGINGSTATE']._serialized_start=1777
39
+ _globals['_CHARGINGSTATE']._serialized_end=2541
40
+ _globals['_CHARGERSTATUS']._serialized_start=2544
41
+ _globals['_CHARGERSTATUS']._serialized_end=2704
40
42
  _globals['_SCHEDULETIMEWINDOW']._serialized_start=67
41
43
  _globals['_SCHEDULETIMEWINDOW']._serialized_end=683
42
44
  _globals['_SCHEDULETIMEWINDOW_WINDOW']._serialized_start=176
@@ -64,7 +66,7 @@ if not _descriptor._USE_C_DESCRIPTORS:
64
66
  _globals['_TIMEESTIMATION']._serialized_start=1231
65
67
  _globals['_TIMEESTIMATION']._serialized_end=1281
66
68
  _globals['_ENERGYSTATE']._serialized_start=1284
67
- _globals['_ENERGYSTATE']._serialized_end=1453
68
- _globals['_SESSIONPOWER']._serialized_start=1455
69
- _globals['_SESSIONPOWER']._serialized_end=1469
69
+ _globals['_ENERGYSTATE']._serialized_end=1508
70
+ _globals['_SESSIONPOWER']._serialized_start=1510
71
+ _globals['_SESSIONPOWER']._serialized_end=1554
70
72
  # @@protoc_insertion_point(module_scope)
@@ -44,6 +44,13 @@ class ChargingState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
44
44
  CHARGING_TLS_ERROR_UNKNOWN_CHARGER: _ClassVar[ChargingState]
45
45
  CHARGING_TLS_ERROR_UNEXPECTED_FAIL: _ClassVar[ChargingState]
46
46
  CHARGING_TLS_ERROR_START_RIVIAN_APP: _ClassVar[ChargingState]
47
+
48
+ class ChargerStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
49
+ __slots__ = ()
50
+ CHARGER_STATUS_UNSPECIFIED: _ClassVar[ChargerStatus]
51
+ CHARGER_STATUS_NOT_CONNECTED: _ClassVar[ChargerStatus]
52
+ CHARGER_STATUS_CONNECTED_NO_CHARGE: _ClassVar[ChargerStatus]
53
+ CHARGER_STATUS_CONNECTED_CHARGING: _ClassVar[ChargerStatus]
47
54
  REMOTE_COMMAND_UNSPECIFIED: RemoteCommand
48
55
  REMOTE_COMMAND_START: RemoteCommand
49
56
  REMOTE_COMMAND_STOP: RemoteCommand
@@ -74,6 +81,10 @@ CHARGING_PAYMENT_ERROR_START_RIVIAN_APP: ChargingState
74
81
  CHARGING_TLS_ERROR_UNKNOWN_CHARGER: ChargingState
75
82
  CHARGING_TLS_ERROR_UNEXPECTED_FAIL: ChargingState
76
83
  CHARGING_TLS_ERROR_START_RIVIAN_APP: ChargingState
84
+ CHARGER_STATUS_UNSPECIFIED: ChargerStatus
85
+ CHARGER_STATUS_NOT_CONNECTED: ChargerStatus
86
+ CHARGER_STATUS_CONNECTED_NO_CHARGE: ChargerStatus
87
+ CHARGER_STATUS_CONNECTED_CHARGING: ChargerStatus
77
88
 
78
89
  class ScheduleTimeWindow(_message.Message):
79
90
  __slots__ = ("enabled", "window")
@@ -178,19 +189,21 @@ class TimeEstimation(_message.Message):
178
189
  def __init__(self, estimated_time_remaining: _Optional[int] = ...) -> None: ...
179
190
 
180
191
  class EnergyState(_message.Message):
181
- __slots__ = ("field_1", "field_2", "field_3", "field_10", "field_11")
192
+ __slots__ = ("field_1", "charger_status", "field_3", "field_10", "field_11")
182
193
  FIELD_1_FIELD_NUMBER: _ClassVar[int]
183
- FIELD_2_FIELD_NUMBER: _ClassVar[int]
194
+ CHARGER_STATUS_FIELD_NUMBER: _ClassVar[int]
184
195
  FIELD_3_FIELD_NUMBER: _ClassVar[int]
185
196
  FIELD_10_FIELD_NUMBER: _ClassVar[int]
186
197
  FIELD_11_FIELD_NUMBER: _ClassVar[int]
187
198
  field_1: int
188
- field_2: int
199
+ charger_status: ChargerStatus
189
200
  field_3: int
190
201
  field_10: str
191
202
  field_11: int
192
- def __init__(self, field_1: _Optional[int] = ..., field_2: _Optional[int] = ..., field_3: _Optional[int] = ..., field_10: _Optional[str] = ..., field_11: _Optional[int] = ...) -> None: ...
203
+ def __init__(self, field_1: _Optional[int] = ..., charger_status: _Optional[_Union[ChargerStatus, str]] = ..., field_3: _Optional[int] = ..., field_10: _Optional[str] = ..., field_11: _Optional[int] = ...) -> None: ...
193
204
 
194
205
  class SessionPower(_message.Message):
195
- __slots__ = ()
196
- def __init__(self) -> None: ...
206
+ __slots__ = ("power",)
207
+ POWER_FIELD_NUMBER: _ClassVar[int]
208
+ power: float
209
+ def __init__(self, power: _Optional[float] = ...) -> None: ...
@@ -31,16 +31,19 @@ message CarCostumeState {
31
31
  }
32
32
 
33
33
  // holiday_celebration.mobile_vehicle_settings.halloween_celebration_settings
34
- // All fields unknown; 1, 3 and 8-10 only sent empty.
34
+ // All fields unknown; 1, 3, 5 and 8-12 only sent empty.
35
35
  message HalloweenCelebrationSettings {
36
36
  Value field_1 = 1;
37
37
  Value field_2 = 2;
38
38
  Value field_3 = 3;
39
39
  Value field_4 = 4;
40
+ Value field_5 = 5;
40
41
  Value field_7 = 7;
41
42
  Value field_8 = 8;
42
43
  Value field_9 = 9;
43
44
  Value field_10 = 10;
45
+ Value field_11 = 11;
46
+ Value field_12 = 12;
44
47
 
45
48
  message Value {
46
49
  optional int32 value = 1;
@@ -24,7 +24,7 @@ _sym_db = _symbol_database.Default()
24
24
 
25
25
 
26
26
 
27
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/rivian/parallax/proto/holiday_celebration.proto\x12#rivian.parallax.holiday_celebration\"\x1b\n\x19HolidayCelebrationEnabled\"\xa8\x02\n\x12\x43\x61rCostumeSettings\x12\x14\n\x07\x66ield_1\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x14\n\x07\x66ield_3\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x14\n\x07\x66ield_6\x18\x06 \x01(\x05H\x03\x88\x01\x01\x12\x14\n\x07\x66ield_7\x18\x07 \x01(\x05H\x04\x88\x01\x01\x12\x14\n\x07\x66ield_9\x18\t \x01(\x05H\x05\x88\x01\x01\x12\x15\n\x08\x66ield_11\x18\x0b \x01(\x05H\x06\x88\x01\x01\x12\x15\n\x08\x66ield_12\x18\x0c \x01(\x05H\x07\x88\x01\x01\x42\n\n\x08_field_1B\n\n\x08_field_2B\n\n\x08_field_3B\n\n\x08_field_6B\n\n\x08_field_7B\n\n\x08_field_9B\x0b\n\t_field_11B\x0b\n\t_field_12\"\x9f\x01\n\x0f\x43\x61rCostumeState\x12\x17\n\ncostume_id\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x14\n\x07\x66ield_3\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x14\n\x07\x66ield_6\x18\x06 \x01(\x05H\x03\x88\x01\x01\x42\r\n\x0b_costume_idB\n\n\x08_field_2B\n\n\x08_field_3B\n\n\x08_field_6\"\x96\x06\n\x1cHalloweenCelebrationSettings\x12X\n\x07\x66ield_1\x18\x01 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_2\x18\x02 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_3\x18\x03 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_4\x18\x04 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_7\x18\x07 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_8\x18\x08 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_9\x18\t \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12Y\n\x08\x66ield_10\x18\n \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x1a%\n\x05Value\x12\x12\n\x05value\x18\x01 \x01(\x05H\x00\x88\x01\x01\x42\x08\n\x06_valueb\x06proto3')
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/rivian/parallax/proto/holiday_celebration.proto\x12#rivian.parallax.holiday_celebration\"\x1b\n\x19HolidayCelebrationEnabled\"\xa8\x02\n\x12\x43\x61rCostumeSettings\x12\x14\n\x07\x66ield_1\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x14\n\x07\x66ield_3\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x14\n\x07\x66ield_6\x18\x06 \x01(\x05H\x03\x88\x01\x01\x12\x14\n\x07\x66ield_7\x18\x07 \x01(\x05H\x04\x88\x01\x01\x12\x14\n\x07\x66ield_9\x18\t \x01(\x05H\x05\x88\x01\x01\x12\x15\n\x08\x66ield_11\x18\x0b \x01(\x05H\x06\x88\x01\x01\x12\x15\n\x08\x66ield_12\x18\x0c \x01(\x05H\x07\x88\x01\x01\x42\n\n\x08_field_1B\n\n\x08_field_2B\n\n\x08_field_3B\n\n\x08_field_6B\n\n\x08_field_7B\n\n\x08_field_9B\x0b\n\t_field_11B\x0b\n\t_field_12\"\x9f\x01\n\x0f\x43\x61rCostumeState\x12\x17\n\ncostume_id\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x14\n\x07\x66ield_3\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x14\n\x07\x66ield_6\x18\x06 \x01(\x05H\x03\x88\x01\x01\x42\r\n\x0b_costume_idB\n\n\x08_field_2B\n\n\x08_field_3B\n\n\x08_field_6\"\xa6\x08\n\x1cHalloweenCelebrationSettings\x12X\n\x07\x66ield_1\x18\x01 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_2\x18\x02 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_3\x18\x03 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_4\x18\x04 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_5\x18\x05 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_7\x18\x07 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_8\x18\x08 \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12X\n\x07\x66ield_9\x18\t \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12Y\n\x08\x66ield_10\x18\n \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12Y\n\x08\x66ield_11\x18\x0b \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x12Y\n\x08\x66ield_12\x18\x0c \x01(\x0b\x32G.rivian.parallax.holiday_celebration.HalloweenCelebrationSettings.Value\x1a%\n\x05Value\x12\x12\n\x05value\x18\x01 \x01(\x05H\x00\x88\x01\x01\x42\x08\n\x06_valueb\x06proto3')
28
28
 
29
29
  _globals = globals()
30
30
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -38,7 +38,7 @@ if not _descriptor._USE_C_DESCRIPTORS:
38
38
  _globals['_CARCOSTUMESTATE']._serialized_start=417
39
39
  _globals['_CARCOSTUMESTATE']._serialized_end=576
40
40
  _globals['_HALLOWEENCELEBRATIONSETTINGS']._serialized_start=579
41
- _globals['_HALLOWEENCELEBRATIONSETTINGS']._serialized_end=1369
42
- _globals['_HALLOWEENCELEBRATIONSETTINGS_VALUE']._serialized_start=1332
43
- _globals['_HALLOWEENCELEBRATIONSETTINGS_VALUE']._serialized_end=1369
41
+ _globals['_HALLOWEENCELEBRATIONSETTINGS']._serialized_end=1641
42
+ _globals['_HALLOWEENCELEBRATIONSETTINGS_VALUE']._serialized_start=1604
43
+ _globals['_HALLOWEENCELEBRATIONSETTINGS_VALUE']._serialized_end=1641
44
44
  # @@protoc_insertion_point(module_scope)
@@ -42,7 +42,7 @@ class CarCostumeState(_message.Message):
42
42
  def __init__(self, costume_id: _Optional[int] = ..., field_2: _Optional[int] = ..., field_3: _Optional[int] = ..., field_6: _Optional[int] = ...) -> None: ...
43
43
 
44
44
  class HalloweenCelebrationSettings(_message.Message):
45
- __slots__ = ("field_1", "field_2", "field_3", "field_4", "field_7", "field_8", "field_9", "field_10")
45
+ __slots__ = ("field_1", "field_2", "field_3", "field_4", "field_5", "field_7", "field_8", "field_9", "field_10", "field_11", "field_12")
46
46
  class Value(_message.Message):
47
47
  __slots__ = ("value",)
48
48
  VALUE_FIELD_NUMBER: _ClassVar[int]
@@ -52,16 +52,22 @@ class HalloweenCelebrationSettings(_message.Message):
52
52
  FIELD_2_FIELD_NUMBER: _ClassVar[int]
53
53
  FIELD_3_FIELD_NUMBER: _ClassVar[int]
54
54
  FIELD_4_FIELD_NUMBER: _ClassVar[int]
55
+ FIELD_5_FIELD_NUMBER: _ClassVar[int]
55
56
  FIELD_7_FIELD_NUMBER: _ClassVar[int]
56
57
  FIELD_8_FIELD_NUMBER: _ClassVar[int]
57
58
  FIELD_9_FIELD_NUMBER: _ClassVar[int]
58
59
  FIELD_10_FIELD_NUMBER: _ClassVar[int]
60
+ FIELD_11_FIELD_NUMBER: _ClassVar[int]
61
+ FIELD_12_FIELD_NUMBER: _ClassVar[int]
59
62
  field_1: HalloweenCelebrationSettings.Value
60
63
  field_2: HalloweenCelebrationSettings.Value
61
64
  field_3: HalloweenCelebrationSettings.Value
62
65
  field_4: HalloweenCelebrationSettings.Value
66
+ field_5: HalloweenCelebrationSettings.Value
63
67
  field_7: HalloweenCelebrationSettings.Value
64
68
  field_8: HalloweenCelebrationSettings.Value
65
69
  field_9: HalloweenCelebrationSettings.Value
66
70
  field_10: HalloweenCelebrationSettings.Value
67
- def __init__(self, field_1: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_2: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_3: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_4: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_7: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_8: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_9: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_10: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ...) -> None: ...
71
+ field_11: HalloweenCelebrationSettings.Value
72
+ field_12: HalloweenCelebrationSettings.Value
73
+ def __init__(self, field_1: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_2: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_3: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_4: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_5: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_7: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_8: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_9: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_10: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_11: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ..., field_12: _Optional[_Union[HalloweenCelebrationSettings.Value, _Mapping]] = ...) -> None: ...
@@ -130,7 +130,9 @@ message TripInfo {
130
130
 
131
131
  message IndexRangeSegment {
132
132
  optional int32 start = 1;
133
+ float start_fraction = 2; // position past the start point, 0-1
133
134
  optional int32 end = 3;
135
+ float end_fraction = 4; // position past the end point, 0-1
134
136
  optional bool flag = 5; // present means flagged
135
137
  }
136
138
  }
@@ -145,9 +147,14 @@ message TripInfo {
145
147
 
146
148
  message TripMeta {
147
149
  optional int32 field_1 = 1;
148
- optional int32 field_2 = 2;
150
+ Unmapped2 field_2 = 2;
149
151
  optional int32 field_3 = 3;
150
152
  optional int32 field_4 = 4;
153
+
154
+ message Unmapped2 {
155
+ int32 field_2 = 2;
156
+ int32 field_4 = 4;
157
+ }
151
158
  }
152
159
  }
153
160
 
@@ -24,7 +24,7 @@ _sym_db = _symbol_database.Default()
24
24
 
25
25
 
26
26
 
27
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&rivian/parallax/proto/navigation.proto\x12\x1arivian.parallax.navigation\"Y\n\rGeoCoordinate\x12\x15\n\x08latitude\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x16\n\tlongitude\x18\x02 \x01(\x01H\x01\x88\x01\x01\x42\x0b\n\t_latitudeB\x0c\n\n_longitude\"K\n\tTimestamp\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x12\n\x05nanos\x18\x02 \x01(\x05H\x01\x88\x01\x01\x42\n\n\x08_secondsB\x08\n\x06_nanos\"\xd6\x1a\n\x08TripInfo\x12\x14\n\x07trip_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12;\n\x06origin\x18\x02 \x01(\x0b\x32+.rivian.parallax.navigation.TripInfo.Origin\x12\x37\n\x04trip\x18\x03 \x01(\x0b\x32).rivian.parallax.navigation.TripInfo.Trip\x12P\n\x11route_preferences\x18\x04 \x01(\x0b\x32\x35.rivian.parallax.navigation.TripInfo.RoutePreferences\x12\x17\n\norigin_soc\x18\x05 \x01(\x01H\x01\x88\x01\x01\x12[\n\x17next_waypoint_departure\x18\x06 \x01(\x0b\x32:.rivian.parallax.navigation.TripInfo.NextWaypointDeparture\x1a\x83\x01\n\x06Origin\x12;\n\x08location\x18\x01 \x01(\x0b\x32).rivian.parallax.navigation.GeoCoordinate\x12\x14\n\x07heading\x18\x03 \x01(\x02H\x00\x88\x01\x01\x12\x11\n\x04time\x18\x05 \x01(\x03H\x01\x88\x01\x01\x42\n\n\x08_headingB\x07\n\x05_time\x1a\x39\n\x15NextWaypointDeparture\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_seconds\x1a\x95\x03\n\x04Trip\x12\x15\n\x08\x64istance\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64uration\x18\x02 \x01(\x01H\x01\x88\x01\x01\x12\x46\n\x08waypoint\x18\x03 \x03(\x0b\x32\x34.rivian.parallax.navigation.TripInfo.WaypointWrapper\x12\x35\n\x03leg\x18\x04 \x03(\x0b\x32(.rivian.parallax.navigation.TripInfo.Leg\x12\x16\n\tfinal_soc\x18\x06 \x01(\x01H\x02\x88\x01\x01\x12\x18\n\x0b\x66inal_range\x18\x07 \x01(\x01H\x03\x88\x01\x01\x12\x1e\n\x11overview_polyline\x18\n \x01(\tH\x04\x88\x01\x01\x12@\n\ttrip_meta\x18\r \x01(\x0b\x32-.rivian.parallax.navigation.TripInfo.TripMetaB\x0b\n\t_distanceB\x0b\n\t_durationB\x0c\n\n_final_socB\x0e\n\x0c_final_rangeB\x14\n\x12_overview_polyline\x1a\x96\x01\n\x0fWaypointWrapper\x12\x39\n\x05place\x18\x01 \x01(\x0b\x32*.rivian.parallax.navigation.TripInfo.Place\x12H\n\rcharging_stop\x18\x02 \x01(\x0b\x32\x31.rivian.parallax.navigation.TripInfo.ChargingStop\x1a\xe1\x02\n\x05Place\x12;\n\x08location\x18\x01 \x01(\x0b\x32).rivian.parallax.navigation.GeoCoordinate\x12\x43\n\x10snapped_location\x18\x02 \x01(\x0b\x32).rivian.parallax.navigation.GeoCoordinate\x12\x17\n\nplace_type\x18\x03 \x01(\x05H\x00\x88\x01\x01\x12\x11\n\x04name\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x15\n\x08place_id\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03soc\x18\x07 \x01(\x01H\x03\x88\x01\x01\x12\x12\n\x05range\x18\x08 \x01(\x01H\x04\x88\x01\x01\x12\x36\n\x07\x61rrival\x18\t \x01(\x0b\x32%.rivian.parallax.navigation.TimestampB\r\n\x0b_place_typeB\x07\n\x05_nameB\x0b\n\t_place_idB\x06\n\x04_socB\x08\n\x06_range\x1a\xb9\x06\n\x0c\x43hargingStop\x12\x17\n\nstation_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x02 \x01(\tH\x01\x88\x01\x01\x12;\n\x08location\x18\x03 \x01(\x0b\x32).rivian.parallax.navigation.GeoCoordinate\x12\x1c\n\x0f\x63harge_duration\x18\x04 \x01(\x01H\x02\x88\x01\x01\x12\x18\n\x0b\x61rrival_soc\x18\x06 \x01(\x01H\x03\x88\x01\x01\x12\x1a\n\rarrival_range\x18\x07 \x01(\x01H\x04\x88\x01\x01\x12\x1a\n\rdeparture_soc\x18\x08 \x01(\x01H\x05\x88\x01\x01\x12\x1c\n\x0f\x64\x65parture_range\x18\t \x01(\x01H\x06\x88\x01\x01\x12^\n\x0e\x64\x65parture_time\x18\n \x01(\x0b\x32\x46.rivian.parallax.navigation.TripInfo.ChargingStop.DepartureTimeWrapper\x12Z\n\x0c\x61rrival_time\x18\x0b \x01(\x0b\x32\x44.rivian.parallax.navigation.TripInfo.ChargingStop.ArrivalTimeWrapper\x12\x15\n\x08\x66ield_12\x18\x0c \x01(\x05H\x07\x88\x01\x01\x12\x15\n\x08\x66ield_13\x18\r \x01(\x05H\x08\x88\x01\x01\x12\x15\n\x08\x66ield_14\x18\x0e \x01(\x05H\t\x88\x01\x01\x12\x15\n\x08\x66ield_17\x18\x11 \x01(\x05H\n\x88\x01\x01\x1a\x38\n\x14\x44\x65partureTimeWrapper\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_seconds\x1a\x36\n\x12\x41rrivalTimeWrapper\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_secondsB\r\n\x0b_station_idB\x08\n\x06_labelB\x12\n\x10_charge_durationB\x0e\n\x0c_arrival_socB\x10\n\x0e_arrival_rangeB\x10\n\x0e_departure_socB\x12\n\x10_departure_rangeB\x0b\n\t_field_12B\x0b\n\t_field_13B\x0b\n\t_field_14B\x0b\n\t_field_17\x1a\x9c\x06\n\x03Leg\x12\x15\n\x08\x64istance\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64uration\x18\x02 \x01(\x01H\x01\x88\x01\x01\x12\x17\n\nroad_label\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x15\n\x08polyline\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\"\n\x15\x66lagged_ranges_packed\x18\x05 \x01(\x0cH\x04\x88\x01\x01\x12$\n\x17unflagged_ranges_packed\x18\x06 \x01(\x0cH\x05\x88\x01\x01\x12?\n\x06\x65nergy\x18\x08 \x01(\x0b\x32/.rivian.parallax.navigation.TripInfo.Leg.Energy\x12\x63\n\x19\x63\x61tegorized_range_segment\x18\t \x03(\x0b\x32@.rivian.parallax.navigation.TripInfo.Leg.CategorizedRangeSegment\x12W\n\x13index_range_segment\x18\n \x03(\x0b\x32:.rivian.parallax.navigation.TripInfo.Leg.IndexRangeSegment\x1a\"\n\x06\x45nergy\x12\x10\n\x03kwh\x18\x01 \x01(\x01H\x00\x88\x01\x01\x42\x06\n\x04_kwh\x1au\n\x17\x43\x61tegorizedRangeSegment\x12\x12\n\x05start\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x15\n\x08\x63\x61tegory\x18\x03 \x01(\x05H\x02\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_endB\x0b\n\t_category\x1ag\n\x11IndexRangeSegment\x12\x12\n\x05start\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12\x11\n\x04\x66lag\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_endB\x07\n\x05_flagB\x0b\n\t_distanceB\x0b\n\t_durationB\r\n\x0b_road_labelB\x0b\n\t_polylineB\x18\n\x16_flagged_ranges_packedB\x1a\n\x18_unflagged_ranges_packed\x1a\x94\x01\n\x10RoutePreferences\x12\x15\n\x08weight_a\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x15\n\x08weight_b\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12\x16\n\x0eroad_avoidance\x18\x03 \x03(\t\x12 \n\x18\x63harging_network_filters\x18\x04 \x03(\tB\x0b\n\t_weight_aB\x0b\n\t_weight_b\x1a\x92\x01\n\x08TripMeta\x12\x14\n\x07\x66ield_1\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x14\n\x07\x66ield_3\x18\x03 \x01(\x05H\x02\x88\x01\x01\x12\x14\n\x07\x66ield_4\x18\x04 \x01(\x05H\x03\x88\x01\x01\x42\n\n\x08_field_1B\n\n\x08_field_2B\n\n\x08_field_3B\n\n\x08_field_4B\n\n\x08_trip_idB\r\n\x0b_origin_soc\"\xff\x04\n\x0cTripProgress\x12L\n\rnext_waypoint\x18\x01 \x01(\x0b\x32\x35.rivian.parallax.navigation.TripProgress.NextWaypoint\x12T\n\x11\x66inal_destination\x18\x02 \x01(\x0b\x32\x39.rivian.parallax.navigation.TripProgress.FinalDestination\x12\x1f\n\x12\x64istance_remaining\x18\x04 \x01(\x01H\x00\x88\x01\x01\x12\x1f\n\x12\x64uration_remaining\x18\x05 \x01(\x01H\x01\x88\x01\x01\x12J\n\x0clocation_fix\x18\x06 \x01(\x0b\x32\x34.rivian.parallax.navigation.TripProgress.LocationFix\x1a\x30\n\x0cNextWaypoint\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_seconds\x1a\x34\n\x10\x46inalDestination\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_seconds\x1a\xa6\x01\n\x0bLocationFix\x12;\n\x08location\x18\x01 \x01(\x0b\x32).rivian.parallax.navigation.GeoCoordinate\x12\x12\n\x05speed\x18\x02 \x01(\x02H\x00\x88\x01\x01\x12\x14\n\x07heading\x18\x03 \x01(\x02H\x01\x88\x01\x01\x12\x11\n\x04time\x18\x05 \x01(\x03H\x02\x88\x01\x01\x42\x08\n\x06_speedB\n\n\x08_headingB\x07\n\x05_timeB\x15\n\x13_distance_remainingB\x15\n\x13_duration_remainingb\x06proto3')
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n&rivian/parallax/proto/navigation.proto\x12\x1arivian.parallax.navigation\"Y\n\rGeoCoordinate\x12\x15\n\x08latitude\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x16\n\tlongitude\x18\x02 \x01(\x01H\x01\x88\x01\x01\x42\x0b\n\t_latitudeB\x0c\n\n_longitude\"K\n\tTimestamp\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x12\n\x05nanos\x18\x02 \x01(\x05H\x01\x88\x01\x01\x42\n\n\x08_secondsB\x08\n\x06_nanos\"\xdc\x1b\n\x08TripInfo\x12\x14\n\x07trip_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12;\n\x06origin\x18\x02 \x01(\x0b\x32+.rivian.parallax.navigation.TripInfo.Origin\x12\x37\n\x04trip\x18\x03 \x01(\x0b\x32).rivian.parallax.navigation.TripInfo.Trip\x12P\n\x11route_preferences\x18\x04 \x01(\x0b\x32\x35.rivian.parallax.navigation.TripInfo.RoutePreferences\x12\x17\n\norigin_soc\x18\x05 \x01(\x01H\x01\x88\x01\x01\x12[\n\x17next_waypoint_departure\x18\x06 \x01(\x0b\x32:.rivian.parallax.navigation.TripInfo.NextWaypointDeparture\x1a\x83\x01\n\x06Origin\x12;\n\x08location\x18\x01 \x01(\x0b\x32).rivian.parallax.navigation.GeoCoordinate\x12\x14\n\x07heading\x18\x03 \x01(\x02H\x00\x88\x01\x01\x12\x11\n\x04time\x18\x05 \x01(\x03H\x01\x88\x01\x01\x42\n\n\x08_headingB\x07\n\x05_time\x1a\x39\n\x15NextWaypointDeparture\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_seconds\x1a\x95\x03\n\x04Trip\x12\x15\n\x08\x64istance\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64uration\x18\x02 \x01(\x01H\x01\x88\x01\x01\x12\x46\n\x08waypoint\x18\x03 \x03(\x0b\x32\x34.rivian.parallax.navigation.TripInfo.WaypointWrapper\x12\x35\n\x03leg\x18\x04 \x03(\x0b\x32(.rivian.parallax.navigation.TripInfo.Leg\x12\x16\n\tfinal_soc\x18\x06 \x01(\x01H\x02\x88\x01\x01\x12\x18\n\x0b\x66inal_range\x18\x07 \x01(\x01H\x03\x88\x01\x01\x12\x1e\n\x11overview_polyline\x18\n \x01(\tH\x04\x88\x01\x01\x12@\n\ttrip_meta\x18\r \x01(\x0b\x32-.rivian.parallax.navigation.TripInfo.TripMetaB\x0b\n\t_distanceB\x0b\n\t_durationB\x0c\n\n_final_socB\x0e\n\x0c_final_rangeB\x14\n\x12_overview_polyline\x1a\x96\x01\n\x0fWaypointWrapper\x12\x39\n\x05place\x18\x01 \x01(\x0b\x32*.rivian.parallax.navigation.TripInfo.Place\x12H\n\rcharging_stop\x18\x02 \x01(\x0b\x32\x31.rivian.parallax.navigation.TripInfo.ChargingStop\x1a\xe1\x02\n\x05Place\x12;\n\x08location\x18\x01 \x01(\x0b\x32).rivian.parallax.navigation.GeoCoordinate\x12\x43\n\x10snapped_location\x18\x02 \x01(\x0b\x32).rivian.parallax.navigation.GeoCoordinate\x12\x17\n\nplace_type\x18\x03 \x01(\x05H\x00\x88\x01\x01\x12\x11\n\x04name\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x15\n\x08place_id\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x10\n\x03soc\x18\x07 \x01(\x01H\x03\x88\x01\x01\x12\x12\n\x05range\x18\x08 \x01(\x01H\x04\x88\x01\x01\x12\x36\n\x07\x61rrival\x18\t \x01(\x0b\x32%.rivian.parallax.navigation.TimestampB\r\n\x0b_place_typeB\x07\n\x05_nameB\x0b\n\t_place_idB\x06\n\x04_socB\x08\n\x06_range\x1a\xb9\x06\n\x0c\x43hargingStop\x12\x17\n\nstation_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05label\x18\x02 \x01(\tH\x01\x88\x01\x01\x12;\n\x08location\x18\x03 \x01(\x0b\x32).rivian.parallax.navigation.GeoCoordinate\x12\x1c\n\x0f\x63harge_duration\x18\x04 \x01(\x01H\x02\x88\x01\x01\x12\x18\n\x0b\x61rrival_soc\x18\x06 \x01(\x01H\x03\x88\x01\x01\x12\x1a\n\rarrival_range\x18\x07 \x01(\x01H\x04\x88\x01\x01\x12\x1a\n\rdeparture_soc\x18\x08 \x01(\x01H\x05\x88\x01\x01\x12\x1c\n\x0f\x64\x65parture_range\x18\t \x01(\x01H\x06\x88\x01\x01\x12^\n\x0e\x64\x65parture_time\x18\n \x01(\x0b\x32\x46.rivian.parallax.navigation.TripInfo.ChargingStop.DepartureTimeWrapper\x12Z\n\x0c\x61rrival_time\x18\x0b \x01(\x0b\x32\x44.rivian.parallax.navigation.TripInfo.ChargingStop.ArrivalTimeWrapper\x12\x15\n\x08\x66ield_12\x18\x0c \x01(\x05H\x07\x88\x01\x01\x12\x15\n\x08\x66ield_13\x18\r \x01(\x05H\x08\x88\x01\x01\x12\x15\n\x08\x66ield_14\x18\x0e \x01(\x05H\t\x88\x01\x01\x12\x15\n\x08\x66ield_17\x18\x11 \x01(\x05H\n\x88\x01\x01\x1a\x38\n\x14\x44\x65partureTimeWrapper\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_seconds\x1a\x36\n\x12\x41rrivalTimeWrapper\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_secondsB\r\n\x0b_station_idB\x08\n\x06_labelB\x12\n\x10_charge_durationB\x0e\n\x0c_arrival_socB\x10\n\x0e_arrival_rangeB\x10\n\x0e_departure_socB\x12\n\x10_departure_rangeB\x0b\n\t_field_12B\x0b\n\t_field_13B\x0b\n\t_field_14B\x0b\n\t_field_17\x1a\xcb\x06\n\x03Leg\x12\x15\n\x08\x64istance\x18\x01 \x01(\x01H\x00\x88\x01\x01\x12\x15\n\x08\x64uration\x18\x02 \x01(\x01H\x01\x88\x01\x01\x12\x17\n\nroad_label\x18\x03 \x01(\tH\x02\x88\x01\x01\x12\x15\n\x08polyline\x18\x04 \x01(\tH\x03\x88\x01\x01\x12\"\n\x15\x66lagged_ranges_packed\x18\x05 \x01(\x0cH\x04\x88\x01\x01\x12$\n\x17unflagged_ranges_packed\x18\x06 \x01(\x0cH\x05\x88\x01\x01\x12?\n\x06\x65nergy\x18\x08 \x01(\x0b\x32/.rivian.parallax.navigation.TripInfo.Leg.Energy\x12\x63\n\x19\x63\x61tegorized_range_segment\x18\t \x03(\x0b\x32@.rivian.parallax.navigation.TripInfo.Leg.CategorizedRangeSegment\x12W\n\x13index_range_segment\x18\n \x03(\x0b\x32:.rivian.parallax.navigation.TripInfo.Leg.IndexRangeSegment\x1a\"\n\x06\x45nergy\x12\x10\n\x03kwh\x18\x01 \x01(\x01H\x00\x88\x01\x01\x42\x06\n\x04_kwh\x1au\n\x17\x43\x61tegorizedRangeSegment\x12\x12\n\x05start\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12\x15\n\x08\x63\x61tegory\x18\x03 \x01(\x05H\x02\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_endB\x0b\n\t_category\x1a\x95\x01\n\x11IndexRangeSegment\x12\x12\n\x05start\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x16\n\x0estart_fraction\x18\x02 \x01(\x02\x12\x10\n\x03\x65nd\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12\x14\n\x0c\x65nd_fraction\x18\x04 \x01(\x02\x12\x11\n\x04\x66lag\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_endB\x07\n\x05_flagB\x0b\n\t_distanceB\x0b\n\t_durationB\r\n\x0b_road_labelB\x0b\n\t_polylineB\x18\n\x16_flagged_ranges_packedB\x1a\n\x18_unflagged_ranges_packed\x1a\x94\x01\n\x10RoutePreferences\x12\x15\n\x08weight_a\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12\x15\n\x08weight_b\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12\x16\n\x0eroad_avoidance\x18\x03 \x03(\t\x12 \n\x18\x63harging_network_filters\x18\x04 \x03(\tB\x0b\n\t_weight_aB\x0b\n\t_weight_b\x1a\xe9\x01\n\x08TripMeta\x12\x14\n\x07\x66ield_1\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12H\n\x07\x66ield_2\x18\x02 \x01(\x0b\x32\x37.rivian.parallax.navigation.TripInfo.TripMeta.Unmapped2\x12\x14\n\x07\x66ield_3\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12\x14\n\x07\x66ield_4\x18\x04 \x01(\x05H\x02\x88\x01\x01\x1a-\n\tUnmapped2\x12\x0f\n\x07\x66ield_2\x18\x02 \x01(\x05\x12\x0f\n\x07\x66ield_4\x18\x04 \x01(\x05\x42\n\n\x08_field_1B\n\n\x08_field_3B\n\n\x08_field_4B\n\n\x08_trip_idB\r\n\x0b_origin_soc\"\xff\x04\n\x0cTripProgress\x12L\n\rnext_waypoint\x18\x01 \x01(\x0b\x32\x35.rivian.parallax.navigation.TripProgress.NextWaypoint\x12T\n\x11\x66inal_destination\x18\x02 \x01(\x0b\x32\x39.rivian.parallax.navigation.TripProgress.FinalDestination\x12\x1f\n\x12\x64istance_remaining\x18\x04 \x01(\x01H\x00\x88\x01\x01\x12\x1f\n\x12\x64uration_remaining\x18\x05 \x01(\x01H\x01\x88\x01\x01\x12J\n\x0clocation_fix\x18\x06 \x01(\x0b\x32\x34.rivian.parallax.navigation.TripProgress.LocationFix\x1a\x30\n\x0cNextWaypoint\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_seconds\x1a\x34\n\x10\x46inalDestination\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_seconds\x1a\xa6\x01\n\x0bLocationFix\x12;\n\x08location\x18\x01 \x01(\x0b\x32).rivian.parallax.navigation.GeoCoordinate\x12\x12\n\x05speed\x18\x02 \x01(\x02H\x00\x88\x01\x01\x12\x14\n\x07heading\x18\x03 \x01(\x02H\x01\x88\x01\x01\x12\x11\n\x04time\x18\x05 \x01(\x03H\x02\x88\x01\x01\x42\x08\n\x06_speedB\n\n\x08_headingB\x07\n\x05_timeB\x15\n\x13_distance_remainingB\x15\n\x13_duration_remainingb\x06proto3')
28
28
 
29
29
  _globals = globals()
30
30
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -36,7 +36,7 @@ if not _descriptor._USE_C_DESCRIPTORS:
36
36
  _globals['_TIMESTAMP']._serialized_start=161
37
37
  _globals['_TIMESTAMP']._serialized_end=236
38
38
  _globals['_TRIPINFO']._serialized_start=239
39
- _globals['_TRIPINFO']._serialized_end=3653
39
+ _globals['_TRIPINFO']._serialized_end=3787
40
40
  _globals['_TRIPINFO_ORIGIN']._serialized_start=592
41
41
  _globals['_TRIPINFO_ORIGIN']._serialized_end=723
42
42
  _globals['_TRIPINFO_NEXTWAYPOINTDEPARTURE']._serialized_start=725
@@ -54,23 +54,25 @@ if not _descriptor._USE_C_DESCRIPTORS:
54
54
  _globals['_TRIPINFO_CHARGINGSTOP_ARRIVALTIMEWRAPPER']._serialized_start=2304
55
55
  _globals['_TRIPINFO_CHARGINGSTOP_ARRIVALTIMEWRAPPER']._serialized_end=2358
56
56
  _globals['_TRIPINFO_LEG']._serialized_start=2530
57
- _globals['_TRIPINFO_LEG']._serialized_end=3326
57
+ _globals['_TRIPINFO_LEG']._serialized_end=3373
58
58
  _globals['_TRIPINFO_LEG_ENERGY']._serialized_start=2960
59
59
  _globals['_TRIPINFO_LEG_ENERGY']._serialized_end=2994
60
60
  _globals['_TRIPINFO_LEG_CATEGORIZEDRANGESEGMENT']._serialized_start=2996
61
61
  _globals['_TRIPINFO_LEG_CATEGORIZEDRANGESEGMENT']._serialized_end=3113
62
- _globals['_TRIPINFO_LEG_INDEXRANGESEGMENT']._serialized_start=3115
63
- _globals['_TRIPINFO_LEG_INDEXRANGESEGMENT']._serialized_end=3218
64
- _globals['_TRIPINFO_ROUTEPREFERENCES']._serialized_start=3329
65
- _globals['_TRIPINFO_ROUTEPREFERENCES']._serialized_end=3477
66
- _globals['_TRIPINFO_TRIPMETA']._serialized_start=3480
67
- _globals['_TRIPINFO_TRIPMETA']._serialized_end=3626
68
- _globals['_TRIPPROGRESS']._serialized_start=3656
69
- _globals['_TRIPPROGRESS']._serialized_end=4295
70
- _globals['_TRIPPROGRESS_NEXTWAYPOINT']._serialized_start=3978
71
- _globals['_TRIPPROGRESS_NEXTWAYPOINT']._serialized_end=4026
72
- _globals['_TRIPPROGRESS_FINALDESTINATION']._serialized_start=4028
73
- _globals['_TRIPPROGRESS_FINALDESTINATION']._serialized_end=4080
74
- _globals['_TRIPPROGRESS_LOCATIONFIX']._serialized_start=4083
75
- _globals['_TRIPPROGRESS_LOCATIONFIX']._serialized_end=4249
62
+ _globals['_TRIPINFO_LEG_INDEXRANGESEGMENT']._serialized_start=3116
63
+ _globals['_TRIPINFO_LEG_INDEXRANGESEGMENT']._serialized_end=3265
64
+ _globals['_TRIPINFO_ROUTEPREFERENCES']._serialized_start=3376
65
+ _globals['_TRIPINFO_ROUTEPREFERENCES']._serialized_end=3524
66
+ _globals['_TRIPINFO_TRIPMETA']._serialized_start=3527
67
+ _globals['_TRIPINFO_TRIPMETA']._serialized_end=3760
68
+ _globals['_TRIPINFO_TRIPMETA_UNMAPPED2']._serialized_start=3679
69
+ _globals['_TRIPINFO_TRIPMETA_UNMAPPED2']._serialized_end=3724
70
+ _globals['_TRIPPROGRESS']._serialized_start=3790
71
+ _globals['_TRIPPROGRESS']._serialized_end=4429
72
+ _globals['_TRIPPROGRESS_NEXTWAYPOINT']._serialized_start=4112
73
+ _globals['_TRIPPROGRESS_NEXTWAYPOINT']._serialized_end=4160
74
+ _globals['_TRIPPROGRESS_FINALDESTINATION']._serialized_start=4162
75
+ _globals['_TRIPPROGRESS_FINALDESTINATION']._serialized_end=4214
76
+ _globals['_TRIPPROGRESS_LOCATIONFIX']._serialized_start=4217
77
+ _globals['_TRIPPROGRESS_LOCATIONFIX']._serialized_end=4383
76
78
  # @@protoc_insertion_point(module_scope)
@@ -141,14 +141,18 @@ class TripInfo(_message.Message):
141
141
  category: int
142
142
  def __init__(self, start: _Optional[int] = ..., end: _Optional[int] = ..., category: _Optional[int] = ...) -> None: ...
143
143
  class IndexRangeSegment(_message.Message):
144
- __slots__ = ("start", "end", "flag")
144
+ __slots__ = ("start", "start_fraction", "end", "end_fraction", "flag")
145
145
  START_FIELD_NUMBER: _ClassVar[int]
146
+ START_FRACTION_FIELD_NUMBER: _ClassVar[int]
146
147
  END_FIELD_NUMBER: _ClassVar[int]
148
+ END_FRACTION_FIELD_NUMBER: _ClassVar[int]
147
149
  FLAG_FIELD_NUMBER: _ClassVar[int]
148
150
  start: int
151
+ start_fraction: float
149
152
  end: int
153
+ end_fraction: float
150
154
  flag: bool
151
- def __init__(self, start: _Optional[int] = ..., end: _Optional[int] = ..., flag: _Optional[bool] = ...) -> None: ...
155
+ def __init__(self, start: _Optional[int] = ..., start_fraction: _Optional[float] = ..., end: _Optional[int] = ..., end_fraction: _Optional[float] = ..., flag: _Optional[bool] = ...) -> None: ...
152
156
  DISTANCE_FIELD_NUMBER: _ClassVar[int]
153
157
  DURATION_FIELD_NUMBER: _ClassVar[int]
154
158
  ROAD_LABEL_FIELD_NUMBER: _ClassVar[int]
@@ -181,15 +185,22 @@ class TripInfo(_message.Message):
181
185
  def __init__(self, weight_a: _Optional[float] = ..., weight_b: _Optional[float] = ..., road_avoidance: _Optional[_Iterable[str]] = ..., charging_network_filters: _Optional[_Iterable[str]] = ...) -> None: ...
182
186
  class TripMeta(_message.Message):
183
187
  __slots__ = ("field_1", "field_2", "field_3", "field_4")
188
+ class Unmapped2(_message.Message):
189
+ __slots__ = ("field_2", "field_4")
190
+ FIELD_2_FIELD_NUMBER: _ClassVar[int]
191
+ FIELD_4_FIELD_NUMBER: _ClassVar[int]
192
+ field_2: int
193
+ field_4: int
194
+ def __init__(self, field_2: _Optional[int] = ..., field_4: _Optional[int] = ...) -> None: ...
184
195
  FIELD_1_FIELD_NUMBER: _ClassVar[int]
185
196
  FIELD_2_FIELD_NUMBER: _ClassVar[int]
186
197
  FIELD_3_FIELD_NUMBER: _ClassVar[int]
187
198
  FIELD_4_FIELD_NUMBER: _ClassVar[int]
188
199
  field_1: int
189
- field_2: int
200
+ field_2: TripInfo.TripMeta.Unmapped2
190
201
  field_3: int
191
202
  field_4: int
192
- def __init__(self, field_1: _Optional[int] = ..., field_2: _Optional[int] = ..., field_3: _Optional[int] = ..., field_4: _Optional[int] = ...) -> None: ...
203
+ def __init__(self, field_1: _Optional[int] = ..., field_2: _Optional[_Union[TripInfo.TripMeta.Unmapped2, _Mapping]] = ..., field_3: _Optional[int] = ..., field_4: _Optional[int] = ...) -> None: ...
193
204
  TRIP_ID_FIELD_NUMBER: _ClassVar[int]
194
205
  ORIGIN_FIELD_NUMBER: _ClassVar[int]
195
206
  TRIP_FIELD_NUMBER: _ClassVar[int]
@@ -67,17 +67,18 @@ message DeploymentState {
67
67
  }
68
68
  }
69
69
 
70
- // ota.user_schedule.ota_config -- auto-install schedule. Entries may be
71
- // resent without their ids.
70
+ // ota.user_schedule.ota_config -- install schedules: a one-time scheduled
71
+ // install and the recurring auto-install. Entries may be resent without
72
+ // their ids.
72
73
  message OtaConfig {
73
74
  repeated Schedule schedule = 1;
74
75
  UpdatedAt updated_at = 2;
75
76
 
76
77
  message Schedule {
77
78
  optional string id = 1; // UUID
78
- bool enabled = 2; // whether auto-install is on
79
- TimeOfDay time_of_day = 3;
80
- Unmapped4 field_4 = 4; // unknown; on the entry with no time of day
79
+ bool enabled = 2;
80
+ TimeOfDay time_of_day = 3; // recurring auto-install
81
+ OneTime one_time = 4; // one-time scheduled install
81
82
  }
82
83
 
83
84
  message TimeOfDay {
@@ -89,8 +90,12 @@ message OtaConfig {
89
90
  optional string name = 1; // a saved location (e.g. "home") or "anywhere"
90
91
  }
91
92
 
92
- message Unmapped4 {
93
- string field_1 = 1; // always empty
93
+ message OneTime {
94
+ InstallTime install_time = 1; // empty until a time is picked
95
+
96
+ message InstallTime {
97
+ optional int64 seconds = 1; // epoch seconds
98
+ }
94
99
  }
95
100
 
96
101
  message UpdatedAt {
@@ -24,7 +24,7 @@ _sym_db = _symbol_database.Default()
24
24
 
25
25
 
26
26
 
27
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1frivian/parallax/proto/ota.proto\x12\x13rivian.parallax.ota\"\xd5\x0c\n\x0f\x44\x65ploymentState\x12\x43\n\ndeployment\x18\x01 \x01(\x0b\x32/.rivian.parallax.ota.DeploymentState.Deployment\x1a\xb9\x01\n\nDeployment\x12\x12\n\x05state\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12=\n\x07version\x18\x02 \x01(\x0b\x32,.rivian.parallax.ota.DeploymentState.Version\x12N\n\x10progress_wrapper\x18\x04 \x01(\x0b\x32\x34.rivian.parallax.ota.DeploymentState.ProgressWrapperB\x08\n\x06_state\x1a\xb7\x01\n\x07Version\x12\x1b\n\x0eversion_string\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cversion_year\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12\x1a\n\rversion_build\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x15\n\x08\x62uild_id\x18\x06 \x01(\tH\x03\x88\x01\x01\x42\x11\n\x0f_version_stringB\x0f\n\r_version_yearB\x10\n\x0e_version_buildB\x0b\n\t_build_id\x1a\xd2\x02\n\x0fProgressWrapper\x12\x1a\n\rdeployment_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x44\n\x0etarget_version\x18\x02 \x01(\x0b\x32,.rivian.parallax.ota.DeploymentState.Version\x12\x18\n\x0b\x61\x63tive_flag\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12?\n\x08progress\x18\x05 \x01(\x0b\x32-.rivian.parallax.ota.DeploymentState.Progress\x12\x1b\n\x0etimeout_budget\x18\x07 \x01(\x05H\x02\x88\x01\x01\x12\x1c\n\x0flate_stage_flag\x18\x0b \x01(\x05H\x03\x88\x01\x01\x42\x10\n\x0e_deployment_idB\x0e\n\x0c_active_flagB\x11\n\x0f_timeout_budgetB\x12\n\x10_late_stage_flag\x1a\xa3\x04\n\x08Progress\x12\x41\n\x05phase\x18\x01 \x01(\x0e\x32-.rivian.parallax.ota.DeploymentState.OtaPhaseH\x00\x88\x01\x01\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12T\n\x11\x64ownload_progress\x18\x03 \x01(\x0b\x32\x39.rivian.parallax.ota.DeploymentState.Progress.Progress100\x12S\n\x10install_progress\x18\x04 \x01(\x0b\x32\x39.rivian.parallax.ota.DeploymentState.Progress.Progress100\x12\x14\n\x07\x66ield_5\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x1b\n\x0etime_remaining\x18\x06 \x01(\x05H\x03\x88\x01\x01\x12\x14\n\x07\x66ield_7\x18\x07 \x01(\x05H\x04\x88\x01\x01\x12\x1f\n\x12update_cycle_count\x18\x08 \x01(\x05H\x05\x88\x01\x01\x12\x14\n\x07\x66ield_9\x18\t \x01(\x05H\x06\x88\x01\x01\x1a/\n\x0bProgress100\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x00\x88\x01\x01\x42\n\n\x08_field_2B\x08\n\x06_phaseB\n\n\x08_field_2B\n\n\x08_field_5B\x11\n\x0f_time_remainingB\n\n\x08_field_7B\x15\n\x13_update_cycle_countB\n\n\x08_field_9\"\x8b\x02\n\x08OtaPhase\x12\x19\n\x15OTA_PHASE_UNSPECIFIED\x10\x00\x12\x12\n\x0eOTA_PHASE_IDLE\x10\x01\x12\x1f\n\x1bOTA_PHASE_INSTALL_COUNTDOWN\x10\x05\x12\x17\n\x13OTA_PHASE_PREPARING\x10\x06\x12\x19\n\x15OTA_PHASE_DOWNLOADING\x10\x07\x12\"\n\x1eOTA_PHASE_SCHEDULED_TO_INSTALL\x10\x08\x12\x1e\n\x1aOTA_PHASE_AWAITING_INSTALL\x10\n\x12\x18\n\x14OTA_PHASE_INSTALLING\x10\x0b\x12\x1d\n\x19OTA_PHASE_INSTALL_SUCCESS\x10\x0c\"\x97\x04\n\tOtaConfig\x12\x39\n\x08schedule\x18\x01 \x03(\x0b\x32\'.rivian.parallax.ota.OtaConfig.Schedule\x12<\n\nupdated_at\x18\x02 \x01(\x0b\x32(.rivian.parallax.ota.OtaConfig.UpdatedAt\x1a\xad\x01\n\x08Schedule\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x65nabled\x18\x02 \x01(\x08\x12=\n\x0btime_of_day\x18\x03 \x01(\x0b\x32(.rivian.parallax.ota.OtaConfig.TimeOfDay\x12\x39\n\x07\x66ield_4\x18\x04 \x01(\x0b\x32(.rivian.parallax.ota.OtaConfig.Unmapped4B\x05\n\x03_id\x1an\n\tTimeOfDay\x12\x17\n\nstart_time\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x39\n\x08location\x18\x02 \x01(\x0b\x32\'.rivian.parallax.ota.OtaConfig.LocationB\r\n\x0b_start_time\x1a&\n\x08Location\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_name\x1a\x1c\n\tUnmapped4\x12\x0f\n\x07\x66ield_1\x18\x01 \x01(\t\x1a+\n\tUpdatedAt\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\x12\r\n\x05nanos\x18\x02 \x01(\x05\"\x1f\n\x0fVehicleOtaState\x12\x0c\n\x04name\x18\x01 \x01(\tb\x06proto3')
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1frivian/parallax/proto/ota.proto\x12\x13rivian.parallax.ota\"\xd5\x0c\n\x0f\x44\x65ploymentState\x12\x43\n\ndeployment\x18\x01 \x01(\x0b\x32/.rivian.parallax.ota.DeploymentState.Deployment\x1a\xb9\x01\n\nDeployment\x12\x12\n\x05state\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12=\n\x07version\x18\x02 \x01(\x0b\x32,.rivian.parallax.ota.DeploymentState.Version\x12N\n\x10progress_wrapper\x18\x04 \x01(\x0b\x32\x34.rivian.parallax.ota.DeploymentState.ProgressWrapperB\x08\n\x06_state\x1a\xb7\x01\n\x07Version\x12\x1b\n\x0eversion_string\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cversion_year\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12\x1a\n\rversion_build\x18\x04 \x01(\x05H\x02\x88\x01\x01\x12\x15\n\x08\x62uild_id\x18\x06 \x01(\tH\x03\x88\x01\x01\x42\x11\n\x0f_version_stringB\x0f\n\r_version_yearB\x10\n\x0e_version_buildB\x0b\n\t_build_id\x1a\xd2\x02\n\x0fProgressWrapper\x12\x1a\n\rdeployment_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x44\n\x0etarget_version\x18\x02 \x01(\x0b\x32,.rivian.parallax.ota.DeploymentState.Version\x12\x18\n\x0b\x61\x63tive_flag\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12?\n\x08progress\x18\x05 \x01(\x0b\x32-.rivian.parallax.ota.DeploymentState.Progress\x12\x1b\n\x0etimeout_budget\x18\x07 \x01(\x05H\x02\x88\x01\x01\x12\x1c\n\x0flate_stage_flag\x18\x0b \x01(\x05H\x03\x88\x01\x01\x42\x10\n\x0e_deployment_idB\x0e\n\x0c_active_flagB\x11\n\x0f_timeout_budgetB\x12\n\x10_late_stage_flag\x1a\xa3\x04\n\x08Progress\x12\x41\n\x05phase\x18\x01 \x01(\x0e\x32-.rivian.parallax.ota.DeploymentState.OtaPhaseH\x00\x88\x01\x01\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x01\x88\x01\x01\x12T\n\x11\x64ownload_progress\x18\x03 \x01(\x0b\x32\x39.rivian.parallax.ota.DeploymentState.Progress.Progress100\x12S\n\x10install_progress\x18\x04 \x01(\x0b\x32\x39.rivian.parallax.ota.DeploymentState.Progress.Progress100\x12\x14\n\x07\x66ield_5\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x1b\n\x0etime_remaining\x18\x06 \x01(\x05H\x03\x88\x01\x01\x12\x14\n\x07\x66ield_7\x18\x07 \x01(\x05H\x04\x88\x01\x01\x12\x1f\n\x12update_cycle_count\x18\x08 \x01(\x05H\x05\x88\x01\x01\x12\x14\n\x07\x66ield_9\x18\t \x01(\x05H\x06\x88\x01\x01\x1a/\n\x0bProgress100\x12\x14\n\x07\x66ield_2\x18\x02 \x01(\x05H\x00\x88\x01\x01\x42\n\n\x08_field_2B\x08\n\x06_phaseB\n\n\x08_field_2B\n\n\x08_field_5B\x11\n\x0f_time_remainingB\n\n\x08_field_7B\x15\n\x13_update_cycle_countB\n\n\x08_field_9\"\x8b\x02\n\x08OtaPhase\x12\x19\n\x15OTA_PHASE_UNSPECIFIED\x10\x00\x12\x12\n\x0eOTA_PHASE_IDLE\x10\x01\x12\x1f\n\x1bOTA_PHASE_INSTALL_COUNTDOWN\x10\x05\x12\x17\n\x13OTA_PHASE_PREPARING\x10\x06\x12\x19\n\x15OTA_PHASE_DOWNLOADING\x10\x07\x12\"\n\x1eOTA_PHASE_SCHEDULED_TO_INSTALL\x10\x08\x12\x1e\n\x1aOTA_PHASE_AWAITING_INSTALL\x10\n\x12\x18\n\x14OTA_PHASE_INSTALLING\x10\x0b\x12\x1d\n\x19OTA_PHASE_INSTALL_SUCCESS\x10\x0c\"\xff\x04\n\tOtaConfig\x12\x39\n\x08schedule\x18\x01 \x03(\x0b\x32\'.rivian.parallax.ota.OtaConfig.Schedule\x12<\n\nupdated_at\x18\x02 \x01(\x0b\x32(.rivian.parallax.ota.OtaConfig.UpdatedAt\x1a\xac\x01\n\x08Schedule\x12\x0f\n\x02id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x65nabled\x18\x02 \x01(\x08\x12=\n\x0btime_of_day\x18\x03 \x01(\x0b\x32(.rivian.parallax.ota.OtaConfig.TimeOfDay\x12\x38\n\x08one_time\x18\x04 \x01(\x0b\x32&.rivian.parallax.ota.OtaConfig.OneTimeB\x05\n\x03_id\x1an\n\tTimeOfDay\x12\x17\n\nstart_time\x18\x01 \x01(\x05H\x00\x88\x01\x01\x12\x39\n\x08location\x18\x02 \x01(\x0b\x32\'.rivian.parallax.ota.OtaConfig.LocationB\r\n\x0b_start_time\x1a&\n\x08Location\x12\x11\n\x04name\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_name\x1a\x84\x01\n\x07OneTime\x12H\n\x0cinstall_time\x18\x01 \x01(\x0b\x32\x32.rivian.parallax.ota.OtaConfig.OneTime.InstallTime\x1a/\n\x0bInstallTime\x12\x14\n\x07seconds\x18\x01 \x01(\x03H\x00\x88\x01\x01\x42\n\n\x08_seconds\x1a+\n\tUpdatedAt\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\x12\r\n\x05nanos\x18\x02 \x01(\x05\"\x1f\n\x0fVehicleOtaState\x12\x0c\n\x04name\x18\x01 \x01(\tb\x06proto3')
28
28
 
29
29
  _globals = globals()
30
30
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -46,17 +46,19 @@ if not _descriptor._USE_C_DESCRIPTORS:
46
46
  _globals['_DEPLOYMENTSTATE_OTAPHASE']._serialized_start=1411
47
47
  _globals['_DEPLOYMENTSTATE_OTAPHASE']._serialized_end=1678
48
48
  _globals['_OTACONFIG']._serialized_start=1681
49
- _globals['_OTACONFIG']._serialized_end=2216
49
+ _globals['_OTACONFIG']._serialized_end=2320
50
50
  _globals['_OTACONFIG_SCHEDULE']._serialized_start=1816
51
- _globals['_OTACONFIG_SCHEDULE']._serialized_end=1989
52
- _globals['_OTACONFIG_TIMEOFDAY']._serialized_start=1991
53
- _globals['_OTACONFIG_TIMEOFDAY']._serialized_end=2101
54
- _globals['_OTACONFIG_LOCATION']._serialized_start=2103
55
- _globals['_OTACONFIG_LOCATION']._serialized_end=2141
56
- _globals['_OTACONFIG_UNMAPPED4']._serialized_start=2143
57
- _globals['_OTACONFIG_UNMAPPED4']._serialized_end=2171
58
- _globals['_OTACONFIG_UPDATEDAT']._serialized_start=2173
59
- _globals['_OTACONFIG_UPDATEDAT']._serialized_end=2216
60
- _globals['_VEHICLEOTASTATE']._serialized_start=2218
61
- _globals['_VEHICLEOTASTATE']._serialized_end=2249
51
+ _globals['_OTACONFIG_SCHEDULE']._serialized_end=1988
52
+ _globals['_OTACONFIG_TIMEOFDAY']._serialized_start=1990
53
+ _globals['_OTACONFIG_TIMEOFDAY']._serialized_end=2100
54
+ _globals['_OTACONFIG_LOCATION']._serialized_start=2102
55
+ _globals['_OTACONFIG_LOCATION']._serialized_end=2140
56
+ _globals['_OTACONFIG_ONETIME']._serialized_start=2143
57
+ _globals['_OTACONFIG_ONETIME']._serialized_end=2275
58
+ _globals['_OTACONFIG_ONETIME_INSTALLTIME']._serialized_start=2228
59
+ _globals['_OTACONFIG_ONETIME_INSTALLTIME']._serialized_end=2275
60
+ _globals['_OTACONFIG_UPDATEDAT']._serialized_start=2277
61
+ _globals['_OTACONFIG_UPDATEDAT']._serialized_end=2320
62
+ _globals['_VEHICLEOTASTATE']._serialized_start=2322
63
+ _globals['_VEHICLEOTASTATE']._serialized_end=2353
62
64
  # @@protoc_insertion_point(module_scope)
@@ -97,16 +97,16 @@ class DeploymentState(_message.Message):
97
97
  class OtaConfig(_message.Message):
98
98
  __slots__ = ("schedule", "updated_at")
99
99
  class Schedule(_message.Message):
100
- __slots__ = ("id", "enabled", "time_of_day", "field_4")
100
+ __slots__ = ("id", "enabled", "time_of_day", "one_time")
101
101
  ID_FIELD_NUMBER: _ClassVar[int]
102
102
  ENABLED_FIELD_NUMBER: _ClassVar[int]
103
103
  TIME_OF_DAY_FIELD_NUMBER: _ClassVar[int]
104
- FIELD_4_FIELD_NUMBER: _ClassVar[int]
104
+ ONE_TIME_FIELD_NUMBER: _ClassVar[int]
105
105
  id: str
106
106
  enabled: bool
107
107
  time_of_day: OtaConfig.TimeOfDay
108
- field_4: OtaConfig.Unmapped4
109
- def __init__(self, id: _Optional[str] = ..., enabled: _Optional[bool] = ..., time_of_day: _Optional[_Union[OtaConfig.TimeOfDay, _Mapping]] = ..., field_4: _Optional[_Union[OtaConfig.Unmapped4, _Mapping]] = ...) -> None: ...
108
+ one_time: OtaConfig.OneTime
109
+ def __init__(self, id: _Optional[str] = ..., enabled: _Optional[bool] = ..., time_of_day: _Optional[_Union[OtaConfig.TimeOfDay, _Mapping]] = ..., one_time: _Optional[_Union[OtaConfig.OneTime, _Mapping]] = ...) -> None: ...
110
110
  class TimeOfDay(_message.Message):
111
111
  __slots__ = ("start_time", "location")
112
112
  START_TIME_FIELD_NUMBER: _ClassVar[int]
@@ -119,11 +119,16 @@ class OtaConfig(_message.Message):
119
119
  NAME_FIELD_NUMBER: _ClassVar[int]
120
120
  name: str
121
121
  def __init__(self, name: _Optional[str] = ...) -> None: ...
122
- class Unmapped4(_message.Message):
123
- __slots__ = ("field_1",)
124
- FIELD_1_FIELD_NUMBER: _ClassVar[int]
125
- field_1: str
126
- def __init__(self, field_1: _Optional[str] = ...) -> None: ...
122
+ class OneTime(_message.Message):
123
+ __slots__ = ("install_time",)
124
+ class InstallTime(_message.Message):
125
+ __slots__ = ("seconds",)
126
+ SECONDS_FIELD_NUMBER: _ClassVar[int]
127
+ seconds: int
128
+ def __init__(self, seconds: _Optional[int] = ...) -> None: ...
129
+ INSTALL_TIME_FIELD_NUMBER: _ClassVar[int]
130
+ install_time: OtaConfig.OneTime.InstallTime
131
+ def __init__(self, install_time: _Optional[_Union[OtaConfig.OneTime.InstallTime, _Mapping]] = ...) -> None: ...
127
132
  class UpdatedAt(_message.Message):
128
133
  __slots__ = ("seconds", "nanos")
129
134
  SECONDS_FIELD_NUMBER: _ClassVar[int]
@@ -26,6 +26,10 @@ if TYPE_CHECKING:
26
26
 
27
27
  _LOGGER = logging.getLogger(__name__)
28
28
 
29
+ RATE_LIMITED = "Rate limited"
30
+ RATE_LIMIT_BACKOFF_MIN = 30
31
+ RATE_LIMIT_BACKOFF_MAX = 900
32
+
29
33
 
30
34
  async def cancel_task(*tasks: asyncio.Task | None) -> None:
31
35
  """Cancel task(s)."""
@@ -54,6 +58,8 @@ class WebSocketMonitor:
54
58
 
55
59
  self._connection_ack: asyncio.Event = asyncio.Event()
56
60
  self._disconnect = False
61
+ self._rate_limited = False
62
+ self._rate_limit_attempt = 0
57
63
  self._ws: ClientWebSocketResponse[bool] | None = None
58
64
  self._monitor_task: asyncio.Task | None = None
59
65
  self._receiver_task: asyncio.Task | None = None
@@ -88,6 +94,7 @@ class WebSocketMonitor:
88
94
  """Create a new connection and, optionally, start the monitor."""
89
95
  await cancel_task(self._receiver_task)
90
96
  self._disconnect = False
97
+ self._rate_limited = False
91
98
  # pylint: disable=protected-access
92
99
  assert self._account._session
93
100
  self._ws = await self._account._session.ws_connect(
@@ -145,6 +152,8 @@ class WebSocketMonitor:
145
152
  self._log_message(msg)
146
153
  if msg.extra == "Unauthenticated":
147
154
  self._disconnect = True
155
+ elif msg.extra == RATE_LIMITED:
156
+ self._rate_limited = True
148
157
  break
149
158
  self._last_received = datetime.now(timezone.utc)
150
159
  if msg.type == WSMsgType.TEXT:
@@ -152,6 +161,7 @@ class WebSocketMonitor:
152
161
  if (data_type := data.get("type")) == "connection_ack":
153
162
  self._connection_ack.set()
154
163
  elif data_type == "next":
164
+ self._rate_limit_attempt = 0
155
165
  if (_id := data.get("id")) in self._subscriptions:
156
166
  _fn = self._subscriptions[_id][0]
157
167
  if inspect.iscoroutinefunction(_fn):
@@ -164,6 +174,8 @@ class WebSocketMonitor:
164
174
  self._log_message(msg, True)
165
175
  continue
166
176
  except asyncio.TimeoutError:
177
+ # The connection has stayed open, so any rate limit has passed
178
+ self._rate_limit_attempt = 0
167
179
  await self._resubscribe_all()
168
180
  self._connection_ack.clear()
169
181
  self._log_message("web socket stopped")
@@ -177,6 +189,10 @@ class WebSocketMonitor:
177
189
  # Need to restart the receiver
178
190
  self._receiver_task = asyncio.ensure_future(self._receiver())
179
191
  await asyncio.sleep(1)
192
+ if self._rate_limited:
193
+ await self._rate_limit_backoff()
194
+ if self._disconnect or self.connected:
195
+ continue
180
196
  if not self._disconnect:
181
197
  try:
182
198
  await self.new_connection()
@@ -190,6 +206,21 @@ class WebSocketMonitor:
190
206
  self._log_message("web socket connection reopened")
191
207
  await self._resubscribe_all()
192
208
 
209
+ async def _rate_limit_backoff(self) -> None:
210
+ """Wait before reconnecting after the server closed the connection due to rate limiting."""
211
+ self._rate_limited = False
212
+ delay = min(
213
+ RATE_LIMIT_BACKOFF_MIN * 2**self._rate_limit_attempt
214
+ + uniform(0, RATE_LIMIT_BACKOFF_MIN),
215
+ RATE_LIMIT_BACKOFF_MAX,
216
+ )
217
+ self._rate_limit_attempt += 1
218
+ _LOGGER.warning(
219
+ "Web socket connection was rate limited, reconnecting in %.0f seconds",
220
+ delay,
221
+ )
222
+ await asyncio.sleep(delay)
223
+
193
224
  async def start_monitor(self) -> None:
194
225
  """Start or restart the monitor task."""
195
226
  if self._monitor_task is None or self._monitor_task.done():