Add parsing of values
This commit is contained in:
29
Cargo.lock
generated
29
Cargo.lock
generated
@@ -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"
|
||||
|
||||
@@ -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"] }
|
||||
|
||||
43
src/index.html
Normal file
43
src/index.html
Normal file
@@ -0,0 +1,43 @@
|
||||
<!doctype html>
|
||||
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/purecss@3.0.0/build/pure-min.css" integrity="sha384-X38yfunGUhNzHpBaEBsWLO+A0HDYOQi8ufWDkZ0k9e0eXz/tH3II7uKZ9msv++Ls" crossorigin="anonymous">
|
||||
|
||||
<title>ELWA DC Heizstab</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h2>Wasser</h2>
|
||||
<p>Temperatur: {0} °C</p>
|
||||
<p>Temperatur Min: {1} °C</p>
|
||||
<p>Temperatur Max: {2} °C</p>
|
||||
<p>Solltemperatur Solar: {3} °C</p>
|
||||
<p>Solltemperatur Netz: {4} °C</p>
|
||||
|
||||
<h2>Solar aktuell</h2>
|
||||
<p>Spannung: {5} V</p>
|
||||
<p>Strom: {6} A</p>
|
||||
<p>Leistung: {7} kW</p>
|
||||
|
||||
<h2>Historie</h2>
|
||||
<p>Solarenergie Heute: {8} kWh</p>
|
||||
<p>Solarenergie Gesamt: {9} kWh</p>
|
||||
<p>Netzenergie Heute: {10} kWh</p>
|
||||
|
||||
<h2>Zustand</h2>
|
||||
<p>Isolationsmessung: {11}</p>
|
||||
<p>Gerätetemperatur: {12}</p>
|
||||
<p>Status: {13}</p>
|
||||
<p>DC Trenner: {14}</p>
|
||||
<p>DC Relais: {15}</p>
|
||||
<p>AC Relais: {16}</p>
|
||||
|
||||
<h2>Misc</h2>
|
||||
<p>Betriebstag: {17}</p>
|
||||
<p>Firmware: {18}</p>
|
||||
<p>Seriennummer: {19}</p>
|
||||
</body>
|
||||
</html>
|
||||
173
src/main.rs
173
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<String> {
|
||||
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::<u8>(value).unwrap() != 0,
|
||||
StatusTag::DcRelais => status.dc_relais = str::parse::<u8>(value).unwrap() != 0,
|
||||
StatusTag::AcRelais => status.ac_relais = str::parse::<u8>(value).unwrap() != 0,
|
||||
StatusTag::Wassertemp => status.wassertemp = str::parse::<f32>(value).unwrap() / 10.0,
|
||||
StatusTag::WassertempMin => {
|
||||
status.wassertemp_min = str::parse::<f32>(value).unwrap() / 10.0
|
||||
}
|
||||
StatusTag::WassertempMax => {
|
||||
status.wassertemp_max = str::parse::<f32>(value).unwrap() / 10.0
|
||||
}
|
||||
StatusTag::SolltempSolar => {
|
||||
status.solltemp_solar = str::parse::<f32>(value).unwrap() / 10.0
|
||||
}
|
||||
StatusTag::SolltempNetz => {
|
||||
status.solltemp_netz = str::parse::<f32>(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::<f32>(value).unwrap(),
|
||||
StatusTag::Solarstrom => status.solarstrom = str::parse::<f32>(value).unwrap(),
|
||||
StatusTag::Solarleistung => {
|
||||
status.solarleistung = str::parse::<f32>(value).unwrap() / 1000.0
|
||||
}
|
||||
StatusTag::SolarenergieHeute => {
|
||||
status.solarenergie_heute = str::parse::<f32>(value).unwrap() / 1000.0
|
||||
}
|
||||
StatusTag::SolarenergieGesamt => {
|
||||
status.solarenergie_gesamt = str::parse::<f32>(value).unwrap() / 1000.0
|
||||
}
|
||||
StatusTag::NetzenergieHeute => {
|
||||
status.netzenergie_heute = str::parse::<f32>(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"))]
|
||||
|
||||
Reference in New Issue
Block a user