mirror of
https://github.com/Laxilef/OTGateway.git
synced 2025-12-12 19:24:27 +05:00
Compare commits
10 Commits
1.4.0-rc.2
...
1.4.0-rc.2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4a4afeb29 | ||
|
|
f9824337dc | ||
|
|
1cd8c6a336 | ||
|
|
63228baebd | ||
|
|
6bb261dfd7 | ||
|
|
a026a962f0 | ||
|
|
db2faad741 | ||
|
|
fbc43dc535 | ||
|
|
31dfc21d69 | ||
|
|
96289cb0f7 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,5 +1,6 @@
|
|||||||
.pio
|
.pio
|
||||||
.vscode
|
.vscode
|
||||||
build/*.bin
|
build/*.bin
|
||||||
|
data/**/*.gz
|
||||||
secrets.ini
|
secrets.ini
|
||||||
!.gitkeep
|
!.gitkeep
|
||||||
0
data/.gitkeep
Normal file
0
data/.gitkeep
Normal file
0
data/static/.gitkeep
Normal file
0
data/static/.gitkeep
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,4 +1,7 @@
|
|||||||
#include <FS.h>
|
#include <FS.h>
|
||||||
|
#include <detail/mimetable.h>
|
||||||
|
|
||||||
|
using namespace mime;
|
||||||
|
|
||||||
class StaticPage : public RequestHandler {
|
class StaticPage : public RequestHandler {
|
||||||
public:
|
public:
|
||||||
@@ -61,6 +64,14 @@ public:
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (!this->path.endsWith(FPSTR(mimeTable[gz].endsWith)) && !this->fs->exists(path)) {
|
||||||
|
String pathWithGz = this->path + FPSTR(mimeTable[gz].endsWith);
|
||||||
|
|
||||||
|
if (this->fs->exists(pathWithGz)) {
|
||||||
|
this->path += FPSTR(mimeTable[gz].endsWith);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
File file = this->fs->open(this->path, "r");
|
File file = this->fs->open(this->path, "r");
|
||||||
if (!file) {
|
if (!file) {
|
||||||
return false;
|
return false;
|
||||||
@@ -93,6 +104,6 @@ protected:
|
|||||||
BeforeSendCallback beforeSendCallback;
|
BeforeSendCallback beforeSendCallback;
|
||||||
String eTag;
|
String eTag;
|
||||||
const char* uri = nullptr;
|
const char* uri = nullptr;
|
||||||
const char* path = nullptr;
|
String path;
|
||||||
const char* cacheHeader = nullptr;
|
const char* cacheHeader = nullptr;
|
||||||
};
|
};
|
||||||
@@ -51,7 +51,7 @@ monitor_speed = 115200
|
|||||||
monitor_filters = direct
|
monitor_filters = direct
|
||||||
board_build.flash_mode = dio
|
board_build.flash_mode = dio
|
||||||
board_build.filesystem = littlefs
|
board_build.filesystem = littlefs
|
||||||
version = 1.4.0-rc.21
|
version = 1.4.0-rc.22
|
||||||
|
|
||||||
; Defaults
|
; Defaults
|
||||||
[esp8266_defaults]
|
[esp8266_defaults]
|
||||||
@@ -94,8 +94,8 @@ build_flags =
|
|||||||
-D DEFAULT_OT_OUT_GPIO=5
|
-D DEFAULT_OT_OUT_GPIO=5
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
||||||
-D LED_STATUS_GPIO=13
|
-D DEFAULT_STATUS_LED_GPIO=13
|
||||||
-D LED_OT_RX_GPIO=15
|
-D DEFAULT_OT_RX_LED_GPIO=15
|
||||||
|
|
||||||
[env:d1_mini_lite]
|
[env:d1_mini_lite]
|
||||||
platform = ${esp8266_defaults.platform}
|
platform = ${esp8266_defaults.platform}
|
||||||
@@ -110,8 +110,8 @@ build_flags =
|
|||||||
-D DEFAULT_OT_OUT_GPIO=5
|
-D DEFAULT_OT_OUT_GPIO=5
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
||||||
-D LED_STATUS_GPIO=13
|
-D DEFAULT_STATUS_LED_GPIO=13
|
||||||
-D LED_OT_RX_GPIO=15
|
-D DEFAULT_OT_RX_LED_GPIO=15
|
||||||
|
|
||||||
[env:d1_mini_pro]
|
[env:d1_mini_pro]
|
||||||
platform = ${esp8266_defaults.platform}
|
platform = ${esp8266_defaults.platform}
|
||||||
@@ -126,8 +126,8 @@ build_flags =
|
|||||||
-D DEFAULT_OT_OUT_GPIO=5
|
-D DEFAULT_OT_OUT_GPIO=5
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
||||||
-D LED_STATUS_GPIO=13
|
-D DEFAULT_STATUS_LED_GPIO=13
|
||||||
-D LED_OT_RX_GPIO=15
|
-D DEFAULT_OT_RX_LED_GPIO=15
|
||||||
|
|
||||||
[env:s2_mini]
|
[env:s2_mini]
|
||||||
platform = ${esp32_defaults.platform}
|
platform = ${esp32_defaults.platform}
|
||||||
@@ -142,8 +142,8 @@ build_flags =
|
|||||||
-D DEFAULT_OT_OUT_GPIO=35
|
-D DEFAULT_OT_OUT_GPIO=35
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=9
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=9
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=7
|
-D DEFAULT_SENSOR_INDOOR_GPIO=7
|
||||||
-D LED_STATUS_GPIO=11
|
-D DEFAULT_STATUS_LED_GPIO=11
|
||||||
-D LED_OT_RX_GPIO=12
|
-D DEFAULT_OT_RX_LED_GPIO=12
|
||||||
|
|
||||||
[env:s3_mini]
|
[env:s3_mini]
|
||||||
platform = ${esp32_defaults.platform}
|
platform = ${esp32_defaults.platform}
|
||||||
@@ -161,8 +161,8 @@ build_flags =
|
|||||||
-D DEFAULT_OT_OUT_GPIO=36
|
-D DEFAULT_OT_OUT_GPIO=36
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=13
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=13
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=12
|
-D DEFAULT_SENSOR_INDOOR_GPIO=12
|
||||||
-D LED_STATUS_GPIO=11
|
-D DEFAULT_STATUS_LED_GPIO=11
|
||||||
-D LED_OT_RX_GPIO=10
|
-D DEFAULT_OT_RX_LED_GPIO=10
|
||||||
|
|
||||||
[env:c3_mini]
|
[env:c3_mini]
|
||||||
platform = ${esp32_defaults.platform}
|
platform = ${esp32_defaults.platform}
|
||||||
@@ -182,8 +182,8 @@ build_flags =
|
|||||||
-D DEFAULT_OT_OUT_GPIO=10
|
-D DEFAULT_OT_OUT_GPIO=10
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=0
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=0
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=1
|
-D DEFAULT_SENSOR_INDOOR_GPIO=1
|
||||||
-D LED_STATUS_GPIO=4
|
-D DEFAULT_STATUS_LED_GPIO=4
|
||||||
-D LED_OT_RX_GPIO=5
|
-D DEFAULT_OT_RX_LED_GPIO=5
|
||||||
|
|
||||||
[env:nodemcu_32s]
|
[env:nodemcu_32s]
|
||||||
platform = ${esp32_defaults.platform}
|
platform = ${esp32_defaults.platform}
|
||||||
@@ -201,8 +201,8 @@ build_flags =
|
|||||||
-D DEFAULT_OT_OUT_GPIO=22
|
-D DEFAULT_OT_OUT_GPIO=22
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=13
|
-D DEFAULT_SENSOR_INDOOR_GPIO=13
|
||||||
-D LED_STATUS_GPIO=2 ; 18
|
-D DEFAULT_STATUS_LED_GPIO=2 ; 18
|
||||||
-D LED_OT_RX_GPIO=19
|
-D DEFAULT_OT_RX_LED_GPIO=19
|
||||||
;-D WOKWI=1
|
;-D WOKWI=1
|
||||||
|
|
||||||
[env:d1_mini32]
|
[env:d1_mini32]
|
||||||
@@ -221,5 +221,5 @@ build_flags =
|
|||||||
-D DEFAULT_OT_OUT_GPIO=22
|
-D DEFAULT_OT_OUT_GPIO=22
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=18
|
-D DEFAULT_SENSOR_INDOOR_GPIO=18
|
||||||
-D LED_STATUS_GPIO=2
|
-D DEFAULT_STATUS_LED_GPIO=2
|
||||||
-D LED_OT_RX_GPIO=19
|
-D DEFAULT_OT_RX_LED_GPIO=19
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ protected:
|
|||||||
enum class PumpStartReason {NONE, HEATING, ANTISTUCK};
|
enum class PumpStartReason {NONE, HEATING, ANTISTUCK};
|
||||||
|
|
||||||
Blinker* blinker = nullptr;
|
Blinker* blinker = nullptr;
|
||||||
bool blinkerInitialized = false;
|
|
||||||
unsigned long firstFailConnect = 0;
|
unsigned long firstFailConnect = 0;
|
||||||
unsigned long lastHeapInfo = 0;
|
unsigned long lastHeapInfo = 0;
|
||||||
unsigned int minFreeHeap = 0;
|
unsigned int minFreeHeap = 0;
|
||||||
@@ -51,17 +50,7 @@ protected:
|
|||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup() {
|
void setup() {}
|
||||||
#ifdef LED_STATUS_GPIO
|
|
||||||
pinMode(LED_STATUS_GPIO, OUTPUT);
|
|
||||||
digitalWrite(LED_STATUS_GPIO, LOW);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (GPIO_IS_VALID(settings.externalPump.gpio)) {
|
|
||||||
pinMode(settings.externalPump.gpio, OUTPUT);
|
|
||||||
digitalWrite(settings.externalPump.gpio, LOW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
network->loop();
|
network->loop();
|
||||||
@@ -142,7 +131,7 @@ protected:
|
|||||||
this->firstFailConnect = millis();
|
this->firstFailConnect = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (millis() - this->firstFailConnect > EMERGENCY_TIME_TRESHOLD) {
|
if (millis() - this->firstFailConnect > (settings.emergency.tresholdTime * 1000)) {
|
||||||
vars.states.emergency = true;
|
vars.states.emergency = true;
|
||||||
Log.sinfoln(FPSTR(L_MAIN), F("Emergency mode enabled"));
|
Log.sinfoln(FPSTR(L_MAIN), F("Emergency mode enabled"));
|
||||||
}
|
}
|
||||||
@@ -151,9 +140,7 @@ protected:
|
|||||||
this->yield();
|
this->yield();
|
||||||
|
|
||||||
|
|
||||||
#ifdef LED_STATUS_GPIO
|
this->ledStatus();
|
||||||
this->ledStatus(LED_STATUS_GPIO);
|
|
||||||
#endif
|
|
||||||
this->externalPump();
|
this->externalPump();
|
||||||
this->yield();
|
this->yield();
|
||||||
|
|
||||||
@@ -222,16 +209,32 @@ protected:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ledStatus(uint8_t gpio) {
|
void ledStatus() {
|
||||||
uint8_t errors[4];
|
uint8_t errors[4];
|
||||||
uint8_t errCount = 0;
|
uint8_t errCount = 0;
|
||||||
static uint8_t errPos = 0;
|
static uint8_t errPos = 0;
|
||||||
static unsigned long endBlinkTime = 0;
|
static unsigned long endBlinkTime = 0;
|
||||||
static bool ledOn = false;
|
static bool ledOn = false;
|
||||||
|
static uint8_t configuredGpio = GPIO_IS_NOT_CONFIGURED;
|
||||||
|
|
||||||
if (!this->blinkerInitialized) {
|
if (settings.system.statusLedGpio != configuredGpio) {
|
||||||
this->blinker->init(gpio);
|
if (configuredGpio != GPIO_IS_NOT_CONFIGURED) {
|
||||||
this->blinkerInitialized = true;
|
digitalWrite(configuredGpio, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GPIO_IS_VALID(settings.system.statusLedGpio)) {
|
||||||
|
configuredGpio = settings.system.statusLedGpio;
|
||||||
|
pinMode(configuredGpio, OUTPUT);
|
||||||
|
digitalWrite(configuredGpio, LOW);
|
||||||
|
this->blinker->init(configuredGpio);
|
||||||
|
|
||||||
|
} else if (configuredGpio != GPIO_IS_NOT_CONFIGURED) {
|
||||||
|
configuredGpio = GPIO_IS_NOT_CONFIGURED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuredGpio == GPIO_IS_NOT_CONFIGURED) {
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!network->isConnected()) {
|
if (!network->isConnected()) {
|
||||||
@@ -258,14 +261,14 @@ protected:
|
|||||||
if (!this->blinker->running() && millis() - endBlinkTime >= 5000) {
|
if (!this->blinker->running() && millis() - endBlinkTime >= 5000) {
|
||||||
if (errCount == 0) {
|
if (errCount == 0) {
|
||||||
if (!ledOn) {
|
if (!ledOn) {
|
||||||
digitalWrite(gpio, HIGH);
|
digitalWrite(configuredGpio, HIGH);
|
||||||
ledOn = true;
|
ledOn = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
} else if (ledOn) {
|
} else if (ledOn) {
|
||||||
digitalWrite(gpio, LOW);
|
digitalWrite(configuredGpio, LOW);
|
||||||
ledOn = false;
|
ledOn = false;
|
||||||
endBlinkTime = millis();
|
endBlinkTime = millis();
|
||||||
return;
|
return;
|
||||||
@@ -286,6 +289,34 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void externalPump() {
|
void externalPump() {
|
||||||
|
static uint8_t configuredGpio = GPIO_IS_NOT_CONFIGURED;
|
||||||
|
|
||||||
|
if (settings.externalPump.gpio != configuredGpio) {
|
||||||
|
if (configuredGpio != GPIO_IS_NOT_CONFIGURED) {
|
||||||
|
digitalWrite(configuredGpio, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GPIO_IS_VALID(settings.externalPump.gpio)) {
|
||||||
|
configuredGpio = settings.externalPump.gpio;
|
||||||
|
pinMode(configuredGpio, OUTPUT);
|
||||||
|
digitalWrite(configuredGpio, LOW);
|
||||||
|
|
||||||
|
} else if (configuredGpio != GPIO_IS_NOT_CONFIGURED) {
|
||||||
|
configuredGpio = GPIO_IS_NOT_CONFIGURED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (configuredGpio == GPIO_IS_NOT_CONFIGURED) {
|
||||||
|
if (vars.states.externalPump) {
|
||||||
|
vars.states.externalPump = false;
|
||||||
|
vars.parameters.extPumpLastEnableTime = millis();
|
||||||
|
|
||||||
|
Log.sinfoln("EXTPUMP", F("Disabled: use = off"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!vars.states.heating && this->heatingEnabled) {
|
if (!vars.states.heating && this->heatingEnabled) {
|
||||||
this->heatingEnabled = false;
|
this->heatingEnabled = false;
|
||||||
this->heatingDisabledTime = millis();
|
this->heatingDisabledTime = millis();
|
||||||
@@ -294,11 +325,9 @@ protected:
|
|||||||
this->heatingEnabled = true;
|
this->heatingEnabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!settings.externalPump.use || !GPIO_IS_VALID(settings.externalPump.gpio)) {
|
if (!settings.externalPump.use) {
|
||||||
if (vars.states.externalPump) {
|
if (vars.states.externalPump) {
|
||||||
if (GPIO_IS_VALID(settings.externalPump.gpio)) {
|
digitalWrite(configuredGpio, LOW);
|
||||||
digitalWrite(settings.externalPump.gpio, LOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
vars.states.externalPump = false;
|
vars.states.externalPump = false;
|
||||||
vars.parameters.extPumpLastEnableTime = millis();
|
vars.parameters.extPumpLastEnableTime = millis();
|
||||||
@@ -311,7 +340,7 @@ protected:
|
|||||||
|
|
||||||
if (vars.states.externalPump && !this->heatingEnabled) {
|
if (vars.states.externalPump && !this->heatingEnabled) {
|
||||||
if (this->extPumpStartReason == MainTask::PumpStartReason::HEATING && millis() - this->heatingDisabledTime > (settings.externalPump.postCirculationTime * 1000u)) {
|
if (this->extPumpStartReason == MainTask::PumpStartReason::HEATING && millis() - this->heatingDisabledTime > (settings.externalPump.postCirculationTime * 1000u)) {
|
||||||
digitalWrite(settings.externalPump.gpio, LOW);
|
digitalWrite(configuredGpio, LOW);
|
||||||
|
|
||||||
vars.states.externalPump = false;
|
vars.states.externalPump = false;
|
||||||
vars.parameters.extPumpLastEnableTime = millis();
|
vars.parameters.extPumpLastEnableTime = millis();
|
||||||
@@ -319,7 +348,7 @@ protected:
|
|||||||
Log.sinfoln("EXTPUMP", F("Disabled: expired post circulation time"));
|
Log.sinfoln("EXTPUMP", F("Disabled: expired post circulation time"));
|
||||||
|
|
||||||
} else if (this->extPumpStartReason == MainTask::PumpStartReason::ANTISTUCK && millis() - this->externalPumpStartTime >= (settings.externalPump.antiStuckTime * 1000u)) {
|
} else if (this->extPumpStartReason == MainTask::PumpStartReason::ANTISTUCK && millis() - this->externalPumpStartTime >= (settings.externalPump.antiStuckTime * 1000u)) {
|
||||||
digitalWrite(settings.externalPump.gpio, LOW);
|
digitalWrite(configuredGpio, LOW);
|
||||||
|
|
||||||
vars.states.externalPump = false;
|
vars.states.externalPump = false;
|
||||||
vars.parameters.extPumpLastEnableTime = millis();
|
vars.parameters.extPumpLastEnableTime = millis();
|
||||||
@@ -335,7 +364,7 @@ protected:
|
|||||||
this->externalPumpStartTime = millis();
|
this->externalPumpStartTime = millis();
|
||||||
this->extPumpStartReason = MainTask::PumpStartReason::HEATING;
|
this->extPumpStartReason = MainTask::PumpStartReason::HEATING;
|
||||||
|
|
||||||
digitalWrite(settings.externalPump.gpio, HIGH);
|
digitalWrite(configuredGpio, HIGH);
|
||||||
|
|
||||||
Log.sinfoln("EXTPUMP", F("Enabled: heating on"));
|
Log.sinfoln("EXTPUMP", F("Enabled: heating on"));
|
||||||
|
|
||||||
@@ -344,7 +373,7 @@ protected:
|
|||||||
this->externalPumpStartTime = millis();
|
this->externalPumpStartTime = millis();
|
||||||
this->extPumpStartReason = MainTask::PumpStartReason::ANTISTUCK;
|
this->extPumpStartReason = MainTask::PumpStartReason::ANTISTUCK;
|
||||||
|
|
||||||
digitalWrite(settings.externalPump.gpio, HIGH);
|
digitalWrite(configuredGpio, HIGH);
|
||||||
|
|
||||||
Log.sinfoln("EXTPUMP", F("Enabled: anti stuck"));
|
Log.sinfoln("EXTPUMP", F("Enabled: anti stuck"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -188,7 +188,7 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (settings.emergency.enable && settings.emergency.onMqttFault) {
|
if (settings.emergency.enable && settings.emergency.onMqttFault) {
|
||||||
if (!this->connected && !vars.states.emergency && millis() - this->disconnectedTime > EMERGENCY_TIME_TRESHOLD) {
|
if (!this->connected && !vars.states.emergency && millis() - this->disconnectedTime > (settings.emergency.tresholdTime * 1000)) {
|
||||||
vars.states.emergency = true;
|
vars.states.emergency = true;
|
||||||
Log.sinfoln(FPSTR(L_MQTT), F("Emergency mode enabled"));
|
Log.sinfoln(FPSTR(L_MQTT), F("Emergency mode enabled"));
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ protected:
|
|||||||
unsigned long prevUpdateNonEssentialVars = 0;
|
unsigned long prevUpdateNonEssentialVars = 0;
|
||||||
unsigned long dhwSetTempTime = 0;
|
unsigned long dhwSetTempTime = 0;
|
||||||
unsigned long heatingSetTempTime = 0;
|
unsigned long heatingSetTempTime = 0;
|
||||||
|
byte configuredRxLedGpio = GPIO_IS_NOT_CONFIGURED;
|
||||||
|
|
||||||
|
|
||||||
const char* getTaskName() {
|
const char* getTaskName() {
|
||||||
@@ -51,11 +52,6 @@ protected:
|
|||||||
vars.parameters.dhwMaxTemp = convertTemp(vars.parameters.dhwMaxTemp, UnitSystem::METRIC, settings.system.unitSystem);
|
vars.parameters.dhwMaxTemp = convertTemp(vars.parameters.dhwMaxTemp, UnitSystem::METRIC, settings.system.unitSystem);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef LED_OT_RX_GPIO
|
|
||||||
pinMode(LED_OT_RX_GPIO, OUTPUT);
|
|
||||||
digitalWrite(LED_OT_RX_GPIO, LOW);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// delete instance
|
// delete instance
|
||||||
if (this->instance != nullptr) {
|
if (this->instance != nullptr) {
|
||||||
delete this->instance;
|
delete this->instance;
|
||||||
@@ -89,13 +85,11 @@ protected:
|
|||||||
if (status == OpenThermResponseStatus::SUCCESS) {
|
if (status == OpenThermResponseStatus::SUCCESS) {
|
||||||
this->lastSuccessResponse = millis();
|
this->lastSuccessResponse = millis();
|
||||||
|
|
||||||
#ifdef LED_OT_RX_GPIO
|
if (this->configuredRxLedGpio != GPIO_IS_NOT_CONFIGURED) {
|
||||||
{
|
digitalWrite(this->configuredRxLedGpio, HIGH);
|
||||||
digitalWrite(LED_OT_RX_GPIO, HIGH);
|
|
||||||
delayMicroseconds(2000);
|
delayMicroseconds(2000);
|
||||||
digitalWrite(LED_OT_RX_GPIO, LOW);
|
digitalWrite(this->configuredRxLedGpio, LOW);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -121,6 +115,21 @@ protected:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (settings.opentherm.rxLedGpio != this->configuredRxLedGpio) {
|
||||||
|
if (this->configuredRxLedGpio != GPIO_IS_NOT_CONFIGURED) {
|
||||||
|
digitalWrite(this->configuredRxLedGpio, LOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GPIO_IS_VALID(settings.opentherm.rxLedGpio)) {
|
||||||
|
this->configuredRxLedGpio = settings.opentherm.rxLedGpio;
|
||||||
|
pinMode(this->configuredRxLedGpio, OUTPUT);
|
||||||
|
digitalWrite(this->configuredRxLedGpio, LOW);
|
||||||
|
|
||||||
|
} else if (this->configuredRxLedGpio != GPIO_IS_NOT_CONFIGURED) {
|
||||||
|
this->configuredRxLedGpio = GPIO_IS_NOT_CONFIGURED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool heatingEnabled = (vars.states.emergency || settings.heating.enable) && this->pump && this->isReady();
|
bool heatingEnabled = (vars.states.emergency || settings.heating.enable) && this->pump && this->isReady();
|
||||||
bool heatingCh2Enabled = settings.opentherm.heatingCh2Enabled;
|
bool heatingCh2Enabled = settings.opentherm.heatingCh2Enabled;
|
||||||
if (settings.opentherm.heatingCh1ToCh2) {
|
if (settings.opentherm.heatingCh1ToCh2) {
|
||||||
|
|||||||
@@ -32,11 +32,13 @@ protected:
|
|||||||
DallasTemperature* indoorSensor = nullptr;
|
DallasTemperature* indoorSensor = nullptr;
|
||||||
|
|
||||||
bool initOutdoorSensor = false;
|
bool initOutdoorSensor = false;
|
||||||
|
unsigned long initOutdoorSensorTime = 0;
|
||||||
unsigned long startOutdoorConversionTime = 0;
|
unsigned long startOutdoorConversionTime = 0;
|
||||||
float filteredOutdoorTemp = 0;
|
float filteredOutdoorTemp = 0;
|
||||||
bool emptyOutdoorTemp = true;
|
bool emptyOutdoorTemp = true;
|
||||||
|
|
||||||
bool initIndoorSensor = false;
|
bool initIndoorSensor = false;
|
||||||
|
unsigned long initIndoorSensorTime = 0;
|
||||||
unsigned long startIndoorConversionTime = 0;
|
unsigned long startIndoorConversionTime = 0;
|
||||||
float filteredIndoorTemp = 0;
|
float filteredIndoorTemp = 0;
|
||||||
bool emptyIndoorTemp = true;
|
bool emptyIndoorTemp = true;
|
||||||
@@ -229,10 +231,16 @@ protected:
|
|||||||
|
|
||||||
void outdoorTemperatureSensor() {
|
void outdoorTemperatureSensor() {
|
||||||
if (!this->initOutdoorSensor) {
|
if (!this->initOutdoorSensor) {
|
||||||
|
if (this->initOutdoorSensorTime && millis() - this->initOutdoorSensorTime < EXT_SENSORS_INTERVAL * 10) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Log.sinfoln(FPSTR(L_SENSORS_OUTDOOR), F("Starting on gpio %hhu..."), settings.sensors.outdoor.gpio);
|
Log.sinfoln(FPSTR(L_SENSORS_OUTDOOR), F("Starting on gpio %hhu..."), settings.sensors.outdoor.gpio);
|
||||||
|
|
||||||
this->oneWireOutdoorSensor->begin(settings.sensors.outdoor.gpio);
|
this->oneWireOutdoorSensor->begin(settings.sensors.outdoor.gpio);
|
||||||
|
this->oneWireOutdoorSensor->reset();
|
||||||
this->outdoorSensor->begin();
|
this->outdoorSensor->begin();
|
||||||
|
this->initOutdoorSensorTime = millis();
|
||||||
|
|
||||||
Log.straceln(
|
Log.straceln(
|
||||||
FPSTR(L_SENSORS_OUTDOOR),
|
FPSTR(L_SENSORS_OUTDOOR),
|
||||||
@@ -295,10 +303,16 @@ protected:
|
|||||||
|
|
||||||
void indoorTemperatureSensor() {
|
void indoorTemperatureSensor() {
|
||||||
if (!this->initIndoorSensor) {
|
if (!this->initIndoorSensor) {
|
||||||
|
if (this->initIndoorSensorTime && millis() - this->initIndoorSensorTime < EXT_SENSORS_INTERVAL * 10) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Log.sinfoln(FPSTR(L_SENSORS_INDOOR), F("Starting on gpio %hhu..."), settings.sensors.indoor.gpio);
|
Log.sinfoln(FPSTR(L_SENSORS_INDOOR), F("Starting on gpio %hhu..."), settings.sensors.indoor.gpio);
|
||||||
|
|
||||||
this->oneWireIndoorSensor->begin(settings.sensors.indoor.gpio);
|
this->oneWireIndoorSensor->begin(settings.sensors.indoor.gpio);
|
||||||
|
this->oneWireIndoorSensor->reset();
|
||||||
this->indoorSensor->begin();
|
this->indoorSensor->begin();
|
||||||
|
this->initIndoorSensorTime = millis();
|
||||||
|
|
||||||
Log.straceln(
|
Log.straceln(
|
||||||
FPSTR(L_SENSORS_INDOOR),
|
FPSTR(L_SENSORS_INDOOR),
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ struct Settings {
|
|||||||
} telnet;
|
} telnet;
|
||||||
|
|
||||||
UnitSystem unitSystem = UnitSystem::METRIC;
|
UnitSystem unitSystem = UnitSystem::METRIC;
|
||||||
|
byte statusLedGpio = DEFAULT_STATUS_LED_GPIO;
|
||||||
} system;
|
} system;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@@ -49,6 +50,7 @@ struct Settings {
|
|||||||
UnitSystem unitSystem = UnitSystem::METRIC;
|
UnitSystem unitSystem = UnitSystem::METRIC;
|
||||||
byte inGpio = DEFAULT_OT_IN_GPIO;
|
byte inGpio = DEFAULT_OT_IN_GPIO;
|
||||||
byte outGpio = DEFAULT_OT_OUT_GPIO;
|
byte outGpio = DEFAULT_OT_OUT_GPIO;
|
||||||
|
byte rxLedGpio = DEFAULT_OT_RX_LED_GPIO;
|
||||||
unsigned int memberIdCode = 0;
|
unsigned int memberIdCode = 0;
|
||||||
bool dhwPresent = true;
|
bool dhwPresent = true;
|
||||||
bool summerWinterMode = false;
|
bool summerWinterMode = false;
|
||||||
@@ -73,6 +75,7 @@ struct Settings {
|
|||||||
struct {
|
struct {
|
||||||
bool enable = true;
|
bool enable = true;
|
||||||
float target = 40.0f;
|
float target = 40.0f;
|
||||||
|
unsigned short tresholdTime = 120;
|
||||||
bool useEquitherm = false;
|
bool useEquitherm = false;
|
||||||
bool usePid = false;
|
bool usePid = false;
|
||||||
bool onNetworkFault = true;
|
bool onNetworkFault = true;
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
#define PROJECT_NAME "OpenTherm Gateway"
|
#define PROJECT_NAME "OpenTherm Gateway"
|
||||||
#define PROJECT_VERSION "1.4.0-rc.21"
|
#define PROJECT_VERSION "1.4.0-rc.22"
|
||||||
#define PROJECT_REPO "https://github.com/Laxilef/OTGateway"
|
#define PROJECT_REPO "https://github.com/Laxilef/OTGateway"
|
||||||
|
|
||||||
#define EMERGENCY_TIME_TRESHOLD 120000
|
|
||||||
#define MQTT_RECONNECT_INTERVAL 15000
|
#define MQTT_RECONNECT_INTERVAL 15000
|
||||||
|
|
||||||
#define EXT_SENSORS_INTERVAL 5000
|
#define EXT_SENSORS_INTERVAL 5000
|
||||||
@@ -53,6 +52,10 @@
|
|||||||
#define DEBUG_BY_DEFAULT false
|
#define DEBUG_BY_DEFAULT false
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEFAULT_STATUS_LED_GPIO
|
||||||
|
#define DEFAULT_STATUS_LED_GPIO GPIO_IS_NOT_CONFIGURED
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef DEFAULT_PORTAL_LOGIN
|
#ifndef DEFAULT_PORTAL_LOGIN
|
||||||
#define DEFAULT_PORTAL_LOGIN ""
|
#define DEFAULT_PORTAL_LOGIN ""
|
||||||
#endif
|
#endif
|
||||||
@@ -89,6 +92,10 @@
|
|||||||
#define DEFAULT_OT_OUT_GPIO GPIO_IS_NOT_CONFIGURED
|
#define DEFAULT_OT_OUT_GPIO GPIO_IS_NOT_CONFIGURED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef DEFAULT_OT_RX_LED_GPIO
|
||||||
|
#define DEFAULT_OT_RX_LED_GPIO GPIO_IS_NOT_CONFIGURED
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef DEFAULT_SENSOR_OUTDOOR_GPIO
|
#ifndef DEFAULT_SENSOR_OUTDOOR_GPIO
|
||||||
#define DEFAULT_SENSOR_OUTDOOR_GPIO GPIO_IS_NOT_CONFIGURED
|
#define DEFAULT_SENSOR_OUTDOOR_GPIO GPIO_IS_NOT_CONFIGURED
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
46
src/utils.h
46
src/utils.h
@@ -332,6 +332,7 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) {
|
|||||||
dst["system"]["telnet"]["enable"] = src.system.telnet.enable;
|
dst["system"]["telnet"]["enable"] = src.system.telnet.enable;
|
||||||
dst["system"]["telnet"]["port"] = src.system.telnet.port;
|
dst["system"]["telnet"]["port"] = src.system.telnet.port;
|
||||||
dst["system"]["unitSystem"] = static_cast<byte>(src.system.unitSystem);
|
dst["system"]["unitSystem"] = static_cast<byte>(src.system.unitSystem);
|
||||||
|
dst["system"]["statusLedGpio"] = src.system.statusLedGpio;
|
||||||
|
|
||||||
dst["portal"]["auth"] = src.portal.auth;
|
dst["portal"]["auth"] = src.portal.auth;
|
||||||
dst["portal"]["login"] = src.portal.login;
|
dst["portal"]["login"] = src.portal.login;
|
||||||
@@ -340,6 +341,7 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) {
|
|||||||
dst["opentherm"]["unitSystem"] = static_cast<byte>(src.opentherm.unitSystem);
|
dst["opentherm"]["unitSystem"] = static_cast<byte>(src.opentherm.unitSystem);
|
||||||
dst["opentherm"]["inGpio"] = src.opentherm.inGpio;
|
dst["opentherm"]["inGpio"] = src.opentherm.inGpio;
|
||||||
dst["opentherm"]["outGpio"] = src.opentherm.outGpio;
|
dst["opentherm"]["outGpio"] = src.opentherm.outGpio;
|
||||||
|
dst["opentherm"]["rxLedGpio"] = src.opentherm.rxLedGpio;
|
||||||
dst["opentherm"]["memberIdCode"] = src.opentherm.memberIdCode;
|
dst["opentherm"]["memberIdCode"] = src.opentherm.memberIdCode;
|
||||||
dst["opentherm"]["dhwPresent"] = src.opentherm.dhwPresent;
|
dst["opentherm"]["dhwPresent"] = src.opentherm.dhwPresent;
|
||||||
dst["opentherm"]["summerWinterMode"] = src.opentherm.summerWinterMode;
|
dst["opentherm"]["summerWinterMode"] = src.opentherm.summerWinterMode;
|
||||||
@@ -361,6 +363,7 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) {
|
|||||||
|
|
||||||
dst["emergency"]["enable"] = src.emergency.enable;
|
dst["emergency"]["enable"] = src.emergency.enable;
|
||||||
dst["emergency"]["target"] = roundd(src.emergency.target, 2);
|
dst["emergency"]["target"] = roundd(src.emergency.target, 2);
|
||||||
|
dst["emergency"]["tresholdTime"] = src.emergency.tresholdTime;
|
||||||
dst["emergency"]["useEquitherm"] = src.emergency.useEquitherm;
|
dst["emergency"]["useEquitherm"] = src.emergency.useEquitherm;
|
||||||
dst["emergency"]["usePid"] = src.emergency.usePid;
|
dst["emergency"]["usePid"] = src.emergency.usePid;
|
||||||
dst["emergency"]["onNetworkFault"] = src.emergency.onNetworkFault;
|
dst["emergency"]["onNetworkFault"] = src.emergency.onNetworkFault;
|
||||||
@@ -497,6 +500,23 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!src["system"]["statusLedGpio"].isNull()) {
|
||||||
|
if (src["system"]["statusLedGpio"].is<JsonString>() && src["system"]["statusLedGpio"].as<JsonString>().size() == 0) {
|
||||||
|
if (dst.system.statusLedGpio != GPIO_IS_NOT_CONFIGURED) {
|
||||||
|
dst.system.statusLedGpio = GPIO_IS_NOT_CONFIGURED;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
unsigned char value = src["system"]["statusLedGpio"].as<unsigned char>();
|
||||||
|
|
||||||
|
if (value >= 0 && value <= 254) {
|
||||||
|
dst.system.statusLedGpio = value;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// portal
|
// portal
|
||||||
if (src["portal"]["auth"].is<bool>()) {
|
if (src["portal"]["auth"].is<bool>()) {
|
||||||
@@ -577,6 +597,23 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!src["opentherm"]["rxLedGpio"].isNull()) {
|
||||||
|
if (src["opentherm"]["rxLedGpio"].is<JsonString>() && src["opentherm"]["rxLedGpio"].as<JsonString>().size() == 0) {
|
||||||
|
if (dst.opentherm.rxLedGpio != GPIO_IS_NOT_CONFIGURED) {
|
||||||
|
dst.opentherm.rxLedGpio = GPIO_IS_NOT_CONFIGURED;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
unsigned char value = src["opentherm"]["rxLedGpio"].as<unsigned char>();
|
||||||
|
|
||||||
|
if (value >= 0 && value <= 254) {
|
||||||
|
dst.opentherm.rxLedGpio = value;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!src["opentherm"]["memberIdCode"].isNull()) {
|
if (!src["opentherm"]["memberIdCode"].isNull()) {
|
||||||
unsigned int value = src["opentherm"]["memberIdCode"].as<unsigned int>();
|
unsigned int value = src["opentherm"]["memberIdCode"].as<unsigned int>();
|
||||||
|
|
||||||
@@ -713,6 +750,15 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
|
|||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!src["emergency"]["tresholdTime"].isNull()) {
|
||||||
|
unsigned short value = src["emergency"]["tresholdTime"].as<unsigned short>();
|
||||||
|
|
||||||
|
if (value >= 60 && value <= 1800) {
|
||||||
|
dst.emergency.tresholdTime = value;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (src["emergency"]["useEquitherm"].is<bool>()) {
|
if (src["emergency"]["useEquitherm"].is<bool>()) {
|
||||||
if (dst.sensors.outdoor.type != SensorType::MANUAL) {
|
if (dst.sensors.outdoor.type != SensorType::MANUAL) {
|
||||||
dst.emergency.useEquitherm = src["emergency"]["useEquitherm"].as<bool>();
|
dst.emergency.useEquitherm = src["emergency"]["useEquitherm"].as<bool>();
|
||||||
|
|||||||
@@ -202,10 +202,20 @@
|
|||||||
|
|
||||||
window.onload = async function () {
|
window.onload = async function () {
|
||||||
document.querySelector('#thermostat-heating-minus').addEventListener('click', (event) => {
|
document.querySelector('#thermostat-heating-minus').addEventListener('click', (event) => {
|
||||||
|
if (!prevSettings) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
newSettings.heating.target -= 0.5;
|
newSettings.heating.target -= 0.5;
|
||||||
modifiedTime = Date.now();
|
modifiedTime = Date.now();
|
||||||
|
|
||||||
const minTemp = noRegulators ? prevSettings.heating.minTemp : 5;
|
let minTemp;
|
||||||
|
if (noRegulators) {
|
||||||
|
minTemp = prevSettings.heating.minTemp;
|
||||||
|
} else {
|
||||||
|
minTemp = prevSettings.system.unitSystem == 0 ? 5 : 41;
|
||||||
|
}
|
||||||
|
|
||||||
if (prevSettings && newSettings.heating.target < minTemp) {
|
if (prevSettings && newSettings.heating.target < minTemp) {
|
||||||
newSettings.heating.target = minTemp;
|
newSettings.heating.target = minTemp;
|
||||||
}
|
}
|
||||||
@@ -214,10 +224,20 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
document.querySelector('#thermostat-heating-plus').addEventListener('click', (event) => {
|
document.querySelector('#thermostat-heating-plus').addEventListener('click', (event) => {
|
||||||
|
if (!prevSettings) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
newSettings.heating.target += 0.5;
|
newSettings.heating.target += 0.5;
|
||||||
modifiedTime = Date.now();
|
modifiedTime = Date.now();
|
||||||
|
|
||||||
const maxTemp = noRegulators ? prevSettings.heating.maxTemp : 30;
|
let maxTemp;
|
||||||
|
if (noRegulators) {
|
||||||
|
maxTemp = prevSettings.heating.maxTemp;
|
||||||
|
} else {
|
||||||
|
maxTemp = prevSettings.system.unitSystem == 0 ? 30 : 86;
|
||||||
|
}
|
||||||
|
|
||||||
if (prevSettings && newSettings.heating.target > maxTemp) {
|
if (prevSettings && newSettings.heating.target > maxTemp) {
|
||||||
newSettings.heating.target = maxTemp;
|
newSettings.heating.target = maxTemp;
|
||||||
}
|
}
|
||||||
@@ -226,10 +246,14 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
document.querySelector('#thermostat-dhw-minus').addEventListener('click', (event) => {
|
document.querySelector('#thermostat-dhw-minus').addEventListener('click', (event) => {
|
||||||
|
if (!prevSettings) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
newSettings.dhw.target -= 1;
|
newSettings.dhw.target -= 1;
|
||||||
modifiedTime = Date.now();
|
modifiedTime = Date.now();
|
||||||
|
|
||||||
if (prevSettings && newSettings.dhw.target < prevSettings.dhw.minTemp) {
|
if (newSettings.dhw.target < prevSettings.dhw.minTemp) {
|
||||||
newSettings.dhw.target = prevSettings.dhw.minTemp;
|
newSettings.dhw.target = prevSettings.dhw.minTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,10 +261,14 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
document.querySelector('#thermostat-dhw-plus').addEventListener('click', (event) => {
|
document.querySelector('#thermostat-dhw-plus').addEventListener('click', (event) => {
|
||||||
|
if (!prevSettings) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
newSettings.dhw.target += 1;
|
newSettings.dhw.target += 1;
|
||||||
modifiedTime = Date.now();
|
modifiedTime = Date.now();
|
||||||
|
|
||||||
if (prevSettings && newSettings.dhw.target > prevSettings.dhw.maxTemp) {
|
if (newSettings.dhw.target > prevSettings.dhw.maxTemp) {
|
||||||
newSettings.dhw.target = prevSettings.dhw.maxTemp;
|
newSettings.dhw.target = prevSettings.dhw.maxTemp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,39 +78,44 @@
|
|||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Serial</legend>
|
<label for="system-status-led-gpio">
|
||||||
|
Status LED GPIO
|
||||||
<label for="system-serial-enable">
|
<input type="number" inputmode="numeric" id="system-status-led-gpio" name="system[statusLedGpio]" min="0" max="254" step="1">
|
||||||
<input type="checkbox" id="system-serial-enable" name="system[serial][enable]" value="true">
|
<small>blank - not use</small>
|
||||||
Enable
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label for="system-serial-baudrate">
|
|
||||||
Baud rate
|
|
||||||
<input type="number" inputmode="numeric" id="system-serial-baudrate" name="system[serial][baudrate]" min="9600" max="115200" step="1" required>
|
|
||||||
<small>(Available: 9600, 19200, 38400, 57600, 74880, 115200)</small>
|
|
||||||
</label>
|
</label>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Telnet</legend>
|
<legend>Diagnostic</legend>
|
||||||
|
|
||||||
<label for="system-telnet-enable">
|
|
||||||
<input type="checkbox" id="system-telnet-enable" name="system[telnet][enable]" value="true">
|
|
||||||
Enable
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label for="system-telnet-port">
|
|
||||||
Port
|
|
||||||
<input type="number" inputmode="numeric" id="system-telnet-port" name="system[telnet][port]" min="1" max="65535" step="1" required>
|
|
||||||
</label>
|
|
||||||
</fieldset>
|
|
||||||
|
|
||||||
<fieldset>
|
|
||||||
<label for="system-debug">
|
<label for="system-debug">
|
||||||
<input type="checkbox" id="system-debug" name="system[debug]" value="true">
|
<input type="checkbox" id="system-debug" name="system[debug]" value="true">
|
||||||
Debug mode
|
Debug mode
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
|
<label for="system-serial-enable">
|
||||||
|
<input type="checkbox" id="system-serial-enable" name="system[serial][enable]" value="true">
|
||||||
|
Enable Serial port
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label for="system-telnet-enable">
|
||||||
|
<input type="checkbox" id="system-telnet-enable" name="system[telnet][enable]" value="true">
|
||||||
|
Enable Telnet
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="grid">
|
||||||
|
<label for="system-serial-baudrate">
|
||||||
|
Serial port baud rate
|
||||||
|
<input type="number" inputmode="numeric" id="system-serial-baudrate" name="system[serial][baudrate]" min="9600" max="115200" step="1" required>
|
||||||
|
<small>Available: 9600, 19200, 38400, 57600, 74880, 115200</small>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label for="system-telnet-port">
|
||||||
|
Telnet port
|
||||||
|
<input type="number" inputmode="numeric" id="system-telnet-port" name="system[telnet][port]" min="1" max="65535" step="1" required>
|
||||||
|
<small>Default: 23</small>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<fieldset>
|
<fieldset>
|
||||||
@@ -195,9 +200,13 @@
|
|||||||
<input type="checkbox" id="emergency-enable" name="emergency[enable]" value="true">
|
<input type="checkbox" id="emergency-enable" name="emergency[enable]" value="true">
|
||||||
Enable
|
Enable
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
|
<small>
|
||||||
|
<b>!</b> Emergency mode can be useful <u>only</u> when using Equitherm and/or PID (when normal work) and when reporting indoor/outdoor temperature via MQTT or API. In this mode, sensor values that are reported via MQTT/API are not used.
|
||||||
|
</small>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<fieldset>
|
<div class="grid">
|
||||||
<label for="emergency-target">
|
<label for="emergency-target">
|
||||||
Target temperature
|
Target temperature
|
||||||
<input type="number" inputmode="numeric" id="emergency-target" name="emergency[target]" min="0" max="0" step="1" required>
|
<input type="number" inputmode="numeric" id="emergency-target" name="emergency[target]" min="0" max="0" step="1" required>
|
||||||
@@ -206,7 +215,12 @@
|
|||||||
<u>Heat carrier temperature</u> if Equitherm and PID <b>is disabled</b>
|
<u>Heat carrier temperature</u> if Equitherm and PID <b>is disabled</b>
|
||||||
</small>
|
</small>
|
||||||
</label>
|
</label>
|
||||||
</fieldset>
|
|
||||||
|
<label for="emergency-treshold-time">
|
||||||
|
Treshold time <small>(sec)</small>
|
||||||
|
<input type="number" inputmode="numeric" id="emergency-treshold-time" name="emergency[tresholdTime]" min="60" max="1800" step="1" required>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Events</legend>
|
<legend>Events</legend>
|
||||||
@@ -223,15 +237,19 @@
|
|||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Regulators</legend>
|
<legend>Using regulators</legend>
|
||||||
|
|
||||||
<label for="emergency-use-equitherm">
|
<label for="emergency-use-equitherm">
|
||||||
<input type="checkbox" id="emergency-use-equitherm" name="emergency[useEquitherm]" value="true">
|
<input type="checkbox" id="emergency-use-equitherm" name="emergency[useEquitherm]" value="true">
|
||||||
Use Equitherm
|
<span>
|
||||||
|
Equitherm <small>(requires at least an external/boiler <u>outdoor</u> sensor)</small>
|
||||||
|
</span>
|
||||||
</label>
|
</label>
|
||||||
<label for="emergency-use-pid">
|
<label for="emergency-use-pid">
|
||||||
<input type="checkbox" id="emergency-use-pid" name="emergency[usePid]" value="true">
|
<input type="checkbox" id="emergency-use-pid" name="emergency[usePid]" value="true">
|
||||||
Use PID
|
<span>
|
||||||
|
PID <small>(requires at least an external/BLE <u>indoor</u> sensor)</small>
|
||||||
|
</span>
|
||||||
</label>
|
</label>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
||||||
@@ -363,6 +381,14 @@
|
|||||||
Out GPIO
|
Out GPIO
|
||||||
<input type="number" inputmode="numeric" id="opentherm-out-gpio" name="opentherm[outGpio]" min="0" max="254" step="1">
|
<input type="number" inputmode="numeric" id="opentherm-out-gpio" name="opentherm[outGpio]" min="0" max="254" step="1">
|
||||||
</label>
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="grid">
|
||||||
|
<label for="opentherm-rx-led-gpio">
|
||||||
|
RX LED GPIO
|
||||||
|
<input type="number" inputmode="numeric" id="opentherm-rx-led-gpio" name="opentherm[rxLedGpio]" min="0" max="254" step="1">
|
||||||
|
<small>blank - not use</small>
|
||||||
|
</label>
|
||||||
|
|
||||||
<label for="opentherm-member-id-code">
|
<label for="opentherm-member-id-code">
|
||||||
Master MemberID code
|
Master MemberID code
|
||||||
@@ -630,6 +656,7 @@
|
|||||||
setCheckboxValue('#system-telnet-enable', data.system.telnet.enable);
|
setCheckboxValue('#system-telnet-enable', data.system.telnet.enable);
|
||||||
setInputValue('#system-telnet-port', data.system.telnet.port);
|
setInputValue('#system-telnet-port', data.system.telnet.port);
|
||||||
setRadioValue('#system-unit-system', data.system.unitSystem);
|
setRadioValue('#system-unit-system', data.system.unitSystem);
|
||||||
|
setInputValue('#system-status-led-gpio', data.system.statusLedGpio < 255 ? data.system.statusLedGpio : '');
|
||||||
setBusy('#system-settings-busy', '#system-settings', false);
|
setBusy('#system-settings-busy', '#system-settings', false);
|
||||||
|
|
||||||
// Portal
|
// Portal
|
||||||
@@ -642,6 +669,7 @@
|
|||||||
setRadioValue('#opentherm-unit-system', data.opentherm.unitSystem);
|
setRadioValue('#opentherm-unit-system', data.opentherm.unitSystem);
|
||||||
setInputValue('#opentherm-in-gpio', data.opentherm.inGpio < 255 ? data.opentherm.inGpio : '');
|
setInputValue('#opentherm-in-gpio', data.opentherm.inGpio < 255 ? data.opentherm.inGpio : '');
|
||||||
setInputValue('#opentherm-out-gpio', data.opentherm.outGpio < 255 ? data.opentherm.outGpio : '');
|
setInputValue('#opentherm-out-gpio', data.opentherm.outGpio < 255 ? data.opentherm.outGpio : '');
|
||||||
|
setInputValue('#opentherm-rx-led-gpio', data.opentherm.rxLedGpio < 255 ? data.opentherm.rxLedGpio : '');
|
||||||
setInputValue('#opentherm-member-id-code', data.opentherm.memberIdCode);
|
setInputValue('#opentherm-member-id-code', data.opentherm.memberIdCode);
|
||||||
setCheckboxValue('#opentherm-dhw-present', data.opentherm.dhwPresent);
|
setCheckboxValue('#opentherm-dhw-present', data.opentherm.dhwPresent);
|
||||||
setCheckboxValue('#opentherm-sw-mode', data.opentherm.summerWinterMode);
|
setCheckboxValue('#opentherm-sw-mode', data.opentherm.summerWinterMode);
|
||||||
@@ -710,6 +738,7 @@
|
|||||||
|
|
||||||
// Emergency mode
|
// Emergency mode
|
||||||
setCheckboxValue('#emergency-enable', data.emergency.enable);
|
setCheckboxValue('#emergency-enable', data.emergency.enable);
|
||||||
|
setInputValue('#emergency-treshold-time', data.emergency.tresholdTime);
|
||||||
setCheckboxValue('#emergency-use-equitherm', data.emergency.useEquitherm);
|
setCheckboxValue('#emergency-use-equitherm', data.emergency.useEquitherm);
|
||||||
setCheckboxValue('#emergency-use-pid', data.emergency.usePid);
|
setCheckboxValue('#emergency-use-pid', data.emergency.usePid);
|
||||||
setCheckboxValue('#emergency-on-network-fault', data.emergency.onNetworkFault);
|
setCheckboxValue('#emergency-on-network-fault', data.emergency.onNetworkFault);
|
||||||
@@ -584,6 +584,7 @@ function memberIdToVendor(memberId) {
|
|||||||
27: "Baxi",
|
27: "Baxi",
|
||||||
29: "Itho Daalderop",
|
29: "Itho Daalderop",
|
||||||
33: "Viessmann",
|
33: "Viessmann",
|
||||||
|
41: "Italtherm",
|
||||||
56: "Baxi Luna Duo-Tec",
|
56: "Baxi Luna Duo-Tec",
|
||||||
131: "Nefit",
|
131: "Nefit",
|
||||||
148: "Navien",
|
148: "Navien",
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import shutil
|
import shutil
|
||||||
|
import gzip
|
||||||
import os
|
import os
|
||||||
Import("env")
|
Import("env")
|
||||||
|
|
||||||
@@ -12,6 +13,23 @@ def post_build(source, target, env):
|
|||||||
env.Execute("pio run --target buildfs --environment %s" % env["PIOENV"]);
|
env.Execute("pio run --target buildfs --environment %s" % env["PIOENV"]);
|
||||||
|
|
||||||
|
|
||||||
|
def before_buildfs(source, target, env):
|
||||||
|
src = os.path.join(env["PROJECT_DIR"], "src_data")
|
||||||
|
dst = os.path.join(env["PROJECT_DIR"], "data")
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(src, topdown=False):
|
||||||
|
for name in files:
|
||||||
|
src_path = os.path.join(root, name)
|
||||||
|
|
||||||
|
with open(src_path, 'rb') as f_in:
|
||||||
|
dst_name = name + ".gz"
|
||||||
|
dst_path = os.path.join(dst, os.path.relpath(root, src), dst_name)
|
||||||
|
|
||||||
|
with gzip.open(dst_path, 'wb', 9) as f_out:
|
||||||
|
shutil.copyfileobj(f_in, f_out)
|
||||||
|
|
||||||
|
print("Compressed '%s' to '%s'" % (src_path, dst_path))
|
||||||
|
|
||||||
def after_buildfs(source, target, env):
|
def after_buildfs(source, target, env):
|
||||||
copy_to_build_dir({
|
copy_to_build_dir({
|
||||||
source[0].get_abspath(): "filesystem_%s_%s.bin" % (env["PIOENV"], env.GetProjectOption("version")),
|
source[0].get_abspath(): "filesystem_%s_%s.bin" % (env["PIOENV"], env.GetProjectOption("version")),
|
||||||
@@ -31,4 +49,6 @@ def copy_to_build_dir(files, build_dir):
|
|||||||
|
|
||||||
|
|
||||||
env.AddPostAction("buildprog", post_build)
|
env.AddPostAction("buildprog", post_build)
|
||||||
|
env.AddPreAction("$BUILD_DIR/spiffs.bin", before_buildfs)
|
||||||
|
env.AddPreAction("$BUILD_DIR/littlefs.bin", before_buildfs)
|
||||||
env.AddPostAction("buildfs", after_buildfs)
|
env.AddPostAction("buildfs", after_buildfs)
|
||||||
Reference in New Issue
Block a user