Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 16 additions & 6 deletions src/rivian/parallax/departure.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,19 @@ def _decode_schedule(schedule: _Schedules.Schedule) -> dict[str, Any]:
entry["name"] = v
entry["isEnabled"] = schedule.is_enabled

occurrence = schedule.occurrence
entry["occurrence"] = {
"days": [day for field, day in _WEEKDAYS if getattr(occurrence.days, field)],
"startsAtMin": occurrence.starts_at,
}
if schedule.HasField("single_occurrence"):
starts_at = schedule.single_occurrence.starts_at
entry["occurrence"] = {
"startsAt": from_epoch(starts_at.seconds + starts_at.nanos / 1e9)
}
else:
occurrence = schedule.occurrence
entry["occurrence"] = {
"days": [
day for field, day in _WEEKDAYS if getattr(occurrence.days, field)
],
"startsAtMin": occurrence.starts_at,
}

settings = schedule.departure_settings
comfort = settings.comfort_settings
Expand Down Expand Up @@ -87,7 +95,9 @@ def decode_departure_schedules(m: departure_pb2.DepartureSchedules) -> dict[str,
departureSchedules: list[dict] — the gateway's DepartureSchedule shape:
id: str, name: str, isEnabled: bool
occurrence: {"days": list[str] ("monday" ... "sunday"; order
inferred), "startsAtMin": int (minutes after local midnight)}
inferred), "startsAtMin": int (minutes after local midnight)},
or {"startsAt": datetime} for the one-off "s-" schedule a
departNow adds (departing 10 minutes after the call)
departureSettings: {"shouldOverrideChargeSchedule": bool,
"comfortSettings": {"cabinTempCelsius": float,
"frontDefogDefrost": "off" | "defog" | "defrost",
Expand Down
12 changes: 12 additions & 0 deletions src/rivian/parallax/proto/departure.proto
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,21 @@ message DepartureSchedules {
optional string name = 2;
bool is_enabled = 3;
Occurrence occurrence = 4;
// Set instead of occurrence on the one-off "s-" schedule a departNow
// adds; the gateway leaves that schedule out.
SingleOccurrence single_occurrence = 5;
DepartureSettings departure_settings = 6;
}

message SingleOccurrence {
StartsAt starts_at = 1;

message StartsAt {
int64 seconds = 1; // epoch seconds
int32 nanos = 2;
}
}

message Occurrence {
Days days = 1;
optional int32 starts_at = 2; // minutes after local midnight
Expand Down
42 changes: 23 additions & 19 deletions src/rivian/parallax/proto/departure_pb2.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

18 changes: 16 additions & 2 deletions src/rivian/parallax/proto/departure_pb2.pyi

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions tests/parallax/test_departure.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,23 @@ def test_departure_schedules() -> None:
}


def test_departure_schedules_single_occurrence() -> None:
"""The one-off departNow schedule has a start time instead of days."""
schedule = Schedules.Schedule(
id="s-1",
is_enabled=True,
single_occurrence=Schedules.SingleOccurrence(
starts_at=Schedules.SingleOccurrence.StartsAt(
seconds=1791761210, nanos=959000000
)
),
)
result = decode("departure.schedule.schedule", Schedules(schedule=[schedule]))
assert result["departureSchedules"][0]["occurrence"] == {
"startsAt": epoch(1791761210_959)
}


def test_departure_schedules_empty() -> None:
"""No schedules reads as an empty list."""
assert decode("departure.schedule.schedule") == {"departureSchedules": []}
Loading