This commit is contained in:
2025-01-17 20:10:17 +01:00
parent 927a2f8d98
commit 31350eeed2
16 changed files with 346 additions and 4251 deletions

View File

@@ -38,8 +38,8 @@ pub mod plant_hal;
const TIME_ZONE: Tz = Berlin;
const MOIST_SENSOR_MAX_FREQUENCY: u32 = 50000; // 60kHz (500Hz margin)
const MOIST_SENSOR_MIN_FREQUENCY: u32 = 500; // 0.5kHz (500Hz margin)
const MOIST_SENSOR_MAX_FREQUENCY: u32 = 250000; // 60kHz (500Hz margin)
const MOIST_SENSOR_MIN_FREQUENCY: u32 = 10000; // 0.5kHz (500Hz margin)
const FROM: (f32, f32) = (
MOIST_SENSOR_MIN_FREQUENCY as f32,

View File

@@ -1355,12 +1355,6 @@ impl PlantHal {
},
)?;
println!("Setup filter");
//TODO validate filter value! currently max allowed value
counter_unit1.set_filter_value(1023)?;
counter_unit1.filter_enable()?;
println!("Wifi start");
let sys_loop = EspSystemEventLoop::take()?;

File diff suppressed because it is too large Load Diff

View File

@@ -519,17 +519,6 @@ pub fn httpd(reboot_now: Arc<AtomicBool>) -> Box<EspHttpServer<'static>> {
})
.unwrap();
server
.fn_handler("/bootstrap-grid.css", Method::Get, |request| {
let headers = [
("Access-Control-Allow-Origin", "*"),
("Access-Control-Allow-Headers", "*"),
("Content-Type", "text/css")
];
request.into_response(200, None, &headers)?.write(include_bytes!("bootstrap-grid.css"))?;
anyhow::Ok(())
})
.unwrap();
server
}
fn cors_response(

File diff suppressed because it is too large Load Diff

View File

@@ -1,42 +1,39 @@
<div class="row">
<div class="col-12" style="text-align: center; font-weight: bold;">
<div class="flexcontainer">
<div class="subtitle">
Battery:
</div>
<div style="display: block; right: 8px; position: absolute;">
<input id="battery_auto_refresh" type="checkbox">
</div>
<input id="battery_auto_refresh" type="checkbox">
</div>
<div class="row">
<span class="col-7">V:</span>
<div class="col-5" id="battery_voltage_milli_volt" style="text-wrap: nowrap"></div>
<div class="flexcontainer">
<span class="powerflexkey">V:</span>
<span class="powerflexvalue" id="battery_voltage_milli_volt"></span>
</div>
<div class="row">
<span class="col-7">mA:</span>
<div class="col-5" id="battery_current_milli_ampere" style="text-wrap: nowrap"></div>
<div class="flexcontainer">
<span class="powerflexkey">mA:</span>
<span class="powerflexvalue" id="battery_current_milli_ampere" ></span>
</div>
<div class="row">
<span class="col-7">Cycles:</span>
<div class="col-5" id="battery_cycle_count" style="text-wrap: nowrap"></div>
<div class="flexcontainer">
<span class="powerflexkey">Cycles:</span>
<span class="powerflexvalue" id="battery_cycle_count" ></span>
</div>
<div class="row">
<span class="col-7">design mA:</span>
<div class="col-5" id="battery_design_milli_ampere" style="text-wrap: nowrap"></div>
<div class="flexcontainer">
<span class="powerflexkey">design mA:</span>
<span class="powerflexvalue" id="battery_design_milli_ampere" ></span>
</div>
<div class="row">
<span class="col-7">remaining mA:</span>
<div class="col-5" id="battery_remaining_milli_ampere" style="text-wrap: nowrap"></div>
<div class="flexcontainer">
<span class="powerflexkey">remaining mA:</span>
<span class="powerflexvalue" id="battery_remaining_milli_ampere" ></span>
</div>
<div class="row">
<span class="col-7">charge %:</span>
<div class="col-5" id="battery_state_of_charge" style="text-wrap: nowrap"></div>
<div class="flexcontainer">
<span class="powerflexkey">charge %:</span>
<span class="powerflexvalue" id="battery_state_of_charge" ></span>
</div>
<div class="row">
<span class="col-7">health %:</span>
<div class="col-5" id="battery_state_of_health" style="text-wrap: nowrap"></div>
<div class="flexcontainer">
<span class="powerflexkey">health %:</span>
<span class="powerflexvalue" id="battery_state_of_health" ></span>
</div>
<div class="row">
<span class="col-7">Temp °C:</span>
<div class="col-5" id="battery_temperature" style="text-wrap: nowrap"></div>
<div class="flexcontainer">
<span class="powerflexkey">Temp °C:</span>
<span class="powerflexvalue" id="battery_temperature" ></span>
</div>

View File

@@ -1,4 +1,3 @@
<link rel="stylesheet" href="bootstrap-grid.css">
<style>
.progressPane {
display: block;
@@ -68,31 +67,110 @@
transform: translateX(0%) scaleX(0.5);
}
}
.flexcontainer {
display: flex;
flex-wrap: wrap;
}
.subcontainer {
min-width: 300px;
flex-grow: 1;
border-style: solid;
border-width: 1px;
padding: 8px;
}
.subcontainercontainer{
flex-grow: 1;
}
.plantcontainer {
min-width: 200px;
border-style: solid;
border-width: 1px;
padding: 8px;
}
.subtitle {
flex-grow: 1;
text-align: center;
font-weight: bold;
}
.powerflexkey {
min-width: 150px;
}
.powerflexvalue {
text-wrap: nowrap;
flex-grow: 1;
}
.basicnetworkkey{
min-width: 200px;
}
.basicnetworkvalue{
flex-grow: 1;
}
.basicnetworkkeyssid1{
flex-grow: 1;
}
.basicnetworkkeyssid2{
min-width: 50px;
flex-grow: 1;
}
.mqttkey{
min-width: 100px;
}
.mqttvalue{
flex-grow: 1;
}
.otakey{
min-width: 100px;
}
.otavalue{
flex-grow: 1;
}
.otaform {
min-width: 100px;
flex-grow: 1;
}
.otachooser {
min-width: 100px;
width: 100%;
}
.lightpre{
min-width: 20px
}
.lightkeypre{
min-width: 100px;
}
.lightkey{
min-width: 120px;
}
.lightpost{
flex-grow: 1;
}
</style>
<div class="container-xl">
<div class="row">
<div id="firmwareview" class="container col-12 col-lg-4"
style="border-width: 1px; border-style: solid; padding: 8px;">
<div style="display:flex; flex-wrap: wrap;">
<div id="firmwareview" style="border-width: 1px; border-style: solid; flex-grow: 1; min-width: 350px">
</div>
<div id="timeview" class="container col-12 col-lg-4" style="border-style: solid; border-width: 1px; padding: 8px;">
<div id="timeview" style="border-width: 1px; border-style: solid; flex-grow: 1;">
</div>
<div id="batteryview" class="container col-12 col-lg-4"
style="border-style: solid; border-width: 1px; padding: 8px;">
<div id="batteryview" style="border-width: 1px; border-style: solid; flex-grow: 1;">
</div>
</div>
<div class="row">
<div id="network_view" class="container col-12 col-sm-6 col-lg-4"
style="border-style: solid; border-width: 1px; padding: 8px;">
<div class="flexcontainer">
<div id="network_view" class="subcontainercontainer"></div>
<div id="lightview" class="subcontainer">
</div>
<div id="lightview" class="container col-12 col-sm-6 col-lg-4"
style="border-style: solid; border-width: 1px; padding: 16px;">
</div>
<div id="tankview" class="container col-12 col-lg-4" style="border-style: solid; border-width: 1px; padding: 16px;">
<div id="tankview" class="subcontainer">
</div>
</div>
@@ -105,7 +183,7 @@
<h2>config</h2>
<h3>Plants:</h3>
<button id="measure_moisture">Measure Moisture</button>
<div id="plants" class="row"></div>
<div id="plants" style="display: flex; flex-wrap: 1;"></div>

