diff --git a/src/rivian/parallax/__init__.py b/src/rivian/parallax/__init__.py index c5ebbd4..db14f69 100644 --- a/src/rivian/parallax/__init__.py +++ b/src/rivian/parallax/__init__.py @@ -17,6 +17,11 @@ The RVM and payload of a signed lock or unlock command. decode_command_state_message(data) -> dict | None Reads a raw `subscribe_for_parallax_command_state` message. + vehicle_command_feature(command) -> str | None + The supported feature that, when AVAILABLE, sends a `VehicleCommand` + over Parallax. + encode_vehicle_command(command, params=None) -> (rvm, payload) + The command's Parallax equivalent, for `send_parallax_command`. Layout: core.py - registry, payload parsing and shared helpers @@ -65,6 +70,7 @@ decode_parallax_subscription_message, ) from .operation import encode_vehicle_operation +from .vehicle_command import encode_vehicle_command, vehicle_command_feature PARALLAX_RVMS: list[str] = list(RVMDecoder.decoders) @@ -95,5 +101,7 @@ "encode_command", "encode_lock", "encode_unlock", + "encode_vehicle_command", "encode_vehicle_operation", + "vehicle_command_feature", ] diff --git a/src/rivian/parallax/proto/body.proto b/src/rivian/parallax/proto/body.proto index f89a768..5671295 100644 --- a/src/rivian/parallax/proto/body.proto +++ b/src/rivian/parallax/proto/body.proto @@ -48,6 +48,11 @@ enum ClosureId { GROUP_WINDOWS = 10000; // all windows together } +// body.closures.open and body.closures.close +message ClosuresRequest { + repeated ClosureId closures = 1; +} + enum ClosureState { CLOSURE_STATE_UNSPECIFIED = 0; CLOSURE_STATE_OPEN = 1; diff --git a/src/rivian/parallax/proto/body_pb2.py b/src/rivian/parallax/proto/body_pb2.py index 7e20105..6b9fd5d 100644 --- a/src/rivian/parallax/proto/body_pb2.py +++ b/src/rivian/parallax/proto/body_pb2.py @@ -24,65 +24,67 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n rivian/parallax/proto/body.proto\x12\x14rivian.parallax.body\"\x89\x06\n\rClosuresState\x12<\n\x07\x63losure\x18\x01 \x03(\x0b\x32+.rivian.parallax.body.ClosuresState.Closure\x1a\xb9\x05\n\x07\x43losure\x12+\n\x02id\x18\x01 \x01(\x0e\x32\x1f.rivian.parallax.body.ClosureId\x12\x36\n\x05state\x18\x02 \x01(\x0e\x32\".rivian.parallax.body.ClosureStateH\x01\x88\x01\x01\x12\x1d\n\x15open_position_percent\x18\x03 \x01(\x05\x12\x31\n\x05\x66\x61ult\x18\x04 \x01(\x0e\x32\".rivian.parallax.body.ClosureFault\x12\x46\n\x13windows_next_action\x18\x05 \x01(\x0e\x32\'.rivian.parallax.body.WindowsNextActionH\x00\x12\x42\n\x11\x66runk_next_action\x18\x06 \x01(\x0e\x32%.rivian.parallax.body.FrunkNextActionH\x00\x12H\n\x14liftgate_next_action\x18\x07 \x01(\x0e\x32(.rivian.parallax.body.LiftgateNextActionH\x00\x12G\n\x14side_bin_next_action\x18\x08 \x01(\x0e\x32\'.rivian.parallax.body.SideBinNextActionH\x00\x12H\n\x14tailgate_next_action\x18\t \x01(\x0e\x32(.rivian.parallax.body.TailgateNextActionH\x00\x12V\n\x1c\x63harge_port_door_next_action\x18\n \x01(\x0e\x32..rivian.parallax.body.ChargePortDoorNextActionH\x00\x12\x1d\n\x13tonneau_next_action\x18\x0b \x01(\x05H\x00\x42\r\n\x0bnext_actionB\x08\n\x06_state\"\xe3\x01\n\nLocksState\x12\x33\n\x04lock\x18\x01 \x03(\x0b\x32%.rivian.parallax.body.LocksState.Lock\x1a\x9f\x01\n\x04Lock\x12(\n\x02id\x18\x01 \x01(\x0e\x32\x1c.rivian.parallax.body.LockId\x12\x33\n\x05state\x18\x02 \x01(\x0e\x32\x1f.rivian.parallax.body.LockStateH\x00\x88\x01\x01\x12.\n\x05\x66\x61ult\x18\x03 \x01(\x0e\x32\x1f.rivian.parallax.body.LockFaultB\x08\n\x06_state\"\xd1\x01\n\x0cWindowsState\x12\x39\n\x06window\x18\x01 \x03(\x0b\x32).rivian.parallax.body.WindowsState.Window\x1a\x85\x01\n\x06Window\x12\x36\n\x08instance\x18\x01 \x01(\x0e\x32$.rivian.parallax.body.WindowInstance\x12\x43\n\x12\x63\x61libration_status\x18\x02 \x01(\x0e\x32\'.rivian.parallax.body.CalibrationStatus\"\x9b\x01\n\x0cTrailerState\x12<\n\x08presence\x18\x01 \x01(\x0e\x32%.rivian.parallax.body.TrailerPresenceH\x00\x88\x01\x01\x12@\n\x11rear_hitch_status\x18\x02 \x01(\x0e\x32%.rivian.parallax.body.RearHitchStatusB\x0b\n\t_presence\"G\n\x0fWiperFluidLevel\x12\x34\n\x05state\x18\x02 \x01(\x0e\x32%.rivian.parallax.body.WiperFluidState\"C\n\rUnlockCommand\x12\r\n\x03\x61ll\x18\x01 \x01(\x08H\x00\x12\x19\n\x0fuser_preference\x18\x02 \x01(\x08H\x00\x42\x08\n\x06target\"\r\n\x0bLockCommand*\xe8\x02\n\tClosureId\x12\x1a\n\x16\x43LOSURE_ID_UNSPECIFIED\x10\x00\x12\x13\n\x0f\x44OOR_FRONT_LEFT\x10\x01\x12\x14\n\x10\x44OOR_FRONT_RIGHT\x10\x02\x12\x12\n\x0e\x44OOR_REAR_LEFT\x10\x03\x12\x13\n\x0f\x44OOR_REAR_RIGHT\x10\x04\x12\t\n\x05\x46RUNK\x10\x05\x12\x0c\n\x08TAILGATE\x10\x06\x12\x0c\n\x08LIFTGATE\x10\x07\x12\x11\n\rSIDE_BIN_LEFT\x10\x08\x12\x12\n\x0eSIDE_BIN_RIGHT\x10\t\x12\x0f\n\x0b\x43HARGE_PORT\x10\n\x12\x0b\n\x07TONNEAU\x10\x0b\x12\x15\n\x11WINDOW_FRONT_LEFT\x10\x0c\x12\x16\n\x12WINDOW_FRONT_RIGHT\x10\r\x12\x14\n\x10WINDOW_REAR_LEFT\x10\x0e\x12\x15\n\x11WINDOW_REAR_RIGHT\x10\x0f\x12\x0f\n\x0bWINDOW_REAR\x10\x10\x12\x12\n\rGROUP_WINDOWS\x10\x90N*\xad\x01\n\x0c\x43losureState\x12\x1d\n\x19\x43LOSURE_STATE_UNSPECIFIED\x10\x00\x12\x16\n\x12\x43LOSURE_STATE_OPEN\x10\x01\x12\x18\n\x14\x43LOSURE_STATE_CLOSED\x10\x02\x12\x16\n\x12\x43LOSURE_STATE_AJAR\x10\x03\x12\x19\n\x15\x43LOSURE_STATE_OPENING\x10\x04\x12\x19\n\x15\x43LOSURE_STATE_CLOSING\x10\x05*\xf3\x02\n\x06LockId\x12\x17\n\x13LOCK_ID_UNSPECIFIED\x10\x00\x12\x18\n\x14LOCK_DOOR_FRONT_LEFT\x10\x01\x12\x19\n\x15LOCK_DOOR_FRONT_RIGHT\x10\x02\x12\x17\n\x13LOCK_DOOR_REAR_LEFT\x10\x03\x12\x18\n\x14LOCK_DOOR_REAR_RIGHT\x10\x04\x12\x0e\n\nLOCK_FRUNK\x10\x05\x12\x11\n\rLOCK_TAILGATE\x10\x06\x12\x11\n\rLOCK_LIFTGATE\x10\x07\x12\x16\n\x12LOCK_SIDE_BIN_LEFT\x10\x08\x12\x17\n\x13LOCK_SIDE_BIN_RIGHT\x10\t\x12\x14\n\x10LOCK_CHARGE_PORT\x10\n\x12\x17\n\x13LOCK_TRUNK_SECURITY\x10\x0b\x12\x17\n\x13LOCK_CENTER_CONSOLE\x10\x0c\x12\x12\n\x0eLOCK_GLOVE_BOX\x10\r\x12\x13\n\x0fLOCK_GEAR_GUARD\x10\x0e\x12\x10\n\x0cLOCK_TONNEAU\x10\x0f*z\n\tLockState\x12\x1a\n\x16LOCK_STATE_UNSPECIFIED\x10\x00\x12\x15\n\x11LOCK_STATE_LOCKED\x10\x01\x12\x17\n\x13LOCK_STATE_UNLOCKED\x10\x02\x12!\n\x1dLOCK_STATE_PARTIALLY_UNLOCKED\x10\x03*?\n\tLockFault\x12\x1a\n\x16LOCK_FAULT_UNSPECIFIED\x10\x00\x12\x16\n\x12LOCK_FAULT_FAULTED\x10\x01*\xcb\x01\n\x0eWindowInstance\x12\x1f\n\x1bWINDOW_INSTANCE_UNSPECIFIED\x10\x00\x12\x1e\n\x1aWINDOW_INSTANCE_FRONT_LEFT\x10\x01\x12\x1f\n\x1bWINDOW_INSTANCE_FRONT_RIGHT\x10\x02\x12\x1d\n\x19WINDOW_INSTANCE_REAR_LEFT\x10\x03\x12\x1e\n\x1aWINDOW_INSTANCE_REAR_RIGHT\x10\x04\x12\x18\n\x14WINDOW_INSTANCE_REAR\x10\x05*\x81\x01\n\x11\x43\x61librationStatus\x12\"\n\x1e\x43\x41LIBRATION_STATUS_UNSPECIFIED\x10\x00\x12!\n\x1d\x43\x41LIBRATION_STATUS_CALIBRATED\x10\x01\x12%\n!CALIBRATION_STATUS_NOT_CALIBRATED\x10\x02*\xd8\x01\n\x0fRearHitchStatus\x12!\n\x1dREAR_HITCH_STATUS_UNSPECIFIED\x10\x00\x12!\n\x1dREAR_HITCH_STATUS_NOT_PRESENT\x10\x01\x12\x1f\n\x1bREAR_HITCH_STATUS_ACCESSORY\x10\x02\x12\x1e\n\x1aREAR_HITCH_STATUS_TRAILER1\x10\x03\x12\x1e\n\x1aREAR_HITCH_STATUS_TRAILER2\x10\x04\x12\x1e\n\x1aREAR_HITCH_STATUS_TRAILER3\x10\x05*\xaa\x01\n\x0c\x43losureFault\x12\x1d\n\x19\x43LOSURE_FAULT_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43LOSURE_FAULT_NO_FAULT\x10\x01\x12\x19\n\x15\x43LOSURE_FAULT_GENERAL\x10\x02\x12&\n\"CLOSURE_FAULT_NO_POWERED_OPERATION\x10\x03\x12\x1c\n\x18\x43LOSURE_FAULT_OBSTRUCTED\x10\x04*\x97\x01\n\x0fTrailerPresence\x12 \n\x1cTRAILER_PRESENCE_UNSPECIFIED\x10\x00\x12\x17\n\x13TRAILER_NOT_PRESENT\x10\x01\x12\x13\n\x0fTRAILER_PRESENT\x10\x02\x12\x1f\n\x1bTRAILER_PRESENT_WITH_BRAKES\x10\x03\x12\x13\n\x0fTRAILER_INVALID\x10\x04*\x9f\x04\n\x18\x43hargePortDoorNextAction\x12\x18\n\x14\x43HARGE_PORT_DOOR_SNA\x10\x00\x12!\n\x1d\x43HARGE_PORT_DOOR_OPEN_ALLOWED\x10\x01\x12\'\n#CHARGE_PORT_DOOR_OPEN_NOT_AVAILABLE\x10\x02\x12-\n)CHARGE_PORT_DOOR_OPEN_NOT_ALLOWED_FAULTED\x10\x03\x12\x1c\n\x18\x43HARGE_PORT_DOOR_OPENING\x10\x04\x12\"\n\x1e\x43HARGE_PORT_DOOR_CLOSE_ALLOWED\x10\x05\x12;\n7CHARGE_PORT_DOOR_OBSTRUCTED_WHILE_OPENING_CLOSE_ALLOWED\x10\x06\x12:\n6CHARGE_PORT_DOOR_OBSTRUCTED_WHILE_OPENING_OPEN_ALLOWED\x10\x07\x12;\n7CHARGE_PORT_DOOR_OBSTRUCTED_WHILE_CLOSING_CLOSE_ALLOWED\x10\x08\x12(\n$CHARGE_PORT_DOOR_CLOSE_NOT_AVAILABLE\x10\t\x12.\n*CHARGE_PORT_DOOR_CLOSE_NOT_ALLOWED_FAULTED\x10\n\x12\x1c\n\x18\x43HARGE_PORT_DOOR_CLOSING\x10\x0b*\xb0\x03\n\x0f\x46runkNextAction\x12\r\n\tFRUNK_SNA\x10\x00\x12\x16\n\x12\x46RUNK_OPEN_ALLOWED\x10\x01\x12\x17\n\x13\x46RUNK_CLOSE_ALLOWED\x10\x02\x12\x11\n\rFRUNK_OPENING\x10\x03\x12\x11\n\rFRUNK_CLOSING\x10\x04\x12\x1c\n\x18\x46RUNK_OPEN_NOT_AVAILABLE\x10\x05\x12\x1d\n\x19\x46RUNK_CLOSE_NOT_AVAILABLE\x10\x06\x12\"\n\x1e\x46RUNK_OPEN_NOT_ALLOWED_FAULTED\x10\x07\x12#\n\x1f\x46RUNK_CLOSE_NOT_ALLOWED_FAULTED\x10\x08\x12)\n%FRUNK_OPEN_ALLOWED_NO_POWER_OPERATION\x10\t\x12.\n*FRUNK_CLOSE_NOT_ALLOWED_NO_POWER_OPERATION\x10\n\x12*\n&FRUNK_OBSTRUCTED_OPENING_CLOSE_ALLOWED\x10\x0b\x12*\n&FRUNK_OBSTRUCTED_CLOSING_CLOSE_ALLOWED\x10\x0c*\xa7\x06\n\x12LiftgateNextAction\x12\x10\n\x0cLIFTGATE_SNA\x10\x00\x12\x19\n\x15LIFTGATE_OPEN_ALLOWED\x10\x01\x12\x1a\n\x16LIFTGATE_CLOSE_ALLOWED\x10\x02\x12\x14\n\x10LIFTGATE_OPENING\x10\x03\x12\x14\n\x10LIFTGATE_CLOSING\x10\x04\x12\x1f\n\x1bLIFTGATE_OPEN_NOT_AVAILABLE\x10\x05\x12 \n\x1cLIFTGATE_CLOSE_NOT_AVAILABLE\x10\x06\x12%\n!LIFTGATE_OPEN_NOT_ALLOWED_FAULTED\x10\x07\x12&\n\"LIFTGATE_CLOSE_NOT_ALLOWED_FAULTED\x10\x08\x12,\n(LIFTGATE_OPEN_ALLOWED_NO_POWER_OPERATION\x10\t\x12\x31\n-LIFTGATE_CLOSE_NOT_ALLOWED_NO_POWER_OPERATION\x10\n\x12-\n)LIFTGATE_OBSTRUCTED_OPENING_CLOSE_ALLOWED\x10\x0b\x12-\n)LIFTGATE_OBSTRUCTED_CLOSING_CLOSE_ALLOWED\x10\x0c\x12.\n*LIFTGATE_LOWER_GATE_OPEN_CLOSE_NOT_ALLOWED\x10\r\x12&\n\"LIFTGATE_OPENING_PAUSE_NOT_ALLOWED\x10\x0e\x12&\n\"LIFTGATE_CLOSING_PAUSE_NOT_ALLOWED\x10\x0f\x12+\n\'LIFTGATE_OPEN_ALLOWED_OBSTACLE_DETECTED\x10\x10\x12*\n&LIFTGATE_OPEN_ALLOWED_TRAILER_DETECTED\x10\x11\x12,\n(LIFTGATE_CLOSE_ALLOWED_OBSTACLE_DETECTED\x10\x12\x12+\n\'LIFTGATE_CLOSE_ALLOWED_TRAILER_DETECTED\x10\x13\x12\x17\n\x13LIFTGATE_PROCESSING\x10\x14*\xb2\x02\n\x11SideBinNextAction\x12\x10\n\x0cSIDE_BIN_SNA\x10\x00\x12\x19\n\x15SIDE_BIN_OPEN_ALLOWED\x10\x01\x12\x14\n\x10SIDE_BIN_OPENING\x10\x02\x12\x1f\n\x1bSIDE_BIN_OPEN_NOT_AVAILABLE\x10\x03\x12%\n!SIDE_BIN_OPEN_NOT_ALLOWED_FAULTED\x10\x04\x12\x32\n.SIDE_BIN_STUCK_AJAR_WHILE_OPENING_OPEN_ALLOWED\x10\x05\x12-\n)SIDE_BIN_OPEN_ALREADY_NO_ACTION_AVAILABLE\x10\x06\x12/\n+SIDE_BIN_OPEN_ALLOWED_CONFIRM_VEHICLE_ANGLE\x10\x07*\x8c\x03\n\x12TailgateNextAction\x12\x10\n\x0cTAILGATE_SNA\x10\x00\x12\x19\n\x15TAILGATE_OPEN_ALLOWED\x10\x01\x12\x14\n\x10TAILGATE_OPENING\x10\x02\x12\x1f\n\x1bTAILGATE_OPEN_NOT_AVAILABLE\x10\x03\x12%\n!TAILGATE_OPEN_NOT_ALLOWED_FAULTED\x10\x04\x12\x32\n.TAILGATE_STUCK_AJAR_WHILE_OPENING_OPEN_ALLOWED\x10\x05\x12-\n)TAILGATE_OPEN_ALREADY_NO_ACTION_AVAILABLE\x10\x06\x12/\n+TAILGATE_OPEN_ALLOWED_CONFIRM_VEHICLE_ANGLE\x10\x07\x12+\n\'TAILGATE_OPEN_ALLOWED_OBSTACLE_DETECTED\x10\x08\x12*\n&TAILGATE_OPEN_ALLOWED_TRAILER_DETECTED\x10\t*\xb0\x03\n\x11WindowsNextAction\x12\x0f\n\x0bWINDOWS_SNA\x10\x00\x12\x18\n\x14WINDOWS_OPEN_ALLOWED\x10\x01\x12\x19\n\x15WINDOWS_CLOSE_ALLOWED\x10\x02\x12\x13\n\x0fWINDOWS_OPENING\x10\x03\x12\x13\n\x0fWINDOWS_CLOSING\x10\x04\x12\x12\n\x0eWINDOWS_MOVING\x10\x05\x12\x1e\n\x1aWINDOWS_OPEN_NOT_AVAILABLE\x10\x06\x12\x1f\n\x1bWINDOWS_CLOSE_NOT_AVAILABLE\x10\x07\x12$\n WINDOWS_OPEN_NOT_ALLOWED_FAULTED\x10\x08\x12%\n!WINDOWS_CLOSE_NOT_ALLOWED_FAULTED\x10\t\x12\x32\n.WINDOWS_OBSTRUCTED_WHILE_CLOSING_CLOSE_ALLOWED\x10\n\x12*\n&WINDOWS_CLOSE_NOT_ALLOWED_UNCALIBRATED\x10\x0b\x12)\n%WINDOWS_OPEN_NOT_ALLOWED_UNCALIBRATED\x10\x0c*\x8a\x01\n\x0fWiperFluidState\x12!\n\x1dWIPER_FLUID_STATE_UNSPECIFIED\x10\x00\x12\x1c\n\x18WIPER_FLUID_STATE_NORMAL\x10\x01\x12\x19\n\x15WIPER_FLUID_STATE_LOW\x10\x02\x12\x1b\n\x17WIPER_FLUID_STATE_EMPTY\x10\x03\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n rivian/parallax/proto/body.proto\x12\x14rivian.parallax.body\"\x89\x06\n\rClosuresState\x12<\n\x07\x63losure\x18\x01 \x03(\x0b\x32+.rivian.parallax.body.ClosuresState.Closure\x1a\xb9\x05\n\x07\x43losure\x12+\n\x02id\x18\x01 \x01(\x0e\x32\x1f.rivian.parallax.body.ClosureId\x12\x36\n\x05state\x18\x02 \x01(\x0e\x32\".rivian.parallax.body.ClosureStateH\x01\x88\x01\x01\x12\x1d\n\x15open_position_percent\x18\x03 \x01(\x05\x12\x31\n\x05\x66\x61ult\x18\x04 \x01(\x0e\x32\".rivian.parallax.body.ClosureFault\x12\x46\n\x13windows_next_action\x18\x05 \x01(\x0e\x32\'.rivian.parallax.body.WindowsNextActionH\x00\x12\x42\n\x11\x66runk_next_action\x18\x06 \x01(\x0e\x32%.rivian.parallax.body.FrunkNextActionH\x00\x12H\n\x14liftgate_next_action\x18\x07 \x01(\x0e\x32(.rivian.parallax.body.LiftgateNextActionH\x00\x12G\n\x14side_bin_next_action\x18\x08 \x01(\x0e\x32\'.rivian.parallax.body.SideBinNextActionH\x00\x12H\n\x14tailgate_next_action\x18\t \x01(\x0e\x32(.rivian.parallax.body.TailgateNextActionH\x00\x12V\n\x1c\x63harge_port_door_next_action\x18\n \x01(\x0e\x32..rivian.parallax.body.ChargePortDoorNextActionH\x00\x12\x1d\n\x13tonneau_next_action\x18\x0b \x01(\x05H\x00\x42\r\n\x0bnext_actionB\x08\n\x06_state\"D\n\x0f\x43losuresRequest\x12\x31\n\x08\x63losures\x18\x01 \x03(\x0e\x32\x1f.rivian.parallax.body.ClosureId\"\xe3\x01\n\nLocksState\x12\x33\n\x04lock\x18\x01 \x03(\x0b\x32%.rivian.parallax.body.LocksState.Lock\x1a\x9f\x01\n\x04Lock\x12(\n\x02id\x18\x01 \x01(\x0e\x32\x1c.rivian.parallax.body.LockId\x12\x33\n\x05state\x18\x02 \x01(\x0e\x32\x1f.rivian.parallax.body.LockStateH\x00\x88\x01\x01\x12.\n\x05\x66\x61ult\x18\x03 \x01(\x0e\x32\x1f.rivian.parallax.body.LockFaultB\x08\n\x06_state\"\xd1\x01\n\x0cWindowsState\x12\x39\n\x06window\x18\x01 \x03(\x0b\x32).rivian.parallax.body.WindowsState.Window\x1a\x85\x01\n\x06Window\x12\x36\n\x08instance\x18\x01 \x01(\x0e\x32$.rivian.parallax.body.WindowInstance\x12\x43\n\x12\x63\x61libration_status\x18\x02 \x01(\x0e\x32\'.rivian.parallax.body.CalibrationStatus\"\x9b\x01\n\x0cTrailerState\x12<\n\x08presence\x18\x01 \x01(\x0e\x32%.rivian.parallax.body.TrailerPresenceH\x00\x88\x01\x01\x12@\n\x11rear_hitch_status\x18\x02 \x01(\x0e\x32%.rivian.parallax.body.RearHitchStatusB\x0b\n\t_presence\"G\n\x0fWiperFluidLevel\x12\x34\n\x05state\x18\x02 \x01(\x0e\x32%.rivian.parallax.body.WiperFluidState\"C\n\rUnlockCommand\x12\r\n\x03\x61ll\x18\x01 \x01(\x08H\x00\x12\x19\n\x0fuser_preference\x18\x02 \x01(\x08H\x00\x42\x08\n\x06target\"\r\n\x0bLockCommand*\xe8\x02\n\tClosureId\x12\x1a\n\x16\x43LOSURE_ID_UNSPECIFIED\x10\x00\x12\x13\n\x0f\x44OOR_FRONT_LEFT\x10\x01\x12\x14\n\x10\x44OOR_FRONT_RIGHT\x10\x02\x12\x12\n\x0e\x44OOR_REAR_LEFT\x10\x03\x12\x13\n\x0f\x44OOR_REAR_RIGHT\x10\x04\x12\t\n\x05\x46RUNK\x10\x05\x12\x0c\n\x08TAILGATE\x10\x06\x12\x0c\n\x08LIFTGATE\x10\x07\x12\x11\n\rSIDE_BIN_LEFT\x10\x08\x12\x12\n\x0eSIDE_BIN_RIGHT\x10\t\x12\x0f\n\x0b\x43HARGE_PORT\x10\n\x12\x0b\n\x07TONNEAU\x10\x0b\x12\x15\n\x11WINDOW_FRONT_LEFT\x10\x0c\x12\x16\n\x12WINDOW_FRONT_RIGHT\x10\r\x12\x14\n\x10WINDOW_REAR_LEFT\x10\x0e\x12\x15\n\x11WINDOW_REAR_RIGHT\x10\x0f\x12\x0f\n\x0bWINDOW_REAR\x10\x10\x12\x12\n\rGROUP_WINDOWS\x10\x90N*\xad\x01\n\x0c\x43losureState\x12\x1d\n\x19\x43LOSURE_STATE_UNSPECIFIED\x10\x00\x12\x16\n\x12\x43LOSURE_STATE_OPEN\x10\x01\x12\x18\n\x14\x43LOSURE_STATE_CLOSED\x10\x02\x12\x16\n\x12\x43LOSURE_STATE_AJAR\x10\x03\x12\x19\n\x15\x43LOSURE_STATE_OPENING\x10\x04\x12\x19\n\x15\x43LOSURE_STATE_CLOSING\x10\x05*\xf3\x02\n\x06LockId\x12\x17\n\x13LOCK_ID_UNSPECIFIED\x10\x00\x12\x18\n\x14LOCK_DOOR_FRONT_LEFT\x10\x01\x12\x19\n\x15LOCK_DOOR_FRONT_RIGHT\x10\x02\x12\x17\n\x13LOCK_DOOR_REAR_LEFT\x10\x03\x12\x18\n\x14LOCK_DOOR_REAR_RIGHT\x10\x04\x12\x0e\n\nLOCK_FRUNK\x10\x05\x12\x11\n\rLOCK_TAILGATE\x10\x06\x12\x11\n\rLOCK_LIFTGATE\x10\x07\x12\x16\n\x12LOCK_SIDE_BIN_LEFT\x10\x08\x12\x17\n\x13LOCK_SIDE_BIN_RIGHT\x10\t\x12\x14\n\x10LOCK_CHARGE_PORT\x10\n\x12\x17\n\x13LOCK_TRUNK_SECURITY\x10\x0b\x12\x17\n\x13LOCK_CENTER_CONSOLE\x10\x0c\x12\x12\n\x0eLOCK_GLOVE_BOX\x10\r\x12\x13\n\x0fLOCK_GEAR_GUARD\x10\x0e\x12\x10\n\x0cLOCK_TONNEAU\x10\x0f*z\n\tLockState\x12\x1a\n\x16LOCK_STATE_UNSPECIFIED\x10\x00\x12\x15\n\x11LOCK_STATE_LOCKED\x10\x01\x12\x17\n\x13LOCK_STATE_UNLOCKED\x10\x02\x12!\n\x1dLOCK_STATE_PARTIALLY_UNLOCKED\x10\x03*?\n\tLockFault\x12\x1a\n\x16LOCK_FAULT_UNSPECIFIED\x10\x00\x12\x16\n\x12LOCK_FAULT_FAULTED\x10\x01*\xcb\x01\n\x0eWindowInstance\x12\x1f\n\x1bWINDOW_INSTANCE_UNSPECIFIED\x10\x00\x12\x1e\n\x1aWINDOW_INSTANCE_FRONT_LEFT\x10\x01\x12\x1f\n\x1bWINDOW_INSTANCE_FRONT_RIGHT\x10\x02\x12\x1d\n\x19WINDOW_INSTANCE_REAR_LEFT\x10\x03\x12\x1e\n\x1aWINDOW_INSTANCE_REAR_RIGHT\x10\x04\x12\x18\n\x14WINDOW_INSTANCE_REAR\x10\x05*\x81\x01\n\x11\x43\x61librationStatus\x12\"\n\x1e\x43\x41LIBRATION_STATUS_UNSPECIFIED\x10\x00\x12!\n\x1d\x43\x41LIBRATION_STATUS_CALIBRATED\x10\x01\x12%\n!CALIBRATION_STATUS_NOT_CALIBRATED\x10\x02*\xd8\x01\n\x0fRearHitchStatus\x12!\n\x1dREAR_HITCH_STATUS_UNSPECIFIED\x10\x00\x12!\n\x1dREAR_HITCH_STATUS_NOT_PRESENT\x10\x01\x12\x1f\n\x1bREAR_HITCH_STATUS_ACCESSORY\x10\x02\x12\x1e\n\x1aREAR_HITCH_STATUS_TRAILER1\x10\x03\x12\x1e\n\x1aREAR_HITCH_STATUS_TRAILER2\x10\x04\x12\x1e\n\x1aREAR_HITCH_STATUS_TRAILER3\x10\x05*\xaa\x01\n\x0c\x43losureFault\x12\x1d\n\x19\x43LOSURE_FAULT_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43LOSURE_FAULT_NO_FAULT\x10\x01\x12\x19\n\x15\x43LOSURE_FAULT_GENERAL\x10\x02\x12&\n\"CLOSURE_FAULT_NO_POWERED_OPERATION\x10\x03\x12\x1c\n\x18\x43LOSURE_FAULT_OBSTRUCTED\x10\x04*\x97\x01\n\x0fTrailerPresence\x12 \n\x1cTRAILER_PRESENCE_UNSPECIFIED\x10\x00\x12\x17\n\x13TRAILER_NOT_PRESENT\x10\x01\x12\x13\n\x0fTRAILER_PRESENT\x10\x02\x12\x1f\n\x1bTRAILER_PRESENT_WITH_BRAKES\x10\x03\x12\x13\n\x0fTRAILER_INVALID\x10\x04*\x9f\x04\n\x18\x43hargePortDoorNextAction\x12\x18\n\x14\x43HARGE_PORT_DOOR_SNA\x10\x00\x12!\n\x1d\x43HARGE_PORT_DOOR_OPEN_ALLOWED\x10\x01\x12\'\n#CHARGE_PORT_DOOR_OPEN_NOT_AVAILABLE\x10\x02\x12-\n)CHARGE_PORT_DOOR_OPEN_NOT_ALLOWED_FAULTED\x10\x03\x12\x1c\n\x18\x43HARGE_PORT_DOOR_OPENING\x10\x04\x12\"\n\x1e\x43HARGE_PORT_DOOR_CLOSE_ALLOWED\x10\x05\x12;\n7CHARGE_PORT_DOOR_OBSTRUCTED_WHILE_OPENING_CLOSE_ALLOWED\x10\x06\x12:\n6CHARGE_PORT_DOOR_OBSTRUCTED_WHILE_OPENING_OPEN_ALLOWED\x10\x07\x12;\n7CHARGE_PORT_DOOR_OBSTRUCTED_WHILE_CLOSING_CLOSE_ALLOWED\x10\x08\x12(\n$CHARGE_PORT_DOOR_CLOSE_NOT_AVAILABLE\x10\t\x12.\n*CHARGE_PORT_DOOR_CLOSE_NOT_ALLOWED_FAULTED\x10\n\x12\x1c\n\x18\x43HARGE_PORT_DOOR_CLOSING\x10\x0b*\xb0\x03\n\x0f\x46runkNextAction\x12\r\n\tFRUNK_SNA\x10\x00\x12\x16\n\x12\x46RUNK_OPEN_ALLOWED\x10\x01\x12\x17\n\x13\x46RUNK_CLOSE_ALLOWED\x10\x02\x12\x11\n\rFRUNK_OPENING\x10\x03\x12\x11\n\rFRUNK_CLOSING\x10\x04\x12\x1c\n\x18\x46RUNK_OPEN_NOT_AVAILABLE\x10\x05\x12\x1d\n\x19\x46RUNK_CLOSE_NOT_AVAILABLE\x10\x06\x12\"\n\x1e\x46RUNK_OPEN_NOT_ALLOWED_FAULTED\x10\x07\x12#\n\x1f\x46RUNK_CLOSE_NOT_ALLOWED_FAULTED\x10\x08\x12)\n%FRUNK_OPEN_ALLOWED_NO_POWER_OPERATION\x10\t\x12.\n*FRUNK_CLOSE_NOT_ALLOWED_NO_POWER_OPERATION\x10\n\x12*\n&FRUNK_OBSTRUCTED_OPENING_CLOSE_ALLOWED\x10\x0b\x12*\n&FRUNK_OBSTRUCTED_CLOSING_CLOSE_ALLOWED\x10\x0c*\xa7\x06\n\x12LiftgateNextAction\x12\x10\n\x0cLIFTGATE_SNA\x10\x00\x12\x19\n\x15LIFTGATE_OPEN_ALLOWED\x10\x01\x12\x1a\n\x16LIFTGATE_CLOSE_ALLOWED\x10\x02\x12\x14\n\x10LIFTGATE_OPENING\x10\x03\x12\x14\n\x10LIFTGATE_CLOSING\x10\x04\x12\x1f\n\x1bLIFTGATE_OPEN_NOT_AVAILABLE\x10\x05\x12 \n\x1cLIFTGATE_CLOSE_NOT_AVAILABLE\x10\x06\x12%\n!LIFTGATE_OPEN_NOT_ALLOWED_FAULTED\x10\x07\x12&\n\"LIFTGATE_CLOSE_NOT_ALLOWED_FAULTED\x10\x08\x12,\n(LIFTGATE_OPEN_ALLOWED_NO_POWER_OPERATION\x10\t\x12\x31\n-LIFTGATE_CLOSE_NOT_ALLOWED_NO_POWER_OPERATION\x10\n\x12-\n)LIFTGATE_OBSTRUCTED_OPENING_CLOSE_ALLOWED\x10\x0b\x12-\n)LIFTGATE_OBSTRUCTED_CLOSING_CLOSE_ALLOWED\x10\x0c\x12.\n*LIFTGATE_LOWER_GATE_OPEN_CLOSE_NOT_ALLOWED\x10\r\x12&\n\"LIFTGATE_OPENING_PAUSE_NOT_ALLOWED\x10\x0e\x12&\n\"LIFTGATE_CLOSING_PAUSE_NOT_ALLOWED\x10\x0f\x12+\n\'LIFTGATE_OPEN_ALLOWED_OBSTACLE_DETECTED\x10\x10\x12*\n&LIFTGATE_OPEN_ALLOWED_TRAILER_DETECTED\x10\x11\x12,\n(LIFTGATE_CLOSE_ALLOWED_OBSTACLE_DETECTED\x10\x12\x12+\n\'LIFTGATE_CLOSE_ALLOWED_TRAILER_DETECTED\x10\x13\x12\x17\n\x13LIFTGATE_PROCESSING\x10\x14*\xb2\x02\n\x11SideBinNextAction\x12\x10\n\x0cSIDE_BIN_SNA\x10\x00\x12\x19\n\x15SIDE_BIN_OPEN_ALLOWED\x10\x01\x12\x14\n\x10SIDE_BIN_OPENING\x10\x02\x12\x1f\n\x1bSIDE_BIN_OPEN_NOT_AVAILABLE\x10\x03\x12%\n!SIDE_BIN_OPEN_NOT_ALLOWED_FAULTED\x10\x04\x12\x32\n.SIDE_BIN_STUCK_AJAR_WHILE_OPENING_OPEN_ALLOWED\x10\x05\x12-\n)SIDE_BIN_OPEN_ALREADY_NO_ACTION_AVAILABLE\x10\x06\x12/\n+SIDE_BIN_OPEN_ALLOWED_CONFIRM_VEHICLE_ANGLE\x10\x07*\x8c\x03\n\x12TailgateNextAction\x12\x10\n\x0cTAILGATE_SNA\x10\x00\x12\x19\n\x15TAILGATE_OPEN_ALLOWED\x10\x01\x12\x14\n\x10TAILGATE_OPENING\x10\x02\x12\x1f\n\x1bTAILGATE_OPEN_NOT_AVAILABLE\x10\x03\x12%\n!TAILGATE_OPEN_NOT_ALLOWED_FAULTED\x10\x04\x12\x32\n.TAILGATE_STUCK_AJAR_WHILE_OPENING_OPEN_ALLOWED\x10\x05\x12-\n)TAILGATE_OPEN_ALREADY_NO_ACTION_AVAILABLE\x10\x06\x12/\n+TAILGATE_OPEN_ALLOWED_CONFIRM_VEHICLE_ANGLE\x10\x07\x12+\n\'TAILGATE_OPEN_ALLOWED_OBSTACLE_DETECTED\x10\x08\x12*\n&TAILGATE_OPEN_ALLOWED_TRAILER_DETECTED\x10\t*\xb0\x03\n\x11WindowsNextAction\x12\x0f\n\x0bWINDOWS_SNA\x10\x00\x12\x18\n\x14WINDOWS_OPEN_ALLOWED\x10\x01\x12\x19\n\x15WINDOWS_CLOSE_ALLOWED\x10\x02\x12\x13\n\x0fWINDOWS_OPENING\x10\x03\x12\x13\n\x0fWINDOWS_CLOSING\x10\x04\x12\x12\n\x0eWINDOWS_MOVING\x10\x05\x12\x1e\n\x1aWINDOWS_OPEN_NOT_AVAILABLE\x10\x06\x12\x1f\n\x1bWINDOWS_CLOSE_NOT_AVAILABLE\x10\x07\x12$\n WINDOWS_OPEN_NOT_ALLOWED_FAULTED\x10\x08\x12%\n!WINDOWS_CLOSE_NOT_ALLOWED_FAULTED\x10\t\x12\x32\n.WINDOWS_OBSTRUCTED_WHILE_CLOSING_CLOSE_ALLOWED\x10\n\x12*\n&WINDOWS_CLOSE_NOT_ALLOWED_UNCALIBRATED\x10\x0b\x12)\n%WINDOWS_OPEN_NOT_ALLOWED_UNCALIBRATED\x10\x0c*\x8a\x01\n\x0fWiperFluidState\x12!\n\x1dWIPER_FLUID_STATE_UNSPECIFIED\x10\x00\x12\x1c\n\x18WIPER_FLUID_STATE_NORMAL\x10\x01\x12\x19\n\x15WIPER_FLUID_STATE_LOW\x10\x02\x12\x1b\n\x17WIPER_FLUID_STATE_EMPTY\x10\x03\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'rivian.parallax.proto.body_pb2', _globals) if not _descriptor._USE_C_DESCRIPTORS: DESCRIPTOR._loaded_options = None - _globals['_CLOSUREID']._serialized_start=1596 - _globals['_CLOSUREID']._serialized_end=1956 - _globals['_CLOSURESTATE']._serialized_start=1959 - _globals['_CLOSURESTATE']._serialized_end=2132 - _globals['_LOCKID']._serialized_start=2135 - _globals['_LOCKID']._serialized_end=2506 - _globals['_LOCKSTATE']._serialized_start=2508 - _globals['_LOCKSTATE']._serialized_end=2630 - _globals['_LOCKFAULT']._serialized_start=2632 - _globals['_LOCKFAULT']._serialized_end=2695 - _globals['_WINDOWINSTANCE']._serialized_start=2698 - _globals['_WINDOWINSTANCE']._serialized_end=2901 - _globals['_CALIBRATIONSTATUS']._serialized_start=2904 - _globals['_CALIBRATIONSTATUS']._serialized_end=3033 - _globals['_REARHITCHSTATUS']._serialized_start=3036 - _globals['_REARHITCHSTATUS']._serialized_end=3252 - _globals['_CLOSUREFAULT']._serialized_start=3255 - _globals['_CLOSUREFAULT']._serialized_end=3425 - _globals['_TRAILERPRESENCE']._serialized_start=3428 - _globals['_TRAILERPRESENCE']._serialized_end=3579 - _globals['_CHARGEPORTDOORNEXTACTION']._serialized_start=3582 - _globals['_CHARGEPORTDOORNEXTACTION']._serialized_end=4125 - _globals['_FRUNKNEXTACTION']._serialized_start=4128 - _globals['_FRUNKNEXTACTION']._serialized_end=4560 - _globals['_LIFTGATENEXTACTION']._serialized_start=4563 - _globals['_LIFTGATENEXTACTION']._serialized_end=5370 - _globals['_SIDEBINNEXTACTION']._serialized_start=5373 - _globals['_SIDEBINNEXTACTION']._serialized_end=5679 - _globals['_TAILGATENEXTACTION']._serialized_start=5682 - _globals['_TAILGATENEXTACTION']._serialized_end=6078 - _globals['_WINDOWSNEXTACTION']._serialized_start=6081 - _globals['_WINDOWSNEXTACTION']._serialized_end=6513 - _globals['_WIPERFLUIDSTATE']._serialized_start=6516 - _globals['_WIPERFLUIDSTATE']._serialized_end=6654 + _globals['_CLOSUREID']._serialized_start=1666 + _globals['_CLOSUREID']._serialized_end=2026 + _globals['_CLOSURESTATE']._serialized_start=2029 + _globals['_CLOSURESTATE']._serialized_end=2202 + _globals['_LOCKID']._serialized_start=2205 + _globals['_LOCKID']._serialized_end=2576 + _globals['_LOCKSTATE']._serialized_start=2578 + _globals['_LOCKSTATE']._serialized_end=2700 + _globals['_LOCKFAULT']._serialized_start=2702 + _globals['_LOCKFAULT']._serialized_end=2765 + _globals['_WINDOWINSTANCE']._serialized_start=2768 + _globals['_WINDOWINSTANCE']._serialized_end=2971 + _globals['_CALIBRATIONSTATUS']._serialized_start=2974 + _globals['_CALIBRATIONSTATUS']._serialized_end=3103 + _globals['_REARHITCHSTATUS']._serialized_start=3106 + _globals['_REARHITCHSTATUS']._serialized_end=3322 + _globals['_CLOSUREFAULT']._serialized_start=3325 + _globals['_CLOSUREFAULT']._serialized_end=3495 + _globals['_TRAILERPRESENCE']._serialized_start=3498 + _globals['_TRAILERPRESENCE']._serialized_end=3649 + _globals['_CHARGEPORTDOORNEXTACTION']._serialized_start=3652 + _globals['_CHARGEPORTDOORNEXTACTION']._serialized_end=4195 + _globals['_FRUNKNEXTACTION']._serialized_start=4198 + _globals['_FRUNKNEXTACTION']._serialized_end=4630 + _globals['_LIFTGATENEXTACTION']._serialized_start=4633 + _globals['_LIFTGATENEXTACTION']._serialized_end=5440 + _globals['_SIDEBINNEXTACTION']._serialized_start=5443 + _globals['_SIDEBINNEXTACTION']._serialized_end=5749 + _globals['_TAILGATENEXTACTION']._serialized_start=5752 + _globals['_TAILGATENEXTACTION']._serialized_end=6148 + _globals['_WINDOWSNEXTACTION']._serialized_start=6151 + _globals['_WINDOWSNEXTACTION']._serialized_end=6583 + _globals['_WIPERFLUIDSTATE']._serialized_start=6586 + _globals['_WIPERFLUIDSTATE']._serialized_end=6724 _globals['_CLOSURESSTATE']._serialized_start=59 _globals['_CLOSURESSTATE']._serialized_end=836 _globals['_CLOSURESSTATE_CLOSURE']._serialized_start=139 _globals['_CLOSURESSTATE_CLOSURE']._serialized_end=836 - _globals['_LOCKSSTATE']._serialized_start=839 - _globals['_LOCKSSTATE']._serialized_end=1066 - _globals['_LOCKSSTATE_LOCK']._serialized_start=907 - _globals['_LOCKSSTATE_LOCK']._serialized_end=1066 - _globals['_WINDOWSSTATE']._serialized_start=1069 - _globals['_WINDOWSSTATE']._serialized_end=1278 - _globals['_WINDOWSSTATE_WINDOW']._serialized_start=1145 - _globals['_WINDOWSSTATE_WINDOW']._serialized_end=1278 - _globals['_TRAILERSTATE']._serialized_start=1281 - _globals['_TRAILERSTATE']._serialized_end=1436 - _globals['_WIPERFLUIDLEVEL']._serialized_start=1438 - _globals['_WIPERFLUIDLEVEL']._serialized_end=1509 - _globals['_UNLOCKCOMMAND']._serialized_start=1511 - _globals['_UNLOCKCOMMAND']._serialized_end=1578 - _globals['_LOCKCOMMAND']._serialized_start=1580 - _globals['_LOCKCOMMAND']._serialized_end=1593 + _globals['_CLOSURESREQUEST']._serialized_start=838 + _globals['_CLOSURESREQUEST']._serialized_end=906 + _globals['_LOCKSSTATE']._serialized_start=909 + _globals['_LOCKSSTATE']._serialized_end=1136 + _globals['_LOCKSSTATE_LOCK']._serialized_start=977 + _globals['_LOCKSSTATE_LOCK']._serialized_end=1136 + _globals['_WINDOWSSTATE']._serialized_start=1139 + _globals['_WINDOWSSTATE']._serialized_end=1348 + _globals['_WINDOWSSTATE_WINDOW']._serialized_start=1215 + _globals['_WINDOWSSTATE_WINDOW']._serialized_end=1348 + _globals['_TRAILERSTATE']._serialized_start=1351 + _globals['_TRAILERSTATE']._serialized_end=1506 + _globals['_WIPERFLUIDLEVEL']._serialized_start=1508 + _globals['_WIPERFLUIDLEVEL']._serialized_end=1579 + _globals['_UNLOCKCOMMAND']._serialized_start=1581 + _globals['_UNLOCKCOMMAND']._serialized_end=1648 + _globals['_LOCKCOMMAND']._serialized_start=1650 + _globals['_LOCKCOMMAND']._serialized_end=1663 # @@protoc_insertion_point(module_scope) diff --git a/src/rivian/parallax/proto/body_pb2.pyi b/src/rivian/parallax/proto/body_pb2.pyi index fca5a8f..22aa9eb 100644 --- a/src/rivian/parallax/proto/body_pb2.pyi +++ b/src/rivian/parallax/proto/body_pb2.pyi @@ -393,6 +393,12 @@ class ClosuresState(_message.Message): closure: _containers.RepeatedCompositeFieldContainer[ClosuresState.Closure] def __init__(self, closure: _Optional[_Iterable[_Union[ClosuresState.Closure, _Mapping]]] = ...) -> None: ... +class ClosuresRequest(_message.Message): + __slots__ = ("closures",) + CLOSURES_FIELD_NUMBER: _ClassVar[int] + closures: _containers.RepeatedScalarFieldContainer[ClosureId] + def __init__(self, closures: _Optional[_Iterable[_Union[ClosureId, str]]] = ...) -> None: ... + class LocksState(_message.Message): __slots__ = ("lock",) class Lock(_message.Message): diff --git a/src/rivian/parallax/proto/charging.proto b/src/rivian/parallax/proto/charging.proto index f9995a1..be8cbf0 100644 --- a/src/rivian/parallax/proto/charging.proto +++ b/src/rivian/parallax/proto/charging.proto @@ -237,3 +237,8 @@ enum ChargerStatus { message SessionPower { float power = 1; // kW } + +// charging.energy.set_charge_limit +message ChargeLimitRequest { + uint32 limit = 1; // percent +} diff --git a/src/rivian/parallax/proto/charging_pb2.py b/src/rivian/parallax/proto/charging_pb2.py index 37d0513..6017e1b 100644 --- a/src/rivian/parallax/proto/charging_pb2.py +++ b/src/rivian/parallax/proto/charging_pb2.py @@ -24,31 +24,31 @@ -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\"\xb6\x01\n\x13SessionNotification\x12\x1e\n\x16unexpected_stop_reason\x18\x01 \x01(\x05\x12\x44\n\rderate_status\x18\x02 \x01(\x0e\x32-.rivian.parallax.charging.ChargerDerateStatus\x12\x39\n\x0b\x66\x61ult_chime\x18\x03 \x01(\x0e\x32$.rivian.parallax.charging.FaultChime\"\\\n\x14SessionRemoteCommand\x12\x44\n\x0fstart_available\x18\x01 \x01(\x0e\x32+.rivian.parallax.charging.StartAvailability\"1\n\tSocSlider\x12\x16\n\tsoc_limit\x18\x01 \x01(\x05H\x00\x88\x01\x01\x42\x0c\n\n_soc_limit\"\x1f\n\nTripTarget\x12\x11\n\tsoc_limit\x18\x02 \x01(\x05\"\xf3\x01\n\x15SmartChargingSettings\x12S\n\x0eready_by_times\x18\x01 \x03(\x0b\x32;.rivian.parallax.charging.SmartChargingSettings.ReadyByTime\x12\x1c\n\x14\x63lean_energy_enabled\x18\x02 \x01(\x08\x1ag\n\x0bReadyByTime\x12\r\n\x05hours\x18\x01 \x01(\x05\x12\x0f\n\x07minutes\x18\x02 \x01(\x05\x12\x38\n\x04\x64\x61ys\x18\x03 \x03(\x0e\x32*.rivian.parallax.charging.SmartChargingDay\"\xf0\x01\n\x11SmartChargingInfo\x12K\n\x0bresume_time\x18\x01 \x01(\x0b\x32\x36.rivian.parallax.charging.SmartChargingInfo.ResumeTime\x12I\n\x0cnotification\x18\x02 \x01(\x0e\x32\x33.rivian.parallax.charging.SmartChargingNotification\x12\x15\n\rschedule_type\x18\x03 \x01(\x05\x1a,\n\nResumeTime\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\x12\r\n\x05nanos\x18\x02 \x01(\x05\"\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\tevse_type\x18\x03 \x01(\x05\x42\x13\n\x11_connection_stateB\x11\n\x0f_charging_state\"v\n\x0eTimeEstimation\x12\x42\n\x08validity\x18\x01 \x01(\x0e\x32\x30.rivian.parallax.charging.TimeEstimationValidity\x12 \n\x18\x65stimated_time_remaining\x18\x02 \x01(\x05\"\x83\x03\n\x0b\x45nergyState\x12\x44\n\x0e\x63harging_state\x18\x01 \x01(\x0e\x32\'.rivian.parallax.charging.ChargingStateH\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\r\n\x05power\x18\x04 \x01(\x02\x12\x14\n\x07\x66ield_8\x18\x08 \x01(\x05H\x03\x88\x01\x01\x12\x10\n\x08\x66ield_10\x18\n \x01(\t\x12H\n\x10\x63onnection_state\x18\x0b \x01(\x0e\x32).rivian.parallax.charging.ConnectionStateH\x04\x88\x01\x01\x42\x11\n\x0f_charging_stateB\x11\n\x0f_charger_statusB\n\n\x08_field_3B\n\n\x08_field_8B\x13\n\x11_connection_state\"\x1d\n\x0cSessionPower\x12\r\n\x05power\x18\x01 \x01(\x02*\xb2\x05\n\x13\x43hargerDerateStatus\x12\x16\n\x12\x44\x45RATE_STATUS_NONE\x10\x00\x12\x1e\n\x1a\x44\x45RATE_STATUS_WARM_ADAPTER\x10\x01\x12\x1e\n\x1a\x44\x45RATE_STATUS_DC_WARM_PLUG\x10\x02\x12\x1e\n\x1a\x44\x45RATE_STATUS_AC_WARM_PLUG\x10\x03\x12\x1f\n\x1b\x44\x45RATE_STATUS_EVSE_DERATING\x10\x04\x12\x1d\n\x19\x44\x45RATE_STATUS_NEARING_TOC\x10\x05\x12/\n+DERATE_STATUS_NEAR_TOC_LFP_BATT_CALIBRATING\x10\x06\x12\"\n\x1e\x44\x45RATE_STATUS_HVAC_PRIORITIZED\x10\x07\x12!\n\x1d\x44\x45RATE_STATUS_BATTERY_HEATING\x10\x08\x12!\n\x1d\x44\x45RATE_STATUS_BATTERY_COOLING\x10\t\x12\x32\n.DERATE_STATUS_CELL_THERMAL_LIM_COLD_NO_CURRENT\x10\n\x12\x31\n-DERATE_STATUS_CELL_THERMAL_LIM_HOT_NO_CURRENT\x10\x0b\x12\'\n#DERATE_STATUS_CELL_THERMAL_LIM_COLD\x10\x0c\x12&\n\"DERATE_STATUS_CELL_THERMAL_LIM_HOT\x10\r\x12+\n\'DERATE_STATUS_PACK_HARDWARE_THERMAL_LIM\x10\x0e\x12 \n\x1c\x44\x45RATE_STATUS_HIGH_SOC_SIGMA\x10\x0f\x12\"\n\x1e\x44\x45RATE_STATUS_HV_BATTERY_FAULT\x10\x10\x12\x1d\n\x19\x44\x45RATE_STATUS_DCAC_EXPORT\x10\x11*\xdb\x03\n\nFaultChime\x12\x14\n\x10\x46\x41ULT_CHIME_NONE\x10\x00\x12%\n!FAULT_CHIME_CHARGING_DISABLED_ALL\x10\x01\x12$\n FAULT_CHIME_CHARGING_DISABLED_DC\x10\x02\x12-\n)FAULT_CHIME_CHARGING_DISABLED_PIN_TEMP_DC\x10\x03\x12\x36\n2FAULT_CHIME_CHARGING_DISABLED_PIN_TEMP_GRADIENT_DC\x10\x04\x12$\n FAULT_CHIME_CHARGING_DEGRADED_DC\x10\x05\x12$\n FAULT_CHIME_CHARGING_DISABLED_AC\x10\x06\x12-\n)FAULT_CHIME_CHARGING_DISABLED_PIN_TEMP_AC\x10\x07\x12$\n FAULT_CHIME_CHARGING_DEGRADED_AC\x10\x08\x12\x34\n0FAULT_CHIME_CHARGING_DISABLED_PARTIAL_CONNECTION\x10\t\x12,\n(FAULT_CHIME_CHARGING_DISABLED_NOT_PARKED\x10\n*j\n\x11StartAvailability\x12\x1a\n\x16START_AVAILABILITY_SNA\x10\x00\x12\x1c\n\x18START_AVAILABILITY_FALSE\x10\x01\x12\x1b\n\x17START_AVAILABILITY_TRUE\x10\x02*\x97\x02\n\x10SmartChargingDay\x12\"\n\x1eSMART_CHARGING_DAY_UNSPECIFIED\x10\x00\x12\x1d\n\x19SMART_CHARGING_DAY_MONDAY\x10\x01\x12\x1e\n\x1aSMART_CHARGING_DAY_TUESDAY\x10\x02\x12 \n\x1cSMART_CHARGING_DAY_WEDNESDAY\x10\x03\x12\x1f\n\x1bSMART_CHARGING_DAY_THURSDAY\x10\x04\x12\x1d\n\x19SMART_CHARGING_DAY_FRIDAY\x10\x05\x12\x1f\n\x1bSMART_CHARGING_DAY_SATURDAY\x10\x06\x12\x1d\n\x19SMART_CHARGING_DAY_SUNDAY\x10\x07*\xbc\x02\n\x19SmartChargingNotification\x12#\n\x1fSMART_CHARGING_NOTIFICATION_SNA\x10\x00\x12:\n6SMART_CHARGING_NOTIFICATION_CHARGING_WITH_CLEAN_ENERGY\x10\x01\x12/\n+SMART_CHARGING_NOTIFICATION_CHARGING_PAUSED\x10\x02\x12<\n8SMART_CHARGING_NOTIFICATION_CLEAN_ENERGY_NOT_ENOUGH_TIME\x10\x03\x12O\nKSMART_CHARGING_NOTIFICATION_CLEAN_ENERGY_FORECAST_UNAVAILABLE_OR_INCOMPLETE\x10\x04*\xaf\x01\n\x0f\x43onnectionState\x12\x19\n\x15\x43ONNECTION_STATE_INIT\x10\x00\x12!\n\x1d\x43ONNECTION_STATE_DISCONNECTED\x10\x01\x12\x1e\n\x1a\x43ONNECTION_STATE_CONNECTED\x10\x02\x12\x1a\n\x16\x43ONNECTION_STATE_ERROR\x10\x03\x12\"\n\x1e\x43ONNECTION_STATE_V2L_CONNECTED\x10\x04*\xc4\x06\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\x12\"\n\x1e\x43HARGING_SMART_CHARGING_PAUSED\x10\x18\x12\"\n\x1e\x43HARGING_SMART_CHARGING_ACTIVE\x10\x19*\xb4\x01\n\x16TimeEstimationValidity\x12!\n\x1dTIME_ESTIMATION_VALIDITY_NONE\x10\x00\x12\"\n\x1eTIME_ESTIMATION_VALIDITY_VALID\x10\x01\x12$\n TIME_ESTIMATION_VALIDITY_INVALID\x10\x02\x12-\n)TIME_ESTIMATION_VALIDITY_PACK_DISCHARGING\x10\x03*\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') +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\"\xb6\x01\n\x13SessionNotification\x12\x1e\n\x16unexpected_stop_reason\x18\x01 \x01(\x05\x12\x44\n\rderate_status\x18\x02 \x01(\x0e\x32-.rivian.parallax.charging.ChargerDerateStatus\x12\x39\n\x0b\x66\x61ult_chime\x18\x03 \x01(\x0e\x32$.rivian.parallax.charging.FaultChime\"\\\n\x14SessionRemoteCommand\x12\x44\n\x0fstart_available\x18\x01 \x01(\x0e\x32+.rivian.parallax.charging.StartAvailability\"1\n\tSocSlider\x12\x16\n\tsoc_limit\x18\x01 \x01(\x05H\x00\x88\x01\x01\x42\x0c\n\n_soc_limit\"\x1f\n\nTripTarget\x12\x11\n\tsoc_limit\x18\x02 \x01(\x05\"\xf3\x01\n\x15SmartChargingSettings\x12S\n\x0eready_by_times\x18\x01 \x03(\x0b\x32;.rivian.parallax.charging.SmartChargingSettings.ReadyByTime\x12\x1c\n\x14\x63lean_energy_enabled\x18\x02 \x01(\x08\x1ag\n\x0bReadyByTime\x12\r\n\x05hours\x18\x01 \x01(\x05\x12\x0f\n\x07minutes\x18\x02 \x01(\x05\x12\x38\n\x04\x64\x61ys\x18\x03 \x03(\x0e\x32*.rivian.parallax.charging.SmartChargingDay\"\xf0\x01\n\x11SmartChargingInfo\x12K\n\x0bresume_time\x18\x01 \x01(\x0b\x32\x36.rivian.parallax.charging.SmartChargingInfo.ResumeTime\x12I\n\x0cnotification\x18\x02 \x01(\x0e\x32\x33.rivian.parallax.charging.SmartChargingNotification\x12\x15\n\rschedule_type\x18\x03 \x01(\x05\x1a,\n\nResumeTime\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\x12\r\n\x05nanos\x18\x02 \x01(\x05\"\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\tevse_type\x18\x03 \x01(\x05\x42\x13\n\x11_connection_stateB\x11\n\x0f_charging_state\"v\n\x0eTimeEstimation\x12\x42\n\x08validity\x18\x01 \x01(\x0e\x32\x30.rivian.parallax.charging.TimeEstimationValidity\x12 \n\x18\x65stimated_time_remaining\x18\x02 \x01(\x05\"\x83\x03\n\x0b\x45nergyState\x12\x44\n\x0e\x63harging_state\x18\x01 \x01(\x0e\x32\'.rivian.parallax.charging.ChargingStateH\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\r\n\x05power\x18\x04 \x01(\x02\x12\x14\n\x07\x66ield_8\x18\x08 \x01(\x05H\x03\x88\x01\x01\x12\x10\n\x08\x66ield_10\x18\n \x01(\t\x12H\n\x10\x63onnection_state\x18\x0b \x01(\x0e\x32).rivian.parallax.charging.ConnectionStateH\x04\x88\x01\x01\x42\x11\n\x0f_charging_stateB\x11\n\x0f_charger_statusB\n\n\x08_field_3B\n\n\x08_field_8B\x13\n\x11_connection_state\"\x1d\n\x0cSessionPower\x12\r\n\x05power\x18\x01 \x01(\x02\"#\n\x12\x43hargeLimitRequest\x12\r\n\x05limit\x18\x01 \x01(\r*\xb2\x05\n\x13\x43hargerDerateStatus\x12\x16\n\x12\x44\x45RATE_STATUS_NONE\x10\x00\x12\x1e\n\x1a\x44\x45RATE_STATUS_WARM_ADAPTER\x10\x01\x12\x1e\n\x1a\x44\x45RATE_STATUS_DC_WARM_PLUG\x10\x02\x12\x1e\n\x1a\x44\x45RATE_STATUS_AC_WARM_PLUG\x10\x03\x12\x1f\n\x1b\x44\x45RATE_STATUS_EVSE_DERATING\x10\x04\x12\x1d\n\x19\x44\x45RATE_STATUS_NEARING_TOC\x10\x05\x12/\n+DERATE_STATUS_NEAR_TOC_LFP_BATT_CALIBRATING\x10\x06\x12\"\n\x1e\x44\x45RATE_STATUS_HVAC_PRIORITIZED\x10\x07\x12!\n\x1d\x44\x45RATE_STATUS_BATTERY_HEATING\x10\x08\x12!\n\x1d\x44\x45RATE_STATUS_BATTERY_COOLING\x10\t\x12\x32\n.DERATE_STATUS_CELL_THERMAL_LIM_COLD_NO_CURRENT\x10\n\x12\x31\n-DERATE_STATUS_CELL_THERMAL_LIM_HOT_NO_CURRENT\x10\x0b\x12\'\n#DERATE_STATUS_CELL_THERMAL_LIM_COLD\x10\x0c\x12&\n\"DERATE_STATUS_CELL_THERMAL_LIM_HOT\x10\r\x12+\n\'DERATE_STATUS_PACK_HARDWARE_THERMAL_LIM\x10\x0e\x12 \n\x1c\x44\x45RATE_STATUS_HIGH_SOC_SIGMA\x10\x0f\x12\"\n\x1e\x44\x45RATE_STATUS_HV_BATTERY_FAULT\x10\x10\x12\x1d\n\x19\x44\x45RATE_STATUS_DCAC_EXPORT\x10\x11*\xdb\x03\n\nFaultChime\x12\x14\n\x10\x46\x41ULT_CHIME_NONE\x10\x00\x12%\n!FAULT_CHIME_CHARGING_DISABLED_ALL\x10\x01\x12$\n FAULT_CHIME_CHARGING_DISABLED_DC\x10\x02\x12-\n)FAULT_CHIME_CHARGING_DISABLED_PIN_TEMP_DC\x10\x03\x12\x36\n2FAULT_CHIME_CHARGING_DISABLED_PIN_TEMP_GRADIENT_DC\x10\x04\x12$\n FAULT_CHIME_CHARGING_DEGRADED_DC\x10\x05\x12$\n FAULT_CHIME_CHARGING_DISABLED_AC\x10\x06\x12-\n)FAULT_CHIME_CHARGING_DISABLED_PIN_TEMP_AC\x10\x07\x12$\n FAULT_CHIME_CHARGING_DEGRADED_AC\x10\x08\x12\x34\n0FAULT_CHIME_CHARGING_DISABLED_PARTIAL_CONNECTION\x10\t\x12,\n(FAULT_CHIME_CHARGING_DISABLED_NOT_PARKED\x10\n*j\n\x11StartAvailability\x12\x1a\n\x16START_AVAILABILITY_SNA\x10\x00\x12\x1c\n\x18START_AVAILABILITY_FALSE\x10\x01\x12\x1b\n\x17START_AVAILABILITY_TRUE\x10\x02*\x97\x02\n\x10SmartChargingDay\x12\"\n\x1eSMART_CHARGING_DAY_UNSPECIFIED\x10\x00\x12\x1d\n\x19SMART_CHARGING_DAY_MONDAY\x10\x01\x12\x1e\n\x1aSMART_CHARGING_DAY_TUESDAY\x10\x02\x12 \n\x1cSMART_CHARGING_DAY_WEDNESDAY\x10\x03\x12\x1f\n\x1bSMART_CHARGING_DAY_THURSDAY\x10\x04\x12\x1d\n\x19SMART_CHARGING_DAY_FRIDAY\x10\x05\x12\x1f\n\x1bSMART_CHARGING_DAY_SATURDAY\x10\x06\x12\x1d\n\x19SMART_CHARGING_DAY_SUNDAY\x10\x07*\xbc\x02\n\x19SmartChargingNotification\x12#\n\x1fSMART_CHARGING_NOTIFICATION_SNA\x10\x00\x12:\n6SMART_CHARGING_NOTIFICATION_CHARGING_WITH_CLEAN_ENERGY\x10\x01\x12/\n+SMART_CHARGING_NOTIFICATION_CHARGING_PAUSED\x10\x02\x12<\n8SMART_CHARGING_NOTIFICATION_CLEAN_ENERGY_NOT_ENOUGH_TIME\x10\x03\x12O\nKSMART_CHARGING_NOTIFICATION_CLEAN_ENERGY_FORECAST_UNAVAILABLE_OR_INCOMPLETE\x10\x04*\xaf\x01\n\x0f\x43onnectionState\x12\x19\n\x15\x43ONNECTION_STATE_INIT\x10\x00\x12!\n\x1d\x43ONNECTION_STATE_DISCONNECTED\x10\x01\x12\x1e\n\x1a\x43ONNECTION_STATE_CONNECTED\x10\x02\x12\x1a\n\x16\x43ONNECTION_STATE_ERROR\x10\x03\x12\"\n\x1e\x43ONNECTION_STATE_V2L_CONNECTED\x10\x04*\xc4\x06\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\x12\"\n\x1e\x43HARGING_SMART_CHARGING_PAUSED\x10\x18\x12\"\n\x1e\x43HARGING_SMART_CHARGING_ACTIVE\x10\x19*\xb4\x01\n\x16TimeEstimationValidity\x12!\n\x1dTIME_ESTIMATION_VALIDITY_NONE\x10\x00\x12\"\n\x1eTIME_ESTIMATION_VALIDITY_VALID\x10\x01\x12$\n TIME_ESTIMATION_VALIDITY_INVALID\x10\x02\x12-\n)TIME_ESTIMATION_VALIDITY_PACK_DISCHARGING\x10\x03*\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') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'rivian.parallax.proto.charging_pb2', _globals) if not _descriptor._USE_C_DESCRIPTORS: DESCRIPTOR._loaded_options = None - _globals['_CHARGERDERATESTATUS']._serialized_start=2328 - _globals['_CHARGERDERATESTATUS']._serialized_end=3018 - _globals['_FAULTCHIME']._serialized_start=3021 - _globals['_FAULTCHIME']._serialized_end=3496 - _globals['_STARTAVAILABILITY']._serialized_start=3498 - _globals['_STARTAVAILABILITY']._serialized_end=3604 - _globals['_SMARTCHARGINGDAY']._serialized_start=3607 - _globals['_SMARTCHARGINGDAY']._serialized_end=3886 - _globals['_SMARTCHARGINGNOTIFICATION']._serialized_start=3889 - _globals['_SMARTCHARGINGNOTIFICATION']._serialized_end=4205 - _globals['_CONNECTIONSTATE']._serialized_start=4208 - _globals['_CONNECTIONSTATE']._serialized_end=4383 - _globals['_CHARGINGSTATE']._serialized_start=4386 - _globals['_CHARGINGSTATE']._serialized_end=5222 - _globals['_TIMEESTIMATIONVALIDITY']._serialized_start=5225 - _globals['_TIMEESTIMATIONVALIDITY']._serialized_end=5405 - _globals['_CHARGERSTATUS']._serialized_start=5408 - _globals['_CHARGERSTATUS']._serialized_end=5568 + _globals['_CHARGERDERATESTATUS']._serialized_start=2365 + _globals['_CHARGERDERATESTATUS']._serialized_end=3055 + _globals['_FAULTCHIME']._serialized_start=3058 + _globals['_FAULTCHIME']._serialized_end=3533 + _globals['_STARTAVAILABILITY']._serialized_start=3535 + _globals['_STARTAVAILABILITY']._serialized_end=3641 + _globals['_SMARTCHARGINGDAY']._serialized_start=3644 + _globals['_SMARTCHARGINGDAY']._serialized_end=3923 + _globals['_SMARTCHARGINGNOTIFICATION']._serialized_start=3926 + _globals['_SMARTCHARGINGNOTIFICATION']._serialized_end=4242 + _globals['_CONNECTIONSTATE']._serialized_start=4245 + _globals['_CONNECTIONSTATE']._serialized_end=4420 + _globals['_CHARGINGSTATE']._serialized_start=4423 + _globals['_CHARGINGSTATE']._serialized_end=5259 + _globals['_TIMEESTIMATIONVALIDITY']._serialized_start=5262 + _globals['_TIMEESTIMATIONVALIDITY']._serialized_end=5442 + _globals['_CHARGERSTATUS']._serialized_start=5445 + _globals['_CHARGERSTATUS']._serialized_end=5605 _globals['_SCHEDULETIMEWINDOW']._serialized_start=67 _globals['_SCHEDULETIMEWINDOW']._serialized_end=683 _globals['_SCHEDULETIMEWINDOW_WINDOW']._serialized_start=176 @@ -83,4 +83,6 @@ _globals['_ENERGYSTATE']._serialized_end=2294 _globals['_SESSIONPOWER']._serialized_start=2296 _globals['_SESSIONPOWER']._serialized_end=2325 + _globals['_CHARGELIMITREQUEST']._serialized_start=2327 + _globals['_CHARGELIMITREQUEST']._serialized_end=2362 # @@protoc_insertion_point(module_scope) diff --git a/src/rivian/parallax/proto/charging_pb2.pyi b/src/rivian/parallax/proto/charging_pb2.pyi index a46f6c6..460e004 100644 --- a/src/rivian/parallax/proto/charging_pb2.pyi +++ b/src/rivian/parallax/proto/charging_pb2.pyi @@ -359,3 +359,9 @@ class SessionPower(_message.Message): POWER_FIELD_NUMBER: _ClassVar[int] power: float def __init__(self, power: _Optional[float] = ...) -> None: ... + +class ChargeLimitRequest(_message.Message): + __slots__ = ("limit",) + LIMIT_FIELD_NUMBER: _ClassVar[int] + limit: int + def __init__(self, limit: _Optional[int] = ...) -> None: ... diff --git a/src/rivian/parallax/proto/comfort.proto b/src/rivian/parallax/proto/comfort.proto index 3f022f2..9ebf0ac 100644 --- a/src/rivian/parallax/proto/comfort.proto +++ b/src/rivian/parallax/proto/comfort.proto @@ -121,6 +121,30 @@ enum DefrostStatus { DEFROST_OFF = 4; } +// comfort.cabin.set_defrost_defog +message DefrostDefogRequest { + DefrostStatus status = 1; // the app sends DEFROST_DEFOG_DEFROST or DEFROST_OFF +} + +// comfort.cabin.set_preconditioning_temperature +message PreconditioningTemperatureRequest { + optional float temperature = 1; // °C; sent even for 0 (LO) +} + +enum CabinSurfaceStatus { + CABIN_SURFACE_STATUS_UNSPECIFIED = 0; + CABIN_SURFACE_OFF = 1; + CABIN_SURFACE_ON = 2; +} + +// comfort.cabin.set_cabin_surface +message CabinSurfaceRequest { + CabinSurface surface = 1; + ConditioningLevel level = 2; + CabinSurfaceStatus status = 3; + ConditioningType type = 4; +} + // comfort.cabin.pet_mode_status message PetModeStatus { PetModeState status = 1; diff --git a/src/rivian/parallax/proto/comfort_pb2.py b/src/rivian/parallax/proto/comfort_pb2.py index d46df2b..21e0695 100644 --- a/src/rivian/parallax/proto/comfort_pb2.py +++ b/src/rivian/parallax/proto/comfort_pb2.py @@ -24,37 +24,39 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#rivian/parallax/proto/comfort.proto\x12\x17rivian.parallax.comfort\"0\n\x12HvacSettingsStatus\x12\x1a\n\x12target_temperature\x18\x01 \x01(\x02\"\xa4\x01\n\x0eUserModesState\x12\x12\n\nin_service\x18\x01 \x01(\x08\x12\x15\n\rcar_wash_mode\x18\x02 \x01(\x08\x12\x10\n\x08pet_mode\x18\x03 \x01(\x05\x12\x11\n\tcamp_mode\x18\x04 \x01(\x05\x12\x16\n\x0etransport_mode\x18\x05 \x01(\x05\x12\x14\n\x0c\x63limate_keep\x18\x06 \x01(\x05\x12\x14\n\x0c\x66\x61\x63tory_mode\x18\x07 \x01(\x05\"\x98\x01\n\x1a\x43\x61\x62inPreconditioningStatus\x12>\n\x06status\x18\x01 \x01(\x0e\x32..rivian.parallax.comfort.PreconditioningStatus\x12:\n\x04type\x18\x02 \x01(\x0e\x32,.rivian.parallax.comfort.PreconditioningType\"\xa9\x02\n\x11\x43\x61\x62inTemperatures\x12P\n\x0ctemperatures\x18\x01 \x03(\x0b\x32:.rivian.parallax.comfort.CabinTemperatures.ZoneTemperature\x12!\n\x14\x65xterior_temperature\x18\x02 \x01(\x02H\x00\x88\x01\x01\x12\x1c\n\x14interior_temperature\x18\x03 \x01(\x02\x12\x1d\n\x10\x64river_set_point\x18\x04 \x01(\x02H\x01\x88\x01\x01\x1a\x34\n\x0fZoneTemperature\x12\x0c\n\x04seat\x18\x01 \x01(\x05\x12\x13\n\x0btemperature\x18\x02 \x01(\x02\x42\x17\n\x15_exterior_temperatureB\x13\n\x11_driver_set_point\"A\n\x17\x43\x61\x62inVentilationSetting\x12&\n\x1e\x61uto_cabin_ventilation_enabled\x18\x01 \x01(\x08\"&\n\x12\x43limateHoldSetting\x12\x10\n\x08\x64uration\x18\x01 \x01(\x05\"\xd7\x02\n\x11\x43limateHoldStatus\x12?\n\x06status\x18\x01 \x01(\x0e\x32/.rivian.parallax.comfort.ClimateHoldStatusValue\x12\x46\n\x0c\x61vailability\x18\x02 \x01(\x0e\x32\x30.rivian.parallax.comfort.ClimateHoldAvailability\x12W\n\x15unavailability_reason\x18\x03 \x01(\x0e\x32\x38.rivian.parallax.comfort.ClimateHoldUnavailabilityReason\x12\x44\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x32.rivian.parallax.comfort.ClimateHoldStatus.EndTime\x1a\x1a\n\x07\x45ndTime\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\"L\n\x12\x44\x65\x66rostDefogStatus\x12\x36\n\x06status\x18\x01 \x01(\x0e\x32&.rivian.parallax.comfort.DefrostStatus\"\xda\x01\n\rPetModeStatus\x12\x35\n\x06status\x18\x01 \x01(\x0e\x32%.rivian.parallax.comfort.PetModeState\x12M\n\x12temperature_status\x18\x02 \x01(\x0e\x32\x31.rivian.parallax.comfort.PetModeTemperatureStatus\x12\x43\n\rcabin_climate\x18\x03 \x01(\x0e\x32,.rivian.parallax.comfort.PetModeCabinClimate\"\xa4\x02\n\x16SeatConditioningStatus\x12H\n\x07surface\x18\x01 \x03(\x0b\x32\x37.rivian.parallax.comfort.SeatConditioningStatus.Surface\x1a\xbf\x01\n\x07Surface\x12\x31\n\x02id\x18\x01 \x01(\x0e\x32%.rivian.parallax.comfort.CabinSurface\x12\x37\n\x04type\x18\x02 \x01(\x0e\x32).rivian.parallax.comfort.ConditioningType\x12>\n\x05state\x18\x03 \x01(\x0e\x32*.rivian.parallax.comfort.ConditioningLevelH\x00\x88\x01\x01\x42\x08\n\x06_state*\x85\x03\n\x15PreconditioningStatus\x12&\n\"PRECONDITIONING_STATUS_UNSPECIFIED\x10\x00\x12\x1c\n\x18PRECONDITIONING_INITIATE\x10\x01\x12\x1a\n\x16PRECONDITIONING_ACTIVE\x10\x02\x12\"\n\x1ePRECONDITIONING_ACTIVE_WARNING\x10\x03\x12%\n!PRECONDITIONING_COMPLETE_MAINTAIN\x10\x04\x12-\n)PRECONDITIONING_TIMEOUT_TEMP_NOT_ACHIEVED\x10\x05\x12!\n\x1dPRECONDITIONING_ERROR_SOC_LOW\x10\x06\x12&\n\"PRECONDITIONING_ERROR_SYSTEM_FAULT\x10\x07\x12\x1f\n\x1bPRECONDITIONING_UNAVAILABLE\x10\x08\x12$\n PRECONDITIONING_TIMEOUT_COMPLETE\x10\t*\xe4\x01\n\x13PreconditioningType\x12$\n PRECONDITIONING_TYPE_UNSPECIFIED\x10\x00\x12&\n\"PRECONDITIONING_TYPE_USER_SELECTED\x10\x01\x12*\n&PRECONDITIONING_TYPE_SCREEN_PROTECTION\x10\x02\x12\"\n\x1ePRECONDITIONING_TYPE_SCHEDULED\x10\x03\x12/\n+PRECONDITIONING_TYPE_AUTO_CABIN_VENTILATION\x10\x04*\xba\x01\n\x16\x43limateHoldStatusValue\x12#\n\x1f\x43LIMATE_HOLD_STATUS_UNSPECIFIED\x10\x00\x12#\n\x1f\x43LIMATE_HOLD_STATUS_UNAVAILABLE\x10\x01\x12\x1b\n\x17\x43LIMATE_HOLD_STATUS_OFF\x10\x02\x12\x1a\n\x16\x43LIMATE_HOLD_STATUS_ON\x10\x03\x12\x1d\n\x19\x43LIMATE_HOLD_STATUS_FAULT\x10\x04*\x9d\x01\n\x17\x43limateHoldAvailability\x12)\n%CLIMATE_HOLD_AVAILABILITY_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43LIMATE_HOLD_AVAILABLE\x10\x01\x12\x1d\n\x19\x43LIMATE_HOLD_CONTROLLABLE\x10\x02\x12\x1c\n\x18\x43LIMATE_HOLD_UNAVAILABLE\x10\x03*\xc7\x01\n\x1f\x43limateHoldUnavailabilityReason\x12+\n\'CLIMATE_HOLD_UNAVAILABILITY_UNSPECIFIED\x10\x00\x12\'\n#CLIMATE_HOLD_UNAVAILABILITY_UNKNOWN\x10\x01\x12\'\n#CLIMATE_HOLD_UNAVAILABILITY_LOW_SOC\x10\x02\x12%\n!CLIMATE_HOLD_UNAVAILABILITY_FAULT\x10\x03*\x82\x01\n\rDefrostStatus\x12\x1e\n\x1a\x44\x45\x46ROST_STATUS_UNSPECIFIED\x10\x00\x12\x11\n\rDEFROST_DEFOG\x10\x01\x12\x12\n\x0e\x44\x45\x46ROST_ACTIVE\x10\x02\x12\x19\n\x15\x44\x45\x46ROST_DEFOG_DEFROST\x10\x03\x12\x0f\n\x0b\x44\x45\x46ROST_OFF\x10\x04*~\n\x13PetModeCabinClimate\x12&\n\"PET_MODE_CABIN_CLIMATE_COMFORTABLE\x10\x00\x12\x1f\n\x1bPET_MODE_CABIN_CLIMATE_COLD\x10\x01\x12\x1e\n\x1aPET_MODE_CABIN_CLIMATE_HOT\x10\x02*]\n\x0cPetModeState\x12\x10\n\x0cPET_MODE_OFF\x10\x00\x12\x0f\n\x0bPET_MODE_ON\x10\x01\x12\x15\n\x11PET_MODE_DISABLED\x10\x02\x12\x13\n\x0fPET_MODE_FAULTY\x10\x03*\x9a\x01\n\x18PetModeTemperatureStatus\x12 \n\x1cPET_MODE_TEMPERATURE_DEFAULT\x10\x00\x12\x1d\n\x19PET_MODE_TEMPERATURE_COLD\x10\x01\x12\x1c\n\x18PET_MODE_TEMPERATURE_HOT\x10\x02\x12\x1f\n\x1bPET_MODE_TEMPERATURE_FAULTY\x10\x03*\xce\x02\n\x0c\x43\x61\x62inSurface\x12\x1d\n\x19\x43\x41\x42IN_SURFACE_UNSPECIFIED\x10\x00\x12\x12\n\x0eSTEERING_WHEEL\x10\x01\x12\x0e\n\nREAR_GLASS\x10\x02\x12\x0f\n\x0b\x46RONT_GLASS\x10\x03\x12\x14\n\x10SIDEVIEW_MIRRORS\x10\x04\x12\x13\n\x0fSEAT_ROW_1_LEFT\x10\x05\x12\x15\n\x11SEAT_ROW_1_MIDDLE\x10\x06\x12\x14\n\x10SEAT_ROW_1_RIGHT\x10\x07\x12\x13\n\x0fSEAT_ROW_2_LEFT\x10\x08\x12\x15\n\x11SEAT_ROW_2_MIDDLE\x10\t\x12\x14\n\x10SEAT_ROW_2_RIGHT\x10\n\x12\x13\n\x0fSEAT_ROW_3_LEFT\x10\x0b\x12\x15\n\x11SEAT_ROW_3_MIDDLE\x10\x0c\x12\x14\n\x10SEAT_ROW_3_RIGHT\x10\r\x12\x0e\n\nWIPER_AREA\x10\x0e*c\n\x10\x43onditioningType\x12!\n\x1d\x43ONDITIONING_TYPE_UNSPECIFIED\x10\x00\x12\x15\n\x11\x43ONDITIONING_HEAT\x10\x01\x12\x15\n\x11\x43ONDITIONING_VENT\x10\x02*\x85\x01\n\x11\x43onditioningLevel\x12\"\n\x1e\x43ONDITIONING_LEVEL_UNSPECIFIED\x10\x00\x12\x18\n\x14\x43ONDITIONING_LEVEL_1\x10\x01\x12\x18\n\x14\x43ONDITIONING_LEVEL_2\x10\x02\x12\x18\n\x14\x43ONDITIONING_LEVEL_3\x10\x03\x62\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n#rivian/parallax/proto/comfort.proto\x12\x17rivian.parallax.comfort\"0\n\x12HvacSettingsStatus\x12\x1a\n\x12target_temperature\x18\x01 \x01(\x02\"\xa4\x01\n\x0eUserModesState\x12\x12\n\nin_service\x18\x01 \x01(\x08\x12\x15\n\rcar_wash_mode\x18\x02 \x01(\x08\x12\x10\n\x08pet_mode\x18\x03 \x01(\x05\x12\x11\n\tcamp_mode\x18\x04 \x01(\x05\x12\x16\n\x0etransport_mode\x18\x05 \x01(\x05\x12\x14\n\x0c\x63limate_keep\x18\x06 \x01(\x05\x12\x14\n\x0c\x66\x61\x63tory_mode\x18\x07 \x01(\x05\"\x98\x01\n\x1a\x43\x61\x62inPreconditioningStatus\x12>\n\x06status\x18\x01 \x01(\x0e\x32..rivian.parallax.comfort.PreconditioningStatus\x12:\n\x04type\x18\x02 \x01(\x0e\x32,.rivian.parallax.comfort.PreconditioningType\"\xa9\x02\n\x11\x43\x61\x62inTemperatures\x12P\n\x0ctemperatures\x18\x01 \x03(\x0b\x32:.rivian.parallax.comfort.CabinTemperatures.ZoneTemperature\x12!\n\x14\x65xterior_temperature\x18\x02 \x01(\x02H\x00\x88\x01\x01\x12\x1c\n\x14interior_temperature\x18\x03 \x01(\x02\x12\x1d\n\x10\x64river_set_point\x18\x04 \x01(\x02H\x01\x88\x01\x01\x1a\x34\n\x0fZoneTemperature\x12\x0c\n\x04seat\x18\x01 \x01(\x05\x12\x13\n\x0btemperature\x18\x02 \x01(\x02\x42\x17\n\x15_exterior_temperatureB\x13\n\x11_driver_set_point\"A\n\x17\x43\x61\x62inVentilationSetting\x12&\n\x1e\x61uto_cabin_ventilation_enabled\x18\x01 \x01(\x08\"&\n\x12\x43limateHoldSetting\x12\x10\n\x08\x64uration\x18\x01 \x01(\x05\"\xd7\x02\n\x11\x43limateHoldStatus\x12?\n\x06status\x18\x01 \x01(\x0e\x32/.rivian.parallax.comfort.ClimateHoldStatusValue\x12\x46\n\x0c\x61vailability\x18\x02 \x01(\x0e\x32\x30.rivian.parallax.comfort.ClimateHoldAvailability\x12W\n\x15unavailability_reason\x18\x03 \x01(\x0e\x32\x38.rivian.parallax.comfort.ClimateHoldUnavailabilityReason\x12\x44\n\x08\x65nd_time\x18\x04 \x01(\x0b\x32\x32.rivian.parallax.comfort.ClimateHoldStatus.EndTime\x1a\x1a\n\x07\x45ndTime\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\"L\n\x12\x44\x65\x66rostDefogStatus\x12\x36\n\x06status\x18\x01 \x01(\x0e\x32&.rivian.parallax.comfort.DefrostStatus\"M\n\x13\x44\x65\x66rostDefogRequest\x12\x36\n\x06status\x18\x01 \x01(\x0e\x32&.rivian.parallax.comfort.DefrostStatus\"M\n!PreconditioningTemperatureRequest\x12\x18\n\x0btemperature\x18\x01 \x01(\x02H\x00\x88\x01\x01\x42\x0e\n\x0c_temperature\"\xfe\x01\n\x13\x43\x61\x62inSurfaceRequest\x12\x36\n\x07surface\x18\x01 \x01(\x0e\x32%.rivian.parallax.comfort.CabinSurface\x12\x39\n\x05level\x18\x02 \x01(\x0e\x32*.rivian.parallax.comfort.ConditioningLevel\x12;\n\x06status\x18\x03 \x01(\x0e\x32+.rivian.parallax.comfort.CabinSurfaceStatus\x12\x37\n\x04type\x18\x04 \x01(\x0e\x32).rivian.parallax.comfort.ConditioningType\"\xda\x01\n\rPetModeStatus\x12\x35\n\x06status\x18\x01 \x01(\x0e\x32%.rivian.parallax.comfort.PetModeState\x12M\n\x12temperature_status\x18\x02 \x01(\x0e\x32\x31.rivian.parallax.comfort.PetModeTemperatureStatus\x12\x43\n\rcabin_climate\x18\x03 \x01(\x0e\x32,.rivian.parallax.comfort.PetModeCabinClimate\"\xa4\x02\n\x16SeatConditioningStatus\x12H\n\x07surface\x18\x01 \x03(\x0b\x32\x37.rivian.parallax.comfort.SeatConditioningStatus.Surface\x1a\xbf\x01\n\x07Surface\x12\x31\n\x02id\x18\x01 \x01(\x0e\x32%.rivian.parallax.comfort.CabinSurface\x12\x37\n\x04type\x18\x02 \x01(\x0e\x32).rivian.parallax.comfort.ConditioningType\x12>\n\x05state\x18\x03 \x01(\x0e\x32*.rivian.parallax.comfort.ConditioningLevelH\x00\x88\x01\x01\x42\x08\n\x06_state*\x85\x03\n\x15PreconditioningStatus\x12&\n\"PRECONDITIONING_STATUS_UNSPECIFIED\x10\x00\x12\x1c\n\x18PRECONDITIONING_INITIATE\x10\x01\x12\x1a\n\x16PRECONDITIONING_ACTIVE\x10\x02\x12\"\n\x1ePRECONDITIONING_ACTIVE_WARNING\x10\x03\x12%\n!PRECONDITIONING_COMPLETE_MAINTAIN\x10\x04\x12-\n)PRECONDITIONING_TIMEOUT_TEMP_NOT_ACHIEVED\x10\x05\x12!\n\x1dPRECONDITIONING_ERROR_SOC_LOW\x10\x06\x12&\n\"PRECONDITIONING_ERROR_SYSTEM_FAULT\x10\x07\x12\x1f\n\x1bPRECONDITIONING_UNAVAILABLE\x10\x08\x12$\n PRECONDITIONING_TIMEOUT_COMPLETE\x10\t*\xe4\x01\n\x13PreconditioningType\x12$\n PRECONDITIONING_TYPE_UNSPECIFIED\x10\x00\x12&\n\"PRECONDITIONING_TYPE_USER_SELECTED\x10\x01\x12*\n&PRECONDITIONING_TYPE_SCREEN_PROTECTION\x10\x02\x12\"\n\x1ePRECONDITIONING_TYPE_SCHEDULED\x10\x03\x12/\n+PRECONDITIONING_TYPE_AUTO_CABIN_VENTILATION\x10\x04*\xba\x01\n\x16\x43limateHoldStatusValue\x12#\n\x1f\x43LIMATE_HOLD_STATUS_UNSPECIFIED\x10\x00\x12#\n\x1f\x43LIMATE_HOLD_STATUS_UNAVAILABLE\x10\x01\x12\x1b\n\x17\x43LIMATE_HOLD_STATUS_OFF\x10\x02\x12\x1a\n\x16\x43LIMATE_HOLD_STATUS_ON\x10\x03\x12\x1d\n\x19\x43LIMATE_HOLD_STATUS_FAULT\x10\x04*\x9d\x01\n\x17\x43limateHoldAvailability\x12)\n%CLIMATE_HOLD_AVAILABILITY_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x43LIMATE_HOLD_AVAILABLE\x10\x01\x12\x1d\n\x19\x43LIMATE_HOLD_CONTROLLABLE\x10\x02\x12\x1c\n\x18\x43LIMATE_HOLD_UNAVAILABLE\x10\x03*\xc7\x01\n\x1f\x43limateHoldUnavailabilityReason\x12+\n\'CLIMATE_HOLD_UNAVAILABILITY_UNSPECIFIED\x10\x00\x12\'\n#CLIMATE_HOLD_UNAVAILABILITY_UNKNOWN\x10\x01\x12\'\n#CLIMATE_HOLD_UNAVAILABILITY_LOW_SOC\x10\x02\x12%\n!CLIMATE_HOLD_UNAVAILABILITY_FAULT\x10\x03*\x82\x01\n\rDefrostStatus\x12\x1e\n\x1a\x44\x45\x46ROST_STATUS_UNSPECIFIED\x10\x00\x12\x11\n\rDEFROST_DEFOG\x10\x01\x12\x12\n\x0e\x44\x45\x46ROST_ACTIVE\x10\x02\x12\x19\n\x15\x44\x45\x46ROST_DEFOG_DEFROST\x10\x03\x12\x0f\n\x0b\x44\x45\x46ROST_OFF\x10\x04*g\n\x12\x43\x61\x62inSurfaceStatus\x12$\n CABIN_SURFACE_STATUS_UNSPECIFIED\x10\x00\x12\x15\n\x11\x43\x41\x42IN_SURFACE_OFF\x10\x01\x12\x14\n\x10\x43\x41\x42IN_SURFACE_ON\x10\x02*~\n\x13PetModeCabinClimate\x12&\n\"PET_MODE_CABIN_CLIMATE_COMFORTABLE\x10\x00\x12\x1f\n\x1bPET_MODE_CABIN_CLIMATE_COLD\x10\x01\x12\x1e\n\x1aPET_MODE_CABIN_CLIMATE_HOT\x10\x02*]\n\x0cPetModeState\x12\x10\n\x0cPET_MODE_OFF\x10\x00\x12\x0f\n\x0bPET_MODE_ON\x10\x01\x12\x15\n\x11PET_MODE_DISABLED\x10\x02\x12\x13\n\x0fPET_MODE_FAULTY\x10\x03*\x9a\x01\n\x18PetModeTemperatureStatus\x12 \n\x1cPET_MODE_TEMPERATURE_DEFAULT\x10\x00\x12\x1d\n\x19PET_MODE_TEMPERATURE_COLD\x10\x01\x12\x1c\n\x18PET_MODE_TEMPERATURE_HOT\x10\x02\x12\x1f\n\x1bPET_MODE_TEMPERATURE_FAULTY\x10\x03*\xce\x02\n\x0c\x43\x61\x62inSurface\x12\x1d\n\x19\x43\x41\x42IN_SURFACE_UNSPECIFIED\x10\x00\x12\x12\n\x0eSTEERING_WHEEL\x10\x01\x12\x0e\n\nREAR_GLASS\x10\x02\x12\x0f\n\x0b\x46RONT_GLASS\x10\x03\x12\x14\n\x10SIDEVIEW_MIRRORS\x10\x04\x12\x13\n\x0fSEAT_ROW_1_LEFT\x10\x05\x12\x15\n\x11SEAT_ROW_1_MIDDLE\x10\x06\x12\x14\n\x10SEAT_ROW_1_RIGHT\x10\x07\x12\x13\n\x0fSEAT_ROW_2_LEFT\x10\x08\x12\x15\n\x11SEAT_ROW_2_MIDDLE\x10\t\x12\x14\n\x10SEAT_ROW_2_RIGHT\x10\n\x12\x13\n\x0fSEAT_ROW_3_LEFT\x10\x0b\x12\x15\n\x11SEAT_ROW_3_MIDDLE\x10\x0c\x12\x14\n\x10SEAT_ROW_3_RIGHT\x10\r\x12\x0e\n\nWIPER_AREA\x10\x0e*c\n\x10\x43onditioningType\x12!\n\x1d\x43ONDITIONING_TYPE_UNSPECIFIED\x10\x00\x12\x15\n\x11\x43ONDITIONING_HEAT\x10\x01\x12\x15\n\x11\x43ONDITIONING_VENT\x10\x02*\x85\x01\n\x11\x43onditioningLevel\x12\"\n\x1e\x43ONDITIONING_LEVEL_UNSPECIFIED\x10\x00\x12\x18\n\x14\x43ONDITIONING_LEVEL_1\x10\x01\x12\x18\n\x14\x43ONDITIONING_LEVEL_2\x10\x02\x12\x18\n\x14\x43ONDITIONING_LEVEL_3\x10\x03\x62\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'rivian.parallax.proto.comfort_pb2', _globals) if not _descriptor._USE_C_DESCRIPTORS: DESCRIPTOR._loaded_options = None - _globals['_PRECONDITIONINGSTATUS']._serialized_start=1784 - _globals['_PRECONDITIONINGSTATUS']._serialized_end=2173 - _globals['_PRECONDITIONINGTYPE']._serialized_start=2176 - _globals['_PRECONDITIONINGTYPE']._serialized_end=2404 - _globals['_CLIMATEHOLDSTATUSVALUE']._serialized_start=2407 - _globals['_CLIMATEHOLDSTATUSVALUE']._serialized_end=2593 - _globals['_CLIMATEHOLDAVAILABILITY']._serialized_start=2596 - _globals['_CLIMATEHOLDAVAILABILITY']._serialized_end=2753 - _globals['_CLIMATEHOLDUNAVAILABILITYREASON']._serialized_start=2756 - _globals['_CLIMATEHOLDUNAVAILABILITYREASON']._serialized_end=2955 - _globals['_DEFROSTSTATUS']._serialized_start=2958 - _globals['_DEFROSTSTATUS']._serialized_end=3088 - _globals['_PETMODECABINCLIMATE']._serialized_start=3090 - _globals['_PETMODECABINCLIMATE']._serialized_end=3216 - _globals['_PETMODESTATE']._serialized_start=3218 - _globals['_PETMODESTATE']._serialized_end=3311 - _globals['_PETMODETEMPERATURESTATUS']._serialized_start=3314 - _globals['_PETMODETEMPERATURESTATUS']._serialized_end=3468 - _globals['_CABINSURFACE']._serialized_start=3471 - _globals['_CABINSURFACE']._serialized_end=3805 - _globals['_CONDITIONINGTYPE']._serialized_start=3807 - _globals['_CONDITIONINGTYPE']._serialized_end=3906 - _globals['_CONDITIONINGLEVEL']._serialized_start=3909 - _globals['_CONDITIONINGLEVEL']._serialized_end=4042 + _globals['_PRECONDITIONINGSTATUS']._serialized_start=2199 + _globals['_PRECONDITIONINGSTATUS']._serialized_end=2588 + _globals['_PRECONDITIONINGTYPE']._serialized_start=2591 + _globals['_PRECONDITIONINGTYPE']._serialized_end=2819 + _globals['_CLIMATEHOLDSTATUSVALUE']._serialized_start=2822 + _globals['_CLIMATEHOLDSTATUSVALUE']._serialized_end=3008 + _globals['_CLIMATEHOLDAVAILABILITY']._serialized_start=3011 + _globals['_CLIMATEHOLDAVAILABILITY']._serialized_end=3168 + _globals['_CLIMATEHOLDUNAVAILABILITYREASON']._serialized_start=3171 + _globals['_CLIMATEHOLDUNAVAILABILITYREASON']._serialized_end=3370 + _globals['_DEFROSTSTATUS']._serialized_start=3373 + _globals['_DEFROSTSTATUS']._serialized_end=3503 + _globals['_CABINSURFACESTATUS']._serialized_start=3505 + _globals['_CABINSURFACESTATUS']._serialized_end=3608 + _globals['_PETMODECABINCLIMATE']._serialized_start=3610 + _globals['_PETMODECABINCLIMATE']._serialized_end=3736 + _globals['_PETMODESTATE']._serialized_start=3738 + _globals['_PETMODESTATE']._serialized_end=3831 + _globals['_PETMODETEMPERATURESTATUS']._serialized_start=3834 + _globals['_PETMODETEMPERATURESTATUS']._serialized_end=3988 + _globals['_CABINSURFACE']._serialized_start=3991 + _globals['_CABINSURFACE']._serialized_end=4325 + _globals['_CONDITIONINGTYPE']._serialized_start=4327 + _globals['_CONDITIONINGTYPE']._serialized_end=4426 + _globals['_CONDITIONINGLEVEL']._serialized_start=4429 + _globals['_CONDITIONINGLEVEL']._serialized_end=4562 _globals['_HVACSETTINGSSTATUS']._serialized_start=64 _globals['_HVACSETTINGSSTATUS']._serialized_end=112 _globals['_USERMODESSTATE']._serialized_start=115 @@ -75,10 +77,16 @@ _globals['_CLIMATEHOLDSTATUS_ENDTIME']._serialized_end=1187 _globals['_DEFROSTDEFOGSTATUS']._serialized_start=1189 _globals['_DEFROSTDEFOGSTATUS']._serialized_end=1265 - _globals['_PETMODESTATUS']._serialized_start=1268 - _globals['_PETMODESTATUS']._serialized_end=1486 - _globals['_SEATCONDITIONINGSTATUS']._serialized_start=1489 - _globals['_SEATCONDITIONINGSTATUS']._serialized_end=1781 - _globals['_SEATCONDITIONINGSTATUS_SURFACE']._serialized_start=1590 - _globals['_SEATCONDITIONINGSTATUS_SURFACE']._serialized_end=1781 + _globals['_DEFROSTDEFOGREQUEST']._serialized_start=1267 + _globals['_DEFROSTDEFOGREQUEST']._serialized_end=1344 + _globals['_PRECONDITIONINGTEMPERATUREREQUEST']._serialized_start=1346 + _globals['_PRECONDITIONINGTEMPERATUREREQUEST']._serialized_end=1423 + _globals['_CABINSURFACEREQUEST']._serialized_start=1426 + _globals['_CABINSURFACEREQUEST']._serialized_end=1680 + _globals['_PETMODESTATUS']._serialized_start=1683 + _globals['_PETMODESTATUS']._serialized_end=1901 + _globals['_SEATCONDITIONINGSTATUS']._serialized_start=1904 + _globals['_SEATCONDITIONINGSTATUS']._serialized_end=2196 + _globals['_SEATCONDITIONINGSTATUS_SURFACE']._serialized_start=2005 + _globals['_SEATCONDITIONINGSTATUS_SURFACE']._serialized_end=2196 # @@protoc_insertion_point(module_scope) diff --git a/src/rivian/parallax/proto/comfort_pb2.pyi b/src/rivian/parallax/proto/comfort_pb2.pyi index 6e14bc4..5862339 100644 --- a/src/rivian/parallax/proto/comfort_pb2.pyi +++ b/src/rivian/parallax/proto/comfort_pb2.pyi @@ -58,6 +58,12 @@ class DefrostStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): DEFROST_DEFOG_DEFROST: _ClassVar[DefrostStatus] DEFROST_OFF: _ClassVar[DefrostStatus] +class CabinSurfaceStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + CABIN_SURFACE_STATUS_UNSPECIFIED: _ClassVar[CabinSurfaceStatus] + CABIN_SURFACE_OFF: _ClassVar[CabinSurfaceStatus] + CABIN_SURFACE_ON: _ClassVar[CabinSurfaceStatus] + class PetModeCabinClimate(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): __slots__ = () PET_MODE_CABIN_CLIMATE_COMFORTABLE: _ClassVar[PetModeCabinClimate] @@ -141,6 +147,9 @@ DEFROST_DEFOG: DefrostStatus DEFROST_ACTIVE: DefrostStatus DEFROST_DEFOG_DEFROST: DefrostStatus DEFROST_OFF: DefrostStatus +CABIN_SURFACE_STATUS_UNSPECIFIED: CabinSurfaceStatus +CABIN_SURFACE_OFF: CabinSurfaceStatus +CABIN_SURFACE_ON: CabinSurfaceStatus PET_MODE_CABIN_CLIMATE_COMFORTABLE: PetModeCabinClimate PET_MODE_CABIN_CLIMATE_COLD: PetModeCabinClimate PET_MODE_CABIN_CLIMATE_HOT: PetModeCabinClimate @@ -261,6 +270,30 @@ class DefrostDefogStatus(_message.Message): status: DefrostStatus def __init__(self, status: _Optional[_Union[DefrostStatus, str]] = ...) -> None: ... +class DefrostDefogRequest(_message.Message): + __slots__ = ("status",) + STATUS_FIELD_NUMBER: _ClassVar[int] + status: DefrostStatus + def __init__(self, status: _Optional[_Union[DefrostStatus, str]] = ...) -> None: ... + +class PreconditioningTemperatureRequest(_message.Message): + __slots__ = ("temperature",) + TEMPERATURE_FIELD_NUMBER: _ClassVar[int] + temperature: float + def __init__(self, temperature: _Optional[float] = ...) -> None: ... + +class CabinSurfaceRequest(_message.Message): + __slots__ = ("surface", "level", "status", "type") + SURFACE_FIELD_NUMBER: _ClassVar[int] + LEVEL_FIELD_NUMBER: _ClassVar[int] + STATUS_FIELD_NUMBER: _ClassVar[int] + TYPE_FIELD_NUMBER: _ClassVar[int] + surface: CabinSurface + level: ConditioningLevel + status: CabinSurfaceStatus + type: ConditioningType + def __init__(self, surface: _Optional[_Union[CabinSurface, str]] = ..., level: _Optional[_Union[ConditioningLevel, str]] = ..., status: _Optional[_Union[CabinSurfaceStatus, str]] = ..., type: _Optional[_Union[ConditioningType, str]] = ...) -> None: ... + class PetModeStatus(_message.Message): __slots__ = ("status", "temperature_status", "cabin_climate") STATUS_FIELD_NUMBER: _ClassVar[int] diff --git a/src/rivian/parallax/vehicle_command.py b/src/rivian/parallax/vehicle_command.py new file mode 100644 index 0000000..957dfa7 --- /dev/null +++ b/src/rivian/parallax/vehicle_command.py @@ -0,0 +1,236 @@ +"""Parallax equivalents of `VehicleCommand`s. + +The Rivian app sends a command over Parallax when the vehicle reports the +supported feature for the command's category as AVAILABLE, and as a legacy +`sendVehicleCommand` otherwise. +""" + +from __future__ import annotations + +from collections.abc import Callable +from typing import Any + +from ..const import VehicleCommand +from ..exceptions import RivianBadRequestError +from .body import LOCK_RVM, UNLOCK_RVM, encode_unlock +from .proto import body_pb2, charging_pb2, comfort_pb2 + +_Build = Callable[[dict[str, Any]], bytes] + +_BODY = "PVS_BD_CMD" +_LIFTGATE = "LIFTGATE_CMD" +_COMFORT = "PVS_COMF_CMD" +_ENERGY = "PVS_ENRG_CMD" +_SECURITY = "PVS_SEC_CMD" + +_Level = comfort_pb2.ConditioningLevel +_OFF, _LOW, _MEDIUM, _HIGH = ( + comfort_pb2.CONDITIONING_LEVEL_UNSPECIFIED, + comfort_pb2.CONDITIONING_LEVEL_1, + comfort_pb2.CONDITIONING_LEVEL_2, + comfort_pb2.CONDITIONING_LEVEL_3, +) + +_VENT = comfort_pb2.CONDITIONING_VENT + +# Legacy `level` param -> level, as the Rivian app maps them; seats have no "1 = on" +_SEAT_LEVELS: dict[int, _Level] = {0: _OFF, 2: _LOW, 3: _MEDIUM, 4: _HIGH} +_WHEEL_LEVELS: dict[int, _Level] = {0: _OFF, 1: _LOW, 2: _MEDIUM, 3: _HIGH} + + +def _empty(params: dict[str, Any]) -> bytes: + return b"" + + +def _closure(closure: body_pb2.ClosureId) -> _Build: + def build(params: dict[str, Any]) -> bytes: + return body_pb2.ClosuresRequest(closures=[closure]).SerializeToString() + + return build + + +def _unlock(params: dict[str, Any]) -> bytes: + return encode_unlock() + + +def _surface( + surface: comfort_pb2.CabinSurface, + type_: comfort_pb2.ConditioningType, + levels: dict[int, _Level], +) -> _Build: + def build(params: dict[str, Any]) -> bytes: + if (level := levels.get(params.get("level", -1))) is None: + raise RivianBadRequestError(f"Level must be one of {list(levels)}") + return comfort_pb2.CabinSurfaceRequest( + surface=surface, + level=level, + status=comfort_pb2.CABIN_SURFACE_ON + if level + else comfort_pb2.CABIN_SURFACE_OFF, + type=type_, + ).SerializeToString() + + return build + + +def _defrost(params: dict[str, Any]) -> bytes: + status = ( + comfort_pb2.DEFROST_DEFOG_DEFROST + if params.get("level") + else comfort_pb2.DEFROST_OFF + ) + return comfort_pb2.DefrostDefogRequest(status=status).SerializeToString() + + +def _temperature(params: dict[str, Any]) -> bytes: + temp = params.get("HVAC_set_temp") + if not (isinstance(temp, (int, float)) and (16 <= temp <= 29 or temp in (0, 63.5))): + raise RivianBadRequestError( + "Temperature must be between 16 and 29 or 0/63.5 for LO/HI" + ) + return comfort_pb2.PreconditioningTemperatureRequest( + temperature=temp + ).SerializeToString() + + +def _charge_limit(params: dict[str, Any]) -> bytes: + limit = params.get("SOC_limit") + if not (isinstance(limit, int) and 50 <= limit <= 100): + raise RivianBadRequestError("Charging limit must be between 50 and 100") + return charging_pb2.ChargeLimitRequest(limit=limit).SerializeToString() + + +def _seat( + surface: comfort_pb2.CabinSurface, + type_: comfort_pb2.ConditioningType = comfort_pb2.CONDITIONING_HEAT, +) -> tuple[str, str, _Build]: + return ( + _COMFORT, + "comfort.cabin.set_cabin_surface", + _surface(surface, type_, _SEAT_LEVELS), + ) + + +_COMMANDS: dict[str, tuple[str, str, _Build]] = { + VehicleCommand.LOCK_ALL_CLOSURES_FEEDBACK: (_BODY, LOCK_RVM, _empty), + VehicleCommand.UNLOCK_ALL_CLOSURES: (_BODY, UNLOCK_RVM, _unlock), + VehicleCommand.OPEN_ALL_WINDOWS: ( + _BODY, + "body.closures.open", + _closure(body_pb2.GROUP_WINDOWS), + ), + VehicleCommand.CLOSE_ALL_WINDOWS: ( + _BODY, + "body.closures.close", + _closure(body_pb2.GROUP_WINDOWS), + ), + VehicleCommand.OPEN_FRUNK: (_BODY, "body.closures.open", _closure(body_pb2.FRUNK)), + VehicleCommand.CLOSE_FRUNK: ( + _BODY, + "body.closures.close", + _closure(body_pb2.FRUNK), + ), + # Vehicles without LIFTGATE_CMD, e.g. an R1T's tailgate, keep the old command + VehicleCommand.OPEN_LIFTGATE_UNLATCH_TAILGATE: ( + _LIFTGATE, + "body.closures.open", + _closure(body_pb2.LIFTGATE), + ), + VehicleCommand.CLOSE_LIFTGATE: ( + _LIFTGATE, + "body.closures.close", + _closure(body_pb2.LIFTGATE), + ), + VehicleCommand.OPEN_CHARGE_PORT_DOOR: ( + _BODY, + "body.closures.open", + _closure(body_pb2.CHARGE_PORT), + ), + VehicleCommand.CLOSE_CHARGE_PORT_DOOR: ( + _BODY, + "body.closures.close", + _closure(body_pb2.CHARGE_PORT), + ), + VehicleCommand.PANIC_ON: (_SECURITY, "security.alarm.enable_panic", _empty), + VehicleCommand.PANIC_OFF: (_SECURITY, "security.alarm.disable_panic", _empty), + VehicleCommand.ENABLE_GEAR_GUARD_VIDEO: ( + _SECURITY, + "security.video_monitoring.enable_video_monitoring", + _empty, + ), + VehicleCommand.DISABLE_GEAR_GUARD_VIDEO: ( + _SECURITY, + "security.video_monitoring.disable_video_monitoring", + _empty, + ), + VehicleCommand.VEHICLE_CABIN_PRECONDITION_ENABLE: ( + _COMFORT, + "comfort.cabin.enable_preconditioning", + _empty, + ), + VehicleCommand.VEHICLE_CABIN_PRECONDITION_DISABLE: ( + _COMFORT, + "comfort.cabin.disable_preconditioning", + _empty, + ), + VehicleCommand.CABIN_PRECONDITIONING_SET_TEMP: ( + _COMFORT, + "comfort.cabin.set_preconditioning_temperature", + _temperature, + ), + VehicleCommand.CABIN_HVAC_DEFROST_DEFOG: ( + _COMFORT, + "comfort.cabin.set_defrost_defog", + _defrost, + ), + VehicleCommand.CABIN_HVAC_LEFT_SEAT_HEAT: _seat(comfort_pb2.SEAT_ROW_1_LEFT), + VehicleCommand.CABIN_HVAC_RIGHT_SEAT_HEAT: _seat(comfort_pb2.SEAT_ROW_1_RIGHT), + VehicleCommand.CABIN_HVAC_LEFT_SEAT_VENT: _seat(comfort_pb2.SEAT_ROW_1_LEFT, _VENT), + VehicleCommand.CABIN_HVAC_RIGHT_SEAT_VENT: _seat( + comfort_pb2.SEAT_ROW_1_RIGHT, _VENT + ), + VehicleCommand.CABIN_HVAC_REAR_LEFT_SEAT_HEAT: _seat(comfort_pb2.SEAT_ROW_2_LEFT), + VehicleCommand.CABIN_HVAC_REAR_RIGHT_SEAT_HEAT: _seat(comfort_pb2.SEAT_ROW_2_RIGHT), + VehicleCommand.CABIN_HVAC_3RD_ROW_REAR_LEFT_SEAT_HEAT: _seat( + comfort_pb2.SEAT_ROW_3_LEFT + ), + VehicleCommand.CABIN_HVAC_3RD_ROW_REAR_RIGHT_SEAT_HEAT: _seat( + comfort_pb2.SEAT_ROW_3_RIGHT + ), + VehicleCommand.CABIN_HVAC_STEERING_HEAT: ( + _COMFORT, + "comfort.cabin.set_cabin_surface", + _surface( + comfort_pb2.STEERING_WHEEL, comfort_pb2.CONDITIONING_HEAT, _WHEEL_LEVELS + ), + ), + VehicleCommand.START_CHARGING: (_ENERGY, "charging.energy.start_charging", _empty), + VehicleCommand.STOP_CHARGING: (_ENERGY, "charging.energy.stop_charging", _empty), + VehicleCommand.CHARGING_LIMITS: ( + _ENERGY, + "charging.energy.set_charge_limit", + _charge_limit, + ), +} + + +def vehicle_command_feature(command: VehicleCommand | str) -> str | None: + """Return the supported feature that sends a command over Parallax. + + None if the command has no Parallax equivalent, e.g. honk or wake. + """ + return entry[0] if (entry := _COMMANDS.get(command)) else None + + +def encode_vehicle_command( + command: VehicleCommand | str, + params: dict[str, Any] | None = None, +) -> tuple[str, bytes]: + """Return the RVM and payload for a command's Parallax equivalent. + + `params` are those of `send_vehicle_command`. + """ + if not (entry := _COMMANDS.get(command)): + raise RivianBadRequestError(f"{command} has no Parallax equivalent") + _, rvm, build = entry + return rvm, build(params or {}) diff --git a/tests/parallax/test_vehicle_command.py b/tests/parallax/test_vehicle_command.py new file mode 100644 index 0000000..9fca893 --- /dev/null +++ b/tests/parallax/test_vehicle_command.py @@ -0,0 +1,127 @@ +"""Tests for the Parallax equivalents of vehicle commands.""" + +from __future__ import annotations + +from typing import Any + +import pytest + +from rivian import VehicleCommand +from rivian.exceptions import RivianBadRequestError +from rivian.parallax import encode_vehicle_command, vehicle_command_feature + + +@pytest.mark.parametrize( + ("command", "params", "rvm", "payload"), + [ + (VehicleCommand.LOCK_ALL_CLOSURES_FEEDBACK, None, "body.locks.lock", b""), + ( + VehicleCommand.UNLOCK_ALL_CLOSURES, + None, + "body.locks.unlock", + b"\x08\x01", + ), + ( + VehicleCommand.OPEN_ALL_WINDOWS, + None, + "body.closures.open", + b"\x0a\x02\x90\x4e", + ), + ( + VehicleCommand.CLOSE_FRUNK, + None, + "body.closures.close", + b"\x0a\x01\x05", + ), + ( + VehicleCommand.OPEN_LIFTGATE_UNLATCH_TAILGATE, + None, + "body.closures.open", + b"\x0a\x01\x07", + ), + (VehicleCommand.PANIC_ON, None, "security.alarm.enable_panic", b""), + ( + VehicleCommand.CABIN_PRECONDITIONING_SET_TEMP, + {"HVAC_set_temp": 21.0}, + "comfort.cabin.set_preconditioning_temperature", + b"\x0d\x00\x00\xa8\x41", + ), + ( + VehicleCommand.CABIN_PRECONDITIONING_SET_TEMP, + {"HVAC_set_temp": 0}, + "comfort.cabin.set_preconditioning_temperature", + b"\x0d\x00\x00\x00\x00", + ), + ( + VehicleCommand.CABIN_HVAC_LEFT_SEAT_HEAT, + {"level": 2}, + "comfort.cabin.set_cabin_surface", + b"\x08\x05\x10\x01\x18\x02\x20\x01", + ), + ( + VehicleCommand.CABIN_HVAC_STEERING_HEAT, + {"level": 0}, + "comfort.cabin.set_cabin_surface", + b"\x08\x01\x18\x01\x20\x01", + ), + ( + VehicleCommand.CABIN_HVAC_DEFROST_DEFOG, + {"level": 1}, + "comfort.cabin.set_defrost_defog", + b"\x08\x03", + ), + ( + VehicleCommand.CABIN_HVAC_DEFROST_DEFOG, + {"level": 0}, + "comfort.cabin.set_defrost_defog", + b"\x08\x04", + ), + ( + VehicleCommand.CHARGING_LIMITS, + {"SOC_limit": 80}, + "charging.energy.set_charge_limit", + b"\x08\x50", + ), + ], +) +def test_encode( + command: VehicleCommand, + params: dict[str, Any] | None, + rvm: str, + payload: bytes, +) -> None: + """Commands encode like the Rivian app's.""" + assert encode_vehicle_command(command, params) == (rvm, payload) + + +def test_feature() -> None: + """Each command is sent over Parallax per its category's feature.""" + assert vehicle_command_feature(VehicleCommand.UNLOCK_ALL_CLOSURES) == "PVS_BD_CMD" + assert vehicle_command_feature(VehicleCommand.PANIC_OFF) == "PVS_SEC_CMD" + assert ( + vehicle_command_feature(VehicleCommand.CABIN_HVAC_LEFT_SEAT_VENT) + == "PVS_COMF_CMD" + ) + assert vehicle_command_feature(VehicleCommand.START_CHARGING) == "PVS_ENRG_CMD" + assert vehicle_command_feature(VehicleCommand.CLOSE_LIFTGATE) == "LIFTGATE_CMD" + assert vehicle_command_feature(VehicleCommand.WAKE_VEHICLE) is None + assert vehicle_command_feature("NOT_A_COMMAND") is None + + +@pytest.mark.parametrize( + ("command", "params"), + [ + (VehicleCommand.WAKE_VEHICLE, None), + (VehicleCommand.CABIN_HVAC_LEFT_SEAT_HEAT, {"level": 1}), + (VehicleCommand.CABIN_HVAC_STEERING_HEAT, {"level": 4}), + (VehicleCommand.CABIN_PRECONDITIONING_SET_TEMP, {"HVAC_set_temp": 30}), + (VehicleCommand.CHARGING_LIMITS, {"SOC_limit": 40}), + (VehicleCommand.CHARGING_LIMITS, None), + (VehicleCommand.CHARGING_LIMITS, {"SOC_limit": 80.5}), + (VehicleCommand.CABIN_PRECONDITIONING_SET_TEMP, {"HVAC_set_temp": "warm"}), + ], +) +def test_invalid(command: VehicleCommand, params: dict[str, Any] | None) -> None: + """Commands without an equivalent, or with invalid params, are rejected.""" + with pytest.raises(RivianBadRequestError): + encode_vehicle_command(command, params)