polestar_api/models/
telemetry.rs

1//! Telemetry data models.
2
3use serde::{Deserialize, Serialize};
4
5/// Complete telemetry response from the API.
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct Telemetry {
8    /// Battery and charging information.
9    #[serde(flatten)]
10    pub battery: Battery,
11
12    /// Odometer and speed information.
13    #[serde(flatten)]
14    pub odometer: Odometer,
15
16    /// Vehicle health and status.
17    #[serde(flatten)]
18    pub health: Health,
19
20    /// Event timestamp.
21    #[serde(rename = "eventUpdatedTimestamp")]
22    pub event_updated_timestamp: Option<Timestamp>,
23}
24
25/// Battery and charging data.
26#[derive(Debug, Clone, Serialize, Deserialize)]
27pub struct Battery {
28    /// Battery charge level as a percentage (0-100).
29    #[serde(rename = "batteryChargeLevelPercentage")]
30    pub charge_level_percentage: Option<f64>,
31
32    /// Current charging status (e.g., "charging", "idle").
33    #[serde(rename = "batteryChargeStatus")]
34    pub charge_status: Option<String>,
35
36    /// Current charging power in watts.
37    #[serde(rename = "chargingPowerWatts")]
38    pub charging_power_watts: Option<f64>,
39
40    /// Estimated time to full charge in minutes.
41    #[serde(rename = "estimatedChargingTimeToFullMinutes")]
42    pub estimated_charging_time_minutes: Option<i64>,
43
44    /// Estimated distance to empty in kilometers.
45    #[serde(rename = "estimatedDistanceToEmptyKm")]
46    pub estimated_distance_to_empty_km: Option<f64>,
47}
48
49/// Odometer and driving statistics.
50#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct Odometer {
52    /// Average speed in km/h.
53    #[serde(rename = "averageSpeedKmPerHour")]
54    pub average_speed_kmh: Option<f64>,
55
56    /// Total distance traveled in meters.
57    #[serde(rename = "odometerMeters")]
58    pub odometer_meters: Option<i64>,
59}
60
61/// Vehicle health and status information.
62#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct Health {
64    /// Service warning status.
65    #[serde(rename = "serviceWarningStatus")]
66    pub service_warning_status: Option<String>,
67
68    /// Internal vehicle identifier.
69    #[serde(rename = "internalVehicleIdentifier")]
70    pub internal_vehicle_identifier: Option<String>,
71}
72
73/// Timestamp in both ISO and Unix formats.
74#[derive(Debug, Clone, Serialize, Deserialize)]
75pub struct Timestamp {
76    /// ISO 8601 formatted timestamp.
77    pub iso: Option<String>,
78
79    /// Unix timestamp (seconds since epoch).
80    pub unix: Option<i64>,
81}
82
83#[cfg(test)]
84mod tests {
85    use super::*;
86
87    #[test]
88    fn test_battery_deserialization() {
89        let json = r#"{
90            "batteryChargeLevelPercentage": 85.5,
91            "batteryChargeStatus": "charging"
92        }"#;
93
94        let battery: Battery = serde_json::from_str(json).unwrap();
95        assert_eq!(battery.charge_level_percentage, Some(85.5));
96        assert_eq!(battery.charge_status, Some("charging".to_string()));
97    }
98
99    #[test]
100    fn test_battery_null_fields() {
101        let json = r#"{
102            "batteryChargeLevelPercentage": null
103        }"#;
104
105        let battery: Battery = serde_json::from_str(json).unwrap();
106        assert_eq!(battery.charge_level_percentage, None);
107    }
108}