View File

@@ -1,32 +1,52 @@
<h2>Basic network</h2>
Api Redirection to:
<span id="remote_ip">remote ip</span>
<br>
AccessPoint Mode (or fallback)
<br>
<label for="ap_ssid">AP SSID:</label>
<input type="text" id="ap_ssid" list="ssidlist">
<br>
<br>
Station Mode:
<br>
<label for="ssid">SSID:</label>
<input type="text" id="ssid" list="ssidlist"> <input type="button" id="scan" value="Scan">
<datalist id="ssidlist">
<option value="Not scanned yet">
</datalist>
<br>
<label for="ssid">Password:</label>
<input type="text" id="password">
<br>
<br>
Mqtt Reporting
<br>
<div>
MQTT Url
<input type="text" id="mqtt_url" placeholder="mqtt://192.168.1.1:1883">
</div>
<div>
Base Topic
<input type="text" id="base_topic" placeholder="plants/one">
<div class="flexcontainer">
<div class="subcontainer">
<div class="subtitle">Basic network</div>
<div class="flexcontainer">
<span class="basicnetworkkey">Api Redirection to:</span>
<span class="basicnetworkvalue" id="remote_ip">remote ip</span>
</div>
<div class="flexcontainer">
<label class="basicnetworkkey" for="ap_ssid">AP SSID:</label>
<input class="basicnetworkvalue" type="text" id="ap_ssid" list="ssidlist">
</div>
<div class="flexcontainer">
<label class="basicnetworkkey" for="ssid">Station Mode:</label>
<input class="basicnetworkkeyssid1" type="text" id="ssid" list="ssidlist">
<datalist id="ssidlist">
<option value="Not scanned yet">
</datalist>
<input class="basicnetworkkeyssid2" type="button" id="scan" value="Scan">
</div>
<div class="flexcontainer">
<label class="basicnetworkkey" for="ssid">Password:</label>
<input class="basicnetworkvalue" type="text" id="password">
</div>
</div>
<div class="subcontainer">
<div class="flexcontainer">
<div class="subtitle">
Mqtt Reporting
</div>
</div>
<div class="flexcontainer">
<div class="mqttkey">
MQTT Url
</div>
<input class="mqttvalue" type="text" id="mqtt_url" placeholder="mqtt://192.168.1.1:1883">
</div>
<div class="flexcontainer">
<div class="mqttkey">
Base Topic
</div>
<input class="mqttvalue" type="text" id="base_topic" placeholder="plants/one">
</div>
</div>
</div>
</div>

