From 70eb158d1ce0aeb3183f2c9382a865c3a2387221 Mon Sep 17 00:00:00 2001 From: CaptSnus Date: Mon, 20 Nov 2023 20:44:01 +0100 Subject: [PATCH 01/21] updated ElegantOTA --- platformio.ini | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 33177b1..3d5059c 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,10 +15,12 @@ framework = arduino monitor_speed = 115200 lib_deps = https://github.com/me-no-dev/ESPAsyncWebServer.git - ayushsharma82/AsyncElegantOTA@^2.2.7 arduino-libraries/ArduinoHttpClient@^0.4.0 adafruit/Adafruit NeoPixel@^1.11.0 me-no-dev/AsyncTCP@^1.1.1 end2endzone/NonBlockingRTTTL@^1.3.0 + ayushsharma82/ElegantOTA@^3.1.0 board_build.f_flash = 80000000L board_build.partitions = default_8MB.csv +build_flags = + -DELEGANTOTA_USE_ASYNC_WEBSERVER=1 \ No newline at end of file From ef6ddec33c8980a16d5c07fb4fe993255c0d3d94 Mon Sep 17 00:00:00 2001 From: CaptSnus Date: Mon, 20 Nov 2023 20:44:53 +0100 Subject: [PATCH 02/21] removed options for temperature plus some linting --- data/js/settings.js | 231 +++++++++++---------------------------- data/settings.html | 257 ++++++++++++++++++++++++++++++++------------ 2 files changed, 250 insertions(+), 238 deletions(-) diff --git a/data/js/settings.js b/data/js/settings.js index 78beb60..ff075cb 100644 --- a/data/js/settings.js +++ b/data/js/settings.js @@ -24,25 +24,21 @@ translator.fetch(['de', 'en']).then(() => { }) */ - - // **************************************************************************************************** // Color preview // **************************************************************************************************** const closest = (to, selector) => { - let currentElement = document.querySelector(to) - let returnElement + let currentElement = document.querySelector(to); + let returnElement; while (currentElement.parentNode && !returnElement) { - currentElement = currentElement.parentNode - returnElement = currentElement.querySelector(selector) + currentElement = currentElement.parentNode; + returnElement = currentElement.querySelector(selector); } - return returnElement -} - - + return returnElement; +}; // **************************************************************************************************** // FUNCTIONS - get @@ -378,7 +374,7 @@ function getClkHColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("clkHColor").value = this.responseText; - closest( '#clkHColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#clkHColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getClkHColor", true); @@ -390,7 +386,7 @@ function getClkMColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("clkMColor").value = this.responseText; - closest( '#clkMColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#clkMColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getClkMColor", true); @@ -437,7 +433,7 @@ function getDatDColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("datDColor").value = this.responseText; - closest( '#datDColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#datDColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDatDColor", true); @@ -449,7 +445,7 @@ function getDatMColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("datMColor").value = this.responseText; - closest( '#datMColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#datMColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDatMColor", true); @@ -473,60 +469,6 @@ function getTemSymbol() { xhttp.send(); } -function getTemColorSet() { - const xhttp = new XMLHttpRequest(); - xhttp.onreadystatechange = function () { - if (this.readyState === 4 && this.status === 200) { - if (this.responseText === "0") { - document.getElementById("temColorSet").selectedIndex = 0; - document.getElementById("temFields").hidden = false; - } - if (this.responseText === "1") { - document.getElementById("temColorSet").selectedIndex = 1; - document.getElementById("temFields").hidden = true; - } - } - }; - xhttp.open("GET", "getTemColorSet", true); - xhttp.send(); -} - -function getTemAColor() { - const xhttp = new XMLHttpRequest(); - xhttp.onreadystatechange = function () { - if (this.readyState === 4 && this.status === 200) { - document.getElementById("temAColor").value = this.responseText; - closest( '#temAColor', '.input-group-text' ).style.backgroundColor = this.responseText; - } - }; - xhttp.open("GET", "getTemAColor", true); - xhttp.send(); -} - -function getTemBColor() { - const xhttp = new XMLHttpRequest(); - xhttp.onreadystatechange = function () { - if (this.readyState === 4 && this.status === 200) { - document.getElementById("temBColor").value = this.responseText; - closest( '#temBColor', '.input-group-text' ).style.backgroundColor = this.responseText; - } - }; - xhttp.open("GET", "getTemBColor", true); - xhttp.send(); -} - -function getTemCColor() { - const xhttp = new XMLHttpRequest(); - xhttp.onreadystatechange = function () { - if (this.readyState === 4 && this.status === 200) { - document.getElementById("temCColor").value = this.responseText; - closest( '#temCColor', '.input-group-text' ).style.backgroundColor = this.responseText; - } - }; - xhttp.open("GET", "getTemCColor", true); - xhttp.send(); -} - // Humidity function getHumColorSet() { const xhttp = new XMLHttpRequest(); @@ -551,7 +493,7 @@ function getHumAColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("humAColor").value = this.responseText; - closest( '#humAColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#humAColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getHumAColor", true); @@ -563,7 +505,7 @@ function getHumBColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("humBColor").value = this.responseText; - closest( '#humBColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#humBColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getHumBColor", true); @@ -575,7 +517,7 @@ function getHumCColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("humCColor").value = this.responseText; - closest( '#humCColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#humCColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getHumCColor", true); @@ -588,7 +530,7 @@ function getScoHColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("scoHColor").value = this.responseText; - closest( '#scoHColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#scoHColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getScoHColor", true); @@ -600,7 +542,7 @@ function getScoAColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("scoAColor").value = this.responseText; - closest( '#scoAColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#scoAColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getScoAColor", true); @@ -613,7 +555,7 @@ function getCouHColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("couHColor").value = this.responseText; - closest( '#couHColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#couHColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getCouHColor", true); @@ -625,7 +567,7 @@ function getCouMColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("couMColor").value = this.responseText; - closest( '#couMColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#couMColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getCouMColor", true); @@ -637,7 +579,7 @@ function getCouSColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("couSColor").value = this.responseText; - closest( '#couSColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#couSColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getCouSColor", true); @@ -649,7 +591,7 @@ function getCouAColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("couAColor").value = this.responseText; - closest( '#couAColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#couAColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getCouAColor", true); @@ -668,7 +610,6 @@ function getScrTime() { xhttp.send(); } - // Downlights function getDowColorSet() { const xhttp = new XMLHttpRequest(); @@ -709,7 +650,7 @@ function getDowColor() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor").value = this.responseText; - closest( '#dowColor', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor", true); @@ -721,7 +662,7 @@ function getDowColor0() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor0").value = this.responseText; - closest( '#dowColor0', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor0", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor0", true); @@ -733,7 +674,7 @@ function getDowColor1() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor1").value = this.responseText; - closest( '#dowColor1', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor1", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor1", true); @@ -745,7 +686,7 @@ function getDowColor2() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor2").value = this.responseText; - closest( '#dowColor2', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor2", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor2", true); @@ -757,7 +698,7 @@ function getDowColor3() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor3").value = this.responseText; - closest( '#dowColor3', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor3", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor3", true); @@ -769,7 +710,7 @@ function getDowColor4() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor4").value = this.responseText; - closest( '#dowColor4', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor4", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor4", true); @@ -781,7 +722,7 @@ function getDowColor5() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor5").value = this.responseText; - closest( '#dowColor5', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor5", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor5", true); @@ -793,7 +734,7 @@ function getDowColor6() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor6").value = this.responseText; - closest( '#dowColor6', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor6", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor6", true); @@ -805,7 +746,7 @@ function getDowColor7() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor7").value = this.responseText; - closest( '#dowColor7', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor7", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor7", true); @@ -817,7 +758,7 @@ function getDowColor8() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor8").value = this.responseText; - closest( '#dowColor8', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor8", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor8", true); @@ -829,7 +770,7 @@ function getDowColor9() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor9").value = this.responseText; - closest( '#dowColor9', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor9", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor9", true); @@ -841,7 +782,7 @@ function getDowColor10() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor10").value = this.responseText; - closest( '#dowColor10', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor10", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor10", true); @@ -853,7 +794,7 @@ function getDowColor11() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor11").value = this.responseText; - closest( '#dowColor11', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor11", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor11", true); @@ -865,7 +806,7 @@ function getDowColor12() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor12").value = this.responseText; - closest( '#dowColor12', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor12", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor12", true); @@ -877,7 +818,7 @@ function getDowColor13() { xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { document.getElementById("dowColor13").value = this.responseText; - closest( '#dowColor13', '.input-group-text' ).style.backgroundColor = this.responseText; + closest("#dowColor13", ".input-group-text").style.backgroundColor = this.responseText; } }; xhttp.open("GET", "getDowColor13", true); @@ -920,10 +861,6 @@ function init() { getDatMColor(); // Temperature getTemSymbol(); - getTemColorSet(); - getTemAColor(); - getTemBColor(); - getTemCColor(); // Humidity getHumColorSet(); getHumAColor(); @@ -1025,17 +962,6 @@ function startup() { // Temperature const temSymbol = document.querySelector("#temSymbol"); temSymbol.addEventListener("input", updTemSymbol, false); - const temColorSet = document.querySelector("#temColorSet"); - temColorSet.addEventListener("input", updTemColorSet, false); - const temAColor = document.querySelector("#temAColor"); - temAColor.addEventListener("input", updTemAColor, false); - temAColor.addEventListener("change", updTemAColor, false); - const temBColor = document.querySelector("#temBColor"); - temBColor.addEventListener("input", updTemBColor, false); - temBColor.addEventListener("change", updTemBColor, false); - const temCColor = document.querySelector("#temCColor"); - temCColor.addEventListener("input", updTemCColor, false); - temCColor.addEventListener("change", updTemCColor, false); // Humidity const humColorSet = document.querySelector("#humColorSet"); humColorSet.addEventListener("input", updHumColorSet, false); @@ -1271,14 +1197,14 @@ function updClkColorSet(event) { function updClkHColor(event) { const value = event.target.value; $.post("/updClkHColor", hexToRgb(value)); - closest( '#clkHColor', '.input-group-text' ).style.backgroundColor = value; + closest("#clkHColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updClkMColor(event) { const value = event.target.value; $.post("/updClkMColor", hexToRgb(value)); - closest( '#clkMColor', '.input-group-text' ).style.backgroundColor = value; + closest("#clkMColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } @@ -1305,14 +1231,14 @@ function updDatColorSet(event) { function updDatDColor(event) { const value = event.target.value; $.post("/updDatDColor", hexToRgb(value)); - closest( '#datDColor', '.input-group-text' ).style.backgroundColor = value; + closest("#datDColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDatMColor(event) { const value = event.target.value; $.post("/updDatMColor", hexToRgb(value)); - closest( '#datMColor', '.input-group-text' ).style.backgroundColor = value; + closest("#datMColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } @@ -1323,39 +1249,6 @@ function updTemSymbol(event) { console.log(value); } -function updTemColorSet(event) { - const value = event.target.value; - if (value === "0") { - document.getElementById("temFields").hidden = false; - } - if (value === "1") { - document.getElementById("temFields").hidden = true; - } - $.post("/updTemColorSet", { temColorSet: value }); - console.log(value); -} - -function updTemAColor(event) { - const value = event.target.value; - $.post("/updTemAColor", hexToRgb(value)); - closest( '#temAColor', '.input-group-text' ).style.backgroundColor = value; - console.log(hexToRgb(value)); -} - -function updTemBColor(event) { - const value = event.target.value; - $.post("/updTemBColor", hexToRgb(value)); - closest( '#temBColor', '.input-group-text' ).style.backgroundColor = value; - console.log(hexToRgb(value)); -} - -function updTemCColor(event) { - const value = event.target.value; - $.post("/updTemCColor", hexToRgb(value)); - closest( '#temCColor', '.input-group-text' ).style.backgroundColor = value; - console.log(hexToRgb(value)); -} - // Humidity function updHumColorSet(event) { const value = event.target.value; @@ -1372,21 +1265,21 @@ function updHumColorSet(event) { function updHumAColor(event) { const value = event.target.value; $.post("/updHumAColor", hexToRgb(value)); - closest( '#humAColor', '.input-group-text' ).style.backgroundColor = value; + closest("#humAColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updHumBColor(event) { const value = event.target.value; $.post("/updHumBColor", hexToRgb(value)); - closest( '#humBColor', '.input-group-text' ).style.backgroundColor = value; + closest("#humBColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updHumCColor(event) { const value = event.target.value; $.post("/updHumCColor", hexToRgb(value)); - closest( '#humCColor', '.input-group-text' ).style.backgroundColor = value; + closest("#humCColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } @@ -1394,14 +1287,14 @@ function updHumCColor(event) { function updScoHColor(event) { const value = event.target.value; $.post("/updScoHColor", hexToRgb(value)); - closest( '#scoHColor', '.input-group-text' ).style.backgroundColor = value; + closest("#scoHColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updScoAColor(event) { const value = event.target.value; $.post("/updScoAColor", hexToRgb(value)); - closest( '#scoAColor', '.input-group-text' ).style.backgroundColor = value; + closest("#scoAColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } @@ -1409,28 +1302,28 @@ function updScoAColor(event) { function updCouHColor(event) { const value = event.target.value; $.post("/updCouHColor", hexToRgb(value)); - closest( '#couHColor', '.input-group-text' ).style.backgroundColor = value; + closest("#couHColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updCouMColor(event) { const value = event.target.value; $.post("/updCouMColor", hexToRgb(value)); - closest( '#couMColor', '.input-group-text' ).style.backgroundColor = value; + closest("#couMColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updCouSColor(event) { const value = event.target.value; $.post("/updCouSColor", hexToRgb(value)); - closest( '#couSColor', '.input-group-text' ).style.backgroundColor = value; + closest("#couSColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updCouAColor(event) { const value = event.target.value; $.post("/updCouAColor", hexToRgb(value)); - closest( '#couAColor', '.input-group-text' ).style.backgroundColor = value; + closest("#couAColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } @@ -1471,104 +1364,104 @@ function updDowColorSet(event) { function updDowColor(event) { const value = event.target.value; $.post("/updDowColor", hexToRgb(value)); - closest( '#dowColor', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor0(event) { const value = event.target.value; $.post("/updDowColor0", hexToRgb(value)); - closest( '#dowColor0', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor0", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor1(event) { const value = event.target.value; $.post("/updDowColor1", hexToRgb(value)); - closest( '#dowColor1', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor1", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor2(event) { const value = event.target.value; $.post("/updDowColor2", hexToRgb(value)); - closest( '#dowColor2', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor2", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor3(event) { const value = event.target.value; $.post("/updDowColor3", hexToRgb(value)); - closest( '#dowColor3', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor3", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor4(event) { const value = event.target.value; $.post("/updDowColor4", hexToRgb(value)); - closest( '#dowColor4', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor4", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor5(event) { const value = event.target.value; $.post("/updDowColor5", hexToRgb(value)); - closest( '#dowColor5', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor5", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor6(event) { const value = event.target.value; $.post("/updDowColor6", hexToRgb(value)); - closest( '#dowColor6', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor6", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor7(event) { const value = event.target.value; $.post("/updDowColor7", hexToRgb(value)); - closest( '#dowColor7', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor7", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor8(event) { const value = event.target.value; $.post("/updDowColor8", hexToRgb(value)); - closest( '#dowColor8', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor8", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor9(event) { const value = event.target.value; $.post("/updDowColor9", hexToRgb(value)); - closest( '#dowColor9', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor9", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor10(event) { const value = event.target.value; $.post("/updDowColor10", hexToRgb(value)); - closest( '#dowColor10', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor10", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor11(event) { const value = event.target.value; $.post("/updDowColor11", hexToRgb(value)); - closest( '#dowColor11', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor11", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor12(event) { const value = event.target.value; $.post("/updDowColor12", hexToRgb(value)); - closest( '#dowColor12', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor12", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } function updDowColor13(event) { const value = event.target.value; $.post("/updDowColor13", hexToRgb(value)); - closest( '#dowColor13', '.input-group-text' ).style.backgroundColor = value; + closest("#dowColor13", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } diff --git a/data/settings.html b/data/settings.html index 1da0186..b7308cd 100644 --- a/data/settings.html +++ b/data/settings.html @@ -105,11 +105,24 @@

Einstellungen

-

-
+

Text

@@ -127,19 +140,43 @@

- +

- - + +
- - + +
@@ -151,7 +188,9 @@

- +

+ - +
- - + +
- - + +
@@ -199,7 +267,9 @@

- +

@@ -207,46 +277,120 @@

-

-
+

Text

- +
- +
- - + +
- - + +
- - + +
- - + +
- - + +
@@ -427,44 +571,6 @@

-
- - -
- -
-
-
-
- - -
- -
-
-
-
-
- - -
- -
-
-
-
-
- - -
- -
-
-
@@ -642,11 +748,24 @@

-

-
+

Text

From 1c262f7bf264c7ecb6d602be7776440ca4d254cb Mon Sep 17 00:00:00 2001 From: CaptSnus Date: Mon, 20 Nov 2023 20:46:02 +0100 Subject: [PATCH 03/21] refactored code --- src/main.cpp | 3326 +++++++++++++++++++++++++++++++------------------- 1 file changed, 2089 insertions(+), 1237 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 012e4bb..d917b1b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,17 +3,17 @@ // // Author: CaptSnus // Date: May 16, 2023 -// License: tbd +// Update: November 20, 2023 +// License: MIT // ---------------------------------------------------------------------------------------------------- // // TABLE OF CONTENTS // - libraries, header files and board definitions // - pin assignments & global variables -// - functions +// - function declarations // - setup() // - loop() - - +// - function definitions // ---------------------------------------------------------------------------------------------------- // LIBRARIES, HEADER FILES & BOARD DEFINITIONS @@ -22,1362 +22,2214 @@ #include #include #include -#include #include #include -#include +#include #include #include #include -#include #include - - +#include // ---------------------------------------------------------------------------------------------------- // PIN ASSIGNMENTS & GLOBAL VARIABLES // ---------------------------------------------------------------------------------------------------- -// general -char version[] = "1.1.2"; // software version -int displayMode = 0; // 0 = clock, 1 = date, 2 = temperature, 3 = humidity, 4 = scoreboard, 5 = countdown -TaskHandle_t taskCore0; // task executed in the taskCore0code() function -Preferences pref; // shortcut for Preferences +#define CLOCK_PIN 36 +#define CLOCK_COUNT 252 +#define DOWNLIGHT_PIN 35 +#define DOWNLIGHT_COUNT 14 +// general +char version[] = "1.1.3"; // software version +int displayMode; +TaskHandle_t taskCore0; +Preferences pref; // time -// |- external -struct tm ntpTime; // structure to save time from ntp server -time_t now; // this is the epoch -// |- internal -uint32_t currMillisCore0 = millis(); // current time in core 0 -uint32_t currMillisCore1 = millis(); // current time in core 1 -uint32_t prevTimeSecCore0 = 0; // reference for previous time in core 0 (1 second) -uint32_t prevTimeSecCore1 = 0; // reference for previous time in core 1 (1 second) -int prevTimeMinCore0 = 0; // reference for previous time in core 0 (1 minute) -int prevTimeHourCore0 = 0; // reference for previous time in core 0 (1 hour) -int prevTimeDayCore0 = 0; // reference for previous time in core 0 (1 day) -bool clockMinPassed = true; // flag for the color change of the clock face (1 minute) -bool clockHourPassed = true; // flag for the color change of the clock face (1 hour) -bool clockDayPassed = true; // flag for the color change of the clock face (1 day) -bool downMinPassed = true; // flag for the color change of the downlights (1 minute) -bool downHourPassed = true; // flag for the color change of the downlights (1 hour) -bool downDayPassed = true; // flag for the color change of the downlights (1 day) - -// wiFi -String apSSID = "Shelf Edge Clock"; // access point - ssid -String apPass = "shelfEdgeClock"; // access point - password -bool apHide = false; // access point - hidden: false = no, true = yes -IPAddress apLocalIP; // access point - ip address -int apIP1, apIP2, apIP3, apIP4; // access point - ip address in blocks -IPAddress apGateway; // access point - gateway address -int apGW1, apGW2, apGW3, apGW4; // access point - gateway address in blocks -IPAddress apSubnet; // access point - subnet mask -int apSN1, apSN2, apSN3, apSN4; // access point - subnet mask in blocks - -bool wifiConfig = false; // is the wifi client configured? -String wifiSSID = "ENTER_SSID"; // wifi client - ssid -String wifiPass = "ENTER_PASSWORD"; // wifi client - password -bool wifiDHCP = false; // wifi client - dhcp: false = DHCP, true = manual -IPAddress wifiLocalIP; // wifi client - ip address -int wifiIP1, wifiIP2, wifiIP3, wifiIP4; // wifi client - ip address in blocks -IPAddress wifiGateway; // wifi client - gateway address -int wifiGW1, wifiGW2, wifiGW3, wifiGW4; // wifi client - gateway address in blocks -IPAddress wifiSubnet; // wifi client - subnet mask -int wifiSN1, wifiSN2, wifiSN3, wifiSN4; // wifi client - subnet mask in blocks -WiFiClient wifi; // shortcut for WifiClient -String host = "ShelfEdgeClock"; // define the hostname (mDNS) - +struct tm ntpTime; // structure to save time +time_t now; // this is the epoch +uint32_t currMillisCore1 = millis(); // curr time core1 +uint32_t prevTimeSecCore1 = 0; // prev time core1 (1 sec) +int prevTimeSecCore0 = 0; // prev time core0 (1 sec) +int prevTimeMinCore0 = 0; // prev time core0 (1 min) +int prevTimeHourCore0 = 0; // prev time core0 (1 hour) +int prevTimeDayCore0 = 0; // prev time core0 (1 day) +bool clockMinPassed = true; // color change (1 min) +bool clockHourPassed = true; // color change (1 hour) +bool clockDayPassed = true; // color change(1 day) +bool downMinPassed = true; // color change (1 min) +bool downHourPassed = true; // color change (1 hour) +bool downDayPassed = true; // color change (1 day) +// access point +String apSSID, apPass; // ssid & password +bool apHide; // false = visible +IPAddress apLocalIP; // ip address +int apIP1, apIP2, apIP3, apIP4; // ...in blocks +IPAddress apGateway; // gateway address +int apGW1, apGW2, apGW3, apGW4; // ...in blocks +IPAddress apSubnet; // subnet mask +int apSN1, apSN2, apSN3, apSN4; // ...in blocks +// wifi client +bool wifiConfig; +String wifiSSID, wifiPass; // ssid & password +bool wifiDHCP; // false = DHCP +IPAddress wifiLocalIP; // ip +int wifiIP1, wifiIP2, wifiIP3, wifiIP4; +IPAddress wifiGateway; // gateway +int wifiGW1, wifiGW2, wifiGW3, wifiGW4; +IPAddress wifiSubnet; // subnet +int wifiSN1, wifiSN2, wifiSN3, wifiSN4; +WiFiClient wifi; // server -AsyncWebServer server(80); // shortcut for AsyncWebServer and binding to port 80 - +AsyncWebServer server(80); // led -#define CLOCK_PIN 36 -#define CLOCK_COUNT 252 -#define DOWNLIGHT_PIN 35 -#define DOWNLIGHT_COUNT 14 -Adafruit_NeoPixel ledClock( CLOCK_COUNT, CLOCK_PIN, NEO_GRB + NEO_KHZ800 ); -Adafruit_NeoPixel ledDownlight( DOWNLIGHT_COUNT, DOWNLIGHT_PIN, NEO_GRB + NEO_KHZ800 ); - -// content -// |- global -int gloBrightness = 0; // setting of the brightness -> 0 = automatic, > 0 = manual -int gloColorFreq = 0; // 0 = every second, 1 = every minute, 2 = every hour, 3 = every day -int dowUsage = 0; // 0 = downlights off, 1 = downlights on -int dowBrightness = 0; // setting of the brightness -> 0 = automatic, > 0 = manual -int dowColorFreq = 0; // 0 = every second, 1 = every minute, 2 = every hour, 3 = every day -int briClock, briDown; -int briClockMin, briClockMax; -int briDownMin, briDownMax; -// |- knx -String knxAddr = ""; // ip address of your knx server -int knxPort = 8080; // port number of your knx server -String briKNXPath = ""; // path to the brightness item in the home automation system -int briKNXmin, briKNXmax; // minimum and maximum values provided by the home automation -String temKNXPath = ""; // path to the temperature item in the home automation system -String humKNXPath = ""; // path to the humidity item in the home automation system -HttpClient client = HttpClient( wifi, knxAddr.c_str(), knxPort ); -// |- downlights -int dowColorSet = 0; // 0 = 1 defined color, 1 = 14 defined colors , 2 = 1 random color, 3 = 14 random colors -uint32_t dowColor; -int dowColorR, dowColorG, dowColorB; -uint32_t dowColor0; -int dowColor0R, dowColor0G, dowColor0B; -uint32_t dowColor1; -int dowColor1R, dowColor1G, dowColor1B; -uint32_t dowColor2; -int dowColor2R, dowColor2G, dowColor2B; -uint32_t dowColor3; -int dowColor3R, dowColor3G, dowColor3B; -uint32_t dowColor4; -int dowColor4R, dowColor4G, dowColor4B; -uint32_t dowColor5; -int dowColor5R, dowColor5G, dowColor5B; -uint32_t dowColor6; -int dowColor6R, dowColor6G, dowColor6B; -uint32_t dowColor7; -int dowColor7R, dowColor7G, dowColor7B; -uint32_t dowColor8; -int dowColor8R, dowColor8G, dowColor8B; -uint32_t dowColor9; -int dowColor9R, dowColor9G, dowColor9B; -uint32_t dowColor10; -int dowColor10R, dowColor10G, dowColor10B; -uint32_t dowColor11; -int dowColor11R, dowColor11G, dowColor11B; -uint32_t dowColor12; -int dowColor12R, dowColor12G, dowColor12B; -uint32_t dowColor13; -int dowColor13R, dowColor13G, dowColor13B; -// |- mode clock -String clkAddr = "ch.pool.ntp.org"; // pool.ntp.org, europe.pool.ntp.org -String clkZone = "CET-1CEST,M3.5.0,M10.5.0/3"; // https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv -int clkFormat = 1; // 0 = 12 hours, 1 = 24 hours -int clkColorSet = 0; // 0 = two defined colors, 1 = two random colors -uint32_t clkHColor; -int clkHColorR, clkHColorG, clkHColorB; -uint32_t clkMColor; -int clkMColorR, clkMColorG, clkMColorB; -// |- mode date -int datFormat = 1; // 0 = MMdd, 1 = ddMM -int datColorSet = 0; // 0 = two defined colors, 1 = two random colors -uint32_t datDColor; -int datDColorR, datDColorG, datDColorB; -uint32_t datMColor; -int datMColorR, datMColorG, datMColorB; -// |- mode temperature -int temSymbol = 1; // 0 = Fahrenheit, 1 = Celsius -int temColorSet = 0; // 0 = three defined colors, 1 = three random colors -uint32_t temAColor; -int temAColorR, temAColorG, temAColorB; -uint32_t temBColor; -int temBColorR, temBColorG, temBColorB; -uint32_t temCColor; -int temCColorR, temCColorG, temCColorB; -int temKNXValue = 0; // temperature value from knx -// |- mode humidity -int humColorSet = 0; // 0 = three defined colors, 1 = three random colors -uint32_t humAColor; -int humAColorR, humAColorG, humAColorB; -uint32_t humBColor; -int humBColorR, humBColorG, humBColorB; -uint32_t humCColor; -int humCColorR, humCColorG, humCColorB; -int humKNXValue = 0; // humidity value from knx -// |- mode scoreboard -uint32_t scoHColor; -int scoHColorR, scoHColorG, scoHColorB; -int scoHValue = 0; // score home team (left) -uint32_t scoAColor; -int scoAColorR, scoAColorG, scoAColorB; -int scoAValue = 0; // score away team (right) -// |- mode countdown -uint32_t couMillis = 0; -uint32_t couMillisEnd = 0; -uint32_t couHColor; -int couHColorR, couHColorG, couHColorB; -uint32_t couMColor; -int couMColorR, couMColorG, couMColorB; -uint32_t couSColor; -int couSColorR, couSColorG, couSColorB; -uint32_t couAColor; -int couAColorR, couAColorG, couAColorB; -// |- mode scroll -uint32_t scrMillis = 0; -uint32_t scrMillisPrev = 0; -int scrTime; -int scrDisplayMode = 0; - - +Adafruit_NeoPixel ledClock(CLOCK_COUNT, CLOCK_PIN, NEO_GRB + NEO_KHZ800); +Adafruit_NeoPixel ledDownlight(DOWNLIGHT_COUNT, DOWNLIGHT_PIN, + NEO_GRB + NEO_KHZ800); +// global +int gloBrightness = 0; // 0 = auto, > 0 = manual +int gloColorFreq = 0; // 0 = sec, 1 = min, 2 = hour, 3 = day +int dowUsage = 0; // 0 = off, 1 = on +int dowBrightness = 0; // 0 = auto, > 0 = manual +int dowColorFreq = 0; // 0 = sec, 1 = min, 2 = hour, 3 = day +int briClock, briDown; +int briClockMin, briClockMax; +int briDownMin, briDownMax; +// knx +String knxAddr = ""; // ip address +int knxPort = 8080; // port number +String briKNXPath = ""; // brightness item +int briKNXmin, briKNXmax; +String temKNXPath = ""; // temperature item +String humKNXPath = ""; // humidity item +HttpClient client = HttpClient(wifi, knxAddr.c_str(), knxPort); +// downlights +int dowColorSet; +uint32_t dowColor; +int dowColorR, dowColorG, dowColorB; +uint32_t dowColor0; +int dowColor0R, dowColor0G, dowColor0B; +uint32_t dowColor1; +int dowColor1R, dowColor1G, dowColor1B; +uint32_t dowColor2; +int dowColor2R, dowColor2G, dowColor2B; +uint32_t dowColor3; +int dowColor3R, dowColor3G, dowColor3B; +uint32_t dowColor4; +int dowColor4R, dowColor4G, dowColor4B; +uint32_t dowColor5; +int dowColor5R, dowColor5G, dowColor5B; +uint32_t dowColor6; +int dowColor6R, dowColor6G, dowColor6B; +uint32_t dowColor7; +int dowColor7R, dowColor7G, dowColor7B; +uint32_t dowColor8; +int dowColor8R, dowColor8G, dowColor8B; +uint32_t dowColor9; +int dowColor9R, dowColor9G, dowColor9B; +uint32_t dowColor10; +int dowColor10R, dowColor10G, dowColor10B; +uint32_t dowColor11; +int dowColor11R, dowColor11G, dowColor11B; +uint32_t dowColor12; +int dowColor12R, dowColor12G, dowColor12B; +uint32_t dowColor13; +int dowColor13R, dowColor13G, dowColor13B; +// mode clock +String clkAddr = "ch.pool.ntp.org"; +String clkZone = "CET-1CEST,M3.5.0,M10.5.0/3"; +int clkFormat = 1; // 0 = AM/PM, 1 = 24h +int clkColorSet = 0; // 0 = 2 def, 1 = 2 random +uint32_t clkHColor; +int clkHColorR, clkHColorG, clkHColorB; +uint32_t clkMColor; +int clkMColorR, clkMColorG, clkMColorB; +// mode date +int datFormat = 1; // 0 = MMdd, 1 = ddMM +int datColorSet = 0; // 0 = 2 def, 1 = 2 random +uint32_t datDColor; +int datDColorR, datDColorG, datDColorB; +uint32_t datMColor; +int datMColorR, datMColorG, datMColorB; +// mode temperature +int temSymbol = 1; // 0 = Fahrenheit, 1 = Celsius +uint32_t temColor; +double temKNXValue = 0; +// mode humidity +int humColorSet = 0; // 0 = 3 def, 1 = 3 random +uint32_t humAColor; +int humAColorR, humAColorG, humAColorB; +uint32_t humBColor; +int humBColorR, humBColorG, humBColorB; +uint32_t humCColor; +int humCColorR, humCColorG, humCColorB; +int humKNXValue = 0; +// mode scoreboard +uint32_t scoHColor; +int scoHColorR, scoHColorG, scoHColorB; +int scoHValue = 0; +uint32_t scoAColor; +int scoAColorR, scoAColorG, scoAColorB; +int scoAValue = 0; +// mode countdown +uint32_t couMillis = 0; +uint32_t couMillisEnd = 0; +uint32_t couHColor; +int couHColorR, couHColorG, couHColorB; +uint32_t couMColor; +int couMColorR, couMColorG, couMColorB; +uint32_t couSColor; +int couSColorR, couSColorG, couSColorB; +uint32_t couAColor; +int couAColorR, couAColorG, couAColorB; +// mode scroll +uint32_t scrMillis = 0; +uint32_t scrMillisPrev = 0; +int scrTime; +int scrDisplayMode = 0; + +// ---------------------------------------------------------------------------- +// FUNCTION DECLARATIONS +// ---------------------------------------------------------------------------- + +void initFlash(); +void initWifi(); +void initSPIFFS(); +void initNTP(); +void initHandlers(); +void initServer(); +void initLED(); + +void reconnectWifi(); +void getNTP(); +void getKNXdata(int s); + +void modeClk(); +void modeDat(); +void modeTem(); +void modeHum(); +void modeSco(); +void modeCou(); +void modeScr(); + +void displayDownlights(); +void numberDisplay(int d, int offset, uint32_t color); +void countdownEnd(); +void taskCore0code(void *pvParameters); // ---------------------------------------------------------------------------------------------------- -// FUNCTIONS +// SETUP // ---------------------------------------------------------------------------------------------------- -// init message -void initMessage() { - Serial.println( "====================================================================================================" ); - Serial.println( "Shelf Edge Clock for ESP32" ); - Serial.println( "Author CaptSnus" ); - Serial.println( "Licence tbd" ); - Serial.println( "Info https://github.com/CaptSnus/ShelfEdgeClock" ); - Serial.printf ( "Version %s\n", version ); - Serial.println( "====================================================================================================" ); -} - -// flash -void initFlash() { - Serial.println( "\nPreferences" ); - Serial.println( "--------------------------------------------------" ); - Serial.println( "[*] Loading values from flash ..." ); - pref.begin( "shelfclock", false ); // create array for the values - // wifi - apSSID = pref.getString( "apSSID", apSSID ); - apPass = pref.getString( "apPass", apPass ); - apHide = pref.getInt( "apHide", apHide ); - apIP1 = pref.getInt( "apIP1", 192 ); - apIP2 = pref.getInt( "apIP2", 168 ); - apIP3 = pref.getInt( "apIP3", 100 ); - apIP4 = pref.getInt( "apIP4", 1 ); - apGW1 = pref.getInt( "apGW1", 192 ); - apGW2 = pref.getInt( "apGW2", 168 ); - apGW3 = pref.getInt( "apGW3", 100 ); - apGW4 = pref.getInt( "apGW4", 1 ); - apSN1 = pref.getInt( "apSN1", 255 ); - apSN2 = pref.getInt( "apSN2", 255 ); - apSN3 = pref.getInt( "apSN3", 255 ); - apSN4 = pref.getInt( "apSN4", 0 ); - wifiConfig = pref.getInt( "wifiConfig", wifiConfig ); - wifiSSID = pref.getString( "wifiSSID", wifiSSID ); - wifiPass = pref.getString( "wifiPass", wifiPass ); - wifiDHCP = pref.getInt( "wifiDHCP", wifiDHCP ); - wifiIP1 = pref.getInt( "wifiIP1" ); - wifiIP2 = pref.getInt( "wifiIP2" ); - wifiIP3 = pref.getInt( "wifiIP3" ); - wifiIP4 = pref.getInt( "wifiIP4" ); - wifiGW1 = pref.getInt( "wifiGW1" ); - wifiGW2 = pref.getInt( "wifiGW2" ); - wifiGW3 = pref.getInt( "wifiGW3" ); - wifiGW4 = pref.getInt( "wifiGW4" ); - wifiSN1 = pref.getInt( "wifiSN1" ); - wifiSN2 = pref.getInt( "wifiSN2" ); - wifiSN3 = pref.getInt( "wifiSN3" ); - wifiSN4 = pref.getInt( "wifiSN4" ); - host = pref.getString ( "host", host ); - // content - // |- global settings - gloBrightness = pref.getInt( "gloBrightness", gloBrightness ); - briClockMin = pref.getInt( "briClockMin", 2 ); - briClockMax = pref.getInt( "briClockMax", 125 ); - gloColorFreq = pref.getInt( "gloColorFreq", gloColorFreq ); - dowUsage = pref.getInt( "dowUsage", dowUsage ); - dowBrightness = pref.getInt( "dowBrightness", dowBrightness ); - briDownMin = pref.getInt( "briDownMin ", 10 ); - briDownMax = pref.getInt( "briDownMax", 250 ); - dowColorFreq = pref.getInt( "dowColorFreq", dowColorFreq ); - // |- knx connection - knxAddr = pref.getString( "knxAddr" ); - knxPort = pref.getInt( "knxPort" ); - briKNXPath = pref.getString( "briKNXPath" ); - briKNXmin = pref.getInt( "briKNXmin", 0 ); - briKNXmax = pref.getInt( "briKNXmax", 150000 ); - temKNXPath = pref.getString( "temKNXPath" ); - humKNXPath = pref.getString( "humKNXPath" ); - // |- downlights - dowColorSet = pref.getInt( "dowColorSet", 0 ); - dowColorR = pref.getInt( "dowColorR", 255 ); - dowColorG = pref.getInt( "dowColorG", 255 ); - dowColorB = pref.getInt( "dowColorB", 255 ); - dowColor0R = pref.getInt( "dowColor0R", 255 ); - dowColor0G = pref.getInt( "dowColor0G", 255 ); - dowColor0B = pref.getInt( "dowColor0B", 255 ); - dowColor1R = pref.getInt( "dowColor1R", 255 ); - dowColor1G = pref.getInt( "dowColor1G", 255 ); - dowColor1B = pref.getInt( "dowColor1B", 255 ); - dowColor2R = pref.getInt( "dowColor2R", 255 ); - dowColor2G = pref.getInt( "dowColor2G", 255 ); - dowColor2B = pref.getInt( "dowColor2B", 255 ); - dowColor3R = pref.getInt( "dowColor3R", 255 ); - dowColor3G = pref.getInt( "dowColor3G", 255 ); - dowColor3B = pref.getInt( "dowColor3B", 255 ); - dowColor4R = pref.getInt( "dowColor4R", 255 ); - dowColor4G = pref.getInt( "dowColor4G", 255 ); - dowColor4B = pref.getInt( "dowColor4B", 255 ); - dowColor5R = pref.getInt( "dowColor5R", 255 ); - dowColor5G = pref.getInt( "dowColor5G", 255 ); - dowColor5B = pref.getInt( "dowColor5B", 255 ); - dowColor6R = pref.getInt( "dowColor6R", 255 ); - dowColor6G = pref.getInt( "dowColor6G", 255 ); - dowColor6B = pref.getInt( "dowColor6B", 255 ); - dowColor7R = pref.getInt( "dowColor7R", 255 ); - dowColor7G = pref.getInt( "dowColor7G", 255 ); - dowColor7B = pref.getInt( "dowColor7B", 255 ); - dowColor8R = pref.getInt( "dowColor8R", 255 ); - dowColor8G = pref.getInt( "dowColor8G", 255 ); - dowColor8B = pref.getInt( "dowColor8B", 255 ); - dowColor9R = pref.getInt( "dowColor9R", 255 ); - dowColor9G = pref.getInt( "dowColor9G", 255 ); - dowColor9B = pref.getInt( "dowColor9B", 255 ); - dowColor10R = pref.getInt( "dowColor10R", 255 ); - dowColor10G = pref.getInt( "dowColor10G", 255 ); - dowColor10B = pref.getInt( "dowColor10B", 255 ); - dowColor11R = pref.getInt( "dowColor11R", 255 ); - dowColor11G = pref.getInt( "dowColor11G", 255 ); - dowColor11B = pref.getInt( "dowColor11B", 255 ); - dowColor12R = pref.getInt( "dowColor12R", 255 ); - dowColor12G = pref.getInt( "dowColor12G", 255 ); - dowColor12B = pref.getInt( "dowColor12B", 255 ); - dowColor13R = pref.getInt( "dowColor13R", 255 ); - dowColor13G = pref.getInt( "dowColor13G", 255 ); - dowColor13B = pref.getInt( "dowColor13B", 255 ); - // |- mode clock - clkAddr = pref.getString( "clkAddr", clkAddr ); - clkZone = pref.getString( "clkZone", clkZone ); - clkFormat = pref.getInt( "clkFormat", 1 ); - clkColorSet = pref.getInt( "clkColorSet", 0 ); - clkHColorR = pref.getInt( "clkHColorR", 85 ); - clkHColorG = pref.getInt( "clkHColorG", 26 ); - clkHColorB = pref.getInt( "clkHColorB", 139 ); - clkMColorR = pref.getInt( "clkMColorR", 255 ); - clkMColorG = pref.getInt( "clkMColorG", 0 ); - clkMColorB = pref.getInt( "clkMColorB" , 132); - // |- mode date - datFormat = pref.getInt( "datFormat", 1 ); - datColorSet = pref.getInt( "datColorSet", 0 ); - datDColorR = pref.getInt( "datDColorR", 255 ); - datDColorG = pref.getInt( "datDColorG", 215 ); - datDColorB = pref.getInt( "datDColorB", 0 ); - datMColorR = pref.getInt( "datMColorR", 255 ); - datMColorG = pref.getInt( "datMColorG", 69 ); - datMColorB = pref.getInt( "datMColorB", 0 ); - // |- mode temperature - temSymbol = pref.getInt( "temSymbol", 1 ); - temColorSet = pref.getInt( "temColorSet", 0 ); - temAColorR = pref.getInt( "temAColorR", 255 ); - temAColorG = pref.getInt( "temAColorG", 0 ); - temAColorB = pref.getInt( "temAColorB", 0 ); - temBColorR = pref.getInt( "temBColorR", 0 ); - temBColorG = pref.getInt( "temBColorG", 255 ); - temBColorB = pref.getInt( "temBColorB", 0 ); - temCColorR = pref.getInt( "temCColorR", 0 ); - temCColorG = pref.getInt( "temCColorG", 0 ); - temCColorB = pref.getInt( "temCColorB", 255 ); - // |- mode humidity - humColorSet = pref.getInt( "humColorSet", 0 ); - humAColorR = pref.getInt( "humAColorR", 255 ); - humAColorG = pref.getInt( "humAColorG", 255 ); - humAColorB = pref.getInt( "humAColorB", 0 ); - humBColorR = pref.getInt( "humBColorR", 0 ); - humBColorG = pref.getInt( "humBColorG", 255 ); - humBColorB = pref.getInt( "humBColorB", 255 ); - humCColorR = pref.getInt( "humCColorR", 255 ); - humCColorG = pref.getInt( "humCColorG", 0 ); - humCColorB = pref.getInt( "humCColorB", 255 ); - // |- mode scoreboard - scoHColorR = pref.getInt( "scoHColorR", 0 ); - scoHColorG = pref.getInt( "scoHColorG", 0 ); - scoHColorB = pref.getInt( "scoHColorB", 255 ); - scoAColorR = pref.getInt( "scoAColorR", 0 ); - scoAColorG = pref.getInt( "scoAColorG", 255 ); - scoAColorB = pref.getInt( "scoAColorB", 255 ); - // |- mode countdown - couHColorR = pref.getInt( "couHColorR", 255 ); - couHColorG = pref.getInt( "couHColorG", 140 ); - couHColorB = pref.getInt( "couHColorB", 0 ); - couMColorR = pref.getInt( "couMColorR", 255 ); - couMColorG = pref.getInt( "couMColorG", 165 ); - couMColorB = pref.getInt( "couMColorB", 0 ); - couSColorR = pref.getInt( "couSColorR", 255 ); - couSColorG = pref.getInt( "couSColorG", 215 ); - couSColorB = pref.getInt( "couSColorB", 0 ); - couAColorR = pref.getInt( "couAColorR", 255 ); - couAColorG = pref.getInt( "couAColorG", 0 ); - couAColorB = pref.getInt( "couAColorB", 0 ); - // |- mode scroll - scrTime = pref.getInt( "scrTime", 5 ); - - Serial.println( "[+] All values loaded"); +void setup() { + Serial.begin(115200); // initialize serial connection + delay(1000); // wait a second for the serial to properly start + Serial.println("Shelf Edge Clock for ESP32"); + Serial.println("Author CaptSnus"); + Serial.println("Licence tbd"); + Serial.println("Info https://github.com/CaptSnus/ShelfEdgeClock"); + Serial.printf("Version %s\n", version); + + initFlash(); // load all saved settings + initWifi(); // configure wifi + initSPIFFS(); // initialize spiffs + initNTP(); // get the time from ntp + initHandlers(); // load all web handlers + initServer(); // configure webserver + initLED(); // init neopixels + + getKNXdata(1); + getKNXdata(2); + getKNXdata(3); + + xTaskCreatePinnedToCore( // task 1 (running on core 0) + taskCore0code, // function to implement the task + "taskCore0", // name of the task + 10000, // stack size in words + NULL, // task input parameter + 0, // priority of the task + &taskCore0, // task handle + 0); // core where the task should run } -// wifi -void initWifi() { - Serial.println( "\nWiFi" ); - Serial.println( "--------------------------------------------------" ); - // access point - apLocalIP = IPAddress( apIP1, apIP2, apIP3, apIP4 ); // populated and validated in web gui or predefinied - apGateway = IPAddress( apGW1, apGW2, apGW3, apGW4 ); // populated and validated in web gui or predefinied - apSubnet = IPAddress( apSN1, apSN2, apSN3, apSN4 ); // populated and validated in web gui or predefinied - Serial.println( "[*] Creating access point ..."); - WiFi.mode( WIFI_AP_STA ); // set mode to access point and wifi client - WiFi.softAPConfig( apLocalIP, apGateway, apSubnet ); // configure access point - WiFi.softAP( apSSID.c_str(), apPass.c_str(), 1, apHide ); // start access point - Serial.println( "[+] Access point created" ); - Serial.print( " SSID: " ); - Serial.println( WiFi.softAPSSID() ); - Serial.print( " Password: " ); - Serial.println( apPass ); - Serial.print( " IP Address: " ); - Serial.println( WiFi.softAPIP() ); +// ---------------------------------------------------------------------------------------------------- +// LOOP +// ---------------------------------------------------------------------------------------------------- - // wifi client - if ( wifiDHCP ) { // special settings for wifi client - wifiLocalIP = IPAddress( wifiIP1, wifiIP2, wifiIP3, wifiIP4 ); // populated in web gui - wifiGateway = IPAddress( wifiGW1, wifiGW2, wifiGW3, wifiGW4 ); // populated in web gui - wifiSubnet = IPAddress( wifiSN1, wifiSN2, wifiSN3, wifiSN4 ); // populated in web gui - } - Serial.println( "[*] Connecting to wifi ..." ); - WiFi.config( wifiLocalIP, wifiGateway, wifiSubnet ); // configure wifi client - WiFi.begin( wifiSSID.c_str(), wifiPass.c_str() ); // start wifi client - for ( int i = 0; i < 10; i++ ) { // wait for wifi connection - delay(200); - if ( WiFi.status() == WL_CONNECTED ) { // check if connected to wifi - Serial.println( "[+] Connected to wifi"); - Serial.print( " SSID: " ); - Serial.println( WiFi.SSID() ); - Serial.print( " IP Address: " ); - Serial.println( WiFi.localIP() ); - break; // if connected, leave the FOR - } - } - if ( WiFi.status() != WL_CONNECTED ) { // if no wifi connection after the wait period - WiFi.disconnect(); // turn off wifi client connection - Serial.println( "[!] Not connected to your network" ); +void loop() { + currMillisCore1 = millis(); // update reference time + ElegantOTA.loop(); // reboot after update + + if ((currMillisCore1 - prevTimeSecCore1) >= + 1000) { // inside here every second + prevTimeSecCore1 = currMillisCore1; // update previous reference time + + time(&now); // read the current time + localtime_r(&now, &ntpTime); // update ntpTime with the current time + + if (displayMode == 0) { + modeClk(); + } // call clock mode + + if (displayMode == 1) { + modeDat(); + } // call date mode + if (displayMode == 2) { + modeTem(); + } // call temperature mode + if (displayMode == 3) { + modeHum(); + } // call humidity mode + if (displayMode == 4) { + modeSco(); + } // call scoreboard mode + if (displayMode == 5) { + modeCou(); + } // call countdown mode + if (displayMode == 6) { + modeScr(); + } // call scroll mode + + ledClock.show(); // show the content of the mode } } -void reconnectWifi() { - WiFi.disconnect(); // close current connection - WiFi.reconnect(); // reconnect with previous settings -} +// ---------------------------------------------------------------------------- +// FUNCTION DEFINITIONS +// ---------------------------------------------------------------------------- -// mdns -void initmDNS() { - Serial.println( "\nmDNS" ); - Serial.println( "--------------------------------------------------" ); - if ( MDNS.begin( host.c_str() ) ) { - Serial.println( "[+] mDNS started"); - Serial.print( " Host: " ); - Serial.println( host ); - } else { - Serial.println( "[!] An error occured during mDNS start!" ); - } -} +/** + * @brief CLOCK Mode + * @details display the current time on the front of the shelf + * @since 1.0.0 + */ +void modeClk() { + ledClock.clear(); -// spiffs -void initSPIFFS() { - Serial.println( "\nSPIFFS" ); - Serial.println( "--------------------------------------------------" ); - if ( SPIFFS.begin( true ) ) { - Serial.println( "[+] SPIFFS mounted correctly." ); - } else { - Serial.println( "[!] An error occurred during SPIFFS mounting!" ); - } -} + int hour = ntpTime.tm_hour; // hours + int mins = ntpTime.tm_min; // minutes + int secs = ntpTime.tm_sec; // seconds -// ntp -void initNTP() { - if ( WiFi.status() != WL_CONNECTED ) { return; } // NO wifi -> no call - - Serial.println( "\nNTP" ); - Serial.println( "--------------------------------------------------" ); - Serial.println( "[*] Connecting to NTP server ..." ); - configTime( 0, 0, clkAddr.c_str() ); // First connect to NTP server, with 0 TZ offset - setenv( "TZ", clkZone.c_str(), 1 ); // Overwrite system timezone with defined timezone - tzset(); // Now adjust the timezone - if ( getLocalTime( &ntpTime ) ) { - Serial.println( "[+] NTP started correctly." ); - } else { - Serial.println( "[!] An error occured during NTP starting!" ); + if (!clkFormat) { // adjust hours for AM/PM + if (hour > 12) { // if hours > 12 + hour = hour - 12; // turn 13:mm to 01:mm PM + } + if (hour < 1) { // if hours = 00 + hour = hour + 12; // turn 00:mm to 12:mm AM + } } -} -void getNTP() { - if ( WiFi.status() != WL_CONNECTED ) { return; } // NO wifi -> no call + int h1 = floor(hour / 10); // build h1 + int h2 = hour % 10; // build h2 + int m1 = floor(mins / 10); // build m1 + int m2 = mins % 10; // build m2 + int s1 = floor(secs / 10); // build s1 + int s2 = secs % 10; // build s2 - if ( getLocalTime( &ntpTime ) ) { - Serial.println( "[+] NTP fetch complete." ); - } else { - Serial.println( "[!] NTP fetch failure!" ); + if (clkColorSet == 0) { // 2 defined + clkHColor = ledClock.Color(clkHColorR, clkHColorG, clkHColorB); + clkMColor = ledClock.Color(clkMColorR, clkMColorG, clkMColorB); } -} - -// web -void initServer() { - Serial.println( "\nWebserver" ); - Serial.println( "--------------------------------------------------" ); - Serial.println( "[*] Starting webserver ..." ); - server.serveStatic("/", SPIFFS, "/" ); // set path - AsyncElegantOTA.begin(&server); // start ElegantOTA - server.begin(); // start webserver - Serial.println("[+] Web ready to surf"); -} - -// led -void initLED() { - ledClock.begin(); // start ledstrip for the clock ... - ledClock.show(); // ... show() is mandatory - ledDownlight.begin(); // start ledstrip for the downlights ... - ledDownlight.show(); // ... show() is mandatory -} - -void displayDownlights() { - if ( dowUsage == 1 ) { - if ( dowColorSet == 0 ) { - dowColor = ledDownlight.Color( dowColorR, dowColorG, dowColorB ); - ledDownlight.fill( dowColor, 0, DOWNLIGHT_COUNT ); - } - if ( dowColorSet == 1 ) { - dowColor0 = ledDownlight.Color( dowColor0R, dowColor0G, dowColor0B ); - ledDownlight.fill( dowColor0, 0, 1 ); - dowColor1 = ledDownlight.Color( dowColor1R, dowColor1G, dowColor1B ); - ledDownlight.fill( dowColor1, 1, 1 ); - dowColor2 = ledDownlight.Color( dowColor2R, dowColor2G, dowColor2B ); - ledDownlight.fill( dowColor2, 2, 1 ); - dowColor3 = ledDownlight.Color( dowColor3R, dowColor3G, dowColor3B ); - ledDownlight.fill( dowColor3, 3, 1 ); - dowColor4 = ledDownlight.Color( dowColor4R, dowColor4G, dowColor4B ); - ledDownlight.fill( dowColor4, 4, 1 ); - dowColor5 = ledDownlight.Color( dowColor5R, dowColor5G, dowColor5B ); - ledDownlight.fill( dowColor5, 5, 1 ); - dowColor6 = ledDownlight.Color( dowColor6R, dowColor6G, dowColor6B ); - ledDownlight.fill( dowColor6, 6, 1 ); - dowColor7 = ledDownlight.Color( dowColor7R, dowColor7G, dowColor7B ); - ledDownlight.fill( dowColor7, 7, 1 ); - dowColor8 = ledDownlight.Color( dowColor8R, dowColor8G, dowColor8B ); - ledDownlight.fill( dowColor8, 8, 1 ); - dowColor9 = ledDownlight.Color( dowColor9R, dowColor9G, dowColor9B ); - ledDownlight.fill( dowColor9, 9, 1 ); - dowColor10 = ledDownlight.Color( dowColor10R, dowColor10G, dowColor10B ); - ledDownlight.fill( dowColor10, 10, 1 ); - dowColor11 = ledDownlight.Color( dowColor11R, dowColor11G, dowColor11B ); - ledDownlight.fill( dowColor11, 11, 1 ); - dowColor12 = ledDownlight.Color( dowColor12R, dowColor12G, dowColor12B ); - ledDownlight.fill( dowColor12, 12, 1 ); - dowColor13 = ledDownlight.Color( dowColor13R, dowColor13G, dowColor13B ); - ledDownlight.fill( dowColor13, 13, 1 ); - } - if ( dowColorSet == 2 && ( - ( dowColorFreq == 0 ) || - ( dowColorFreq == 1 && downMinPassed ) || - ( dowColorFreq == 2 && downHourPassed ) || - ( dowColorFreq == 3 && downDayPassed ) ) ) { - dowColor = ledDownlight.ColorHSV( random( 0, 65535 ), 255, 255 ); - ledDownlight.fill( dowColor, 0, DOWNLIGHT_COUNT ); - } - if ( dowColorSet == 3 && ( - ( dowColorFreq == 0 ) || - ( dowColorFreq == 1 && downMinPassed ) || - ( dowColorFreq == 2 && downHourPassed ) || - ( dowColorFreq == 3 && downDayPassed ) ) ) { - for ( int i = 0; i < DOWNLIGHT_COUNT; i++ ) { - dowColor = ledDownlight.ColorHSV( random( 0, 65535 ), 255, 255 ); - ledDownlight.fill( dowColor, i, 1 ); - } - } - } else { - ledDownlight.clear(); // or turn them all off + if (clkColorSet == 1 && + ( // 2 random + (gloColorFreq == 0) || // every sec + (gloColorFreq == 1 && clockMinPassed) || // every min + (gloColorFreq == 2 && clockHourPassed) || // every hour + (gloColorFreq == 3 && clockDayPassed))) { // every day + clkHColor = ledClock.ColorHSV(random(0, 65535), 255, 255); + clkMColor = ledClock.ColorHSV(random(0, 65535), 255, 255); } - downMinPassed = false; // reset the color change flag (1 minute) - downHourPassed = false; // reset the color change flag (1 hour) - downDayPassed = false; // reset the color change flag (1 day) + numberDisplay(h1, 189, clkHColor); // show first digit + numberDisplay(h2, 126, clkHColor); // show second digit + numberDisplay(m1, 63, clkMColor); // show third digit + numberDisplay(m2, 0, clkMColor); // show fourth digit - ledDownlight.show(); // show the downlights + clockMinPassed = false; // reset (1 min) + clockHourPassed = false; // reset (1 hour) + clockDayPassed = false; // reset (1 day) } -void numberDisplay( int digitToDisplay, int offset, uint32_t color ) { - switch ( digitToDisplay ) { - case 0: ledClock.fill( color, ( 0 + offset ), 27 ); // 0 - ledClock.fill( color, ( 36 + offset ), 27 ); - break; - case 1: ledClock.fill( color, ( 0 + offset ), 9 ); // 1 - ledClock.fill( color, ( 36 + offset ), 9 ); - break; - case 2: ledClock.fill( color, ( 0 + offset ), 18 ); // 2 - ledClock.fill( color, ( 27 + offset ), 9 ); - ledClock.fill( color, ( 45 + offset ), 18 ); - break; - case 3: ledClock.fill( color, ( 0 + offset ), 18 ); // 3 - ledClock.fill( color, ( 27 + offset ), 27 ); - break; - case 4: ledClock.fill( color, ( 0 + offset ), 9 ); // 4 - ledClock.fill( color, ( 18 + offset ), 27 ); - break; - case 5: ledClock.fill( color, ( 9 + offset ), 45 ); // 5 - break; - case 6: ledClock.fill( color, ( 9 + offset ), 54 ); // 6 - break; - case 7: ledClock.fill( color, ( 0 + offset ), 18 ); // 7 - ledClock.fill( color, ( 36 + offset ), 9 ); - break; - case 8: ledClock.fill( color, ( 0 + offset ), 63 ); // 8 - break; - case 9: ledClock.fill( color, ( 0 + offset ), 54 ); // 9 - break; - case 10: ledClock.fill( color, ( 0 + offset ), 45 ); // A - ledClock.fill( color, ( 54 + offset ), 9 ); - break; - case 11: ledClock.fill( color, ( 18 + offset ), 45 ); // b - break; - case 12: ledClock.fill( color, ( 9 + offset ), 18 ); // C - ledClock.fill( color, ( 45 + offset ), 18 ); - break; - case 13: ledClock.fill( color, ( 0 + offset ), 9 ); // d - ledClock.fill( color, ( 27 + offset ), 36 ); - break; - case 14: ledClock.fill( color, ( 9 + offset ), 27 ); // E - ledClock.fill( color, ( 45 + offset ), 18 ); - break; - case 15: ledClock.fill( color, ( 9 + offset ), 27 ); // F - ledClock.fill( color, ( 54 + offset ), 9 ); - break; - case 16: ledClock.fill( color, ( 0 + offset ), 9 ); // G - ledClock.fill( color, ( 27 + offset ), 36 ); - break; - case 17: ledClock.fill( color, ( 0 + offset ), 9 ); // H - ledClock.fill( color, ( 18 + offset ), 27 ); - ledClock.fill( color, ( 54 + offset ), 9 ); - break; - case 18: ledClock.fill( color, ( 0 + offset ), 9 ); // I - ledClock.fill( color, ( 36 + offset ), 9 ); - break; - case 19: ledClock.fill( color, ( 0 + offset ), 0 ); // J - ledClock.fill( color, ( 36 + offset ), 18 ); - break; - case 20: break; // K - case 21: ledClock.fill( color, ( 18 + offset ), 9 ); // L - ledClock.fill( color, ( 45 + offset ), 18 ); - break; - case 22: break; // M - case 23: ledClock.fill( color, ( 27 + offset ), 18 ); // n - ledClock.fill( color, ( 54 + offset ), 9 ); - break; - case 24: ledClock.fill( color, ( 27 + offset ), 36 ); // o - break; - case 25: ledClock.fill( color, ( 0 + offset ), 36 ); // P - ledClock.fill( color, ( 45 + offset ), 9 ); - break; - case 26: break; // Q - case 27: ledClock.fill( color, ( 27 + offset ), 9 ); // r - ledClock.fill( color, ( 54 + offset ), 9 ); - break; - case 28: ledClock.fill( color, ( 9 + offset ), 45 ); // S - break; - case 29: ledClock.fill( color, ( 18 + offset ), 18 ); // t - ledClock.fill( color, ( 45 + offset ), 18 ); - break; - case 30: ledClock.fill( color, ( 0 + offset ), 9 ); // U - ledClock.fill( color, ( 18 + offset ), 9 ); - ledClock.fill( color, ( 36 + offset ), 27 ); - break; - case 31: break; // V - case 32: break; // W - case 33: break; // X - case 34: ledClock.fill( color, ( 0 + offset ), 9 ); // Y - ledClock.fill( color, ( 18 + offset ), 36 ); - break; - case 35: ledClock.fill( color, ( 0 + offset ), 18 ); // Z - ledClock.fill( color, ( 27 + offset ), 9 ); - ledClock.fill( color, ( 45 + offset ), 18 ); - break; - case 36: ledClock.fill( color, ( 0 + offset ), 36 ); // ° - break; - default: break; - } -} - -void countdownEnd() { - ledClock.setBrightness( 150 ); - couAColor = ledClock.Color( couAColorR, couAColorG, couAColorB ); +/** + * @brief DATE mode + * @details display the current date on the front of the shelf + * @since 1.0.0 + */ +void modeDat() { ledClock.clear(); - ledClock.show(); - for ( int i = 0; i < 5; i++ ) { - numberDisplay( 14, 189, couAColor ); - numberDisplay( 23, 126, couAColor ); - numberDisplay( 13, 63, couAColor ); - numberDisplay( 14, 0, couAColor ); - ledClock.show(); - delay( 500 ); - ledClock.clear(); - ledClock.show(); - delay( 300 ); + + int d1 = floor(ntpTime.tm_mday / 10); // build d1 + int d2 = ntpTime.tm_mday % 10; // build d2 + int m1 = floor((ntpTime.tm_mon + 1) / 10); // build m1 + int m2 = (ntpTime.tm_mon + 1) % 10; // build m2 + + if (datColorSet == 0) { // 2 defined + datDColor = ledClock.Color(datDColorR, datDColorG, datDColorB); + datMColor = ledClock.Color(datMColorR, datMColorG, datMColorB); } - ledClock.clear(); - ledClock.show(); - delay( 5000 ); - if ( gloBrightness == 0 ) { // value = 0 -> automatic mode - ledClock.setBrightness( briClock ); - } else { - ledClock.setBrightness( gloBrightness / 2 ); + if (datColorSet == 1 && + ( // 2 random + (gloColorFreq == 0) || // every sec + (gloColorFreq == 1 && clockMinPassed) || // every min + (gloColorFreq == 2 && clockHourPassed) || // every hour + (gloColorFreq == 3 && clockDayPassed))) { // every day + datDColor = ledClock.ColorHSV(random(0, 65535), 255, 255); + datMColor = ledClock.ColorHSV(random(0, 65535), 255, 255); } - displayMode = 0; - pref.putInt( "displayMode", 0 ); -} -// content -void getBrightness() { - if ( WiFi.status() != WL_CONNECTED ) { return; } // NO wifi -> no call - - if ( gloBrightness == 0 ) { // value = 0 -> automatic mode - client.get( briKNXPath ); // call knx for value - int brightnessKNX = client.responseBody().toInt(); // write answer to value - briClock = map( brightnessKNX, briKNXmin, briKNXmax, briClockMin, briClockMax ); - ledClock.setBrightness( briClock ); - } else { // value > 0 -> manual mode - ledClock.setBrightness( gloBrightness / 2 ); - } - if ( dowBrightness == 0 ) { - client.get( briKNXPath ); // call knx for value - int brightnessKNX = client.responseBody().toInt(); // write answer to value - briDown = map( brightnessKNX, briKNXmin, briKNXmax, briDownMin, briDownMax ); - ledDownlight.setBrightness( briDown ); + if (datFormat) { + numberDisplay(d1, 189, datDColor); // show first digit + numberDisplay(d2, 126, datDColor); // show second digit + numberDisplay(m1, 63, datMColor); // show third digit + numberDisplay(m2, 0, datMColor); // show fourth digit } else { - ledDownlight.setBrightness( dowBrightness ); + numberDisplay(m1, 189, datMColor); // show first digit + numberDisplay(m2, 126, datMColor); // show second digit + numberDisplay(d1, 63, datDColor); // show third digit + numberDisplay(d2, 0, datDColor); // show fourth digit } -} - -void getHumidity() { - if ( WiFi.status() != WL_CONNECTED ) { return; } // NO wifi -> no call - client.get( humKNXPath ); - humKNXValue = int( ( client.responseBody().toDouble() ) * 10 ); + clockMinPassed = false; // reset (1 min) + clockHourPassed = false; // reset (1 hour) + clockDayPassed = false; // reset (1 day) } -void getTemperature() { - if ( WiFi.status() != WL_CONNECTED ) { return; } // NO wifi -> no call +/** + * @brief TEMPERATURE mode + * @details show the current temperature on the front of the shelf + * @since 1.0.0 + */ +void modeTem() { + ledClock.clear(); // clear all leds - client.get(temKNXPath); - temKNXValue = int( ( client.responseBody().toDouble() ) * 10 ); -} + int temp = round(temKNXValue); // round + int t1, t2, t3; // throwaway variable -// webhandler -void initHandlers() { - - // default - server.on( "/", HTTP_GET, []( AsyncWebServerRequest *request ){ request->send( SPIFFS, "/index.html", "text/html", false ); } ); - - // index.html - server.on( "/goModeClk", HTTP_POST, []( AsyncWebServerRequest *request ) { displayMode = 0; pref.putInt( "displayMode", displayMode ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/goModeDat", HTTP_POST, []( AsyncWebServerRequest *request ) { displayMode = 1; pref.putInt( "displayMode", displayMode ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/goModeTem", HTTP_POST, []( AsyncWebServerRequest *request ) { displayMode = 2; pref.putInt( "displayMode", displayMode ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/goModeHum", HTTP_POST, []( AsyncWebServerRequest *request ) { displayMode = 3; pref.putInt( "displayMode", displayMode ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/goModeSco", HTTP_POST, []( AsyncWebServerRequest *request ) { displayMode = 4; pref.putInt( "displayMode", displayMode ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); scoHValue = request->arg( "scoHome" ).toInt(); if ( scoHValue < 0 ) { scoHValue = 0; } if ( scoHValue > 99 ) {scoHValue = 99; } scoAValue = request->arg( "scoAway" ).toInt(); if ( scoAValue < 0 ) { scoAValue = 0; } if ( scoAValue > 99 ) { scoAValue = 99; } } ); - server.on( "/goModeCou", HTTP_POST, []( AsyncWebServerRequest *request ) { displayMode = 5; pref.putInt( "displayMode", displayMode ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); couMillis = request->arg( "millis" ).toInt(); if ( couMillis > 86400000 ) { couMillis = 86400000; } couMillisEnd = millis() + couMillis; } ); - server.on( "/goModeScr", HTTP_POST, []( AsyncWebServerRequest *request ) { displayMode = 6; pref.putInt( "displayMode", displayMode ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/goDow", HTTP_POST, []( AsyncWebServerRequest *request ) { request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); dowUsage = request->arg( "dowUsage" ).toInt(); pref.putInt( "dowUsage", dowUsage ); dowColorSet = request->arg( "dowColorSet" ).toInt(); pref.putInt( "dowColorSet", dowColorSet ); } ); - - // settings.html - // |- global - server.on( "/getGloBrightness", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( gloBrightness ) ); } ); - server.on( "/updGloBrightness", HTTP_POST, []( AsyncWebServerRequest *request ) { gloBrightness = request->arg( "gloBrightness" ).toInt(); pref.putInt( "gloBrightness", gloBrightness ); getBrightness(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getBriClockMin", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( briClockMin ) ); } ); - server.on( "/updBriClockMin", HTTP_POST, []( AsyncWebServerRequest *request ) { briClockMin = request->arg( "briClockMin" ).toInt(); pref.putInt( "briClockMin", briClockMin ); getBrightness(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getBriClockMax", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( briClockMax ) ); } ); - server.on( "/updBriClockMax", HTTP_POST, []( AsyncWebServerRequest *request ) { briClockMax = request->arg( "briClockMax" ).toInt(); pref.putInt( "briClockMax", briClockMax ); getBrightness(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getGloColorFreq", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( gloColorFreq ) ); } ); - server.on( "/updGloColorFreq", HTTP_POST, []( AsyncWebServerRequest *request ) { gloColorFreq = request->arg( "gloColorFreq" ).toInt(); pref.putInt( "gloColorFreq", gloColorFreq ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowUsage", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( dowUsage ) ); } ); - server.on( "/updDowUsage", HTTP_POST, []( AsyncWebServerRequest *request ) { dowUsage = request->arg( "dowUsage" ).toInt(); pref.putInt( "dowUsage", dowUsage ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowBrightness", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( dowBrightness ) ); } ); - server.on( "/updDowBrightness", HTTP_POST, []( AsyncWebServerRequest *request ) { dowBrightness = request->arg( "dowBrightness" ).toInt(); pref.putInt( "dowBrightness", dowBrightness ); getBrightness(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getBriDownMin", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( briDownMin ) ); } ); - server.on( "/updBriDownMin", HTTP_POST, []( AsyncWebServerRequest *request ) { briDownMin = request->arg( "briDownMin" ).toInt(); pref.putInt( "briDownMin", briDownMin ); getBrightness(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getBriDownMax", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( briDownMax ) ); } ); - server.on( "/updBriDownMax", HTTP_POST, []( AsyncWebServerRequest *request ) { briDownMax = request->arg( "briDownMax" ).toInt(); pref.putInt( "briDownMax", briDownMax ); getBrightness(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColorFreq", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( dowColorFreq ) ); } ); - server.on( "/updDowColorFreq", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColorFreq = request->arg( "dowColorFreq" ).toInt(); pref.putInt( "dowColorFreq", dowColorFreq ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); }); - // |- knx - server.on( "/getKNXAddr", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxAddr ) ); } ); - server.on( "/updKNXAddr", HTTP_POST, []( AsyncWebServerRequest *request ) { knxAddr = request->arg( "knxAddr" ); pref.putString( "knxAddr", knxAddr ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getKNXPort", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxPort ) ); } ); - server.on( "/updKNXPort", HTTP_POST, []( AsyncWebServerRequest *request ) { knxPort = request->arg( "knxPort" ).toInt(); pref.putInt( "knxPort", knxPort ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getBriKNXPath", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( briKNXPath ) ); } ); - server.on( "/updBriKNXPath", HTTP_POST, []( AsyncWebServerRequest *request ) { briKNXPath = request->arg( "briKNXPath" ); pref.putString( "briKNXPath", briKNXPath ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getBriKNXmin", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( briKNXmin ) ); } ); - server.on( "/updBriKNXmin", HTTP_POST, []( AsyncWebServerRequest *request ) { briKNXmin = request->arg( "briKNXmin" ).toInt(); pref.putInt( "briKNXmin", briKNXmin ); getBrightness(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getBriKNXmax", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( briKNXmax ) ); } ); - server.on( "/updBriKNXmax", HTTP_POST, []( AsyncWebServerRequest *request ) { briKNXmax = request->arg( "briKNXmax" ).toInt(); pref.putInt( "briKNXmax", briKNXmax ); getBrightness(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getTemKNXPath", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( temKNXPath ) ); } ); - server.on( "/updTemKNXPath", HTTP_POST, []( AsyncWebServerRequest *request ) { temKNXPath = request->arg( "temKNXPath" ); pref.putString( "temKNXPath", temKNXPath ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getHumKNXPath", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( humKNXPath ) ); } ); - server.on( "/updHumKNXPath", HTTP_POST, []( AsyncWebServerRequest *request ) { humKNXPath = request->arg( "humKNXPath" ); pref.putString( "humKNXPath", humKNXPath ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // |- clock - server.on( "/getClkAddr", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkAddr ) ); } ); - server.on( "/updClkAddr", HTTP_POST, []( AsyncWebServerRequest *request ) { clkAddr = request->arg( "clkAddr" ); pref.putString( "clkAddr", clkAddr ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getClkZone", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkZone ) ); } ); - server.on( "/updClkZone", HTTP_POST, []( AsyncWebServerRequest *request ) { clkZone = request->arg( "clkZone" ); pref.putString( "clkZone", clkZone ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getClkFormat", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkFormat ) ); } ); - server.on( "/updClkFormat", HTTP_POST, []( AsyncWebServerRequest *request ) { clkFormat = request->arg( "clkFormat" ).toInt(); pref.putInt( "clkFormat", clkFormat ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getClkColorSet", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkColorSet ) ); } ); - server.on( "/updClkColorSet", HTTP_POST, []( AsyncWebServerRequest *request ) { clkColorSet = request->arg( "clkColorSet" ).toInt(); pref.putInt( "clkColorSet", clkColorSet ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getClkHColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", clkHColorR, clkHColorG, clkHColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updClkHColor", HTTP_POST, []( AsyncWebServerRequest *request ) { clkHColorR = request->arg( "r" ).toInt(); clkHColorG = request->arg( "g" ).toInt(); clkHColorB = request->arg( "b" ).toInt(); pref.putInt( "clkHColorR", clkHColorR ); pref.putInt( "clkHColorG", clkHColorG ); pref.putInt( "clkHColorB", clkHColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getClkMColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", clkMColorR, clkMColorG, clkMColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updClkMColor", HTTP_POST, []( AsyncWebServerRequest *request ) { clkMColorR = request->arg( "r" ).toInt(); clkMColorG = request->arg( "g" ).toInt(); clkMColorB = request->arg( "b" ).toInt(); pref.putInt( "clkMColorR", clkMColorR ); pref.putInt( "clkMColorG", clkMColorG ); pref.putInt( "clkMColorB", clkMColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // |- date - server.on( "/getDatFormat", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( datFormat ) ); } ); - server.on( "/updDatFormat", HTTP_POST, []( AsyncWebServerRequest *request ) { datFormat = request->arg( "datFormat" ).toInt(); pref.putInt( "datFormat", datFormat ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDatColorSet", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( datColorSet ) ); } ); - server.on( "/updDatColorSet", HTTP_POST, []( AsyncWebServerRequest *request ) { datColorSet = request->arg( "datColorSet" ).toInt(); pref.putInt( "datColorSet", datColorSet ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDatDColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", datDColorR, datDColorG, datDColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDatDColor", HTTP_POST, []( AsyncWebServerRequest *request ) { datDColorR = request->arg( "r" ).toInt(); datDColorG = request->arg( "g" ).toInt(); datDColorB = request->arg( "b" ).toInt(); pref.putInt( "datDColorR", datDColorR ); pref.putInt( "datDColorG", datDColorG ); pref.putInt( "datDColorB", datDColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDatMColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", datMColorR, datMColorG, datMColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDatMColor", HTTP_POST, []( AsyncWebServerRequest *request ) { datMColorR = request->arg( "r" ).toInt(); datMColorG = request->arg( "g" ).toInt(); datMColorB = request->arg( "b" ).toInt(); pref.putInt( "datMColorR", datMColorR ); pref.putInt( "datMColorG", datMColorG ); pref.putInt( "datMColorB", datMColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // |- temperature - server.on( "/getTemSymbol", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( temSymbol ) ); } ); - server.on( "/updTemSymbol", HTTP_POST, []( AsyncWebServerRequest *request ) { temSymbol =request->arg( "temSymbol" ).toInt(); pref.putInt( "temSymbol", temSymbol ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getTemColorSet", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( temColorSet ) ); } ); - server.on( "/updTemColorSet", HTTP_POST, []( AsyncWebServerRequest *request ) { temColorSet = request->arg( "temColorSet" ).toInt(); pref.putInt( "temColorSet", temColorSet ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getTemAColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", temAColorR, temAColorG, temAColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updTemAColor", HTTP_POST, []( AsyncWebServerRequest *request ) { temAColorR = request->arg( "r" ).toInt(); temAColorG = request->arg( "g" ).toInt(); temAColorB = request->arg( "b" ).toInt(); pref.putInt( "temAColorR", temAColorR ); pref.putInt( "temAColorG", temAColorG ); pref.putInt( "temAColorB", temAColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getTemBColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", temBColorR, temBColorG, temBColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updTemBColor", HTTP_POST, []( AsyncWebServerRequest *request ) { temBColorR = request->arg( "r" ).toInt(); temBColorG = request->arg( "g" ).toInt(); temBColorB = request->arg( "b" ).toInt(); pref.putInt( "temBColorR", temBColorR ); pref.putInt( "temBColorG", temBColorG ); pref.putInt( "temBColorB", temBColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getTemCColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", temCColorR, temCColorG, temCColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updTemCColor", HTTP_POST, []( AsyncWebServerRequest *request ) { temCColorR = request->arg( "r" ).toInt(); temCColorG = request->arg( "g" ).toInt(); temCColorB = request->arg( "b" ).toInt(); pref.putInt( "temCColorR", temCColorR ); pref.putInt( "temCColorG", temCColorG ); pref.putInt( "temCColorB", temCColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // |- humidity - server.on( "/getHumColorSet", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( humColorSet ) ); } ); - server.on( "/updHumColorSet", HTTP_POST, []( AsyncWebServerRequest *request ) { humColorSet = request->arg( "humColorSet" ).toInt(); pref.putInt( "humColorSet", humColorSet ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getHumAColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", humAColorR, humAColorG, humAColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updHumAColor", HTTP_POST, []( AsyncWebServerRequest *request ) { humAColorR = request->arg( "r" ).toInt(); humAColorG = request->arg( "g" ).toInt(); humAColorB = request->arg( "b" ).toInt(); pref.putInt( "humAColorR", humAColorR ); pref.putInt( "humAColorG", humAColorG ); pref.putInt( "humAColorB", humAColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getHumBColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", humBColorR, humBColorG, humBColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updHumBColor", HTTP_POST, []( AsyncWebServerRequest *request ) { humBColorR = request->arg( "r" ).toInt(); humBColorG = request->arg( "g" ).toInt(); humBColorB = request->arg( "b" ).toInt(); pref.putInt( "humBColorR", humBColorR ); pref.putInt( "humBColorG", humBColorG ); pref.putInt( "humBColorB", humBColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getHumCColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", humCColorR, humCColorG, humCColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updHumCColor", HTTP_POST, []( AsyncWebServerRequest *request ) { humCColorR = request->arg( "r" ).toInt(); humCColorG = request->arg( "g" ).toInt(); humCColorB = request->arg( "b" ).toInt(); pref.putInt( "humCColorR", humCColorR ); pref.putInt( "humCColorG", humCColorG ); pref.putInt( "humCColorB", humCColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // |- scoreboard - server.on( "/getScoHColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", scoHColorR, scoHColorG, scoHColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updScoHColor", HTTP_POST, []( AsyncWebServerRequest *request ) { scoHColorR = request->arg( "r" ).toInt(); scoHColorG = request->arg( "g" ).toInt(); scoHColorB = request->arg( "b" ).toInt(); pref.putInt( "scoHColorR", scoHColorR ); pref.putInt( "scoHColorG", scoHColorG ); pref.putInt( "scoHColorB", scoHColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getScoAColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", scoAColorR, scoAColorG, scoAColorB) ; request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updScoAColor", HTTP_POST, []( AsyncWebServerRequest *request ) { scoAColorR = request->arg( "r" ).toInt(); scoAColorG = request->arg( "g" ).toInt(); scoAColorB = request->arg( "b" ).toInt(); pref.putInt( "scoAColorR", scoAColorR ); pref.putInt( "scoAColorG", scoAColorG ); pref.putInt( "scoAColorB", scoAColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // |- countdown - server.on( "/getCouHColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", couHColorR, couHColorG, couHColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updCouHColor", HTTP_POST, []( AsyncWebServerRequest *request ) { couHColorR = request->arg( "r" ).toInt(); couHColorG = request->arg( "g" ).toInt(); couHColorB = request->arg( "b" ).toInt(); pref.putInt( "couHColorR", couHColorR ); pref.putInt( "couHColorG", couHColorG ); pref.putInt( "couHColorB", couHColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getCouMColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", couMColorR, couMColorG, couMColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updCouMColor", HTTP_POST, []( AsyncWebServerRequest *request ) { couMColorR = request->arg( "r" ).toInt(); couMColorG = request->arg( "g" ).toInt(); couMColorB = request->arg( "b" ).toInt(); pref.putInt( "couMColorR", couMColorR ); pref.putInt( "couMColorG", couMColorG ); pref.putInt( "couMColorB", couMColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getCouSColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", couSColorR, couSColorG, couSColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updCouSColor", HTTP_POST, []( AsyncWebServerRequest *request ) { couSColorR = request->arg( "r" ).toInt(); couSColorG = request->arg( "g" ).toInt(); couSColorB = request->arg( "b" ).toInt(); pref.putInt( "couSColorR", couSColorR ); pref.putInt( "couSColorG", couSColorG ); pref.putInt( "couSColorB", couSColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getCouAColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", couAColorR, couAColorG, couAColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updCouAColor", HTTP_POST, []( AsyncWebServerRequest *request ) { couAColorR = request->arg( "r" ).toInt(); couAColorG = request->arg( "g" ).toInt(); couAColorB = request->arg( "b" ).toInt(); pref.putInt( "couAColorR", couAColorR ); pref.putInt( "couAColorG", couAColorG ); pref.putInt( "couAColorB", couAColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // |- scroll - server.on( "/getScrTime", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( scrTime ) ); } ); - server.on( "/updScrTime", HTTP_POST, []( AsyncWebServerRequest *request ) { scrTime = request->arg( "scrTime" ).toInt(); pref.putInt( "scrTime", scrTime ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // |- downlights - server.on( "/getDowColorSet", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( dowColorSet ) ); } ); - server.on( "/updDowColorSet", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColorSet = request->arg( "dowColorSet" ).toInt(); pref.putInt( "dowColorSet", dowColorSet ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColorR, dowColorG, dowColorB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColorR = request->arg( "r" ).toInt(); dowColorG = request->arg( "g" ).toInt(); dowColorB = request->arg( "b" ).toInt(); pref.putInt( "dowColorR", dowColorR ); pref.putInt( "dowColorG", dowColorG ); pref.putInt( "dowColorB", dowColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor0", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor0R, dowColor0G, dowColor0B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor0", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor0R = request->arg( "r" ).toInt(); dowColor0G = request->arg( "g" ).toInt(); dowColor0B = request->arg( "b" ).toInt(); pref.putInt( "dowColor0R", dowColor0R ); pref.putInt( "dowColor0G", dowColor0G ); pref.putInt( "dowColor0B", dowColor0B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor1", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor1R, dowColor1G, dowColor1B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor1", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor1R = request->arg( "r" ).toInt(); dowColor1G = request->arg( "g" ).toInt(); dowColor1B = request->arg( "b" ).toInt(); pref.putInt( "dowColor1R", dowColor1R ); pref.putInt( "dowColor1G", dowColor1G ); pref.putInt( "dowColor1B", dowColor1B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor2", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor2R, dowColor2G, dowColor2B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor2", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor2R = request->arg( "r" ).toInt(); dowColor2G = request->arg( "g" ).toInt(); dowColor2B = request->arg( "b" ).toInt(); pref.putInt( "dowColor2R", dowColor2R ); pref.putInt( "dowColor2G", dowColor2G ); pref.putInt( "dowColor2B", dowColor2B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor3", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor3R, dowColor3G, dowColor3B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor3", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor3R = request->arg( "r" ).toInt(); dowColor3G = request->arg( "g" ).toInt(); dowColor3B = request->arg( "b" ).toInt(); pref.putInt( "dowColor3R", dowColor3R ); pref.putInt( "dowColor3G", dowColor3G ); pref.putInt( "dowColor3B", dowColor3B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor4", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor4R, dowColor4G, dowColor4B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor4", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor4R = request->arg( "r" ).toInt(); dowColor4G = request->arg( "g" ).toInt(); dowColor4B = request->arg( "b" ).toInt(); pref.putInt( "dowColor4R", dowColor4R ); pref.putInt( "dowColor4G", dowColor4G ); pref.putInt( "dowColor4B", dowColor4B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor5", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor5R, dowColor5G, dowColor5B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor5", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor5R = request->arg( "r" ).toInt(); dowColor5G = request->arg( "g" ).toInt(); dowColor5B = request->arg( "b" ).toInt(); pref.putInt( "dowColor5R", dowColor5R ); pref.putInt( "dowColor5G", dowColor5G ); pref.putInt( "dowColor5B", dowColor5B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor6", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor6R, dowColor6G, dowColor6B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor6", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor6R = request->arg( "r" ).toInt(); dowColor6G = request->arg( "g" ).toInt(); dowColor6B = request->arg( "b" ).toInt(); pref.putInt( "dowColor6R", dowColor6R ); pref.putInt( "dowColor6G", dowColor6G ); pref.putInt( "dowColor6B", dowColor6B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor7", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor7R, dowColor7G, dowColor7B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor7", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor7R = request->arg( "r" ).toInt(); dowColor7G = request->arg( "g" ).toInt(); dowColor7B = request->arg( "b" ).toInt(); pref.putInt( "dowColor7R", dowColor7R ); pref.putInt( "dowColor7G", dowColor7G ); pref.putInt( "dowColor7B", dowColor7B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor8", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor8R, dowColor8G, dowColor8B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor8", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor8R = request->arg( "r" ).toInt(); dowColor8G = request->arg( "g" ).toInt(); dowColor8B = request->arg( "b" ).toInt(); pref.putInt( "dowColor8R", dowColor8R ); pref.putInt( "dowColor8G", dowColor8G ); pref.putInt( "dowColor8B", dowColor8B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor9", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor9R, dowColor9G, dowColor9B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor9", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor9R = request->arg( "r" ).toInt(); dowColor9G = request->arg( "g" ).toInt(); dowColor9B = request->arg( "b" ).toInt(); pref.putInt( "dowColor9R", dowColor9R ); pref.putInt( "dowColor9G", dowColor9G ); pref.putInt( "dowColor9B", dowColor9B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor10", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor10R, dowColor10G, dowColor10B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor10", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor10R = request->arg( "r" ).toInt(); dowColor10G = request->arg( "g" ).toInt(); dowColor10B = request->arg( "b" ).toInt(); pref.putInt( "dowColor10R", dowColor10R ); pref.putInt( "dowColor10G", dowColor10G ); pref.putInt( "dowColor10B", dowColor10B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor11", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor11R, dowColor11G, dowColor11B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor11", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor11R = request->arg( "r" ).toInt(); dowColor11G = request->arg( "g" ).toInt(); dowColor11B = request->arg( "b" ).toInt(); pref.putInt( "dowColor11R", dowColor11R ); pref.putInt( "dowColor11G", dowColor11G ); pref.putInt( "dowColor11B", dowColor11B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor12", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor12R, dowColor12G, dowColor12B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor12", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor12R = request->arg( "r" ).toInt(); dowColor12G = request->arg( "g" ).toInt(); dowColor12B = request->arg( "b" ).toInt(); pref.putInt( "dowColor12R", dowColor12R ); pref.putInt( "dowColor12G", dowColor12G ); pref.putInt( "dowColor12B", dowColor12B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getDowColor13", []( AsyncWebServerRequest *request ) { char tempcolor[8]; sprintf( tempcolor, "#%02X%02X%02X", dowColor13R, dowColor13G, dowColor13B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/updDowColor13", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor13R = request->arg( "r" ).toInt(); dowColor13G = request->arg( "g" ).toInt(); dowColor13B = request->arg( "b" ).toInt(); pref.putInt( "dowColor13R", dowColor13R ); pref.putInt( "dowColor13G", dowColor13G ); pref.putInt( "dowColor13B", dowColor13B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // wifi.html - server.on( "/getAPSSID", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSSID ) ); } ); - server.on( "/updAPSSID", HTTP_POST, []( AsyncWebServerRequest *request ) { apSSID = request->arg( "apSSID" ); pref.putString( "apSSID", apSSID ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPPass", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apPass ) ); } ); - server.on( "/updAPPass", HTTP_POST, []( AsyncWebServerRequest *request ) { apPass = request->arg( "apPass" ); pref.putString( "apPass", apPass ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPHide", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apHide ) ); } ); - server.on( "/updAPHide", HTTP_POST, []( AsyncWebServerRequest *request ) { apHide = request->arg( "apHide" ).toInt(); pref.putInt( "apHide", apHide ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPIP1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP1 ) ); } ); - server.on( "/updAPIP1", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP1 = request->arg( "apIP1" ).toInt(); pref.putInt( "apIP1", apIP1 ); pref.putInt( "apGW1", apIP1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPIP2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP2 ) ); } ); - server.on( "/updAPIP2", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP2 = request->arg( "apIP2" ).toInt(); pref.putInt( "apIP2", apIP2 ); pref.putInt( "apGW2", apIP2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPIP3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP3 ) ); } ); - server.on( "/updAPIP3", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP3 = request->arg( "apIP3" ).toInt(); pref.putInt( "apIP3", apIP3 ); pref.putInt( "apGW3", apIP3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPIP4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP4 ) ); } ); - server.on( "/updAPIP4", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP4 = request->arg( "apIP4" ).toInt(); pref.putInt( "apIP4", apIP4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPGW1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apGW1 ) ); } ); - server.on( "/updAPGW1", HTTP_POST, []( AsyncWebServerRequest *request ) { apGW1 = request->arg( "apGW1" ).toInt(); pref.putInt( "apGW1", apGW1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPGW2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apGW2 ) ); } ); - server.on( "/updAPGW2", HTTP_POST, []( AsyncWebServerRequest *request ) { apGW2 = request->arg( "apGW2" ).toInt(); pref.putInt( "apGW2", apGW2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPGW3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apGW3 ) ); } ); - server.on( "/updAPGW3", HTTP_POST, []( AsyncWebServerRequest *request ) { apGW3 = request->arg( "apGW3" ).toInt(); pref.putInt( "apGW3", apGW3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPGW4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apGW4 ) ); } ); - server.on( "/updAPGW4", HTTP_POST, []( AsyncWebServerRequest *request ) { apGW4 = request->arg( "apGW4" ).toInt(); pref.putInt( "apGW4", apGW4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPSN1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSN1 ) ); } ); - server.on( "/updAPSN1", HTTP_POST, []( AsyncWebServerRequest *request ) { apSN1 = request->arg( "apSN1" ).toInt(); pref.putInt( "apSN1", apSN1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPSN2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSN2 ) ); } ); - server.on( "/updAPSN2", HTTP_POST, []( AsyncWebServerRequest *request ) { apSN2 = request->arg( "apSN2" ).toInt(); pref.putInt( "apSN2", apSN2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPSN3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSN3 ) ); } ); - server.on( "/updAPSN3", HTTP_POST, []( AsyncWebServerRequest *request ) { apSN3 = request->arg( "apSN3" ).toInt(); pref.putInt( "apSN3", apSN3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getAPSN4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSN4 ) ); } ); - server.on( "/updAPSN4", HTTP_POST, []( AsyncWebServerRequest *request ) { apSN4 = request->arg( "apSN4" ).toInt(); pref.putInt( "apSN4", apSN4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/apRestart", HTTP_POST, []( AsyncWebServerRequest *request ) { request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); WiFi.softAPdisconnect(); WiFi.softAPConfig( apLocalIP, apGateway, apSubnet ); WiFi.softAP( apSSID.c_str(), apPass.c_str(), 1, apHide ); } ); - server.on( "/getWifiConfig", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiConfig ) ); } ); - server.on( "/updWifiConfig", HTTP_POST, []( AsyncWebServerRequest *request ) { if ( request->arg( "wifiConfig" ) == "true" ) { wifiConfig = 1; } if ( request->arg( "wifiConfig" ) == "false" ) { wifiConfig = 0; } pref.putInt( "wifiConfig", wifiConfig ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiSSID", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSSID ) ); } ); - server.on( "/updWifiSSID", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSSID = request->arg( "wifiSSID" ); pref.putString( "wifiSSID", wifiSSID ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiPass", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiPass ) ); } ); - server.on( "/updWifiPass", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiPass = request->arg( "wifiPass" ); pref.putString( "wifiPass", wifiPass ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiDHCP", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiDHCP ) ); } ); - server.on( "/updWifiDHCP", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiDHCP = request->arg( "wifiDHCP" ).toInt(); pref.putInt( "wifiDHCP", wifiDHCP ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiIP1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiIP1 ) ); } ); - server.on( "/updWifiIP1", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiIP1 = request->arg( "wifiIP1" ).toInt(); pref.putInt( "wifiIP1", wifiIP1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiIP2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiIP2 ) ); } ); - server.on( "/updWifiIP2", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiIP2 = request->arg( "wifiIP2" ).toInt(); pref.putInt( "wifiIP2", wifiIP2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiIP3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiIP3 ) ); } ); - server.on( "/updWifiIP3", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiIP3 = request->arg( "wifiIP3" ).toInt(); pref.putInt( "wifiIP3", wifiIP3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiIP4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiIP4 ) ); } ); - server.on( "/updWifiIP4", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiIP4 = request->arg( "wifiIP4" ).toInt(); pref.putInt( "wifiIP4", wifiIP4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiGW1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiGW1 ) ); } ); - server.on( "/updWifiGW1", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiGW1 = request->arg( "wifiGW1" ).toInt(); pref.putInt( "wifiGW1", wifiGW1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiGW2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiGW2 ) ); } ); - server.on( "/updWifiGW2", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiGW2 = request->arg( "wifiGW2" ).toInt(); pref.putInt( "wifiGW2", wifiGW2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiGW3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiGW3 ) ); } ); - server.on( "/updWifiGW3", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiGW3 = request->arg( "wifiGW3" ).toInt(); pref.putInt( "wifiGW3", wifiGW3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiGW4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiGW4 ) ); } ); - server.on( "/updWifiGW4", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiGW4 = request->arg( "wifiGW4" ).toInt(); pref.putInt( "wifiGW4", wifiGW4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiSN1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSN1 ) ); } ); - server.on( "/updWifiSN1", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSN1 = request->arg( "wifiSN1" ).toInt(); pref.putInt( "wifiSN1", wifiSN1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiSN2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSN2 ) ); } ); - server.on( "/updWifiSN2", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSN2 = request->arg( "wifiSN2" ).toInt(); pref.putInt( "wifiSN2", wifiSN2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiSN3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSN3 ) ); } ); - server.on( "/updWifiSN3", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSN3 = request->arg( "wifiSN3" ).toInt(); pref.putInt( "wifiSN3", wifiSN3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/getWifiSN4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSN4 ) ); } ); - server.on( "/updWifiSN4", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSN4 = request->arg( "wifiSN4" ).toInt(); pref.putInt( "wifiSN4", wifiSN4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/wifiRestart", HTTP_POST, []( AsyncWebServerRequest *request ) { request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); WiFi.disconnect(); WiFi.config( wifiLocalIP, wifiGateway, wifiSubnet ); WiFi.begin( wifiSSID.c_str(), wifiPass.c_str() ); for ( int i = 0; i < 100; i++ ) { delay(100); if ( WiFi.status() == WL_CONNECTED ) { Serial.println( "[+] Connected to wifi"); Serial.print( " SSID: " ); Serial.println( WiFi.SSID() ); Serial.print( " IP Address: " ); Serial.println( WiFi.localIP() ); break; } } if ( WiFi.status() != WL_CONNECTED ) { WiFi.disconnect(); Serial.println( "[!] Not connected to your network" ); } } ); - - // help.html - // |- date & time - server.on( "/updDateTime", HTTP_POST, []( AsyncWebServerRequest *request ) { int yeararg = request->arg( "year" ).toInt(); int montharg = request->arg( "month" ).toInt(); int dayarg = request->arg( "day" ).toInt(); int hourarg = request->arg( "hour" ).toInt(); int minarg = request->arg( "min" ).toInt(); int secarg = request->arg( "sec" ).toInt(); ntpTime.tm_year = yeararg - 1900; ntpTime.tm_mon = montharg - 1; ntpTime.tm_mday = dayarg; ntpTime.tm_hour = hourarg; ntpTime.tm_min = minarg; ntpTime.tm_sec = secarg; time_t t = mktime( &ntpTime ); struct timeval now1 = { .tv_sec = t }; settimeofday( &now1, NULL ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // |- resets - server.on( "/resetFlash", HTTP_POST, []( AsyncWebServerRequest *request ) { request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); pref.clear(); ESP.restart(); } ); - server.on( "/resetESP", HTTP_POST, []( AsyncWebServerRequest *request ) { request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); ESP.restart(); } ); -} + if (temSymbol == 0) { // create °F + if (temp < 0) { + t1 = 36; // show "-" + } else { + t1 = floor(temp / 100); // build t1 + } -// task1 on core0 -void taskCore0code( void * pvParameters ){ - for(;;) { // required to keep the task running + t2 = (temp / 10) % 10; // build t2 + t3 = temp % 10; // build t3 - // Setup time-passage trackers - int currentTimeSec = ntpTime.tm_sec; - int currentTimeMin = ntpTime.tm_min; - int currentTimeHour = ntpTime.tm_hour; - int currentTimeDay = ntpTime.tm_mday; - int m1 = currentTimeMin / 10; - int m2 = currentTimeMin % 10; - - currMillisCore0 = millis(); // update current time reference - - if ( ( currMillisCore0 - prevTimeSecCore0 ) >= 1000) { // run every 1 second - prevTimeSecCore0 = currMillisCore0; // update previous time reference - displayDownlights(); // control the downlights - if ( WiFi.status() != WL_CONNECTED ) { reconnectWifi(); } // NO wifi -> reconnect + if (temp < 32) { + temColor = ledClock.Color(74, 88, 226); } - - if( abs( currentTimeMin - prevTimeMinCore0 ) >= 1 ) { // run every 1 minute - prevTimeMinCore0 = currentTimeMin; - clockMinPassed = true; // set the flag for the clock leds - downMinPassed = true; // set the flag for the downlight leds - getBrightness(); + if (temp >= 32 && temp <= 64) { + temColor = ledClock.Color(69, 223, 208); } - - if( ( m2 == 0 || m2 == 5 ) && ( currentTimeSec == 0 ) ) { // run every 5 minutes - getHumidity(); - getTemperature(); + if (temp > 64 && temp <= 75) { + temColor = ledClock.Color(63, 227, 93); } - - if( ( m2 == 0 ) && ( currentTimeSec == 0) ) { // run every 10 minutes - /* code goes here */ + if (temp > 75 && temp <= 86) { + temColor = ledClock.Color(216, 228, 55); } - - if( ( ( m1 == 0 && m2 == 0 ) || ( m1 == 1 && m2 == 5 ) || // run every 15 minutes - ( m1 == 3 && m2 == 0 ) || ( m1 == 4 && m2 == 5 ) ) && - ( currentTimeSec == 0 ) ) { - /* code goes here */ + if (temp > 86 && temp <= 97) { + temColor = ledClock.Color(231, 169, 49); } - - if( ( ( m1 == 0 && m2 == 0 ) || // run every 30 minutes - ( m1 == 3 && m2 == 0 ) ) && - ( currentTimeSec == 0 ) ) { - /* code goes here */ + if (temp > 97) { + temColor = ledClock.Color(233, 36, 32); } - - if( abs( currentTimeHour - prevTimeHourCore0 ) >= 1 ) { // run every hour - prevTimeHourCore0 = currentTimeHour; - clockHourPassed = true; // set the flag for the clock leds - downHourPassed = true; // set the flag for the downlight leds - getNTP(); + } else { // create °C + if (temp < 0) { + t1 = 36; // show "-" + } else { + t1 = 0; // set to 0 (hidden) } - if( abs( currentTimeDay - prevTimeDayCore0 ) >= 1 ) { // run every day - prevTimeDayCore0 = currentTimeDay; - clockDayPassed = true; // set the flag for the clock leds - downDayPassed = true; // set the flag for the downlight leds + t2 = floor(temp / 10); // build t2 + t3 = temp % 10; // build t3 + + if (temp < 0) { + temColor = ledClock.Color(74, 88, 226); + } + if (temp >= 0 && temp <= 18) { + temColor = ledClock.Color(69, 223, 208); + } + if (temp > 18 && temp <= 24) { + temColor = ledClock.Color(63, 227, 93); + } + if (temp > 24 && temp <= 30) { + temColor = ledClock.Color(216, 228, 55); + } + if (temp > 30 && temp <= 36) { + temColor = ledClock.Color(231, 169, 49); + } + if (temp > 36) { + temColor = ledClock.Color(233, 36, 32); } } -} - - -// ---------------------------------------------------------------------------------------------------- -// MAIN FUNCTIONS -// ---------------------------------------------------------------------------------------------------- -// These functions are literally the content shown on the front side of the shelf: -// modeClk: current local time according to the timezone settings -// modeDat: current local date according to the timezone settings -// modeTem: current temperature obtained from your smarthome system (REST API) -// modeHum: current humidity obtained from your smarthome system (REST API) -// modeSco: scoreboard -// modeCou: countdown -// modeScr: scroll mode - - -// ----- CLOCK ----- -void modeClk() { // display the current time - ledClock.clear(); // clear all edge led's - - // get current time - int hour = ntpTime.tm_hour; // hours - int mins = ntpTime.tm_min; // minutes - int secs = ntpTime.tm_sec; // seconds - - // adjust hours for 12 hour (AM/PM) - if ( !clkFormat ) { - if ( hour > 12 ) { hour = hour - 12; } // if hours is above 12, turn it from 13:mm into 01:mm PM - if ( hour < 1 ) { hour = hour + 12; } // if hours is 00:mm, turn it from 00:mm into 12:mm AM + if (t1 != 0) { + numberDisplay(t1, 189, temColor); } + if (t2 != 0) { + numberDisplay(t2, 126, temColor); + } + numberDisplay(t3, 63, temColor); + numberDisplay(36, 0, temColor); // show ° +} - // build the digits - int h1 = floor( hour / 10 ); // build h1 - int h2 = hour % 10; // build h2 - int m1 = floor( mins / 10 ); // build m1 - int m2 = mins % 10; // build m2 - int s1 = floor( secs / 10 ); // build s1 - int s2 = secs % 10; // build s2 - - // set the colors - if ( clkColorSet == 0 ) { // two defined colors: one for hours, one for minutes - clkHColor = ledClock.Color( clkHColorR, clkHColorG, clkHColorB ); - clkMColor = ledClock.Color( clkMColorR, clkMColorG, clkMColorB ); +/** + * @brief HUMIDITY mode + * @details show the current humidity on the front of the shelf + * @since 1.0.0 + */ +void modeHum() { + ledClock.clear(); // clear the display + + int h1 = floor(humKNXValue / 100); // build h1 + int h2 = (humKNXValue / 10) % 10; // build h2 + int h3 = humKNXValue % 10; // build h3 + + if (humColorSet == 0) { // 3 def + humAColor = ledClock.Color(humAColorR, humAColorG, humAColorB); + humBColor = ledClock.Color(humBColorR, humBColorG, humBColorB); + humCColor = ledClock.Color(humCColorR, humCColorG, humCColorB); } - if ( clkColorSet == 1 && ( // two random colors: one for hours, one for minutes - ( gloColorFreq == 0 ) || // change color every second - ( gloColorFreq == 1 && clockMinPassed ) || // change color every minute and 1 minute passed - ( gloColorFreq == 2 && clockHourPassed ) || // change color every hour and 1 hour passed - ( gloColorFreq == 3 && clockDayPassed ) ) ) { // change color every day and 1 day passed - clkHColor = ledClock.ColorHSV( random( 0, 65535 ), 255, 255 ); - clkMColor = ledClock.ColorHSV( random( 0, 65535 ), 255, 255 ); + if (humColorSet == 1 && + ( // 3 random + (gloColorFreq == 0) || // every second + (gloColorFreq == 1 && clockMinPassed) || // every minute + (gloColorFreq == 2 && clockHourPassed) || // every hour + (gloColorFreq == 3 && clockDayPassed))) { // every day + humAColor = ledClock.ColorHSV(random(0, 65535), 255, 255); + humBColor = ledClock.ColorHSV(random(0, 65535), 255, 255); + humCColor = ledClock.ColorHSV(random(0, 65535), 255, 255); } - // display the time - numberDisplay( h1, 189, clkHColor ); // show first digit - numberDisplay( h2, 126, clkHColor ); // show second digit - numberDisplay( m1, 63, clkMColor ); // show third digit - numberDisplay( m2, 0, clkMColor ); // show fourth digit + numberDisplay(h1, 189, humAColor); // show first digit + numberDisplay(h2, 126, humAColor); // show second digit + numberDisplay(h3, 63, humBColor); // show third digit + numberDisplay(17, 0, humCColor); // show icon - clockMinPassed = false; // reset the color change flag (1 minute) - clockHourPassed = false; // reset the color change flag (1 hour) - clockDayPassed = false; // reset the color change flag (1 day) + clockMinPassed = false; // reset (1 min) + clockHourPassed = false; // reset (1 hour) + clockDayPassed = false; // reset (1 day) } - -// ----- DATE ----- -void modeDat() { // display the current date - ledClock.clear(); // clear all edge led's +// ----- SCOREBOARD ----- +void modeSco() { // display the scoreboard + ledClock.clear(); // clear the display // build the digits - int d1 = floor( ntpTime.tm_mday / 10 ); // build d1 - int d2 = ntpTime.tm_mday % 10; // build d2 - int m1 = floor( ( ntpTime.tm_mon + 1 ) / 10 ); // build m1 - int m2 = ( ntpTime.tm_mon + 1 ) % 10; // build m2 + int s1 = floor(scoHValue / 10); // build s1 + int s2 = scoHValue % 10; // build s2 + int s3 = floor(scoAValue / 10); // build s3 + int s4 = scoAValue % 10; // build s4 // set the colors - if ( datColorSet == 0 ) { // two defined colors: one for days, one for months - datDColor = ledClock.Color( datDColorR, datDColorG, datDColorB ); - datMColor = ledClock.Color( datMColorR, datMColorG, datMColorB ); - } - if ( datColorSet == 1 && ( // two random colors: one for hours, one for minutes - ( gloColorFreq == 0 ) || // change color every second - ( gloColorFreq == 1 && clockMinPassed ) || // change color every minute and 1 minute passed - ( gloColorFreq == 2 && clockHourPassed ) || // change color every hour and 1 hour passed - ( gloColorFreq == 3 && clockDayPassed ) ) ) { // change color every day and 1 day passed - datDColor = ledClock.ColorHSV( random( 0, 65535 ), 255, 255 ); - datMColor = ledClock.ColorHSV( random( 0, 65535 ), 255, 255 ); - } + scoHColor = ledClock.Color(scoHColorR, scoHColorG, + scoHColorB); // color for home team + scoAColor = ledClock.Color(scoAColorR, scoAColorG, + scoAColorB); // color for away team // display the digits - if ( datFormat ) { - numberDisplay( d1, 189, datDColor ); // show first digit - numberDisplay( d2, 126, datDColor ); // show second digit - numberDisplay( m1, 63, datMColor ); // show third digit - numberDisplay( m2, 0, datMColor ); // show fourth digit - } else { - numberDisplay( m1, 189, datMColor ); // show first digit - numberDisplay( m2, 126, datMColor ); // show second digit - numberDisplay( d1, 63, datDColor ); // show third digit - numberDisplay( d2, 0, datDColor ); // show fourth digit - } - - clockMinPassed = false; // reset the color change flag (1 minute) - clockHourPassed = false; // reset the color change flag (1 hour) - clockDayPassed = false; // reset the color change flag (1 day) + numberDisplay(s1, 189, scoHColor); // show first digit + numberDisplay(s2, 126, scoHColor); // show second digit + numberDisplay(s3, 63, scoAColor); // show third digit + numberDisplay(s4, 0, scoAColor); // show fourth digit } +// ----- COUNTDOWN ----- +void modeCou() { // display the countdown + ledClock.clear(); // clear the display -// ----- TEMPERATURE ----- -void modeTem() { // display the temperature - ledClock.clear(); // clear the display + if (couMillis == 0) { // abort empty countdown + if (gloBrightness == 0) { // value = 0 -> automatic mode + ledClock.setBrightness(briClock); + } else { + ledClock.setBrightness(gloBrightness / 2); + } + displayMode = 0; + pref.putInt("displayMode", 0); + return; + } // build the digits - int t1 = floor( temKNXValue / 100 ); // build t1 - int t2 = ( temKNXValue / 10 ) % 10; // build t2 - int t3 = temKNXValue % 10; // build t3 + uint32_t restMillis = + couMillisEnd - + millis(); // continously build the remaining milliseconds and ... + uint32_t hours = + ((restMillis / 1000) / 60) / 60; // ... create the countdown in hours + uint32_t minutes = + (restMillis / 1000) / 60; // ... create the countdown in minutes + uint32_t seconds = restMillis / 1000; // ... create the countdown in seconds + int remM = minutes - (hours * 60); // build the minutes between 0 and 59 + int remS = seconds - (minutes * 60); // build the seconds between 0 and 59 + + int h1 = hours / 10; // build h1 + int h2 = hours % 10; // build h2 + int m1 = remM / 10; // build m1 + int m2 = remM % 10; // build m2 + int s1 = remS / 10; // build s1 + int s2 = remS % 10; // build s2 // set the colors - if ( temColorSet == 0) { // three defined colors: one for degrees, one for decimal and one for symbol - temAColor = ledClock.Color(temAColorR, temAColorG, temAColorB); - temBColor = ledClock.Color(temBColorR, temBColorG, temBColorB); - temCColor = ledClock.Color(temCColorR, temCColorG, temCColorB); - } - if ( temColorSet == 1 && ( // three random colors: one for degrees, one for decimal and one for symbol - ( gloColorFreq == 0 ) || // change color every second - ( gloColorFreq == 1 && clockMinPassed ) || // change color every minute and 1 minute passed - ( gloColorFreq == 2 && clockHourPassed ) || // change color every hour and 1 hour passed - ( gloColorFreq == 3 && clockDayPassed ) ) ) { // change color every day and 1 day passed - temAColor = ledClock.ColorHSV( random( 0, 65535 ), 255, 255 ); - temBColor = ledClock.ColorHSV( random( 0, 65535 ), 255, 255 ); - temCColor = ledClock.ColorHSV( random( 0, 65535 ), 255, 255 ); + if (restMillis > 10000) { // three defined colors + couHColor = ledClock.Color(couHColorR, couHColorG, couHColorB); + couMColor = ledClock.Color(couMColorR, couMColorG, couMColorB); + couSColor = ledClock.Color(couSColorR, couSColorG, couSColorB); + } else { // change color for the last 10 seconds + couMColor = ledClock.Color(couAColorR, couAColorG, couAColorB); + couSColor = ledClock.Color(couAColorR, couAColorG, couAColorB); } // display the digits - numberDisplay( t1, 189, temAColor ); // show first digit - numberDisplay( t2, 126, temAColor ); // show second digit - numberDisplay( t3, 63, temBColor ); // show third digit - if ( temSymbol == 0 ) { - numberDisplay( 15, 0, temCColor ); // show F - } else { - numberDisplay( 12, 0, temCColor ); // show C + if (hours > 0) { // if more than 60 minutes remaining on the countdown + numberDisplay(h1, 189, couHColor); // show hours and minutes + numberDisplay(h2, 126, couHColor); + numberDisplay(m1, 63, couMColor); + numberDisplay(m2, 0, couMColor); + } else { // if less than 60 minutes remaining on the countdown + numberDisplay(m1, 189, couMColor); // show minutes and seconds + numberDisplay(m2, 126, couMColor); + numberDisplay(s1, 63, couSColor); + numberDisplay(s2, 0, couSColor); } - clockMinPassed = false; // reset the color change flag (1 minute) - clockHourPassed = false; // reset the color change flag (1 hour) - clockDayPassed = false; // reset the color change flag (1 day) + // display "EndE" + if (hours <= 0 && remM <= 0 && remS <= 0) { + countdownEnd(); + couMillis = 0; + couMillisEnd = 0; + return; + } } +// ----- SCROLLING ----- +void modeScr() { // display different modes continously + ledClock.clear(); // clear the display -// ----- HUMIDITY ----- -void modeHum() { // display the humidity - ledClock.clear(); // clear the display + scrMillis = millis(); // update current reference time - // build the digits - int h1 = floor( humKNXValue / 100 ); // build h1 - int h2 = ( humKNXValue / 10 ) % 10; // build h2 - int h3 = humKNXValue % 10; // build h3 + if ((scrMillis - scrMillisPrev) >= + (scrTime * 1000)) { // run everything inside here every x seconds + scrMillisPrev = scrMillis; // update previous reference time - // set the colors - if ( humColorSet == 0 ) { // three defined colors: one for percents, one for decimal and one for symbol - humAColor = ledClock.Color( humAColorR, humAColorG, humAColorB ); - humBColor = ledClock.Color( humBColorR, humBColorG, humBColorB ); - humCColor = ledClock.Color( humCColorR, humCColorG, humCColorB ); - } - if ( humColorSet == 1 && ( // three random colors: one for percents, one for decimal and one for symbol - ( gloColorFreq == 0 ) || // change color every second - ( gloColorFreq == 1 && clockMinPassed ) || // change color every minute and 1 minute passed - ( gloColorFreq == 2 && clockHourPassed ) || // change color every hour and 1 hour passed - ( gloColorFreq == 3 && clockDayPassed ) ) ) { // change color every day and 1 day passed - humAColor = ledClock.ColorHSV( random( 0, 65535 ), 255, 255 ); - humBColor = ledClock.ColorHSV(random( 0, 65535 ), 255, 255 ); - humCColor = ledClock.ColorHSV(random( 0, 65535 ), 255, 255 ); + if (scrDisplayMode < 2) { // if scrDisplayMode is smaller than 2 ... + scrDisplayMode = scrDisplayMode + 1; // ... increase scrDisplayMode by 1 + } else { // ... else ... + scrDisplayMode = 0; // ... restart with the first content + } } - // display the digits - numberDisplay( h1, 189, humAColor ); // show first digit - numberDisplay( h2, 126, humAColor ); // show second digit - numberDisplay( h3, 63, humBColor ); // show third digit - numberDisplay( 17, 0, humCColor ); // show icon - - clockMinPassed = false; // reset the color change flag (1 minute) - clockHourPassed = false; // reset the color change flag (1 hour) - clockDayPassed = false; // reset the color change flag (1 day) + if (scrDisplayMode == 0) { + modeClk(); + } // call clock mode + if (scrDisplayMode == 1) { + modeDat(); + } // call date mode + if (scrDisplayMode == 2) { + modeTem(); + } // call temperature mode } - -// ----- SCOREBOARD ----- -void modeSco() { // display the scoreboard - ledClock.clear(); // clear the display - - // build the digits - int s1 = floor( scoHValue / 10 ); // build s1 - int s2 = scoHValue % 10; // build s2 - int s3 = floor( scoAValue / 10 ); // build s3 - int s4 = scoAValue % 10; // build s4 - - // set the colors - scoHColor = ledClock.Color( scoHColorR, scoHColorG, scoHColorB ); // color for home team - scoAColor = ledClock.Color( scoAColorR, scoAColorG, scoAColorB ); // color for away team - - // display the digits - numberDisplay( s1, 189, scoHColor ); // show first digit - numberDisplay( s2, 126, scoHColor ); // show second digit - numberDisplay( s3, 63, scoAColor ); // show third digit - numberDisplay( s4, 0, scoAColor ); // show fourth digit +/** + * @brief SETUP - flash memory + * @details Create preferences array in read/write mode and load all saved data. + * @since 1.0.0 + */ +void initFlash() { + pref.begin("shelfclock", false); + displayMode = pref.getInt("displayMode", 0); + // wifi + apSSID = pref.getString("apSSID", "Shelf Edge Clock"); + apPass = pref.getString("apPass", "shelfEdgeClock"); + apHide = pref.getInt("apHide", 0); + apIP1 = pref.getInt("apIP1", 192); + apIP2 = pref.getInt("apIP2", 168); + apIP3 = pref.getInt("apIP3", 100); + apIP4 = pref.getInt("apIP4", 1); + apGW1 = pref.getInt("apGW1", 192); + apGW2 = pref.getInt("apGW2", 168); + apGW3 = pref.getInt("apGW3", 100); + apGW4 = pref.getInt("apGW4", 1); + apSN1 = pref.getInt("apSN1", 255); + apSN2 = pref.getInt("apSN2", 255); + apSN3 = pref.getInt("apSN3", 255); + apSN4 = pref.getInt("apSN4", 0); + wifiConfig = pref.getInt("wifiConfig", 0); + wifiSSID = pref.getString("wifiSSID", "ENTER_SSID"); + wifiPass = pref.getString("wifiPass", "ENTER_PASSWORD"); + wifiDHCP = pref.getInt("wifiDHCP", 0); + wifiIP1 = pref.getInt("wifiIP1"); + wifiIP2 = pref.getInt("wifiIP2"); + wifiIP3 = pref.getInt("wifiIP3"); + wifiIP4 = pref.getInt("wifiIP4"); + wifiGW1 = pref.getInt("wifiGW1"); + wifiGW2 = pref.getInt("wifiGW2"); + wifiGW3 = pref.getInt("wifiGW3"); + wifiGW4 = pref.getInt("wifiGW4"); + wifiSN1 = pref.getInt("wifiSN1"); + wifiSN2 = pref.getInt("wifiSN2"); + wifiSN3 = pref.getInt("wifiSN3"); + wifiSN4 = pref.getInt("wifiSN4"); + // content + // |- global settings + gloBrightness = pref.getInt("gloBrightness", gloBrightness); + briClockMin = pref.getInt("briClockMin", 2); + briClockMax = pref.getInt("briClockMax", 125); + gloColorFreq = pref.getInt("gloColorFreq", gloColorFreq); + dowUsage = pref.getInt("dowUsage", dowUsage); + dowBrightness = pref.getInt("dowBrightness", dowBrightness); + briDownMin = pref.getInt("briDownMin ", 10); + briDownMax = pref.getInt("briDownMax", 250); + dowColorFreq = pref.getInt("dowColorFreq", dowColorFreq); + // |- knx connection + knxAddr = pref.getString("knxAddr"); + knxPort = pref.getInt("knxPort"); + briKNXPath = pref.getString("briKNXPath"); + briKNXmin = pref.getInt("briKNXmin", 0); + briKNXmax = pref.getInt("briKNXmax", 150000); + temKNXPath = pref.getString("temKNXPath"); + humKNXPath = pref.getString("humKNXPath"); + // |- downlights + dowColorSet = pref.getInt("dowColorSet", 0); + dowColorR = pref.getInt("dowColorR", 255); + dowColorG = pref.getInt("dowColorG", 255); + dowColorB = pref.getInt("dowColorB", 255); + dowColor0R = pref.getInt("dowColor0R", 255); + dowColor0G = pref.getInt("dowColor0G", 255); + dowColor0B = pref.getInt("dowColor0B", 255); + dowColor1R = pref.getInt("dowColor1R", 255); + dowColor1G = pref.getInt("dowColor1G", 255); + dowColor1B = pref.getInt("dowColor1B", 255); + dowColor2R = pref.getInt("dowColor2R", 255); + dowColor2G = pref.getInt("dowColor2G", 255); + dowColor2B = pref.getInt("dowColor2B", 255); + dowColor3R = pref.getInt("dowColor3R", 255); + dowColor3G = pref.getInt("dowColor3G", 255); + dowColor3B = pref.getInt("dowColor3B", 255); + dowColor4R = pref.getInt("dowColor4R", 255); + dowColor4G = pref.getInt("dowColor4G", 255); + dowColor4B = pref.getInt("dowColor4B", 255); + dowColor5R = pref.getInt("dowColor5R", 255); + dowColor5G = pref.getInt("dowColor5G", 255); + dowColor5B = pref.getInt("dowColor5B", 255); + dowColor6R = pref.getInt("dowColor6R", 255); + dowColor6G = pref.getInt("dowColor6G", 255); + dowColor6B = pref.getInt("dowColor6B", 255); + dowColor7R = pref.getInt("dowColor7R", 255); + dowColor7G = pref.getInt("dowColor7G", 255); + dowColor7B = pref.getInt("dowColor7B", 255); + dowColor8R = pref.getInt("dowColor8R", 255); + dowColor8G = pref.getInt("dowColor8G", 255); + dowColor8B = pref.getInt("dowColor8B", 255); + dowColor9R = pref.getInt("dowColor9R", 255); + dowColor9G = pref.getInt("dowColor9G", 255); + dowColor9B = pref.getInt("dowColor9B", 255); + dowColor10R = pref.getInt("dowColor10R", 255); + dowColor10G = pref.getInt("dowColor10G", 255); + dowColor10B = pref.getInt("dowColor10B", 255); + dowColor11R = pref.getInt("dowColor11R", 255); + dowColor11G = pref.getInt("dowColor11G", 255); + dowColor11B = pref.getInt("dowColor11B", 255); + dowColor12R = pref.getInt("dowColor12R", 255); + dowColor12G = pref.getInt("dowColor12G", 255); + dowColor12B = pref.getInt("dowColor12B", 255); + dowColor13R = pref.getInt("dowColor13R", 255); + dowColor13G = pref.getInt("dowColor13G", 255); + dowColor13B = pref.getInt("dowColor13B", 255); + // |- mode clock + clkAddr = pref.getString("clkAddr", clkAddr); + clkZone = pref.getString("clkZone", clkZone); + clkFormat = pref.getInt("clkFormat", 1); + clkColorSet = pref.getInt("clkColorSet", 0); + clkHColorR = pref.getInt("clkHColorR", 85); + clkHColorG = pref.getInt("clkHColorG", 26); + clkHColorB = pref.getInt("clkHColorB", 139); + clkMColorR = pref.getInt("clkMColorR", 255); + clkMColorG = pref.getInt("clkMColorG", 0); + clkMColorB = pref.getInt("clkMColorB", 132); + // |- mode date + datFormat = pref.getInt("datFormat", 1); + datColorSet = pref.getInt("datColorSet", 0); + datDColorR = pref.getInt("datDColorR", 255); + datDColorG = pref.getInt("datDColorG", 215); + datDColorB = pref.getInt("datDColorB", 0); + datMColorR = pref.getInt("datMColorR", 255); + datMColorG = pref.getInt("datMColorG", 69); + datMColorB = pref.getInt("datMColorB", 0); + // |- mode temperature + temSymbol = pref.getInt("temSymbol", 1); + // |- mode humidity + humColorSet = pref.getInt("humColorSet", 0); + humAColorR = pref.getInt("humAColorR", 255); + humAColorG = pref.getInt("humAColorG", 255); + humAColorB = pref.getInt("humAColorB", 0); + humBColorR = pref.getInt("humBColorR", 0); + humBColorG = pref.getInt("humBColorG", 255); + humBColorB = pref.getInt("humBColorB", 255); + humCColorR = pref.getInt("humCColorR", 255); + humCColorG = pref.getInt("humCColorG", 0); + humCColorB = pref.getInt("humCColorB", 255); + // |- mode scoreboard + scoHColorR = pref.getInt("scoHColorR", 0); + scoHColorG = pref.getInt("scoHColorG", 0); + scoHColorB = pref.getInt("scoHColorB", 255); + scoAColorR = pref.getInt("scoAColorR", 0); + scoAColorG = pref.getInt("scoAColorG", 255); + scoAColorB = pref.getInt("scoAColorB", 255); + // |- mode countdown + couHColorR = pref.getInt("couHColorR", 255); + couHColorG = pref.getInt("couHColorG", 140); + couHColorB = pref.getInt("couHColorB", 0); + couMColorR = pref.getInt("couMColorR", 255); + couMColorG = pref.getInt("couMColorG", 165); + couMColorB = pref.getInt("couMColorB", 0); + couSColorR = pref.getInt("couSColorR", 255); + couSColorG = pref.getInt("couSColorG", 215); + couSColorB = pref.getInt("couSColorB", 0); + couAColorR = pref.getInt("couAColorR", 255); + couAColorG = pref.getInt("couAColorG", 0); + couAColorB = pref.getInt("couAColorB", 0); + // |- mode scroll + scrTime = pref.getInt("scrTime", 5); } +/** + * @brief SETUP - wifi + * @details initialize the access point and wifi client + * @since 1.0.0 + */ +void initWifi() { + WiFi.mode(WIFI_AP_STA); // set mode: access point & wifi client + // access point (ap) + apLocalIP = IPAddress(apIP1, apIP2, apIP3, apIP4); // ip + apGateway = IPAddress(apGW1, apGW2, apGW3, apGW4); // gateway + apSubnet = IPAddress(apSN1, apSN2, apSN3, apSN4); // subnet + WiFi.softAPConfig(apLocalIP, apGateway, apSubnet); // config ap + WiFi.softAP(apSSID.c_str(), apPass.c_str(), 1, apHide); // start ap + // wifi client + if (wifiDHCP) { // if fixed ip used + wifiLocalIP = IPAddress(wifiIP1, wifiIP2, wifiIP3, wifiIP4); // ip + wifiGateway = IPAddress(wifiGW1, wifiGW2, wifiGW3, wifiGW4); // gateway + wifiSubnet = IPAddress(wifiSN1, wifiSN2, wifiSN3, wifiSN4); // subnet + } + WiFi.config(wifiLocalIP, wifiGateway, wifiSubnet); // config wifi + WiFi.begin(wifiSSID.c_str(), wifiPass.c_str()); // connect to wifi + for (int i = 0; i < 10; i++) { // loop 10 times + delay(200); // wait before each check + if (WiFi.status() == WL_CONNECTED) { // check if connected + break; // if connected, leave the for cycle + } + } + if (WiFi.status() != WL_CONNECTED) { // if not connected + WiFi.disconnect(); // turn off wifi + } +} -// ----- COUNTDOWN ----- -void modeCou() { // display the countdown - ledClock.clear(); // clear the display +/** + * @brief SETUP - spiffs + * @details initialize the spiffs storage for the webserver + * @since 1.0.0 + */ +void initSPIFFS() { + if (!SPIFFS.begin(true)) { // if not started + ESP.restart(); // ... restart the ESP + } +} - if ( couMillis == 0 ) { // abort empty countdown - if ( gloBrightness == 0 ) { // value = 0 -> automatic mode - ledClock.setBrightness( briClock ); - } else { - ledClock.setBrightness( gloBrightness / 2 ); +void initNTP() { + if (WiFi.status() == WL_CONNECTED) { + configTime(0, 0, + clkAddr.c_str()); // connect NTP (0 TZ offset) + setenv("TZ", clkZone.c_str(), + 1); // overwrite TZ + tzset(); // adjust the TZ + if (!getLocalTime(&ntpTime)) { + ESP.restart(); } - displayMode = 0; - pref.putInt( "displayMode", 0 ); - return; } +} - // build the digits - uint32_t restMillis = couMillisEnd - millis(); // continously build the remaining milliseconds and ... - uint32_t hours = ( ( restMillis / 1000 ) / 60 ) / 60; // ... create the countdown in hours - uint32_t minutes = ( restMillis / 1000 ) / 60; // ... create the countdown in minutes - uint32_t seconds = restMillis / 1000; // ... create the countdown in seconds - int remM = minutes - ( hours * 60 ); // build the minutes between 0 and 59 - int remS = seconds - ( minutes * 60 ); // build the seconds between 0 and 59 - - int h1 = hours / 10; // build h1 - int h2 = hours % 10; // build h2 - int m1 = remM / 10; // build m1 - int m2 = remM % 10; // build m2 - int s1 = remS / 10; // build s1 - int s2 = remS % 10; // build s2 +void initHandlers() { + // default + server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { + request->send(SPIFFS, "/index.html", "text/html", false); + }); - // set the colors - if ( restMillis > 10000 ) { // three defined colors - couHColor = ledClock.Color( couHColorR, couHColorG, couHColorB ); - couMColor = ledClock.Color( couMColorR, couMColorG, couMColorB ); - couSColor = ledClock.Color( couSColorR, couSColorG, couSColorB ); - } else { // change color for the last 10 seconds - couMColor = ledClock.Color( couAColorR, couAColorG, couAColorB ); - couSColor = ledClock.Color( couAColorR, couAColorG, couAColorB ); - } + // index.html + server.on("/goModeClk", HTTP_POST, [](AsyncWebServerRequest *request) { + displayMode = 0; + pref.putInt("displayMode", displayMode); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/goModeDat", HTTP_POST, [](AsyncWebServerRequest *request) { + displayMode = 1; + pref.putInt("displayMode", displayMode); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/goModeTem", HTTP_POST, [](AsyncWebServerRequest *request) { + displayMode = 2; + pref.putInt("displayMode", displayMode); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/goModeHum", HTTP_POST, [](AsyncWebServerRequest *request) { + displayMode = 3; + pref.putInt("displayMode", displayMode); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/goModeSco", HTTP_POST, [](AsyncWebServerRequest *request) { + displayMode = 4; + pref.putInt("displayMode", displayMode); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + scoHValue = request->arg("scoHome").toInt(); + if (scoHValue < 0) { + scoHValue = 0; + } + if (scoHValue > 99) { + scoHValue = 99; + } + scoAValue = request->arg("scoAway").toInt(); + if (scoAValue < 0) { + scoAValue = 0; + } + if (scoAValue > 99) { + scoAValue = 99; + } + }); + server.on("/goModeCou", HTTP_POST, [](AsyncWebServerRequest *request) { + displayMode = 5; + pref.putInt("displayMode", displayMode); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + couMillis = request->arg("millis").toInt(); + if (couMillis > 86400000) { + couMillis = 86400000; + } + couMillisEnd = millis() + couMillis; + }); + server.on("/goModeScr", HTTP_POST, [](AsyncWebServerRequest *request) { + displayMode = 6; + pref.putInt("displayMode", displayMode); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/goDow", HTTP_POST, [](AsyncWebServerRequest *request) { + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + dowUsage = request->arg("dowUsage").toInt(); + pref.putInt("dowUsage", dowUsage); + dowColorSet = request->arg("dowColorSet").toInt(); + pref.putInt("dowColorSet", dowColorSet); + }); - // display the digits - if ( hours > 0 ) { // if more than 60 minutes remaining on the countdown - numberDisplay( h1, 189, couHColor); // show hours and minutes - numberDisplay( h2, 126, couHColor); - numberDisplay( m1, 63, couMColor); - numberDisplay( m2, 0, couMColor); - } else { // if less than 60 minutes remaining on the countdown - numberDisplay( m1, 189, couMColor); // show minutes and seconds - numberDisplay( m2, 126, couMColor); - numberDisplay( s1, 63, couSColor); - numberDisplay( s2, 0, couSColor); - } + // settings.html + // |- global + server.on("/getGloBrightness", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(gloBrightness)); + }); + server.on("/updGloBrightness", HTTP_POST, [](AsyncWebServerRequest *request) { + gloBrightness = request->arg("gloBrightness").toInt(); + pref.putInt("gloBrightness", gloBrightness); + getKNXdata(1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getBriClockMin", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(briClockMin)); + }); + server.on("/updBriClockMin", HTTP_POST, [](AsyncWebServerRequest *request) { + briClockMin = request->arg("briClockMin").toInt(); + pref.putInt("briClockMin", briClockMin); + getKNXdata(1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getBriClockMax", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(briClockMax)); + }); + server.on("/updBriClockMax", HTTP_POST, [](AsyncWebServerRequest *request) { + briClockMax = request->arg("briClockMax").toInt(); + pref.putInt("briClockMax", briClockMax); + getKNXdata(1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getGloColorFreq", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(gloColorFreq)); + }); + server.on("/updGloColorFreq", HTTP_POST, [](AsyncWebServerRequest *request) { + gloColorFreq = request->arg("gloColorFreq").toInt(); + pref.putInt("gloColorFreq", gloColorFreq); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowUsage", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(dowUsage)); + }); + server.on("/updDowUsage", HTTP_POST, [](AsyncWebServerRequest *request) { + dowUsage = request->arg("dowUsage").toInt(); + pref.putInt("dowUsage", dowUsage); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowBrightness", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(dowBrightness)); + }); + server.on("/updDowBrightness", HTTP_POST, [](AsyncWebServerRequest *request) { + dowBrightness = request->arg("dowBrightness").toInt(); + pref.putInt("dowBrightness", dowBrightness); + getKNXdata(1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getBriDownMin", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(briDownMin)); + }); + server.on("/updBriDownMin", HTTP_POST, [](AsyncWebServerRequest *request) { + briDownMin = request->arg("briDownMin").toInt(); + pref.putInt("briDownMin", briDownMin); + getKNXdata(1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getBriDownMax", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(briDownMax)); + }); + server.on("/updBriDownMax", HTTP_POST, [](AsyncWebServerRequest *request) { + briDownMax = request->arg("briDownMax").toInt(); + pref.putInt("briDownMax", briDownMax); + getKNXdata(1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColorFreq", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(dowColorFreq)); + }); + server.on("/updDowColorFreq", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColorFreq = request->arg("dowColorFreq").toInt(); + pref.putInt("dowColorFreq", dowColorFreq); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // |- knx + server.on("/getKNXAddr", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(knxAddr)); + }); + server.on("/updKNXAddr", HTTP_POST, [](AsyncWebServerRequest *request) { + knxAddr = request->arg("knxAddr"); + pref.putString("knxAddr", knxAddr); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getKNXPort", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(knxPort)); + }); + server.on("/updKNXPort", HTTP_POST, [](AsyncWebServerRequest *request) { + knxPort = request->arg("knxPort").toInt(); + pref.putInt("knxPort", knxPort); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getBriKNXPath", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(briKNXPath)); + }); + server.on("/updBriKNXPath", HTTP_POST, [](AsyncWebServerRequest *request) { + briKNXPath = request->arg("briKNXPath"); + pref.putString("briKNXPath", briKNXPath); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getBriKNXmin", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(briKNXmin)); + }); + server.on("/updBriKNXmin", HTTP_POST, [](AsyncWebServerRequest *request) { + briKNXmin = request->arg("briKNXmin").toInt(); + pref.putInt("briKNXmin", briKNXmin); + getKNXdata(1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getBriKNXmax", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(briKNXmax)); + }); + server.on("/updBriKNXmax", HTTP_POST, [](AsyncWebServerRequest *request) { + briKNXmax = request->arg("briKNXmax").toInt(); + pref.putInt("briKNXmax", briKNXmax); + getKNXdata(1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getTemKNXPath", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(temKNXPath)); + }); + server.on("/updTemKNXPath", HTTP_POST, [](AsyncWebServerRequest *request) { + temKNXPath = request->arg("temKNXPath"); + pref.putString("temKNXPath", temKNXPath); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getHumKNXPath", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(humKNXPath)); + }); + server.on("/updHumKNXPath", HTTP_POST, [](AsyncWebServerRequest *request) { + humKNXPath = request->arg("humKNXPath"); + pref.putString("humKNXPath", humKNXPath); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // |- clock + server.on("/getClkAddr", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(clkAddr)); + }); + server.on("/updClkAddr", HTTP_POST, [](AsyncWebServerRequest *request) { + clkAddr = request->arg("clkAddr"); + pref.putString("clkAddr", clkAddr); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getClkZone", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(clkZone)); + }); + server.on("/updClkZone", HTTP_POST, [](AsyncWebServerRequest *request) { + clkZone = request->arg("clkZone"); + pref.putString("clkZone", clkZone); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getClkFormat", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(clkFormat)); + }); + server.on("/updClkFormat", HTTP_POST, [](AsyncWebServerRequest *request) { + clkFormat = request->arg("clkFormat").toInt(); + pref.putInt("clkFormat", clkFormat); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getClkColorSet", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(clkColorSet)); + }); + server.on("/updClkColorSet", HTTP_POST, [](AsyncWebServerRequest *request) { + clkColorSet = request->arg("clkColorSet").toInt(); + pref.putInt("clkColorSet", clkColorSet); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getClkHColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", clkHColorR, clkHColorG, clkHColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updClkHColor", HTTP_POST, [](AsyncWebServerRequest *request) { + clkHColorR = request->arg("r").toInt(); + clkHColorG = request->arg("g").toInt(); + clkHColorB = request->arg("b").toInt(); + pref.putInt("clkHColorR", clkHColorR); + pref.putInt("clkHColorG", clkHColorG); + pref.putInt("clkHColorB", clkHColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getClkMColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", clkMColorR, clkMColorG, clkMColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updClkMColor", HTTP_POST, [](AsyncWebServerRequest *request) { + clkMColorR = request->arg("r").toInt(); + clkMColorG = request->arg("g").toInt(); + clkMColorB = request->arg("b").toInt(); + pref.putInt("clkMColorR", clkMColorR); + pref.putInt("clkMColorG", clkMColorG); + pref.putInt("clkMColorB", clkMColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // |- date + server.on("/getDatFormat", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(datFormat)); + }); + server.on("/updDatFormat", HTTP_POST, [](AsyncWebServerRequest *request) { + datFormat = request->arg("datFormat").toInt(); + pref.putInt("datFormat", datFormat); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDatColorSet", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(datColorSet)); + }); + server.on("/updDatColorSet", HTTP_POST, [](AsyncWebServerRequest *request) { + datColorSet = request->arg("datColorSet").toInt(); + pref.putInt("datColorSet", datColorSet); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDatDColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", datDColorR, datDColorG, datDColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDatDColor", HTTP_POST, [](AsyncWebServerRequest *request) { + datDColorR = request->arg("r").toInt(); + datDColorG = request->arg("g").toInt(); + datDColorB = request->arg("b").toInt(); + pref.putInt("datDColorR", datDColorR); + pref.putInt("datDColorG", datDColorG); + pref.putInt("datDColorB", datDColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDatMColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", datMColorR, datMColorG, datMColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDatMColor", HTTP_POST, [](AsyncWebServerRequest *request) { + datMColorR = request->arg("r").toInt(); + datMColorG = request->arg("g").toInt(); + datMColorB = request->arg("b").toInt(); + pref.putInt("datMColorR", datMColorR); + pref.putInt("datMColorG", datMColorG); + pref.putInt("datMColorB", datMColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // |- temperature + server.on("/getTemSymbol", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(temSymbol)); + }); + server.on("/updTemSymbol", HTTP_POST, [](AsyncWebServerRequest *request) { + temSymbol = request->arg("temSymbol").toInt(); + pref.putInt("temSymbol", temSymbol); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // |- humidity + server.on("/getHumColorSet", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(humColorSet)); + }); + server.on("/updHumColorSet", HTTP_POST, [](AsyncWebServerRequest *request) { + humColorSet = request->arg("humColorSet").toInt(); + pref.putInt("humColorSet", humColorSet); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getHumAColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", humAColorR, humAColorG, humAColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updHumAColor", HTTP_POST, [](AsyncWebServerRequest *request) { + humAColorR = request->arg("r").toInt(); + humAColorG = request->arg("g").toInt(); + humAColorB = request->arg("b").toInt(); + pref.putInt("humAColorR", humAColorR); + pref.putInt("humAColorG", humAColorG); + pref.putInt("humAColorB", humAColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getHumBColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", humBColorR, humBColorG, humBColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updHumBColor", HTTP_POST, [](AsyncWebServerRequest *request) { + humBColorR = request->arg("r").toInt(); + humBColorG = request->arg("g").toInt(); + humBColorB = request->arg("b").toInt(); + pref.putInt("humBColorR", humBColorR); + pref.putInt("humBColorG", humBColorG); + pref.putInt("humBColorB", humBColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getHumCColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", humCColorR, humCColorG, humCColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updHumCColor", HTTP_POST, [](AsyncWebServerRequest *request) { + humCColorR = request->arg("r").toInt(); + humCColorG = request->arg("g").toInt(); + humCColorB = request->arg("b").toInt(); + pref.putInt("humCColorR", humCColorR); + pref.putInt("humCColorG", humCColorG); + pref.putInt("humCColorB", humCColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // |- scoreboard + server.on("/getScoHColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", scoHColorR, scoHColorG, scoHColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updScoHColor", HTTP_POST, [](AsyncWebServerRequest *request) { + scoHColorR = request->arg("r").toInt(); + scoHColorG = request->arg("g").toInt(); + scoHColorB = request->arg("b").toInt(); + pref.putInt("scoHColorR", scoHColorR); + pref.putInt("scoHColorG", scoHColorG); + pref.putInt("scoHColorB", scoHColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getScoAColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", scoAColorR, scoAColorG, scoAColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updScoAColor", HTTP_POST, [](AsyncWebServerRequest *request) { + scoAColorR = request->arg("r").toInt(); + scoAColorG = request->arg("g").toInt(); + scoAColorB = request->arg("b").toInt(); + pref.putInt("scoAColorR", scoAColorR); + pref.putInt("scoAColorG", scoAColorG); + pref.putInt("scoAColorB", scoAColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // |- countdown + server.on("/getCouHColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", couHColorR, couHColorG, couHColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updCouHColor", HTTP_POST, [](AsyncWebServerRequest *request) { + couHColorR = request->arg("r").toInt(); + couHColorG = request->arg("g").toInt(); + couHColorB = request->arg("b").toInt(); + pref.putInt("couHColorR", couHColorR); + pref.putInt("couHColorG", couHColorG); + pref.putInt("couHColorB", couHColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getCouMColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", couMColorR, couMColorG, couMColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updCouMColor", HTTP_POST, [](AsyncWebServerRequest *request) { + couMColorR = request->arg("r").toInt(); + couMColorG = request->arg("g").toInt(); + couMColorB = request->arg("b").toInt(); + pref.putInt("couMColorR", couMColorR); + pref.putInt("couMColorG", couMColorG); + pref.putInt("couMColorB", couMColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getCouSColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", couSColorR, couSColorG, couSColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updCouSColor", HTTP_POST, [](AsyncWebServerRequest *request) { + couSColorR = request->arg("r").toInt(); + couSColorG = request->arg("g").toInt(); + couSColorB = request->arg("b").toInt(); + pref.putInt("couSColorR", couSColorR); + pref.putInt("couSColorG", couSColorG); + pref.putInt("couSColorB", couSColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getCouAColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", couAColorR, couAColorG, couAColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updCouAColor", HTTP_POST, [](AsyncWebServerRequest *request) { + couAColorR = request->arg("r").toInt(); + couAColorG = request->arg("g").toInt(); + couAColorB = request->arg("b").toInt(); + pref.putInt("couAColorR", couAColorR); + pref.putInt("couAColorG", couAColorG); + pref.putInt("couAColorB", couAColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // |- scroll + server.on("/getScrTime", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(scrTime)); + }); + server.on("/updScrTime", HTTP_POST, [](AsyncWebServerRequest *request) { + scrTime = request->arg("scrTime").toInt(); + pref.putInt("scrTime", scrTime); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // |- downlights + server.on("/getDowColorSet", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(dowColorSet)); + }); + server.on("/updDowColorSet", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColorSet = request->arg("dowColorSet").toInt(); + pref.putInt("dowColorSet", dowColorSet); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColorR, dowColorG, dowColorB); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColorR = request->arg("r").toInt(); + dowColorG = request->arg("g").toInt(); + dowColorB = request->arg("b").toInt(); + pref.putInt("dowColorR", dowColorR); + pref.putInt("dowColorG", dowColorG); + pref.putInt("dowColorB", dowColorB); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor0", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor0R, dowColor0G, dowColor0B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor0", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor0R = request->arg("r").toInt(); + dowColor0G = request->arg("g").toInt(); + dowColor0B = request->arg("b").toInt(); + pref.putInt("dowColor0R", dowColor0R); + pref.putInt("dowColor0G", dowColor0G); + pref.putInt("dowColor0B", dowColor0B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor1", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor1R, dowColor1G, dowColor1B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor1", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor1R = request->arg("r").toInt(); + dowColor1G = request->arg("g").toInt(); + dowColor1B = request->arg("b").toInt(); + pref.putInt("dowColor1R", dowColor1R); + pref.putInt("dowColor1G", dowColor1G); + pref.putInt("dowColor1B", dowColor1B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor2", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor2R, dowColor2G, dowColor2B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor2", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor2R = request->arg("r").toInt(); + dowColor2G = request->arg("g").toInt(); + dowColor2B = request->arg("b").toInt(); + pref.putInt("dowColor2R", dowColor2R); + pref.putInt("dowColor2G", dowColor2G); + pref.putInt("dowColor2B", dowColor2B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor3", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor3R, dowColor3G, dowColor3B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor3", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor3R = request->arg("r").toInt(); + dowColor3G = request->arg("g").toInt(); + dowColor3B = request->arg("b").toInt(); + pref.putInt("dowColor3R", dowColor3R); + pref.putInt("dowColor3G", dowColor3G); + pref.putInt("dowColor3B", dowColor3B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor4", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor4R, dowColor4G, dowColor4B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor4", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor4R = request->arg("r").toInt(); + dowColor4G = request->arg("g").toInt(); + dowColor4B = request->arg("b").toInt(); + pref.putInt("dowColor4R", dowColor4R); + pref.putInt("dowColor4G", dowColor4G); + pref.putInt("dowColor4B", dowColor4B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor5", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor5R, dowColor5G, dowColor5B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor5", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor5R = request->arg("r").toInt(); + dowColor5G = request->arg("g").toInt(); + dowColor5B = request->arg("b").toInt(); + pref.putInt("dowColor5R", dowColor5R); + pref.putInt("dowColor5G", dowColor5G); + pref.putInt("dowColor5B", dowColor5B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor6", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor6R, dowColor6G, dowColor6B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor6", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor6R = request->arg("r").toInt(); + dowColor6G = request->arg("g").toInt(); + dowColor6B = request->arg("b").toInt(); + pref.putInt("dowColor6R", dowColor6R); + pref.putInt("dowColor6G", dowColor6G); + pref.putInt("dowColor6B", dowColor6B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor7", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor7R, dowColor7G, dowColor7B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor7", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor7R = request->arg("r").toInt(); + dowColor7G = request->arg("g").toInt(); + dowColor7B = request->arg("b").toInt(); + pref.putInt("dowColor7R", dowColor7R); + pref.putInt("dowColor7G", dowColor7G); + pref.putInt("dowColor7B", dowColor7B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor8", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor8R, dowColor8G, dowColor8B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor8", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor8R = request->arg("r").toInt(); + dowColor8G = request->arg("g").toInt(); + dowColor8B = request->arg("b").toInt(); + pref.putInt("dowColor8R", dowColor8R); + pref.putInt("dowColor8G", dowColor8G); + pref.putInt("dowColor8B", dowColor8B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor9", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor9R, dowColor9G, dowColor9B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor9", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor9R = request->arg("r").toInt(); + dowColor9G = request->arg("g").toInt(); + dowColor9B = request->arg("b").toInt(); + pref.putInt("dowColor9R", dowColor9R); + pref.putInt("dowColor9G", dowColor9G); + pref.putInt("dowColor9B", dowColor9B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor10", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor10R, dowColor10G, dowColor10B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor10", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor10R = request->arg("r").toInt(); + dowColor10G = request->arg("g").toInt(); + dowColor10B = request->arg("b").toInt(); + pref.putInt("dowColor10R", dowColor10R); + pref.putInt("dowColor10G", dowColor10G); + pref.putInt("dowColor10B", dowColor10B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor11", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor11R, dowColor11G, dowColor11B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor11", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor11R = request->arg("r").toInt(); + dowColor11G = request->arg("g").toInt(); + dowColor11B = request->arg("b").toInt(); + pref.putInt("dowColor11R", dowColor11R); + pref.putInt("dowColor11G", dowColor11G); + pref.putInt("dowColor11B", dowColor11B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor12", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor12R, dowColor12G, dowColor12B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor12", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor12R = request->arg("r").toInt(); + dowColor12G = request->arg("g").toInt(); + dowColor12B = request->arg("b").toInt(); + pref.putInt("dowColor12R", dowColor12R); + pref.putInt("dowColor12G", dowColor12G); + pref.putInt("dowColor12B", dowColor12B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getDowColor13", [](AsyncWebServerRequest *request) { + char tempcolor[8]; + sprintf(tempcolor, "#%02X%02X%02X", dowColor13R, dowColor13G, dowColor13B); + request->send(200, "text/plain", tempcolor); + }); + server.on("/updDowColor13", HTTP_POST, [](AsyncWebServerRequest *request) { + dowColor13R = request->arg("r").toInt(); + dowColor13G = request->arg("g").toInt(); + dowColor13B = request->arg("b").toInt(); + pref.putInt("dowColor13R", dowColor13R); + pref.putInt("dowColor13G", dowColor13G); + pref.putInt("dowColor13B", dowColor13B); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // wifi.html + server.on("/getAPSSID", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apSSID)); + }); + server.on("/updAPSSID", HTTP_POST, [](AsyncWebServerRequest *request) { + apSSID = request->arg("apSSID"); + pref.putString("apSSID", apSSID); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPPass", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apPass)); + }); + server.on("/updAPPass", HTTP_POST, [](AsyncWebServerRequest *request) { + apPass = request->arg("apPass"); + pref.putString("apPass", apPass); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPHide", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apHide)); + }); + server.on("/updAPHide", HTTP_POST, [](AsyncWebServerRequest *request) { + apHide = request->arg("apHide").toInt(); + pref.putInt("apHide", apHide); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPIP1", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apIP1)); + }); + server.on("/updAPIP1", HTTP_POST, [](AsyncWebServerRequest *request) { + apIP1 = request->arg("apIP1").toInt(); + pref.putInt("apIP1", apIP1); + pref.putInt("apGW1", apIP1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPIP2", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apIP2)); + }); + server.on("/updAPIP2", HTTP_POST, [](AsyncWebServerRequest *request) { + apIP2 = request->arg("apIP2").toInt(); + pref.putInt("apIP2", apIP2); + pref.putInt("apGW2", apIP2); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPIP3", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apIP3)); + }); + server.on("/updAPIP3", HTTP_POST, [](AsyncWebServerRequest *request) { + apIP3 = request->arg("apIP3").toInt(); + pref.putInt("apIP3", apIP3); + pref.putInt("apGW3", apIP3); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPIP4", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apIP4)); + }); + server.on("/updAPIP4", HTTP_POST, [](AsyncWebServerRequest *request) { + apIP4 = request->arg("apIP4").toInt(); + pref.putInt("apIP4", apIP4); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPGW1", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apGW1)); + }); + server.on("/updAPGW1", HTTP_POST, [](AsyncWebServerRequest *request) { + apGW1 = request->arg("apGW1").toInt(); + pref.putInt("apGW1", apGW1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPGW2", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apGW2)); + }); + server.on("/updAPGW2", HTTP_POST, [](AsyncWebServerRequest *request) { + apGW2 = request->arg("apGW2").toInt(); + pref.putInt("apGW2", apGW2); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPGW3", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apGW3)); + }); + server.on("/updAPGW3", HTTP_POST, [](AsyncWebServerRequest *request) { + apGW3 = request->arg("apGW3").toInt(); + pref.putInt("apGW3", apGW3); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPGW4", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apGW4)); + }); + server.on("/updAPGW4", HTTP_POST, [](AsyncWebServerRequest *request) { + apGW4 = request->arg("apGW4").toInt(); + pref.putInt("apGW4", apGW4); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPSN1", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apSN1)); + }); + server.on("/updAPSN1", HTTP_POST, [](AsyncWebServerRequest *request) { + apSN1 = request->arg("apSN1").toInt(); + pref.putInt("apSN1", apSN1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPSN2", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apSN2)); + }); + server.on("/updAPSN2", HTTP_POST, [](AsyncWebServerRequest *request) { + apSN2 = request->arg("apSN2").toInt(); + pref.putInt("apSN2", apSN2); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPSN3", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apSN3)); + }); + server.on("/updAPSN3", HTTP_POST, [](AsyncWebServerRequest *request) { + apSN3 = request->arg("apSN3").toInt(); + pref.putInt("apSN3", apSN3); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getAPSN4", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(apSN4)); + }); + server.on("/updAPSN4", HTTP_POST, [](AsyncWebServerRequest *request) { + apSN4 = request->arg("apSN4").toInt(); + pref.putInt("apSN4", apSN4); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/apRestart", HTTP_POST, [](AsyncWebServerRequest *request) { + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + WiFi.softAPdisconnect(); + WiFi.softAPConfig(apLocalIP, apGateway, apSubnet); + WiFi.softAP(apSSID.c_str(), apPass.c_str(), 1, apHide); + }); + server.on("/getWifiConfig", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiConfig)); + }); + server.on("/updWifiConfig", HTTP_POST, [](AsyncWebServerRequest *request) { + if (request->arg("wifiConfig") == "true") { + wifiConfig = 1; + } + if (request->arg("wifiConfig") == "false") { + wifiConfig = 0; + } + pref.putInt("wifiConfig", wifiConfig); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiSSID", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiSSID)); + }); + server.on("/updWifiSSID", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiSSID = request->arg("wifiSSID"); + pref.putString("wifiSSID", wifiSSID); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiPass", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiPass)); + }); + server.on("/updWifiPass", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiPass = request->arg("wifiPass"); + pref.putString("wifiPass", wifiPass); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiDHCP", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiDHCP)); + }); + server.on("/updWifiDHCP", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiDHCP = request->arg("wifiDHCP").toInt(); + pref.putInt("wifiDHCP", wifiDHCP); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiIP1", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiIP1)); + }); + server.on("/updWifiIP1", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiIP1 = request->arg("wifiIP1").toInt(); + pref.putInt("wifiIP1", wifiIP1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiIP2", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiIP2)); + }); + server.on("/updWifiIP2", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiIP2 = request->arg("wifiIP2").toInt(); + pref.putInt("wifiIP2", wifiIP2); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiIP3", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiIP3)); + }); + server.on("/updWifiIP3", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiIP3 = request->arg("wifiIP3").toInt(); + pref.putInt("wifiIP3", wifiIP3); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiIP4", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiIP4)); + }); + server.on("/updWifiIP4", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiIP4 = request->arg("wifiIP4").toInt(); + pref.putInt("wifiIP4", wifiIP4); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiGW1", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiGW1)); + }); + server.on("/updWifiGW1", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiGW1 = request->arg("wifiGW1").toInt(); + pref.putInt("wifiGW1", wifiGW1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiGW2", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiGW2)); + }); + server.on("/updWifiGW2", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiGW2 = request->arg("wifiGW2").toInt(); + pref.putInt("wifiGW2", wifiGW2); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiGW3", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiGW3)); + }); + server.on("/updWifiGW3", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiGW3 = request->arg("wifiGW3").toInt(); + pref.putInt("wifiGW3", wifiGW3); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiGW4", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiGW4)); + }); + server.on("/updWifiGW4", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiGW4 = request->arg("wifiGW4").toInt(); + pref.putInt("wifiGW4", wifiGW4); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiSN1", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiSN1)); + }); + server.on("/updWifiSN1", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiSN1 = request->arg("wifiSN1").toInt(); + pref.putInt("wifiSN1", wifiSN1); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiSN2", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiSN2)); + }); + server.on("/updWifiSN2", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiSN2 = request->arg("wifiSN2").toInt(); + pref.putInt("wifiSN2", wifiSN2); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiSN3", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiSN3)); + }); + server.on("/updWifiSN3", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiSN3 = request->arg("wifiSN3").toInt(); + pref.putInt("wifiSN3", wifiSN3); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/getWifiSN4", [](AsyncWebServerRequest *request) { + request->send(200, "text/plain", String(wifiSN4)); + }); + server.on("/updWifiSN4", HTTP_POST, [](AsyncWebServerRequest *request) { + wifiSN4 = request->arg("wifiSN4").toInt(); + pref.putInt("wifiSN4", wifiSN4); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + server.on("/wifiRestart", HTTP_POST, [](AsyncWebServerRequest *request) { + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + WiFi.disconnect(); + WiFi.config(wifiLocalIP, wifiGateway, wifiSubnet); + WiFi.begin(wifiSSID.c_str(), wifiPass.c_str()); + for (int i = 0; i < 100; i++) { + delay(100); + if (WiFi.status() == WL_CONNECTED) { + Serial.println("[+] Connected to wifi"); + Serial.print(" SSID: "); + Serial.println(WiFi.SSID()); + Serial.print(" IP Address: "); + Serial.println(WiFi.localIP()); + break; + } + } + if (WiFi.status() != WL_CONNECTED) { + WiFi.disconnect(); + Serial.println("[!] Not connected to your network"); + } + }); - // display "EndE" - if ( hours <= 0 && remM <= 0 && remS <= 0 ) { - countdownEnd(); - couMillis = 0; - couMillisEnd = 0; - return; - } + // help.html + // |- date & time + server.on("/updDateTime", HTTP_POST, [](AsyncWebServerRequest *request) { + int yeararg = request->arg("year").toInt(); + int montharg = request->arg("month").toInt(); + int dayarg = request->arg("day").toInt(); + int hourarg = request->arg("hour").toInt(); + int minarg = request->arg("min").toInt(); + int secarg = request->arg("sec").toInt(); + ntpTime.tm_year = yeararg - 1900; + ntpTime.tm_mon = montharg - 1; + ntpTime.tm_mday = dayarg; + ntpTime.tm_hour = hourarg; + ntpTime.tm_min = minarg; + ntpTime.tm_sec = secarg; + time_t t = mktime(&ntpTime); + struct timeval now1 = {.tv_sec = t}; + settimeofday(&now1, NULL); + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + }); + // |- resets + server.on("/resetFlash", HTTP_POST, [](AsyncWebServerRequest *request) { + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + pref.clear(); + ESP.restart(); + }); + server.on("/resetESP", HTTP_POST, [](AsyncWebServerRequest *request) { + request->send(200, "text/json", "{ \"result\":\"ok\" }"); + ESP.restart(); + }); } +/** + * @brief SETUP - webserver + * @details initialize the webserver and ota + * @since 1.0.0 + */ +void initServer() { + server.serveStatic("/", SPIFFS, "/"); // set default path + ElegantOTA.begin(&server); // start ElegantOTA + server.begin(); // start webserver +} -// ----- SCROLLING ----- -void modeScr() { // display different modes continously - ledClock.clear(); // clear the display +/** + * @brief SETUP - led + * @details start the neopixel arrays + * @since 1.0.0 + */ +void initLED() { + ledClock.begin(); // start ledstrip for the clock ... + ledClock.show(); // ... show() is mandatory + ledDownlight.begin(); // start ledstrip for the downlights ... + ledDownlight.show(); // ... show() is mandatory +} - scrMillis = millis(); // update current reference time +/** + * @brief LOOP - wifi + * @details reconnect the wifi client + * @since 1.0.0 + */ +void reconnectWifi() { + WiFi.disconnect(); // close current connection + WiFi.reconnect(); // reconnect with previous settings +} - if ( ( scrMillis - scrMillisPrev ) >= ( scrTime * 1000 ) ) { // run everything inside here every x seconds - scrMillisPrev = scrMillis; // update previous reference time +/** + * @brief LOOP - ntp + * @details Call an NTP server, get the current time and update the local time. + * @since 1.0.0 + */ +void getNTP() { + if (WiFi.status() == WL_CONNECTED) { + getLocalTime(&ntpTime); + } +} - if ( scrDisplayMode < 2 ) { // if scrDisplayMode is smaller than 2 ... - scrDisplayMode = scrDisplayMode + 1; // ... increase scrDisplayMode by 1 - } else { // ... else ... - scrDisplayMode = 0; // ... restart with the first content +/** + * @brief LOOP - knx + * @details fetch values from the home automation system + * @param s 1 = brightness, 2 = humidity, 3 = temperature + * @since 1.0.0 + */ +void getKNXdata(int s) { + if (WiFi.status() == WL_CONNECTED) { + switch (s) { + case 1: + if (gloBrightness == 0) { // value = 0 -> automatic mode + client.get(briKNXPath); // call knx for value + int brightnessKNX = + client.responseBody().toInt(); // write answer to value + briClock = + map(brightnessKNX, briKNXmin, briKNXmax, briClockMin, briClockMax); + ledClock.setBrightness(briClock); + } else { // value > 0 -> manual mode + ledClock.setBrightness(gloBrightness / 2); + } + if (dowBrightness == 0) { + client.get(briKNXPath); // call knx for value + int brightnessKNX = + client.responseBody().toInt(); // write answer to value + briDown = + map(brightnessKNX, briKNXmin, briKNXmax, briDownMin, briDownMax); + ledDownlight.setBrightness(briDown); + } else { + ledDownlight.setBrightness(dowBrightness); + } + break; + case 2: + client.get(humKNXPath); + humKNXValue = int((client.responseBody().toDouble()) * 10); + break; + case 3: + client.get(temKNXPath); + temKNXValue = (client.responseBody().toDouble()); + break; + default: + break; } } - - if ( scrDisplayMode == 0 ) { modeClk(); } // call clock mode - if ( scrDisplayMode == 1 ) { modeDat(); } // call date mode - if ( scrDisplayMode == 2 ) { modeTem(); } // call temperature mode } +/** + * @brief LOOP - downlights + * @details Control the downlights, e.g. colors and change frequency. + * @since 1.0.0 + */ +void displayDownlights() { + if (dowUsage == 1) { + if (dowColorSet == 0) { + dowColor = ledDownlight.Color(dowColorR, dowColorG, dowColorB); + ledDownlight.fill(dowColor, 0, DOWNLIGHT_COUNT); + } + if (dowColorSet == 1) { + dowColor0 = ledDownlight.Color(dowColor0R, dowColor0G, dowColor0B); + ledDownlight.fill(dowColor0, 0, 1); + dowColor1 = ledDownlight.Color(dowColor1R, dowColor1G, dowColor1B); + ledDownlight.fill(dowColor1, 1, 1); + dowColor2 = ledDownlight.Color(dowColor2R, dowColor2G, dowColor2B); + ledDownlight.fill(dowColor2, 2, 1); + dowColor3 = ledDownlight.Color(dowColor3R, dowColor3G, dowColor3B); + ledDownlight.fill(dowColor3, 3, 1); + dowColor4 = ledDownlight.Color(dowColor4R, dowColor4G, dowColor4B); + ledDownlight.fill(dowColor4, 4, 1); + dowColor5 = ledDownlight.Color(dowColor5R, dowColor5G, dowColor5B); + ledDownlight.fill(dowColor5, 5, 1); + dowColor6 = ledDownlight.Color(dowColor6R, dowColor6G, dowColor6B); + ledDownlight.fill(dowColor6, 6, 1); + dowColor7 = ledDownlight.Color(dowColor7R, dowColor7G, dowColor7B); + ledDownlight.fill(dowColor7, 7, 1); + dowColor8 = ledDownlight.Color(dowColor8R, dowColor8G, dowColor8B); + ledDownlight.fill(dowColor8, 8, 1); + dowColor9 = ledDownlight.Color(dowColor9R, dowColor9G, dowColor9B); + ledDownlight.fill(dowColor9, 9, 1); + dowColor10 = ledDownlight.Color(dowColor10R, dowColor10G, dowColor10B); + ledDownlight.fill(dowColor10, 10, 1); + dowColor11 = ledDownlight.Color(dowColor11R, dowColor11G, dowColor11B); + ledDownlight.fill(dowColor11, 11, 1); + dowColor12 = ledDownlight.Color(dowColor12R, dowColor12G, dowColor12B); + ledDownlight.fill(dowColor12, 12, 1); + dowColor13 = ledDownlight.Color(dowColor13R, dowColor13G, dowColor13B); + ledDownlight.fill(dowColor13, 13, 1); + } + if (dowColorSet == 2 && + ((dowColorFreq == 0) || (dowColorFreq == 1 && downMinPassed) || + (dowColorFreq == 2 && downHourPassed) || + (dowColorFreq == 3 && downDayPassed))) { + dowColor = ledDownlight.ColorHSV(random(0, 65535), 255, 255); + ledDownlight.fill(dowColor, 0, DOWNLIGHT_COUNT); + } + if (dowColorSet == 3 && + ((dowColorFreq == 0) || (dowColorFreq == 1 && downMinPassed) || + (dowColorFreq == 2 && downHourPassed) || + (dowColorFreq == 3 && downDayPassed))) { + for (int i = 0; i < DOWNLIGHT_COUNT; i++) { + dowColor = ledDownlight.ColorHSV(random(0, 65535), 255, 255); + ledDownlight.fill(dowColor, i, 1); + } + } + } else { + ledDownlight.clear(); // or turn them all off + } + + downMinPassed = false; // reset the color change flag (1 minute) + downHourPassed = false; // reset the color change flag (1 hour) + downDayPassed = false; // reset the color change flag (1 day) + ledDownlight.show(); // show the downlights +} -// ---------------------------------------------------------------------------------------------------- -// SETUP -// ---------------------------------------------------------------------------------------------------- +/** + * @brief LOOP - numbers + * @details show the number on the correct spot on the edge + * @param d the number to display + * @param offset 0 = 1st digit, 63 = 2nd digit, 126 = 3rd digit, 189 = 4th digit + * @param color color in uint_32 + * @since 1.0.0 + */ +void numberDisplay(int d, int offset, uint32_t color) { + switch (d) { + case 0: + ledClock.fill(color, (0 + offset), 27); // 0 + ledClock.fill(color, (36 + offset), 27); + break; + case 1: + ledClock.fill(color, (0 + offset), 9); // 1 + ledClock.fill(color, (36 + offset), 9); + break; + case 2: + ledClock.fill(color, (0 + offset), 18); // 2 + ledClock.fill(color, (27 + offset), 9); + ledClock.fill(color, (45 + offset), 18); + break; + case 3: + ledClock.fill(color, (0 + offset), 18); // 3 + ledClock.fill(color, (27 + offset), 27); + break; + case 4: + ledClock.fill(color, (0 + offset), 9); // 4 + ledClock.fill(color, (18 + offset), 27); + break; + case 5: + ledClock.fill(color, (9 + offset), 45); // 5 + break; + case 6: + ledClock.fill(color, (9 + offset), 54); // 6 + break; + case 7: + ledClock.fill(color, (0 + offset), 18); // 7 + ledClock.fill(color, (36 + offset), 9); + break; + case 8: + ledClock.fill(color, (0 + offset), 63); // 8 + break; + case 9: + ledClock.fill(color, (0 + offset), 54); // 9 + break; + case 10: + ledClock.fill(color, (0 + offset), 45); // A + ledClock.fill(color, (54 + offset), 9); + break; + case 11: + ledClock.fill(color, (18 + offset), 45); // b + break; + case 12: + ledClock.fill(color, (9 + offset), 18); // C + ledClock.fill(color, (45 + offset), 18); + break; + case 13: + ledClock.fill(color, (0 + offset), 9); // d + ledClock.fill(color, (27 + offset), 36); + break; + case 14: + ledClock.fill(color, (9 + offset), 27); // E + ledClock.fill(color, (45 + offset), 18); + break; + case 15: + ledClock.fill(color, (9 + offset), 27); // F + ledClock.fill(color, (54 + offset), 9); + break; + case 16: + ledClock.fill(color, (0 + offset), 9); // G + ledClock.fill(color, (27 + offset), 36); + break; + case 17: + ledClock.fill(color, (0 + offset), 9); // H + ledClock.fill(color, (18 + offset), 27); + ledClock.fill(color, (54 + offset), 9); + break; + case 18: + ledClock.fill(color, (0 + offset), 9); // I + ledClock.fill(color, (36 + offset), 9); + break; + case 19: + ledClock.fill(color, (0 + offset), 0); // J + ledClock.fill(color, (36 + offset), 18); + break; + case 20: + break; // K + case 21: + ledClock.fill(color, (18 + offset), 9); // L + ledClock.fill(color, (45 + offset), 18); + break; + case 22: + break; // M + case 23: + ledClock.fill(color, (27 + offset), 18); // n + ledClock.fill(color, (54 + offset), 9); + break; + case 24: + ledClock.fill(color, (27 + offset), 36); // o + break; + case 25: + ledClock.fill(color, (0 + offset), 36); // P + ledClock.fill(color, (45 + offset), 9); + break; + case 26: + break; // Q + case 27: + ledClock.fill(color, (27 + offset), 9); // r + ledClock.fill(color, (54 + offset), 9); + break; + case 28: + ledClock.fill(color, (9 + offset), 45); // S + break; + case 29: + ledClock.fill(color, (18 + offset), 18); // t + ledClock.fill(color, (45 + offset), 18); + break; + case 30: + ledClock.fill(color, (0 + offset), 9); // U + ledClock.fill(color, (18 + offset), 9); + ledClock.fill(color, (36 + offset), 27); + break; + case 31: + break; // V + case 32: + break; // W + case 33: + break; // X + case 34: + ledClock.fill(color, (0 + offset), 9); // Y + ledClock.fill(color, (18 + offset), 36); + break; + case 35: + ledClock.fill(color, (0 + offset), 18); // Z + ledClock.fill(color, (27 + offset), 9); + ledClock.fill(color, (45 + offset), 18); + break; + case 36: + ledClock.fill(color, (0 + offset), 36); // ° + break; + case 37: + ledClock.fill(color, (27 + offset), 9); // - + break; + default: + break; + } +} -void setup() { - Serial.begin(115200); // initialize serial connection - delay(1000); // wait a second for the serial to properly start - initMessage(); // display initial message with some basic information - initFlash(); // load all saved settings - initWifi(); // configure wifi - initmDNS(); // configure mdns - initSPIFFS(); // initialize spiffs - initNTP(); // get the time from ntp - initHandlers(); // load all web handlers - initServer(); // configure webserver - initLED(); // init neopixels - - getBrightness(); - getTemperature(); - getHumidity(); - - xTaskCreatePinnedToCore( // task 1 (running on core 0) - taskCore0code, // function to implement the task - "taskCore0", // name of the task - 10000, // stack size in words - NULL, // task input parameter - 0, // priority of the task - &taskCore0, // task handle - 0); // core where the task should run - - randomSeed(analogRead(1)); // initializes the pseudo-random number generator +void countdownEnd() { + ledClock.setBrightness(150); + couAColor = ledClock.Color(couAColorR, couAColorG, couAColorB); + ledClock.clear(); + ledClock.show(); + for (int i = 0; i < 5; i++) { + numberDisplay(14, 189, couAColor); + numberDisplay(23, 126, couAColor); + numberDisplay(13, 63, couAColor); + numberDisplay(14, 0, couAColor); + ledClock.show(); + delay(500); + ledClock.clear(); + ledClock.show(); + delay(300); + } + ledClock.clear(); + ledClock.show(); + delay(5000); + if (gloBrightness == 0) { // value = 0 -> automatic mode + ledClock.setBrightness(briClock); + } else { + ledClock.setBrightness(gloBrightness / 2); + } + displayMode = 0; + pref.putInt("displayMode", 0); } +// task1 on core0 +void taskCore0code(void *pvParameters) { + for (;;) { // required to keep the task running + // Setup time-passage trackers + int currTsec = ntpTime.tm_sec; + int currTmin = ntpTime.tm_min; + int currThour = ntpTime.tm_hour; + int currTday = ntpTime.tm_mday; + int m1 = currTmin / 10; + int m2 = currTmin % 10; + + if (abs(currTsec - prevTimeSecCore0) >= 1) { // every second + prevTimeSecCore0 = currTsec; // set reference + displayDownlights(); + if (WiFi.status() != WL_CONNECTED) { // NO wifi + reconnectWifi(); // -> reconnect + } + } -// ---------------------------------------------------------------------------------------------------- -// LOOP -// ---------------------------------------------------------------------------------------------------- + if (abs(currTmin - prevTimeMinCore0) >= 1) { // every minute + prevTimeMinCore0 = currTmin; // set reference + clockMinPassed = true; // set flag + downMinPassed = true; // set flag + getKNXdata(1); // brightness + } -void loop() { - currMillisCore1 = millis(); // update current reference time - - if ( ( currMillisCore1 - prevTimeSecCore1 ) >= 1000 ) { // run everything inside here every second - prevTimeSecCore1 = currMillisCore1; // update previous reference time - - time( &now ); // read the current time - localtime_r( &now, &ntpTime ); // update ntpTime with the current time - - if ( displayMode == 0 ) { modeClk(); } // call clock mode - if ( displayMode == 1 ) { modeDat(); } // call date mode - if ( displayMode == 2 ) { modeTem(); } // call temperature mode - if ( displayMode == 3 ) { modeHum(); } // call humidity mode - if ( displayMode == 4 ) { modeSco(); } // call scoreboard mode - if ( displayMode == 5 ) { modeCou(); } // call countdown mode - if ( displayMode == 6 ) { modeScr(); } // call scroll mode - - ledClock.show(); // show the content of the mode + if ((m2 == 0 || m2 == 5) && (currTsec == 0)) { // every 5 minutes + getKNXdata(2); // humidity + getKNXdata(3); // temperature + } + + if (abs(currThour - prevTimeHourCore0) >= 1) { // every hour + prevTimeHourCore0 = currThour; // set reference + clockHourPassed = true; // set flag + downHourPassed = true; // set flag + getNTP(); + } + + if (abs(currTday - prevTimeDayCore0) >= 1) { // every day + prevTimeDayCore0 = currTday; // set reference + clockDayPassed = true; // set flag + downDayPassed = true; // set flag + } } } From 1216dad55b1b501b0312d2a8b6be02a03543fd3a Mon Sep 17 00:00:00 2001 From: CaptSnus Date: Mon, 20 Nov 2023 21:07:58 +0100 Subject: [PATCH 04/21] extended to "dev"-branch --- .github/workflows/c-cpp.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 7947c60..3367c4a 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -2,19 +2,18 @@ name: C/C++ CI on: push: - branches: [ "main" ] + branches: ["main", "dev"] pull_request: - branches: [ "main" ] + branches: ["main"] jobs: build: - runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v3 - with: - submodules: 'recursive' - - name: Espressif IoT Development Framework (ESP-IDF) - uses: espressif/esp-idf-ci-action@latest + - name: Checkout repository + uses: actions/checkout@v3 + with: + submodules: "recursive" + - name: Espressif IoT Development Framework (ESP-IDF) + uses: espressif/esp-idf-ci-action@latest From 9a81302fc41afb479524f6dbb7b854c5d2ffd4ff Mon Sep 17 00:00:00 2001 From: CaptSnus Date: Mon, 20 Nov 2023 21:18:03 +0100 Subject: [PATCH 05/21] update --- .github/workflows/c-cpp.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 3367c4a..c3a88bf 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -11,9 +11,12 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout repository - uses: actions/checkout@v3 + - name: Checkout repo + uses: actions/checkout@v2 with: submodules: "recursive" - - name: Espressif IoT Development Framework (ESP-IDF) - uses: espressif/esp-idf-ci-action@latest + - name: esp-idf build + uses: espressif/esp-idf-ci-action@v1 + with: + esp_idf_version: v4.4 + target: esp32 From c4d0270abf553d80a52c093144efbd81c978e397 Mon Sep 17 00:00:00 2001 From: CaptSnus Date: Mon, 20 Nov 2023 21:22:43 +0100 Subject: [PATCH 06/21] small tweaks --- .github/workflows/c-cpp.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index c3a88bf..5245b26 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -12,11 +12,11 @@ jobs: steps: - name: Checkout repo - uses: actions/checkout@v2 + uses: actions/checkout@v3 with: submodules: "recursive" - name: esp-idf build uses: espressif/esp-idf-ci-action@v1 with: - esp_idf_version: v4.4 + esp_idf_version: v5.1.1 target: esp32 From 02258f40a5cd1f437073d9f20f80b4a218db00bc Mon Sep 17 00:00:00 2001 From: CaptSnus Date: Tue, 19 Dec 2023 22:09:18 +0100 Subject: [PATCH 07/21] Adafruit QT Py ESP32-S3 added --- platformio.ini | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/platformio.ini b/platformio.ini index 3d5059c..ebd8aa8 100644 --- a/platformio.ini +++ b/platformio.ini @@ -8,19 +8,35 @@ ; Please visit documentation for the other options and examples ; https://docs.platformio.org/page/projectconf.html -[env:esp32-s3-devkitc-1] +[env] platform = espressif32 -board = esp32-s3-devkitc-1 framework = arduino monitor_speed = 115200 + +[env:esp32-s3-devkitc-1] +board = esp32-s3-devkitc-1 +board_build.f_flash = 80000000L +board_build.partitions = default_8MB.csv +build_flags = + -DELEGANTOTA_USE_ASYNC_WEBSERVER=1 lib_deps = + arduino-libraries/ArduinoHttpClient@^0.5.0 https://github.com/me-no-dev/ESPAsyncWebServer.git - arduino-libraries/ArduinoHttpClient@^0.4.0 - adafruit/Adafruit NeoPixel@^1.11.0 me-no-dev/AsyncTCP@^1.1.1 end2endzone/NonBlockingRTTTL@^1.3.0 ayushsharma82/ElegantOTA@^3.1.0 -board_build.f_flash = 80000000L + fastled/FastLED@^3.6.0 + +[env:adafruit_qtpy_esp32s3_nopsram] +board = adafruit_qtpy_esp32s3_nopsram board_build.partitions = default_8MB.csv -build_flags = - -DELEGANTOTA_USE_ASYNC_WEBSERVER=1 \ No newline at end of file +build_flags = + -DARDUINO_USB_MODE=1 + -DELEGANTOTA_USE_ASYNC_WEBSERVER=1 +lib_deps = + arduino-libraries/ArduinoHttpClient@^0.5.0 + https://github.com/me-no-dev/ESPAsyncWebServer.git + me-no-dev/AsyncTCP@^1.1.1 + end2endzone/NonBlockingRTTTL@^1.3.0 + ayushsharma82/ElegantOTA@^3.1.0 + fastled/FastLED@^3.6.0 From 4ed5ef718ad525dd7230d495b5efbd95f22d0e4b Mon Sep 17 00:00:00 2001 From: CaptSnus Date: Tue, 19 Dec 2023 22:09:44 +0100 Subject: [PATCH 08/21] major rework --- data/index.html | 165 +-- data/js/index.js | 202 ++- data/js/settings.js | 1054 +++++++------- data/js/wifi.js | 480 ++++--- data/settings.html | 418 +++--- data/wifi.html | 61 +- src/main.cpp | 3213 +++++++++++++++++-------------------------- 7 files changed, 2375 insertions(+), 3218 deletions(-) diff --git a/data/index.html b/data/index.html index 24732ef..a2a9d00 100644 --- a/data/index.html +++ b/data/index.html @@ -24,13 +24,10 @@ - - +
- -
-

Dashboard

+ + +
+

Dashboard

diff --git a/data/js/index.js b/data/js/index.js index 02656ad..20308df 100644 --- a/data/js/index.js +++ b/data/js/index.js @@ -1,156 +1,118 @@ -// INDEX.HTML +// **************************************************************************************************** +// FUNCTIONS - update +// **************************************************************************************************** // Mode -function goClk() { - $.post("/goModeClk"); - console.log("clock"); +function updateDisplayMode(mode, data1 = 0, data2 = 0) { + const displayMode = { mode: mode, data1: data1, data2: data2 }; + $.post("/updateDisplayMode", displayMode); + console.log(displayMode); } -function goDat() { - $.post("/goModeDat"); - console.log("date"); -} -function goTem() { - $.post("/goModeTem"); - console.log("temperature"); -} -function goHum() { - $.post("/goModeHum"); - console.log("humidity"); -} -function goScr() { - $.post("/goModeScr"); - console.log("scroll"); -} - // Scoreboard -function startup() { - const scoHValue = document.querySelector("#scoHome"); - scoHValue.addEventListener("input", scoShow, false); - const scoAValue = document.querySelector("#scoAway"); - scoAValue.addEventListener("input", scoShow, false); -} - -function scoHUp() { - const scoHome = $("#scoHome").val(); - if (scoHome < 99 && !isNaN(scoHome)) { - const newval = parseInt(scoHome) + 1; - $("#scoHome").val(newval); - scoShow(); +function scoreLup() { + const scoreL = $("#scoreL").val(); + if (scoreL < 99 && !isNaN(scoreL)) { + const newval = parseInt(scoreL) + 1; + $("#scoreL").val(newval); + scoreShow(); } } - -function scoAUp() { - const scoAway = $("#scoAway").val(); - if (scoAway < 99 && !isNaN(scoAway)) { - const newval = parseInt(scoAway) + 1; - $("#scoAway").val(newval); - scoShow(); +function scoreLdown() { + const scoreL = $("#scoreL").val(); + if (scoreL > 0 && !isNaN(scoreL)) { + const newval = parseInt(scoreL) - 1; + $("#scoreL").val(newval); + scoreShow(); } } - -function scoHDown() { - const scoHome = $("#scoHome").val(); - if (scoHome > 0 && !isNaN(scoHome)) { - const newval = parseInt(scoHome) - 1; - $("#scoHome").val(newval); - scoShow(); +function scoreRup() { + const scoreR = $("#scoreR").val(); + if (scoreR < 99 && !isNaN(scoreR)) { + const newval = parseInt(scoreR) + 1; + $("#scoreR").val(newval); + scoreShow(); } } - -function scoADown() { - const scoAway = $("#scoAway").val(); - if (scoAway > 0 && !isNaN(scoAway)) { - const newval = parseInt(scoAway) - 1; - $("#scoAway").val(newval); - scoShow(); +function scoreRdown() { + const scoreR = $("#scoreR").val(); + if (scoreR > 0 && !isNaN(scoreR)) { + const newval = parseInt(scoreR) - 1; + $("#scoreR").val(newval); + scoreShow(); } } - -function scoShow() { - const scoH = $("#scoHome").val(); - const scoA = $("#scoAway").val(); - const scoreboard = { scoHome: scoH, scoAway: scoA }; - $.post("/goModeSco", scoreboard); - console.log(scoreboard); +function scoreShow() { + const scoreL = parseInt($("#scoreL").val()); + const scoreR = parseInt($("#scoreR").val()); + updateDisplayMode(4, scoreL, scoreR); } - -function scoReset() { - $("#scoHome").val(0); - $("#scoAway").val(0); - scoShow(); +function scoreReset() { + $("#scoreL").val(0); + $("#scoreR").val(0); + scoreShow(); } - // Countdown -function couHUp() { - const couH = $("#couH").val(); - if (couH < 99 && !isNaN(couH)) { - const newval = parseInt(couH) + 1; - $("#couH").val(newval); +function countHup() { + const countH = $("#countH").val(); + if (countH < 23 && !isNaN(countH)) { + const newval = parseInt(countH) + 1; + $("#countH").val(newval); } } - -function couMUp() { - const couM = $("#couM").val(); - if (couM < 60 && !isNaN(couM)) { - const newval = parseInt(couM) + 1; - $("#couM").val(newval); +function countMup() { + const countM = $("#countM").val(); + if (countM < 60 && !isNaN(countM)) { + const newval = parseInt(countM) + 1; + $("#countM").val(newval); } } - -function couSUp() { - const couS = $("#couS").val(); - if (couS < 60 && !isNaN(couS)) { - const newval = parseInt(couS) + 1; - $("#couS").val(newval); +function countSup() { + const countS = $("#countS").val(); + if (countS < 60 && !isNaN(countS)) { + const newval = parseInt(countS) + 1; + $("#countS").val(newval); } } - -function couHDown() { - const couH = $("#couH").val(); - if (couH > 0 && !isNaN(couH)) { - const newval = parseInt(couH) - 1; - $("#couH").val(newval); +function countHdown() { + const countH = $("#countH").val(); + if (countH > 0 && !isNaN(countH)) { + const newval = parseInt(countH) - 1; + $("#countH").val(newval); } } - -function couMDown() { - const couM = $("#couM").val(); - if (couM > 0 && !isNaN(couM)) { - const newval = parseInt(couM) - 1; - $("#couM").val(newval); +function countMdown() { + const countM = $("#countM").val(); + if (countM > 0 && !isNaN(countM)) { + const newval = parseInt(countM) - 1; + $("#countM").val(newval); } } - -function couSDown() { - const couS = $("#couS").val(); - if (couS > 0 && !isNaN(couS)) { - const newval = parseInt(couS) - 1; - $("#couS").val(newval); +function countSdown() { + const countS = $("#countS").val(); + if (countS > 0 && !isNaN(countS)) { + const newval = parseInt(countS) - 1; + $("#countS").val(newval); } } - -function couStart() { - const h = $("#couH").val(); - const m = $("#couM").val(); - const s = $("#couS").val(); +function countStart() { + const h = $("#countH").val(); + const m = $("#countM").val(); + const s = $("#countS").val(); const ms = h * 60 * 60 * 1000 + m * 60 * 1000 + s * 1000; - const countdown = { millis: ms }; - $.post("/goModeCou", countdown); + updateDisplayMode(5, ms); } - -function couReset() { - $("#couH").val(0); - $("#couM").val(0); - $("#couS").val(0); - couStart(); +function countReset() { + $("#countH").val(0); + $("#countM").val(0); + $("#countS").val(0); + countStart(); } - // Downlights -function goDow(dowU, dowCS) { - const downlight = { dowUsage: dowU, dowColorSet: dowCS }; - $.post("/goDow", downlight); +function updateDownlight(downlightUsage, downlightColor) { + const downlight = { downlightUsage: downlightUsage, downlightColor: downlightColor }; + $.post("/updateDownlight", downlight); console.log(downlight); } diff --git a/data/js/settings.js b/data/js/settings.js index ff075cb..33cbb40 100644 --- a/data/js/settings.js +++ b/data/js/settings.js @@ -1,33 +1,6 @@ -// **************************************************************************************************** -// Translator -// **************************************************************************************************** -/* -import Translator from './translator.js' -const translator = new Translator({ - defaultLanguage: 'de', - detectLanguage: true, - selector: '[data-i18n]', - debug: true, - registerGlobally: '__', - persist: true, - persistKey: 'preferred_language', - filesLocation: './i18n' -}) - -// By using `fetch`, you load the translation sources asynchronously -// from a directory in your project's folder. The resources must -// be in JSON. After they are fetched, you can use the API to -// translate the page. -translator.fetch(['de', 'en']).then(() => { - // -> Translations are ready... - translator.translatePageTo('de') -}) -*/ - // **************************************************************************************************** // Color preview // **************************************************************************************************** - const closest = (to, selector) => { let currentElement = document.querySelector(to); let returnElement; @@ -43,209 +16,200 @@ const closest = (to, selector) => { // **************************************************************************************************** // FUNCTIONS - get // **************************************************************************************************** -// Global -function getGloBrightness() { +// Globale Einstellungen +function getEdgeBrightness() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { if (this.responseText === "0") { - document.getElementById("gloBrightness").selectedIndex = "0"; + document.getElementById("edgeBrightness").selectedIndex = "0"; } if (this.responseText === "25") { - document.getElementById("gloBrightness").selectedIndex = "1"; + document.getElementById("edgeBrightness").selectedIndex = "1"; } if (this.responseText === "50") { - document.getElementById("gloBrightness").selectedIndex = "2"; + document.getElementById("edgeBrightness").selectedIndex = "2"; } if (this.responseText === "75") { - document.getElementById("gloBrightness").selectedIndex = "3"; + document.getElementById("edgeBrightness").selectedIndex = "3"; } if (this.responseText === "100") { - document.getElementById("gloBrightness").selectedIndex = "4"; + document.getElementById("edgeBrightness").selectedIndex = "4"; } if (this.responseText === "125") { - document.getElementById("gloBrightness").selectedIndex = "5"; + document.getElementById("edgeBrightness").selectedIndex = "5"; } if (this.responseText === "150") { - document.getElementById("gloBrightness").selectedIndex = "6"; + document.getElementById("edgeBrightness").selectedIndex = "6"; } if (this.responseText === "175") { - document.getElementById("gloBrightness").selectedIndex = "7"; + document.getElementById("edgeBrightness").selectedIndex = "7"; } if (this.responseText === "200") { - document.getElementById("gloBrightness").selectedIndex = "8"; + document.getElementById("edgeBrightness").selectedIndex = "8"; } if (this.responseText === "225") { - document.getElementById("gloBrightness").selectedIndex = "9"; + document.getElementById("edgeBrightness").selectedIndex = "9"; } if (this.responseText === "250") { - document.getElementById("gloBrightness").selectedIndex = "10"; + document.getElementById("edgeBrightness").selectedIndex = "10"; } } }; - xhttp.open("GET", "getGloBrightness", true); + xhttp.open("GET", "getEdgeBrightness", true); xhttp.send(); } - -function getBriClockMin() { +function getEdgeBrightnessMin() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("briClockMin").value = this.responseText; + document.getElementById("edgeBrightnessMin").value = this.responseText; } }; - xhttp.open("GET", "getBriClockMin", true); + xhttp.open("GET", "getEdgeBrightnessMin", true); xhttp.send(); } - -function getBriClockMax() { +function getEdgeBrightnessMax() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("briClockMax").value = this.responseText; + document.getElementById("edgeBrightnessMax").value = this.responseText; } }; - xhttp.open("GET", "getBriClockMax", true); + xhttp.open("GET", "getEdgeBrightnessMax", true); xhttp.send(); } - -function getGloColorFreq() { +function getEdgeFrequency() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { if (this.responseText === "0") { - document.getElementById("gloColorFreq").selectedIndex = "0"; + document.getElementById("edgeFrequency").selectedIndex = "0"; } if (this.responseText === "1") { - document.getElementById("gloColorFreq").selectedIndex = "1"; + document.getElementById("edgeFrequency").selectedIndex = "1"; } if (this.responseText === "2") { - document.getElementById("gloColorFreq").selectedIndex = "2"; + document.getElementById("edgeFrequency").selectedIndex = "2"; } if (this.responseText === "3") { - document.getElementById("gloColorFreq").selectedIndex = "3"; + document.getElementById("edgeFrequency").selectedIndex = "3"; } } }; - xhttp.open("GET", "getGloColorFreq", true); + xhttp.open("GET", "getEdgeFrequency", true); xhttp.send(); } - -function getDowUsage() { +function getDownlightUsage() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { if (this.responseText === "0") { - document.getElementById("dowUsage").selectedIndex = "0"; + document.getElementById("downlightUsage").selectedIndex = "0"; } if (this.responseText === "1") { - document.getElementById("dowUsage").selectedIndex = "1"; + document.getElementById("downlightUsage").selectedIndex = "1"; } } }; - xhttp.open("GET", "getDowUsage", true); + xhttp.open("GET", "getDownlightUsage", true); xhttp.send(); } - -function getDowBrightness() { +function getDownlightBrightness() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { if (this.responseText === "0") { - document.getElementById("dowBrightness").selectedIndex = "0"; + document.getElementById("downlightBrightness").selectedIndex = "0"; } if (this.responseText === "25") { - document.getElementById("dowBrightness").selectedIndex = "1"; + document.getElementById("downlightBrightness").selectedIndex = "1"; } if (this.responseText === "50") { - document.getElementById("dowBrightness").selectedIndex = "2"; + document.getElementById("downlightBrightness").selectedIndex = "2"; } if (this.responseText === "75") { - document.getElementById("dowBrightness").selectedIndex = "3"; + document.getElementById("downlightBrightness").selectedIndex = "3"; } if (this.responseText === "100") { - document.getElementById("dowBrightness").selectedIndex = "4"; + document.getElementById("downlightBrightness").selectedIndex = "4"; } if (this.responseText === "125") { - document.getElementById("dowBrightness").selectedIndex = "5"; + document.getElementById("downlightBrightness").selectedIndex = "5"; } if (this.responseText === "150") { - document.getElementById("dowBrightness").selectedIndex = "6"; + document.getElementById("downlightBrightness").selectedIndex = "6"; } if (this.responseText === "175") { - document.getElementById("dowBrightness").selectedIndex = "7"; + document.getElementById("downlightBrightness").selectedIndex = "7"; } if (this.responseText === "200") { - document.getElementById("dowBrightness").selectedIndex = "8"; + document.getElementById("downlightBrightness").selectedIndex = "8"; } if (this.responseText === "225") { - document.getElementById("dowBrightness").selectedIndex = "9"; + document.getElementById("downlightBrightness").selectedIndex = "9"; } if (this.responseText === "250") { - document.getElementById("dowBrightness").selectedIndex = "10"; + document.getElementById("downlightBrightness").selectedIndex = "10"; } } }; - xhttp.open("GET", "getDowBrightness", true); + xhttp.open("GET", "getDownlightBrightness", true); xhttp.send(); } - -function getBriDownMin() { +function getDownlightBrightnessMin() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("briDownMin").value = this.responseText; + document.getElementById("downlightBrightnessMin").value = this.responseText; } }; - xhttp.open("GET", "getBriDownMin", true); + xhttp.open("GET", "getDownlightBrightnessMin", true); xhttp.send(); } - -function getBriDownMax() { +function getDownlightBrightnessMax() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("briDownMax").value = this.responseText; + document.getElementById("downlightBrightnessMax").value = this.responseText; } }; - xhttp.open("GET", "getBriDownMax", true); + xhttp.open("GET", "getDownlightBrightnessMax", true); xhttp.send(); } - -function getDowColorFreq() { +function getDownlightFrequency() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { if (this.responseText === "0") { - document.getElementById("dowColorFreq").selectedIndex = "0"; + document.getElementById("downlightFrequency").selectedIndex = "0"; } if (this.responseText === "1") { - document.getElementById("dowColorFreq").selectedIndex = "1"; + document.getElementById("downlightFrequency").selectedIndex = "1"; } if (this.responseText === "2") { - document.getElementById("dowColorFreq").selectedIndex = "2"; + document.getElementById("downlightFrequency").selectedIndex = "2"; } if (this.responseText === "3") { - document.getElementById("dowColorFreq").selectedIndex = "3"; + document.getElementById("downlightFrequency").selectedIndex = "3"; } } }; - xhttp.open("GET", "getDowColorFreq", true); + xhttp.open("GET", "getDownlightFrequency", true); xhttp.send(); } // KNX -function getKNXAddr() { +function getKNXAddress() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("knxAddr").value = this.responseText; + document.getElementById("knxAddress").value = this.responseText; } }; - xhttp.open("GET", "getKNXAddr", true); + xhttp.open("GET", "getKNXAddress", true); xhttp.send(); } - function getKNXPort() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -256,85 +220,78 @@ function getKNXPort() { xhttp.open("GET", "getKNXPort", true); xhttp.send(); } - -function getBriKNXPath() { +function getKNXBrightnessPath() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("briKNXPath").value = this.responseText; + document.getElementById("knxBrightnessPath").value = this.responseText; } }; - xhttp.open("GET", "getBriKNXPath", true); + xhttp.open("GET", "getKNXBrightnessPath", true); xhttp.send(); } - -function getBriKNXmin() { +function getKNXBrightnessMin() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("briKNXmin").value = this.responseText; + document.getElementById("knxBrightnessMin").value = this.responseText; } }; - xhttp.open("GET", "getBriKNXmin", true); + xhttp.open("GET", "getKNXBrightnessMin", true); xhttp.send(); } - -function getBriKNXmax() { +function getKNXBrightnessMax() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("briKNXmax").value = this.responseText; + document.getElementById("knxBrightnessMax").value = this.responseText; } }; - xhttp.open("GET", "getBriKNXmax", true); + xhttp.open("GET", "getKNXBrightnessMax", true); xhttp.send(); } - -function getTemKNXPath() { +function getKNXTemperaturePath() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("temKNXPath").value = this.responseText; + document.getElementById("knxTemperaturePath").value = this.responseText; } }; - xhttp.open("GET", "getTemKNXPath", true); + xhttp.open("GET", "getKNXTemperaturePath", true); xhttp.send(); } - -function getHumKNXPath() { +function getKNXHumidityPath() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("humKNXPath").value = this.responseText; + document.getElementById("knxHumidityPath").value = this.responseText; } }; - xhttp.open("GET", "getHumKNXPath", true); + xhttp.open("GET", "getKNXHumidityPath", true); xhttp.send(); } // Clock -function getClkAddr() { +function getClkAddress() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("clkAddr").value = this.responseText; + document.getElementById("clkAddress").value = this.responseText; } }; - xhttp.open("GET", "getClkAddr", true); + xhttp.open("GET", "getClkAddress", true); xhttp.send(); } - -function getClkZone() { +function getClkTimeZone() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("clkZone").value = this.responseText; + document.getElementById("clkTimeZone").value = this.responseText; } }; - xhttp.open("GET", "getClkZone", true); + xhttp.open("GET", "getClkTimeZone", true); xhttp.send(); } - function getClkFormat() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -350,46 +307,43 @@ function getClkFormat() { xhttp.open("GET", "getClkFormat", true); xhttp.send(); } - -function getClkColorSet() { +function getClkColor() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { if (this.responseText === "0") { - document.getElementById("clkColorSet").selectedIndex = 0; - document.getElementById("clkFields").hidden = false; + document.getElementById("clkColor").selectedIndex = 0; + document.getElementById("clkColorInput").hidden = false; } if (this.responseText === "1") { - document.getElementById("clkColorSet").selectedIndex = 1; - document.getElementById("clkFields").hidden = true; + document.getElementById("clkColor").selectedIndex = 1; + document.getElementById("clkColorInput").hidden = true; } } }; - xhttp.open("GET", "getClkColorSet", true); + xhttp.open("GET", "getClkColor", true); xhttp.send(); } - -function getClkHColor() { +function getClkColorH() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("clkHColor").value = this.responseText; - closest("#clkHColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("clkColorH").value = this.responseText; + closest("#clkColorH", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getClkHColor", true); + xhttp.open("GET", "getClkColorH", true); xhttp.send(); } - -function getClkMColor() { +function getClkColorM() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("clkMColor").value = this.responseText; - closest("#clkMColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("clkColorM").value = this.responseText; + closest("#clkColorM", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getClkMColor", true); + xhttp.open("GET", "getClkColorM", true); xhttp.send(); } @@ -409,46 +363,43 @@ function getDatFormat() { xhttp.open("GET", "getDatFormat", true); xhttp.send(); } - -function getDatColorSet() { +function getDatColor() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { if (this.responseText === "0") { - document.getElementById("datColorSet").selectedIndex = 0; - document.getElementById("datFields").hidden = false; + document.getElementById("datColor").selectedIndex = 0; + document.getElementById("datColorInput").hidden = false; } if (this.responseText === "1") { - document.getElementById("datColorSet").selectedIndex = 1; - document.getElementById("datFields").hidden = true; + document.getElementById("datColor").selectedIndex = 1; + document.getElementById("datColorInput").hidden = true; } } }; - xhttp.open("GET", "getDatColorSet", true); + xhttp.open("GET", "getDatColor", true); xhttp.send(); } - -function getDatDColor() { +function getDatColorD() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("datDColor").value = this.responseText; - closest("#datDColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("datColorD").value = this.responseText; + closest("#datColorD", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getDatDColor", true); + xhttp.open("GET", "getDatColorD", true); xhttp.send(); } - -function getDatMColor() { +function getDatColorM() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("datMColor").value = this.responseText; - closest("#datMColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("datColorM").value = this.responseText; + closest("#datColorM", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getDatMColor", true); + xhttp.open("GET", "getDatColorM", true); xhttp.send(); } @@ -470,131 +421,124 @@ function getTemSymbol() { } // Humidity -function getHumColorSet() { +function getHumColor() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { if (this.responseText === "0") { - document.getElementById("humColorSet").selectedIndex = 0; - document.getElementById("humFields").hidden = false; + document.getElementById("humColor").selectedIndex = 0; + document.getElementById("humColorInput").hidden = false; } if (this.responseText === "1") { - document.getElementById("humColorSet").selectedIndex = 1; - document.getElementById("humFields").hidden = true; + document.getElementById("humColor").selectedIndex = 1; + document.getElementById("humColorInput").hidden = true; } } }; - xhttp.open("GET", "getHumColorSet", true); + xhttp.open("GET", "getHumColor", true); xhttp.send(); } - -function getHumAColor() { +function getHumColorA() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("humAColor").value = this.responseText; - closest("#humAColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("humColorA").value = this.responseText; + closest("#humColorA", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getHumAColor", true); + xhttp.open("GET", "getHumColorA", true); xhttp.send(); } - -function getHumBColor() { +function getHumColorB() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("humBColor").value = this.responseText; - closest("#humBColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("humColorB").value = this.responseText; + closest("#humColorB", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getHumBColor", true); + xhttp.open("GET", "getHumColorB", true); xhttp.send(); } - -function getHumCColor() { +function getHumColorC() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("humCColor").value = this.responseText; - closest("#humCColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("humColorC").value = this.responseText; + closest("#humColorC", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getHumCColor", true); + xhttp.open("GET", "getHumColorC", true); xhttp.send(); } // Scoreboard -function getScoHColor() { +function getScoColorL() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("scoHColor").value = this.responseText; - closest("#scoHColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("scoColorL").value = this.responseText; + closest("#scoColorL", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getScoHColor", true); + xhttp.open("GET", "getScoColorL", true); xhttp.send(); } - -function getScoAColor() { +function getScoColorR() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("scoAColor").value = this.responseText; - closest("#scoAColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("scoColorR").value = this.responseText; + closest("#scoColorR", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getScoAColor", true); + xhttp.open("GET", "getScoColorR", true); xhttp.send(); } // Countdown -function getCouHColor() { +function getCouColorH() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("couHColor").value = this.responseText; - closest("#couHColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("couColorH").value = this.responseText; + closest("#couColorH", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getCouHColor", true); + xhttp.open("GET", "getCouColorH", true); xhttp.send(); } - -function getCouMColor() { +function getCouColorM() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("couMColor").value = this.responseText; - closest("#couMColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("couColorM").value = this.responseText; + closest("#couColorM", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getCouMColor", true); + xhttp.open("GET", "getCouColorM", true); xhttp.send(); } - -function getCouSColor() { +function getCouColorS() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("couSColor").value = this.responseText; - closest("#couSColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("couColorS").value = this.responseText; + closest("#couColorS", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getCouSColor", true); + xhttp.open("GET", "getCouColorS", true); xhttp.send(); } - -function getCouAColor() { +function getCouColorA() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { - document.getElementById("couAColor").value = this.responseText; - closest("#couAColor", ".input-group-text").style.backgroundColor = this.responseText; + document.getElementById("couColorA").value = this.responseText; + closest("#couColorA", ".input-group-text").style.backgroundColor = this.responseText; } }; - xhttp.open("GET", "getCouAColor", true); + xhttp.open("GET", "getCouColorA", true); xhttp.send(); } @@ -611,52 +555,27 @@ function getScrTime() { } // Downlights -function getDowColorSet() { +function getDowColor() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { if (this.readyState === 4 && this.status === 200) { if (this.responseText === "0") { - document.getElementById("dowColorSet").selectedIndex = 0; - document.getElementById("dowFields0").hidden = false; - document.getElementById("dowFields1upper").hidden = true; - document.getElementById("dowFields1lower").hidden = true; + document.getElementById("dowColor").selectedIndex = 0; + document.getElementById("dowColorInput").hidden = false; } if (this.responseText === "1") { - document.getElementById("dowColorSet").selectedIndex = 1; - document.getElementById("dowFields0").hidden = true; - document.getElementById("dowFields1upper").hidden = false; - document.getElementById("dowFields1lower").hidden = false; + document.getElementById("dowColor").selectedIndex = 1; + document.getElementById("dowColorInput").hidden = true; } if (this.responseText === "2") { - document.getElementById("dowColorSet").selectedIndex = 2; - document.getElementById("dowFields0").hidden = true; - document.getElementById("dowFields1upper").hidden = true; - document.getElementById("dowFields1lower").hidden = true; - } - if (this.responseText === "3") { - document.getElementById("dowColorSet").selectedIndex = 3; - document.getElementById("dowFields0").hidden = true; - document.getElementById("dowFields1upper").hidden = true; - document.getElementById("dowFields1lower").hidden = true; + document.getElementById("dowColor").selectedIndex = 2; + document.getElementById("dowColorInput").hidden = true; } } }; - xhttp.open("GET", "getDowColorSet", true); - xhttp.send(); -} - -function getDowColor() { - const xhttp = new XMLHttpRequest(); - xhttp.onreadystatechange = function () { - if (this.readyState === 4 && this.status === 200) { - document.getElementById("dowColor").value = this.responseText; - closest("#dowColor", ".input-group-text").style.backgroundColor = this.responseText; - } - }; xhttp.open("GET", "getDowColor", true); xhttp.send(); } - function getDowColor0() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -668,7 +587,6 @@ function getDowColor0() { xhttp.open("GET", "getDowColor0", true); xhttp.send(); } - function getDowColor1() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -680,7 +598,6 @@ function getDowColor1() { xhttp.open("GET", "getDowColor1", true); xhttp.send(); } - function getDowColor2() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -692,7 +609,6 @@ function getDowColor2() { xhttp.open("GET", "getDowColor2", true); xhttp.send(); } - function getDowColor3() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -704,7 +620,6 @@ function getDowColor3() { xhttp.open("GET", "getDowColor3", true); xhttp.send(); } - function getDowColor4() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -716,7 +631,6 @@ function getDowColor4() { xhttp.open("GET", "getDowColor4", true); xhttp.send(); } - function getDowColor5() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -728,7 +642,6 @@ function getDowColor5() { xhttp.open("GET", "getDowColor5", true); xhttp.send(); } - function getDowColor6() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -740,7 +653,6 @@ function getDowColor6() { xhttp.open("GET", "getDowColor6", true); xhttp.send(); } - function getDowColor7() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -752,7 +664,6 @@ function getDowColor7() { xhttp.open("GET", "getDowColor7", true); xhttp.send(); } - function getDowColor8() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -764,7 +675,6 @@ function getDowColor8() { xhttp.open("GET", "getDowColor8", true); xhttp.send(); } - function getDowColor9() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -776,7 +686,6 @@ function getDowColor9() { xhttp.open("GET", "getDowColor9", true); xhttp.send(); } - function getDowColor10() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -788,7 +697,6 @@ function getDowColor10() { xhttp.open("GET", "getDowColor10", true); xhttp.send(); } - function getDowColor11() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -800,7 +708,6 @@ function getDowColor11() { xhttp.open("GET", "getDowColor11", true); xhttp.send(); } - function getDowColor12() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -812,7 +719,6 @@ function getDowColor12() { xhttp.open("GET", "getDowColor12", true); xhttp.send(); } - function getDowColor13() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -829,55 +735,65 @@ function getDowColor13() { // EVENT LISTENER - get // **************************************************************************************************** function init() { - // Global - getGloBrightness(); - getBriClockMin(); - getBriClockMax(); - getGloColorFreq(); - getDowUsage(); - getDowBrightness(); - getBriDownMin(); - getBriDownMax(); - getDowColorFreq(); + // Globale Einstellungen + // |- Edge + getEdgeBrightness(); + getEdgeBrightnessMin(); + getEdgeBrightnessMax(); + getEdgeFrequency(); + // |- Downlights + getDownlightUsage(); + getDownlightBrightness(); + getDownlightBrightnessMin(); + getDownlightBrightnessMax(); + getDownlightFrequency(); + // KNX - getKNXAddr(); + getKNXAddress(); getKNXPort(); - getBriKNXPath(); - getBriKNXmin(); - getBriKNXmax(); - getTemKNXPath(); - getHumKNXPath(); + getKNXBrightnessPath(); + getKNXBrightnessMin(); + getKNXBrightnessMax(); + getKNXTemperaturePath(); + getKNXHumidityPath(); + // Clock - getClkAddr(); - getClkZone(); + getClkAddress(); + getClkTimeZone(); getClkFormat(); - getClkColorSet(); - getClkHColor(); - getClkMColor(); + getClkColor(); + getClkColorH(); + getClkColorM(); + // Date getDatFormat(); - getDatColorSet(); - getDatDColor(); - getDatMColor(); + getDatColor(); + getDatColorD(); + getDatColorM(); + // Temperature getTemSymbol(); + // Humidity - getHumColorSet(); - getHumAColor(); - getHumBColor(); - getHumCColor(); + getHumColor(); + getHumColorA(); + getHumColorB(); + getHumColorC(); + // Scoreboard - getScoHColor(); - getScoAColor(); + getScoColorL(); + getScoColorR(); + // Countdown - getCouHColor(); - getCouMColor(); - getCouSColor(); - getCouAColor(); + getCouColorH(); + getCouColorM(); + getCouColorS(); + getCouColorA(); + // Scroll getScrTime(); + // Downlights - getDowColorSet(); getDowColor(); getDowColor0(); getDowColor1(); @@ -899,157 +815,166 @@ function init() { // EVENT LISTENER - update // **************************************************************************************************** function startup() { - // GLOBAL - const gloBrightness = document.querySelector("#gloBrightness"); - gloBrightness.addEventListener("input", updGloBrightness, false); - const briClockMin = document.querySelector("#briClockMin"); - briClockMin.addEventListener("input", updBriClockMin, false); - const briClockMax = document.querySelector("#briClockMax"); - briClockMax.addEventListener("input", updBriClockMax, false); - const gloColorFreq = document.querySelector("#gloColorFreq"); - gloColorFreq.addEventListener("input", updGloColorFreq, false); - const dowUsage = document.querySelector("#dowUsage"); - dowUsage.addEventListener("input", updDowUsage, false); - const dowBrightness = document.querySelector("#dowBrightness"); - dowBrightness.addEventListener("input", updDowBrightness, false); - const briDownMin = document.querySelector("#briDownMin"); - briDownMin.addEventListener("input", updBriDownMin, false); - const briDownMax = document.querySelector("#briDownMax"); - briDownMax.addEventListener("input", updBriDownMax, false); - const dowColorFreq = document.querySelector("#dowColorFreq"); - dowColorFreq.addEventListener("input", updDowColorFreq, false); + // Globale Einstellungen + // |- Edge + const edgeBrightness = document.querySelector("#edgeBrightness"); + edgeBrightness.addEventListener("input", updateEdgeBrightness, false); + const edgeBrightnessMin = document.querySelector("#edgeBrightnessMin"); + edgeBrightnessMin.addEventListener("input", updateEdgeBrightnessMin, false); + const edgeBrightnessMax = document.querySelector("#edgeBrightnessMax"); + edgeBrightnessMax.addEventListener("input", updateEdgeBrightnessMax, false); + const edgeFrequency = document.querySelector("#edgeFrequency"); + edgeFrequency.addEventListener("input", updateEdgeFrequency, false); + // |- Downlights + const downlightUsage = document.querySelector("#downlightUsage"); + downlightUsage.addEventListener("input", updateDownlightUsage, false); + const downlightBrightness = document.querySelector("#downlightBrightness"); + downlightBrightness.addEventListener("input", updateDownlightBrightness, false); + const downlightBrightnessMin = document.querySelector("#downlightBrightnessMin"); + downlightBrightnessMin.addEventListener("input", updateDownlightBrightnessMin, false); + const downlightBrightnessMax = document.querySelector("#downlightBrightnessMax"); + downlightBrightnessMax.addEventListener("input", updateDownlightBrightnessMax, false); + const downlightFrequency = document.querySelector("#downlightFrequency"); + downlightFrequency.addEventListener("input", updateDownlightFrequency, false); + // KNX - const knxAddr = document.querySelector("#knxAddr"); - knxAddr.addEventListener("input", updKNXAddr, false); + const knxAddress = document.querySelector("#knxAddress"); + knxAddress.addEventListener("input", updateKNXAddress, false); const knxPort = document.querySelector("#knxPort"); - knxPort.addEventListener("input", updKNXPort, false); - const briKNXPath = document.querySelector("#briKNXPath"); - briKNXPath.addEventListener("input", updBriKNXPath, false); - const briKNXmin = document.querySelector("#briKNXmin"); - briKNXmin.addEventListener("input", updBriKNXmin, false); - const briKNXmax = document.querySelector("#briKNXmax"); - briKNXmax.addEventListener("input", updBriKNXmax, false); - const temKNXPath = document.querySelector("#temKNXPath"); - temKNXPath.addEventListener("input", updTemKNXPath, false); - const humKNXPath = document.querySelector("#humKNXPath"); - humKNXPath.addEventListener("input", updHumKNXPath, false); - // CLOCK - const clkAddr = document.querySelector("#clkAddr"); - clkAddr.addEventListener("input", updClkAddr, false); - const clkZone = document.querySelector("#clkZone"); - clkZone.addEventListener("input", updClkZone, false); + knxPort.addEventListener("input", updateKNXPort, false); + const knxBrightnessPath = document.querySelector("#knxBrightnessPath"); + knxBrightnessPath.addEventListener("input", updateKNXBrightnessPath, false); + const knxBrightnessMin = document.querySelector("#knxBrightnessMin"); + knxBrightnessMin.addEventListener("input", updateKNXBrightnessMin, false); + const knxBrightnessMax = document.querySelector("#knxBrightnessMax"); + knxBrightnessMax.addEventListener("input", updateKNXBrightnessMax, false); + const knxTemperaturePath = document.querySelector("#knxTemperaturePath"); + knxTemperaturePath.addEventListener("input", updateKNXTemperaturePath, false); + const knxHumidityPath = document.querySelector("#knxHumidityPath"); + knxHumidityPath.addEventListener("input", updateKNXHumidityPath, false); + + // Clock + const clkAddress = document.querySelector("#clkAddress"); + clkAddress.addEventListener("input", updateClkAddress, false); + const clkTimeZone = document.querySelector("#clkTimeZone"); + clkTimeZone.addEventListener("input", updateClkTimeZone, false); const clkFormat = document.querySelector("#clkFormat"); - clkFormat.addEventListener("input", updClkFormat, false); - const clkColorSet = document.querySelector("#clkColorSet"); - clkColorSet.addEventListener("input", updClkColorSet, false); - const clkHColor = document.querySelector("#clkHColor"); - clkHColor.addEventListener("input", updClkHColor, false); - clkHColor.addEventListener("change", updClkHColor, false); - const clkMColor = document.querySelector("#clkMColor"); - clkMColor.addEventListener("input", updClkMColor, false); - clkMColor.addEventListener("change", updClkMColor, false); + clkFormat.addEventListener("input", updateClkFormat, false); + const clkColor = document.querySelector("#clkColor"); + clkColor.addEventListener("input", updateClkColor, false); + const clkColorH = document.querySelector("#clkColorH"); + clkColorH.addEventListener("input", updateClkColorH, false); + clkColorH.addEventListener("change", updateClkColorH, false); + const clkColorM = document.querySelector("#clkColorM"); + clkColorM.addEventListener("input", updateClkColorM, false); + clkColorM.addEventListener("change", updateClkColorM, false); + // Date const datFormat = document.querySelector("#datFormat"); - datFormat.addEventListener("input", updDatFormat, false); - const datColorSet = document.querySelector("#datColorSet"); - datColorSet.addEventListener("input", updDatColorSet, false); - const datDColor = document.querySelector("#datDColor"); - datDColor.addEventListener("input", updDatDColor, false); - datDColor.addEventListener("change", updDatDColor, false); - const datMColor = document.querySelector("#datMColor"); - datMColor.addEventListener("input", updDatMColor, false); - datMColor.addEventListener("change", updDatMColor, false); + datFormat.addEventListener("input", updateDatFormat, false); + const datColor = document.querySelector("#datColor"); + datColor.addEventListener("input", updateDatColor, false); + const datColorD = document.querySelector("#datColorD"); + datColorD.addEventListener("input", updateDatColorD, false); + datColorD.addEventListener("change", updateDatColorD, false); + const datColorM = document.querySelector("#datColorM"); + datColorM.addEventListener("input", updateDatColorM, false); + datColorM.addEventListener("change", updateDatColorM, false); + // Temperature const temSymbol = document.querySelector("#temSymbol"); - temSymbol.addEventListener("input", updTemSymbol, false); + temSymbol.addEventListener("input", updateTemSymbol, false); + // Humidity - const humColorSet = document.querySelector("#humColorSet"); - humColorSet.addEventListener("input", updHumColorSet, false); - const humAColor = document.querySelector("#humAColor"); - humAColor.addEventListener("input", updHumAColor, false); - humAColor.addEventListener("change", updHumAColor, false); - const humBColor = document.querySelector("#humBColor"); - humBColor.addEventListener("input", updHumBColor, false); - humBColor.addEventListener("change", updHumBColor, false); - const humCColor = document.querySelector("#humCColor"); - humCColor.addEventListener("input", updHumCColor, false); - humCColor.addEventListener("change", updHumCColor, false); + const humColor = document.querySelector("#humColor"); + humColor.addEventListener("input", updateHumColor, false); + const humColorA = document.querySelector("#humColorA"); + humColorA.addEventListener("input", updateHumColorA, false); + humColorA.addEventListener("change", updateHumColorA, false); + const humColorB = document.querySelector("#humColorB"); + humColorB.addEventListener("input", updateHumColorB, false); + humColorB.addEventListener("change", updateHumColorB, false); + const humColorC = document.querySelector("#humColorC"); + humColorC.addEventListener("input", updateHumColorC, false); + humColorC.addEventListener("change", updateHumColorC, false); + // Scoreboard - const scoHColor = document.querySelector("#scoHColor"); - scoHColor.addEventListener("input", updScoHColor, false); - scoHColor.addEventListener("change", updScoHColor, false); - const scoAColor = document.querySelector("#scoAColor"); - scoAColor.addEventListener("input", updScoAColor, false); - scoAColor.addEventListener("change", updScoAColor, false); + const scoColorL = document.querySelector("#scoColorL"); + scoColorL.addEventListener("input", updateScoColorL, false); + scoColorL.addEventListener("change", updateScoColorL, false); + const scoColorR = document.querySelector("#scoColorR"); + scoColorR.addEventListener("input", updateScoColorR, false); + scoColorR.addEventListener("change", updateScoColorR, false); + // Countdown - const couHColor = document.querySelector("#couHColor"); - couHColor.addEventListener("input", updCouHColor, false); - couHColor.addEventListener("change", updCouHColor, false); - const couMColor = document.querySelector("#couMColor"); - couMColor.addEventListener("input", updCouMColor, false); - couMColor.addEventListener("change", updCouMColor, false); - const couSColor = document.querySelector("#couSColor"); - couSColor.addEventListener("input", updCouSColor, false); - couSColor.addEventListener("change", updCouSColor, false); - const couAColor = document.querySelector("#couAColor"); - couAColor.addEventListener("input", updCouAColor, false); - couAColor.addEventListener("change", updCouAColor, false); + const couColorH = document.querySelector("#couColorH"); + couColorH.addEventListener("input", updateCouColorH, false); + couColorH.addEventListener("change", updateCouColorH, false); + const couColorM = document.querySelector("#couColorM"); + couColorM.addEventListener("input", updateCouColorM, false); + couColorM.addEventListener("change", updateCouColorM, false); + const couColorS = document.querySelector("#couColorS"); + couColorS.addEventListener("input", updateCouColorS, false); + couColorS.addEventListener("change", updateCouColorS, false); + const couColorA = document.querySelector("#couColorA"); + couColorA.addEventListener("input", updateCouColorA, false); + couColorA.addEventListener("change", updateCouColorA, false); + // Scroll const scrTime = document.querySelector("#scrTime"); - scrTime.addEventListener("input", updScrTime, false); + scrTime.addEventListener("input", updateScrTime, false); + // Downlights - const dowColorSet = document.querySelector("#dowColorSet"); - dowColorSet.addEventListener("input", updDowColorSet, false); const dowColor = document.querySelector("#dowColor"); - dowColor.addEventListener("input", updDowColor, false); - dowColor.addEventListener("change", updDowColor, false); + dowColor.addEventListener("input", updateDowColor, false); const dowColor0 = document.querySelector("#dowColor0"); - dowColor0.addEventListener("input", updDowColor0, false); - dowColor0.addEventListener("change", updDowColor0, false); + dowColor0.addEventListener("input", updateDowColor0, false); + dowColor0.addEventListener("change", updateDowColor0, false); const dowColor1 = document.querySelector("#dowColor1"); - dowColor1.addEventListener("input", updDowColor1, false); - dowColor1.addEventListener("change", updDowColor1, false); + dowColor1.addEventListener("input", updateDowColor1, false); + dowColor1.addEventListener("change", updateDowColor1, false); const dowColor2 = document.querySelector("#dowColor2"); - dowColor2.addEventListener("input", updDowColor2, false); - dowColor2.addEventListener("change", updDowColor2, false); + dowColor2.addEventListener("input", updateDowColor2, false); + dowColor2.addEventListener("change", updateDowColor2, false); const dowColor3 = document.querySelector("#dowColor3"); - dowColor3.addEventListener("input", updDowColor3, false); - dowColor3.addEventListener("change", updDowColor3, false); + dowColor3.addEventListener("input", updateDowColor3, false); + dowColor3.addEventListener("change", updateDowColor3, false); const dowColor4 = document.querySelector("#dowColor4"); - dowColor4.addEventListener("input", updDowColor4, false); - dowColor4.addEventListener("change", updDowColor4, false); + dowColor4.addEventListener("input", updateDowColor4, false); + dowColor4.addEventListener("change", updateDowColor4, false); const dowColor5 = document.querySelector("#dowColor5"); - dowColor5.addEventListener("input", updDowColor5, false); - dowColor5.addEventListener("change", updDowColor5, false); + dowColor5.addEventListener("input", updateDowColor5, false); + dowColor5.addEventListener("change", updateDowColor5, false); const dowColor6 = document.querySelector("#dowColor6"); - dowColor6.addEventListener("input", updDowColor6, false); - dowColor6.addEventListener("change", updDowColor6, false); + dowColor6.addEventListener("input", updateDowColor6, false); + dowColor6.addEventListener("change", updateDowColor6, false); const dowColor7 = document.querySelector("#dowColor7"); - dowColor7.addEventListener("input", updDowColor7, false); - dowColor7.addEventListener("change", updDowColor7, false); + dowColor7.addEventListener("input", updateDowColor7, false); + dowColor7.addEventListener("change", updateDowColor7, false); const dowColor8 = document.querySelector("#dowColor8"); - dowColor8.addEventListener("input", updDowColor8, false); - dowColor8.addEventListener("change", updDowColor8, false); + dowColor8.addEventListener("input", updateDowColor8, false); + dowColor8.addEventListener("change", updateDowColor8, false); const dowColor9 = document.querySelector("#dowColor9"); - dowColor9.addEventListener("input", updDowColor9, false); - dowColor9.addEventListener("change", updDowColor9, false); + dowColor9.addEventListener("input", updateDowColor9, false); + dowColor9.addEventListener("change", updateDowColor9, false); const dowColor10 = document.querySelector("#dowColor10"); - dowColor10.addEventListener("input", updDowColor10, false); - dowColor10.addEventListener("change", updDowColor10, false); + dowColor10.addEventListener("input", updateDowColor10, false); + dowColor10.addEventListener("change", updateDowColor10, false); const dowColor11 = document.querySelector("#dowColor11"); - dowColor11.addEventListener("input", updDowColor11, false); - dowColor11.addEventListener("change", updDowColor11, false); + dowColor11.addEventListener("input", updateDowColor11, false); + dowColor11.addEventListener("change", updateDowColor11, false); const dowColor12 = document.querySelector("#dowColor12"); - dowColor12.addEventListener("input", updDowColor12, false); - dowColor12.addEventListener("change", updDowColor12, false); + dowColor12.addEventListener("input", updateDowColor12, false); + dowColor12.addEventListener("change", updateDowColor12, false); const dowColor13 = document.querySelector("#dowColor13"); - dowColor13.addEventListener("input", updDowColor13, false); - dowColor13.addEventListener("change", updDowColor13, false); + dowColor13.addEventListener("input", updateDowColor13, false); + dowColor13.addEventListener("change", updateDowColor13, false); } // **************************************************************************************************** -// FUNCTIONS - upd +// FUNCTIONS - update // **************************************************************************************************** +// Convert HEX color value to RGB color value function hexToRgb(hex) { const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; hex = hex.replace(shorthandRegex, function (m, r, g, b) { @@ -1065,403 +990,344 @@ function hexToRgb(hex) { : null; } -// Global -function updGloBrightness(event) { +// Globale Einstellungen +// |- Edge +function updateEdgeBrightness(event) { const value = event.target.value; - $.post("/updGloBrightness", { gloBrightness: value }); + $.post("/updateEdgeBrightness", { edgeBrightness: value }); console.log(value); } - -function updBriClockMin(event) { +function updateEdgeBrightnessMin(event) { const value = event.target.value; - $.post("/updBriClockMin", { briClockMin: value }); + $.post("/updateEdgeBrightnessMin", { edgeBrightnessMin: value }); console.log(value); } - -function updBriClockMax(event) { +function updateEdgeBrightnessMax(event) { const value = event.target.value; - $.post("/updBriClockMax", { briClockMax: value }); + $.post("/updateEdgeBrightnessMax", { edgeBrightnessMax: value }); console.log(value); } - -function updGloColorFreq(event) { +function updateEdgeFrequency(event) { const value = event.target.value; - $.post("/updGloColorFreq", { gloColorFreq: value }); + $.post("/updateEdgeFrequency", { edgeFrequency: value }); console.log(value); } - -function updDowUsage(event) { +// |- Downlights +function updateDownlightUsage(event) { const value = event.target.value; - $.post("/updDowUsage", { dowUsage: value }); + $.post("/updateDownlightUsage", { downUsage: value }); console.log(value); } - -function updDowBrightness(event) { +function updateDownlightBrightness(event) { const value = event.target.value; - $.post("/updDowBrightness", { dowBrightness: value }); + $.post("/updateDownlightBrightness", { downBrightness: value }); console.log(value); } - -function updBriDownMin(event) { +function updateDownlightBrightnessMin(event) { const value = event.target.value; - $.post("/updBriDownMin", { briDownMin: value }); + $.post("/updateDownlightBrightnessMin", { downBrightnessMin: value }); console.log(value); } - -function updBriDownMax(event) { +function updateDownlightBrightnessMax(event) { const value = event.target.value; - $.post("/updBriDownMax", { briDownMax: value }); + $.post("/updateDownlightBrightnessMax", { downBrightnessMax: value }); console.log(value); } - -function updDowColorFreq(event) { +function updateDownlightFrequency(event) { const value = event.target.value; - $.post("/updDowColorFreq", { dowColorFreq: value }); + $.post("/updateDownlightFrequency", { downFrequency: value }); console.log(value); } // KNX -function updKNXAddr(event) { +function updateKNXAddress(event) { const value = event.target.value; - $.post("/updKNXAddr", { knxAddr: value }); + $.post("/updateKNXAddress", { knxAddress: value }); console.log(value); } - -function updKNXPort(event) { +function updateKNXPort(event) { const value = event.target.value; - $.post("/updKNXPort", { knxPort: value }); + $.post("/updateKNXPort", { knxPort: value }); console.log(value); } - -function updBriKNXPath(event) { +function updateKNXBrightnessPath(event) { const value = event.target.value; - $.post("/updBriKNXPath", { briKNXPath: value }); + $.post("/updateKNXBrightnessPath", { knxBrightnessPath: value }); console.log(value); } - -function updBriKNXmin(event) { +function updateKNXBrightnessMin(event) { const value = event.target.value; - $.post("/updBriKNXmin", { briKNXmin: value }); + $.post("/updateKNXBrightnessMin", { knxBrightnessMin: value }); console.log(value); } - -function updBriKNXmax(event) { +function updateKNXBrightnessMax(event) { const value = event.target.value; - $.post("/updBriKNXmax", { briKNXmax: value }); + $.post("/updateKNXBrightnessMax", { knxBrightnessMax: value }); console.log(value); } - -function updTemKNXPath(event) { +function updateKNXTemperaturePath(event) { const value = event.target.value; - $.post("/updTemKNXPath", { temKNXPath: value }); + $.post("/updateKNXTemperaturePath", { knxTemperaturePath: value }); console.log(value); } - -function updHumKNXPath(event) { +function updateKNXHumidityPath(event) { const value = event.target.value; - $.post("/updHumKNXPath", { humKNXPath: value }); + $.post("/updateKNXHumidityPath", { knxHumidityPath: value }); console.log(value); } // Clock -function updClkAddr(event) { +function updateClkAddress(event) { const value = event.target.value; - $.post("/updClkAddr", { clkAddr: value }); + $.post("/updateClkAddress", { clkAddress: value }); console.log(value); } - -function updClkZone(event) { +function updateClkTimeZone(event) { const value = event.target.value; - $.post("/updClkZone", { clkZone: value }); + $.post("/updateClkTimeZone", { clkTimeZone: value }); console.log(value); } - -function updClkFormat(event) { +function updateClkFormat(event) { const value = event.target.value; - $.post("/updClkFormat", { clkFormat: value }); + $.post("/updateClkFormat", { clkFormat: value }); console.log(value); } - -function updClkColorSet(event) { +function updateClkColor(event) { const value = event.target.value; if (value === "0") { - document.getElementById("clkFields").hidden = false; + document.getElementById("clkColorInput").hidden = false; } if (value === "1") { - document.getElementById("clkFields").hidden = true; + document.getElementById("clkColorInput").hidden = true; } - $.post("/updClkColorSet", { clkColorSet: value }); + $.post("/updateClkColor", { clkColor: value }); console.log(value); } - -function updClkHColor(event) { +function updateClkColorH(event) { const value = event.target.value; - $.post("/updClkHColor", hexToRgb(value)); - closest("#clkHColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateClkColorH", hexToRgb(value)); + closest("#clkColorH", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updClkMColor(event) { +function updateClkColorM(event) { const value = event.target.value; - $.post("/updClkMColor", hexToRgb(value)); - closest("#clkMColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateClkColorM", hexToRgb(value)); + closest("#clkColorM", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } // Date -function updDatFormat(event) { +function updateDatFormat(event) { const value = event.target.value; - $.post("/updDatFormat", { datFormat: value }); + $.post("/updateDatFormat", { datFormat: value }); console.log(value); } - -function updDatColorSet(event) { +function updateDatColor(event) { const value = event.target.value; if (value === "0") { - document.getElementById("datFields").hidden = false; + document.getElementById("datColorInput").hidden = false; } if (value === "1") { - document.getElementById("datFields").hidden = true; + document.getElementById("datColorInput").hidden = true; } - $.post("/updDatColorSet", { datColorSet: value }); + $.post("/updateDatColor", { datColor: value }); console.log(value); } - -function updDatDColor(event) { +function updateDatColorD(event) { const value = event.target.value; - $.post("/updDatDColor", hexToRgb(value)); - closest("#datDColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateDatColorD", hexToRgb(value)); + closest("#datColorD", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDatMColor(event) { +function updateDatColorM(event) { const value = event.target.value; - $.post("/updDatMColor", hexToRgb(value)); - closest("#datMColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateDatColorM", hexToRgb(value)); + closest("#datColorM", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } // Temperature -function updTemSymbol(event) { +function updateTemSymbol(event) { const value = event.target.value; - $.post("/updTemSymbol", { temSymbol: value }); + $.post("/updateTemSymbol", { temSymbol: value }); console.log(value); } // Humidity -function updHumColorSet(event) { +function updateHumColor(event) { const value = event.target.value; if (value === "0") { - document.getElementById("humFields").hidden = false; + document.getElementById("humColorInput").hidden = false; } if (value === "1") { - document.getElementById("humFields").hidden = true; + document.getElementById("humColorInput").hidden = true; } - $.post("/updHumColorSet", { humColorSet: value }); + $.post("/updateHumColor", { humColor: value }); console.log(value); } - -function updHumAColor(event) { +function updateHumColorA(event) { const value = event.target.value; - $.post("/updHumAColor", hexToRgb(value)); - closest("#humAColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateHumColorA", hexToRgb(value)); + closest("#humColorA", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updHumBColor(event) { +function updateHumColorB(event) { const value = event.target.value; - $.post("/updHumBColor", hexToRgb(value)); - closest("#humBColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateHumColorB", hexToRgb(value)); + closest("#humColorB", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updHumCColor(event) { +function updateHumColorC(event) { const value = event.target.value; - $.post("/updHumCColor", hexToRgb(value)); - closest("#humCColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateHumColorC", hexToRgb(value)); + closest("#humColorC", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } // Scoreboard -function updScoHColor(event) { +function updateScoColorL(event) { const value = event.target.value; - $.post("/updScoHColor", hexToRgb(value)); - closest("#scoHColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateScoColorL", hexToRgb(value)); + closest("#scoColorL", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updScoAColor(event) { +function updateScoColorR(event) { const value = event.target.value; - $.post("/updScoAColor", hexToRgb(value)); - closest("#scoAColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateScoColorR", hexToRgb(value)); + closest("#scoColorR", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } // Countdown -function updCouHColor(event) { +function updateCouColorH(event) { const value = event.target.value; - $.post("/updCouHColor", hexToRgb(value)); - closest("#couHColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateCouColorH", hexToRgb(value)); + closest("#couColorH", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updCouMColor(event) { +function updateCouColorM(event) { const value = event.target.value; - $.post("/updCouMColor", hexToRgb(value)); - closest("#couMColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateCouColorM", hexToRgb(value)); + closest("#couColorM", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updCouSColor(event) { +function updateCouColorS(event) { const value = event.target.value; - $.post("/updCouSColor", hexToRgb(value)); - closest("#couSColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateCouColorS", hexToRgb(value)); + closest("#couColorS", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updCouAColor(event) { +function updateCouColorA(event) { const value = event.target.value; - $.post("/updCouAColor", hexToRgb(value)); - closest("#couAColor", ".input-group-text").style.backgroundColor = value; + $.post("/updateCouColorH", hexToRgb(value)); + closest("#couColorA", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } // Scroll -function updScrTime(event) { +function updateScrTime(event) { const value = event.target.value; - $.post("/updScrTime", { scrTime: value }); + $.post("/updateScrTime", { scrTime: value }); console.log(value); } // Downlights -function updDowColorSet(event) { +function updateDowColor(event) { const value = event.target.value; if (value === "0") { - document.getElementById("dowFields0").hidden = false; - document.getElementById("dowFields1upper").hidden = true; - document.getElementById("dowFields1lower").hidden = true; + document.getElementById("dowColorInput").hidden = false; } if (value === "1") { - document.getElementById("dowFields0").hidden = true; - document.getElementById("dowFields1upper").hidden = false; - document.getElementById("dowFields1lower").hidden = false; + document.getElementById("dowColorInput").hidden = true; } if (value === "2") { - document.getElementById("dowFields0").hidden = true; - document.getElementById("dowFields1upper").hidden = true; - document.getElementById("dowFields1lower").hidden = true; + document.getElementById("dowColorInput").hidden = true; } - if (value === "3") { - document.getElementById("dowFields0").hidden = true; - document.getElementById("dowFields1upper").hidden = true; - document.getElementById("dowFields1lower").hidden = true; - } - $.post("/updDowColorSet", { dowColorSet: value }); + $.post("/updateDowColor", { dowColor: value }); console.log(value); } - -function updDowColor(event) { +function updateDowColor0(event) { const value = event.target.value; - $.post("/updDowColor", hexToRgb(value)); - closest("#dowColor", ".input-group-text").style.backgroundColor = value; - console.log(hexToRgb(value)); -} - -function updDowColor0(event) { - const value = event.target.value; - $.post("/updDowColor0", hexToRgb(value)); + $.post("/updateDowColor0", hexToRgb(value)); closest("#dowColor0", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor1(event) { +function updateDowColor1(event) { const value = event.target.value; - $.post("/updDowColor1", hexToRgb(value)); + $.post("/updateDowColor1", hexToRgb(value)); closest("#dowColor1", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor2(event) { +function updateDowColor2(event) { const value = event.target.value; - $.post("/updDowColor2", hexToRgb(value)); + $.post("/updateDowColor2", hexToRgb(value)); closest("#dowColor2", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor3(event) { +function updateDowColor3(event) { const value = event.target.value; - $.post("/updDowColor3", hexToRgb(value)); + $.post("/updateDowColor3", hexToRgb(value)); closest("#dowColor3", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor4(event) { +function updateDowColor4(event) { const value = event.target.value; - $.post("/updDowColor4", hexToRgb(value)); + $.post("/updateDowColor4", hexToRgb(value)); closest("#dowColor4", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor5(event) { +function updateDowColor5(event) { const value = event.target.value; - $.post("/updDowColor5", hexToRgb(value)); + $.post("/updateDowColor5", hexToRgb(value)); closest("#dowColor5", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor6(event) { +function updateDowColor6(event) { const value = event.target.value; - $.post("/updDowColor6", hexToRgb(value)); + $.post("/updateDowColor6", hexToRgb(value)); closest("#dowColor6", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor7(event) { +function updateDowColor7(event) { const value = event.target.value; - $.post("/updDowColor7", hexToRgb(value)); + $.post("/updateDowColor7", hexToRgb(value)); closest("#dowColor7", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor8(event) { +function updateDowColor8(event) { const value = event.target.value; - $.post("/updDowColor8", hexToRgb(value)); + $.post("/updateDowColor8", hexToRgb(value)); closest("#dowColor8", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor9(event) { +function updateDowColor9(event) { const value = event.target.value; - $.post("/updDowColor9", hexToRgb(value)); + $.post("/updateDowColor9", hexToRgb(value)); closest("#dowColor9", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor10(event) { +function updateDowColor10(event) { const value = event.target.value; - $.post("/updDowColor10", hexToRgb(value)); + $.post("/updateDowColor10", hexToRgb(value)); closest("#dowColor10", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor11(event) { +function updateDowColor11(event) { const value = event.target.value; - $.post("/updDowColor11", hexToRgb(value)); + $.post("/updateDowColor11", hexToRgb(value)); closest("#dowColor11", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor12(event) { +function updateDowColor12(event) { const value = event.target.value; - $.post("/updDowColor12", hexToRgb(value)); + $.post("/updateDowColor12", hexToRgb(value)); closest("#dowColor12", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } - -function updDowColor13(event) { +function updateDowColor13(event) { const value = event.target.value; - $.post("/updDowColor13", hexToRgb(value)); + $.post("/updateDowColor13", hexToRgb(value)); closest("#dowColor13", ".input-group-text").style.backgroundColor = value; console.log(hexToRgb(value)); } diff --git a/data/js/wifi.js b/data/js/wifi.js index f0178c7..087c414 100644 --- a/data/js/wifi.js +++ b/data/js/wifi.js @@ -1,9 +1,10 @@ -// Variables - -// NETZWERK -// |- ACCESS POINT +// **************************************************************************************************** +// VARIABLES +// **************************************************************************************************** +// access point let apConfigValue; let apSSIDValue; +let apSSIDError; let apPassValue; let apPassError; let apHideValue; @@ -23,7 +24,7 @@ let apSN1Value; let apSN2Value; let apSN3Value; let apSN4Value; -// |- WIFI CLIENT +// wifi client let wifiConfigValue; let wifiSSIDValue; let wifiPassValue; @@ -44,8 +45,7 @@ let wifiSN4Value; // **************************************************************************************************** // FUNCTIONS - get // **************************************************************************************************** -// NETWORK -// |- ACCESS POINT +// access point function getAPConfig() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -53,12 +53,12 @@ function getAPConfig() { if (this.responseText === "0") { document.getElementById("apConfig").checked = false; apConfigValue = false; - unLockAPFields(); + unlockAPfields(); } if (this.responseText === "1") { document.getElementById("apConfig").checked = true; apConfigValue = true; - unLockAPFields(); + unlockAPfields(); } } }; @@ -81,7 +81,7 @@ function getAPPass() { if (this.readyState === 4 && this.status === 200) { document.getElementById("apPass").value = this.responseText; apPassValue = apPass.value; - validatePass(); + validateAPpassword(); } }; xhttp.open("GET", "getAPPass", true); @@ -103,7 +103,7 @@ function getAPIP1() { if (this.readyState === 4 && this.status === 200) { document.getElementById("apIP1").value = this.responseText; apIP1Value = apIP1.valueAsNumber; - validateIP(); + validateAPip(); } }; xhttp.open("GET", "getAPIP1", true); @@ -115,7 +115,7 @@ function getAPIP2() { if (this.readyState === 4 && this.status === 200) { document.getElementById("apIP2").value = this.responseText; apIP2Value = apIP2.valueAsNumber; - validateIP(); + validateAPip(); } }; xhttp.open("GET", "getAPIP2", true); @@ -127,7 +127,7 @@ function getAPIP3() { if (this.readyState === 4 && this.status === 200) { document.getElementById("apIP3").value = this.responseText; apIP3Value = apIP3.valueAsNumber; - validateIP(); + validateAPip(); } }; xhttp.open("GET", "getAPIP3", true); @@ -139,7 +139,7 @@ function getAPIP4() { if (this.readyState === 4 && this.status === 200) { document.getElementById("apIP4").value = this.responseText; apIP4Value = apIP4.valueAsNumber; - validateIP(); + validateAPip(); } }; xhttp.open("GET", "getAPIP4", true); @@ -233,7 +233,7 @@ function getAPSN4() { xhttp.open("GET", "getAPSN4", true); xhttp.send(); } -// |- WIFI CLIENT +// wifi client function getWifiConfig() { const xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function () { @@ -241,12 +241,12 @@ function getWifiConfig() { if (this.responseText === "0") { document.getElementById("wifiConfig").checked = false; wifiConfigValue = false; - unLockWifiFields(); + unlockWIFIinput(); } if (this.responseText === "1") { document.getElementById("wifiConfig").checked = true; wifiConfigValue = true; - unLockWifiFields(); + unlockWIFIinput(); } } }; @@ -279,7 +279,7 @@ function getWifiDHCP() { if (this.readyState === 4 && this.status === 200) { document.getElementById("wifiDHCP").value = this.responseText; wifiDHCPValue = this.responseText; - unlockDHCPFields(); + unlockDHCPinput(); } }; xhttp.open("GET", "getWifiDHCP", true); @@ -419,11 +419,10 @@ function getWifiSN4() { } // **************************************************************************************************** -// EVENT LISTENER - get +// LOAD VALUES - get // **************************************************************************************************** function init() { - // NETZWERK - // |- ACCESS POINT + // access point getAPConfig(); getAPSSID(); getAPPass(); @@ -440,7 +439,7 @@ function init() { getAPSN2(); getAPSN3(); getAPSN4(); - // |- WIFI CLIENT + // wifi client getWifiConfig(); getWifiSSID(); getWifiPass(); @@ -460,331 +459,287 @@ function init() { } // **************************************************************************************************** -// EVENT LISTENER - upd +// EVENT LISTENER - update // **************************************************************************************************** function startup() { - // NETZWERK - // |- ACCESS POINT + // access point const apConfig = document.querySelector("#apConfig"); - apConfig.addEventListener("input", updAPConfig, false); + apConfig.addEventListener("input", updateAPConfig, false); const apSSID = document.querySelector("#apSSID"); - apSSID.addEventListener("input", updAPSSID, false); + apSSID.addEventListener("input", updateAPSSID, false); const apPass = document.querySelector("#apPass"); - apPass.addEventListener("input", updAPPass, false); + apPass.addEventListener("input", updateAPPass, false); const apHide = document.querySelector("#apHide"); - apHide.addEventListener("input", updAPHide, false); + apHide.addEventListener("input", updateAPHide, false); const apIP1 = document.querySelector("#apIP1"); - apIP1.addEventListener("input", updAPIP1, false); + apIP1.addEventListener("input", updateAPIP1, false); const apIP2 = document.querySelector("#apIP2"); - apIP2.addEventListener("input", updAPIP2, false); + apIP2.addEventListener("input", updateAPIP2, false); const apIP3 = document.querySelector("#apIP3"); - apIP3.addEventListener("input", updAPIP3, false); + apIP3.addEventListener("input", updateAPIP3, false); const apIP4 = document.querySelector("#apIP4"); - apIP4.addEventListener("input", updAPIP4, false); + apIP4.addEventListener("input", updateAPIP4, false); const apGW1 = document.querySelector("#apGW1"); - apGW1.addEventListener("input", updAPGW1, false); + apGW1.addEventListener("input", updateAPGW1, false); const apGW2 = document.querySelector("#apGW2"); - apGW2.addEventListener("input", updAPGW2, false); + apGW2.addEventListener("input", updateAPGW2, false); const apGW3 = document.querySelector("#apGW3"); - apGW3.addEventListener("input", updAPGW3, false); + apGW3.addEventListener("input", updateAPGW3, false); const apGW4 = document.querySelector("#apGW4"); - apGW4.addEventListener("input", updAPGW4, false); - const apSN1 = document.querySelector("#apSN1"); - apSN1.addEventListener("input", updAPSN1, false); - const apSN2 = document.querySelector("#apSN2"); - apSN2.addEventListener("input", updAPSN2, false); - const apSN3 = document.querySelector("#apSN3"); - apSN3.addEventListener("input", updAPSN3, false); - const apSN4 = document.querySelector("#apSN4"); - apSN4.addEventListener("input", updAPSN4, false); - const apButton = document.querySelector("#apButton"); - apButton.addEventListener("click", apRestart, false); - // |- WIFI CLIENT + apGW4.addEventListener("input", updateAPGW4, false); + const apRestart = document.querySelector("#apRestart"); + apRestart.addEventListener("click", updateAPrestart, false); + // wifi client const wifiConfig = document.querySelector("#wifiConfig"); - wifiConfig.addEventListener("input", updWifiConfig, false); + wifiConfig.addEventListener("input", updateWifiConfig, false); const wifiSSID = document.querySelector("#wifiSSID"); - wifiSSID.addEventListener("input", updWifiSSID, false); + wifiSSID.addEventListener("input", updateWifiSSID, false); const wifiPass = document.querySelector("#wifiPass"); - wifiPass.addEventListener("input", updWifiPass, false); + wifiPass.addEventListener("input", updateWifiPass, false); const wifiDHCP = document.querySelector("#wifiDHCP"); - wifiDHCP.addEventListener("input", updWifiDHCP, false); + wifiDHCP.addEventListener("input", updateWifiDHCP, false); const wifiIP1 = document.querySelector("#wifiIP1"); - wifiIP1.addEventListener("input", updWifiIP1, false); + wifiIP1.addEventListener("input", updateWifiIP1, false); const wifiIP2 = document.querySelector("#wifiIP2"); - wifiIP2.addEventListener("input", updWifiIP2, false); + wifiIP2.addEventListener("input", updateWifiIP2, false); const wifiIP3 = document.querySelector("#wifiIP3"); - wifiIP3.addEventListener("input", updWifiIP3, false); + wifiIP3.addEventListener("input", updateWifiIP3, false); const wifiIP4 = document.querySelector("#wifiIP4"); - wifiIP4.addEventListener("input", updWifiIP4, false); + wifiIP4.addEventListener("input", updateWifiIP4, false); const wifiGW1 = document.querySelector("#wifiGW1"); - wifiGW1.addEventListener("input", updWifiGW1, false); + wifiGW1.addEventListener("input", updateWifiGW1, false); const wifiGW2 = document.querySelector("#wifiGW2"); - wifiGW2.addEventListener("input", updWifiGW2, false); + wifiGW2.addEventListener("input", updateWifiGW2, false); const wifiGW3 = document.querySelector("#wifiGW3"); - wifiGW3.addEventListener("input", updWifiGW3, false); + wifiGW3.addEventListener("input", updateWifiGW3, false); const wifiGW4 = document.querySelector("#wifiGW4"); - wifiGW4.addEventListener("input", updWifiGW4, false); - const wifiSN1 = document.querySelector("#wifiSN1"); - wifiSN1.addEventListener("input", updWifiSN1, false); - const wifiSN2 = document.querySelector("#wifiSN2"); - wifiSN2.addEventListener("input", updWifiSN2, false); - const wifiSN3 = document.querySelector("#wifiSN3"); - wifiSN3.addEventListener("input", updWifiSN3, false); - const wifiSN4 = document.querySelector("#wifiSN4"); - wifiSN4.addEventListener("input", updWifiSN4, false); - const wifiButton = document.querySelector("#wifiButton"); - wifiButton.addEventListener("click", wifiRestart, false); + wifiGW4.addEventListener("input", updateWifiGW4, false); + const wifiRestart = document.querySelector("#wifiRestart"); + wifiRestart.addEventListener("click", updateWifiRestart, false); } // **************************************************************************************************** -// FUNCTIONS - upd +// FUNCTIONS - update // **************************************************************************************************** -// NETZWERK -// |- ACCESS POINT -function updAPConfig(event) { +// access point +function updateAPConfig(event) { apConfigValue = event.target.checked; - $.post("/updAPConfig", { + $.post("/updateAPConfig", { apConfig: apConfigValue, }); - unLockAPFields(); - validatePass(); - validateIP(); - unlockAPButton(); + console.log(apConfigValue); + unlockAPfields(); + validateAPpassword(); + validateAPip(); + unlockAPrestart(); } -function updAPSSID(event) { +function updateAPSSID(event) { apSSIDValue = event.target.value; - $.post("/updAPSSID", { + $.post("/updateAPSSID", { apSSID: apSSIDValue, }); - unlockAPButton(); - unlockAPButton(); + console.log(apSSIDValue); + validateAPssid(); + unlockAPrestart(); } -function updAPPass(event) { +function updateAPPass(event) { apPassValue = event.target.value; - $.post("/updAPPass", { + $.post("/updateAPPass", { apPass: apPassValue, }); - validatePass(); - unlockAPButton(); + console.log(apPassValue); + validateAPpassword(); + unlockAPrestart(); } -function updAPHide(event) { +function updateAPHide(event) { apHideValue = event.target.value; - $.post("/updAPHide", { + $.post("/updateAPHide", { apHide: apHideValue, }); - unlockAPButton(); + console.log(apHideValue); + unlockAPrestart(); } -function updAPIP1(event) { +function updateAPIP1(event) { apIP1Value = event.target.valueAsNumber; - $.post("/updAPIP1", { + $.post("/updateAPIP1", { apIP1: apIP1Value, }); apGW1.value = apIP1Value; apGW1Value = apIP1Value; - validateIP(); - unlockAPButton(); + console.log(apIP1Value); + validateAPip(); + unlockAPrestart(); } -function updAPIP2(event) { +function updateAPIP2(event) { apIP2Value = event.target.valueAsNumber; - $.post("/updAPIP2", { + $.post("/updateAPIP2", { apIP2: apIP2Value, }); apGW2.value = apIP2Value; apGW2Value = apIP2Value; - validateIP(); - unlockAPButton(); + console.log(apIP2Value); + validateAPip(); + unlockAPrestart(); } -function updAPIP3(event) { +function updateAPIP3(event) { apIP3Value = event.target.valueAsNumber; - $.post("/updAPIP3", { + $.post("/updateAPIP3", { apIP3: apIP3Value, }); apGW3.value = apIP3Value; apGW3Value = apIP3Value; - validateIP(); - unlockAPButton(); + console.log(apIP3Value); + validateAPip(); + unlockAPrestart(); } -function updAPIP4(event) { +function updateAPIP4(event) { apIP4Value = event.target.valueAsNumber; - $.post("/updAPIP4", { + $.post("/updateAPIP4", { apIP4: apIP4Value, }); - validateIP(); - unlockAPButton(); + console.log(apIP4Value); + validateAPip(); + unlockAPrestart(); } -function updAPGW1(event) { +function updateAPGW1(event) { apGW1Value = event.target.valueAsNumber; - $.post("/updAPGW1", { + $.post("/updateAPGW1", { apGW1: apGW1Value, }); - unlockAPButton(); + console.log(apGW1Value); + unlockAPrestart(); } -function updAPGW2(event) { +function updateAPGW2(event) { apGW2Value = event.target.valueAsNumber; - $.post("/updAPGW2", { + $.post("/updateAPGW2", { apGW2: apGW2Value, }); - unlockAPButton(); + console.log(apGW2Value); + unlockAPrestart(); } -function updAPGW3(event) { +function updateAPGW3(event) { apGW3Value = event.target.valueAsNumber; - $.post("/updAPGW3", { + $.post("/updateAPGW3", { apGW3: apGW3Value, }); - unlockAPButton(); + console.log(apGW3Value); + unlockAPrestart(); } -function updAPGW4(event) { +function updateAPGW4(event) { apGW4Value = event.target.valueAsNumber; - $.post("/updAPGW4", { + $.post("/updateAPGW4", { apGW4: apGW4Value, }); - unlockAPButton(); -} -function updAPSN1(event) { - apSN1Value = event.target.valueAsNumber; - $.post("/updAPSN1", { - apSN1: apSN1Value, - }); - unlockAPButton(); -} -function updAPSN2(event) { - apSN2Value = event.target.valueAsNumber; - $.post("/updAPSN2", { - apSN2: apSN2Value, - }); - unlockAPButton(); -} -function updAPSN3(event) { - apSN3Value = event.target.valueAsNumber; - $.post("/updAPSN3", { - apSN3: apSN3Value, - }); - unlockAPButton(); -} -function updAPSN4(event) { - apSN4Value = event.target.valueAsNumber; - $.post("/updAPSN4", { - apSN4: apSN4Value, - }); - unlockAPButton(); + console.log(apGW4Value); + unlockAPrestart(); } -// |- WIFI CLIENT -function updWifiConfig(event) { +// wifi client +function updateWifiConfig(event) { wifiConfigValue = event.target.checked; - $.post("/updWifiConfig", { - wifiConfig: wifiConfigValue, - }); - unLockWifiFields(); - unlockWifiButton(); + $.post("/updateWifiConfig", { wifiConfig: wifiConfigValue }); + console.log(wifiConfigValue); + unlockWIFIinput(); + unlockWifiRestart(); } -function updWifiSSID(event) { +function updateWifiSSID(event) { wifiSSIDValue = event.target.value; - $.post("/updWifiSSID", { - wifiSSID: wifiSSIDValue, - }); - unlockWifiButton(); + $.post("/updateWifiSSID", { wifiSSID: wifiSSIDValue }); + console.log(wifiSSIDValue); + unlockWifiRestart(); } -function updWifiPass(event) { +function updateWifiPass(event) { wifiPassValue = event.target.value; - $.post("/updWifiPass", { + $.post("/updateWifiPass", { wifiPass: wifiPassValue, }); - unlockWifiButton(); + console.log(wifiPassValue); + unlockWifiRestart(); } -function updWifiDHCP(event) { +function updateWifiDHCP(event) { wifiDHCPValue = event.target.value; - $.post("/updWifiDHCP", { + $.post("/updateWifiDHCP", { wifiDHCP: wifiDHCPValue, }); - unlockDHCPFields(); - unlockWifiButton(); + console.log(wifiDHCPValue); + unlockDHCPinput(); + unlockWifiRestart(); } -function updWifiIP1(event) { +function updateWifiIP1(event) { wifiIP1Value = event.target.valueAsNumber; - $.post("/updWifiIP1", { + $.post("/updateWifiIP1", { wifiIP1: wifiIP1Value, }); - unlockWifiButton(); + wifiGW1.value = wifiIP1Value; + wifiGW1Value = wifiIP1Value; + console.log(wifiIP1Value); + unlockWifiRestart(); } -function updWifiIP2(event) { +function updateWifiIP2(event) { wifiIP2Value = event.target.valueAsNumber; - $.post("/updWifiIP2", { + $.post("/updateWifiIP2", { wifiIP2: wifiIP2Value, }); - unlockWifiButton(); + wifiGW2.value = wifiIP2Value; + wifiGW2Value = wifiIP2Value; + console.log(wifiIP2Value); + unlockWifiRestart(); } -function updWifiIP3(event) { +function updateWifiIP3(event) { wifiIP3Value = event.target.valueAsNumber; - $.post("/updWifiIP3", { + $.post("/updateWifiIP3", { wifiIP3: wifiIP3Value, }); - unlockWifiButton(); + wifiGW3.value = wifiIP3Value; + wifiGW3Value = wifiIP3Value; + console.log(wifiIP3Value); + unlockWifiRestart(); } -function updWifiIP4(event) { +function updateWifiIP4(event) { wifiIP4Value = event.target.valueAsNumber; - $.post("/updWifiIP4", { + $.post("/updateWifiIP4", { wifiIP4: wifiIP4Value, }); - unlockWifiButton(); + console.log(wifiIP4Value); + unlockWifiRestart(); } -function updWifiGW1(event) { +function updateWifiGW1(event) { wifiGW1Value = event.target.valueAsNumber; - $.post("/updWifiGW1", { + $.post("/updateWifiGW1", { wifiGW1: wifiGW1Value, }); - unlockWifiButton(); + console.log(wifiGW1Value); + unlockWifiRestart(); } -function updWifiGW2(event) { +function updateWifiGW2(event) { wifiGW2Value = event.target.valueAsNumber; - $.post("/updWifiGW2", { + $.post("/updateWifiGW2", { wifiGW2: wifiGW2Value, }); - unlockWifiButton(); + console.log(wifiGW2Value); + unlockWifiRestart(); } -function updWifiGW3(event) { +function updateWifiGW3(event) { wifiGW3Value = event.target.valueAsNumber; - $.post("/updWifiGW3", { + $.post("/updateWifiGW3", { wifiGW3: wifiGW3Value, }); - unlockWifiButton(); + console.log(wifiGW3Value); + unlockWifiRestart(); } -function updWifiGW4(event) { +function updateWifiGW4(event) { wifiGW4Value = event.target.valueAsNumber; - $.post("/updWifiGW4", { + $.post("/updateWifiGW4", { wifiGW4: wifiGW4Value, }); - unlockWifiButton(); -} -function updWifiSN1(event) { - wifiSN1Value = event.target.valueAsNumber; - $.post("/updWifiSN1", { - wifiSN1: wifiSN1Value, - }); - unlockWifiButton(); + console.log(wifiGW4Value); + unlockWifiRestart(); } -function updWifiSN2(event) { - wifiSN2Value = event.target.valueAsNumber; - $.post("/updWifiSN2", { - wifiSN2: wifiSN2Value, - }); - unlockWifiButton(); -} -function updWifiSN3(event) { - wifiSN3Value = event.target.valueAsNumber; - $.post("/updWifiSN3", { - wifiSN3: wifiSN3Value, - }); - unlockWifiButton(); -} -function updWifiSN4(event) { - wifiSN4Value = event.target.valueAsNumber; - $.post("/updWifiSN4", { - wifiSN4: wifiSN4Value, - }); - unlockWifiButton(); -} -// |- LOCK/UNLOCK FIELDS -function unLockAPFields() { + +// **************************************************************************************************** +// FUNCTIONS - support +// **************************************************************************************************** +// lock/unlock fields +function unlockAPfields() { if (apConfigValue === true) { apSSID.disabled = false; apPass.disabled = false; @@ -820,7 +775,7 @@ function unLockAPFields() { apSN4.disabled = true; } } -function unLockWifiFields() { +function unlockWIFIinput() { if (wifiConfigValue === true) { wifiSSID.disabled = false; wifiPass.disabled = false; @@ -860,7 +815,7 @@ function unLockWifiFields() { wifiSN4.disabled = true; } } -function unlockDHCPFields() { +function unlockDHCPinput() { if (wifiDHCPValue === "0") { wifiIP1.disabled = true; wifiIP2.disabled = true; @@ -890,8 +845,22 @@ function unlockDHCPFields() { wifiSN4.disabled = false; } } -// |- VALIDATE FIELDS -function validatePass() { +// validate fields +function validateAPssid() { + if (apConfigValue === true) { + if (apSSIDValue.length <= 32) { + apSSID.classList.remove("is-invalid"); + apSSIDError = 0; + } else { + apSSID.classList.add("is.invalid"); + apSSIDError = 1; + } + } else { + apSSID.classList.remove("is-invalid"); + apSSIDError = 0; + } +} +function validateAPpassword() { if (apConfigValue === true) { if ( apPassValue.length >= 8 && @@ -912,7 +881,7 @@ function validatePass() { apPassError = 0; } } -function validateIP() { +function validateAPip() { if (apConfigValue === true) { if (apIP1Value !== "" && (apIP1Value === 10 || apIP1Value === 172 || apIP1Value === 192)) { apIP1.classList.remove("is-invalid"); @@ -958,36 +927,47 @@ function validateIP() { apIP4Error = 0; } } -// |- BUTTONS -function unlockAPButton() { - apButton.classList.remove("btn-outline-secondary"); - apButton.classList.add("btn-outline-danger"); - if (apPassError === 0 && apIP1Error === 0 && apIP2Error === 0 && apIP3Error === 0 && apIP4Error === 0) { - apButton.classList.remove("btn-outline-danger"); - apButton.classList.add("btn-danger"); - apButton.disabled = false; +// control buttons +function unlockAPrestart() { + apRestart.classList.remove("btn-outline-secondary"); + apRestart.classList.add("btn-outline-danger"); + if ( + apSSIDError === 0 && + apPassError === 0 && + apIP1Error === 0 && + apIP2Error === 0 && + apIP3Error === 0 && + apIP4Error === 0 + ) { + apRestart.classList.remove("btn-outline-danger"); + apRestart.classList.add("btn-danger"); + apRestart.disabled = false; } else { - apButton.classList.remove("btn-danger"); - apButton.classList.add("btn-outline-danger"); - apButton.disabled = true; + apRestart.classList.remove("btn-danger"); + apRestart.classList.add("btn-outline-danger"); + apRestart.disabled = true; } } -function apRestart() { - if (apPassError === 0 && apIP1Error === 0 && apIP2Error === 0 && apIP3Error === 0 && apIP4Error === 0) { - $.post("/apRestart"); +function updateAPrestart() { + if ( + apSSIDError === 0 && + apPassError === 0 && + apIP1Error === 0 && + apIP2Error === 0 && + apIP3Error === 0 && + apIP4Error === 0 + ) { + $.post("/updateAPrestart"); } } -function unlockWifiButton() { - wifiButton.classList.remove("btn-outline-secondary"); - wifiButton.classList.add("btn-danger"); - wifiButton.disabled = false; -} -function wifiRestart() { - $.post("/wifiRestart"); - resetWifiButton(); +function unlockWifiRestart() { + wifiRestart.classList.remove("btn-outline-secondary"); + wifiRestart.classList.add("btn-danger"); + wifiRestart.disabled = false; } -function resetWifiButton() { - wifiButton.classList.remove("btn-danger"); - wifiButton.classList.add("btn-outline-secondary"); - wifiButton.disabled = true; +function updateWifiRestart() { + $.post("/updateWifiRestart"); + wifiRestart.classList.remove("btn-danger"); + wifiRestart.classList.add("btn-outline-secondary"); + wifiRestart.disabled = true; } diff --git a/data/settings.html b/data/settings.html index b7308cd..02edfbe 100644 --- a/data/settings.html +++ b/data/settings.html @@ -38,7 +38,7 @@ - +
- + +

Einstellungen

- +

- - Edge - Farbwechsel
- - +
-
@@ -231,12 +239,12 @@

data-i18n-attr="value" type="number" class="form-control" - id="briDownMin" + id="downlightBrightnessMin" min="0" max="255" value="0" /> -

@@ -248,32 +256,38 @@

data-i18n-attr="value" type="number" class="form-control" - id="briDownMax" + id="downlightBrightnessMax" min="0" max="255" value="255" /> -

- -
+

@@ -303,10 +317,10 @@

data-i18n-attr="value" type="text" class="form-control" - id="knxAddr" + id="knxAddress" value="192.168.xxx.yyy" /> - +

data-i18n-attr="value" type="text" class="form-control" - id="briKNXPath" + id="knxBrightnessPath" value="/rest/items/{itemname}/state" /> -
@@ -340,11 +354,11 @@

data-i18n-attr="value" type="number" class="form-control" - id="briKNXmin" + id="knxBrightnessMin" min="0" value="0" /> - @@ -356,11 +370,11 @@

data-i18n-attr="value" type="number" class="form-control" - id="briKNXmax" + id="knxBrightnessMax" min="0" value="150000" /> - @@ -372,10 +386,10 @@

data-i18n-attr="value" type="text" class="form-control" - id="temKNXPath" + id="knxTemperaturePath" value="/rest/items/{itemname}/state" /> - @@ -385,16 +399,17 @@

data-i18n-attr="value" type="text" class="form-control" - id="humKNXPath" + id="knxHumidityPath" value="/rest/items/{itemname}/state" /> - +

@@ -417,28 +432,31 @@

data-bs-parent="#settings" >
+
- +
+
- +
+
+
- - +
- -
+ +
- - + +
@@ -469,8 +488,8 @@

- - + +
@@ -479,6 +498,7 @@

+

@@ -501,6 +521,7 @@

data-bs-parent="#settings" >
+
+
- - +
- -
+ +
- - + +
@@ -531,8 +553,8 @@

- - + +
@@ -541,6 +563,7 @@

+

@@ -563,6 +586,7 @@

data-bs-parent="#settings" >
+
+ - +
- -
+ +
- - + +
@@ -618,8 +644,8 @@

- - + +
@@ -627,8 +653,8 @@

- - + +
@@ -637,6 +663,7 @@

+

@@ -663,8 +690,8 @@

- - + +
@@ -672,8 +699,8 @@

- - + +
@@ -682,6 +709,7 @@

+

@@ -708,8 +736,8 @@

- - + +
@@ -717,8 +745,8 @@

- - + +
@@ -726,8 +754,8 @@

- - + +
@@ -735,8 +763,8 @@

- - + +
@@ -745,6 +773,7 @@

+

@@ -775,6 +804,7 @@

+

@@ -797,156 +827,146 @@

data-bs-parent="#settings" >
+
- + + + + - +
- -
-
-
-
- - + +
+
+
+
+
+ + +
+
-
-
-
- -
-
-
-
- - -
- -
-
-
-
-
- - +
+
+
+ + +
+
-
-
-
-
-
- - +
+
+
+ + +
+
-
-
-
-
-
- - +
+
+
+ + +
+
-
-
-
-
-
- - +
+
+
+ + +
+
-
-
-
-
-
- - +
+
+
+ + +
+
-
-
-
-
-
- - +
+
+
+ + +
+
-
-
-
-
- - + +

-
-
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
-
-
-
- - -
- -
+
+
+ +
-
-
+
+
- - + +
-
-
-
-
-
-
- - -
-

- -

-
-
- -
- - -
- -
- - -
- -
-
-
+
- - + +
-
-
-
-
+
- - + +
-
+
+ + +
-
- - -
-

- -

-
-
- -
- - -
-
-
-
- -
-

- +

+
- Modus - Luftfeuchtigkeit - -

-
-
- -
- - -
- -
-
-
-
- - -
- -
+
+
+ +
-
-
+
+ + +
+
+ + +
+
+
- - + +
-
-
-
-
+
- - + +
-
+
+ + +
+
+ + +
-
- -
-

- +

+
- Modus - Anzeigetafel - -

-
-
-
-
-
-
- - +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+
+
+
+ + +
+
-
-
-
-
-
- - +
+
+
+ + +
+
-
-
- -
-

- +

+
- Modus - Countdown - -

-
-
-
-
-
-
- - -
- -
+
+ +
+ +
-
-
-
- - -
- -
+ +
+ +
-
-
-
- - + +
+
+
+
+ + +
+
-
-
-
-
-
- - +
+
+
+ + +
+
-
-
- -
-

- +

+
- Modus - Wechselanzeige - -

-
-
-

Text

-
- - +
+ +
+ + +
-
- -
-

- +

+
- Downlights - -

-
-
- -
- - -
- -
-
-
+
+ +
+ + +
+ +
+
- - + +
-
+
- - + +
-
+
- - + +
-
+
+
+
+
+ + +
+

+ +

+
+
+
+
- - + +
-
+
- - + +
-
+
+
+
+
+ + +
+

+ +

+
+
+
+
- - + +
-
+
- - + +
-
-
-
+
- - + +
-
+
- - + +
-
-
+
+
+
+
+ + +
+

+ +

+
+
+
+ + +
+
+
+
+ + +
+

+ +

+
+
+
+ + +
+
+
+ + +
+
+
- - + +
-
-
-
-
+
- - + +
-
-
-
-
+
- - + +
-
-
-
-
- - +
+ + +
+ +
+ + +
+ +
+
+
+
+
+ + +
+ +
-
-
-
-
- - + +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
+
+
+
+
+ + +
+ +
-
@@ -973,16 +836,17 @@

-
- - -
-
-
Created with the lovely support of my family!
- - - -
-
+ + + +
+
+
Created with the lovely support of my family!
+ + + +
+
+
diff --git a/data/wifi.html b/data/wifi.html index bcd46fa..6c1fe0b 100644 --- a/data/wifi.html +++ b/data/wifi.html @@ -1,370 +1,194 @@ - + - - - - - Shelf Edge Clock - WiFi - - - - - - - - - - - - - - - - - - - + + + + + + Netzwerk - Shelf Edge Clock + + + + + + + + + + + + + + + + + + + - - - - - -
-

WiFi

-

Die Einstellungen im Bereich WiFi-Client müssen zwingend ausgefüllt werden. Andernfalls funktioniert weder die Zeitabfrage über NTP, noch ist die Anbindung an ein KNX-System (openHAB) möglich.

-
- - -
-

Access Point

- - -
- - -
- - -
- - -
- Muss folgende Bedinungen erfüllen:
-
    -
  • maximal 32 Zeichen
  • -
-
-
- - -
- - -
- Muss folgende Bedinungen erfüllen:
-
    -
  • mindestens 8 Zeichen
  • -
  • maximal 63 Zeichen
  • -
  • Gross- und Kleinbuchstaben
  • -
  • Sonderzeichen und Zahlen
  • -
-
-
- - -
- - -
- - -
-

IP-Adresse

- Wikipedia (RFC1918) -
-
-
-
-
- - -
- RFC1918 -
-
-
-
-
- - -
- RFC1918 -
-
-
-
-
- - -
- RFC1918 -
-
-
-
-
- - -
- RFC1918 -
-
-
-
- - -

Gateway

-
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
- - -

Subnetzmaske

-
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
- - -
- -
-
- - -
-

WiFi-Client

- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -
- - -

IP-Adresse

-
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
- - -

Gateway

-
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
- - -

Subnetzmaske

-
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
- - -
- -
-
-
-
- - -
-
-
Created with the lovely support of my family!
- - - -
-
- - \ No newline at end of file + +
+ + + + +
+

Netzwerk

+

+ Die Einstellungen im Bereich WiFi-Client müssen zwingend ausgefüllt werden. Andernfalls funktioniert weder die + Zeitabfrage über NTP, noch ist die Anbindung an ein KNX-System (REST API) möglich. +

+ +

Access Point

+ +
+ + +
+ +
+ + +
+ Muss folgende Bedinungen erfüllen:
+
    +
  • maximal 32 Zeichen
  • +
+
+
+ +
+ + +
+ Muss folgende Bedinungen erfüllen:
+
    +
  • mindestens 8 Zeichen
  • +
  • maximal 63 Zeichen
  • +
  • Gross- und Kleinbuchstaben
  • +
  • Sonderzeichen und Zahlen
  • +
+
+
+ +
+ + +
+ +
+
+
+ + +
RFC1918
+
+
+
+
+ + +
RFC1918
+
+
+
+
+ + +
RFC1918
+
+
+
+
+ + +
+
+
+ +

WiFi-Client

+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ +
+
+ + +
+
+
Created with the lovely support of my family!
+ + + +
+
+
+ + diff --git a/docs/images/home.png b/docs/images/home.png new file mode 100644 index 0000000000000000000000000000000000000000..cafefaf393e1186f21419b8049fd7682bd1a2501 GIT binary patch literal 216112 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 $G{U_f`?_V|b@M-<5Tp}|zR+ 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 ~bZZPQoNj&4_c?CbVFF-seA`_6 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 a0%p;~9kU0VT@?gl|fk&=RTDZ`l! zM5Qg}tGqm#-Q-p6>J~)%Br5ebo8UK<%bDpxe;7YGOLa4(@Acgg7t5(H%qEZm2>r=> z2#sq>J|1}4L=WOL8TmXQRrNR-85hiz6c$MX8c$Od@{V7+h!lq0vm2K#92d+Ki!wzz zZo$CZk&Uo%tD zp%8=i;#pqx#m5i3YY50}$AmdWhcCQ;WN_cOWj@W2?s6WB<|B^mEoi@LuoLg|Nr2PW zagHW54t{CX724{s${$)yx6QewN=TE{_m!IT=g}tFRp2kHiXYpoyNsgp%Pa!XJ^njQ z+Q<0tBK;Mtn9tq!qRj`}+JOBowsRXK(!KT_n0uni70r%*qcn-uyNo#JXzw{MBT@I1 z|2fT7qhcCycA|I+G)MdhL3^A=iOw1i=K@-&ie^yuxoDGBWrRT8K8E~v-J7( znbADEguGCV(nT|S8BbsVTw(%EfLF5f;V6>O`4H%=j=Q@OxQmLIL0}f+Z+KbNB^ld+ z1Wn8Z$re*+XEmbqGNN?m5C)k0oZ~wJ&j6vQP~FWq3QbCSf!jI}huB*4&p5MeVy68)lXcXJDxmNe9c>)m%nm_XkGWIa)vx?c* zK+oSN&5*R<6%`7dAx~bOzwdI*!P@NREsa^14UbC7`0Lgd4A1oiP^u)N^%O4A$we50 z02}JXWQ<7J$9jer3}=JbZRet%A(5C+H|=m*#iL{4b^SMo`FQvBW~{7z6;{Pu3r^bx zL7@g-+FVN$rA1v~E@dL&^A6+)Lt*xs_2{eY`5>=0)LHQ)YOOt=%^z@U%Z(f%PMY z>`g3r#b|B4;oJV+G!MWud=#q(1h~5ZC-TpG2mD*U4Ky*0Pwu@Y)b(N*w`7E^{jur{ z;Q?bMU<178NdfYfHMr z;W{agdt;O7V180hf0j{`5+&a^2k)N-VM9 zyNF7c3omo+h<%f?2LyBOm=XLTb3(E%h>TL{GI%#0Vcf&vF3|fKSMl)KhqU43);uJ> z^-uG*xaNN&Rnz#BFQ=)ZxSh&vv>G@~NtHn!QrWL1*Sekhj@#d}8oM0(|G)je-+}>M d+yH8IN__eo(W?ydJnU=l9-rM$|8xAx{{nQu6gL0> literal 0 HcmV?d00001 diff --git a/src/main.cpp b/src/main.cpp index fd6b5eb..08e6dbe 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,10 +1,10 @@ // ---------------------------------------------------------------------------- -// S H E L F E D G E C L O C K -// -// Author: CaptSnus -// Date: May 16, 2023 -// Update: December 5, 2023 -// License: MIT +const char projectTitle[] = "S H E L F E D G E C L O C K"; + +const char projectAuthor[] = "CaptSnus"; +const char projectVersion[] = "2.0.0"; +const char projectLink[] = "https://github.com/CaptSnus/ShelfEdgeClock"; +const char projectLicense[] = "MIT"; // ---------------------------------------------------------------------------- // // TABLE OF CONTENTS @@ -18,7 +18,6 @@ // ---------------------------------------------------------------------------- // LIBRARIES, HEADER FILES & BOARD DEFINITIONS // ---------------------------------------------------------------------------- - // libraries #include #include @@ -35,33 +34,24 @@ // ---------------------------------------------------------------------------- // PIN ASSIGNMENTS & GLOBAL VARIABLES // ---------------------------------------------------------------------------- +#define EDGE_PIN 36 // pin of the edge leds +#define EDGE_DIGITS 4 // number of digits +#define EDGE_PPS 9 // number of leds per segment +#define EDGE_COUNT EDGE_DIGITS * 7 * EDGE_PPS // number of leds in total +#define DOWN_PIN 35 // pin of the downlight leds +#define DOWN_BOXES 14 // number of downlight boxes +#define DOWN_PPS 1 // number of leds per box +#define DOWN_COUNT DOWN_BOXES *DOWN_PPS // number of leds in total + +// General ------------------------------------------------------------------- +int displayMode; // current display mode +int displayModePrev; // previous display mode -#define EDGE_PIN 36 -#define EDGE_PPS 9 -#define EDGE_COUNT 252 -#define DOWN_PIN 35 -#define DOWN_COUNT 14 - -// ========== DEBUGGING ==================================================== -// For debugging purpose you may turn on additional serial output by changing -// the below parameter to true. Default: false -const bool DEBUG = true; - -// general -const char projectTitle[] = "S H E L F E D G E C L O C K"; -const char projectVersion[] = "1.2.0"; -const char projectAuthor[] = "CaptSnus"; -const char projectLink[] = "https://github.com/CaptSnus/ShelfEdgeClock"; -const char projectLicense[] = "MIT"; - -int displayMode; - -TaskHandle_t taskCore0; Preferences pref; WiFiClient wifi; AsyncWebServer server( 80 ); -// time +// Time ---------------------------------------------------------------------- struct tm ntpTime; // structure to save time time_t now; // this is the epoch uint32_t currMillisCore1 = millis(); // curr time core1 @@ -70,191 +60,191 @@ int prevTimeSecCore0 = 0; // prev time core0 (1 sec) int prevTimeMinCore0 = 0; // prev time core0 (1 min) int prevTimeHourCore0 = 0; // prev time core0 (1 hour) int prevTimeDayCore0 = 0; // prev time core0 (1 day) -bool edgeMinPassed = true; // color change (1 min) -bool edgeHourPassed = true; // color change (1 hour) -bool edgeDayPassed = true; // color change(1 day) -bool downMinPassed = true; // color change (1 min) -bool downHourPassed = true; // color change (1 hour) -bool downDayPassed = true; // color change (1 day) - -// access point -bool apConfig; -bool apHide; // false = visible -String apSSID, apPass; // ssid & password -IPAddress apLocalIP; // ip address -int apIP1, apIP2, apIP3, apIP4; // ...in blocks -IPAddress apGateway; // gateway address -int apGW1, apGW2, apGW3, apGW4; // ...in blocks -IPAddress apSubnet; // subnet mask -int apSN1, apSN2, apSN3, apSN4; // ...in blocks - -// wifi client -bool wifiConfig; -bool wifiDHCP; // false = DHCP -String wifiSSID, wifiPass; // ssid & password -IPAddress wifiLocalIP; // ip -int wifiIP1, wifiIP2, wifiIP3, wifiIP4; // ...in blocks -IPAddress wifiGateway; // gateway -int wifiGW1, wifiGW2, wifiGW3, wifiGW4; // ...in blocks -IPAddress wifiSubnet; // subnet -int wifiSN1, wifiSN2, wifiSN3, wifiSN4; // ...in blocks - -// led -// |- edge -CRGBArray arrayEdge; -CRGBSet segA( arrayEdge( EDGE_PPS * 0, EDGE_PPS - 1 + ( EDGE_PPS * 0 ) ) ); -CRGBSet segB( arrayEdge( EDGE_PPS * 1, EDGE_PPS - 1 + ( EDGE_PPS * 1 ) ) ); -CRGBSet segC( arrayEdge( EDGE_PPS * 2, EDGE_PPS - 1 + ( EDGE_PPS * 2 ) ) ); -CRGBSet segD( arrayEdge( EDGE_PPS * 3, EDGE_PPS - 1 + ( EDGE_PPS * 3 ) ) ); -CRGBSet segE( arrayEdge( EDGE_PPS * 4, EDGE_PPS - 1 + ( EDGE_PPS * 4 ) ) ); -CRGBSet segF( arrayEdge( EDGE_PPS * 5, EDGE_PPS - 1 + ( EDGE_PPS * 5 ) ) ); -CRGBSet segG( arrayEdge( EDGE_PPS * 6, EDGE_PPS - 1 + ( EDGE_PPS * 6 ) ) ); -// |- downlights -CRGBArray arrayDown; -// settings - globale einstellungen -int edgeBrightness = 0; // 0 = auto, > 0 = manual -int edgeBrightnessMin; // minimum value for edgeBrightnessOut -int edgeBrightnessMax; // maximum value for edgeBrightnessOut -int edgeBrightnessOut; // output to FastLED for edge lights -int edgeFrequency = 0; // 0 = sec, 1 = min, 2 = hour, 3 = day -int downUsage = 0; // 0 = off, 1 = on -int downBrightness = 0; // 0 = auto, > 0 = manual -int downBrightnessMin; // minimum value for downBrightnessOut -int downBrightnessMax; // maximum value for downBrightnessOut -int downBrightnessOut; // output to FastLED for downlights -int downFrequency = 0; // 0 = sec, 1 = min, 2 = hour, 3 = day - -// settings - knx -String knxAddress = ""; // ip address -int knxPort = 8080; // port number -String knxBrightnessPath = ""; // path to brightness item -long knxBrightnessValue = 0; -long knxBrightnessMin; -long knxBrightnessMax; -String knxTemperaturePath = ""; // temperature item -double knxTemperatureValue = 0; -String knxHumidityPath = ""; // humidity item -int knxHumidityValue = 0; -HttpClient knxClient = HttpClient( wifi, knxAddress.c_str(), knxPort ); - -// settings - mode clock -String clkAddress = "ch.pool.ntp.org"; -String clkTimeZone = "CET-1CEST,M3.5.0,M10.5.0/3"; -int clkFormat = 1; // 0 = AM/PM, 1 = 24h -int clkColor = 0; // 0 = 2 def, 1 = 2 random -int clkColorHR, clkColorHG, clkColorHB; -int clkColorMR, clkColorMG, clkColorMB; - -// settings - mode date +TaskHandle_t taskCore0; + +// mode CLOCK ---------------------------------------------------------------- +String clkAddress = "ch.pool.ntp.org"; +String clkTimeZone = "CET-1CEST,M3.5.0,M10.5.0/3"; +int clkFormat = 1; // 0 = AM/PM, 1 = 24h +int clkColor = 0; // 0 = 2 def, 1 = 2 random + +int clkColorHR, clkColorHG, clkColorHB; +int clkColorMR, clkColorMG, clkColorMB; + +// mode DATE ----------------------------------------------------------------- int datFormat = 1; // 0 = MMdd, 1 = ddMM int datColor = 0; // 0 = 2 def, 1 = 2 random -int datColorDR, datColorDG, datColorDB; -int datColorMR, datColorMG, datColorMB; -// settings - mode temperature +int datColorDR, datColorDG, datColorDB; // color for days +int datColorMR, datColorMG, datColorMB; // color for months + +// mode TEMPERATURE ---------------------------------------------------------- int temSymbol = 1; // 0 = Fahrenheit, 1 = Celsius -// settings - mode humidity +// mode HUMIDITY ------------------------------------------------------------- int humColor = 0; // 0 = 3 def, 1 = 3 random -int humColorAR, humColorAG, humColorAB; -int humColorBR, humColorBG, humColorBB; -int humColorCR, humColorCG, humColorCB; -// settings - mode scoreboard -int scoLValue = 0; -int scoRValue = 0; -int scoColorLR, scoColorLG, scoColorLB; -int scoColorRR, scoColorRG, scoColorRB; +int humColorAR, humColorAG, humColorAB; // color for digits +int humColorBR, humColorBG, humColorBB; // color for comma value +int humColorCR, humColorCG, humColorCB; // color for sign + +// mode SCOREBOARD ----------------------------------------------------------- +int scoL = 0; // left value to display +int scoR = 0; // right value to display -// settings - mode countdown +int scoColorLR, scoColorLG, scoColorLB; // color for left value +int scoColorRR, scoColorRG, scoColorRB; // color for right value + +// mode COUNTDOWN ------------------------------------------------------------ uint32_t couMillis = 0; uint32_t couMillisEnd = 0; -int couColorHR, couColorHG, couColorHB; -int couColorMR, couColorMG, couColorMB; -int couColorSR, couColorSG, couColorSB; -int couColorAR, couColorAG, couColorAB; -// settings - mode scroll +int couColorHR, couColorHG, couColorHB; +int couColorMR, couColorMG, couColorMB; +int couColorSR, couColorSG, couColorSB; +int couColorAR, couColorAG, couColorAB; + +// mode SCROLLING ------------------------------------------------------------ uint32_t scrMillis = 0; uint32_t scrMillisPrev = 0; int scrDisplayMode = 0; int scrTime; -// downlights -int dowColor; -int dowColorR, dowColorG, dowColorB; -int dowColor0R, dowColor0G, dowColor0B; -int dowColor1R, dowColor1G, dowColor1B; -int dowColor2R, dowColor2G, dowColor2B; -int dowColor3R, dowColor3G, dowColor3B; -int dowColor4R, dowColor4G, dowColor4B; -int dowColor5R, dowColor5G, dowColor5B; -int dowColor6R, dowColor6G, dowColor6B; -int dowColor7R, dowColor7G, dowColor7B; -int dowColor8R, dowColor8G, dowColor8B; -int dowColor9R, dowColor9G, dowColor9B; -int dowColor10R, dowColor10G, dowColor10B; -int dowColor11R, dowColor11G, dowColor11B; -int dowColor12R, dowColor12G, dowColor12B; -int dowColor13R, dowColor13G, dowColor13B; +// wifi ---------------------------------------------------------------------- +bool apSwitch = 1; // ap: 0 = off, 1 = on +bool apHidden = 0; // ap: 0 = visible, 1 = hidden +String apSSID, apPass; // ap: ssid & password +IPAddress apIPLocal; // ap: ip address +IPAddress apGateway; // ap: gateway address +IPAddress apSubnet; // ap: subnet mask +int apIP1, apIP2, apIP3; // ap: ip address in blocks (apIP4 = 1) +bool wifiSwitch = 0; // wifi: 0 = off, 1 = on +String wifiSSID, wifiPass; // wifi: ssid & password + +// rest api ------------------------------------------------------------------ +String knxAddress = ""; // ip address +int knxPort = 8080; // port +String knxBrightPath = ""; // path to brightness item +long knxBrightIn = 0; // current brightness value +long knxBrightMin = 0; // min value of brightness item +long knxBrightMax = 150000; // max value of brightness item +String knxTempPath = ""; // path to temperature item +double knxTempIn = 0; // current temperature value +String knxHumidPath = ""; // path to humidity item +int knxHumidIn = 0; // current humidity value + +HttpClient knxClient = HttpClient( wifi, knxAddress.c_str(), knxPort ); + +// edgelights ---------------------------------------------------------------- +bool edgeMinPassed = true; // color change (1 min) +bool edgeHourPassed = true; // color change (1 hour) +bool edgeDayPassed = true; // color change (1 day) +int edgeBrightIn = 0; // 0 = auto, > 0 = manual +int edgeBrightMin = 5; // minimum value +int edgeBrightMax = 125; // maximum value +int edgeBrightOut = 25; // effective value +int edgeFrequency = 0; // 0 = sec, 1 = min, 2 = hour, 3 = day + +CRGBArray arrayEdge; // edge array +CRGBSet segA( arrayEdge( EDGE_PPS * 0, EDGE_PPS - 1 + ( EDGE_PPS * 0 ) ) ); // B B +CRGBSet segB( arrayEdge( EDGE_PPS * 1, EDGE_PPS - 1 + ( EDGE_PPS * 1 ) ) ); // C A +CRGBSet segC( arrayEdge( EDGE_PPS * 2, EDGE_PPS - 1 + ( EDGE_PPS * 2 ) ) ); // C A +CRGBSet segD( arrayEdge( EDGE_PPS * 3, EDGE_PPS - 1 + ( EDGE_PPS * 3 ) ) ); // D D +CRGBSet segE( arrayEdge( EDGE_PPS * 4, EDGE_PPS - 1 + ( EDGE_PPS * 4 ) ) ); // G E +CRGBSet segF( arrayEdge( EDGE_PPS * 5, EDGE_PPS - 1 + ( EDGE_PPS * 5 ) ) ); // G E +CRGBSet segG( arrayEdge( EDGE_PPS * 6, EDGE_PPS - 1 + ( EDGE_PPS * 6 ) ) ); // F F + +// downlights ---------------------------------------------------------------- +bool downMinPassed = true; // color change (1 min) +bool downHourPassed = true; // color change (1 hour) +bool downDayPassed = true; // color change (1 day) +bool downSwitch = 0; // values: 0 = off, 1 = on +int downBrightIn = 0; // values: 0 = auto, > 0 = manual +int downBrightMin = 10; // minimum value +int downBrightMax = 250; // maximum value +int downBrightOut; // effective value +int downFrequency = 0; // values: 0 = sec, 1 = min, 2 = hour, 3 = day +int downColorMode; // values: 0, 1, 2, 3 + +int downColorR00, downColorG00, downColorB00; // mode: 0 -> color +int downColorR01, downColorG01, downColorB01; // mode: 1 -> color 1 +int downColorR02, downColorG02, downColorB02; // mode: 1 -> color 2 +int downColorR03, downColorG03, downColorB03; // mode: 1 -> color 3 +int downColorR04, downColorG04, downColorB04; // mode: 1 -> color 4 +int downColorR05, downColorG05, downColorB05; // mode: 1 -> color 5 +int downColorR06, downColorG06, downColorB06; // mode: 1 -> color 6 +int downColorR07, downColorG07, downColorB07; // mode: 1 -> color 7 +int downColorR08, downColorG08, downColorB08; // mode: 1 -> color 8 +int downColorR09, downColorG09, downColorB09; // mode: 1 -> color 9 +int downColorR10, downColorG10, downColorB10; // mode: 1 -> color 10 +int downColorR11, downColorG11, downColorB11; // mode: 1 -> color 11 +int downColorR12, downColorG12, downColorB12; // mode: 1 -> color 12 +int downColorR13, downColorG13, downColorB13; // mode: 1 -> color 13 +int downColorR14, downColorG14, downColorB14; // mode: 1 -> color 14 + +CRGBArray arrayDown; // ---------------------------------------------------------------------------- // FUNCTION DECLARATIONS // ---------------------------------------------------------------------------- - -void initPREFERENCES(); // setup - initialize preferences and load values -void initWIFI(); // setup - configure wifi connections -void initSPIFFS(); // setup - initialize SPIFFS and load data -void initNTP(); // setup - configure NTP and load current time -void initHANDLERS(); // setup - load all web handlers -void initSERVER(); // setup - configure and start webserver -void initLED(); // setup - define and initialize all led strands - -void getAP(); // loop - restart the access point -void getWIFI(); // loop - reconnect the wifi client -void getNTP(); // loop - update current time -void getKNXbrightness(); // loop - get the brightness value -void getKNXtemperature(); // loop - get the temperature value -void getKNXhumidity(); // loop - get the humidity value - -void modeClk(); // display - mode CLOCK -void modeDat(); // display - mode DATE -void modeTem(); // display - mode TEMPERATURE -void modeHum(); // display - mode HUMIDITY -void modeSco(); // display - mode SCOREBOARD -void modeCou(); // display - mode COUNTDOWN -void modeScr(); // display - mode SCROLLING - -void displayEdge( uint8_t d, uint8_t o, CHSV c ); // outout - edge +void initPREFERENCES(); // setup - initialize preferences and load values +void initWIFI(); // setup - configure wifi connections +void initSPIFFS(); // setup - initialize SPIFFS and load data +void initNTP(); // setup - configure NTP and fetch current time +void initHANDLERS(); // setup - load all web handlers +void initSERVER(); // setup - configure and start webserver +void initLED(); // setup - define and initialize all led strands + +void getNTP(); // loop - update current time +void getKNXbrightness(); // loop - get the brightness value +void getKNXtemperature(); // loop - get the temperature value +void getKNXhumidity(); // loop - get the humidity value +void getPing(); // TBD + +void modeClk(); // display - mode CLOCK +void modeDat(); // display - mode DATE +void modeTem(); // display - mode TEMPERATURE +void modeHum(); // display - mode HUMIDITY +void modeSco(); // display - mode SCOREBOARD +void modeCou(); // display - mode COUNTDOWN +void modeScr(); // display - mode SCROLLING + +void displayEdge( uint8_t d, uint8_t o, CHSV c ); // outout - edgelights void displayDown(); // output - downlights - void taskCore0code( void *pvParameters ); // task on core0 // ---------------------------------------------------------------------------- // SETUP // ---------------------------------------------------------------------------- - void setup() { - if ( DEBUG ) { - Serial.begin( 115200 ); // initialize serial - delay( 5000 ); // wait a moment - Serial.println( "\n\n" ); // make some space - Serial.printf( "PROJECT %s\n", projectTitle ); // project title - Serial.printf( "Version %s\n", projectVersion ); // version - Serial.printf( "Author %s\n", projectAuthor ); // author - Serial.printf( "Info %s\n", projectLink ); // link - Serial.printf( "License %s\n", projectLicense ); // license - Serial.println( "\nSETUP" ); + Serial.begin( 115200 ); // initialize serial + delay( 5000 ); // wait a moment + + Serial.println( "\n\n" ); // make some space + Serial.printf( "PROJECT %s\n", projectTitle ); // project title + Serial.printf( "Version %s\n", projectVersion ); // version + Serial.printf( "Author %s\n", projectAuthor ); // author + Serial.printf( "Info %s\n", projectLink ); // link + Serial.printf( "License %s\n", projectLicense ); // license + Serial.println( "\nSETUP" ); + + initPREFERENCES(); // load all saved settings + initWIFI(); // configure wifi + initSPIFFS(); // initialize spiffs + initNTP(); // get the time from ntp + initHANDLERS(); // load all web handlers + initSERVER(); // configure webserver + initLED(); // init neopixels + + if ( WiFi.status() == WL_CONNECTED ) { // if wifi up ... + getNTP(); // ... first read of date and time + getKNXbrightness(); // ... first read of brightness + getKNXtemperature(); // ... first read of temperature + getKNXhumidity(); // ... first read of humidity } - initPREFERENCES(); // load all saved settings - initWIFI(); // configure wifi - initSPIFFS(); // initialize spiffs - initNTP(); // get the time from ntp - initHANDLERS(); // load all web handlers - initSERVER(); // configure webserver - initLED(); // init neopixels + displayModePrev = displayMode; // prefill the previous display mode xTaskCreatePinnedToCore( // task running on core 0 taskCore0code, // function to implement the task @@ -269,14 +259,11 @@ void setup() { // ---------------------------------------------------------------------------- // LOOP // ---------------------------------------------------------------------------- - void loop() { currMillisCore1 = millis(); // update reference time ElegantOTA.loop(); // reboot after update - if ( ( currMillisCore1 - prevTimeSecCore1 ) >= 1000 ) { // inside here every second prevTimeSecCore1 = currMillisCore1; // update previous reference time - time( &now ); // read the current time localtime_r( &now, &ntpTime ); // update ntpTime with the current time @@ -302,10 +289,10 @@ void loop() { modeScr(); // call scroll mode } - if ( edgeBrightness == 0 ) { - FastLED[ 0 ].showLeds( edgeBrightnessOut ); + if ( edgeBrightIn == 0 ) { + FastLED[ 0 ].showLeds( edgeBrightOut ); } else { - FastLED[ 0 ].showLeds( edgeBrightness ); + FastLED[ 0 ].showLeds( edgeBrightIn ); } } } @@ -313,12 +300,9 @@ void loop() { // ---------------------------------------------------------------------------- // FUNCTION DEFINITIONS // ---------------------------------------------------------------------------- - /** * @brief display mode - CLOCK * @details display the current time on the front of the shelf - * @todo optimize and streamline the code - * @todo check if CHSV clkHColor, clkMColor must be global * @since 1.0.0 */ void modeClk() { @@ -430,12 +414,12 @@ void modeTem() { CHSV temColor; // build digits - int temp = round( knxTemperatureValue ); // round - int t1, t2, t3; // throwaway variable + int temp = round( knxTempIn ); // round + int t1, t2, t3; // throwaway variable // |- Fahrenheit if ( temSymbol == 0 ) { if ( temp < 0 ) { - t1 = 37; // show "-" + t1 = 37; // show "-" } else { t1 = floor( temp / 100 ); // build t1 } @@ -530,9 +514,9 @@ void modeHum() { CHSV humCColor; // build digits - int h1 = floor( knxHumidityValue / 100 ); // build h1 - int h2 = ( knxHumidityValue / 10 ) % 10; // build h2 - int h3 = knxHumidityValue % 10; // build h3 + int h1 = floor( knxHumidIn / 100 ); // build h1 + int h2 = ( knxHumidIn / 10 ) % 10; // build h2 + int h3 = knxHumidIn % 10; // build h3 // color settings // |- 3 user defined colors @@ -573,10 +557,10 @@ void modeSco() { CHSV scoAColor; // build the digits - int s1 = floor( scoLValue / 10 ); // build s1 - int s2 = scoLValue % 10; // build s2 - int s3 = floor( scoRValue / 10 ); // build s3 - int s4 = scoRValue % 10; // build s4 + int s1 = floor( scoL / 10 ); // build s1 + int s2 = scoL % 10; // build s2 + int s3 = floor( scoR / 10 ); // build s3 + int s4 = scoR % 10; // build s4 // set the colors scoHColor = rgb2hsv_approximate( CRGB( scoColorLR, scoColorLG, scoColorLB ) ); @@ -596,36 +580,34 @@ void modeSco() { * @since 1.0.0 */ void modeCou() { + CHSV couHColor; CHSV couMColor; CHSV couSColor; CHSV couAColor; - if ( couMillis == 0 ) { // abort empty countdown - if ( edgeBrightness == 0 ) { // value = 0 -> automatic mode - FastLED[ 0 ].showLeds( edgeBrightnessOut ); - } else { - FastLED[ 0 ].showLeds( edgeBrightness / 2 ); - } + // abort empty countdown + if ( couMillis == 0 ) { displayMode = 0; pref.putInt( "displayMode", 0 ); return; } + // build the values + uint32_t restMillis = couMillisEnd - millis(); // build the remaining milliseconds and ... + uint32_t hours = ( ( restMillis / 1000 ) / 60 ) / 60; // ... the countdown in hours + uint32_t minutes = ( restMillis / 1000 ) / 60; // ... the countdown in minutes + uint32_t seconds = restMillis / 1000; // ... the countdown in seconds + int remM = minutes - ( hours * 60 ); // ... the minutes between 0 and 59 + int remS = seconds - ( minutes * 60 ); // ... the seconds between 0 and 59 + // build the digits - uint32_t restMillis = couMillisEnd - millis(); // continously build the remaining milliseconds and ... - uint32_t hours = ( ( restMillis / 1000 ) / 60 ) / 60; // ... create the countdown in hours - uint32_t minutes = ( restMillis / 1000 ) / 60; // ... create the countdown in minutes - uint32_t seconds = restMillis / 1000; // ... create the countdown in seconds - int remM = minutes - ( hours * 60 ); // build the minutes between 0 and 59 - int remS = seconds - ( minutes * 60 ); // build the seconds between 0 and 59 - - int h1 = hours / 10; // build h1 - int h2 = hours % 10; // build h2 - int m1 = remM / 10; // build m1 - int m2 = remM % 10; // build m2 - int s1 = remS / 10; // build s1 - int s2 = remS % 10; // build s2 + int h1 = hours / 10; // build h1 + int h2 = hours % 10; // build h2 + int m1 = remM / 10; // build m1 + int m2 = remM % 10; // build m2 + int s1 = remS / 10; // build s1 + int s2 = remS % 10; // build s2 // set the colors if ( restMillis > 10000 ) { // three defined colors @@ -652,31 +634,32 @@ void modeCou() { // display "EndE" if ( hours <= 0 && remM <= 0 && remS <= 0 ) { - // ledClock.setBrightness( 150 ); + + // blank edge leds + FastLED[ 0 ].clearLedData(); + FastLED[ 0 ].showLeds( 250 ); + delay( 500 ); + + // set the color couAColor = rgb2hsv_approximate( CRGB( couColorAR, couColorAG, couColorAB ) ); + + // blink EndE for ( int i = 0; i < 5; i++ ) { displayEdge( 13, 3, couAColor ); displayEdge( 15, 2, couAColor ); displayEdge( 12, 1, couAColor ); displayEdge( 13, 0, couAColor ); - FastLED[ 1 ].showLeds( 150 ); - delay( 500 ); - // fill_solid( arrayEdge, EDGE_COUNT, CRGB::Black ); - FastLED[ 1 ].showLeds( 0 ); + FastLED[ 0 ].showLeds( 250 ); + delay( 300 ); + FastLED[ 0 ].showLeds( 0 ); delay( 300 ); } - // ledClock.clear(); + delay( 5000 ); - if ( edgeBrightness == 0 ) { // value = 0 -> automatic mode - // ledClock.setBrightness( briEdge ); - } else { - // ledClock.setBrightness( edgeBrightness / 2 ); - } - displayMode = 0; + displayMode = displayModePrev; pref.putInt( "displayMode", 0 ); couMillis = 0; couMillisEnd = 0; - return; } } @@ -686,15 +669,15 @@ void modeCou() { * @since 1.0.0 */ void modeScr() { - scrMillis = millis(); // update current reference time + scrMillis = millis(); // update current reference time if ( ( scrMillis - scrMillisPrev ) >= ( scrTime * 1000 ) ) { // run everything inside here every x seconds scrMillisPrev = scrMillis; // update previous reference time - if ( scrDisplayMode < 2 ) { // if scrDisplayMode is smaller than 2 ... - scrDisplayMode = scrDisplayMode + 1; // ... increase scrDisplayMode by 1 - } else { // ... else ... - scrDisplayMode = 0; // ... restart with the first content + if ( scrDisplayMode < 2 ) { // if scrDisplayMode is smaller than 2 ... + scrDisplayMode = scrDisplayMode + 1; // ... increase scrDisplayMode by 1 + } else { // ... else ... + scrDisplayMode = 0; // ... restart with the first content } } @@ -711,228 +694,203 @@ void modeScr() { /** * @brief SETUP - flash memory - * @details Create preferences array in read/write mode and load all saved data. + * @details Create preferences array in read/write mode and load all saved data * @since 1.0.0 */ void initPREFERENCES() { - if ( DEBUG ) { - Serial.println( "- Preferences" ); - } - + Serial.println( "- Preferences" ); pref.begin( "shelfclock", false ); // last mode - displayMode = pref.getInt( "displayMode", 0 ); - // wifi - apConfig = pref.getInt( "apConfig", 0 ); - apSSID = pref.getString( "apSSID", "Shelf Edge Clock" ); - apPass = pref.getString( "apPass", "shelfEdgeClock" ); - apHide = pref.getInt( "apHide", 0 ); - apIP1 = pref.getInt( "apIP1", 192 ); - apIP2 = pref.getInt( "apIP2", 168 ); - apIP3 = pref.getInt( "apIP3", 100 ); - apIP4 = pref.getInt( "apIP4", 1 ); - apGW1 = pref.getInt( "apGW1", 192 ); - apGW2 = pref.getInt( "apGW2", 168 ); - apGW3 = pref.getInt( "apGW3", 100 ); - apGW4 = pref.getInt( "apGW4", 1 ); - apSN1 = pref.getInt( "apSN1", 255 ); - apSN2 = pref.getInt( "apSN2", 255 ); - apSN3 = pref.getInt( "apSN3", 255 ); - apSN4 = pref.getInt( "apSN4", 0 ); - wifiConfig = pref.getInt( "wifiConfig", 0 ); - wifiSSID = pref.getString( "wifiSSID", "ENTER_SSID" ); - wifiPass = pref.getString( "wifiPass", "ENTER_PASSWORD" ); - wifiDHCP = pref.getInt( "wifiDHCP", 0 ); - wifiIP1 = pref.getInt( "wifiIP1" ); - wifiIP2 = pref.getInt( "wifiIP2" ); - wifiIP3 = pref.getInt( "wifiIP3" ); - wifiIP4 = pref.getInt( "wifiIP4" ); - wifiGW1 = pref.getInt( "wifiGW1" ); - wifiGW2 = pref.getInt( "wifiGW2" ); - wifiGW3 = pref.getInt( "wifiGW3" ); - wifiGW4 = pref.getInt( "wifiGW4" ); - wifiSN1 = pref.getInt( "wifiSN1" ); - wifiSN2 = pref.getInt( "wifiSN2" ); - wifiSN3 = pref.getInt( "wifiSN3" ); - wifiSN4 = pref.getInt( "wifiSN4" ); - // global settings - edgeBrightness = pref.getInt( "edgBright", edgeBrightness ); - edgeBrightnessMin = pref.getInt( "edgBrightMin", 5 ); - edgeBrightnessMax = pref.getInt( "edgBrightMax", 125 ); - edgeBrightnessOut = pref.getInt( "edgBrightOut", 25 ); - edgeFrequency = pref.getInt( "edgColFreq", edgeFrequency ); - downUsage = pref.getInt( "dowUsage", downUsage ); - downBrightness = pref.getInt( "dowBright", downBrightness ); - downBrightnessMin = pref.getInt( "dowBrightMin ", 10 ); - downBrightnessMax = pref.getInt( "dowBrightMax", 250 ); - downBrightnessOut = pref.getInt( "dowBrightOut", 50 ); - downFrequency = pref.getInt( "dowColFreq", downFrequency ); - // knx connection - knxAddress = pref.getString( "knxAddr", "0.0.0.0" ); - knxPort = pref.getInt( "knxPort", 8080 ); - knxBrightnessPath = pref.getString( "knxBrightPath", "/rest/items/{item}/state" ); - knxBrightnessMin = pref.getLong( "knxBrightMin", 0 ); - knxBrightnessMax = pref.getLong( "knxBrightMax", 150000 ); - knxTemperaturePath = pref.getString( "knxTempPath", "/rest/items/{item}/state" ); - knxHumidityPath = pref.getString( "knxHumPath", "/rest/items/{item}/state" ); - // downlights - dowColor = pref.getInt( "dowColor", 0 ); - dowColorR = pref.getInt( "dowColorR", 255 ); - dowColorG = pref.getInt( "dowColorG", 255 ); - dowColorB = pref.getInt( "dowColorB", 255 ); - dowColor0R = pref.getInt( "dowColor0R", 255 ); - dowColor0G = pref.getInt( "dowColor0G", 255 ); - dowColor0B = pref.getInt( "dowColor0B", 255 ); - dowColor1R = pref.getInt( "dowColor1R", 255 ); - dowColor1G = pref.getInt( "dowColor1G", 255 ); - dowColor1B = pref.getInt( "dowColor1B", 255 ); - dowColor2R = pref.getInt( "dowColor2R", 255 ); - dowColor2G = pref.getInt( "dowColor2G", 255 ); - dowColor2B = pref.getInt( "dowColor2B", 255 ); - dowColor3R = pref.getInt( "dowColor3R", 255 ); - dowColor3G = pref.getInt( "dowColor3G", 255 ); - dowColor3B = pref.getInt( "dowColor3B", 255 ); - dowColor4R = pref.getInt( "dowColor4R", 255 ); - dowColor4G = pref.getInt( "dowColor4G", 255 ); - dowColor4B = pref.getInt( "dowColor4B", 255 ); - dowColor5R = pref.getInt( "dowColor5R", 255 ); - dowColor5G = pref.getInt( "dowColor5G", 255 ); - dowColor5B = pref.getInt( "dowColor5B", 255 ); - dowColor6R = pref.getInt( "dowColor6R", 255 ); - dowColor6G = pref.getInt( "dowColor6G", 255 ); - dowColor6B = pref.getInt( "dowColor6B", 255 ); - dowColor7R = pref.getInt( "dowColor7R", 255 ); - dowColor7G = pref.getInt( "dowColor7G", 255 ); - dowColor7B = pref.getInt( "dowColor7B", 255 ); - dowColor8R = pref.getInt( "dowColor8R", 255 ); - dowColor8G = pref.getInt( "dowColor8G", 255 ); - dowColor8B = pref.getInt( "dowColor8B", 255 ); - dowColor9R = pref.getInt( "dowColor9R", 255 ); - dowColor9G = pref.getInt( "dowColor9G", 255 ); - dowColor9B = pref.getInt( "dowColor9B", 255 ); - dowColor10R = pref.getInt( "dowColor10R", 255 ); - dowColor10G = pref.getInt( "dowColor10G", 255 ); - dowColor10B = pref.getInt( "dowColor10B", 255 ); - dowColor11R = pref.getInt( "dowColor11R", 255 ); - dowColor11G = pref.getInt( "dowColor11G", 255 ); - dowColor11B = pref.getInt( "dowColor11B", 255 ); - dowColor12R = pref.getInt( "dowColor12R", 255 ); - dowColor12G = pref.getInt( "dowColor12G", 255 ); - dowColor12B = pref.getInt( "dowColor12B", 255 ); - dowColor13R = pref.getInt( "dowColor13R", 255 ); - dowColor13G = pref.getInt( "dowColor13G", 255 ); - dowColor13B = pref.getInt( "dowColor13B", 255 ); + displayMode = pref.getInt( "displayMode", 0 ); // mode clock - clkAddress = pref.getString( "clkAddr", clkAddress ); - clkTimeZone = pref.getString( "clkZone", clkTimeZone ); - clkFormat = pref.getInt( "clkFormat", 1 ); - clkColor = pref.getInt( "clkColor", 0 ); - clkColorHR = pref.getInt( "clkColHR", 85 ); - clkColorHG = pref.getInt( "clkColHG", 26 ); - clkColorHB = pref.getInt( "clkColHB", 139 ); - clkColorMR = pref.getInt( "clkColMR", 255 ); - clkColorMG = pref.getInt( "clkColMG", 0 ); - clkColorMB = pref.getInt( "clkColMB", 132 ); + clkAddress = pref.getString( "clkAddr", clkAddress ); + clkTimeZone = pref.getString( "clkZone", clkTimeZone ); + clkFormat = pref.getInt( "clkFormat", 1 ); + clkColor = pref.getInt( "clkColor", 0 ); + clkColorHR = pref.getInt( "clkColHR", 85 ); + clkColorHG = pref.getInt( "clkColHG", 26 ); + clkColorHB = pref.getInt( "clkColHB", 139 ); + clkColorMR = pref.getInt( "clkColMR", 255 ); + clkColorMG = pref.getInt( "clkColMG", 0 ); + clkColorMB = pref.getInt( "clkColMB", 132 ); // mode date - datFormat = pref.getInt( "datFormat", 1 ); - datColor = pref.getInt( "datColor", 0 ); - datColorDR = pref.getInt( "datColorDR", 255 ); - datColorDG = pref.getInt( "datColorDG", 215 ); - datColorDB = pref.getInt( "datColorDB", 0 ); - datColorMR = pref.getInt( "datColorMR", 255 ); - datColorMG = pref.getInt( "datColorMG", 69 ); - datColorMB = pref.getInt( "datColorMB", 0 ); + datFormat = pref.getInt( "datFormat", 1 ); + datColor = pref.getInt( "datColor", 0 ); + datColorDR = pref.getInt( "datColorDR", 255 ); + datColorDG = pref.getInt( "datColorDG", 215 ); + datColorDB = pref.getInt( "datColorDB", 0 ); + datColorMR = pref.getInt( "datColorMR", 255 ); + datColorMG = pref.getInt( "datColorMG", 69 ); + datColorMB = pref.getInt( "datColorMB", 0 ); // mode temperature - temSymbol = pref.getInt( "temSymbol", 1 ); + temSymbol = pref.getInt( "temSymbol", 1 ); // mode humidity - humColor = pref.getInt( "humColor", 0 ); - humColorAR = pref.getInt( "humColorAR", 255 ); - humColorAG = pref.getInt( "humColorAG", 255 ); - humColorAB = pref.getInt( "humColorAB", 0 ); - humColorBR = pref.getInt( "humColorBR", 0 ); - humColorBG = pref.getInt( "humColorBG", 255 ); - humColorBB = pref.getInt( "humColorBB", 255 ); - humColorCR = pref.getInt( "humColorCR", 255 ); - humColorCG = pref.getInt( "humColorCG", 0 ); - humColorCB = pref.getInt( "humColorCB", 255 ); + humColor = pref.getInt( "humColor", 0 ); + humColorAR = pref.getInt( "humColorAR", 255 ); + humColorAG = pref.getInt( "humColorAG", 255 ); + humColorAB = pref.getInt( "humColorAB", 0 ); + humColorBR = pref.getInt( "humColorBR", 0 ); + humColorBG = pref.getInt( "humColorBG", 255 ); + humColorBB = pref.getInt( "humColorBB", 255 ); + humColorCR = pref.getInt( "humColorCR", 255 ); + humColorCG = pref.getInt( "humColorCG", 0 ); + humColorCB = pref.getInt( "humColorCB", 255 ); // mode scoreboard - scoColorLR = pref.getInt( "scoLColR", 0 ); - scoColorLG = pref.getInt( "scoLColG", 0 ); - scoColorLB = pref.getInt( "scoLColB", 255 ); - scoColorRR = pref.getInt( "scoRColR", 0 ); - scoColorRG = pref.getInt( "scoRColG", 255 ); - scoColorRB = pref.getInt( "scoRColB", 255 ); + scoColorLR = pref.getInt( "scoLColR", 0 ); + scoColorLG = pref.getInt( "scoLColG", 0 ); + scoColorLB = pref.getInt( "scoLColB", 255 ); + scoColorRR = pref.getInt( "scoRColR", 0 ); + scoColorRG = pref.getInt( "scoRColG", 255 ); + scoColorRB = pref.getInt( "scoRColB", 255 ); // mode countdown - couColorHR = pref.getInt( "couColorHR", 255 ); - couColorHG = pref.getInt( "couColorHG", 140 ); - couColorHB = pref.getInt( "couColorHB", 0 ); - couColorMR = pref.getInt( "couColorMR", 255 ); - couColorMG = pref.getInt( "couColorMG", 165 ); - couColorMB = pref.getInt( "couColorMB", 0 ); - couColorSR = pref.getInt( "couColorSR", 255 ); - couColorSG = pref.getInt( "couColorSG", 215 ); - couColorSB = pref.getInt( "couColorSB", 0 ); - couColorAR = pref.getInt( "couColorAR", 255 ); - couColorAG = pref.getInt( "couColorAG", 0 ); - couColorAB = pref.getInt( "couColorAB", 0 ); + couColorHR = pref.getInt( "couColorHR", 255 ); + couColorHG = pref.getInt( "couColorHG", 140 ); + couColorHB = pref.getInt( "couColorHB", 0 ); + couColorMR = pref.getInt( "couColorMR", 255 ); + couColorMG = pref.getInt( "couColorMG", 165 ); + couColorMB = pref.getInt( "couColorMB", 0 ); + couColorSR = pref.getInt( "couColorSR", 255 ); + couColorSG = pref.getInt( "couColorSG", 215 ); + couColorSB = pref.getInt( "couColorSB", 0 ); + couColorAR = pref.getInt( "couColorAR", 255 ); + couColorAG = pref.getInt( "couColorAG", 0 ); + couColorAB = pref.getInt( "couColorAB", 0 ); // mode scroll - scrTime = pref.getInt( "scrTime", 4 ); + scrTime = pref.getInt( "scrTime", 4 ); + + // WiFi + // ---------------------------------------------------------------------------- + pref.putInt( "apSwitch", 1 ); + apSwitch = pref.getInt( "apSwitch", 1 ); + apHidden = pref.getInt( "apHidden", 0 ); + apSSID = pref.getString( "apSSID", "Shelf Edge Clock" ); + apPass = pref.getString( "apPass", "sEC_v2.0.0" ); + apIP1 = pref.getInt( "apIP1", 192 ); + apIP2 = pref.getInt( "apIP2", 168 ); + apIP3 = pref.getInt( "apIP3", 100 ); + wifiSwitch = pref.getInt( "wifiSwitch", 0 ); + wifiSSID = pref.getString( "wifiSSID", "ENTER_SSID" ); + wifiPass = pref.getString( "wifiPass", "ENTER_PASSWORD" ); + + // REST API connection + // ---------------------------------------------------------------------------- + knxAddress = pref.getString( "knxAddr", "0.0.0.0" ); + knxPort = pref.getInt( "knxPort", knxPort ); + knxBrightPath = pref.getString( "knxBrightPath", "/rest/items/{item}/state" ); + knxBrightMin = pref.getLong( "knxBrightMin", knxBrightMin ); + knxBrightMax = pref.getLong( "knxBrightMax", knxBrightMax ); + knxTempPath = pref.getString( "knxTempPath", "/rest/items/{item}/state" ); + knxHumidPath = pref.getString( "knxHumPath", "/rest/items/{item}/state" ); + + // Edgelights + // ---------------------------------------------------------------------------- + edgeBrightIn = pref.getInt( "edgBrightIn", edgeBrightIn ); + edgeBrightMin = pref.getInt( "edgBrightMin", edgeBrightMin ); + edgeBrightMax = pref.getInt( "edgBrightMax", edgeBrightMax ); + edgeBrightOut = pref.getInt( "edgBrightOut", edgeBrightOut ); + edgeFrequency = pref.getInt( "edgeFrequency", edgeFrequency ); + + // Downlights + // -------------------------------------------------------------------------- + downSwitch = pref.getInt( "downSwitch", downSwitch ); + downBrightIn = pref.getInt( "downBrightIn", downBrightIn ); + downBrightMin = pref.getInt( "downBrightMin", downBrightMin ); + downBrightMax = pref.getInt( "downBrightMax", downBrightMax ); + downBrightOut = pref.getInt( "downBrightOut", downBrightOut ); + downFrequency = pref.getInt( "downFrequency", downFrequency ); + downColorMode = pref.getInt( "downColorMode", downColorMode ); + downColorR00 = pref.getInt( "downColorR00", 255 ); + downColorR01 = pref.getInt( "downColorR01", 255 ); + downColorR02 = pref.getInt( "downColorR02", 255 ); + downColorR03 = pref.getInt( "downColorR03", 255 ); + downColorR04 = pref.getInt( "downColorR04", 255 ); + downColorR05 = pref.getInt( "downColorR05", 255 ); + downColorR06 = pref.getInt( "downColorR06", 255 ); + downColorR07 = pref.getInt( "downColorR07", 255 ); + downColorR08 = pref.getInt( "downColorR08", 255 ); + downColorR09 = pref.getInt( "downColorR09", 255 ); + downColorR10 = pref.getInt( "downColorR10", 255 ); + downColorR11 = pref.getInt( "downColorR11", 255 ); + downColorR12 = pref.getInt( "downColorR12", 255 ); + downColorR13 = pref.getInt( "downColorR13", 255 ); + downColorR14 = pref.getInt( "downColorR14", 255 ); + downColorG00 = pref.getInt( "downColorG00", 255 ); + downColorG01 = pref.getInt( "downColorG01", 255 ); + downColorG02 = pref.getInt( "downColorG02", 255 ); + downColorG03 = pref.getInt( "downColorG03", 255 ); + downColorG04 = pref.getInt( "downColorG04", 255 ); + downColorG05 = pref.getInt( "downColorG05", 255 ); + downColorG06 = pref.getInt( "downColorG06", 255 ); + downColorG07 = pref.getInt( "downColorG07", 255 ); + downColorG08 = pref.getInt( "downColorG08", 255 ); + downColorG09 = pref.getInt( "downColorG09", 255 ); + downColorG10 = pref.getInt( "downColorG10", 255 ); + downColorG11 = pref.getInt( "downColorG11", 255 ); + downColorG12 = pref.getInt( "downColorG12", 255 ); + downColorG13 = pref.getInt( "downColorG13", 255 ); + downColorG14 = pref.getInt( "downColorG14", 255 ); + downColorB00 = pref.getInt( "downColorB00", 255 ); + downColorB01 = pref.getInt( "downColorB01", 255 ); + downColorB02 = pref.getInt( "downColorB02", 255 ); + downColorB03 = pref.getInt( "downColorB03", 255 ); + downColorB04 = pref.getInt( "downColorB04", 255 ); + downColorB05 = pref.getInt( "downColorB05", 255 ); + downColorB06 = pref.getInt( "downColorB06", 255 ); + downColorB07 = pref.getInt( "downColorB07", 255 ); + downColorB08 = pref.getInt( "downColorB08", 255 ); + downColorB09 = pref.getInt( "downColorB09", 255 ); + downColorB10 = pref.getInt( "downColorB10", 255 ); + downColorB11 = pref.getInt( "downColorB11", 255 ); + downColorB12 = pref.getInt( "downColorB12", 255 ); + downColorB13 = pref.getInt( "downColorB13", 255 ); + downColorB14 = pref.getInt( "downColorB14", 255 ); } /** * @brief SETUP - wifi - * @details initialize the access point and wifi client + * @details initialize and configure the access point and/or the wifi client * @since 1.0.0 */ void initWIFI() { - WiFi.mode( WIFI_AP_STA ); // set mode: access point & wifi client - // access point (ap) - apLocalIP = IPAddress( apIP1, apIP2, apIP3, apIP4 ); // ip - apGateway = IPAddress( apGW1, apGW2, apGW3, apGW4 ); // gateway - apSubnet = IPAddress( apSN1, apSN2, apSN3, apSN4 ); // subnet - WiFi.softAPConfig( apLocalIP, apGateway, apSubnet ); // config ap - WiFi.softAP( apSSID.c_str(), apPass.c_str(), 1, apHide ); // start ap - - if ( DEBUG ) { - Serial.println( "- Access point" ); - Serial.printf( " SSID: %s\n", WiFi.softAPSSID().c_str() ); - Serial.printf( " Pass: %s\n", apPass.c_str() ); - Serial.printf( " IP: %s\n", WiFi.softAPIP().toString().c_str() ); + Serial.println( "- WiFi" ); + + if ( apSwitch && wifiSwitch ) { + Serial.println( " ap & wifi" ); + WiFi.mode( WIFI_AP_STA ); // set mode: access point & wifi client + } else if ( apSwitch && !wifiSwitch ) { + Serial.println( " ap only" ); + WiFi.mode( WIFI_AP ); // set mode: access point only + } else if ( !apSwitch && wifiSwitch ) { + Serial.println( " wifi only" ); + WiFi.mode( WIFI_STA ); // set mode: wifi client only + } else { + Serial.println( " wifi off" ); + WiFi.mode( WIFI_OFF ); // set mode: turn off wifi } - // wifi client - if ( wifiDHCP ) { // if fixed ip used - wifiLocalIP = IPAddress( wifiIP1, wifiIP2, wifiIP3, wifiIP4 ); // ip - wifiGateway = IPAddress( wifiGW1, wifiGW2, wifiGW3, wifiGW4 ); // gateway - wifiSubnet = IPAddress( wifiSN1, wifiSN2, wifiSN3, wifiSN4 ); // subnet - WiFi.config( wifiLocalIP, wifiGateway, wifiSubnet ); // config wifi + // access point + if ( apSwitch ) { + // configure and start + apIPLocal = IPAddress( apIP1, apIP2, apIP3, 1 ); // ip address + apGateway = IPAddress( apIP1, apIP2, apIP3, 1 ); // gateway + apSubnet = IPAddress( 255, 255, 255, 0 ); // subnet + WiFi.softAPConfig( apIPLocal, apGateway, apSubnet ); // config ap + WiFi.softAP( apSSID.c_str(), apPass.c_str(), 1, apHidden ); // start ap } - WiFi.begin( wifiSSID.c_str(), wifiPass.c_str() ); // connect to wifi - for ( int i = 0; i < 10; i++ ) { // loop 10 times - delay( 200 ); // wait before each check - if ( WiFi.status() == WL_CONNECTED ) { // check if connected - wifiIP1 = WiFi.localIP()[ 0 ]; - wifiIP2 = WiFi.localIP()[ 1 ]; - wifiIP3 = WiFi.localIP()[ 2 ]; - wifiIP4 = WiFi.localIP()[ 3 ]; - wifiGW1 = WiFi.gatewayIP()[ 0 ]; - wifiGW2 = WiFi.gatewayIP()[ 1 ]; - wifiGW3 = WiFi.gatewayIP()[ 2 ]; - wifiGW4 = WiFi.gatewayIP()[ 3 ]; - wifiSN1 = WiFi.subnetMask()[ 0 ]; - wifiSN2 = WiFi.subnetMask()[ 1 ]; - wifiSN3 = WiFi.subnetMask()[ 2 ]; - wifiSN4 = WiFi.subnetMask()[ 3 ]; - if ( DEBUG ) { - Serial.println( "- WiFi client" ); - Serial.printf( " SSID: %s\n", WiFi.SSID().c_str() ); - Serial.printf( " IP: %s\n", WiFi.localIP().toString().c_str() ); + + // wifi client + if ( wifiSwitch ) { + // establish connection + WiFi.begin( wifiSSID.c_str(), wifiPass.c_str() ); // connect to wifi + for ( int i = 0; i < 10; i++ ) { // loop 10 times + delay( 200 ); // wait before each check + if ( WiFi.status() == WL_CONNECTED ) { // check if connected + break; // if connected, leave the cycle } - break; // if connected, leave the cycle } - } - if ( WiFi.status() != WL_CONNECTED ) { // if not connected - WiFi.disconnect(); // turn off wifi + if ( WiFi.status() != WL_CONNECTED ) { // if not connected + WiFi.disconnect(); // turn off wifi + } } } @@ -943,9 +901,7 @@ void initWIFI() { */ void initSPIFFS() { if ( SPIFFS.begin( true ) ) { - if ( DEBUG ) { - Serial.println( "- SPIFFS" ); - } + Serial.println( "- SPIFFS" ); } else { ESP.restart(); } @@ -957,6 +913,7 @@ void initSPIFFS() { * @since 1.0.0 */ void initNTP() { + Serial.println( "- NTP" ); if ( WiFi.status() == WL_CONNECTED ) { // connect NTP (0 TZ offset) configTime( 0, 0, clkAddress.c_str() ); @@ -977,247 +934,186 @@ void initNTP() { * @since 1.0.0 */ void initHANDLERS() { - // --> don't touch the following code + Serial.println( "- webHandler" ); // clang-format off - - // default - server.on( "/", HTTP_GET, []( AsyncWebServerRequest *request ) { request->send( SPIFFS, "/index.html", "text/html", false ); } ); + // Default + // -------------------------------------------------------------------------- + server.on( "/", HTTP_GET, []( AsyncWebServerRequest *request ) { request->send( SPIFFS, "/index.html", "text/html", false ); } ); + server.on( "/wifi", HTTP_GET, []( AsyncWebServerRequest *request ) { request->send( SPIFFS, "/wifi.html", "text/html", false ); } ); + server.on( "/settings", HTTP_GET, []( AsyncWebServerRequest *request ) { request->send( SPIFFS, "/settings.html", "text/html", false ); } ); // index.html - server.on( "/updateDisplayMode", HTTP_POST, []( AsyncWebServerRequest *request ) { displayMode = request->arg( "mode" ).toInt(); pref.putInt( "displayMode", displayMode ); if ( displayMode == 4 ) { scoLValue = request->arg( "data1" ).toInt(); scoRValue = request->arg( "data2" ).toInt(); } if (displayMode == 5 ) { couMillis = request->arg( "data1" ).toInt(); couMillisEnd = millis() + couMillis; } request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDownlight", HTTP_POST, []( AsyncWebServerRequest *request ) { downUsage = request->arg( "downlightUsage" ).toInt(); pref.putInt( "dowUsage", downUsage ); dowColor = request->arg( "downlightColor" ).toInt(); pref.putInt( "dowColor", dowColor ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - - // settings.html - // |- send - // | |- general settings - server.on( "/getEdgeBrightness", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( edgeBrightness ) ); } ); - server.on( "/getEdgeBrightnessMin", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( edgeBrightnessMin ) ); } ); - server.on( "/getEdgeBrightnessMax", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( edgeBrightnessMax ) ); } ); - server.on( "/getEdgeFrequency", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( edgeFrequency ) ); } ); - server.on( "/getDownlightUsage", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downUsage ) ); } ); - server.on( "/getDownlightBrightness", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downBrightness ) ); } ); - server.on( "/getDownlightBrightnessMin", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downBrightnessMin ) ); } ); - server.on( "/getDownlightBrightnessMax", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downBrightnessMax ) ); } ); - server.on( "/getDownlightFrequency", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downFrequency ) ); } ); - // | |- knx settings - server.on( "/getKNXAddress", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxAddress ) ); } ); - server.on( "/getKNXPort", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxPort ) ); } ); - server.on( "/getKNXBrightnessPath", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxBrightnessPath ) ); } ); - server.on( "/getKNXBrightnessMin", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxBrightnessMin ) ); } ); - server.on( "/getKNXBrightnessMax", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxBrightnessMax ) ); } ); - server.on( "/getKNXTemperaturePath", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxTemperaturePath ) ); } ); - server.on( "/getKNXHumidityPath", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxHumidityPath ) ); } ); - // | |- mode clock - server.on( "/getClkAddress", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkAddress ) ); } ); - server.on( "/getClkTimeZone", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkTimeZone ) ); } ); - server.on( "/getClkFormat", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkFormat ) ); } ); - server.on( "/getClkColor", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkColor ) ); } ); - server.on( "/getClkColorH", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", clkColorHR, clkColorHG, clkColorHB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getClkColorM", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", clkColorMR, clkColorMG, clkColorMB ); request->send( 200, "text/plain", tempcolor ); } ); - // | |- mode date - server.on( "/getDatFormat", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( datFormat ) ); } ); - server.on( "/getDatColor", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( datColor ) ); } ); - server.on( "/getDatColorD", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", datColorDR, datColorDG, datColorDB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDatColorM", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", datColorMR, datColorMG, datColorMB ); request->send( 200, "text/plain", tempcolor ); } ); - // | |- mode temperature - server.on( "/getTemSymbol", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( temSymbol ) ); } ); - // | |- mode humidity - server.on( "/getHumColor", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( humColor ) ); } ); - server.on( "/getHumColorA", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", humColorAR, humColorAG, humColorAB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getHumColorB", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", humColorBR, humColorBG, humColorBB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getHumColorC", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", humColorCR, humColorCG, humColorCB ); request->send( 200, "text/plain", tempcolor ); } ); - // | |- mode scoreboard - server.on( "/getScoColorL", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", scoColorLR, scoColorLG, scoColorLB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getScoColorR", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", scoColorRR, scoColorRG, scoColorRB ); request->send( 200, "text/plain", tempcolor ); } ); - // | |- mode countdown - server.on( "/getCouColorH", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", couColorHR, couColorHG, couColorHB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getCouColorM", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", couColorMR, couColorMG, couColorMB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getCouColorS", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", couColorSR, couColorSG, couColorSB ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getCouColorA", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", couColorAR, couColorAG, couColorAB ); request->send( 200, "text/plain", tempcolor ); } ); - // | |- mode scrolling - server.on( "/getScrTime", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( scrTime ) ); } ); - // | |- downlights - server.on( "/getDowColor", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( dowColor ) ); } ); - server.on( "/getDowColor0", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor0R, dowColor0G, dowColor0B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor1", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor1R, dowColor1G, dowColor1B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor2", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor2R, dowColor2G, dowColor2B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor3", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor3R, dowColor3G, dowColor3B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor4", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor4R, dowColor4G, dowColor4B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor5", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor5R, dowColor5G, dowColor5B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor6", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor6R, dowColor6G, dowColor6B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor7", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor7R, dowColor7G, dowColor7B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor8", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor8R, dowColor8G, dowColor8B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor9", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor9R, dowColor9G, dowColor9B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor10", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor10R, dowColor10G, dowColor10B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor11", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor11R, dowColor11G, dowColor11B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor12", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor12R, dowColor12G, dowColor12B ); request->send( 200, "text/plain", tempcolor ); } ); - server.on( "/getDowColor13", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", dowColor13R, dowColor13G, dowColor13B ); request->send( 200, "text/plain", tempcolor ); } ); - // |- receive - // | |- general settings - server.on( "/updateEdgeBrightness", HTTP_POST, []( AsyncWebServerRequest *request ) { edgeBrightness = request->arg( "edgeBrightness" ).toInt(); pref.putInt( "edgBright", edgeBrightness ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateEdgeBrightnessMin", HTTP_POST, []( AsyncWebServerRequest *request ) { edgeBrightnessMin = request->arg( "edgeBrightnessMin" ).toInt(); pref.putInt( "edgBrightMin", edgeBrightnessMin ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateEdgeBrightnessMax", HTTP_POST, []( AsyncWebServerRequest *request ) { edgeBrightnessMax = request->arg( "edgeBrightnessMax" ).toInt(); pref.putInt( "edgBrightMax", edgeBrightnessMax ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateEdgeFrequency", HTTP_POST, []( AsyncWebServerRequest *request ) { edgeFrequency = request->arg( "edgeFrequency" ).toInt(); pref.putInt( "edgColFreq", edgeFrequency ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDownlightUsage", HTTP_POST, []( AsyncWebServerRequest *request ) { downUsage = request->arg( "downUsage" ).toInt(); pref.putInt( "dowUsage", downUsage ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDownlightBrightness", HTTP_POST, []( AsyncWebServerRequest *request ) { downBrightness = request->arg( "downBrightness" ).toInt(); pref.putInt( "dowBright", downBrightness ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDownlightBrightnessMin", HTTP_POST, []( AsyncWebServerRequest *request ) { downBrightnessMin = request->arg( "downBrightnessMin" ).toInt(); pref.putInt( "dowBrightMin", downBrightnessMin ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDownlightBrightnessMax", HTTP_POST, []( AsyncWebServerRequest *request ) { downBrightnessMax = request->arg( "downBrightnessMax" ).toInt(); pref.putInt( "dowBrightMax", downBrightnessMax ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDownlightFrequency", HTTP_POST, []( AsyncWebServerRequest *request ) { downFrequency = request->arg( "downFrequency" ).toInt(); pref.putInt( "dowColFreq", downFrequency ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // | |- knx settings - server.on( "/updateKNXAddress", HTTP_POST, []( AsyncWebServerRequest *request ) { knxAddress = request->arg( "knxAddress" ); pref.putString( "knxAddr", knxAddress ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateKNXPort", HTTP_POST, []( AsyncWebServerRequest *request ) { knxPort = request->arg( "knxPort" ).toInt(); pref.putInt( "knxPort", knxPort ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateKNXBrightnessPath", HTTP_POST, []( AsyncWebServerRequest *request ) { knxBrightnessPath = request->arg( "knxBrightnessPath" ); pref.putString( "knxBrightPath", knxBrightnessPath ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); - server.on( "/updateKNXBrightnessMin", HTTP_POST, []( AsyncWebServerRequest *request ) { knxBrightnessMin = request->arg( "knxBrightnessMin" ).toInt(); pref.putInt( "knxBrightMin", knxBrightnessMin ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); - server.on( "/updateKNXBrightnessMax", HTTP_POST, []( AsyncWebServerRequest *request ) { knxBrightnessMax = request->arg( "knxBrightnessMax" ).toInt(); pref.putInt( "knxBrightMax", knxBrightnessMax ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); - server.on( "/updateKNXTemperaturePath", HTTP_POST, []( AsyncWebServerRequest *request ) { knxTemperaturePath = request->arg( "knxTemperaturePath" ); pref.putString( "knxTempPath", knxTemperaturePath ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXtemperature(); } ); - server.on( "/updateKNXHumidityPath", HTTP_POST, []( AsyncWebServerRequest *request ) { knxHumidityPath = request->arg( "knxHumidityPath" ); pref.putString( "knxHumPath", knxHumidityPath ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXhumidity(); } ); - // | |- mode clock - server.on( "/updateClkAddress", HTTP_POST, []( AsyncWebServerRequest *request ) { clkAddress = request->arg( "clkAddress" ); pref.putString( "clkAddr", clkAddress ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateClkTimeZone", HTTP_POST, []( AsyncWebServerRequest *request ) { clkTimeZone = request->arg( "clkTimeZone" ); pref.putString( "clkZone", clkTimeZone ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateClkFormat", HTTP_POST, []( AsyncWebServerRequest *request ) { clkFormat = request->arg( "clkFormat" ).toInt(); pref.putInt( "clkFormat", clkFormat ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateClkColor", HTTP_POST, []( AsyncWebServerRequest *request ) { clkColor = request->arg( "clkColor" ).toInt(); pref.putInt( "clkColor", clkColor ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateClkColorH", HTTP_POST, []( AsyncWebServerRequest *request ) { clkColorHR = request->arg( "r" ).toInt(); pref.putInt( "clkColorHR", clkColorHR ); clkColorHG = request->arg( "g" ).toInt(); pref.putInt( "clkColorHG", clkColorHG ); clkColorHB = request->arg( "b" ).toInt(); pref.putInt( "clkColorHB", clkColorHB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateClkColorM", HTTP_POST, []( AsyncWebServerRequest *request ) { clkColorMR = request->arg( "r" ).toInt(); pref.putInt( "clkColorMR", clkColorMR ); clkColorMG = request->arg( "g" ).toInt(); pref.putInt( "clkColorMG", clkColorMG ); clkColorMB = request->arg( "b" ).toInt(); pref.putInt( "clkColorMB", clkColorMB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // | |- mode date - server.on( "/updateDatFormat", HTTP_POST, []( AsyncWebServerRequest *request ) { datFormat = request->arg( "datFormat" ).toInt(); pref.putInt( "datFormat", datFormat ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDatColor", HTTP_POST, []( AsyncWebServerRequest *request ) { datColor = request->arg( "datColor" ).toInt(); pref.putInt( "datColor", datColor ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDatColorD", HTTP_POST, []( AsyncWebServerRequest *request ) { datColorDR = request->arg( "r" ).toInt(); pref.putInt( "datColorDR", datColorDR ); datColorDG = request->arg( "g" ).toInt(); pref.putInt( "datColorDG", datColorDG ); datColorDB = request->arg( "b" ).toInt(); pref.putInt( "datColorDB", datColorDB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDatColorM", HTTP_POST, []( AsyncWebServerRequest *request ) { datColorMR = request->arg( "r" ).toInt(); pref.putInt( "datColorMR", datColorMR ); datColorMG = request->arg( "g" ).toInt(); pref.putInt( "datColorMG", datColorMG ); datColorMB = request->arg( "b" ).toInt(); pref.putInt( "datColorMB", datColorMB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // | |- mode temperature - server.on( "/updateTemSymbol", HTTP_POST, []( AsyncWebServerRequest *request ) { temSymbol = request->arg( "temSymbol" ).toInt(); pref.putInt( "temSymbol", temSymbol ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // | |- mode humidity - server.on( "/updateHumColor", HTTP_POST, []( AsyncWebServerRequest *request ) { humColor = request->arg( "humColor" ).toInt(); pref.putInt( "humColor", humColor ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateHumColorA", HTTP_POST, []( AsyncWebServerRequest *request ) { humColorAR = request->arg( "r" ).toInt(); pref.putInt( "humColorAR", humColorAR ); humColorAG = request->arg( "g" ).toInt(); pref.putInt( "humColorAG", humColorAG ); humColorAB = request->arg( "b" ).toInt(); pref.putInt( "humColorAB", humColorAB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateHumColorB", HTTP_POST, []( AsyncWebServerRequest *request ) { humColorBR = request->arg( "r" ).toInt(); pref.putInt( "humColorBR", humColorBR ); humColorBG = request->arg( "g" ).toInt(); pref.putInt( "humColorBG", humColorBG ); humColorBB = request->arg( "b" ).toInt(); pref.putInt( "humColorBB", humColorBB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateHumColorC", HTTP_POST, []( AsyncWebServerRequest *request ) { humColorCR = request->arg( "r" ).toInt(); pref.putInt( "humColorCR", humColorCR ); humColorCG = request->arg( "g" ).toInt(); pref.putInt( "humColorCG", humColorCG ); humColorCB = request->arg( "b" ).toInt(); pref.putInt( "humColorCB", humColorCB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // | |- mode scoreboard - server.on( "/updateScoColorL", HTTP_POST, []( AsyncWebServerRequest *request ) { scoColorLR = request->arg( "r" ).toInt(); pref.putInt( "scoColorLR", scoColorLR ); scoColorLG = request->arg( "g" ).toInt(); pref.putInt( "scoColorLG", scoColorLG ); scoColorLB = request->arg( "b" ).toInt(); pref.putInt( "scoColorLB", scoColorLB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateScoColorR", HTTP_POST, []( AsyncWebServerRequest *request ) { scoColorRR = request->arg( "r" ).toInt(); pref.putInt( "scoColorRR", scoColorRR ); scoColorRG = request->arg( "g" ).toInt(); pref.putInt( "scoColorRG", scoColorRG ); scoColorRB = request->arg( "b" ).toInt(); pref.putInt( "scoColorRB", scoColorRB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // | |- mode countdown - server.on( "/updateCouColorH", HTTP_POST, []( AsyncWebServerRequest *request ) { couColorHR = request->arg( "r" ).toInt(); pref.putInt( "couColorHR", couColorHR ); couColorHG = request->arg( "g" ).toInt(); pref.putInt( "couColorHG", couColorHG ); couColorHB = request->arg( "b" ).toInt(); pref.putInt( "couColorHB", couColorHB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateCouColorM", HTTP_POST, []( AsyncWebServerRequest *request ) { couColorMR = request->arg( "r" ).toInt(); pref.putInt( "couColorMR", couColorMR ); couColorMG = request->arg( "g" ).toInt(); pref.putInt( "couColorMG", couColorMG ); couColorMB = request->arg( "b" ).toInt(); pref.putInt( "couColorMB", couColorMB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateCouColorS", HTTP_POST, []( AsyncWebServerRequest *request ) { couColorSR = request->arg( "r" ).toInt(); pref.putInt( "couColorSR", couColorSR ); couColorSG = request->arg( "g" ).toInt(); pref.putInt( "couColorSG", couColorSG ); couColorSB = request->arg( "b" ).toInt(); pref.putInt( "couColorSB", couColorSB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateCouColorA", HTTP_POST, []( AsyncWebServerRequest *request ) { couColorAR = request->arg( "r" ).toInt(); pref.putInt( "couColorAR", couColorAR ); couColorAG = request->arg( "g" ).toInt(); pref.putInt( "couColorAG", couColorAG ); couColorAB = request->arg( "b" ).toInt(); pref.putInt( "couColorAB", couColorAB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // | |- mode scrolling - server.on( "/updateScrTime", HTTP_POST, []( AsyncWebServerRequest *request ) { scrTime = request->arg( "scrTime" ).toInt(); pref.putInt( "scrTime", scrTime ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // | |- downlights - server.on( "/updateDowColor", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor = request->arg( "dowColor" ).toInt(); pref.putInt( "dowColor", dowColor ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColorR = request->arg( "r" ).toInt(); pref.putInt( "dowColorR", dowColorR ); dowColorG = request->arg( "g" ).toInt(); pref.putInt( "dowColorG", dowColorG ); dowColorB = request->arg( "b" ).toInt(); pref.putInt( "dowColorB", dowColorB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor0", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor0R = request->arg( "r" ).toInt(); pref.putInt( "dowColor0R", dowColor0R ); dowColor0G = request->arg( "g" ).toInt(); pref.putInt( "dowColor0G", dowColor0G ); dowColor0B = request->arg( "b" ).toInt(); pref.putInt( "dowColor0B", dowColor0B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor1", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor1R = request->arg( "r" ).toInt(); pref.putInt( "dowColor1R", dowColor1R ); dowColor1G = request->arg( "g" ).toInt(); pref.putInt( "dowColor1G", dowColor1G ); dowColor1B = request->arg( "b" ).toInt(); pref.putInt( "dowColor1B", dowColor1B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor2", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor2R = request->arg( "r" ).toInt(); pref.putInt( "dowColor2R", dowColor2R ); dowColor2G = request->arg( "g" ).toInt(); pref.putInt( "dowColor2G", dowColor2G ); dowColor2B = request->arg( "b" ).toInt(); pref.putInt( "dowColor2B", dowColor2B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor3", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor3R = request->arg( "r" ).toInt(); pref.putInt( "dowColor3R", dowColor3R ); dowColor3G = request->arg( "g" ).toInt(); pref.putInt( "dowColor3G", dowColor3G ); dowColor3B = request->arg( "b" ).toInt(); pref.putInt( "dowColor3B", dowColor3B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor4", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor4R = request->arg( "r" ).toInt(); pref.putInt( "dowColor4R", dowColor4R ); dowColor4G = request->arg( "g" ).toInt(); pref.putInt( "dowColor4G", dowColor4G ); dowColor4B = request->arg( "b" ).toInt(); pref.putInt( "dowColor4B", dowColor4B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor5", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor5R = request->arg( "r" ).toInt(); pref.putInt( "dowColor5R", dowColor5R ); dowColor5G = request->arg( "g" ).toInt(); pref.putInt( "dowColor5G", dowColor5G ); dowColor5B = request->arg( "b" ).toInt(); pref.putInt( "dowColor5B", dowColor5B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor6", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor6R = request->arg( "r" ).toInt(); pref.putInt( "dowColor6R", dowColor6R ); dowColor6G = request->arg( "g" ).toInt(); pref.putInt( "dowColor6G", dowColor6G ); dowColor6B = request->arg( "b" ).toInt(); pref.putInt( "dowColor6B", dowColor6B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor7", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor7R = request->arg( "r" ).toInt(); pref.putInt( "dowColor7R", dowColor7R ); dowColor7G = request->arg( "g" ).toInt(); pref.putInt( "dowColor7G", dowColor7G ); dowColor7B = request->arg( "b" ).toInt(); pref.putInt( "dowColor7B", dowColor7B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor8", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor8R = request->arg( "r" ).toInt(); pref.putInt( "dowColor8R", dowColor8R ); dowColor8G = request->arg( "g" ).toInt(); pref.putInt( "dowColor8G", dowColor8G ); dowColor8B = request->arg( "b" ).toInt(); pref.putInt( "dowColor8B", dowColor8B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor9", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor9R = request->arg( "r" ).toInt(); pref.putInt( "dowColor9R", dowColor9R ); dowColor9G = request->arg( "g" ).toInt(); pref.putInt( "dowColor9G", dowColor9G ); dowColor9B = request->arg( "b" ).toInt(); pref.putInt( "dowColor9B", dowColor9B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor10", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor10R = request->arg( "r" ).toInt(); pref.putInt( "dowColor10R", dowColor10R ); dowColor10G = request->arg( "g" ).toInt(); pref.putInt( "dowColor10G", dowColor10G ); dowColor10B = request->arg( "b" ).toInt(); pref.putInt( "dowColor10B", dowColor10B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor11", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor11R = request->arg( "r" ).toInt(); pref.putInt( "dowColor11R", dowColor11R ); dowColor11G = request->arg( "g" ).toInt(); pref.putInt( "dowColor11G", dowColor11G ); dowColor11B = request->arg( "b" ).toInt(); pref.putInt( "dowColor11B", dowColor11B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor12", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor12R = request->arg( "r" ).toInt(); pref.putInt( "dowColor12R", dowColor12R ); dowColor12G = request->arg( "g" ).toInt(); pref.putInt( "dowColor12G", dowColor12G ); dowColor12B = request->arg( "b" ).toInt(); pref.putInt( "dowColor12B", dowColor12B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateDowColor13", HTTP_POST, []( AsyncWebServerRequest *request ) { dowColor13R = request->arg( "r" ).toInt(); pref.putInt( "dowColor13R", dowColor13R ); dowColor13G = request->arg( "g" ).toInt(); pref.putInt( "dowColor13G", dowColor13G ); dowColor13B = request->arg( "b" ).toInt(); pref.putInt( "dowColor13B", dowColor13B ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - - // wifi.html - // | send - // | |- access point - server.on( "/getAPConfig", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apConfig ) ); } ); - server.on( "/getAPSSID", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSSID ) ); } ); - server.on( "/getAPPass", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apPass ) ); } ); - server.on( "/getAPHide", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apHide ) ); } ); - server.on( "/getAPIP1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP1 ) ); } ); - server.on( "/getAPIP2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP2 ) ); } ); - server.on( "/getAPIP3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP3 ) ); } ); - server.on( "/getAPIP4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP4 ) ); } ); - server.on( "/getAPGW1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apGW1 ) ); } ); - server.on( "/getAPGW2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apGW2 ) ); } ); - server.on( "/getAPGW3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apGW3 ) ); } ); - server.on( "/getAPGW4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apGW4 ) ); } ); - server.on( "/getAPSN1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSN1 ) ); } ); - server.on( "/getAPSN2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSN2 ) ); } ); - server.on( "/getAPSN3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSN3 ) ); } ); - server.on( "/getAPSN4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSN4 ) ); } ); - // | |- wifi client - server.on( "/getWifiConfig", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiConfig ) ); } ); - server.on( "/getWifiSSID", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSSID ) ); } ); - server.on( "/getWifiPass", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiPass ) ); } ); - server.on( "/getWifiDHCP", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiDHCP ) ); } ); - server.on( "/getWifiIP1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiIP1 ) ); } ); - server.on( "/getWifiIP2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiIP2 ) ); } ); - server.on( "/getWifiIP3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiIP3 ) ); } ); - server.on( "/getWifiIP4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiIP4 ) ); } ); - server.on( "/getWifiGW1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiGW1 ) ); } ); - server.on( "/getWifiGW2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiGW2 ) ); } ); - server.on( "/getWifiGW3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiGW3 ) ); } ); - server.on( "/getWifiGW4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiGW4 ) ); } ); - server.on( "/getWifiSN1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSN1 ) ); } ); - server.on( "/getWifiSN2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSN2 ) ); } ); - server.on( "/getWifiSN3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSN3 ) ); } ); - server.on( "/getWifiSN4", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSN4 ) ); } ); - // | receive - // | |- access point - server.on( "/updateAPConfig", HTTP_POST, []( AsyncWebServerRequest *request ) { apConfig = request->arg( "apConfig" ); pref.putInt( "apConfig", apConfig ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPSSID", HTTP_POST, []( AsyncWebServerRequest *request ) { apSSID = request->arg( "apSSID" ); pref.putString( "apSSID", apSSID ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPPass", HTTP_POST, []( AsyncWebServerRequest *request ) { apPass = request->arg( "apPass" ); pref.putString( "apPass", apPass ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPHide", HTTP_POST, []( AsyncWebServerRequest *request ) { apHide = request->arg( "apHide" ).toInt(); pref.putInt( "apHide", apHide ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPIP1", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP1 = request->arg( "apIP1" ).toInt(); pref.putInt( "apIP1", apIP1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPIP2", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP2 = request->arg( "apIP2" ).toInt(); pref.putInt( "apIP2", apIP2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPIP3", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP3 = request->arg( "apIP3" ).toInt(); pref.putInt( "apIP3", apIP3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPIP4", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP4 = request->arg( "apIP4" ).toInt(); pref.putInt( "apIP4", apIP4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPGW1", HTTP_POST, []( AsyncWebServerRequest *request ) { apGW1 = request->arg( "apGW1" ).toInt(); pref.putInt( "apGW1", apGW1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPGW2", HTTP_POST, []( AsyncWebServerRequest *request ) { apGW2 = request->arg( "apGW2" ).toInt(); pref.putInt( "apGW2", apGW2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPGW3", HTTP_POST, []( AsyncWebServerRequest *request ) { apGW3 = request->arg( "apGW3" ).toInt(); pref.putInt( "apGW3", apGW3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPGW4", HTTP_POST, []( AsyncWebServerRequest *request ) { apGW4 = request->arg( "apGW4" ).toInt(); pref.putInt( "apGW4", apGW4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPSN1", HTTP_POST, []( AsyncWebServerRequest *request ) { apSN1 = request->arg( "apSN1" ).toInt(); pref.putInt( "apSN1", apSN1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPSN2", HTTP_POST, []( AsyncWebServerRequest *request ) { apSN2 = request->arg( "apSN2" ).toInt(); pref.putInt( "apSN2", apSN2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPSN3", HTTP_POST, []( AsyncWebServerRequest *request ) { apSN3 = request->arg( "apSN3" ).toInt(); pref.putInt( "apSN3", apSN3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPSN4", HTTP_POST, []( AsyncWebServerRequest *request ) { apSN4 = request->arg( "apSN4" ).toInt(); pref.putInt( "apSN4", apSN4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateAPrestart", HTTP_POST, []( AsyncWebServerRequest *request ) { getAP(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - // | |- wifi client - server.on( "/updateWifiConfig", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiConfig = request->arg( "wifiConfig" ); pref.putInt( "wifiConfig", wifiConfig ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiSSID", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSSID = request->arg( "wifiSSID" ); pref.putString( "wifiSSID", wifiSSID ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiPass", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiPass = request->arg( "wifiPass" ); pref.putString( "wifiPass", wifiPass ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiDHCP", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiDHCP = request->arg( "wifiDHCP" ).toInt(); pref.putInt( "wifiDHCP", wifiDHCP ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiIP1", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiIP1 = request->arg( "wifiIP1" ).toInt(); pref.putInt( "wifiIP1", wifiIP1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiIP2", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiIP2 = request->arg( "wifiIP2" ).toInt(); pref.putInt( "wifiIP2", wifiIP2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiIP3", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiIP3 = request->arg( "wifiIP3" ).toInt(); pref.putInt( "wifiIP3", wifiIP3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiIP4", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiIP4 = request->arg( "wifiIP4" ).toInt(); pref.putInt( "wifiIP4", wifiIP4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiGW1", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiGW1 = request->arg( "wifiGW1" ).toInt(); pref.putInt( "wifiGW1", wifiGW1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiGW2", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiGW2 = request->arg( "wifiGW2" ).toInt(); pref.putInt( "wifiGW2", wifiGW2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiGW3", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiGW3 = request->arg( "wifiGW3" ).toInt(); pref.putInt( "wifiGW3", wifiGW3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiGW4", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiGW4 = request->arg( "wifiGW4" ).toInt(); pref.putInt( "wifiGW4", wifiGW4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiSN1", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSN1 = request->arg( "wifiSN1" ).toInt(); pref.putInt( "wifiSN1", wifiSN1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiSN2", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSN2 = request->arg( "wifiSN2" ).toInt(); pref.putInt( "wifiSN2", wifiSN2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiSN3", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSN3 = request->arg( "wifiSN3" ).toInt(); pref.putInt( "wifiSN3", wifiSN3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiSN4", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSN4 = request->arg( "wifiSN4" ).toInt(); pref.putInt( "wifiSN4", wifiSN4 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - server.on( "/updateWifiRestart", HTTP_POST, []( AsyncWebServerRequest *request ) { getWIFI(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); - - // help.html - // |- date & time - server.on( "/updateDateTime", HTTP_POST, []( AsyncWebServerRequest *request ) { - int yeararg = request->arg( "year" ).toInt(); - int montharg = request->arg( "month" ).toInt(); - int dayarg = request->arg( "day" ).toInt(); - int hourarg = request->arg( "hour" ).toInt(); - int minarg = request->arg( "min" ).toInt(); - int secarg = request->arg( "sec" ).toInt(); - ntpTime.tm_year = yeararg - 1900; - ntpTime.tm_mon = montharg - 1; - ntpTime.tm_mday = dayarg; - ntpTime.tm_hour = hourarg; - ntpTime.tm_min = minarg; - ntpTime.tm_sec = secarg; - time_t t = mktime( &ntpTime ); - struct timeval now1 = { .tv_sec = t }; - settimeofday( &now1, NULL ); - request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); - } ); - // |- resets - server.on( "/resetFlash", HTTP_POST, []( AsyncWebServerRequest *request ) { request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); pref.clear(); ESP.restart(); } ); - server.on( "/resetESP", HTTP_POST, []( AsyncWebServerRequest *request ) { - request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); - ESP.restart(); - } ); + // -------------------------------------------------------------------------- + server.on( "/updDisplayMode", HTTP_POST, []( AsyncWebServerRequest *request ) { displayModePrev = displayMode; displayMode = request->arg( "mode" ).toInt(); pref.putInt( "displayMode", displayMode ); if ( displayMode == 4 ) { scoL = request->arg( "data1" ).toInt(); scoR = request->arg( "data2" ).toInt(); } if (displayMode == 5 ) { couMillis = request->arg( "data1" ).toInt(); couMillisEnd = millis() + couMillis; } request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updDownlight", HTTP_POST, []( AsyncWebServerRequest *request ) { downSwitch = request->arg( "downSwitch" ).toInt(); pref.putInt( "downSwitch", downSwitch ); downColorMode = request->arg( "downColorMode" ).toInt(); pref.putInt( "downColorMode", downColorMode ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + + // WiFi + // -------------------------------------------------------------------------- + server.on( "/getAPSwitch", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSwitch ) ); } ); + server.on( "/updAPSwitch", HTTP_POST, []( AsyncWebServerRequest *request ) { if ( request->arg( "apSwitch" ) == "true" ) { apSwitch = 1; } if ( request->arg( "apSwitch" ) == "false" ) { apSwitch = 0; } pref.putInt( "apSwitch", apSwitch ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getAPSSID", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apSSID ) ); } ); + server.on( "/updAPSSID", HTTP_POST, []( AsyncWebServerRequest *request ) { apSSID = request->arg( "apSSID" ); pref.putString( "apSSID", apSSID ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getAPPass", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apPass ) ); } ); + server.on( "/updAPPass", HTTP_POST, []( AsyncWebServerRequest *request ) { apPass = request->arg( "apPass" ); pref.putString( "apPass", apPass ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getAPHidden", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apHidden ) ); } ); + server.on( "/updAPHidden", HTTP_POST, []( AsyncWebServerRequest *request ) { apHidden = request->arg( "apHidden" ).toInt(); pref.putInt( "apHidden", apHidden ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getAPIP1", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP1 ) ); } ); + server.on( "/updAPIP1", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP1 = request->arg( "apIP1" ).toInt(); pref.putInt( "apIP1", apIP1 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getAPIP2", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP2 ) ); } ); + server.on( "/updAPIP2", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP2 = request->arg( "apIP2" ).toInt(); pref.putInt( "apIP2", apIP2 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getAPIP3", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( apIP3 ) ); } ); + server.on( "/updAPIP3", HTTP_POST, []( AsyncWebServerRequest *request ) { apIP3 = request->arg( "apIP3" ).toInt(); pref.putInt( "apIP3", apIP3 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getWifiSwitch", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSwitch ) ); } ); + server.on( "/updWifiSwitch", HTTP_POST, []( AsyncWebServerRequest *request ) { if ( request->arg( "wifiSwitch" ) == "true" ) { wifiSwitch = 1; } if ( request->arg( "wifiSwitch" ) == "false" ) { wifiSwitch = 0; } pref.putInt( "wifiSwitch", wifiSwitch ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getWifiSSID", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiSSID ) ); } ); + server.on( "/updWifiSSID", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiSSID = request->arg( "wifiSSID" ); pref.putString( "wifiSSID", wifiSSID ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getWifiPass", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( wifiPass ) ); } ); + server.on( "/updWifiPass", HTTP_POST, []( AsyncWebServerRequest *request ) { wifiPass = request->arg( "wifiPass" ); pref.putString( "wifiPass", wifiPass ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updWifiRestart", HTTP_POST, []( AsyncWebServerRequest *request ) { initWIFI(); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + + // MODE clock + // -------------------------------------------------------------------------- + server.on( "/getClkAddress", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkAddress ) ); } ); + server.on( "/updClkAddress", HTTP_POST, []( AsyncWebServerRequest *request ) { clkAddress = request->arg( "clkAddress" ); pref.putString( "clkAddr", clkAddress ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getClkTimeZone", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkTimeZone ) ); } ); + server.on( "/updClkTimeZone", HTTP_POST, []( AsyncWebServerRequest *request ) { clkTimeZone = request->arg( "clkTimeZone" ); pref.putString( "clkZone", clkTimeZone ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getClkFormat", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkFormat ) ); } ); + server.on( "/updClkFormat", HTTP_POST, []( AsyncWebServerRequest *request ) { clkFormat = request->arg( "clkFormat" ).toInt(); pref.putInt( "clkFormat", clkFormat ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getClkColor", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( clkColor ) ); } ); + server.on( "/updClkColor", HTTP_POST, []( AsyncWebServerRequest *request ) { clkColor = request->arg( "clkColor" ).toInt(); pref.putInt( "clkColor", clkColor ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getClkColorH", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", clkColorHR, clkColorHG, clkColorHB ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updClkColorH", HTTP_POST, []( AsyncWebServerRequest *request ) { clkColorHR = request->arg( "r" ).toInt(); pref.putInt( "clkColorHR", clkColorHR ); clkColorHG = request->arg( "g" ).toInt(); pref.putInt( "clkColorHG", clkColorHG ); clkColorHB = request->arg( "b" ).toInt(); pref.putInt( "clkColorHB", clkColorHB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getClkColorM", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", clkColorMR, clkColorMG, clkColorMB ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updClkColorM", HTTP_POST, []( AsyncWebServerRequest *request ) { clkColorMR = request->arg( "r" ).toInt(); pref.putInt( "clkColorMR", clkColorMR ); clkColorMG = request->arg( "g" ).toInt(); pref.putInt( "clkColorMG", clkColorMG ); clkColorMB = request->arg( "b" ).toInt(); pref.putInt( "clkColorMB", clkColorMB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + + // MODE date + // -------------------------------------------------------------------------- + server.on( "/getDatFormat", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( datFormat ) ); } ); + server.on( "/getDatColor", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( datColor ) ); } ); + server.on( "/getDatColorD", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", datColorDR, datColorDG, datColorDB ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/getDatColorM", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", datColorMR, datColorMG, datColorMB ); request->send( 200, "text/plain", tempcolor ); } ); + + server.on( "/updDatFormat", HTTP_POST, []( AsyncWebServerRequest *request ) { datFormat = request->arg( "datFormat" ).toInt(); pref.putInt( "datFormat", datFormat ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updDatColor", HTTP_POST, []( AsyncWebServerRequest *request ) { datColor = request->arg( "datColor" ).toInt(); pref.putInt( "datColor", datColor ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updDatColorD", HTTP_POST, []( AsyncWebServerRequest *request ) { datColorDR = request->arg( "r" ).toInt(); pref.putInt( "datColorDR", datColorDR ); datColorDG = request->arg( "g" ).toInt(); pref.putInt( "datColorDG", datColorDG ); datColorDB = request->arg( "b" ).toInt(); pref.putInt( "datColorDB", datColorDB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updDatColorM", HTTP_POST, []( AsyncWebServerRequest *request ) { datColorMR = request->arg( "r" ).toInt(); pref.putInt( "datColorMR", datColorMR ); datColorMG = request->arg( "g" ).toInt(); pref.putInt( "datColorMG", datColorMG ); datColorMB = request->arg( "b" ).toInt(); pref.putInt( "datColorMB", datColorMB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + + // MODE temperature + // -------------------------------------------------------------------------- + server.on( "/getTemSymbol", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( temSymbol ) ); } ); + server.on( "/updTemSymbol", HTTP_POST, []( AsyncWebServerRequest *request ) { temSymbol = request->arg( "temSymbol" ).toInt(); pref.putInt( "temSymbol", temSymbol ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + + // MODE humidity + // -------------------------------------------------------------------------- + server.on( "/getHumColor", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( humColor ) ); } ); + server.on( "/getHumColorA", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", humColorAR, humColorAG, humColorAB ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/getHumColorB", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", humColorBR, humColorBG, humColorBB ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/getHumColorC", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", humColorCR, humColorCG, humColorCB ); request->send( 200, "text/plain", tempcolor ); } ); + + server.on( "/updHumColor", HTTP_POST, []( AsyncWebServerRequest *request ) { humColor = request->arg( "humColor" ).toInt(); pref.putInt( "humColor", humColor ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updHumColorA", HTTP_POST, []( AsyncWebServerRequest *request ) { humColorAR = request->arg( "r" ).toInt(); pref.putInt( "humColorAR", humColorAR ); humColorAG = request->arg( "g" ).toInt(); pref.putInt( "humColorAG", humColorAG ); humColorAB = request->arg( "b" ).toInt(); pref.putInt( "humColorAB", humColorAB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updHumColorB", HTTP_POST, []( AsyncWebServerRequest *request ) { humColorBR = request->arg( "r" ).toInt(); pref.putInt( "humColorBR", humColorBR ); humColorBG = request->arg( "g" ).toInt(); pref.putInt( "humColorBG", humColorBG ); humColorBB = request->arg( "b" ).toInt(); pref.putInt( "humColorBB", humColorBB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updHumColorC", HTTP_POST, []( AsyncWebServerRequest *request ) { humColorCR = request->arg( "r" ).toInt(); pref.putInt( "humColorCR", humColorCR ); humColorCG = request->arg( "g" ).toInt(); pref.putInt( "humColorCG", humColorCG ); humColorCB = request->arg( "b" ).toInt(); pref.putInt( "humColorCB", humColorCB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + + // MODE scoreboard + // -------------------------------------------------------------------------- + server.on( "/getScoColorL", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", scoColorLR, scoColorLG, scoColorLB ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/getScoColorR", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", scoColorRR, scoColorRG, scoColorRB ); request->send( 200, "text/plain", tempcolor ); } ); + + server.on( "/updScoColorL", HTTP_POST, []( AsyncWebServerRequest *request ) { scoColorLR = request->arg( "r" ).toInt(); pref.putInt( "scoColorLR", scoColorLR ); scoColorLG = request->arg( "g" ).toInt(); pref.putInt( "scoColorLG", scoColorLG ); scoColorLB = request->arg( "b" ).toInt(); pref.putInt( "scoColorLB", scoColorLB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updScoColorR", HTTP_POST, []( AsyncWebServerRequest *request ) { scoColorRR = request->arg( "r" ).toInt(); pref.putInt( "scoColorRR", scoColorRR ); scoColorRG = request->arg( "g" ).toInt(); pref.putInt( "scoColorRG", scoColorRG ); scoColorRB = request->arg( "b" ).toInt(); pref.putInt( "scoColorRB", scoColorRB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + + // MODE countdown + // -------------------------------------------------------------------------- + server.on( "/getCouColorH", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", couColorHR, couColorHG, couColorHB ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/getCouColorM", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", couColorMR, couColorMG, couColorMB ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/getCouColorS", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", couColorSR, couColorSG, couColorSB ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/getCouColorA", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", couColorAR, couColorAG, couColorAB ); request->send( 200, "text/plain", tempcolor ); } ); + + server.on( "/updCouColorH", HTTP_POST, []( AsyncWebServerRequest *request ) { couColorHR = request->arg( "r" ).toInt(); pref.putInt( "couColorHR", couColorHR ); couColorHG = request->arg( "g" ).toInt(); pref.putInt( "couColorHG", couColorHG ); couColorHB = request->arg( "b" ).toInt(); pref.putInt( "couColorHB", couColorHB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updCouColorM", HTTP_POST, []( AsyncWebServerRequest *request ) { couColorMR = request->arg( "r" ).toInt(); pref.putInt( "couColorMR", couColorMR ); couColorMG = request->arg( "g" ).toInt(); pref.putInt( "couColorMG", couColorMG ); couColorMB = request->arg( "b" ).toInt(); pref.putInt( "couColorMB", couColorMB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updCouColorS", HTTP_POST, []( AsyncWebServerRequest *request ) { couColorSR = request->arg( "r" ).toInt(); pref.putInt( "couColorSR", couColorSR ); couColorSG = request->arg( "g" ).toInt(); pref.putInt( "couColorSG", couColorSG ); couColorSB = request->arg( "b" ).toInt(); pref.putInt( "couColorSB", couColorSB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/updCouColorA", HTTP_POST, []( AsyncWebServerRequest *request ) { couColorAR = request->arg( "r" ).toInt(); pref.putInt( "couColorAR", couColorAR ); couColorAG = request->arg( "g" ).toInt(); pref.putInt( "couColorAG", couColorAG ); couColorAB = request->arg( "b" ).toInt(); pref.putInt( "couColorAB", couColorAB ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + + // MODE scrolling + // -------------------------------------------------------------------------- + server.on( "/getScrTime", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( scrTime ) ); } ); + server.on( "/updScrTime", HTTP_POST, []( AsyncWebServerRequest *request ) { scrTime = request->arg( "scrTime" ).toInt(); pref.putInt( "scrTime", scrTime ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + + // REST API connect + // -------------------------------------------------------------------------- + server.on( "/getKNXAddress", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxAddress ) ); } ); + server.on( "/updKNXAddress", HTTP_POST, []( AsyncWebServerRequest *request ) { knxAddress = request->arg( "knxAddress" ); pref.putString( "knxAddr", knxAddress ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getKNXPort", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxPort ) ); } ); + server.on( "/updKNXPort", HTTP_POST, []( AsyncWebServerRequest *request ) { knxPort = request->arg( "knxPort" ).toInt(); pref.putInt( "knxPort", knxPort ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getKNXBrightPath", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxBrightPath ) ); } ); + server.on( "/updKNXBrightPath", HTTP_POST, []( AsyncWebServerRequest *request ) { knxBrightPath = request->arg( "knxBrightPath" ); pref.putString( "knxBrightPath", knxBrightPath ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); + server.on( "/getKNXBrightMin", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxBrightMin ) ); } ); + server.on( "/updKNXBrightMin", HTTP_POST, []( AsyncWebServerRequest *request ) { knxBrightMin = request->arg( "knxBrightMin" ).toInt(); pref.putInt( "knxBrightMin", knxBrightMin ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); + server.on( "/getKNXBrightMax", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxBrightMax ) ); } ); + server.on( "/updKNXBrightMax", HTTP_POST, []( AsyncWebServerRequest *request ) { knxBrightMax = request->arg( "knxBrightMax" ).toInt(); pref.putInt( "knxBrightMax", knxBrightMax ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); + server.on( "/getKNXTempPath", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxTempPath ) ); } ); + server.on( "/updKNXTempPath", HTTP_POST, []( AsyncWebServerRequest *request ) { knxTempPath = request->arg( "knxTempPath" ); pref.putString( "knxTempPath", knxTempPath ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXtemperature(); } ); + server.on( "/getKNXHumidPath", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( knxHumidPath ) ); } ); + server.on( "/updKNXHumidPath", HTTP_POST, []( AsyncWebServerRequest *request ) { knxHumidPath = request->arg( "knxHumidPath" ); pref.putString( "knxHumPath", knxHumidPath ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXhumidity(); } ); + + // Edgelights + // -------------------------------------------------------------------------- + server.on( "/getEdgeBrightIn", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( edgeBrightIn ) ); } ); + server.on( "/updEdgeBrightIn", HTTP_POST, []( AsyncWebServerRequest *request ) { edgeBrightIn = request->arg( "edgeBrightIn" ).toInt(); pref.putInt( "edgBrightIn", edgeBrightIn ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); + server.on( "/getEdgeBrightMin", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( edgeBrightMin ) ); } ); + server.on( "/updEdgeBrightMin", HTTP_POST, []( AsyncWebServerRequest *request ) { edgeBrightMin = request->arg( "edgeBrightMin" ).toInt(); pref.putInt( "edgBrightMin", edgeBrightMin ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); + server.on( "/getEdgeBrightMax", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( edgeBrightMax ) ); } ); + server.on( "/updEdgeBrightMax", HTTP_POST, []( AsyncWebServerRequest *request ) { edgeBrightMax = request->arg( "edgeBrightMax" ).toInt(); pref.putInt( "edgBrightMax", edgeBrightMax ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); + server.on( "/getEdgeBrightOut", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( edgeBrightOut ) ); } ); + server.on( "/getEdgeFrequency", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( edgeFrequency ) ); } ); + server.on( "/updEdgeFrequency", HTTP_POST, []( AsyncWebServerRequest *request ) { edgeFrequency = request->arg( "edgeFrequency" ).toInt(); pref.putInt( "edgeFrequency", edgeFrequency ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + + // Downlights + // -------------------------------------------------------------------------- + server.on( "/getDownSwitch", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downSwitch ) ); } ); + server.on( "/updDownSwitch", HTTP_POST, []( AsyncWebServerRequest *request ) { downSwitch = request->arg( "downSwitch" ).toInt(); pref.putInt( "downSwitch", downSwitch ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownBrightIn", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downBrightIn ) ); } ); + server.on( "/updDownBrightIn", HTTP_POST, []( AsyncWebServerRequest *request ) { downBrightIn = request->arg( "downBrightIn" ).toInt(); pref.putInt( "downBrightIn", downBrightIn ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); + server.on( "/getDownBrightMin", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downBrightMin ) ); } ); + server.on( "/updDownBrightMin", HTTP_POST, []( AsyncWebServerRequest *request ) { downBrightMin = request->arg( "downBrightMin" ).toInt(); pref.putInt( "downBrightMin", downBrightMin ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); + server.on( "/getDownBrightMax", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downBrightMax ) ); } ); + server.on( "/updDownBrightMax", HTTP_POST, []( AsyncWebServerRequest *request ) { downBrightMax = request->arg( "downBrightMax" ).toInt(); pref.putInt( "downBrightMax", downBrightMax ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); getKNXbrightness(); } ); + server.on( "/getDownBrightOut", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downBrightOut ) ); } ); + server.on( "/getDownFrequency", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downFrequency ) ); } ); + server.on( "/updDownFrequency", HTTP_POST, []( AsyncWebServerRequest *request ) { downFrequency = request->arg( "downFrequency" ).toInt(); pref.putInt( "downFrequency", downFrequency ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColorMode", []( AsyncWebServerRequest *request ) { request->send( 200, "text/plain", String( downColorMode ) ); } ); + server.on( "/updDownColorMode", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorMode = request->arg( "downColorMode" ).toInt(); pref.putInt( "downColorMode", downColorMode ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor00", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR00, downColorG00, downColorB00 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor00", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR00 = request->arg( "r" ).toInt(); pref.putInt( "downColorR00", downColorR00 ); downColorG00 = request->arg( "g" ).toInt(); pref.putInt( "downColorG00", downColorG00 ); downColorB00 = request->arg( "b" ).toInt(); pref.putInt( "downColorB00", downColorB00 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor01", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR01, downColorG01, downColorB01 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor01", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR01 = request->arg( "r" ).toInt(); pref.putInt( "downColorR01", downColorR01 ); downColorG01 = request->arg( "g" ).toInt(); pref.putInt( "downColorG01", downColorG01 ); downColorB01 = request->arg( "b" ).toInt(); pref.putInt( "downColorB01", downColorB01 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor02", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR02, downColorG02, downColorB02 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor02", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR02 = request->arg( "r" ).toInt(); pref.putInt( "downColorR02", downColorR02 ); downColorG02 = request->arg( "g" ).toInt(); pref.putInt( "downColorG02", downColorG02 ); downColorB02 = request->arg( "b" ).toInt(); pref.putInt( "downColorB02", downColorB02 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor03", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR03, downColorG03, downColorB03 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor03", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR03 = request->arg( "r" ).toInt(); pref.putInt( "downColorR03", downColorR03 ); downColorG03 = request->arg( "g" ).toInt(); pref.putInt( "downColorG03", downColorG03 ); downColorB03 = request->arg( "b" ).toInt(); pref.putInt( "downColorB03", downColorB03 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor04", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR04, downColorG04, downColorB04 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor04", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR04 = request->arg( "r" ).toInt(); pref.putInt( "downColorR04", downColorR04 ); downColorG04 = request->arg( "g" ).toInt(); pref.putInt( "downColorG04", downColorG04 ); downColorB04 = request->arg( "b" ).toInt(); pref.putInt( "downColorB04", downColorB04 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor05", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR05, downColorG05, downColorB05 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor05", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR05 = request->arg( "r" ).toInt(); pref.putInt( "downColorR05", downColorR05 ); downColorG05 = request->arg( "g" ).toInt(); pref.putInt( "downColorG05", downColorG05 ); downColorB05 = request->arg( "b" ).toInt(); pref.putInt( "downColorB05", downColorB05 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor06", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR06, downColorG06, downColorB06 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor06", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR06 = request->arg( "r" ).toInt(); pref.putInt( "downColorR06", downColorR06 ); downColorG06 = request->arg( "g" ).toInt(); pref.putInt( "downColorG06", downColorG06 ); downColorB06 = request->arg( "b" ).toInt(); pref.putInt( "downColorB06", downColorB06 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor07", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR07, downColorG07, downColorB07 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor07", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR07 = request->arg( "r" ).toInt(); pref.putInt( "downColorR07", downColorR07 ); downColorG07 = request->arg( "g" ).toInt(); pref.putInt( "downColorG07", downColorG07 ); downColorB07 = request->arg( "b" ).toInt(); pref.putInt( "downColorB07", downColorB07 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor08", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR08, downColorG08, downColorB08 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor08", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR08 = request->arg( "r" ).toInt(); pref.putInt( "downColorR08", downColorR08 ); downColorG08 = request->arg( "g" ).toInt(); pref.putInt( "downColorG08", downColorG08 ); downColorB08 = request->arg( "b" ).toInt(); pref.putInt( "downColorB08", downColorB08 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor09", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR09, downColorG09, downColorB09 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor09", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR09 = request->arg( "r" ).toInt(); pref.putInt( "downColorR09", downColorR09 ); downColorG09 = request->arg( "g" ).toInt(); pref.putInt( "downColorG09", downColorG09 ); downColorB09 = request->arg( "b" ).toInt(); pref.putInt( "downColorB09", downColorB09 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor10", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR10, downColorG10, downColorB10 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor10", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR10 = request->arg( "r" ).toInt(); pref.putInt( "downColorR10", downColorR10 ); downColorG10 = request->arg( "g" ).toInt(); pref.putInt( "downColorG10", downColorG10 ); downColorB10 = request->arg( "b" ).toInt(); pref.putInt( "downColorB10", downColorB10 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor11", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR11, downColorG11, downColorB11 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor11", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR11 = request->arg( "r" ).toInt(); pref.putInt( "downColorR11", downColorR11 ); downColorG11 = request->arg( "g" ).toInt(); pref.putInt( "downColorG11", downColorG11 ); downColorB11 = request->arg( "b" ).toInt(); pref.putInt( "downColorB11", downColorB11 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor12", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR12, downColorG12, downColorB12 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor12", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR12 = request->arg( "r" ).toInt(); pref.putInt( "downColorR12", downColorR12 ); downColorG12 = request->arg( "g" ).toInt(); pref.putInt( "downColorG12", downColorG12 ); downColorB12 = request->arg( "b" ).toInt(); pref.putInt( "downColorB12", downColorB12 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor13", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR13, downColorG13, downColorB13 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor13", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR13 = request->arg( "r" ).toInt(); pref.putInt( "downColorR13", downColorR13 ); downColorG13 = request->arg( "g" ).toInt(); pref.putInt( "downColorG13", downColorG13 ); downColorB13 = request->arg( "b" ).toInt(); pref.putInt( "downColorB13", downColorB13 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); + server.on( "/getDownColor14", []( AsyncWebServerRequest *request ) { char tempcolor[ 8 ]; sprintf( tempcolor, "#%02X%02X%02X", downColorR14, downColorG14, downColorB14 ); request->send( 200, "text/plain", tempcolor ); } ); + server.on( "/updDownColor14", HTTP_POST, []( AsyncWebServerRequest *request ) { downColorR14 = request->arg( "r" ).toInt(); pref.putInt( "downColorR14", downColorR14 ); downColorG14 = request->arg( "g" ).toInt(); pref.putInt( "downColorG14", downColorG14 ); downColorB14 = request->arg( "b" ).toInt(); pref.putInt( "downColorB14", downColorB14 ); request->send( 200, "text/json", "{ \"result\":\"ok\" }" ); } ); // clang-format on } @@ -1227,6 +1123,7 @@ void initHANDLERS() { * @since 1.0.0 */ void initSERVER() { + Serial.println( "- Webserver" ); server.serveStatic( "/", SPIFFS, "/" ); // set default path ElegantOTA.begin( &server ); // start ElegantOTA server.begin(); // start webserver @@ -1238,65 +1135,14 @@ void initSERVER() { * @since 1.0.0 */ void initLED() { + Serial.println( "- LED" ); + // edge FastLED.addLeds( arrayEdge, EDGE_COUNT ); - FastLED[ 0 ].setCorrection( TypicalLEDStrip ); - FastLED[ 0 ].showLeds( edgeBrightnessOut ); + FastLED[ 0 ].showLeds( edgeBrightOut ); // down FastLED.addLeds( arrayDown, DOWN_COUNT ); - FastLED[ 1 ].setCorrection( TypicalLEDStrip ); - FastLED[ 1 ].showLeds( downBrightnessOut ); - - if ( DEBUG ) { - Serial.println( "- LED" ); - Serial.printf( " Edge: %i\n", edgeBrightnessOut ); - Serial.printf( " Down: %i\n", downBrightnessOut ); - } -} - -/** - * @brief LOOP - access point - * @details restart the access point - * @since 1.2.0 - */ -void getAP() { - WiFi.softAPdisconnect(); // close access point - WiFi.softAPConfig( apLocalIP, apGateway, apSubnet ); // load new data - WiFi.softAP( apSSID.c_str(), apPass.c_str(), 1, apHide ); // restart access point -} - -/** - * @brief LOOP - wifi - * @details reconnect the wifi client - * @since 1.2.0 - */ -void getWIFI() { - WiFi.disconnect(); // close wifi client - if ( wifiDHCP ) { // if fixed ip adress configured - WiFi.config( wifiLocalIP, wifiGateway, wifiSubnet ); // load new data - } - WiFi.begin( wifiSSID.c_str(), wifiPass.c_str() ); // restart wifi client - for ( int i = 0; i < 10; i++ ) { - delay( 200 ); - if ( WiFi.status() == WL_CONNECTED ) { - wifiIP1 = WiFi.localIP()[ 0 ]; - wifiIP2 = WiFi.localIP()[ 1 ]; - wifiIP3 = WiFi.localIP()[ 2 ]; - wifiIP4 = WiFi.localIP()[ 3 ]; - wifiGW1 = WiFi.gatewayIP()[ 0 ]; - wifiGW2 = WiFi.gatewayIP()[ 1 ]; - wifiGW3 = WiFi.gatewayIP()[ 2 ]; - wifiGW4 = WiFi.gatewayIP()[ 3 ]; - wifiSN1 = WiFi.subnetMask()[ 0 ]; - wifiSN2 = WiFi.subnetMask()[ 1 ]; - wifiSN3 = WiFi.subnetMask()[ 2 ]; - wifiSN4 = WiFi.subnetMask()[ 3 ]; - break; - } - } - if ( WiFi.status() != WL_CONNECTED ) { - WiFi.disconnect(); - } + FastLED[ 1 ].showLeds( downBrightOut ); } /** @@ -1312,72 +1158,64 @@ void getNTP() { /** * @brief LOOP - knx brightness - * @details + * @details fetch brightness value from the home automation system * @since 1.2.0 */ void getKNXbrightness() { - if ( WiFi.status() == WL_CONNECTED ) { // if wifi connected - if ( ( knxAddress != "" ) && ( knxPort != 0 ) && ( knxBrightnessPath != "" ) ) { - knxClient.get( knxBrightnessPath ); // call knx for value - knxBrightnessValue = knxClient.responseBody().toInt(); // ...and write answer + if ( WiFi.status() == WL_CONNECTED ) { // if wifi connected + if ( ( knxAddress != "" ) && ( knxPort != 0 ) && ( knxBrightPath != "" ) ) { + knxClient.get( knxBrightPath ); // call knx for value + knxBrightIn = knxClient.responseBody().toInt(); // ...and write answer // edge - edgeBrightnessOut = - map( knxBrightnessValue, knxBrightnessMin, knxBrightnessMax, edgeBrightnessMin, edgeBrightnessMax ); - pref.putInt( "edgBrightOut", edgeBrightnessOut ); + edgeBrightOut = map( knxBrightIn, knxBrightMin, knxBrightMax, edgeBrightMin, edgeBrightMax ); + pref.putInt( "edgBrightOut", edgeBrightOut ); // downlight - downBrightnessOut = - map( knxBrightnessValue, knxBrightnessMin, knxBrightnessMax, downBrightnessMin, downBrightnessMax ); - pref.putInt( "dowBrightOut", downBrightnessOut ); - - if ( DEBUG ) { - Serial.println( "- knxBrightness" ); - Serial.printf( " knxValue: %i\n", knxBrightnessValue ); - Serial.printf( " edgeOut: %i\n", edgeBrightnessOut ); - Serial.printf( " downOut: %i\n", downBrightnessOut ); - } + downBrightOut = map( knxBrightIn, knxBrightMin, knxBrightMax, downBrightMin, downBrightMax ); + pref.putInt( "dowBrightOut", downBrightOut ); + + Serial.println( "- knxBrightness" ); + Serial.printf( " knxIn: %i\n", knxBrightIn ); + Serial.printf( " edgeOut: %i\n", edgeBrightOut ); + Serial.printf( " downOut: %i\n", downBrightOut ); } - } else { // if wifi not connected - getWIFI(); // reconnect wifi first + } else { // if wifi not connected + // initWIFI(); // reconnect wifi first } } /** * @brief LOOP - knx temperature - * @details + * @details fetch temperature value from the home automation system * @since 1.2.0 */ void getKNXtemperature() { if ( WiFi.status() == WL_CONNECTED ) { - if ( ( knxAddress != "" ) && ( knxPort != 0 ) && ( knxTemperaturePath != "" ) ) { - knxClient.get( knxTemperaturePath ); // call knx for value - knxTemperatureValue = ( knxClient.responseBody().toDouble() ); // ...and write answer - if ( DEBUG ) { - Serial.println( "- knxTemperature" ); - Serial.printf( " knxValue: %i\n", knxTemperatureValue ); - } + if ( ( knxAddress != "" ) && ( knxPort != 0 ) && ( knxTempPath != "" ) ) { + knxClient.get( knxTempPath ); // call knx for value + knxTempIn = ( knxClient.responseBody().toDouble() ); // ...and write answer + Serial.println( "- knxTemperature" ); + Serial.printf( " knxValue: %i\n", knxTempIn ); } - } else { // if wifi not connected - getWIFI(); // reconnect wifi first + } else { // if wifi not connected + // initWIFI(); // reconnect wifi first } } /** * @brief LOOP - knx humidity - * @details fetch values from the home automation system + * @details fetch humidity value from the home automation system * @since 1.2.0 */ void getKNXhumidity() { if ( WiFi.status() == WL_CONNECTED ) { - if ( ( knxAddress != "" ) && ( knxPort != 0 ) && ( knxHumidityPath != "" ) ) { - knxClient.get( knxHumidityPath ); // call knx for value - knxHumidityValue = int( ( knxClient.responseBody().toDouble() ) * 10 ); // ...and write answer - if ( DEBUG ) { - Serial.println( "- knxHumidity" ); - Serial.printf( " knxValue: %d\n", knxHumidityValue ); - } + if ( ( knxAddress != "" ) && ( knxPort != 0 ) && ( knxHumidPath != "" ) ) { + knxClient.get( knxHumidPath ); // call knx for value + knxHumidIn = int( ( knxClient.responseBody().toDouble() ) * 10 ); // ...and write answer + Serial.println( "- knxHumidity" ); + Serial.printf( " knxValue: %d\n", knxHumidIn ); } } else { - getWIFI(); + // initWIFI(); } } @@ -1394,53 +1232,57 @@ void displayEdge( uint8_t d, uint8_t o, CHSV c ) { segA = segB = segC = segD = segE = segF = segG = CRGB::Black; // turn respective segments on - if ( d == 0 ) { - segA = segB = segC = segE = segF = segG = c; - } - if ( d == 1 ) { - segA = segE = c; - } - if ( d == 2 ) { - segA = segB = segD = segF = segG = c; - } - if ( d == 3 ) { - segA = segB = segD = segE = segF = c; - } - if ( d == 4 ) { - segA = segC = segD = segE = c; - } - if ( d == 5 ) { - segB = segC = segD = segE = segF = c; - } - if ( d == 6 ) { - segB = segC = segD = segE = segF = segG = c; - } - if ( d == 7 ) { - segA = segB = segE = c; - } - if ( d == 8 ) { - segA = segB = segC = segD = segE = segF = segG = c; - } - if ( d == 9 ) { - segA = segB = segC = segD = segE = segF = c; - } - if ( d == 10 ) { // - - segD = c; - } - if ( d == 11 ) { // ° - segA = segB = segC = segD = c; - } - if ( d == 12 ) { // d - segA = segD = segE = segF = segG = c; - } - if ( d == 13 ) { // E - segB = segC = segD = segF = segG = c; - } - if ( d == 14 ) { // H - segA = segC = segD = segE = segG = c; - } - if ( d == 15 ) { // n - segD = segE = segG = c; + switch ( d ) { + case 0: // digit 0 + segA = segB = segC = segE = segF = segG = c; + break; + case 1: // digit 1 + segA = segE = c; + break; + case 2: // digit 2 + segA = segB = segD = segF = segG = c; + break; + case 3: // digit 3 + segA = segB = segD = segE = segF = c; + break; + case 4: // digit 4 + segA = segC = segD = segE = c; + break; + case 5: // digit 5 + segB = segC = segD = segE = segF = c; + break; + case 6: // digit 6 + segB = segC = segD = segE = segF = segG = c; + break; + case 7: // digit 7 + segA = segB = segE = c; + break; + case 8: // digit 8 + segA = segB = segC = segD = segE = segF = segG = c; + break; + case 9: // digit 9 + segA = segB = segC = segD = segE = segF = c; + break; + case 10: // sign - + segD = c; + break; + case 11: // sign ° + segA = segB = segC = segD = c; + break; + case 12: // letter d + segA = segD = segE = segF = segG = c; + break; + case 13: // letter E + segB = segC = segD = segF = segG = c; + break; + case 14: // letter H + segA = segC = segD = segE = segG = c; + break; + case 15: // letter n + segD = segE = segG = c; + break; + default: + break; } // shift segments to correct spot @@ -1470,51 +1312,57 @@ void displayEdge( uint8_t d, uint8_t o, CHSV c ) { */ void displayDown() { // downlights - off - if ( downUsage == 0 ) { + if ( downSwitch == 0 ) { fill_solid( arrayDown, DOWN_COUNT, CRGB::Black ); } // downlights - on - if ( downUsage == 1 ) { - // user defined colors - if ( dowColor == 0 ) { - arrayDown[ 0 ].setRGB( dowColor0R, dowColor0G, dowColor0B ); - arrayDown[ 1 ].setRGB( dowColor1R, dowColor1G, dowColor1B ); - arrayDown[ 2 ].setRGB( dowColor2R, dowColor2G, dowColor2B ); - arrayDown[ 3 ].setRGB( dowColor3R, dowColor3G, dowColor3B ); - arrayDown[ 4 ].setRGB( dowColor4R, dowColor4G, dowColor4B ); - arrayDown[ 5 ].setRGB( dowColor5R, dowColor5G, dowColor5B ); - arrayDown[ 6 ].setRGB( dowColor6R, dowColor6G, dowColor6B ); - arrayDown[ 7 ].setRGB( dowColor7R, dowColor7G, dowColor7B ); - arrayDown[ 8 ].setRGB( dowColor8R, dowColor8G, dowColor8B ); - arrayDown[ 9 ].setRGB( dowColor9R, dowColor9G, dowColor9B ); - arrayDown[ 10 ].setRGB( dowColor10R, dowColor10G, dowColor10B ); - arrayDown[ 11 ].setRGB( dowColor11R, dowColor11G, dowColor11B ); - arrayDown[ 12 ].setRGB( dowColor12R, dowColor12G, dowColor12B ); - arrayDown[ 13 ].setRGB( dowColor13R, dowColor13G, dowColor13B ); - FastLED[ 1 ].showLeds( downBrightnessOut ); + if ( downSwitch == 1 ) { + // 1 defined color + if ( downColorMode == 0 ) { + for ( int d = 0; d < DOWN_COUNT; d++ ) { + arrayDown[ d ].setRGB( downColorR00, downColorG00, downColorB00 ); + } + } + // 14 defined colors + if ( downColorMode == 1 ) { + arrayDown[ 0 ].setRGB( downColorR01, downColorG01, downColorB01 ); + arrayDown[ 1 ].setRGB( downColorR02, downColorG02, downColorB02 ); + arrayDown[ 2 ].setRGB( downColorR03, downColorG03, downColorB03 ); + arrayDown[ 3 ].setRGB( downColorR04, downColorG04, downColorB04 ); + arrayDown[ 4 ].setRGB( downColorR05, downColorG05, downColorB05 ); + arrayDown[ 5 ].setRGB( downColorR06, downColorG06, downColorB06 ); + arrayDown[ 6 ].setRGB( downColorR07, downColorG07, downColorB07 ); + arrayDown[ 7 ].setRGB( downColorR08, downColorG08, downColorB08 ); + arrayDown[ 8 ].setRGB( downColorR09, downColorG09, downColorB09 ); + arrayDown[ 9 ].setRGB( downColorR10, downColorG10, downColorB10 ); + arrayDown[ 10 ].setRGB( downColorR11, downColorG11, downColorB11 ); + arrayDown[ 11 ].setRGB( downColorR12, downColorG12, downColorB12 ); + arrayDown[ 12 ].setRGB( downColorR13, downColorG13, downColorB13 ); + arrayDown[ 13 ].setRGB( downColorR14, downColorG14, downColorB14 ); } // 1 random color - if ( dowColor == 1 && ( ( downFrequency == 0 ) || ( downFrequency == 1 && downMinPassed ) || - ( downFrequency == 2 && downHourPassed ) || ( downFrequency == 3 && downDayPassed ) ) ) { + if ( downColorMode == 2 && + ( ( downFrequency == 0 ) || ( downFrequency == 1 && downMinPassed ) || + ( downFrequency == 2 && downHourPassed ) || ( downFrequency == 3 && downDayPassed ) ) ) { CHSV dowColorRandom = CHSV( random8(), 255, 255 ); - for ( int i = 0; i < DOWN_COUNT; i++ ) { - arrayDown[ i ] = dowColorRandom; + for ( int d = 0; d < DOWN_COUNT; d++ ) { + arrayDown[ d ] = dowColorRandom; } - FastLED[ 1 ].showLeds( downBrightnessOut ); } // 14 random colors - if ( dowColor == 2 && ( ( downFrequency == 0 ) || ( downFrequency == 1 && downMinPassed ) || - ( downFrequency == 2 && downHourPassed ) || ( downFrequency == 3 && downDayPassed ) ) ) { - for ( int i = 0; i < DOWN_COUNT; i++ ) { - arrayDown[ i ] = CHSV( random8(), 255, 255 ); + if ( downColorMode == 3 && + ( ( downFrequency == 0 ) || ( downFrequency == 1 && downMinPassed ) || + ( downFrequency == 2 && downHourPassed ) || ( downFrequency == 3 && downDayPassed ) ) ) { + for ( int d = 0; d < DOWN_COUNT; d++ ) { + arrayDown[ d ] = CHSV( random8(), 255, 255 ); } } } - - if ( downBrightness == 0 ) { - FastLED[ 1 ].showLeds( downBrightnessOut ); + // downlights - show + if ( downBrightIn == 0 ) { + FastLED[ 1 ].showLeds( downBrightOut ); } else { - FastLED[ 1 ].showLeds( downBrightness ); + FastLED[ 1 ].showLeds( downBrightIn ); } downMinPassed = false; // reset the color change flag (1 minute) @@ -1537,8 +1385,8 @@ void taskCore0code( void *pvParameters ) { if ( abs( currTsec - prevTimeSecCore0 ) >= 1 ) { // every second prevTimeSecCore0 = currTsec; // set reference displayDown(); - if ( WiFi.status() != WL_CONNECTED ) { // NO wifi - getWIFI(); // -> reconnect + if ( WiFi.status() != WL_CONNECTED ) { // NO wifi + // initWIFI(); // -> reconnect } } @@ -1546,12 +1394,12 @@ void taskCore0code( void *pvParameters ) { prevTimeMinCore0 = currTmin; // set reference edgeMinPassed = true; // set flag downMinPassed = true; // set flag - getKNXbrightness(); // brightness } if ( ( m2 == 0 || m2 == 5 ) && ( currTsec == 0 ) ) { // every 5 minutes - getKNXtemperature(); - getKNXhumidity(); + getKNXbrightness(); // brightness + getKNXtemperature(); // temperature + getKNXhumidity(); // humidity } if ( abs( currThour - prevTimeHourCore0 ) >= 1 ) { // every hour From c4546de409747e170a937c3b444089ef5e312eab Mon Sep 17 00:00:00 2001 From: CaptSnus Date: Wed, 17 Apr 2024 15:29:39 +0200 Subject: [PATCH 20/21] bump esp-idf version --- .github/workflows/c-cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 5245b26..ef1d643 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -18,5 +18,5 @@ jobs: - name: esp-idf build uses: espressif/esp-idf-ci-action@v1 with: - esp_idf_version: v5.1.1 + esp_idf_version: v5.3.0 target: esp32 From 83c92b98fd71af8ad6ec6113175ec6862fd30581 Mon Sep 17 00:00:00 2001 From: CaptSnus Date: Wed, 17 Apr 2024 15:37:04 +0200 Subject: [PATCH 21/21] fix of the workflow --- .github/workflows/c-cpp.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index ef1d643..e32e583 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -16,7 +16,4 @@ jobs: with: submodules: "recursive" - name: esp-idf build - uses: espressif/esp-idf-ci-action@v1 - with: - esp_idf_version: v5.3.0 - target: esp32 + uses: espressif/esp-idf-ci-action@latest