rivian-python-client 2.2.0b2__tar.gz → 2.2.0b4__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 (101) hide show
  1. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/PKG-INFO +1 -1
  2. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/__version__.py +1 -1
  3. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/body.py +1 -1
  4. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/charging.py +16 -6
  5. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/comfort.py +35 -47
  6. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/device_table.py +1 -1
  7. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/dynamics.py +31 -29
  8. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/energy.py +6 -11
  9. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/energy_edge_compute.py +6 -8
  10. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/holiday_celebration.py +2 -4
  11. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/navigation.py +12 -32
  12. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/ota.py +4 -7
  13. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/body.proto +2 -2
  14. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/charging.proto +6 -5
  15. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/charging_pb2.py +12 -12
  16. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/charging_pb2.pyi +6 -6
  17. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/comfort.proto +11 -11
  18. rivian_python_client-2.2.0b4/src/rivian/parallax/proto/comfort_pb2.py +78 -0
  19. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/departure.proto +1 -1
  20. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/departure_pb2.py +11 -11
  21. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/device_table.proto +1 -1
  22. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/dynamics.proto +19 -20
  23. rivian_python_client-2.2.0b4/src/rivian/parallax/proto/dynamics_pb2.py +72 -0
  24. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/dynamics_pb2.pyi +12 -12
  25. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/energy.proto +6 -6
  26. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/energy_edge_compute.proto +12 -12
  27. rivian_python_client-2.2.0b4/src/rivian/parallax/proto/energy_edge_compute_pb2.py +49 -0
  28. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/energy_pb2.py +11 -11
  29. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/geofence.proto +1 -1
  30. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/holiday_celebration.proto +3 -3
  31. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/holiday_celebration_pb2.py +12 -12
  32. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/navigation.proto +10 -10
  33. rivian_python_client-2.2.0b4/src/rivian/parallax/proto/navigation_pb2.py +78 -0
  34. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/ota.proto +4 -4
  35. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/ota_pb2.py +25 -25
  36. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/security.proto +1 -1
  37. rivian_python_client-2.2.0b4/src/rivian/parallax/proto/security_pb2.py +66 -0
  38. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/vehicle.proto +23 -16
  39. rivian_python_client-2.2.0b4/src/rivian/parallax/proto/vehicle_pb2.py +64 -0
  40. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/vehicle_pb2.pyi +15 -6
  41. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/security.py +2 -2
  42. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/vehicle.py +47 -33
  43. rivian_python_client-2.2.0b2/src/rivian/parallax/proto/comfort_pb2.py +0 -78
  44. rivian_python_client-2.2.0b2/src/rivian/parallax/proto/dynamics_pb2.py +0 -72
  45. rivian_python_client-2.2.0b2/src/rivian/parallax/proto/energy_edge_compute_pb2.py +0 -49
  46. rivian_python_client-2.2.0b2/src/rivian/parallax/proto/navigation_pb2.py +0 -78
  47. rivian_python_client-2.2.0b2/src/rivian/parallax/proto/security_pb2.py +0 -66
  48. rivian_python_client-2.2.0b2/src/rivian/parallax/proto/vehicle_pb2.py +0 -62
  49. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/.gitignore +0 -0
  50. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/README.md +0 -0
  51. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/pyproject.toml +0 -0
  52. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/__init__.py +0 -0
  53. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/ble.py +0 -0
  54. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/const.py +0 -0
  55. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/exceptions.py +0 -0
  56. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/__init__.py +0 -0
  57. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/core.py +0 -0
  58. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/departure.py +0 -0
  59. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/gearguard_streaming.py +0 -0
  60. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/geofence.py +0 -0
  61. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/parallax.py +0 -0
  62. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/__init__.py +0 -0
  63. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/body_pb2.py +0 -0
  64. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/body_pb2.pyi +0 -0
  65. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/comfort_pb2.pyi +0 -0
  66. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/departure_pb2.pyi +0 -0
  67. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/device_table_pb2.py +0 -0
  68. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/device_table_pb2.pyi +0 -0
  69. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/energy_edge_compute_pb2.pyi +0 -0
  70. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/energy_pb2.pyi +0 -0
  71. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/gearguard_streaming.proto +0 -0
  72. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/gearguard_streaming_pb2.py +0 -0
  73. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/gearguard_streaming_pb2.pyi +0 -0
  74. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/geofence_pb2.py +0 -0
  75. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/geofence_pb2.pyi +0 -0
  76. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/holiday_celebration_pb2.pyi +0 -0
  77. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/navigation_pb2.pyi +0 -0
  78. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/ota_pb2.pyi +0 -0
  79. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/parallax.proto +0 -0
  80. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/parallax_pb2.py +0 -0
  81. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/parallax_pb2.pyi +0 -0
  82. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/secure_file_transfer.proto +0 -0
  83. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/secure_file_transfer_pb2.py +0 -0
  84. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/secure_file_transfer_pb2.pyi +0 -0
  85. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/security_pb2.pyi +0 -0
  86. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/user_passcodes.proto +0 -0
  87. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/user_passcodes_pb2.py +0 -0
  88. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/user_passcodes_pb2.pyi +0 -0
  89. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/vehicle_access.proto +0 -0
  90. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/vehicle_access_pb2.py +0 -0
  91. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/proto/vehicle_access_pb2.pyi +0 -0
  92. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/secure_file_transfer.py +0 -0
  93. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/user_passcodes.py +0 -0
  94. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/parallax/vehicle_access.py +0 -0
  95. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/py.typed +0 -0
  96. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/rivian.py +0 -0
  97. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/schemas/charging.graphql +0 -0
  98. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/schemas/gateway.graphql +0 -0
  99. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/schemas/orders.graphql +0 -0
  100. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/utils.py +0 -0
  101. {rivian_python_client-2.2.0b2 → rivian_python_client-2.2.0b4}/src/rivian/ws_monitor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: rivian-python-client
