teslatte/
powerwall.rs

1use crate::energy_sites::{HistoryKind, HistoryPeriod};
2use crate::products::GatewayId;
3use crate::{join_query_pairs, pub_get_arg, pub_get_args, rfc3339, ApiValues, OwnerApi};
4use chrono::{DateTime, FixedOffset};
5use derive_more::{Display, FromStr};
6use serde::{Deserialize, Serialize};
7
8#[rustfmt::skip]
9impl OwnerApi {
10    pub_get_arg!(powerwall_status, PowerwallStatus, "/powerwalls/{}/status", PowerwallId);
11    pub_get_args!(powerwall_energy_history, PowerwallEnergyHistory, "/powerwalls/{}/energyhistory", PowerwallEnergyHistoryValues);
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize, Display, FromStr)]
15pub struct PowerwallId(pub String);
16
17#[derive(Debug, Clone, Deserialize)]
18pub struct PowerwallStatus {
19    pub site_name: String,
20    pub id: GatewayId,
21    pub energy_left: f64,
22    pub total_pack_energy: i64,
23    pub percentage_charged: f64,
24    pub battery_power: i64,
25}
26
27#[derive(Debug, Clone)]
28pub struct PowerwallEnergyHistoryValues {
29    pub powerwall_id: PowerwallId,
30    pub period: HistoryPeriod,
31    pub kind: HistoryKind,
32    pub start_date: Option<DateTime<FixedOffset>>,
33    pub end_date: Option<DateTime<FixedOffset>>,
34}
35
36impl ApiValues for PowerwallEnergyHistoryValues {
37    fn format(&self, url: &str) -> String {
38        let url = url.replace("{}", &self.powerwall_id.0.to_string());
39        let mut pairs: Vec<(&str, String)> = vec![
40            ("period", self.period.to_string()),
41            ("kind", self.kind.to_string()),
42        ];
43        if let Some(start_date) = self.start_date {
44            let start_date = rfc3339(&start_date);
45            pairs.push(("start_date", start_date));
46        }
47        if let Some(end_date) = self.end_date {
48            let end_date = rfc3339(&end_date);
49            pairs.push(("end_date", end_date));
50        }
51        format!("{}?{}", url, join_query_pairs(&pairs))
52    }
53}
54
55#[derive(Debug, Clone, Deserialize)]
56pub struct PowerwallEnergyHistory {}