View File

@@ -1,14 +1,17 @@
<h3>Light:</h3>
<input type="checkbox" id="night_lamp_enabled" checked="false"> Enable Nightlight
<div>
Start
<div class="subtitle">Light:</div>
<div class="flexcontainer">
<input class="lightpre" type="checkbox" id="night_lamp_enabled" checked="false">
<div class="lightkeypre">Enable Nightlight</div>
</div>
<div class="flexcontainer">
<div>Start</div>
<select type="time" id="night_lamp_time_start">
</select>
Stop
<div>Stop</div>
<select type="time" id="night_lamp_time_end">
</select>
</div>
<div>
<input type="checkbox" id="night_lamp_only_when_dark">
<div class="flexcontainer">
<input class="" type="checkbox" id="night_lamp_only_when_dark">
Light only when dark
</div>

View File

@@ -1,25 +1,21 @@
<div class="row">
<div class="col-12" style="text-align: center; font-weight: bold;">
<div class="flexcontainer">
<div class="subtitle">
Current Firmware
</div>
</div>
<div class="row">
<div class="col-6">
<span>Buildtime:</span>
<span id="firmware_buildtime" style="text-wrap: nowrap"></span>
</div>
<div class="flexcontainer">
<span class="otakey">Buildtime:</span>
<span class="otavalue" id="firmware_buildtime"></span>
</div>
<div class="row">
<div class="col-md-6">
<span>Buildhash:</span>
<span id="firmware_githash" style="text-wrap: nowrap"></span>
</div>
<div class="flexcontainer">
<span class="otakey">Buildhash:</span>
<span class="otavalue" id="firmware_githash"></span>
</div>
<div class="row">
<form class="col-12" id="upload_form" method="post">
<input type="file" name="file1" id="firmware_file"><br>
<div class="flexcontainer">
<form class="otaform" id="upload_form" method="post">
<input class="otachooser" type="file" name="file1" id="firmware_file"><br>
</form>
</div>
<div class="row">
<div class="display:flex">
<input style="margin-left: 16px; margin-top: 8px;" class="col-6" type="button" id="test" value="Self-Test">
</div>

