diff --git a/rust/src/main.rs b/rust/src/main.rs index d628a11..59251ae 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -98,7 +98,7 @@ enum SensorError { OpenCircuit { hz: f32, min: f32 }, } -#[derive(Serialize, Deserialize, Copy, Clone, Debug, PartialEq, Default)] +#[derive(Copy, Clone, Debug, PartialEq, Default)] struct TankState { enough_water: bool, warn_level: bool, @@ -106,6 +106,16 @@ struct TankState { sensor_error: bool, raw: u16, } +#[derive(Serialize)] +struct TankStateMQTT { + enough_water: bool, + warn_level: bool, + left_ml: u32, + sensor_error: bool, + raw: u16, + water_frozen: String +} + #[derive(Serialize)] struct PlantStateMQTT<'a> { a: &'a str, @@ -355,18 +365,16 @@ fn safe_main() -> anyhow::Result<()> { } let tank_state = determine_tank_state(&mut board, &config); - if online_mode == OnlineMode::Online { - match serde_json::to_string(&tank_state) { - Ok(state) => { - let _ = board.mqtt_publish(&config, "/water", state.as_bytes()); - } - Err(err) => { - println!("Error publishing lightstate {}", err); - } - }; - } - + let mut tank_state_mqtt = TankStateMQTT{ + enough_water : tank_state.enough_water, + left_ml : tank_state.left_ml, + warn_level : tank_state.warn_level, + sensor_error: tank_state.sensor_error, + raw: tank_state.raw, + water_frozen: "".to_owned() + }; let mut water_frozen = false; + let mut temp: Option = None; for _attempt in 0..5 { let water_temperature = board.water_temperature_c(); @@ -386,23 +394,24 @@ fn safe_main() -> anyhow::Result<()> { if res < 4_f32 { water_frozen = true; } - if online_mode == OnlineMode::Online { - let _ = - board.mqtt_publish(&config, "/water/temperature", res.to_string().as_bytes()); - let _ = board.mqtt_publish( - &config, - "/water/frozen", - water_frozen.to_string().as_bytes(), - ); - } + tank_state_mqtt.water_frozen = water_frozen.to_string(); } None => { - if online_mode == OnlineMode::Online { - let _ = board.mqtt_publish(&config, "/water/temperature", "Error".as_bytes()); - } + tank_state_mqtt.water_frozen = "tank sensor error".to_owned() } } + if online_mode == OnlineMode::Online { + match serde_json::to_string(&tank_state_mqtt) { + Ok(state) => { + let _ = board.mqtt_publish(&config, "/water", state.as_bytes()); + } + Err(err) => { + println!("Error publishing tankstate {}", err); + } + }; + } + let mut plantstate = [PlantState { ..Default::default() }; PLANT_COUNT]; @@ -622,7 +631,7 @@ fn publish_battery_state( }; match serde_json::to_string(&bat) { Ok(state) => { - let _ = board.mqtt_publish(&config, "/plant/battery", state.as_bytes()); + let _ = board.mqtt_publish(&config, "/battery", state.as_bytes()); } Err(err) => { println!("Error publishing battery_state {}", err);