rivian-python-client 2.2.0b7__tar.gz → 2.2.0b9__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.
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/PKG-INFO +1 -1
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/__version__.py +1 -1
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/body.py +60 -9
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/charging.py +166 -27
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/comfort.py +81 -38
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/device_table.py +2 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/dynamics.py +16 -5
- rivian_python_client-2.2.0b9/src/rivian/parallax/energy.py +148 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/energy_edge_compute.py +10 -6
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/gearguard_streaming.py +3 -5
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/geofence.py +2 -3
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/holiday_celebration.py +59 -9
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/navigation.py +109 -47
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/ota.py +79 -25
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/body.proto +46 -6
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/body_pb2.py +84 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/body_pb2.pyi +75 -12
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/charging.proto +102 -41
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/charging_pb2.py +86 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/charging_pb2.pyi +174 -69
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/comfort.proto +47 -16
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/comfort_pb2.py +84 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/comfort_pb2.pyi +85 -34
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/device_table.proto +1 -0
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/device_table_pb2.py +50 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/device_table_pb2.pyi +4 -2
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/dynamics.proto +12 -6
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/dynamics_pb2.py +74 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/dynamics_pb2.pyi +20 -11
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/energy.proto +97 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/energy_edge_compute.proto +19 -3
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/energy_edge_compute_pb2.py +53 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/energy_edge_compute_pb2.pyi +39 -12
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/energy_pb2.py +58 -0
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/energy_pb2.pyi +148 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/gearguard_streaming.proto +6 -8
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/gearguard_streaming_pb2.py +5 -5
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/gearguard_streaming_pb2.pyi +6 -10
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/geofence.proto +2 -3
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/geofence_pb2.py +5 -5
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/geofence_pb2.pyi +2 -4
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/holiday_celebration.proto +27 -16
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/holiday_celebration_pb2.py +54 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/holiday_celebration_pb2.pyi +49 -28
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/navigation.proto +201 -0
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/navigation_pb2.py +76 -0
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/navigation_pb2.pyi +312 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/ota.proto +67 -15
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/ota_pb2.py +78 -0
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/ota_pb2.pyi +253 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/security.proto +15 -4
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/security_pb2.py +68 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/security_pb2.pyi +28 -9
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/vehicle.proto +51 -9
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/vehicle_access.proto +13 -6
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/vehicle_access_pb2.py +42 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/vehicle_access_pb2.pyi +15 -6
- rivian_python_client-2.2.0b9/src/rivian/parallax/proto/vehicle_pb2.py +72 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/vehicle_pb2.pyi +81 -11
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/security.py +17 -4
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/vehicle.py +38 -5
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/vehicle_access.py +23 -5
- rivian_python_client-2.2.0b7/src/rivian/parallax/energy.py +0 -88
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/body_pb2.py +0 -74
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/charging_pb2.py +0 -74
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/comfort_pb2.py +0 -78
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/device_table_pb2.py +0 -50
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/dynamics_pb2.py +0 -72
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/energy.proto +0 -58
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/energy_edge_compute_pb2.py +0 -49
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/energy_pb2.py +0 -48
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/energy_pb2.pyi +0 -83
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/holiday_celebration_pb2.py +0 -50
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/navigation.proto +0 -186
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/navigation_pb2.py +0 -78
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/navigation_pb2.pyi +0 -251
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/ota_pb2.py +0 -66
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/ota_pb2.pyi +0 -168
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/security_pb2.py +0 -66
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/vehicle_access_pb2.py +0 -40
- rivian_python_client-2.2.0b7/src/rivian/parallax/proto/vehicle_pb2.py +0 -64
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/.gitignore +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/README.md +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/pyproject.toml +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/__init__.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/ble.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/const.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/exceptions.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/__init__.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/core.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/departure.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/parallax.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/__init__.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/departure.proto +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/departure_pb2.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/departure_pb2.pyi +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/parallax.proto +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/parallax_pb2.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/parallax_pb2.pyi +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/secure_file_transfer.proto +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/secure_file_transfer_pb2.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/secure_file_transfer_pb2.pyi +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/user_passcodes.proto +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/user_passcodes_pb2.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/proto/user_passcodes_pb2.pyi +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/secure_file_transfer.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/user_passcodes.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/py.typed +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/rivian.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/schemas/charging.graphql +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/schemas/gateway.graphql +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/schemas/orders.graphql +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/utils.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/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.
|
|
3
|
+
Version: 2.2.0b9
|
|
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
|
|
@@ -108,6 +108,28 @@ _LOCK_STATE_MAP: Final[dict[int, str]] = {
|
|
|
108
108
|
body_pb2.LOCK_STATE_PARTIALLY_UNLOCKED: "partially_unlocked",
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
_REAR_HITCH_STATUS_MAP: Final[dict[int, str]] = {
|
|
112
|
+
body_pb2.REAR_HITCH_STATUS_NOT_PRESENT: "not_present",
|
|
113
|
+
body_pb2.REAR_HITCH_STATUS_ACCESSORY: "accessory",
|
|
114
|
+
body_pb2.REAR_HITCH_STATUS_TRAILER1: "trailer1",
|
|
115
|
+
body_pb2.REAR_HITCH_STATUS_TRAILER2: "trailer2",
|
|
116
|
+
body_pb2.REAR_HITCH_STATUS_TRAILER3: "trailer3",
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
_WINDOW_MAP: Final[dict[int, str]] = {
|
|
120
|
+
body_pb2.WINDOW_INSTANCE_FRONT_LEFT: "windowFrontLeftCalibrated",
|
|
121
|
+
body_pb2.WINDOW_INSTANCE_FRONT_RIGHT: "windowFrontRightCalibrated",
|
|
122
|
+
body_pb2.WINDOW_INSTANCE_REAR_LEFT: "windowRearLeftCalibrated",
|
|
123
|
+
body_pb2.WINDOW_INSTANCE_REAR_RIGHT: "windowRearRightCalibrated",
|
|
124
|
+
body_pb2.WINDOW_INSTANCE_REAR: "windowRearCalibrated",
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
# GraphQL's windowXCalibrated values.
|
|
128
|
+
_CALIBRATION_MAP: Final[dict[int, str]] = {
|
|
129
|
+
body_pb2.CALIBRATION_STATUS_CALIBRATED: "Calibrated",
|
|
130
|
+
body_pb2.CALIBRATION_STATUS_NOT_CALIBRATED: "Not_Calibrated",
|
|
131
|
+
}
|
|
132
|
+
|
|
111
133
|
_TRAILER_PRESENCE_MAP: Final[dict[int, str]] = {
|
|
112
134
|
body_pb2.TRAILER_NOT_PRESENT: "trailer_not_present",
|
|
113
135
|
body_pb2.TRAILER_PRESENT: "trailer_present",
|
|
@@ -176,19 +198,37 @@ def decode_locks(m: body_pb2.LocksState) -> dict[str, Any]:
|
|
|
176
198
|
|
|
177
199
|
|
|
178
200
|
@RVMDecoder.register("body.windows.states", body_pb2.WindowsState)
|
|
179
|
-
def decode_windows(
|
|
180
|
-
"""body.windows.states —
|
|
181
|
-
|
|
201
|
+
def decode_windows(m: body_pb2.WindowsState) -> dict[str, Any]:
|
|
202
|
+
"""body.windows.states — window calibration.
|
|
203
|
+
|
|
204
|
+
Fields:
|
|
205
|
+
windowFrontLeftCalibrated, windowFrontRightCalibrated,
|
|
206
|
+
windowRearLeftCalibrated, windowRearRightCalibrated,
|
|
207
|
+
windowRearCalibrated: str ("Calibrated" | "Not_Calibrated")
|
|
208
|
+
"""
|
|
209
|
+
return {
|
|
210
|
+
_WINDOW_MAP[w.instance]: _enum(
|
|
211
|
+
_CALIBRATION_MAP, w.calibration_status or None, what="window calibration"
|
|
212
|
+
)
|
|
213
|
+
for w in m.window
|
|
214
|
+
if w.instance in _WINDOW_MAP
|
|
215
|
+
}
|
|
182
216
|
|
|
183
217
|
|
|
184
218
|
@RVMDecoder.register("body.trailer.state", body_pb2.TrailerState)
|
|
185
219
|
def decode_trailer_state(m: body_pb2.TrailerState) -> dict[str, Any]:
|
|
186
|
-
"""body.trailer.state — trailer presence
|
|
220
|
+
"""body.trailer.state — trailer presence and rear hitch status.
|
|
187
221
|
|
|
188
222
|
Fields:
|
|
189
223
|
trailerStatus: str
|
|
224
|
+
rearHitchStatus: str | None ("not_present" | "accessory" |
|
|
225
|
+
"trailer1" | "trailer2" | "trailer3")
|
|
190
226
|
"""
|
|
191
|
-
result: dict[str, Any] = {
|
|
227
|
+
result: dict[str, Any] = {
|
|
228
|
+
"rearHitchStatus": _enum(
|
|
229
|
+
_REAR_HITCH_STATUS_MAP, m.rear_hitch_status or None, what="rear hitch"
|
|
230
|
+
)
|
|
231
|
+
}
|
|
192
232
|
presence = _enum(
|
|
193
233
|
_TRAILER_PRESENCE_MAP, _present(m, "presence"), what="trailer presence"
|
|
194
234
|
)
|
|
@@ -201,9 +241,20 @@ def decode_trailer_state(m: body_pb2.TrailerState) -> dict[str, Any]:
|
|
|
201
241
|
def decode_wiper_fluid_level(m: body_pb2.WiperFluidLevel) -> dict[str, Any]:
|
|
202
242
|
"""body.wipers.fluid_level — washer fluid level.
|
|
203
243
|
|
|
244
|
+
The value numbering is a best guess.
|
|
245
|
+
|
|
204
246
|
Fields:
|
|
205
|
-
|
|
247
|
+
wiperFluidState: str | None ("normal" | "low" | "empty")
|
|
206
248
|
"""
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
249
|
+
return {
|
|
250
|
+
"wiperFluidState": _enum(
|
|
251
|
+
_WIPER_FLUID_STATE_MAP, m.state or None, what="wiper fluid state"
|
|
252
|
+
)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
_WIPER_FLUID_STATE_MAP: Final[dict[int, str]] = {
|
|
257
|
+
body_pb2.WIPER_FLUID_STATE_NORMAL: "normal",
|
|
258
|
+
body_pb2.WIPER_FLUID_STATE_LOW: "low",
|
|
259
|
+
body_pb2.WIPER_FLUID_STATE_EMPTY: "empty",
|
|
260
|
+
}
|
{rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/charging.py
RENAMED
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import Any, Final
|
|
6
6
|
|
|
7
|
+
from ..utils import from_epoch
|
|
7
8
|
from .core import RVMDecoder, _enum, _present
|
|
8
9
|
from .proto import charging_pb2
|
|
9
10
|
|
|
@@ -58,15 +59,75 @@ def decode_schedule_time_window(m: charging_pb2.ScheduleTimeWindow) -> dict[str,
|
|
|
58
59
|
return result
|
|
59
60
|
|
|
60
61
|
|
|
62
|
+
_DERATE_STATUS_MAP: Final[dict[int, str]] = {
|
|
63
|
+
charging_pb2.DERATE_STATUS_NONE: "none",
|
|
64
|
+
charging_pb2.DERATE_STATUS_WARM_ADAPTER: "warm_adapter",
|
|
65
|
+
charging_pb2.DERATE_STATUS_DC_WARM_PLUG: "dc_warm_plug",
|
|
66
|
+
charging_pb2.DERATE_STATUS_AC_WARM_PLUG: "ac_warm_plug",
|
|
67
|
+
charging_pb2.DERATE_STATUS_EVSE_DERATING: "evse_derating",
|
|
68
|
+
charging_pb2.DERATE_STATUS_NEARING_TOC: "nearing_toc",
|
|
69
|
+
charging_pb2.DERATE_STATUS_NEAR_TOC_LFP_BATT_CALIBRATING: "near_toc_lfp_batt_calibrating",
|
|
70
|
+
charging_pb2.DERATE_STATUS_HVAC_PRIORITIZED: "hvac_prioritized",
|
|
71
|
+
charging_pb2.DERATE_STATUS_BATTERY_HEATING: "battery_heating",
|
|
72
|
+
charging_pb2.DERATE_STATUS_BATTERY_COOLING: "battery_cooling",
|
|
73
|
+
charging_pb2.DERATE_STATUS_CELL_THERMAL_LIM_COLD_NO_CURRENT: "cell_thermal_lim_cold_no_current",
|
|
74
|
+
charging_pb2.DERATE_STATUS_CELL_THERMAL_LIM_HOT_NO_CURRENT: "cell_thermal_lim_hot_no_current",
|
|
75
|
+
charging_pb2.DERATE_STATUS_CELL_THERMAL_LIM_COLD: "cell_thermal_lim_cold",
|
|
76
|
+
charging_pb2.DERATE_STATUS_CELL_THERMAL_LIM_HOT: "cell_thermal_lim_hot",
|
|
77
|
+
charging_pb2.DERATE_STATUS_PACK_HARDWARE_THERMAL_LIM: "pack_hardware_thermal_lim",
|
|
78
|
+
charging_pb2.DERATE_STATUS_HIGH_SOC_SIGMA: "high_soc_sigma",
|
|
79
|
+
charging_pb2.DERATE_STATUS_HV_BATTERY_FAULT: "hv_battery_fault",
|
|
80
|
+
charging_pb2.DERATE_STATUS_DCAC_EXPORT: "dcac_export",
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
_FAULT_CHIME_MAP: Final[dict[int, str]] = {
|
|
84
|
+
charging_pb2.FAULT_CHIME_NONE: "none",
|
|
85
|
+
charging_pb2.FAULT_CHIME_CHARGING_DISABLED_ALL: "charging_disabled_all",
|
|
86
|
+
charging_pb2.FAULT_CHIME_CHARGING_DISABLED_DC: "charging_disabled_dc",
|
|
87
|
+
charging_pb2.FAULT_CHIME_CHARGING_DISABLED_PIN_TEMP_DC: "charging_disabled_pin_temp_dc",
|
|
88
|
+
charging_pb2.FAULT_CHIME_CHARGING_DISABLED_PIN_TEMP_GRADIENT_DC: "charging_disabled_pin_temp_gradient_dc",
|
|
89
|
+
charging_pb2.FAULT_CHIME_CHARGING_DEGRADED_DC: "charging_degraded_dc",
|
|
90
|
+
charging_pb2.FAULT_CHIME_CHARGING_DISABLED_AC: "charging_disabled_ac",
|
|
91
|
+
charging_pb2.FAULT_CHIME_CHARGING_DISABLED_PIN_TEMP_AC: "charging_disabled_pin_temp_ac",
|
|
92
|
+
charging_pb2.FAULT_CHIME_CHARGING_DEGRADED_AC: "charging_degraded_ac",
|
|
93
|
+
charging_pb2.FAULT_CHIME_CHARGING_DISABLED_PARTIAL_CONNECTION: "charging_disabled_partial_connection",
|
|
94
|
+
charging_pb2.FAULT_CHIME_CHARGING_DISABLED_NOT_PARKED: "charging_disabled_not_parked",
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
|
|
61
98
|
@RVMDecoder.register("charging.session.notification", charging_pb2.SessionNotification)
|
|
62
99
|
def decode_session_notification(m: charging_pb2.SessionNotification) -> dict[str, Any]:
|
|
63
|
-
"""charging.session.notification —
|
|
64
|
-
|
|
100
|
+
"""charging.session.notification — charging derate and fault notices.
|
|
101
|
+
|
|
102
|
+
Fields:
|
|
103
|
+
chargerDerateStatus: str ("none" | "warm_adapter" | "nearing_toc" |
|
|
104
|
+
"battery_heating" | ...)
|
|
105
|
+
chargingFaultChime: str ("none" | "charging_disabled_all" |
|
|
106
|
+
"charging_disabled_dc" | ...)
|
|
107
|
+
_unexpectedStopReason: int — raw
|
|
108
|
+
"""
|
|
109
|
+
return {
|
|
110
|
+
"chargerDerateStatus": _enum(
|
|
111
|
+
_DERATE_STATUS_MAP, m.derate_status, what="charger derate status"
|
|
112
|
+
),
|
|
113
|
+
"chargingFaultChime": _enum(
|
|
114
|
+
_FAULT_CHIME_MAP, m.fault_chime, what="charging fault chime"
|
|
115
|
+
),
|
|
116
|
+
"_unexpectedStopReason": m.unexpected_stop_reason,
|
|
117
|
+
}
|
|
65
118
|
|
|
66
119
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
charging_pb2.
|
|
120
|
+
# The same "true"/"false"/"signal_not_available" vocabulary as the alarm.
|
|
121
|
+
_START_AVAILABILITY_MAP: Final[dict[int, str]] = {
|
|
122
|
+
charging_pb2.START_AVAILABILITY_SNA: "signal_not_available",
|
|
123
|
+
charging_pb2.START_AVAILABILITY_FALSE: "false",
|
|
124
|
+
charging_pb2.START_AVAILABILITY_TRUE: "true",
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
_TIME_ESTIMATION_VALIDITY_MAP: Final[dict[int, str]] = {
|
|
128
|
+
charging_pb2.TIME_ESTIMATION_VALIDITY_VALID: "valid",
|
|
129
|
+
charging_pb2.TIME_ESTIMATION_VALIDITY_INVALID: "invalid",
|
|
130
|
+
charging_pb2.TIME_ESTIMATION_VALIDITY_PACK_DISCHARGING: "pack_discharging",
|
|
70
131
|
}
|
|
71
132
|
|
|
72
133
|
|
|
@@ -76,19 +137,16 @@ _REMOTE_COMMAND_MAP: Final[dict[int, str]] = {
|
|
|
76
137
|
def decode_session_remote_command(
|
|
77
138
|
m: charging_pb2.SessionRemoteCommand,
|
|
78
139
|
) -> dict[str, Any]:
|
|
79
|
-
"""charging.session.remote_command —
|
|
140
|
+
"""charging.session.remote_command — whether a remote start is available.
|
|
80
141
|
|
|
81
142
|
Fields:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
charging around a schedule or limit change.
|
|
143
|
+
remoteChargingAvailable: str ("true" | "false" |
|
|
144
|
+
"signal_not_available"); true while charging is held (e.g. by a
|
|
145
|
+
schedule), so "charge now" can start it
|
|
86
146
|
"""
|
|
87
|
-
if not m.HasField("command"):
|
|
88
|
-
return {}
|
|
89
147
|
return {
|
|
90
|
-
"
|
|
91
|
-
|
|
148
|
+
"remoteChargingAvailable": _enum(
|
|
149
|
+
_START_AVAILABILITY_MAP, m.start_available, what="remote charging"
|
|
92
150
|
)
|
|
93
151
|
}
|
|
94
152
|
|
|
@@ -107,29 +165,74 @@ def decode_soc_slider(m: charging_pb2.SocSlider) -> dict[str, Any]:
|
|
|
107
165
|
|
|
108
166
|
@RVMDecoder.register("charging.session.trip_target", charging_pb2.TripTarget)
|
|
109
167
|
def decode_trip_target(m: charging_pb2.TripTarget) -> dict[str, Any]:
|
|
110
|
-
"""charging.session.trip_target —
|
|
168
|
+
"""charging.session.trip_target — the trip's target state of charge.
|
|
111
169
|
|
|
112
|
-
|
|
170
|
+
Fields:
|
|
171
|
+
chargingTripTargetSoc: int | None (percent; None when not set)
|
|
113
172
|
"""
|
|
114
|
-
|
|
173
|
+
soc = m.soc_limit
|
|
174
|
+
return {"chargingTripTargetSoc": None if soc in (0, 0xFFFF) else soc}
|
|
115
175
|
|
|
116
176
|
|
|
117
177
|
@RVMDecoder.register(
|
|
118
178
|
"charging.smart_charging.settings", charging_pb2.SmartChargingSettings
|
|
119
179
|
)
|
|
120
180
|
def decode_smart_charging_settings(
|
|
121
|
-
|
|
181
|
+
m: charging_pb2.SmartChargingSettings,
|
|
122
182
|
) -> dict[str, Any]:
|
|
123
|
-
"""charging.smart_charging.settings —
|
|
124
|
-
|
|
183
|
+
"""charging.smart_charging.settings — smart charging schedule.
|
|
184
|
+
|
|
185
|
+
Not seen yet; the schema comes from the app.
|
|
186
|
+
|
|
187
|
+
Fields:
|
|
188
|
+
smartChargingCleanEnergyEnabled: bool
|
|
189
|
+
smartChargingReadyByTimes: list of {"hours": int, "minutes": int,
|
|
190
|
+
"days": list[str]} ("monday" … "sunday")
|
|
191
|
+
"""
|
|
192
|
+
return {
|
|
193
|
+
"smartChargingCleanEnergyEnabled": m.clean_energy_enabled,
|
|
194
|
+
"smartChargingReadyByTimes": [
|
|
195
|
+
{
|
|
196
|
+
"hours": t.hours,
|
|
197
|
+
"minutes": t.minutes,
|
|
198
|
+
"days": [
|
|
199
|
+
_enum(_SMART_CHARGING_DAY_MAP, d, what="smart charging day")
|
|
200
|
+
for d in t.days
|
|
201
|
+
],
|
|
202
|
+
}
|
|
203
|
+
for t in m.ready_by_times
|
|
204
|
+
],
|
|
205
|
+
}
|
|
125
206
|
|
|
126
207
|
|
|
127
208
|
@RVMDecoder.register(
|
|
128
209
|
"charging.smart_charging.smart_charging_info", charging_pb2.SmartChargingInfo
|
|
129
210
|
)
|
|
130
|
-
def decode_smart_charging_info(
|
|
131
|
-
"""charging.smart_charging.smart_charging_info —
|
|
132
|
-
|
|
211
|
+
def decode_smart_charging_info(m: charging_pb2.SmartChargingInfo) -> dict[str, Any]:
|
|
212
|
+
"""charging.smart_charging.smart_charging_info — smart charging status.
|
|
213
|
+
|
|
214
|
+
Not seen yet; the schema comes from the app.
|
|
215
|
+
|
|
216
|
+
Fields:
|
|
217
|
+
smartChargingNotification: str ("signal_not_available" |
|
|
218
|
+
"charging_with_clean_energy" | "charging_paused" |
|
|
219
|
+
"clean_energy_not_enough_time" |
|
|
220
|
+
"clean_energy_forecast_unavailable_or_incomplete")
|
|
221
|
+
smartChargingResumeTime: datetime, only when sent
|
|
222
|
+
_smartChargingScheduleType: int (raw; unmapped)
|
|
223
|
+
"""
|
|
224
|
+
result: dict[str, Any] = {
|
|
225
|
+
"smartChargingNotification": _enum(
|
|
226
|
+
_SMART_CHARGING_NOTIFICATION_MAP,
|
|
227
|
+
m.notification,
|
|
228
|
+
what="smart charging notification",
|
|
229
|
+
),
|
|
230
|
+
"_smartChargingScheduleType": m.schedule_type,
|
|
231
|
+
}
|
|
232
|
+
if m.HasField("resume_time"):
|
|
233
|
+
t = m.resume_time
|
|
234
|
+
result["smartChargingResumeTime"] = from_epoch(t.seconds + t.nanos / 1e9)
|
|
235
|
+
return result
|
|
133
236
|
|
|
134
237
|
|
|
135
238
|
@RVMDecoder.register(
|
|
@@ -143,9 +246,35 @@ def decode_weighted_charging_forecast(
|
|
|
143
246
|
return {}
|
|
144
247
|
|
|
145
248
|
|
|
249
|
+
_SMART_CHARGING_DAY_MAP: Final[dict[int, str]] = {
|
|
250
|
+
charging_pb2.SMART_CHARGING_DAY_MONDAY: "monday",
|
|
251
|
+
charging_pb2.SMART_CHARGING_DAY_TUESDAY: "tuesday",
|
|
252
|
+
charging_pb2.SMART_CHARGING_DAY_WEDNESDAY: "wednesday",
|
|
253
|
+
charging_pb2.SMART_CHARGING_DAY_THURSDAY: "thursday",
|
|
254
|
+
charging_pb2.SMART_CHARGING_DAY_FRIDAY: "friday",
|
|
255
|
+
charging_pb2.SMART_CHARGING_DAY_SATURDAY: "saturday",
|
|
256
|
+
charging_pb2.SMART_CHARGING_DAY_SUNDAY: "sunday",
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
_SMART_CHARGING_NOTIFICATION_MAP: Final[dict[int, str]] = {
|
|
260
|
+
charging_pb2.SMART_CHARGING_NOTIFICATION_SNA: "signal_not_available",
|
|
261
|
+
charging_pb2.SMART_CHARGING_NOTIFICATION_CHARGING_WITH_CLEAN_ENERGY: (
|
|
262
|
+
"charging_with_clean_energy"
|
|
263
|
+
),
|
|
264
|
+
charging_pb2.SMART_CHARGING_NOTIFICATION_CHARGING_PAUSED: "charging_paused",
|
|
265
|
+
charging_pb2.SMART_CHARGING_NOTIFICATION_CLEAN_ENERGY_NOT_ENOUGH_TIME: (
|
|
266
|
+
"clean_energy_not_enough_time"
|
|
267
|
+
),
|
|
268
|
+
charging_pb2.SMART_CHARGING_NOTIFICATION_CLEAN_ENERGY_FORECAST_UNAVAILABLE_OR_INCOMPLETE: (
|
|
269
|
+
"clean_energy_forecast_unavailable_or_incomplete"
|
|
270
|
+
),
|
|
271
|
+
}
|
|
272
|
+
|
|
146
273
|
_CONNECTION_STATE_MAP: Final[dict[int, str]] = {
|
|
147
274
|
charging_pb2.CONNECTION_STATE_DISCONNECTED: "disconnected",
|
|
148
275
|
charging_pb2.CONNECTION_STATE_CONNECTED: "connected",
|
|
276
|
+
charging_pb2.CONNECTION_STATE_ERROR: "error",
|
|
277
|
+
charging_pb2.CONNECTION_STATE_V2L_CONNECTED: "v2l_connected",
|
|
149
278
|
}
|
|
150
279
|
|
|
151
280
|
_CHARGING_STATE_MAP: Final[dict[int, str]] = {
|
|
@@ -182,12 +311,13 @@ def decode_charging_status(m: charging_pb2.SessionStatus) -> dict[str, Any]:
|
|
|
182
311
|
"""charging.session.status — plug and charging state.
|
|
183
312
|
|
|
184
313
|
Fields:
|
|
185
|
-
connectionState: str ("connected" | "disconnected"
|
|
314
|
+
connectionState: str ("connected" | "disconnected" | "error" |
|
|
315
|
+
"v2l_connected")
|
|
186
316
|
chargerState: str — GraphQL chargerState values, e.g.
|
|
187
317
|
"charging_ready" (no session, or unplugged),
|
|
188
318
|
"charging_connecting", "charging_active", "charging_complete",
|
|
189
319
|
"charging_scheduled", "charging_stopped_by_user"
|
|
190
|
-
|
|
320
|
+
_evseType: int — raw; 1 while connected to a charger
|
|
191
321
|
"""
|
|
192
322
|
result: dict[str, Any] = {}
|
|
193
323
|
if m.HasField("connection_state"):
|
|
@@ -198,7 +328,7 @@ def decode_charging_status(m: charging_pb2.SessionStatus) -> dict[str, Any]:
|
|
|
198
328
|
result["chargerState"] = _enum(
|
|
199
329
|
_CHARGING_STATE_MAP, m.charging_state, what="charging state"
|
|
200
330
|
)
|
|
201
|
-
result["
|
|
331
|
+
result["_evseType"] = m.evse_type
|
|
202
332
|
return result
|
|
203
333
|
|
|
204
334
|
|
|
@@ -208,8 +338,17 @@ def decode_time_estimation(m: charging_pb2.TimeEstimation) -> dict[str, Any]:
|
|
|
208
338
|
|
|
209
339
|
Fields:
|
|
210
340
|
timeToEndOfCharge: int (minutes; 0 when not charging)
|
|
341
|
+
chargingTimeEstimationValidity: str | None ("valid" | "invalid" |
|
|
342
|
+
"pack_discharging")
|
|
211
343
|
"""
|
|
212
|
-
return {
|
|
344
|
+
return {
|
|
345
|
+
"timeToEndOfCharge": m.estimated_time_remaining,
|
|
346
|
+
"chargingTimeEstimationValidity": _enum(
|
|
347
|
+
_TIME_ESTIMATION_VALIDITY_MAP,
|
|
348
|
+
m.validity or None,
|
|
349
|
+
what="time estimation validity",
|
|
350
|
+
),
|
|
351
|
+
}
|
|
213
352
|
|
|
214
353
|
|
|
215
354
|
_CHARGER_STATUS_MAP: Final[dict[int, str]] = {
|
{rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/comfort.py
RENAMED
|
@@ -25,15 +25,19 @@ def decode_user_modes_state(m: comfort_pb2.UserModesState) -> dict[str, Any]:
|
|
|
25
25
|
"""comfort.user_modes.state — user modes.
|
|
26
26
|
|
|
27
27
|
Fields:
|
|
28
|
-
carWashMode: str ("on" | "off")
|
|
29
|
-
|
|
28
|
+
serviceMode, carWashMode: str ("on" | "off")
|
|
29
|
+
_petMode, _campMode, _transportMode, _climateKeep, _factoryMode:
|
|
30
|
+
int — raw; enum types unknown
|
|
30
31
|
"""
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
return {
|
|
33
|
+
"serviceMode": "on" if m.in_service else "off",
|
|
34
|
+
"carWashMode": "on" if m.car_wash_mode else "off",
|
|
35
|
+
"_petMode": m.pet_mode,
|
|
36
|
+
"_campMode": m.camp_mode,
|
|
37
|
+
"_transportMode": m.transport_mode,
|
|
38
|
+
"_climateKeep": m.climate_keep,
|
|
39
|
+
"_factoryMode": m.factory_mode,
|
|
40
|
+
}
|
|
37
41
|
|
|
38
42
|
|
|
39
43
|
_CLIMATE_HOLD_AVAILABILITY_MAP: Final[dict[int, str]] = {
|
|
@@ -55,6 +59,43 @@ _CLIMATE_HOLD_UNAVAILABILITY_REASON_MAP: Final[dict[int, str]] = {
|
|
|
55
59
|
comfort_pb2.CLIMATE_HOLD_UNAVAILABILITY_UNSPECIFIED: "unspecified",
|
|
56
60
|
comfort_pb2.CLIMATE_HOLD_UNAVAILABILITY_UNKNOWN: "unknown",
|
|
57
61
|
comfort_pb2.CLIMATE_HOLD_UNAVAILABILITY_LOW_SOC: "low_soc",
|
|
62
|
+
comfort_pb2.CLIMATE_HOLD_UNAVAILABILITY_FAULT: "fault",
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
_DEFROST_MAP: Final[dict[int, str]] = {
|
|
66
|
+
comfort_pb2.DEFROST_DEFOG: "Defog",
|
|
67
|
+
comfort_pb2.DEFROST_ACTIVE: "Defrost",
|
|
68
|
+
comfort_pb2.DEFROST_DEFOG_DEFROST: "Defog_Defrost",
|
|
69
|
+
comfort_pb2.DEFROST_OFF: "Off",
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
# GraphQL's cabinPreconditioningStatus / cabinPreconditioningType values.
|
|
73
|
+
_PRECONDITIONING_STATUS_MAP: Final[dict[int, str]] = {
|
|
74
|
+
comfort_pb2.PRECONDITIONING_STATUS_UNSPECIFIED: "undefined",
|
|
75
|
+
comfort_pb2.PRECONDITIONING_INITIATE: "initiate",
|
|
76
|
+
comfort_pb2.PRECONDITIONING_ACTIVE: "active",
|
|
77
|
+
comfort_pb2.PRECONDITIONING_ACTIVE_WARNING: "active_warning",
|
|
78
|
+
comfort_pb2.PRECONDITIONING_COMPLETE_MAINTAIN: "complete_maintain",
|
|
79
|
+
comfort_pb2.PRECONDITIONING_TIMEOUT_TEMP_NOT_ACHIEVED: (
|
|
80
|
+
"timeout_temperature_not_achieved"
|
|
81
|
+
),
|
|
82
|
+
comfort_pb2.PRECONDITIONING_ERROR_SOC_LOW: "error_soc_low",
|
|
83
|
+
comfort_pb2.PRECONDITIONING_ERROR_SYSTEM_FAULT: "error_system_fault",
|
|
84
|
+
comfort_pb2.PRECONDITIONING_UNAVAILABLE: "unavailable",
|
|
85
|
+
comfort_pb2.PRECONDITIONING_TIMEOUT_COMPLETE: "timeout_complete",
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
_PRECONDITIONING_TYPE_MAP: Final[dict[int, str]] = {
|
|
89
|
+
comfort_pb2.PRECONDITIONING_TYPE_USER_SELECTED: "user_selected",
|
|
90
|
+
comfort_pb2.PRECONDITIONING_TYPE_SCREEN_PROTECTION: "screen_protection",
|
|
91
|
+
comfort_pb2.PRECONDITIONING_TYPE_SCHEDULED: "scheduled",
|
|
92
|
+
comfort_pb2.PRECONDITIONING_TYPE_AUTO_CABIN_VENTILATION: "auto_cabin_ventilation",
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
_PET_MODE_CABIN_CLIMATE_MAP: Final[dict[int, str]] = {
|
|
96
|
+
comfort_pb2.PET_MODE_CABIN_CLIMATE_COMFORTABLE: "comfortable",
|
|
97
|
+
comfort_pb2.PET_MODE_CABIN_CLIMATE_COLD: "cold",
|
|
98
|
+
comfort_pb2.PET_MODE_CABIN_CLIMATE_HOT: "hot",
|
|
58
99
|
}
|
|
59
100
|
|
|
60
101
|
_PET_MODE_STATE_MAP: Final[dict[int, str]] = {
|
|
@@ -110,20 +151,20 @@ def decode_preconditioning(m: comfort_pb2.CabinPreconditioningStatus) -> dict[st
|
|
|
110
151
|
"""comfort.cabin.cabin_preconditioning_status — cabin preconditioning state.
|
|
111
152
|
|
|
112
153
|
Fields:
|
|
113
|
-
cabinPreconditioningStatus: str ("
|
|
114
|
-
|
|
154
|
+
cabinPreconditioningStatus: str ("undefined" | "initiate" | "active" |
|
|
155
|
+
"complete_maintain" | "unavailable" | ...); "unavailable" while
|
|
156
|
+
driving or in pet comfort
|
|
157
|
+
cabinPreconditioningType: str | None ("user_selected" |
|
|
158
|
+
"screen_protection" | "scheduled" | "auto_cabin_ventilation")
|
|
115
159
|
"""
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
):
|
|
125
|
-
return {"cabinPreconditioningStatus": "initiate"}
|
|
126
|
-
return {"cabinPreconditioningStatus": "off"}
|
|
160
|
+
return {
|
|
161
|
+
"cabinPreconditioningStatus": _enum(
|
|
162
|
+
_PRECONDITIONING_STATUS_MAP, m.status, what="preconditioning status"
|
|
163
|
+
),
|
|
164
|
+
"cabinPreconditioningType": _enum(
|
|
165
|
+
_PRECONDITIONING_TYPE_MAP, m.type or None, what="preconditioning type"
|
|
166
|
+
),
|
|
167
|
+
}
|
|
127
168
|
|
|
128
169
|
|
|
129
170
|
@RVMDecoder.register("comfort.cabin.cabin_temperatures", comfort_pb2.CabinTemperatures)
|
|
@@ -134,33 +175,27 @@ def decode_cabin_temperatures(m: comfort_pb2.CabinTemperatures) -> dict[str, Any
|
|
|
134
175
|
cabinClimateInteriorTemperature: float (°C)
|
|
135
176
|
cabinClimateDriverTemperature: float (°C) — set point, same as
|
|
136
177
|
`hvacTargetTemperature`
|
|
178
|
+
cabinClimateExteriorTemperature: float (°C), when sent
|
|
137
179
|
"""
|
|
138
|
-
|
|
180
|
+
result: dict[str, Any] = {
|
|
139
181
|
"cabinClimateInteriorTemperature": round(m.interior_temperature, 1),
|
|
140
182
|
"cabinClimateDriverTemperature": round(m.driver_set_point, 1),
|
|
141
183
|
}
|
|
184
|
+
if (v := _present(m, "exterior_temperature")) is not None:
|
|
185
|
+
result["cabinClimateExteriorTemperature"] = round(v, 1)
|
|
186
|
+
return result
|
|
142
187
|
|
|
143
188
|
|
|
144
189
|
@RVMDecoder.register(
|
|
145
190
|
"comfort.cabin.cabin_ventilation_setting", comfort_pb2.CabinVentilationSetting
|
|
146
191
|
)
|
|
147
192
|
def decode_cabin_ventilation(m: comfort_pb2.CabinVentilationSetting) -> dict[str, Any]:
|
|
148
|
-
"""comfort.cabin.cabin_ventilation_setting —
|
|
193
|
+
"""comfort.cabin.cabin_ventilation_setting — auto cabin ventilation.
|
|
149
194
|
|
|
150
195
|
Fields:
|
|
151
196
|
cabinVentilationEnabled: bool
|
|
152
|
-
cabinVentilationMode: str | None ("AUTO" | "MANUAL" | "OFF")
|
|
153
|
-
cabinVentilationWindowsPosition: int (percent open)
|
|
154
|
-
cabinVentilationSunroofPosition: int (percent open)
|
|
155
|
-
cabinVentilationDuration: int (minutes)
|
|
156
197
|
"""
|
|
157
|
-
return {
|
|
158
|
-
"cabinVentilationEnabled": m.enabled,
|
|
159
|
-
"cabinVentilationMode": m.mode or None,
|
|
160
|
-
"cabinVentilationWindowsPosition": m.windows_position,
|
|
161
|
-
"cabinVentilationSunroofPosition": m.sunroof_position,
|
|
162
|
-
"cabinVentilationDuration": m.duration,
|
|
163
|
-
}
|
|
198
|
+
return {"cabinVentilationEnabled": m.auto_cabin_ventilation_enabled}
|
|
164
199
|
|
|
165
200
|
|
|
166
201
|
@RVMDecoder.register(
|
|
@@ -211,10 +246,14 @@ def decode_defrost_status(m: comfort_pb2.DefrostDefogStatus) -> dict[str, Any]:
|
|
|
211
246
|
"""comfort.cabin.defrost_defog_status — windshield defrost state.
|
|
212
247
|
|
|
213
248
|
Fields:
|
|
214
|
-
defrostDefogStatus: str ("Defrost" | "
|
|
249
|
+
defrostDefogStatus: str | None ("Defog" | "Defrost" | "Defog_Defrost"
|
|
250
|
+
| "Off")
|
|
215
251
|
"""
|
|
216
|
-
|
|
217
|
-
|
|
252
|
+
return {
|
|
253
|
+
"defrostDefogStatus": _enum(
|
|
254
|
+
_DEFROST_MAP, m.status or None, what="defrost defog status"
|
|
255
|
+
)
|
|
256
|
+
}
|
|
218
257
|
|
|
219
258
|
|
|
220
259
|
@RVMDecoder.register("comfort.cabin.pet_mode_status", comfort_pb2.PetModeStatus)
|
|
@@ -225,8 +264,9 @@ def decode_pet_mode_status(m: comfort_pb2.PetModeStatus) -> dict[str, Any]:
|
|
|
225
264
|
petModeStatus: str — "disabled" while cabin climate is off, "off"
|
|
226
265
|
while it runs without pet mode
|
|
227
266
|
petModeTemperatureStatus: str
|
|
267
|
+
petModeCabinClimate: str ("comfortable" | "cold" | "hot")
|
|
228
268
|
|
|
229
|
-
Absent fields are their zero values ("off" / "default").
|
|
269
|
+
Absent fields are their zero values ("off" / "default" / "comfortable").
|
|
230
270
|
"""
|
|
231
271
|
return {
|
|
232
272
|
"petModeStatus": _enum(_PET_MODE_STATE_MAP, m.status, what="pet mode status"),
|
|
@@ -235,6 +275,9 @@ def decode_pet_mode_status(m: comfort_pb2.PetModeStatus) -> dict[str, Any]:
|
|
|
235
275
|
m.temperature_status,
|
|
236
276
|
what="pet mode temperature status",
|
|
237
277
|
),
|
|
278
|
+
"petModeCabinClimate": _enum(
|
|
279
|
+
_PET_MODE_CABIN_CLIMATE_MAP, m.cabin_climate, what="pet mode cabin climate"
|
|
280
|
+
),
|
|
238
281
|
}
|
|
239
282
|
|
|
240
283
|
|
{rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/device_table.py
RENAMED
|
@@ -41,6 +41,7 @@ def decode_vas_keyper_devices(m: device_table_pb2.VasKeyperDevices) -> dict[str,
|
|
|
41
41
|
vehicle.profiles.active_user)
|
|
42
42
|
publicKey: str — hex; phone keys
|
|
43
43
|
keyRevision: int — key table revision when the entry was last written
|
|
44
|
+
vehicleResponseRequired: bool
|
|
44
45
|
keyStatus: str ("active" | "inactive" | "waiting_to_pair" |
|
|
45
46
|
"pairing"); inactive covers unpaired, no longer paired and
|
|
46
47
|
deleted keys
|
|
@@ -65,6 +66,7 @@ def decode_vas_keyper_devices(m: device_table_pb2.VasKeyperDevices) -> dict[str,
|
|
|
65
66
|
("profile_id", "profileId"),
|
|
66
67
|
("public_key", "publicKey"),
|
|
67
68
|
("revision", "keyRevision"),
|
|
69
|
+
("vehicle_response_required", "vehicleResponseRequired"),
|
|
68
70
|
):
|
|
69
71
|
if (v := _present(m.device, field)) is not None:
|
|
70
72
|
result[key] = v
|
{rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b9}/src/rivian/parallax/dynamics.py
RENAMED
|
@@ -75,7 +75,7 @@ def decode_drive_mode(m: dynamics_pb2.DriveMode) -> dict[str, Any]:
|
|
|
75
75
|
|
|
76
76
|
Fields:
|
|
77
77
|
driveMode: str
|
|
78
|
-
limitedAccelCold, limitedRegenCold:
|
|
78
|
+
limitedAccelCold, limitedRegenCold: bool
|
|
79
79
|
"""
|
|
80
80
|
return {
|
|
81
81
|
"driveMode": _enum(_DRIVE_MODE_MAP, _present(m, "mode"), what="drive mode"),
|
|
@@ -248,9 +248,20 @@ def decode_mass_estimate(m: dynamics_pb2.MassEstimate) -> dict[str, Any]:
|
|
|
248
248
|
def decode_brake_fluid_level(m: dynamics_pb2.BrakeFluidLevel) -> dict[str, Any]:
|
|
249
249
|
"""dynamics.brakes.fluid_level — brake fluid level.
|
|
250
250
|
|
|
251
|
+
The value numbering is a best guess.
|
|
252
|
+
|
|
251
253
|
Fields:
|
|
252
|
-
|
|
254
|
+
brakeFluidLow: str ("inactive" | "active" | "signal_not_available")
|
|
253
255
|
"""
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
256
|
+
return {
|
|
257
|
+
"brakeFluidLow": _enum(
|
|
258
|
+
_BRAKE_FLUID_LOW_MAP, m.fluid_low, what="brake fluid low"
|
|
259
|
+
)
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
_BRAKE_FLUID_LOW_MAP: Final[dict[int, str]] = {
|
|
264
|
+
dynamics_pb2.BRAKE_FLUID_LOW_SIGNAL_NOT_AVAILABLE: "signal_not_available",
|
|
265
|
+
dynamics_pb2.BRAKE_FLUID_LOW_INACTIVE: "inactive",
|
|
266
|
+
dynamics_pb2.BRAKE_FLUID_LOW_ACTIVE: "active",
|
|
267
|
+
}
|