From 56ee85b677f1cad8e6ce8aa0e38d1acbce1032f1 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Sun, 19 Nov 2023 12:22:35 +0100 Subject: [PATCH] Add parsing of values --- Cargo.lock | 29 +++++++++ Cargo.toml | 1 + src/index.html | 43 ++++++++++++ src/main.rs | 173 ++++++++++++++++++++++++++++++++++++++----------- 4 files changed, 207 insertions(+), 39 deletions(-) create mode 100644 src/index.html diff --git a/Cargo.lock b/Cargo.lock index d608cde..973f903 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -175,6 +175,7 @@ dependencies = [ "base64", "log", "serialport", + "strum", "tokio", ] @@ -232,6 +233,12 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "hermit-abi" version = "0.3.3" @@ -688,6 +695,28 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.25.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn", +] + [[package]] name = "syn" version = "2.0.39" diff --git a/Cargo.toml b/Cargo.toml index db21efe..e0c5214 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,4 +11,5 @@ axum = "0.6.20" base64 = "0.21.5" log = "0.4.20" serialport = "4.2.2" +strum = { version = "0.25.0", features = ["derive"] } tokio = { version = "1.34.0", features = ["full"] } diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..518ecf1 --- /dev/null +++ b/src/index.html @@ -0,0 +1,43 @@ + + + + + + + + + ELWA DC Heizstab + + + +

Wasser

+

Temperatur: {0} °C

+

Temperatur Min: {1} °C

+

Temperatur Max: {2} °C

+

Solltemperatur Solar: {3} °C

+

Solltemperatur Netz: {4} °C

+ +

Solar aktuell

+

Spannung: {5} V

+

Strom: {6} A

+

Leistung: {7} kW

+ +

Historie

+

Solarenergie Heute: {8} kWh

+

Solarenergie Gesamt: {9} kWh

+

Netzenergie Heute: {10} kWh

+ +

Zustand

+

Isolationsmessung: {11}

+

Gerätetemperatur: {12}

+

Status: {13}

+

DC Trenner: {14}

+

DC Relais: {15}

+

AC Relais: {16}

+ +

Misc

+

Betriebstag: {17}

+

Firmware: {18}

+

Seriennummer: {19}

