[WIP] Fermenter http NOT WORKING

This commit is contained in:
Patrick Haßel 2025-02-16 17:04:56 +01:00
parent 1bde26489b
commit eadd267749
5 changed files with 201 additions and 7 deletions

130
data/http/index.htm Normal file
View File

@ -0,0 +1,130 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta name="viewport" content="width=device-width, user-scalable=no">
<title>G&auml;rbox</title>
<style>
body {
font-size: 16vw;
font-family: sans-serif;
margin: 0.1em;
}
div {
overflow: hidden;
}
.entry {
padding-bottom: 0.5em;
.title {
font-size: 60%;
}
.value {
float: left;
}
.controls {
float: right;
.control {
float: left;
}
.controlUp {
color: red;
}
.controlDown {
color: blue;
}
}
}
#overlay {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
color: red;
font-size: 10vw;
line-height: 100vh;
text-align: center;
background-color: rgba(0, 0, 0, 0.9);
}
</style>
</head>
<body>
<div class="entry">
<div class="title">
Ist-Temperatur
</div>
<div class="value" id="currentCelsius">
<!-- via js -->
</div>
</div>
<div class="entry">
<div class="title">
Ziel-Temperatur
</div>
<div class="value" id="targetCelsius">
<!-- via js -->
</div>
<div class="controls">
<div class="control controlUp" onclick="get('/up')">&uarr;</div>
<div class="control controlDown" onclick="get('/down')">&darr;</div>
</div>
</div>
<div id="overlay">
Nicht verbunden
</div>
<script>
const overlay = document.getElementById('overlay');
const currentCelsius = document.getElementById('currentCelsius');
const targetCelsius = document.getElementById('targetCelsius');
function get(url) {
const request = new XMLHttpRequest();
request.onreadystatechange = function () {
if (this.readyState === 4) {
currentCelsius.classList.remove("tooCold");
currentCelsius.classList.remove("tooWarm");
currentCelsius.classList.remove("good");
if (this.status === 200) {
overlay.classList.add("noOverlay");
const json = JSON.parse(this.responseText);
currentCelsius.innerText = (json.currentCelsius || '---') + ' &deg;C';
targetCelsius.innerText = (json.targetCelsius || '---') + ' &deg;C';
const difference = json.currentCelsius - json.targetCelsius;
if (Math.abs(difference) <= 0.5) {
currentCelsius.classList.add("good");
} else if (difference < 0) {
currentCelsius.classList.add("tooCold");
} else {
currentCelsius.classList.add("tooWarm");
}
}
}
};
request.open("GET", url);
request.send();
return request;
}
get("/get");
</script>
</body>
</html>

View File