View File

@@ -1,7 +1,10 @@
<div class="container" style="border-style: solid; border-width: 1px; padding: 8px;">
<span class="row col-12" style="font-weight: bold; display: block; text-align: center;"
id="plant_${plantId}_header">Plant ${plantId}</span>
<div>
<div style="font-weight: bold; text-align: center; flex-grow: 1;"
id="plant_${plantId}_header">Plant ${plantId}</div>
<div>
<div class="row">
<div class="col-1"></div>
<button class="col-10" id="plant_${plantId}_test">Test</button>
@@ -57,5 +60,6 @@
<input class="col-4" id="plant_${plantId}_max_consecutive_pump_count" type="number" min="1" , max="50" ,
placeholder="10">
</div>
</div>
</div>

View File

@@ -67,9 +67,7 @@ export class PlantView {
const plantRaw = template.replaceAll("${plantId}", String(plantId));
this.plantDiv.innerHTML = plantRaw
this.plantDiv.classList.add("col-12" )
this.plantDiv.classList.add("col-sm-6" )
this.plantDiv.classList.add("col-md-auto" )
this.plantDiv.classList.add("plantcontainer")
parent.appendChild(this.plantDiv)
this.header = document.getElementById("plant_"+plantId+"_header")!

View File

@@ -1,24 +1,21 @@
<div class="row">
<div class="col-12" style="text-align: center; font-weight: bold;">
<div style="display:flex">
<span style="flex-grow: 1; text-align: center; font-weight: bold;">
Time:
</div>
<div style="display: block; right: 8px; position: absolute;">
<input id="timeview_auto_refresh" type="checkbox">
</div>
</span>
<input id="timeview_auto_refresh" type="checkbox">
</div>
<div class="row">
<span class="col-2">MCU:</span>
<div class="col-9" id="timeview_esp_time" style="text-wrap: nowrap">Esp time</div>
<div style="display:flex">
<span style="min-width: 50px;">MCU:</span>
<div id="timeview_esp_time" style="text-wrap: nowrap; flex-grow: 1;">Esp time</div>
</div>
<div class="row">
<span class="col-2">RTC:</span>
<div class="col-9" id="timeview_rtc_time" style="text-wrap: nowrap">Rtc time</div>
<div style="display:flex">
<span style="min-width: 50px;">RTC:</span>
<div id="timeview_rtc_time" style="text-wrap: nowrap; flex-grow: 1;">Rtc time</div>
</div>
<div class="row">
<span class="col-2">Local:</span>
<div class="col-9" id="timeview_browser_time" style="text-wrap: nowrap">Local time</div>
<div style="display:flex">
<span style="min-width: 50px;">Local:</span>
<div id="timeview_browser_time" style="text-wrap: nowrap; flex-grow: 1;">Local time</div>
</div>
<button id="timeview_time_upload">Store Browser time into esp and rtc</button>

View File

@@ -8,7 +8,7 @@ const isDevServer = process.env.WEBPACK_SERVE;
console.log("Dev server is " + isDevServer);
var host;
if (isDevServer){
host = 'http://192.168.0.105';
host = 'http://10.23.43.24';
} else {
host = '';
}
@@ -29,14 +29,6 @@ module.exports = {
title: "PlantCtrl",
}),
new HtmlWebpackHarddiskPlugin(),
new CopyPlugin({
patterns: [
{
from: "public/bootstrap-grid.css",
to: "bootstrap-grid.css",
}
],
}),
],
module: {
rules: [