Skip to content

Commit b70137a

Browse files
committed
New EV data REST API
1 parent 2d4fafd commit b70137a

File tree

2 files changed

+62
-52
lines changed

2 files changed

+62
-52
lines changed

src/ev.rs

Lines changed: 42 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>
2525

2626
#[derive(Debug, Deserialize)]
2727
pub struct BatteryData {
28-
pub battery_level: f32,
28+
pub battery_level_percentage: Option<f32>,
29+
pub battery_level_wh: Option<u64>,
30+
pub battery_capacity_wh: Option<u64>,
31+
pub reference_air_density: Option<f32>,
32+
pub external_temp_celsius: Option<f32>,
2933
}
3034

3135
fn scale_percent_to_value(percent: f32, max_value: u64) -> u64 {
@@ -34,13 +38,7 @@ fn scale_percent_to_value(percent: f32, max_value: u64) -> u64 {
3438
}
3539

3640
/// EV sensor batch data send
37-
pub async fn send_ev_data(
38-
tx: Sender<Packet>,
39-
level: f32,
40-
sensor_ch: u8,
41-
ev_battery_capacity: u64,
42-
ev_factor: f32,
43-
) -> Result<()> {
41+
pub async fn send_ev_data(tx: Sender<Packet>, sensor_ch: u8, batt: BatteryData) -> Result<()> {
4442
// obtain binary model data
4543
let model_path: PathBuf = PathBuf::from(EV_MODEL_FILE);
4644
let data = if fs::try_exists(&model_path).await? {
@@ -55,42 +53,42 @@ pub async fn send_ev_data(
5553
let mut msg = SensorBatch::parse_from_bytes(&data)?;
5654

5755
// apply our changes
58-
msg.energy_model_control[0].u1.as_mut().unwrap().u6 = 1.0;
59-
msg.energy_model_control[0]
60-
.u1
61-
.as_mut()
62-
.unwrap()
63-
.u2
64-
.as_mut()
65-
.unwrap()
66-
.u1 = 1;
67-
msg.energy_model_control[0]
68-
.u2
69-
.as_mut()
70-
.unwrap()
71-
.u3
72-
.as_mut()
73-
.unwrap()
74-
.u1 = ev_factor;
75-
76-
// kwh in battery?
77-
msg.energy_model_control[0]
78-
.u1
79-
.as_mut()
80-
.unwrap()
81-
.u3
82-
.as_mut()
83-
.unwrap()
84-
.u1 = scale_percent_to_value(level, ev_battery_capacity);
85-
// max battery kwh?
86-
msg.energy_model_control[0]
87-
.u1
88-
.as_mut()
89-
.unwrap()
90-
.u4
91-
.as_mut()
92-
.unwrap()
93-
.u1 = ev_battery_capacity;
56+
if let Some(capacity_wh) = batt.battery_capacity_wh {
57+
msg.energy_model_control[0]
58+
.u1
59+
.as_mut()
60+
.unwrap()
61+
.u4
62+
.as_mut()
63+
.unwrap()
64+
.u1 = capacity_wh;
65+
}
66+
if let Some(level_wh) = batt.battery_level_wh {
67+
msg.energy_model_control[0]
68+
.u1
69+
.as_mut()
70+
.unwrap()
71+
.u3
72+
.as_mut()
73+
.unwrap()
74+
.u1 = level_wh;
75+
}
76+
if let Some(level) = batt.battery_level_percentage {
77+
msg.energy_model_control[0]
78+
.u1
79+
.as_mut()
80+
.unwrap()
81+
.u3
82+
.as_mut()
83+
.unwrap()
84+
.u1 = scale_percent_to_value(level, msg.energy_model_control[0].u1.u4.u1);
85+
}
86+
if let Some(reference_air_density) = batt.reference_air_density {
87+
msg.energy_model_control[0].u1.as_mut().unwrap().u6 = reference_air_density;
88+
}
89+
if let Some(external_temp_celsius) = batt.external_temp_celsius {
90+
msg.energy_model_control[0].u1.as_mut().unwrap().u7 = external_temp_celsius;
91+
}
9492

9593
// creating back binary data for sending
9694
let mut payload: Vec<u8> = msg.write_to_bytes()?;

src/web.rs

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,19 +61,31 @@ pub async fn battery_handler(
6161
State(state): State<Arc<AppState>>,
6262
Json(data): Json<BatteryData>,
6363
) -> impl IntoResponse {
64-
if data.battery_level < 0.0 || data.battery_level > 100.0 {
65-
let msg = format!(
66-
"battery_level out of range: {} (expected 0.0–100.0)",
67-
data.battery_level
68-
);
69-
return (StatusCode::BAD_REQUEST, msg).into_response();
64+
match data.battery_level_percentage {
65+
Some(level) => {
66+
if level < 0.0 || level > 100.0 {
67+
let msg = format!(
68+
"battery_level_percentage out of range: {} (expected 0.0–100.0)",
69+
level
70+
);
71+
return (StatusCode::BAD_REQUEST, msg).into_response();
72+
}
73+
}
74+
None => {
75+
if data.battery_level_wh.is_none() {
76+
let msg = format!(
77+
"Either `battery_level_percentage` or `battery_level_wh` has to be set",
78+
);
79+
return (StatusCode::BAD_REQUEST, msg).into_response();
80+
}
81+
}
7082
}
7183

72-
info!("{} Received battery level: {}", NAME, data.battery_level);
84+
info!("{} Received battery data: {:?}", NAME, data);
7385

7486
if let Some(ch) = *state.sensor_channel.lock().await {
7587
if let Some(tx) = state.tx.lock().await.clone() {
76-
if let Err(e) = send_ev_data(tx.clone(), data.battery_level, ch, 0, 0.0).await {
88+
if let Err(e) = send_ev_data(tx.clone(), ch, data).await {
7789
error!("{} EV model error: {}", NAME, e);
7890
}
7991
}

0 commit comments

Comments
 (0)