+ + \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 349387e..582b75d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,60 +1,155 @@ -use axum::{routing::get, Router}; +use axum::{response::Html, routing::get, Router}; +use strum::{EnumIter, IntoEnumIterator}; -const STATUS_KEYS: &'static [&str] = &[ - "dummy0", - "firmware", - "Betriebstag", - "Status", - "DcTrenner", - "DcRelais", - "AcRelais", - "Wassertemp", - "WassertempMin", - "WassertempMax", - "SolltempSolar", - "SolltempNetz", - "GeraeteTemp", - "IsoMessung", - "Solarspannung", - "dummy5", - "Solarstrom", - "Solarleistung", - "SolarenergieHeute", - "SolarenergieGesammt", - "Netzernergie", - "dummy6", - "dummy7", - "dummy8", - "dummy9", - "dummy10", - "dummy11", - "dummy12", - "Seriennummer", - "dummy13", -]; +#[derive(EnumIter, Debug)] +enum StatusTag { + Dummy0, + Firmware, + Betriebstag, + Status, + DcTrenner, + DcRelais, + AcRelais, + Wassertemp, + WassertempMin, + WassertempMax, + SolltempSolar, + SolltempNetz, + GeraeteTemp, + IsoMessung, + Solarspannung, + Dummy5, + Solarstrom, + Solarleistung, + SolarenergieHeute, + SolarenergieGesamt, + NetzenergieHeute, + Dummy6, + Dummy7, + Dummy8, + Dummy9, + Dummy10, + Dummy11, + Dummy12, + Seriennummer, + Dummy13, +} + +#[derive(Default, Debug)] +struct Status<'a> { + // Wasser + wassertemp: f32, + wassertemp_min: f32, + wassertemp_max: f32, + solltemp_solar: f32, + solltemp_netz: f32, + + // Solar aktuell + solarspannung: f32, + solarstrom: f32, + solarleistung: f32, + + // Historie + solarenergie_heute: f32, + solarenergie_gesamt: f32, + netzenergie_heute: f32, + + // Zustand + iso_messung: u32, + geraetetemp: u32, + status: u32, + dc_trenner: bool, + dc_relais: bool, + ac_relais: bool, + + // Misc + betriebstag: u32, + firmware: &'a str, + seriennummer: &'a str, +} #[tokio::main] async fn main() { let app = Router::new().route("/", get(handler)); - axum::Server::bind(&"0.0.0.0:3001".parse().unwrap()) + axum::Server::bind(&"0.0.0.0:3000".parse().unwrap()) .serve(app.into_make_service()) .await .unwrap(); } -async fn handler() -> String { +async fn handler() -> Html { log::info!("Fetch new data"); let data = read_device(); let data_string = std::str::from_utf8(&data).unwrap(); - let mut current_status = String::new(); - for (value, &key) in data_string.split('\t').zip(STATUS_KEYS.iter()) { - current_status.push_str(&format!("{key}: {value}\n")); + let mut status = Status::default(); + for (value, tag) in data_string.split('\t').zip(StatusTag::iter()) { + match tag { + StatusTag::Firmware => status.firmware = value, + StatusTag::Betriebstag => status.betriebstag = str::parse(value).unwrap(), + StatusTag::Status => status.status = str::parse(value).unwrap(), + StatusTag::DcTrenner => status.dc_trenner = str::parse::(value).unwrap() != 0, + StatusTag::DcRelais => status.dc_relais = str::parse::(value).unwrap() != 0, + StatusTag::AcRelais => status.ac_relais = str::parse::(value).unwrap() != 0, + StatusTag::Wassertemp => status.wassertemp = str::parse::(value).unwrap() / 10.0, + StatusTag::WassertempMin => { + status.wassertemp_min = str::parse::(value).unwrap() / 10.0 + } + StatusTag::WassertempMax => { + status.wassertemp_max = str::parse::(value).unwrap() / 10.0 + } + StatusTag::SolltempSolar => { + status.solltemp_solar = str::parse::(value).unwrap() / 10.0 + } + StatusTag::SolltempNetz => { + status.solltemp_netz = str::parse::(value).unwrap() / 10.0 + } + StatusTag::GeraeteTemp => status.geraetetemp = str::parse(value).unwrap(), + StatusTag::IsoMessung => status.iso_messung = str::parse(value).unwrap(), + StatusTag::Solarspannung => status.solarspannung = str::parse::(value).unwrap(), + StatusTag::Solarstrom => status.solarstrom = str::parse::(value).unwrap(), + StatusTag::Solarleistung => { + status.solarleistung = str::parse::(value).unwrap() / 1000.0 + } + StatusTag::SolarenergieHeute => { + status.solarenergie_heute = str::parse::(value).unwrap() / 1000.0 + } + StatusTag::SolarenergieGesamt => { + status.solarenergie_gesamt = str::parse::(value).unwrap() / 1000.0 + } + StatusTag::NetzenergieHeute => { + status.netzenergie_heute = str::parse::(value).unwrap() / 1000.0 + } + StatusTag::Seriennummer => status.seriennummer = value, + _ => (), + } } - current_status + Html(format!( + include_str!("index.html"), + status.wassertemp, + status.wassertemp_min, + status.wassertemp_max, + status.solltemp_solar, + status.solltemp_netz, + status.solarspannung, + status.solarstrom, + status.solarleistung, + status.solarenergie_heute, + status.solarenergie_gesamt, + status.netzenergie_heute, + status.iso_messung, + status.geraetetemp, + status.status, + status.dc_trenner, + status.dc_relais, + status.ac_relais, + status.betriebstag, + status.firmware, + status.seriennummer, + )) } #[cfg(not(feature = "dummy"))]