3
- Version: 2.2.0b2
3
+ Version: 2.2.0b4
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.0b2'
4
+ __version__ = VERSION = '2.2.0b4'
@@ -196,7 +196,7 @@ def decode_wiper_fluid_level(m: body_pb2.WiperFluidLevel) -> dict[str, Any]:
196
196
  """body.wipers.fluid_level — washer fluid level.
197
197
 
198
198
  Fields:
199
- _wiperFluidLevel: int — raw (1 so far, presumably normal)
199
+ _wiperFluidLevel: int — raw
200
200
  """
201
201
  if (v := _present(m, "field_2")) is None:
202
202
  return {}
@@ -219,20 +219,30 @@ _CHARGER_STATUS_MAP: Final[dict[int, str]] = {
219
219
 
220
220
  @RVMDecoder.register("charging.energy.state", charging_pb2.EnergyState)
221
221
  def decode_energy_state(m: charging_pb2.EnergyState) -> dict[str, Any]:
222
- """charging.energy.state — charger connection status.
222
+ """charging.energy.state — charger connection and charging state.
223
223
 
224
224
  Fields:
225
225
  chargerStatus: str — GraphQL chargerStatus values
226
226
  ("chrgr_sts_not_connected" | "chrgr_sts_connected_no_chrg" |
227
227
  "chrgr_sts_connected_charging"); inferred
228
- _field1, _field3, _field11: int — raw
228
+ chargerState, connectionState: str | None — as in
229
+ charging.session.status
230
+ _field3: int — raw
229
231
  """
230
- result: dict[str, Any] = {}
232
+ result: dict[str, Any] = {
233
+ "chargerState": _enum(
234
+ _CHARGING_STATE_MAP, m.charging_state or None, what="charging state"
235
+ ),
236
+ "connectionState": _enum(
237
+ _CONNECTION_STATE_MAP,
238
+ m.connection_state or None,
239
+ what="charging connection state",
240
+ ),
241
+ }
231
242
  if (v := _present(m, "charger_status")) is not None:
232
243
  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
244
+ if (v := _present(m, "field_3")) is not None:
245
+ result["_field3"] = v
236
246
  return result
237
247
 
238
248
 
@@ -17,9 +17,7 @@ def decode_hvac_settings_status(m: comfort_pb2.HvacSettingsStatus) -> dict[str,
17
17
  Fields:
18
18
  hvacTargetTemperature: float (°C; 63.5 = "HI", set while defrosting)
19
19
  """
20
- if (v := _present(m, "target_temperature")) is None:
21
- return {}
22
- return {"hvacTargetTemperature": round(v, 1)}
20
+ return {"hvacTargetTemperature": round(m.target_temperature, 1)}
23
21
 
24
22
 
25
23
  @RVMDecoder.register("comfort.user_modes.state", comfort_pb2.UserModesState)
@@ -132,12 +130,10 @@ def decode_cabin_temperatures(m: comfort_pb2.CabinTemperatures) -> dict[str, Any
132
130
  cabinClimateDriverTemperature: float (°C) — set point, same as
133
131
  `hvacTargetTemperature`
134
132
  """
135
- result: dict[str, Any] = {}
136
- if (v := _present(m, "interior_temperature")) is not None:
137
- result["cabinClimateInteriorTemperature"] = round(v, 1)
138
- if (v := _present(m, "driver_set_point")) is not None:
139
- result["cabinClimateDriverTemperature"] = round(v, 1)
140
- return result
133
+ return {
134
+ "cabinClimateInteriorTemperature": round(m.interior_temperature, 1),
135
+ "cabinClimateDriverTemperature": round(m.driver_set_point, 1),
136
+ }
141
137
 
142
138
 
143
139
  @RVMDecoder.register(
@@ -146,24 +142,20 @@ def decode_cabin_temperatures(m: comfort_pb2.CabinTemperatures) -> dict[str, Any
146
142
  def decode_cabin_ventilation(m: comfort_pb2.CabinVentilationSetting) -> dict[str, Any]:
147
143
  """comfort.cabin.cabin_ventilation_setting — passive ventilation settings.
148
144
 
149
- Fields (each only when sent):
145
+ Fields:
150
146
  cabinVentilationEnabled: bool
151
- cabinVentilationMode: str ("AUTO" | "MANUAL" | "OFF")
147
+ cabinVentilationMode: str | None ("AUTO" | "MANUAL" | "OFF")
152
148
  cabinVentilationWindowsPosition: int (percent open)
153
149
  cabinVentilationSunroofPosition: int (percent open)
154
150
  cabinVentilationDuration: int (minutes)
155
151
  """
156
- result: dict[str, Any] = {}
157
- for field, key in (
158
- ("enabled", "cabinVentilationEnabled"),
159
- ("mode", "cabinVentilationMode"),
160
- ("windows_position", "cabinVentilationWindowsPosition"),
161
- ("sunroof_position", "cabinVentilationSunroofPosition"),
162
- ("duration", "cabinVentilationDuration"),
163
- ):
164
- if (v := _present(m, field)) is not None:
165
- result[key] = v
166
- return result
152
+ return {
153
+ "cabinVentilationEnabled": m.enabled,
154
+ "cabinVentilationMode": m.mode or None,
155
+ "cabinVentilationWindowsPosition": m.windows_position,
156
+ "cabinVentilationSunroofPosition": m.sunroof_position,
157
+ "cabinVentilationDuration": m.duration,
158
+ }
167
159
 
168
160
 
169
161
  @RVMDecoder.register(
@@ -185,29 +177,26 @@ def decode_climate_hold_status(m: comfort_pb2.ClimateHoldStatus) -> dict[str, An
185
177
  Fields:
186
178
  climateHoldStatus: str ("off" | "on" | "unavailable" | "fault" | "unspecified")
187
179
  climateHoldAvailability: str
188
- climateHoldUnavailabilityReason: str (only when not "unspecified")
189
- climateHoldEndTime: int (epoch seconds, only while a hold runs)
180
+ climateHoldUnavailabilityReason: str | None — None when unspecified
181
+ climateHoldEndTime: int | None (epoch seconds; None unless a hold runs)
190
182
  """
191
- result: dict[str, Any] = {}
192
- if (val := _present(m, "status")) is not None:
193
- result["climateHoldStatus"] = _enum(
194
- _CLIMATE_HOLD_STATUS_MAP, val, what="climate hold status"
195
- )
196
- if (val := _present(m, "availability")) is not None:
197
- result["climateHoldAvailability"] = _enum(
198
- _CLIMATE_HOLD_AVAILABILITY_MAP, val, what="climate hold availability"
199
- )
200
- if (val := _present(m, "unavailability_reason")) is not None:
201
- reason = _enum(
202
- _CLIMATE_HOLD_UNAVAILABILITY_REASON_MAP,
203
- val,
204
- what="climate hold unavailability reason",
205
- )
206
- if reason != "unspecified":
207
- result["climateHoldUnavailabilityReason"] = reason
208
- if m.end_time.seconds:
209
- result["climateHoldEndTime"] = m.end_time.seconds
210
- return result
183
+ reason = _enum(
184
+ _CLIMATE_HOLD_UNAVAILABILITY_REASON_MAP,
185
+ m.unavailability_reason,
186
+ what="climate hold unavailability reason",
187
+ )
188
+ return {
189
+ "climateHoldStatus": _enum(
190
+ _CLIMATE_HOLD_STATUS_MAP, m.status, what="climate hold status"
191
+ ),
192
+ "climateHoldAvailability": _enum(
193
+ _CLIMATE_HOLD_AVAILABILITY_MAP,
194
+ m.availability,
195
+ what="climate hold availability",
196
+ ),
197
+ "climateHoldUnavailabilityReason": None if reason == "unspecified" else reason,
198
+ "climateHoldEndTime": m.end_time.seconds or None,
199
+ }
211
200
 
212
201
 
213
202
  @RVMDecoder.register(
@@ -259,13 +248,12 @@ def decode_seat_conditioning(m: comfort_pb2.SeatConditioningStatus) -> dict[str,
259
248
  plus <surface>Heat/Vent for any other surface sent (middle seats,
260
249
  rearGlass, frontGlass, sideviewMirrors, wiperArea)
261
250
 
262
- Entries without a state are skipped.
251
+ A surface sent without a state is off.
263
252
  """
264
253
  result: dict[str, Any] = {}
265
254
  for surface in m.surface:
266
255
  surface_id, hvac_type = surface.id, surface.type
267
- if (state_val := _present(surface, "state")) is None:
268
- continue
256
+ state_val = _present(surface, "state")
269
257
  if surface_id in _CABIN_SURFACE_MAP and hvac_type in _CONDITIONING_TYPE_MAP:
270
258
  key = f"{_CABIN_SURFACE_MAP[surface_id]}{_CONDITIONING_TYPE_MAP[hvac_type]}"
271
259
  result[key] = _CONDITIONING_LEVEL_MAP.get(state_val, state_val)
@@ -45,7 +45,7 @@ def decode_vas_keyper_devices(m: device_table_pb2.VasKeyperDevices) -> dict[str,
45
45
  deleted keys
46
46
  infoC: int — 1 while active, 2147483647 while inactive, else the
47
47
  pairing attempt number
48
- infoA, infoB: int — unknown; always equal
48
+ infoA, infoB: int — unknown
49
49
  deviceId: str — hex; for a key card, the GraphQL `devices[].id`
50
50
  phoneId: str — the phone's UUID; phone keys
51
51
  credentialHex: str — hex; likely key material
@@ -71,8 +71,8 @@ def decode_drive_mode(m: dynamics_pb2.DriveMode) -> dict[str, Any]:
71
71
  """
72
72
  return {
73
73
  "driveMode": _enum(_DRIVE_MODE_MAP, _present(m, "mode"), what="drive mode"),
74
- "limitedAccelCold": _present(m, "limited_accel_cold"),
75
- "limitedRegenCold": _present(m, "limited_regen_cold"),
74
+ "limitedAccelCold": m.limited_accel_cold,
75
+ "limitedRegenCold": m.limited_regen_cold,
76
76
  }
77
77
 
78
78
 
@@ -83,12 +83,12 @@ def decode_gear(m: dynamics_pb2.Gear) -> dict[str, Any]:
83
83
  Fields:
84
84
  gearStatus: str
85
85
  """
86
- return {"gearStatus": _enum(_GEAR_MAP, _present(m, "gear"), what="gear")}
86
+ return {"gearStatus": _enum(_GEAR_MAP, m.gear, what="gear")}
87
87
 
88
88
 
89
89
  @RVMDecoder.register("dynamics.vehicle.gnss", dynamics_pb2.Gnss)
90
90
  def decode_gnss(m: dynamics_pb2.Gnss) -> dict[str, Any]:
91
- """dynamics.vehicle.gnss — GPS position, altitude and bearing.
91
+ """dynamics.vehicle.gnss — GPS position, altitude, bearing and speed.
92
92
 
93
93
  Fields:
94
94
  gnssTimeStamp: datetime — time of the fix
@@ -96,30 +96,32 @@ def decode_gnss(m: dynamics_pb2.Gnss) -> dict[str, Any]:
96
96
  (the gateway's VehicleLocation shape)
97
97
  gnssAltitude: float (meters)
98
98
  gnssBearing: float (degrees)
99
+ gnssSpeed: float (m/s)
100
+ gnssError: {"timeStamp": datetime, "positionVertical": float (m),
101
+ "positionHorizontal": float (m), "speed": float (m/s),
102
+ "bearing": float} (the gateway's gnssError shape)
99
103
  """
100
- lat = _present(m, "latitude")
101
- lon = _present(m, "longitude")
102
- alt = _present(m, "altitude")
103
- bearing = _present(m, "bearing")
104
- epoch = _present(m, "time")
105
- fix_time = from_epoch(epoch) if epoch is not None else None
106
-
107
- result: dict[str, Any] = {}
108
- if fix_time is not None:
109
- result["gnssTimeStamp"] = fix_time
110
- if lat is not None and lon is not None:
111
- location: dict[str, Any] = {
112
- "latitude": round(lat, 6),
113
- "longitude": round(lon, 6),
114
- }
115
- if fix_time is not None:
116
- location["timeStamp"] = fix_time
117
- result["gnssLocation"] = location
118
- if alt is not None:
119
- result["gnssAltitude"] = round(alt, 1)
120
- if bearing is not None:
121
- result["gnssBearing"] = round(bearing, 1)
122
- return result
104
+ if not m.ByteSize():
105
+ return {}
106
+ fix_time = from_epoch(m.time)
107
+ return {
108
+ "gnssTimeStamp": fix_time,
109
+ "gnssLocation": {
110
+ "latitude": round(m.latitude, 6),
111
+ "longitude": round(m.longitude, 6),
112
+ "timeStamp": fix_time,
113
+ },
114
+ "gnssAltitude": round(m.altitude, 1),
115
+ "gnssBearing": round(m.bearing, 1),
116
+ "gnssSpeed": round(m.speed, 2),
117
+ "gnssError": {
118
+ "timeStamp": fix_time,
119
+ "positionVertical": round(m.position_vertical_error, 1),
120
+ "positionHorizontal": round(m.position_horizontal_error, 1),
121
+ "speed": round(m.speed_error, 1),
122
+ "bearing": round(m.bearing_error, 1),
123
+ },
124
+ }
123
125
 
124
126
 
125
127
  @RVMDecoder.register("dynamics.vehicle.location", dynamics_pb2.KnownLocation)
@@ -158,7 +160,7 @@ def decode_range(m: dynamics_pb2.Range) -> dict[str, Any]:
158
160
  coldRangeNotification: str
159
161
  """
160
162
  return {
161
- "distanceToEmpty": _present(m, "distance_to_empty"),
163
+ "distanceToEmpty": m.distance_to_empty,
162
164
  "rangeThreshold": _enum(
163
165
  _RANGE_THRESHOLD_MAP, _present(m, "threshold"), what="range threshold"
164
166
  ),
@@ -238,7 +240,7 @@ def decode_brake_fluid_level(m: dynamics_pb2.BrakeFluidLevel) -> dict[str, Any]:
238
240
  """dynamics.brakes.fluid_level — brake fluid level.
239
241
 
240
242
  Fields:
241
- _brakeFluidLevel: int — raw (1 so far, presumably normal)
243
+ _brakeFluidLevel: int — raw
242
244
  """
243
245
  if (v := _present(m, "field_1")) is None:
244
246
  return {}
@@ -50,26 +50,21 @@ def decode_battery_state(m: energy_pb2.BatteryState) -> dict[str, Any]:
50
50
  batteryLevel: float (percent)
51
51
  batteryCapacity: float (kWh)
52
52
  range: float (km, if present)
53
- batteryTempMin, batteryTempMid, batteryTempMax: float (°C, if present)
53
+ batteryTempMin, batteryTempMid, batteryTempMax: float (°C)
54
54
  _bmsStateRaw: int — 4 idle, 5 discharging, 6 charging, others unnamed
55
55
  """
56
56
  result: dict[str, Any] = {}
57
57
  if m.HasField("charge_state"):
58
58
  charge_state = m.charge_state
59
- if (v := _present(charge_state, "soc")) is not None:
60
- result["batteryLevel"] = round(v, 2)
61
- if (v := _present(charge_state, "pack_energy")) is not None:
62
- result["batteryCapacity"] = round(v, 2)
59
+ result["batteryLevel"] = round(charge_state.soc, 2)
60
+ result["batteryCapacity"] = round(charge_state.pack_energy, 2)
63
61
  if (v := _present(charge_state, "range")) is not None:
64
62
  result["range"] = round(v, 1)
65
63
  if m.HasField("temperatures"):
66
64
  temps = m.temperatures
67
- if (v := _present(temps, "min")) is not None:
68
- result["batteryTempMin"] = round(v, 1)
69
- if (v := _present(temps, "mid")) is not None:
70
- result["batteryTempMid"] = round(v, 1)
71
- if (v := _present(temps, "max")) is not None:
72
- result["batteryTempMax"] = round(v, 1)
65
+ result["batteryTempMin"] = round(temps.min, 1)
66
+ result["batteryTempMid"] = round(temps.mid, 1)
67
+ result["batteryTempMax"] = round(temps.max, 1)
73
68
  if (v := _present(m, "bms_state_raw")) is not None:
74
69
  result["_bmsStateRaw"] = v
75
70
  return result
@@ -70,14 +70,12 @@ def decode_parked_energy_distributions(
70
70
  if not m.HasField(field):
71
71
  continue
72
72
  distribution = getattr(m, field)
73
- window: dict[str, float] = {}
74
- for measure, measure_key in _ENERGY_DISTRIBUTION_MAP.items():
75
- if (v := _present(distribution, measure)) is not None:
76
- window[measure_key] = round(v, 4)
77
- if (v := _present(distribution, "duration")) is not None:
78
- window["duration"] = v
79
- if window:
80
- result[key] = window
73
+ window: dict[str, float] = {
74
+ measure_key: round(getattr(distribution, measure), 4)
75
+ for measure, measure_key in _ENERGY_DISTRIBUTION_MAP.items()
76
+ }
77
+ window["duration"] = distribution.duration
78
+ result[key] = window
81
79
  return result
82
80
 
83
81
 
@@ -45,9 +45,7 @@ def decode_car_costume_state(
45
45
  Fields:
46
46
  costumeId: int (0 = none; other ids unmapped)
47
47
  """
48
- if (v := _present(m, "costume_id")) is None:
49
- return {}
50
- return {"costumeId": v}
48
+ return {"costumeId": m.costume_id}
51
49
 
52
50
 
53
51
  # Wrapped HalloweenCelebrationSettings field -> result key.
@@ -74,7 +72,7 @@ def decode_halloween_celebration_settings(
74
72
  ) -> dict[str, Any]:
75
73
  """holiday_celebration.mobile_vehicle_settings.halloween_celebration_settings.
76
74
 
77
- Names come from the app; most fields have only been sent empty.
75
+ Names come from the app.
78
76
 
79
77
  Fields (each only when set):
80
78
  halloweenCostumeTheme: str
@@ -60,8 +60,7 @@ def _decode_origin(origin: TripInfo.Origin) -> dict[str, Any]:
60
60
  result = _decode_geocoordinate(
61
61
  _present(origin, "location"), "originLatitude", "originLongitude"
62
62
  )
63
- if (v := _present(origin, "heading")) is not None:
64
- result["originHeading"] = v
63
+ result["originHeading"] = origin.heading
65
64
  if (origin_epoch := _present(origin, "time")) is not None:
66
65
  result["originTime"] = from_epoch(origin_epoch)
67
66
  return result
@@ -93,11 +92,11 @@ def _decode_place(place: TripInfo.Place) -> dict[str, Any]:
93
92
  ("place_type", "placeType"),
94
93
  ("name", "name"),
95
94
  ("place_id", "placeId"),
96
- ("soc", "stateOfCharge"),
97
- ("range", "rangeRemaining"),
98
95
  ),
99
96
  )
100
97
  )
98
+ entry["stateOfCharge"] = place.soc
99
+ entry["rangeRemaining"] = place.range
101
100
  if (arrival := _decode_timestamp(_present(place, "arrival"))) is not None:
102
101
  entry["arrivalTime"] = arrival
103
102
  return entry
@@ -170,17 +169,12 @@ def _decode_categorized_ranges(leg: TripInfo.Leg) -> list[dict[str, Any]]:
170
169
 
171
170
  def _decode_leg(leg: TripInfo.Leg) -> dict[str, Any]:
172
171
  """Decode one route leg."""
173
- entry = _copy_present(
174
- leg,
175
- (
176
- ("distance", "distance"),
177
- ("duration", "duration"),
178
- ("road_label", "roadLabel"),
179
- ("polyline", "polyline"),
180
- ),
172
+ entry: dict[str, Any] = {"distance": leg.distance, "duration": leg.duration}
173
+ entry.update(
174
+ _copy_present(leg, (("road_label", "roadLabel"), ("polyline", "polyline")))
181
175
  )
182
- if leg.HasField("energy") and (v := _present(leg.energy, "kwh")) is not None:
183
- entry["energyUsed"] = v
176
+ if leg.HasField("energy"):
177
+ entry["energyUsed"] = leg.energy.kwh
184
178
  # flagged/unflagged_ranges_packed duplicate the index ranges.
185
179
  if index_ranges := _decode_index_ranges(leg):
186
180
  entry["indexRangeSegments"] = index_ranges
@@ -307,29 +301,15 @@ def decode_trip_progress(m: navigation_pb2.TripProgress) -> dict[str, Any]:
307
301
  result["nextWaypointArrivalTime"] = eta
308
302
  if (eta := _decode_timestamp(_present(m, "final_destination"))) is not None:
309
303
  result["finalDestinationArrivalTime"] = eta
310
- result.update(
311
- _copy_present(
312
- m,
313
- (
314
- ("distance_remaining", "distanceRemaining"),
315
- ("duration_remaining", "durationRemaining"),
316
- ),
317
- )
318
- )
304
+ result["distanceRemaining"] = m.distance_remaining
305
+ result["durationRemaining"] = m.duration_remaining
319
306
  if m.HasField("location_fix"):
320
307
  fix = m.location_fix
321
308
  result.update(
322
309
  _decode_geocoordinate(_present(fix, "location"), "latitude", "longitude")
323
310
  )
324
- result.update(
325
- _copy_present(
326
- fix,
327
- (
328
- ("speed", "speed"),
329
- ("heading", "heading"),
330
- ),
331
- )
332
- )
311
+ result["speed"] = fix.speed
312
+ result["heading"] = fix.heading
333
313
  if (fix_epoch := _present(fix, "time")) is not None:
334
314
  result["locationTime"] = from_epoch(fix_epoch)
335
315
  return result
@@ -110,13 +110,10 @@ def decode_deployment_state(m: ota_pb2.DeploymentState) -> dict[str, Any]:
110
110
  and (v := _present(progress.install_progress, "field_2")) is not None
111
111
  ):
112
112
  result["otaInstallProgress"] = v
113
- for field, key in (
114
- ("time_remaining", "otaTimeRemaining"),
115
- ("update_cycle_count", "otaUpdateCycleCount"),
116
- ("field_9", "_otaProgressField9"),
117
- ):
118
- if (v := _present(progress, field)) is not None:
119
- result[key] = v
113
+ result["otaTimeRemaining"] = progress.time_remaining
114
+ result["otaUpdateCycleCount"] = progress.update_cycle_count
115
+ if (v := _present(progress, "field_9")) is not None:
116
+ result["_otaProgressField9"] = v
120
117
  return result
121
118
 
122
119
 
@@ -100,7 +100,7 @@ enum LockFault {
100
100
  // body.trailer.state
101
101
  message TrailerState {
102
102
  optional TrailerPresence presence = 1;
103
- int32 field_2 = 2; // unknown; constant
103
+ int32 field_2 = 2; // unknown
104
104
  }
105
105
 
106
106
  enum ClosureFault {
@@ -218,5 +218,5 @@ enum WindowsNextAction {
218
218
 
219
219
  // body.wipers.fluid_level
220
220
  message WiperFluidLevel {
221
- optional int32 field_2 = 2; // unknown; 1 so far
221
+ optional int32 field_2 = 2; // unknown
222
222
  }
@@ -123,12 +123,13 @@ message TimeEstimation {
123
123
  }
124
124
 
125
125
  // charging.energy.state
126
+ // The states match charging.session.status, give or take a message.
126
127
  message EnergyState {
127
- optional int32 field_1 = 1; // inferred: ChargingState (1 ready ... 4 complete)
128
+ ChargingState charging_state = 1;
128
129
  optional ChargerStatus charger_status = 2; // inferred
129
- optional int32 field_3 = 3; // unknown; 1 so far
130
- string field_10 = 10; // always empty so far
131
- optional int32 field_11 = 11; // unknown; 1 or 2
130
+ optional int32 field_3 = 3; // unknown
131
+ string field_10 = 10; // unknown
132
+ ConnectionState connection_state = 11;
132
133
  }
133
134
 
134
135
  enum ChargerStatus {
@@ -140,5 +141,5 @@ enum ChargerStatus {
140
141
 
141
142
  // charging.session.power -- live charging power; empty when not charging.
142
143
  message SessionPower {
143
- optional float power = 1; // kW
144
+ float power = 1; // kW
144
145
  }
@@ -24,21 +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\"\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')
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\"\xa0\x02\n\x0b\x45nergyState\x12?\n\x0e\x63harging_state\x18\x01 \x01(\x0e\x32\'.rivian.parallax.charging.ChargingState\x12\x44\n\x0e\x63harger_status\x18\x02 \x01(\x0e\x32\'.rivian.parallax.charging.ChargerStatusH\x00\x88\x01\x01\x12\x14\n\x07\x66ield_3\x18\x03 \x01(\x05H\x01\x88\x01\x01\x12\x10\n\x08\x66ield_10\x18\n \x01(\t\x12\x43\n\x10\x63onnection_state\x18\x0b \x01(\x0e\x32).rivian.parallax.charging.ConnectionStateB\x11\n\x0f_charger_statusB\n\n\x08_field_3\"\x1d\n\x0cSessionPower\x12\r\n\x05power\x18\x01 \x01(\x02*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=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
34
+ _globals['_REMOTECOMMAND']._serialized_start=1605
35
+ _globals['_REMOTECOMMAND']._serialized_end=1703
36
+ _globals['_CONNECTIONSTATE']._serialized_start=1705
37
+ _globals['_CONNECTIONSTATE']._serialized_end=1823
38
+ _globals['_CHARGINGSTATE']._serialized_start=1826
39
+ _globals['_CHARGINGSTATE']._serialized_end=2590
40
+ _globals['_CHARGERSTATUS']._serialized_start=2593
41
+ _globals['_CHARGERSTATUS']._serialized_end=2753
42
42
  _globals['_SCHEDULETIMEWINDOW']._serialized_start=67
43
43
  _globals['_SCHEDULETIMEWINDOW']._serialized_end=683
44
44
  _globals['_SCHEDULETIMEWINDOW_WINDOW']._serialized_start=176
@@ -66,7 +66,7 @@ if not _descriptor._USE_C_DESCRIPTORS:
66
66
  _globals['_TIMEESTIMATION']._serialized_start=1231
67
67
  _globals['_TIMEESTIMATION']._serialized_end=1281
68
68
  _globals['_ENERGYSTATE']._serialized_start=1284
69
- _globals['_ENERGYSTATE']._serialized_end=1508
70
- _globals['_SESSIONPOWER']._serialized_start=1510
71
- _globals['_SESSIONPOWER']._serialized_end=1554
69
+ _globals['_ENERGYSTATE']._serialized_end=1572
70
+ _globals['_SESSIONPOWER']._serialized_start=1574
71
+ _globals['_SESSIONPOWER']._serialized_end=1603
72
72
  # @@protoc_insertion_point(module_scope)
@@ -189,18 +189,18 @@ class TimeEstimation(_message.Message):
189
189
  def __init__(self, estimated_time_remaining: _Optional[int] = ...) -> None: ...
190
190
 
191
191
  class EnergyState(_message.Message):
192
- __slots__ = ("field_1", "charger_status", "field_3", "field_10", "field_11")
193
- FIELD_1_FIELD_NUMBER: _ClassVar[int]
192
+ __slots__ = ("charging_state", "charger_status", "field_3", "field_10", "connection_state")
193
+ CHARGING_STATE_FIELD_NUMBER: _ClassVar[int]
194
194
  CHARGER_STATUS_FIELD_NUMBER: _ClassVar[int]
195
195
  FIELD_3_FIELD_NUMBER: _ClassVar[int]
196
196
  FIELD_10_FIELD_NUMBER: _ClassVar[int]
197
- FIELD_11_FIELD_NUMBER: _ClassVar[int]
198
- field_1: int
197
+ CONNECTION_STATE_FIELD_NUMBER: _ClassVar[int]
198
+ charging_state: ChargingState
199
199
  charger_status: ChargerStatus
200
200
  field_3: int
201
201
  field_10: str
202
- field_11: int
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: ...
202
+ connection_state: ConnectionState
203
+ def __init__(self, charging_state: _Optional[_Union[ChargingState, str]] = ..., charger_status: _Optional[_Union[ChargerStatus, str]] = ..., field_3: _Optional[int] = ..., field_10: _Optional[str] = ..., connection_state: _Optional[_Union[ConnectionState, str]] = ...) -> None: ...
204
204
 
205
205
  class SessionPower(_message.Message):
206
206
  __slots__ = ("power",)