actually improved webapp!!

This commit is contained in:
Alex Janka 2024-01-07 10:33:32 +11:00
parent dc4db5e5f9
commit 23f4871084
4 changed files with 43 additions and 6 deletions

2
Cargo.lock generated
View file

@ -1991,7 +1991,7 @@ dependencies = [
[[package]] [[package]]
name = "tesla-charge-controller" name = "tesla-charge-controller"
version = "0.1.2" version = "0.1.3"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",

View file

@ -1,6 +1,6 @@
[package] [package]
name = "tesla-charge-controller" name = "tesla-charge-controller"
version = "0.1.2" version = "0.1.3"
edition = "2021" edition = "2021"
license = "MITNFA" license = "MITNFA"
description = "Controls Tesla charge rate based on solar charge data" description = "Controls Tesla charge rate based on solar charge data"

View file

@ -5,9 +5,11 @@ pub struct ChargeState {
pub battery_level: i64, pub battery_level: i64,
pub battery_range: f64, pub battery_range: f64,
pub charge_amps: i64, pub charge_amps: i64,
pub charge_rate: f64,
pub charge_current_request: i64, pub charge_current_request: i64,
pub charge_current_request_max: i64, pub charge_current_request_max: i64,
pub charge_enable_request: bool, pub charge_enable_request: bool,
pub charge_limit_soc: i64,
} }
impl ChargeState { impl ChargeState {
@ -23,9 +25,11 @@ impl From<teslatte::vehicles::ChargeState> for ChargeState {
battery_level: value.battery_level, battery_level: value.battery_level,
battery_range: value.battery_range, battery_range: value.battery_range,
charge_amps: value.charge_amps, charge_amps: value.charge_amps,
charge_rate: value.charge_rate,
charge_current_request: value.charge_current_request, charge_current_request: value.charge_current_request,
charge_current_request_max: value.charge_current_request_max, charge_current_request_max: value.charge_current_request_max,
charge_enable_request: value.charge_enable_request, charge_enable_request: value.charge_enable_request,
charge_limit_soc: value.charge_limit_soc,
} }
} }
} }

View file

@ -4,37 +4,70 @@
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<title>Tesla Charge Control</title> <title>Tesla Charge Control</title>
<link id="favicon" rel="icon"
href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22></text></svg>">
<script type="text/javascript"> <script type="text/javascript">
const api_url = window.location.protocol + "//" + window.location.hostname + ":" + window.location.port; const api_url = window.location.protocol + "//" + window.location.hostname + ":" + window.location.port;
function register() {
refresh();
setInterval(refresh, 15000);
}
function flash() { function flash() {
fetch(api_url + "/flash", { method: "POST" }) fetch(api_url + "/flash", { method: "POST" })
.then((response) => console.log(response)); .then((response) => console.log(response));
} }
function refresh() { function refresh() {
let favicon = document.getElementById("favicon");
favicon.setAttribute("href", "data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>" + "⏳" + "</text></svg>");
fetch(api_url + "/charge-state") fetch(api_url + "/charge-state")
.then((response) => response.json()) .then((response) => response.json())
.then((json) => update_charge_state(json)); .then((json) => update_charge_state(json));
} }
function update_charge_state(charge_state) { function update_charge_state(charge_state) {
let favicon = document.getElementById("favicon");
favicon.setAttribute("href", "data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>" + get_emoji(charge_state) + "</text></svg>");
var info_div = document.getElementById("info"); var info_div = document.getElementById("info");
while (info_div.childElementCount > 0) { info_div.removeChild(info_div.firstChild) } while (info_div.childElementCount > 0) { info_div.removeChild(info_div.firstChild) }
var arr = ["Battery " + charge_state.battery_level + "%", "Range: " + (charge_state.battery_range * 1.60934).toFixed(1) + "km", "Charging at " + charge_state.charge_amps + " amps"];
var arr = ["Battery " + charge_state.battery_level + "%", "Range: " + (charge_state.battery_range * 1.60934).toFixed(1) + "km", "Charging at " + charge_state.charge_rate.toFixed(1) + " amps", "Charging until battery at " + charge_state.charge_limit_soc + "%",
];
for (line in arr) { for (line in arr) {
el = document.createElement('p'); el = document.createElement('p');
el.appendChild(document.createTextNode(arr[line])); el.appendChild(document.createTextNode(arr[line]));
info_div.appendChild(el) info_div.appendChild(el)
} }
el = document.createElement('p');
el.appendChild(document.createTextNode("Full charge state:"));
state_json = document.createElement('pre');
state_json.appendChild(document.createTextNode(JSON.stringify(charge_state, null, '\t')));
el.appendChild(state_json);
info_div.appendChild(el);
}
function get_emoji(charge_state) {
if (charge_state.charge_rate > 0) {
return "🔌";
} else if (charge_state.battery_level < 60) {
return "🪫"
} else return "🔋";
} }
</script> </script>
</head> </head>
<body></body> <body onload="register()"></body>
<button onclick="refresh()">refresh</button>
<div id="info"></div>
<button onclick="flash()">flash</button> <button onclick="flash()">flash</button>
<div id="info"></div>
</html> </html>