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

View File

@ -10688,6 +10688,16 @@
)
(uuid "21db64db-ae25-4ed4-ba6c-454a1ec3a9d6")
)
(wire
(pts
(xy 130.81 78.74) (xy 133.35 78.74)
)
(stroke
(width 0)
(type default)
)
(uuid "21f60869-92ca-48e7-9c92-e32ba51a2992")
)
(wire
(pts
(xy 190.5 198.12) (xy 191.77 198.12)
@ -23526,6 +23536,28 @@
)
)
)
(global_label "GND"
(shape input)
(at 130.81 76.2 0)
(fields_autoplaced yes)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
(uuid "91f8a2e1-852b-4af4-b258-38b3be725a18")
(property "Intersheetrefs" "${INTERSHEET_REFS}"
(at 137.0115 76.2 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
(hide yes)
)
)
)
(global_label "GND"
(shape input)
(at 420.37 135.89 180)
@ -25462,6 +25494,28 @@
)
)
)
(global_label "3_3V"
(shape input)
(at 133.35 78.74 0)
(fields_autoplaced yes)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
(uuid "c5e7fa55-b1cf-4e6e-9dba-ee260a46763f")
(property "Intersheetrefs" "${INTERSHEET_REFS}"
(at 140.1562 78.74 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
(hide yes)
)
)
)
(global_label "PUMP5"
(shape input)
(at 438.15 396.24 90)
@ -41518,6 +41572,79 @@
)
)
)
(symbol
(lib_id "Connector_Generic:Conn_01x03")
(at 125.73 78.74 0)
(mirror y)
(unit 1)
(exclude_from_sim no)
(in_bom yes)
(on_board yes)
(dnp yes)
(uuid "792b4d0b-465d-434c-a564-9dc697fd29e3")
(property "Reference" "J6"
(at 129.794 80.01 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Value" "Conn_01x03_Female"
(at 137.922 83.058 0)
(effects
(font
(size 1.27 1.27)
)
(justify left)
)
)
(property "Footprint" "Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical"
(at 125.73 78.74 0)
(effects
(font
(size 1.27 1.27)
)
(hide yes)
)
)
(property "Datasheet" "~"
(at 125.73 78.74 0)
(effects
(font
(size 1.27 1.27)
)
(hide yes)
)
)
(property "Description" "Generic connector, single row, 01x03, script generated (kicad-library-utils/schlib/autogen/connector/)"
(at 125.73 78.74 0)
(effects
(font
(size 1.27 1.27)
)
(hide yes)
)
)
(pin "1"
(uuid "80cd0077-0162-4bc0-af2c-81e5887cb171")
)
(pin "2"
(uuid "bce7e03f-b82f-4d41-b1a6-04be8cf3d36e")
)
(pin "3"
(uuid "a9cf13c4-e4a9-4ff4-aa9b-5df34c48ae2d")
)
(instances
(project "PlantCtrlESP32"
(path "/c26e8d55-0b6e-4c4e-b7c8-b1fed973201c"
(reference "J6")
(unit 1)
)
)
)
)
(symbol
(lib_id "Connector_Generic_MountingPin:Conn_01x02_MountingPin")
(at 534.67 71.12 0)

File diff suppressed because one or more lines are too long

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>
<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">V:</span>
<div class="col-5" id="battery_voltage_milli_volt" 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">mA:</span>
<div class="col-5" id="battery_current_milli_ampere" 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">Cycles:</span>
<div class="col-5" id="battery_cycle_count" 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">design mA:</span>
<div class="col-5" id="battery_design_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">remaining mA:</span>
<div class="col-5" id="battery_remaining_milli_ampere" 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">charge %:</span>
<div class="col-5" id="battery_state_of_charge" 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">health %:</span>
<div class="col-5" id="battery_state_of_health" style="text-wrap: nowrap"></div>
</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">
<div>
<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>
<br>
<label for="ssid">Password:</label>
<input type="text" id="password">
<br>
<br>
<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
<br>
<div>
</div>
</div>
<div class="flexcontainer">
<div class="mqttkey">
MQTT Url
<input type="text" id="mqtt_url" placeholder="mqtt://192.168.1.1:1883">
</div>
<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
<input type="text" id="base_topic" placeholder="plants/one">
</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 class="flexcontainer">
<span class="otakey">Buildtime:</span>
<span class="otavalue" id="firmware_buildtime"></span>
</div>
<div class="flexcontainer">
<span class="otakey">Buildhash:</span>
<span class="otavalue" id="firmware_githash"></span>
</div>
<div class="row">
<div class="col-md-6">
<span>Buildhash:</span>
<span id="firmware_githash" style="text-wrap: nowrap"></span>
</div>
</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;">
</span>
<input id="timeview_auto_refresh" type="checkbox">
</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">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;">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">RTC:</span>
<div class="col-9" id="timeview_rtc_time" style="text-wrap: nowrap">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: [