rivian-python-client 2.2.0b7__tar.gz → 2.2.0b8__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.0b8}/PKG-INFO +1 -1
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/__version__.py +1 -1
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/body.py +45 -5
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/charging.py +166 -27
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/comfort.py +81 -38
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/device_table.py +2 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/dynamics.py +1 -1
- rivian_python_client-2.2.0b8/src/rivian/parallax/energy.py +148 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/energy_edge_compute.py +10 -6
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/gearguard_streaming.py +3 -5
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/geofence.py +2 -3
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/holiday_celebration.py +59 -9
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/navigation.py +109 -47
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/ota.py +79 -25
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/body.proto +36 -3
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/body_pb2.py +82 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/body_pb2.pyi +60 -8
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/charging.proto +102 -41
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/charging_pb2.py +86 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/charging_pb2.pyi +174 -69
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/comfort.proto +47 -16
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/comfort_pb2.py +84 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/comfort_pb2.pyi +85 -34
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/device_table.proto +1 -0
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/device_table_pb2.py +50 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/device_table_pb2.pyi +4 -2
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/dynamics.proto +3 -3
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/dynamics_pb2.py +72 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/dynamics_pb2.pyi +7 -7
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/energy.proto +97 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/energy_edge_compute.proto +19 -3
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/energy_edge_compute_pb2.py +53 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/energy_edge_compute_pb2.pyi +39 -12
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/energy_pb2.py +58 -0
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/energy_pb2.pyi +148 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/gearguard_streaming.proto +6 -8
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/gearguard_streaming_pb2.py +5 -5
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/gearguard_streaming_pb2.pyi +6 -10
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/geofence.proto +2 -3
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/geofence_pb2.py +5 -5
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/geofence_pb2.pyi +2 -4
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/holiday_celebration.proto +27 -16
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/holiday_celebration_pb2.py +54 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/holiday_celebration_pb2.pyi +49 -28
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/navigation.proto +201 -0
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/navigation_pb2.py +76 -0
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/navigation_pb2.pyi +312 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/ota.proto +67 -15
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/ota_pb2.py +78 -0
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/ota_pb2.pyi +253 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/security.proto +15 -4
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/security_pb2.py +68 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/security_pb2.pyi +28 -9
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/vehicle.proto +51 -9
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/vehicle_access.proto +13 -6
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/vehicle_access_pb2.py +42 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/vehicle_access_pb2.pyi +15 -6
- rivian_python_client-2.2.0b8/src/rivian/parallax/proto/vehicle_pb2.py +72 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/vehicle_pb2.pyi +81 -11
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/security.py +17 -4
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/vehicle.py +38 -5
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/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.0b8}/.gitignore +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/README.md +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/pyproject.toml +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/__init__.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/ble.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/const.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/exceptions.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/__init__.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/core.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/departure.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/parallax.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/__init__.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/departure.proto +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/departure_pb2.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/departure_pb2.pyi +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/parallax.proto +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/parallax_pb2.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/parallax_pb2.pyi +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/secure_file_transfer.proto +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/secure_file_transfer_pb2.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/secure_file_transfer_pb2.pyi +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/user_passcodes.proto +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/user_passcodes_pb2.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/proto/user_passcodes_pb2.pyi +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/secure_file_transfer.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/parallax/user_passcodes.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/py.typed +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/rivian.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/schemas/charging.graphql +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/schemas/gateway.graphql +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/schemas/orders.graphql +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/src/rivian/utils.py +0 -0
- {rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/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.0b8
|
|
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
|
)
|
{rivian_python_client-2.2.0b7 → rivian_python_client-2.2.0b8}/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.0b8}/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.0b8}/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.0b8}/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"),
|