@ -34,7 +34,7 @@ void configReset() {
}
String configGetString(const char *name, const char *fallback, bool allowEmpty) {
if (!config.containsKey(name)) {
if (!config[name].is<String>()) {
return fallback;
}
String value = config[name];
@ -52,7 +52,7 @@ void configPutString(const char *name, const char *value) {
}
double configGetDouble(const char *name, double fallback) {
if (!config.containsKey(name)) {
if (!config[name].is<double>()) {
return fallback;
}
return config[name];
@ -66,7 +66,7 @@ void configPutDouble(const char *name, double value) {
}
uint64_t configGetUint64_t(const char *name, uint64_t fallback) {
if (!config.containsKey(name)) {
if (!config[name].is<uint64>()) {
return fallback;
}
return config[name];
@ -80,7 +80,7 @@ void configPutUint64_t(const char *name, uint64_t value) {
}
uint8_t configGetUint8_t(const char *name, uint8_t fallback) {
if (!config.containsKey(name)) {
if (!config[name].is<uint8>()) {
return fallback;
}
return config[name];

View File

@ -50,7 +50,6 @@ void wifiConnect() {
sntp_stop();
if (otaInitialized) {
ArduinoOTA.end();
otaInitialized = false;
}
mqttDisconnect();

View File

@ -7,6 +7,7 @@ usb_speed = 921600
ota_protocol = espota
monitor_port = /dev/ttyUSB0
monitor_speed = 115200
board_build.filesystem = littlefs
monitor_filters = esp32_exception_decoder
WIFI_SSID = HappyNet
WIFI_PKEY = 1Grausame!Sackratte7
@ -57,12 +58,26 @@ upload_protocol = ${COMMON.ota_protocol}
platform = espressif8266
board = esp12e
framework = ${COMMON.framework}
board_build.filesystem = ${COMMON.board_build.filesystem}
monitor_port = ${COMMON.monitor_port}
monitor_speed = ${COMMON.monitor_speed}
monitor_filters = esp8266_exception_decoder
lib_deps = ${COMMON.lib_deps}
build_flags = -D FERMENTER -D HOSTNAME=\"Fermenter\" -D WIFI_SSID=\"${COMMON.WIFI_SSID}\" -D WIFI_PKEY=\"${COMMON.WIFI_PKEY}\" -D OTA_PASSWORD=\"OtaAuthPatrixFermenter\" -D BOOT_DELAY=true -D DEBUG_LOG=false
[env:FermenterUSB]
;upload_port = ${COMMON.usb_port}
;upload_speed = ${COMMON.usb_speed}
platform = espressif8266
board = esp12e
framework = ${COMMON.framework}
board_build.filesystem = ${COMMON.board_build.filesystem}
monitor_port = ${COMMON.monitor_port}
monitor_speed = ${COMMON.monitor_speed}
monitor_filters = esp8266_exception_decoder
lib_deps = ${COMMON.lib_deps}
build_flags = -D FERMENTER -D HOSTNAME=\"Fermenter2\" -D WIFI_SSID=\"${COMMON.WIFI_SSID}\" -D WIFI_PKEY=\"${COMMON.WIFI_PKEY}\" -D OTA_PASSWORD=\"OtaAuthPatrixFermenter\" -D BOOT_DELAY=true -D DEBUG_LOG=false
[env:Greenhouse]
;upload_port = 10.0.0.
;upload_flags = --auth=OtaAuthPatrixGreenhouse

View File

@ -1,16 +1,66 @@
#if defined(FERMENTER) || defined(TEST8266)
#include <Patrix.h>
#include <LittleFS.h>
#include "FermenterData.h"
#include "FementerDisplay.h"
#include "FermenterPID.h"
#include "FermenterSensor.h"
#include "ESPAsyncWebServer.h"
Cache<FermenterData, 800> cache;
AsyncWebServer server(80);
void httpGet(AsyncWebServerRequest *request) {
JsonDocument json;
json["currentCelsius"] = temperature;
json["targetCelsius"] = target;
char buffer[250];
serializeJson(json, buffer, sizeof buffer);
request->send(200, "application/json", buffer);
}
void change(AsyncWebServerRequest *request, double delta) {
target = max(0.0, min(40.0, target + delta));
info("HTTP: target set to: %.1f%cC", target, char(176));
httpGet(request);
}
void httpUp(AsyncWebServerRequest *request) {
change(request, +0.5);
}
void httpDown(AsyncWebServerRequest *request) {
change(request, -0.5);
}
void httpNotFound(AsyncWebServerRequest *request) {
if (request->method() == HTTP_OPTIONS) {
request->send(200);
} else {
request->send(404, "text/plain", F("Not found"));
}
}
void httpSetup() {
DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");
DefaultHeaders::Instance().addHeader("Access-Control-Allow-Methods", "GET, POST, PUT");
DefaultHeaders::Instance().addHeader("Access-Control-Allow-Headers", "Content-Type");
server.on("/get", httpGet);
server.on("/up", httpUp);
server.on("/down", httpDown);
server.onNotFound(httpNotFound);
server.serveStatic("/", LittleFS, "/http/");
server.begin();
}
void patrixSetup() {
sensorSetup();
pidSetup(&temperature);
httpSetup();
}
void patrixLoop() {