mirror of
https://github.com/Laxilef/OTGateway.git
synced 2026-05-16 22:38:16 +05:00
Compare commits
44 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c6117f106e | |||
| 66a433e0dd | |||
| bfc1cc1118 | |||
| 01a70b3288 | |||
| 5d053690c6 | |||
| ea95b5fa7d | |||
| dd9cb0b88f | |||
| ec7a24ce0c | |||
| 44fb0afffa | |||
| dcc9b37010 | |||
| 554342e7f5 | |||
| ef1d6bf195 | |||
| 2bd3360880 | |||
| cbc32fd378 | |||
| 79e3c6d433 | |||
| 8186e17912 | |||
| 9a3a171370 | |||
| 7c40984298 | |||
| 4775d36f1b | |||
| 5482e0b70a | |||
| 3fdb48e016 | |||
| 11747dd8bd | |||
| af1a9b59c4 | |||
| 9c86ad4427 | |||
| 5f8ca61d79 | |||
| 1f895690db | |||
| 13e8bedf3f | |||
| 3a6bb03456 | |||
| ced0385d5b | |||
| 7fcca3c4aa | |||
| 2f6bd237c7 | |||
| e4d1ba7d7b | |||
| 80e2d8e939 | |||
| b70c212235 | |||
| 781b2a1f9c | |||
| 725185beba | |||
| c6518db0d3 | |||
| 10ab75c055 | |||
| 069ba8e864 | |||
| 3b038c4bd1 | |||
| 1d7f85f462 | |||
| 192f4ee18b | |||
| f048d973d3 | |||
| d576969ea4 |
+1
-1
@@ -1,4 +1,5 @@
|
|||||||
.pio
|
.pio
|
||||||
|
.dummy
|
||||||
.vscode
|
.vscode
|
||||||
.PVS-Studio
|
.PVS-Studio
|
||||||
build/*
|
build/*
|
||||||
@@ -10,5 +11,4 @@ package-lock.json
|
|||||||
*.lock
|
*.lock
|
||||||
sdkconfig.*
|
sdkconfig.*
|
||||||
CMakeLists.txt
|
CMakeLists.txt
|
||||||
!sdkconfig.defaults
|
|
||||||
!.gitkeep
|
!.gitkeep
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
[](https://github.com/Laxilef/OTGateway/releases)
|
[](https://github.com/Laxilef/OTGateway/releases)
|
||||||
[](https://github.com/Laxilef/OTGateway/releases/latest)
|
[](https://github.com/Laxilef/OTGateway/releases/latest)
|
||||||
|
[](https://hosted.weblate.org/engage/otgateway/)
|
||||||
[](LICENSE.txt)
|
[](LICENSE.txt)
|
||||||
[](https://t.me/otgateway)
|
[](https://t.me/otgateway)
|
||||||
|
|
||||||
@@ -71,6 +72,14 @@ All available information and instructions can be found in the wiki:
|
|||||||
* [Connection](https://github.com/Laxilef/OTGateway/wiki/OT-adapters#connection)
|
* [Connection](https://github.com/Laxilef/OTGateway/wiki/OT-adapters#connection)
|
||||||
* [Leds on board](https://github.com/Laxilef/OTGateway/wiki/OT-adapters#leds-on-board)
|
* [Leds on board](https://github.com/Laxilef/OTGateway/wiki/OT-adapters#leds-on-board)
|
||||||
|
|
||||||
|
## Translations
|
||||||
|
The project uses [Weblate](https://hosted.weblate.org/new-lang/otgateway/) to manage translations of the interface.<br />
|
||||||
|
Anyone is welcome to add their native language as a [new localization](https://hosted.weblate.org/new-lang/otgateway/portal/). All contributions are welcome!
|
||||||
|
|
||||||
|
<a href="https://hosted.weblate.org/engage/otgateway/">
|
||||||
|
<img src="https://hosted.weblate.org/widget/otgateway/multi-auto.svg" alt="Translation status" />
|
||||||
|
</a>
|
||||||
|
|
||||||
## Gratitude
|
## Gratitude
|
||||||
* To the developers of the libraries used: [OpenTherm Library](https://github.com/ihormelnyk/opentherm_library), [ESP8266Scheduler](https://github.com/nrwiersma/ESP8266Scheduler), [ArduinoJson](https://github.com/bblanchon/ArduinoJson), [NimBLE-Arduino](https://github.com/h2zero/NimBLE-Arduino), [ArduinoMqttClient](https://github.com/arduino-libraries/ArduinoMqttClient), [ESPTelnet](https://github.com/LennartHennigs/ESPTelnet), [FileData](https://github.com/GyverLibs/FileData), [GyverPID](https://github.com/GyverLibs/GyverPID), [GyverBlinker](https://github.com/GyverLibs/GyverBlinker), [OneWireNg](https://github.com/pstolarz/OneWireNg) & [OneWire](https://github.com/PaulStoffregen/OneWire)
|
* To the developers of the libraries used: [OpenTherm Library](https://github.com/ihormelnyk/opentherm_library), [ESP8266Scheduler](https://github.com/nrwiersma/ESP8266Scheduler), [ArduinoJson](https://github.com/bblanchon/ArduinoJson), [NimBLE-Arduino](https://github.com/h2zero/NimBLE-Arduino), [ArduinoMqttClient](https://github.com/arduino-libraries/ArduinoMqttClient), [ESPTelnet](https://github.com/LennartHennigs/ESPTelnet), [FileData](https://github.com/GyverLibs/FileData), [GyverPID](https://github.com/GyverLibs/GyverPID), [GyverBlinker](https://github.com/GyverLibs/GyverBlinker), [OneWireNg](https://github.com/pstolarz/OneWireNg) & [OneWire](https://github.com/PaulStoffregen/OneWire)
|
||||||
* To the [PlatformIO](https://platformio.org/) Team
|
* To the [PlatformIO](https://platformio.org/) Team
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Blueprint for reporting indoor/outdoor temperature to OpenTherm Gateway from any home assistant sensor
|
# Blueprint for reporting indoor/outdoor temperature to OpenTherm Gateway from any home assistant sensor
|
||||||
# Updated: 03.09.2024
|
# Updated: 26.01.2026
|
||||||
|
|
||||||
blueprint:
|
blueprint:
|
||||||
name: Report temp to OpenTherm Gateway
|
name: Report temp to OpenTherm Gateway
|
||||||
@@ -15,7 +15,6 @@ blueprint:
|
|||||||
multiple: false
|
multiple: false
|
||||||
filter:
|
filter:
|
||||||
- domain: sensor
|
- domain: sensor
|
||||||
device_class: temperature
|
|
||||||
target_entity:
|
target_entity:
|
||||||
name: Target entity
|
name: Target entity
|
||||||
description: "Usually ``number.opentherm_indoor_temp`` or ``number.opentherm_outdoor_temp``"
|
description: "Usually ``number.opentherm_indoor_temp`` or ``number.opentherm_outdoor_temp``"
|
||||||
@@ -38,8 +37,12 @@ condition:
|
|||||||
value_template: "{{ states(source_entity) != 'unavailable' and states(target_entity) != 'unavailable' }}"
|
value_template: "{{ states(source_entity) != 'unavailable' and states(target_entity) != 'unavailable' }}"
|
||||||
action:
|
action:
|
||||||
- if:
|
- if:
|
||||||
- condition: template
|
- condition: or
|
||||||
value_template: "{{ (states(source_entity)|float(0) - states(target_entity)|float(0)) | abs | round(2) >= 0.01 }}"
|
conditions:
|
||||||
|
- condition: template
|
||||||
|
value_template: "{{ (states(source_entity)|float(0) - states(target_entity)|float(0)) | abs | round(2) >= 0.01 }}"
|
||||||
|
- condition: template
|
||||||
|
value_template: "{{ (as_timestamp(now()) - as_timestamp(states[target_entity].last_updated)) | int(0) > 300 }}"
|
||||||
then:
|
then:
|
||||||
- service: number.set_value
|
- service: number.set_value
|
||||||
data:
|
data:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Blueprint for reporting temperature to OpenTherm Gateway from home assistant weather integration
|
# Blueprint for reporting temperature to OpenTherm Gateway from home assistant weather integration
|
||||||
# Updated: 03.09.2024
|
# Updated: 26.01.2026
|
||||||
|
|
||||||
blueprint:
|
blueprint:
|
||||||
name: Report temp to OpenTherm Gateway from Weather
|
name: Report temp to OpenTherm Gateway from Weather
|
||||||
@@ -37,8 +37,12 @@ condition:
|
|||||||
value_template: "{{ states(source_entity) != 'unavailable' and states(target_entity) != 'unavailable' }}"
|
value_template: "{{ states(source_entity) != 'unavailable' and states(target_entity) != 'unavailable' }}"
|
||||||
action:
|
action:
|
||||||
- if:
|
- if:
|
||||||
- condition: template
|
- condition: or
|
||||||
value_template: "{{ (state_attr(source_entity, 'temperature')|float(0) - states(target_entity)|float(0)) | abs | round(2) >= 0.1 }}"
|
conditions:
|
||||||
|
- condition: template
|
||||||
|
value_template: "{{ (state_attr(source_entity, 'temperature')|float(0) - states(target_entity)|float(0)) | abs | round(2) >= 0.1 }}"
|
||||||
|
- condition: template
|
||||||
|
value_template: "{{ (as_timestamp(now()) - as_timestamp(states[target_entity].last_updated)) | int(0) > 300 }}"
|
||||||
then:
|
then:
|
||||||
- service: number.set_value
|
- service: number.set_value
|
||||||
data:
|
data:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
|
||||||
class UpgradeHandler : public RequestHandler {
|
class UpgradeHandler : public AsyncWebHandler {
|
||||||
public:
|
public:
|
||||||
enum class UpgradeType {
|
enum class UpgradeType {
|
||||||
FIRMWARE = 0,
|
FIRMWARE = 0,
|
||||||
@@ -12,7 +12,7 @@ public:
|
|||||||
NO_FILE,
|
NO_FILE,
|
||||||
SUCCESS,
|
SUCCESS,
|
||||||
PROHIBITED,
|
PROHIBITED,
|
||||||
ABORTED,
|
SIZE_MISMATCH,
|
||||||
ERROR_ON_START,
|
ERROR_ON_START,
|
||||||
ERROR_ON_WRITE,
|
ERROR_ON_WRITE,
|
||||||
ERROR_ON_FINISH
|
ERROR_ON_FINISH
|
||||||
@@ -22,27 +22,21 @@ public:
|
|||||||
UpgradeType type;
|
UpgradeType type;
|
||||||
UpgradeStatus status;
|
UpgradeStatus status;
|
||||||
String error;
|
String error;
|
||||||
|
size_t progress = 0;
|
||||||
|
size_t size = 0;
|
||||||
} UpgradeResult;
|
} UpgradeResult;
|
||||||
|
|
||||||
typedef std::function<bool(HTTPMethod, const String&)> CanHandleCallback;
|
typedef std::function<bool(AsyncWebServerRequest *request, UpgradeType)> BeforeUpgradeCallback;
|
||||||
typedef std::function<bool(const String&)> CanUploadCallback;
|
typedef std::function<void(AsyncWebServerRequest *request, const UpgradeResult&, const UpgradeResult&)> AfterUpgradeCallback;
|
||||||
typedef std::function<bool(UpgradeType)> BeforeUpgradeCallback;
|
|
||||||
typedef std::function<void(const UpgradeResult&, const UpgradeResult&)> AfterUpgradeCallback;
|
|
||||||
|
|
||||||
UpgradeHandler(const char* uri) {
|
UpgradeHandler(AsyncURIMatcher uri) : uri(uri) {}
|
||||||
this->uri = uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
UpgradeHandler* setCanHandleCallback(CanHandleCallback callback = nullptr) {
|
bool canHandle(AsyncWebServerRequest *request) const override final {
|
||||||
this->canHandleCallback = callback;
|
if (!request->isHTTP()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return this;
|
return this->uri.matches(request);
|
||||||
}
|
|
||||||
|
|
||||||
UpgradeHandler* setCanUploadCallback(CanUploadCallback callback = nullptr) {
|
|
||||||
this->canUploadCallback = callback;
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UpgradeHandler* setBeforeUpgradeCallback(BeforeUpgradeCallback callback = nullptr) {
|
UpgradeHandler* setBeforeUpgradeCallback(BeforeUpgradeCallback callback = nullptr) {
|
||||||
@@ -57,29 +51,9 @@ public:
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32)
|
void handleRequest(AsyncWebServerRequest *request) override final {
|
||||||
bool canHandle(WebServer &server, HTTPMethod method, const String &uri) override {
|
|
||||||
return this->canHandle(method, uri);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool canHandle(HTTPMethod method, const String& uri) override {
|
|
||||||
return method == HTTP_POST && uri.equals(this->uri) && (!this->canHandleCallback || this->canHandleCallback(method, uri));
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32)
|
|
||||||
bool canUpload(WebServer &server, const String &uri) override {
|
|
||||||
return this->canUpload(uri);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool canUpload(const String& uri) override {
|
|
||||||
return uri.equals(this->uri) && (!this->canUploadCallback || this->canUploadCallback(uri));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool handle(WebServer& server, HTTPMethod method, const String& uri) override {
|
|
||||||
if (this->afterUpgradeCallback) {
|
if (this->afterUpgradeCallback) {
|
||||||
this->afterUpgradeCallback(this->firmwareResult, this->filesystemResult);
|
this->afterUpgradeCallback(request, this->firmwareResult, this->filesystemResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
this->firmwareResult.status = UpgradeStatus::NONE;
|
this->firmwareResult.status = UpgradeStatus::NONE;
|
||||||
@@ -87,129 +61,147 @@ public:
|
|||||||
|
|
||||||
this->filesystemResult.status = UpgradeStatus::NONE;
|
this->filesystemResult.status = UpgradeStatus::NONE;
|
||||||
this->filesystemResult.error.clear();
|
this->filesystemResult.error.clear();
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void upload(WebServer& server, const String& uri, HTTPUpload& upload) override {
|
void handleUpload(AsyncWebServerRequest *request, const String &fileName, size_t index, uint8_t *data, size_t dataLength, bool isFinal) override final {
|
||||||
UpgradeResult* result;
|
UpgradeResult* result = nullptr;
|
||||||
if (upload.name.equals(F("firmware"))) {
|
|
||||||
result = &this->firmwareResult;
|
|
||||||
|
|
||||||
} else if (upload.name.equals(F("filesystem"))) {
|
if (!request->hasParam(asyncsrv::T_name, true, true)) {
|
||||||
result = &this->filesystemResult;
|
// Missing content-disposition 'name' parameter
|
||||||
|
|
||||||
} else {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto& pName = request->getParam(asyncsrv::T_name, true, true)->value();
|
||||||
|
if (pName.equals("fw")) {
|
||||||
|
result = &this->firmwareResult;
|
||||||
|
|
||||||
|
if (!index) {
|
||||||
|
result->progress = 0;
|
||||||
|
result->size = request->hasParam("fw_size", true)
|
||||||
|
? request->getParam("fw_size", true)->value().toInt()
|
||||||
|
: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (pName.equals("fs")) {
|
||||||
|
result = &this->filesystemResult;
|
||||||
|
|
||||||
|
if (!index) {
|
||||||
|
result->progress = 0;
|
||||||
|
result->size = request->hasParam("fs_size", true)
|
||||||
|
? request->getParam("fs_size", true)->value().toInt()
|
||||||
|
: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Unknown parameter name
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check result status
|
||||||
if (result->status != UpgradeStatus::NONE) {
|
if (result->status != UpgradeStatus::NONE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->beforeUpgradeCallback && !this->beforeUpgradeCallback(result->type)) {
|
if (this->beforeUpgradeCallback && !this->beforeUpgradeCallback(request, result->type)) {
|
||||||
result->status = UpgradeStatus::PROHIBITED;
|
result->status = UpgradeStatus::PROHIBITED;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!upload.filename.length()) {
|
if (!fileName.length()) {
|
||||||
result->status = UpgradeStatus::NO_FILE;
|
result->status = UpgradeStatus::NO_FILE;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (upload.status == UPLOAD_FILE_START) {
|
if (!index) {
|
||||||
// reset
|
// reset
|
||||||
if (Update.isRunning()) {
|
if (Update.isRunning()) {
|
||||||
Update.end(false);
|
Update.end(false);
|
||||||
Update.clearError();
|
Update.clearError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// try begin
|
||||||
bool begin = false;
|
bool begin = false;
|
||||||
#ifdef ARDUINO_ARCH_ESP8266
|
|
||||||
Update.runAsync(true);
|
|
||||||
|
|
||||||
if (result->type == UpgradeType::FIRMWARE) {
|
|
||||||
begin = Update.begin((ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000, U_FLASH);
|
|
||||||
|
|
||||||
} else if (result->type == UpgradeType::FILESYSTEM) {
|
|
||||||
close_all_fs();
|
|
||||||
begin = Update.begin((size_t)FS_end - (size_t)FS_start, U_FS);
|
|
||||||
}
|
|
||||||
#elif defined(ARDUINO_ARCH_ESP32)
|
|
||||||
if (result->type == UpgradeType::FIRMWARE) {
|
if (result->type == UpgradeType::FIRMWARE) {
|
||||||
begin = Update.begin(UPDATE_SIZE_UNKNOWN, U_FLASH);
|
begin = Update.begin(UPDATE_SIZE_UNKNOWN, U_FLASH);
|
||||||
|
|
||||||
} else if (result->type == UpgradeType::FILESYSTEM) {
|
} else if (result->type == UpgradeType::FILESYSTEM) {
|
||||||
begin = Update.begin(UPDATE_SIZE_UNKNOWN, U_SPIFFS);
|
begin = Update.begin(UPDATE_SIZE_UNKNOWN, U_SPIFFS);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!begin || Update.hasError()) {
|
if (!begin || Update.hasError()) {
|
||||||
result->status = UpgradeStatus::ERROR_ON_START;
|
result->status = UpgradeStatus::ERROR_ON_START;
|
||||||
#ifdef ARDUINO_ARCH_ESP8266
|
|
||||||
result->error = Update.getErrorString();
|
|
||||||
#else
|
|
||||||
result->error = Update.errorString();
|
result->error = Update.errorString();
|
||||||
#endif
|
|
||||||
|
|
||||||
Log.serrorln(FPSTR(L_PORTAL_OTA), F("File '%s', on start: %s"), upload.filename.c_str(), result->error.c_str());
|
Log.serrorln(FPSTR(L_PORTAL_OTA), "File '%s', on start: %s", fileName.c_str(), result->error.c_str());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.sinfoln(FPSTR(L_PORTAL_OTA), F("File '%s', started"), upload.filename.c_str());
|
Log.sinfoln(FPSTR(L_PORTAL_OTA), "File '%s', started", fileName.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
} else if (upload.status == UPLOAD_FILE_WRITE) {
|
if (dataLength) {
|
||||||
if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
|
if (Update.write(data, dataLength) != dataLength) {
|
||||||
Update.end(false);
|
Update.end(false);
|
||||||
|
|
||||||
result->status = UpgradeStatus::ERROR_ON_WRITE;
|
result->status = UpgradeStatus::ERROR_ON_WRITE;
|
||||||
#ifdef ARDUINO_ARCH_ESP8266
|
|
||||||
result->error = Update.getErrorString();
|
|
||||||
#else
|
|
||||||
result->error = Update.errorString();
|
result->error = Update.errorString();
|
||||||
#endif
|
|
||||||
|
|
||||||
Log.serrorln(
|
Log.serrorln(
|
||||||
FPSTR(L_PORTAL_OTA),
|
FPSTR(L_PORTAL_OTA), "File '%s', on write %d bytes, %d of %d bytes",
|
||||||
F("File '%s', on writing %d bytes: %s"),
|
fileName.c_str(),
|
||||||
upload.filename.c_str(), upload.totalSize, result->error.c_str()
|
dataLength,
|
||||||
|
result->progress + dataLength,
|
||||||
|
result->size
|
||||||
);
|
);
|
||||||
|
return;
|
||||||
} else {
|
|
||||||
Log.sinfoln(FPSTR(L_PORTAL_OTA), F("File '%s', writed %d bytes"), upload.filename.c_str(), upload.totalSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (upload.status == UPLOAD_FILE_END) {
|
result->progress += dataLength;
|
||||||
if (Update.end(true)) {
|
Log.sinfoln(
|
||||||
result->status = UpgradeStatus::SUCCESS;
|
FPSTR(L_PORTAL_OTA), "File '%s', write %d bytes, %d of %d bytes",
|
||||||
|
fileName.c_str(),
|
||||||
|
dataLength,
|
||||||
|
result->progress,
|
||||||
|
result->size
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Log.sinfoln(FPSTR(L_PORTAL_OTA), F("File '%s': finish"), upload.filename.c_str());
|
if (result->size > 0) {
|
||||||
|
if (result->progress > result->size || (isFinal && result->progress < result->size)) {
|
||||||
|
Update.end(false);
|
||||||
|
result->status = UpgradeStatus::SIZE_MISMATCH;
|
||||||
|
|
||||||
} else {
|
Log.serrorln(
|
||||||
|
FPSTR(L_PORTAL_OTA), "File '%s', size mismatch: %d of %d bytes",
|
||||||
|
fileName.c_str(),
|
||||||
|
result->progress,
|
||||||
|
result->size
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isFinal) {
|
||||||
|
if (!Update.end(true)) {
|
||||||
result->status = UpgradeStatus::ERROR_ON_FINISH;
|
result->status = UpgradeStatus::ERROR_ON_FINISH;
|
||||||
#ifdef ARDUINO_ARCH_ESP8266
|
|
||||||
result->error = Update.getErrorString();
|
|
||||||
#else
|
|
||||||
result->error = Update.errorString();
|
result->error = Update.errorString();
|
||||||
#endif
|
|
||||||
|
|
||||||
Log.serrorln(FPSTR(L_PORTAL_OTA), F("File '%s', on finish: %s"), upload.filename.c_str(), result->error);
|
Log.serrorln(FPSTR(L_PORTAL_OTA), "File '%s', on finish: %s", fileName.c_str(), result->error);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (upload.status == UPLOAD_FILE_ABORTED) {
|
result->status = UpgradeStatus::SUCCESS;
|
||||||
Update.end(false);
|
Log.sinfoln(FPSTR(L_PORTAL_OTA), "File '%s': finish", fileName.c_str());
|
||||||
result->status = UpgradeStatus::ABORTED;
|
|
||||||
|
|
||||||
Log.serrorln(FPSTR(L_PORTAL_OTA), F("File '%s': aborted"), upload.filename.c_str());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isRequestHandlerTrivial() const override final {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
CanHandleCallback canHandleCallback;
|
|
||||||
CanUploadCallback canUploadCallback;
|
|
||||||
BeforeUpgradeCallback beforeUpgradeCallback;
|
BeforeUpgradeCallback beforeUpgradeCallback;
|
||||||
AfterUpgradeCallback afterUpgradeCallback;
|
AfterUpgradeCallback afterUpgradeCallback;
|
||||||
const char* uri = nullptr;
|
AsyncURIMatcher uri;
|
||||||
|
|
||||||
UpgradeResult firmwareResult{UpgradeType::FIRMWARE, UpgradeStatus::NONE};
|
UpgradeResult firmwareResult{UpgradeType::FIRMWARE, UpgradeStatus::NONE};
|
||||||
UpgradeResult filesystemResult{UpgradeType::FILESYSTEM, UpgradeStatus::NONE};
|
UpgradeResult filesystemResult{UpgradeType::FILESYSTEM, UpgradeStatus::NONE};
|
||||||
|
|||||||
+3
-3
@@ -4,12 +4,12 @@
|
|||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"cssnano": "^7.0.2",
|
"cssnano": "^8.0.0",
|
||||||
"cssnano-preset-advanced": "^7.0.2",
|
"cssnano-preset-advanced": "^8.0.0",
|
||||||
"gulp": "^5.0.0",
|
"gulp": "^5.0.0",
|
||||||
"gulp-concat": "^2.6.1",
|
"gulp-concat": "^2.6.1",
|
||||||
"gulp-gzip": "^1.4.2",
|
"gulp-gzip": "^1.4.2",
|
||||||
"gulp-html-minifier-terser": "^7.1.0",
|
"gulp-html-minifier-terser": "^8.0.0",
|
||||||
"gulp-jsonminify": "^1.1.0",
|
"gulp-jsonminify": "^1.1.0",
|
||||||
"gulp-postcss": "^10.0.0",
|
"gulp-postcss": "^10.0.0",
|
||||||
"gulp-terser": "^2.1.0",
|
"gulp-terser": "^2.1.0",
|
||||||
|
|||||||
+207
-355
@@ -1,379 +1,231 @@
|
|||||||
; PlatformIO Project Configuration File
|
|
||||||
;
|
|
||||||
; Build options: build flags, source filter
|
|
||||||
; Upload options: custom upload port, speed and extra flags
|
|
||||||
; Library options: dependencies, extra library storages
|
|
||||||
; Advanced options: extra scripting
|
|
||||||
;
|
|
||||||
; Please visit documentation for the other options and examples
|
|
||||||
; https://docs.platformio.org/page/projectconf.html
|
|
||||||
|
|
||||||
[platformio]
|
[platformio]
|
||||||
;extra_configs = secrets.ini
|
;extra_configs = secrets.ini
|
||||||
extra_configs = secrets.default.ini
|
extra_configs = secrets.default.ini
|
||||||
core_dir = .pio
|
core_dir = .pio
|
||||||
|
|
||||||
[env]
|
[env]
|
||||||
version = 1.6.0
|
version = 1.6.0-async
|
||||||
framework = arduino
|
framework = arduino
|
||||||
lib_deps =
|
lib_deps = ESP32Async/AsyncTCP@^3.4.10
|
||||||
bblanchon/ArduinoJson@^7.4.2
|
ESP32Async/ESPAsyncWebServer@^3.11.0
|
||||||
;ihormelnyk/OpenTherm Library@^1.1.5
|
mathieucarbou/MycilaWebSerial@^8.2.3
|
||||||
https://github.com/Laxilef/opentherm_library#esp32_timer
|
bblanchon/ArduinoJson@^7.4.3
|
||||||
arduino-libraries/ArduinoMqttClient@^0.1.8
|
;ihormelnyk/OpenTherm Library@^1.1.5
|
||||||
lennarthennigs/ESP Telnet@^2.2.3
|
https://github.com/Laxilef/opentherm_library#esp32_timer
|
||||||
gyverlibs/FileData@^1.0.3
|
arduino-libraries/ArduinoMqttClient@^0.1.8
|
||||||
gyverlibs/GyverPID@^3.3.2
|
gyverlibs/FileData@^1.0.3
|
||||||
gyverlibs/GyverBlinker@^1.1.1
|
gyverlibs/GyverPID@^3.3.2
|
||||||
https://github.com/pstolarz/Arduino-Temperature-Control-Library.git#OneWireNg
|
gyverlibs/GyverBlinker@^1.1.1
|
||||||
laxilef/TinyLogger@^1.1.1
|
pstolarz/OneWireNg@^0.14.1
|
||||||
build_type = ${secrets.build_type}
|
milesburton/DallasTemperature@^4.0.6
|
||||||
build_flags =
|
https://github.com/Laxilef/esp32DHT#idf5
|
||||||
-mtext-section-literals
|
;laxilef/TinyLogger@^1.1.1
|
||||||
-D MQTT_CLIENT_STD_FUNCTION_CALLBACK=1
|
https://github.com/Laxilef/TinyLogger#custom_handlers
|
||||||
;-D DEBUG_ESP_CORE -D DEBUG_ESP_WIFI -D DEBUG_ESP_HTTP_SERVER -D DEBUG_ESP_PORT=Serial
|
lib_ignore = OneWire
|
||||||
-D BUILD_VERSION='"${this.version}"'
|
build_type = ${secrets.build_type}
|
||||||
-D BUILD_ENV='"$PIOENV"'
|
build_flags = ;-mtext-section-literals
|
||||||
-D DEFAULT_SERIAL_ENABLED=${secrets.serial_enabled}
|
-O2
|
||||||
-D DEFAULT_SERIAL_BAUD=${secrets.serial_baud}
|
-Wno-deprecated-declarations
|
||||||
-D DEFAULT_TELNET_ENABLED=${secrets.telnet_enabled}
|
-D MQTT_CLIENT_STD_FUNCTION_CALLBACK=1
|
||||||
-D DEFAULT_TELNET_PORT=${secrets.telnet_port}
|
;-D DEBUG_ESP_CORE -D DEBUG_ESP_WIFI -D DEBUG_ESP_HTTP_SERVER -D DEBUG_ESP_PORT=Serial
|
||||||
-D DEFAULT_LOG_LEVEL=${secrets.log_level}
|
-D BUILD_VERSION='"${this.version}"'
|
||||||
-D DEFAULT_HOSTNAME='"${secrets.hostname}"'
|
-D BUILD_ENV='"$PIOENV"'
|
||||||
-D DEFAULT_AP_SSID='"${secrets.ap_ssid}"'
|
-D CONFIG_ASYNC_TCP_STACK_SIZE=4096
|
||||||
-D DEFAULT_AP_PASSWORD='"${secrets.ap_password}"'
|
-D ARDUINOJSON_USE_DOUBLE=0
|
||||||
-D DEFAULT_STA_SSID='"${secrets.sta_ssid}"'
|
-D ARDUINOJSON_USE_LONG_LONG=0
|
||||||
-D DEFAULT_STA_PASSWORD='"${secrets.sta_password}"'
|
-D TINYLOGGER_GLOBAL
|
||||||
-D DEFAULT_PORTAL_LOGIN='"${secrets.portal_login}"'
|
-D DHT_TASK_STACK_SIZE=4096
|
||||||
-D DEFAULT_PORTAL_PASSWORD='"${secrets.portal_password}"'
|
-D DEFAULT_SERIAL_ENABLED=${secrets.serial_enabled}
|
||||||
-D DEFAULT_MQTT_ENABLED=${secrets.mqtt_enabled}
|
-D DEFAULT_SERIAL_BAUD=${secrets.serial_baud}
|
||||||
-D DEFAULT_MQTT_SERVER='"${secrets.mqtt_server}"'
|
-D DEFAULT_WEBSERIAL_ENABLED=${secrets.webserial_enabled}
|
||||||
-D DEFAULT_MQTT_PORT=${secrets.mqtt_port}
|
-D DEFAULT_LOG_LEVEL=${secrets.log_level}
|
||||||
-D DEFAULT_MQTT_USER='"${secrets.mqtt_user}"'
|
-D DEFAULT_HOSTNAME='"${secrets.hostname}"'
|
||||||
-D DEFAULT_MQTT_PASSWORD='"${secrets.mqtt_password}"'
|
-D DEFAULT_AP_SSID='"${secrets.ap_ssid}"'
|
||||||
-D DEFAULT_MQTT_PREFIX='"${secrets.mqtt_prefix}"'
|
-D DEFAULT_AP_PASSWORD='"${secrets.ap_password}"'
|
||||||
upload_speed = 921600
|
-D DEFAULT_STA_SSID='"${secrets.sta_ssid}"'
|
||||||
monitor_speed = 115200
|
-D DEFAULT_STA_PASSWORD='"${secrets.sta_password}"'
|
||||||
;monitor_filters = direct
|
-D DEFAULT_PORTAL_LOGIN='"${secrets.portal_login}"'
|
||||||
monitor_filters =
|
-D DEFAULT_PORTAL_PASSWORD='"${secrets.portal_password}"'
|
||||||
esp32_exception_decoder
|
-D DEFAULT_MQTT_ENABLED=${secrets.mqtt_enabled}
|
||||||
esp8266_exception_decoder
|
-D DEFAULT_MQTT_SERVER='"${secrets.mqtt_server}"'
|
||||||
board_build.flash_mode = dio
|
-D DEFAULT_MQTT_PORT=${secrets.mqtt_port}
|
||||||
board_build.filesystem = littlefs
|
-D DEFAULT_MQTT_USER='"${secrets.mqtt_user}"'
|
||||||
check_tool = ; pvs-studio
|
-D DEFAULT_MQTT_PASSWORD='"${secrets.mqtt_password}"'
|
||||||
check_flags =
|
-D DEFAULT_MQTT_PREFIX='"${secrets.mqtt_prefix}"'
|
||||||
; pvs-studio:
|
upload_speed = 921600
|
||||||
; --analysis-mode=4
|
monitor_speed = 115200
|
||||||
; --exclude-path=./.pio/libdeps
|
;monitor_filters = direct
|
||||||
|
monitor_filters = esp32_exception_decoder
|
||||||
|
board_build.flash_mode = dio
|
||||||
|
board_build.filesystem = littlefs
|
||||||
|
check_tool = ;pvs-studio
|
||||||
|
check_flags = ;pvs-studio: --analysis-mode=4 --exclude-path=./.pio/libdeps
|
||||||
|
|
||||||
; Defaults
|
; Defaults
|
||||||
[esp8266_defaults]
|
|
||||||
platform = espressif8266@^4.2.1
|
|
||||||
platform_packages = ${env.platform_packages}
|
|
||||||
lib_deps =
|
|
||||||
${env.lib_deps}
|
|
||||||
nrwiersma/ESP8266Scheduler@^1.2
|
|
||||||
lib_ignore =
|
|
||||||
extra_scripts =
|
|
||||||
post:tools/build.py
|
|
||||||
build_type = ${env.build_type}
|
|
||||||
build_flags =
|
|
||||||
${env.build_flags}
|
|
||||||
-D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY
|
|
||||||
;-D PIO_FRAMEWORK_ARDUINO_LWIP2_HIGHER_BANDWIDTH_LOW_FLASH
|
|
||||||
-D PIO_FRAMEWORK_ARDUINO_ESPRESSIF_SDK305
|
|
||||||
board_build.ldscript = eagle.flash.4m1m.ld
|
|
||||||
check_tool = ${env.check_tool}
|
|
||||||
check_flags = ${env.check_flags}
|
|
||||||
|
|
||||||
[esp32_defaults]
|
[esp32_defaults]
|
||||||
;platform = espressif32@^6.7
|
platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.37/platform-espressif32.zip
|
||||||
;platform = https://github.com/platformio/platform-espressif32.git
|
platform_packages = ${env.platform_packages}
|
||||||
;platform_packages =
|
board_build.partitions = esp32_partitions.csv
|
||||||
; framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.5
|
lib_deps = ${env.lib_deps}
|
||||||
; framework-arduinoespressif32-libs @ https://github.com/espressif/esp32-arduino-lib-builder/releases/download/idf-release_v5.1/esp32-arduino-libs-idf-release_v5.1-33fbade6.zip
|
laxilef/ESP32Scheduler@^1.0.1
|
||||||
platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.35/platform-espressif32.zip
|
nimble_lib = https://github.com/h2zero/NimBLE-Arduino
|
||||||
platform_packages = ${env.platform_packages}
|
lib_ignore = ${env.lib_ignore}
|
||||||
board_build.partitions = esp32_partitions.csv
|
BluetoothSerial
|
||||||
lib_deps =
|
SimpleBLE
|
||||||
${env.lib_deps}
|
ESP RainMaker
|
||||||
laxilef/ESP32Scheduler@^1.0.1
|
RainMaker
|
||||||
nimble_lib = h2zero/NimBLE-Arduino@2.3.7
|
ESP Insights
|
||||||
lib_ignore =
|
Insights
|
||||||
extra_scripts =
|
Zigbee
|
||||||
post:tools/esp32.py
|
Matter
|
||||||
post:tools/build.py
|
OpenThread
|
||||||
build_type = ${env.build_type}
|
dsp
|
||||||
build_flags =
|
custom_component_remove = espressif/esp_hosted
|
||||||
${env.build_flags}
|
espressif/esp_wifi_remote
|
||||||
-D CORE_DEBUG_LEVEL=0
|
espressif/esp-dsp
|
||||||
-Wl,--wrap=esp_panic_handler
|
espressif/esp_modem
|
||||||
check_tool = ${env.check_tool}
|
espressif/esp_rainmaker
|
||||||
check_flags = ${env.check_flags}
|
espressif/rmaker_common
|
||||||
|
espressif/esp_insights
|
||||||
|
espressif/esp_diag_data_store
|
||||||
|
espressif/esp_diagnostics
|
||||||
|
espressif/libsodium
|
||||||
|
espressif/esp-modbus
|
||||||
|
espressif/esp-cbor
|
||||||
|
espressif/esp-sr
|
||||||
|
espressif/esp32-camera
|
||||||
|
espressif/qrcode
|
||||||
|
espressif/esp-zboss-lib
|
||||||
|
espressif/esp-zigbee-lib
|
||||||
|
chmorgan/esp-libhelix-mp3
|
||||||
|
extra_scripts = pre:tools/add_build_commit.py
|
||||||
|
post:tools/esp32.py
|
||||||
|
post:tools/build.py
|
||||||
|
build_type = ${env.build_type}
|
||||||
|
build_flags = ${env.build_flags}
|
||||||
|
-D MYNEWT_VAL_BLE_MAX_CONNECTIONS=1
|
||||||
|
-D MYNEWT_VAL_BLE_STORE_MAX_BONDS=1
|
||||||
|
-D MYNEWT_VAL_BLE_ROLE_CENTRAL=0
|
||||||
|
-D CORE_DEBUG_LEVEL=0
|
||||||
|
-Wl,--wrap=esp_panic_handler
|
||||||
|
check_tool = ${env.check_tool}
|
||||||
|
check_flags = ${env.check_flags}
|
||||||
|
|
||||||
|
|
||||||
; Boards
|
; Boards
|
||||||
[env:d1_mini]
|
|
||||||
platform = ${esp8266_defaults.platform}
|
|
||||||
platform_packages = ${esp8266_defaults.platform_packages}
|
|
||||||
board = d1_mini
|
|
||||||
lib_deps = ${esp8266_defaults.lib_deps}
|
|
||||||
lib_ignore = ${esp8266_defaults.lib_ignore}
|
|
||||||
extra_scripts = ${esp8266_defaults.extra_scripts}
|
|
||||||
board_build.ldscript = ${esp8266_defaults.board_build.ldscript}
|
|
||||||
build_type = ${esp8266_defaults.build_type}
|
|
||||||
build_flags =
|
|
||||||
${esp8266_defaults.build_flags}
|
|
||||||
-D DEFAULT_OT_IN_GPIO=4
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=5
|
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=13
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=15
|
|
||||||
check_tool = ${esp8266_defaults.check_tool}
|
|
||||||
check_flags = ${esp8266_defaults.check_flags}
|
|
||||||
|
|
||||||
[env:d1_mini_lite]
|
|
||||||
platform = ${esp8266_defaults.platform}
|
|
||||||
platform_packages = ${esp8266_defaults.platform_packages}
|
|
||||||
board = d1_mini_lite
|
|
||||||
lib_deps = ${esp8266_defaults.lib_deps}
|
|
||||||
lib_ignore = ${esp8266_defaults.lib_ignore}
|
|
||||||
extra_scripts = ${esp8266_defaults.extra_scripts}
|
|
||||||
board_build.ldscript = ${esp8266_defaults.board_build.ldscript}
|
|
||||||
build_type = ${esp8266_defaults.build_type}
|
|
||||||
build_flags =
|
|
||||||
${esp8266_defaults.build_flags}
|
|
||||||
-D DEFAULT_OT_IN_GPIO=4
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=5
|
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=13
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=15
|
|
||||||
check_tool = ${esp8266_defaults.check_tool}
|
|
||||||
check_flags = ${esp8266_defaults.check_flags}
|
|
||||||
|
|
||||||
[env:d1_mini_pro]
|
|
||||||
platform = ${esp8266_defaults.platform}
|
|
||||||
platform_packages = ${esp8266_defaults.platform_packages}
|
|
||||||
board = d1_mini_pro
|
|
||||||
lib_deps = ${esp8266_defaults.lib_deps}
|
|
||||||
lib_ignore = ${esp8266_defaults.lib_ignore}
|
|
||||||
extra_scripts = ${esp8266_defaults.extra_scripts}
|
|
||||||
board_build.ldscript = ${esp8266_defaults.board_build.ldscript}
|
|
||||||
build_type = ${esp8266_defaults.build_type}
|
|
||||||
build_flags =
|
|
||||||
${esp8266_defaults.build_flags}
|
|
||||||
-D DEFAULT_OT_IN_GPIO=4
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=5
|
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=14
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=13
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=15
|
|
||||||
check_tool = ${esp8266_defaults.check_tool}
|
|
||||||
check_flags = ${esp8266_defaults.check_flags}
|
|
||||||
|
|
||||||
[env:nodemcu_8266]
|
|
||||||
platform = ${esp8266_defaults.platform}
|
|
||||||
platform_packages = ${esp8266_defaults.platform_packages}
|
|
||||||
board = nodemcuv2
|
|
||||||
lib_deps = ${esp8266_defaults.lib_deps}
|
|
||||||
lib_ignore = ${esp8266_defaults.lib_ignore}
|
|
||||||
extra_scripts = ${esp8266_defaults.extra_scripts}
|
|
||||||
board_build.ldscript = ${esp8266_defaults.board_build.ldscript}
|
|
||||||
build_type = ${esp8266_defaults.build_type}
|
|
||||||
build_flags =
|
|
||||||
${esp8266_defaults.build_flags}
|
|
||||||
-D DEFAULT_OT_IN_GPIO=13
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=15
|
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=4
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=2
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=16
|
|
||||||
check_tool = ${esp8266_defaults.check_tool}
|
|
||||||
check_flags = ${esp8266_defaults.check_flags}
|
|
||||||
|
|
||||||
[env:s2_mini]
|
[env:s2_mini]
|
||||||
platform = ${esp32_defaults.platform}
|
extends = esp32_defaults
|
||||||
platform_packages = ${esp32_defaults.platform_packages}
|
board = lolin_s2_mini
|
||||||
board = lolin_s2_mini
|
build_unflags = -DARDUINO_USB_MODE=1
|
||||||
board_build.partitions = ${esp32_defaults.board_build.partitions}
|
build_flags = ${esp32_defaults.build_flags}
|
||||||
lib_deps = ${esp32_defaults.lib_deps}
|
-D ARDUINO_USB_MODE=0
|
||||||
lib_ignore = ${esp32_defaults.lib_ignore}
|
-D ARDUINO_USB_CDC_ON_BOOT=1
|
||||||
extra_scripts = ${esp32_defaults.extra_scripts}
|
-D DEFAULT_OT_IN_GPIO=33
|
||||||
build_unflags =
|
-D DEFAULT_OT_OUT_GPIO=35
|
||||||
-DARDUINO_USB_MODE=1
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=9
|
||||||
build_type = ${esp32_defaults.build_type}
|
-D DEFAULT_SENSOR_INDOOR_GPIO=7
|
||||||
build_flags =
|
-D DEFAULT_STATUS_LED_GPIO=11
|
||||||
${esp32_defaults.build_flags}
|
-D DEFAULT_OT_RX_LED_GPIO=12
|
||||||
-D ARDUINO_USB_MODE=0
|
|
||||||
-D ARDUINO_USB_CDC_ON_BOOT=1
|
|
||||||
-D DEFAULT_OT_IN_GPIO=33
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=35
|
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=9
|
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=7
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=11
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=12
|
|
||||||
check_tool = ${esp32_defaults.check_tool}
|
|
||||||
check_flags = ${esp32_defaults.check_flags}
|
|
||||||
|
|
||||||
[env:s3_mini]
|
[env:s3_mini]
|
||||||
platform = ${esp32_defaults.platform}
|
extends = esp32_defaults
|
||||||
platform_packages = ${esp32_defaults.platform_packages}
|
board = lolin_s3_mini
|
||||||
board = lolin_s3_mini
|
lib_deps = ${esp32_defaults.lib_deps}
|
||||||
board_build.partitions = ${esp32_defaults.board_build.partitions}
|
${esp32_defaults.nimble_lib}
|
||||||
lib_deps =
|
build_unflags = -DARDUINO_USB_MODE=1
|
||||||
${esp32_defaults.lib_deps}
|
build_flags = ${esp32_defaults.build_flags}
|
||||||
${esp32_defaults.nimble_lib}
|
-D ARDUINO_USB_MODE=0
|
||||||
lib_ignore = ${esp32_defaults.lib_ignore}
|
-D ARDUINO_USB_CDC_ON_BOOT=1
|
||||||
extra_scripts = ${esp32_defaults.extra_scripts}
|
-D MYNEWT_VAL_BLE_EXT_ADV=1
|
||||||
build_unflags =
|
-D USE_BLE=1
|
||||||
-DARDUINO_USB_MODE=1
|
-D DEFAULT_OT_IN_GPIO=35
|
||||||
build_type = ${esp32_defaults.build_type}
|
-D DEFAULT_OT_OUT_GPIO=36
|
||||||
build_flags =
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=13
|
||||||
${esp32_defaults.build_flags}
|
-D DEFAULT_SENSOR_INDOOR_GPIO=12
|
||||||
-D ARDUINO_USB_MODE=0
|
-D DEFAULT_STATUS_LED_GPIO=11
|
||||||
-D ARDUINO_USB_CDC_ON_BOOT=1
|
-D DEFAULT_OT_RX_LED_GPIO=10
|
||||||
-D MYNEWT_VAL_BLE_EXT_ADV=1
|
|
||||||
-D USE_BLE=1
|
|
||||||
-D DEFAULT_OT_IN_GPIO=35
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=36
|
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=13
|
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=12
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=11
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=10
|
|
||||||
check_tool = ${esp32_defaults.check_tool}
|
|
||||||
check_flags = ${esp32_defaults.check_flags}
|
|
||||||
|
|
||||||
[env:c3_mini]
|
[env:c3_mini]
|
||||||
platform = ${esp32_defaults.platform}
|
extends = esp32_defaults
|
||||||
platform_packages = ${esp32_defaults.platform_packages}
|
board = lolin_c3_mini
|
||||||
board = lolin_c3_mini
|
lib_deps = ${esp32_defaults.lib_deps}
|
||||||
board_build.partitions = ${esp32_defaults.board_build.partitions}
|
${esp32_defaults.nimble_lib}
|
||||||
lib_deps =
|
;build_unflags = -mtext-section-literals
|
||||||
${esp32_defaults.lib_deps}
|
build_flags = ${esp32_defaults.build_flags}
|
||||||
${esp32_defaults.nimble_lib}
|
-D MYNEWT_VAL_BLE_EXT_ADV=1
|
||||||
lib_ignore = ${esp32_defaults.lib_ignore}
|
-D USE_BLE=1
|
||||||
extra_scripts = ${esp32_defaults.extra_scripts}
|
-D DEFAULT_OT_IN_GPIO=8
|
||||||
build_unflags =
|
-D DEFAULT_OT_OUT_GPIO=10
|
||||||
-mtext-section-literals
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=0
|
||||||
build_type = ${esp32_defaults.build_type}
|
-D DEFAULT_SENSOR_INDOOR_GPIO=1
|
||||||
build_flags =
|
-D DEFAULT_STATUS_LED_GPIO=4
|
||||||
${esp32_defaults.build_flags}
|
-D DEFAULT_OT_RX_LED_GPIO=5
|
||||||
-D MYNEWT_VAL_BLE_EXT_ADV=1
|
|
||||||
-D USE_BLE=1
|
|
||||||
-D DEFAULT_OT_IN_GPIO=8
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=10
|
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=0
|
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=1
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=4
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=5
|
|
||||||
check_tool = ${esp32_defaults.check_tool}
|
|
||||||
check_flags = ${esp32_defaults.check_flags}
|
|
||||||
|
|
||||||
[env:nodemcu_32]
|
[env:nodemcu_32]
|
||||||
platform = ${esp32_defaults.platform}
|
extends = esp32_defaults
|
||||||
platform_packages = ${esp32_defaults.platform_packages}
|
board = nodemcu-32s
|
||||||
board = nodemcu-32s
|
lib_deps = ${esp32_defaults.lib_deps}
|
||||||
board_build.partitions = ${esp32_defaults.board_build.partitions}
|
${esp32_defaults.nimble_lib}
|
||||||
lib_deps =
|
build_flags = ${esp32_defaults.build_flags}
|
||||||
${esp32_defaults.lib_deps}
|
-D USE_BLE=1
|
||||||
${esp32_defaults.nimble_lib}
|
-D DEFAULT_OT_IN_GPIO=16
|
||||||
lib_ignore = ${esp32_defaults.lib_ignore}
|
-D DEFAULT_OT_OUT_GPIO=4
|
||||||
extra_scripts = ${esp32_defaults.extra_scripts}
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=15
|
||||||
build_type = ${esp32_defaults.build_type}
|
-D DEFAULT_SENSOR_INDOOR_GPIO=26
|
||||||
build_flags =
|
-D DEFAULT_STATUS_LED_GPIO=2
|
||||||
${esp32_defaults.build_flags}
|
-D DEFAULT_OT_RX_LED_GPIO=19
|
||||||
-D USE_BLE=1
|
|
||||||
-D DEFAULT_OT_IN_GPIO=16
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=4
|
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=15
|
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=26
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=2
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=19
|
|
||||||
check_tool = ${esp32_defaults.check_tool}
|
|
||||||
check_flags = ${esp32_defaults.check_flags}
|
|
||||||
|
|
||||||
[env:nodemcu_32_160mhz]
|
[env:nodemcu_32_160mhz]
|
||||||
extends = env:nodemcu_32
|
extends = env:nodemcu_32
|
||||||
board_build.f_cpu = 160000000L ; set frequency to 160MHz
|
board_build.f_cpu = 160000000L ; set frequency to 160MHz
|
||||||
|
|
||||||
[env:d1_mini32]
|
[env:d1_mini32]
|
||||||
platform = ${esp32_defaults.platform}
|
extends = esp32_defaults
|
||||||
platform_packages = ${esp32_defaults.platform_packages}
|
board = wemos_d1_mini32
|
||||||
board = wemos_d1_mini32
|
lib_deps = ${esp32_defaults.lib_deps}
|
||||||
board_build.partitions = ${esp32_defaults.board_build.partitions}
|
${esp32_defaults.nimble_lib}
|
||||||
lib_deps =
|
build_flags = ${esp32_defaults.build_flags}
|
||||||
${esp32_defaults.lib_deps}
|
-D USE_BLE=1
|
||||||
${esp32_defaults.nimble_lib}
|
-D DEFAULT_OT_IN_GPIO=21
|
||||||
lib_ignore = ${esp32_defaults.lib_ignore}
|
-D DEFAULT_OT_OUT_GPIO=22
|
||||||
extra_scripts = ${esp32_defaults.extra_scripts}
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
||||||
build_type = ${esp32_defaults.build_type}
|
-D DEFAULT_SENSOR_INDOOR_GPIO=18
|
||||||
build_flags =
|
-D DEFAULT_STATUS_LED_GPIO=2
|
||||||
${esp32_defaults.build_flags}
|
-D DEFAULT_OT_RX_LED_GPIO=19
|
||||||
-D USE_BLE=1
|
|
||||||
-D DEFAULT_OT_IN_GPIO=21
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=22
|
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=12
|
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=18
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=2
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=19
|
|
||||||
check_tool = ${esp32_defaults.check_tool}
|
|
||||||
check_flags = ${esp32_defaults.check_flags}
|
|
||||||
|
|
||||||
[env:esp32_c6]
|
[env:esp32_c6]
|
||||||
platform = ${esp32_defaults.platform}
|
extends = esp32_defaults
|
||||||
framework = arduino, espidf
|
board = esp32-c6-devkitc-1
|
||||||
platform_packages = ${esp32_defaults.platform_packages}
|
lib_deps = ${esp32_defaults.lib_deps}
|
||||||
board = esp32-c6-devkitm-1
|
${esp32_defaults.nimble_lib}
|
||||||
board_build.partitions = ${esp32_defaults.board_build.partitions}
|
;build_unflags = -mtext-section-literals
|
||||||
board_build.embed_txtfiles =
|
build_flags = ${esp32_defaults.build_flags}
|
||||||
managed_components/espressif__esp_insights/server_certs/https_server.crt
|
-D USE_BLE=1
|
||||||
managed_components/espressif__esp_rainmaker/server_certs/rmaker_mqtt_server.crt
|
-D DEFAULT_OT_IN_GPIO=15
|
||||||
managed_components/espressif__esp_rainmaker/server_certs/rmaker_claim_service_server.crt
|
-D DEFAULT_OT_OUT_GPIO=23
|
||||||
managed_components/espressif__esp_rainmaker/server_certs/rmaker_ota_server.crt
|
-D DEFAULT_SENSOR_OUTDOOR_GPIO=0
|
||||||
lib_deps = ${esp32_defaults.lib_deps}
|
-D DEFAULT_SENSOR_INDOOR_GPIO=0
|
||||||
lib_ignore =
|
-D DEFAULT_STATUS_LED_GPIO=11
|
||||||
${esp32_defaults.lib_ignore}
|
-D DEFAULT_OT_RX_LED_GPIO=10
|
||||||
extra_scripts = ${esp32_defaults.extra_scripts}
|
custom_sdkconfig = '# CONFIG_OPENTHREAD_ENABLED is not set'
|
||||||
build_unflags =
|
'# CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT is not set'
|
||||||
-mtext-section-literals
|
'# CONFIG_LWIP_IPV6 is not set'
|
||||||
build_type = ${esp32_defaults.build_type}
|
'# CONFIG_LWIP_IPV6_AUTOCONFIG is not set'
|
||||||
build_flags =
|
'# CONFIG_LWIP_PPP_SUPPORT is not set'
|
||||||
${esp32_defaults.build_flags}
|
|
||||||
-D USE_BLE=1
|
|
||||||
-D DEFAULT_OT_IN_GPIO=15
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=23
|
|
||||||
-D DEFAULT_SENSOR_OUTDOOR_GPIO=0
|
|
||||||
-D DEFAULT_SENSOR_INDOOR_GPIO=0
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=11
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=10
|
|
||||||
check_tool = ${esp32_defaults.check_tool}
|
|
||||||
check_flags = ${esp32_defaults.check_flags}
|
|
||||||
|
|
||||||
[env:otthing]
|
[env:otthing]
|
||||||
platform = ${esp32_defaults.platform}
|
extends = esp32_defaults
|
||||||
platform_packages = ${esp32_defaults.platform_packages}
|
board = lolin_c3_mini
|
||||||
board = lolin_c3_mini
|
lib_deps = ${esp32_defaults.lib_deps}
|
||||||
board_build.partitions = ${esp32_defaults.board_build.partitions}
|
${esp32_defaults.nimble_lib}
|
||||||
lib_deps =
|
;build_unflags = -mtext-section-literals
|
||||||
${esp32_defaults.lib_deps}
|
build_flags = ${esp32_defaults.build_flags}
|
||||||
${esp32_defaults.nimble_lib}
|
-D MYNEWT_VAL_BLE_EXT_ADV=1
|
||||||
lib_ignore = ${esp32_defaults.lib_ignore}
|
-D USE_BLE=1
|
||||||
extra_scripts = ${esp32_defaults.extra_scripts}
|
-D DEFAULT_OT_IN_GPIO=3
|
||||||
build_unflags =
|
-D DEFAULT_OT_OUT_GPIO=1
|
||||||
-mtext-section-literals
|
;-D DEFAULT_SENSOR_OUTDOOR_GPIO=0
|
||||||
build_type = ${esp32_defaults.build_type}
|
;-D DEFAULT_SENSOR_INDOOR_GPIO=1
|
||||||
build_flags =
|
-D DEFAULT_STATUS_LED_GPIO=8
|
||||||
${esp32_defaults.build_flags}
|
-D DEFAULT_OT_RX_LED_GPIO=2
|
||||||
-D MYNEWT_VAL_BLE_EXT_ADV=1
|
-D OT_BYPASS_RELAY_GPIO=20
|
||||||
-D USE_BLE=1
|
|
||||||
-D DEFAULT_OT_IN_GPIO=3
|
|
||||||
-D DEFAULT_OT_OUT_GPIO=1
|
|
||||||
; -D DEFAULT_SENSOR_OUTDOOR_GPIO=0
|
|
||||||
; -D DEFAULT_SENSOR_INDOOR_GPIO=1
|
|
||||||
-D DEFAULT_STATUS_LED_GPIO=8
|
|
||||||
-D DEFAULT_OT_RX_LED_GPIO=2
|
|
||||||
-D OT_BYPASS_RELAY_GPIO=20
|
|
||||||
check_tool = ${esp32_defaults.check_tool}
|
|
||||||
check_flags = ${esp32_defaults.check_flags}
|
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
# Source:
|
|
||||||
# https://github.com/pioarduino/platform-espressif32/tree/main/examples/espidf-arduino-h2zero-BLE_scan
|
|
||||||
|
|
||||||
CONFIG_FREERTOS_HZ=1000
|
|
||||||
CONFIG_MBEDTLS_PSK_MODES=y
|
|
||||||
CONFIG_MBEDTLS_KEY_EXCHANGE_PSK=y
|
|
||||||
CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y
|
|
||||||
CONFIG_COMPILER_OPTIMIZATION_SIZE=y
|
|
||||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
|
|
||||||
CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# BT config
|
|
||||||
CONFIG_BT_ENABLED=y
|
|
||||||
CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y
|
|
||||||
CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n
|
|
||||||
CONFIG_BTDM_CTRL_MODE_BTDM=n
|
|
||||||
CONFIG_BT_BLUEDROID_ENABLED=n
|
|
||||||
CONFIG_BT_NIMBLE_ENABLED=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Arduino Configuration
|
|
||||||
CONFIG_AUTOSTART_ARDUINO=y
|
|
||||||
CONFIG_ARDUINO_SELECTIVE_COMPILATION=y
|
|
||||||
CONFIG_ARDUINO_SELECTIVE_Zigbee=n
|
|
||||||
CONFIG_ARDUINO_SELECTIVE_Matter=n
|
|
||||||
CONFIG_ARDUINO_SELECTIVE_WiFiProv=n
|
|
||||||
CONFIG_ARDUINO_SELECTIVE_BLE=n
|
|
||||||
CONFIG_ARDUINO_SELECTIVE_BluetoothSerial=n
|
|
||||||
CONFIG_ARDUINO_SELECTIVE_SimpleBLE=n
|
|
||||||
CONFIG_ARDUINO_SELECTIVE_RainMaker=n
|
|
||||||
CONFIG_ARDUINO_SELECTIVE_OpenThread=n
|
|
||||||
CONFIG_ARDUINO_SELECTIVE_Insights=n
|
|
||||||
+1
-2
@@ -3,8 +3,7 @@ build_type = release
|
|||||||
|
|
||||||
serial_enabled = true
|
serial_enabled = true
|
||||||
serial_baud = 115200
|
serial_baud = 115200
|
||||||
telnet_enabled = true
|
webserial_enabled = true
|
||||||
telnet_port = 23
|
|
||||||
log_level = 5
|
log_level = 5
|
||||||
hostname = opentherm
|
hostname = opentherm
|
||||||
|
|
||||||
|
|||||||
+3
-2
@@ -176,9 +176,10 @@ public:
|
|||||||
objId.c_str()
|
objId.c_str()
|
||||||
);
|
);
|
||||||
|
|
||||||
// set device class, name, value template for bluetooth sensors
|
// set device class, name, value template for Bluetooth/DHT sensors
|
||||||
// or name & value template for another sensors
|
// or name & value template for another sensors
|
||||||
if (sSensor.type == Sensors::Type::BLUETOOTH) {
|
if (sSensor.type == Sensors::Type::BLUETOOTH ||
|
||||||
|
sSensor.type == Sensors::Type::DHT11 || sSensor.type == Sensors::Type::DHT22) {
|
||||||
// available state topic
|
// available state topic
|
||||||
doc[FPSTR(HA_AVAILABILITY)][1][FPSTR(HA_TOPIC)] = doc[FPSTR(HA_STATE_TOPIC)];
|
doc[FPSTR(HA_AVAILABILITY)][1][FPSTR(HA_TOPIC)] = doc[FPSTR(HA_STATE_TOPIC)];
|
||||||
doc[FPSTR(HA_AVAILABILITY)][1][FPSTR(HA_VALUE_TEMPLATE)] = JsonString(AVAILABILITY_SENSOR_CONN, true);
|
doc[FPSTR(HA_AVAILABILITY)][1][FPSTR(HA_VALUE_TEMPLATE)] = JsonString(AVAILABILITY_SENSOR_CONN, true);
|
||||||
|
|||||||
+40
-54
@@ -6,7 +6,6 @@ extern NetworkMgr* network;
|
|||||||
extern MqttTask* tMqtt;
|
extern MqttTask* tMqtt;
|
||||||
extern OpenThermTask* tOt;
|
extern OpenThermTask* tOt;
|
||||||
extern FileData fsNetworkSettings, fsSettings, fsSensorsSettings;
|
extern FileData fsNetworkSettings, fsSettings, fsSensorsSettings;
|
||||||
extern ESPTelnetStream* telnetStream;
|
|
||||||
|
|
||||||
|
|
||||||
class MainTask : public Task {
|
class MainTask : public Task {
|
||||||
@@ -40,17 +39,18 @@ protected:
|
|||||||
PumpStartReason extPumpStartReason = PumpStartReason::NONE;
|
PumpStartReason extPumpStartReason = PumpStartReason::NONE;
|
||||||
unsigned long externalPumpStartTime = 0;
|
unsigned long externalPumpStartTime = 0;
|
||||||
bool ntpStarted = false;
|
bool ntpStarted = false;
|
||||||
bool telnetStarted = false;
|
|
||||||
bool emergencyDetected = false;
|
bool emergencyDetected = false;
|
||||||
unsigned long emergencyFlipTime = 0;
|
unsigned long emergencyFlipTime = 0;
|
||||||
bool freezeDetected = false;
|
|
||||||
unsigned long freezeDetectedTime = 0;
|
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_ESP32)
|
#if defined(ARDUINO_ARCH_ESP32)
|
||||||
const char* getTaskName() override {
|
const char* getTaskName() override {
|
||||||
return "Main";
|
return "Main";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t getTaskStackSize() override {
|
||||||
|
return 6000;
|
||||||
|
}
|
||||||
|
|
||||||
/*BaseType_t getTaskCore() override {
|
/*BaseType_t getTaskCore() override {
|
||||||
return 1;
|
return 1;
|
||||||
}*/
|
}*/
|
||||||
@@ -106,9 +106,9 @@ protected:
|
|||||||
vars.network.connected = network->isConnected();
|
vars.network.connected = network->isConnected();
|
||||||
vars.network.rssi = network->isConnected() ? WiFi.RSSI() : 0;
|
vars.network.rssi = network->isConnected() ? WiFi.RSSI() : 0;
|
||||||
|
|
||||||
if (settings.system.logLevel >= TinyLogger::Level::SILENT && settings.system.logLevel <= TinyLogger::Level::VERBOSE) {
|
if (settings.system.logLevel >= TinyLoggerLevel::SILENT && settings.system.logLevel <= TinyLoggerLevel::VERBOSE) {
|
||||||
if (Log.getLevel() != settings.system.logLevel) {
|
if (Log.getLevel() != settings.system.logLevel) {
|
||||||
Log.setLevel(static_cast<TinyLogger::Level>(settings.system.logLevel));
|
Log.setLevel(static_cast<TinyLoggerLevel>(settings.system.logLevel));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -123,11 +123,6 @@ protected:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this->telnetStarted && telnetStream != nullptr) {
|
|
||||||
telnetStream->begin(23, false);
|
|
||||||
this->telnetStarted = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (settings.mqtt.enabled && !tMqtt->isEnabled()) {
|
if (settings.mqtt.enabled && !tMqtt->isEnabled()) {
|
||||||
tMqtt->enable();
|
tMqtt->enable();
|
||||||
|
|
||||||
@@ -135,18 +130,11 @@ protected:
|
|||||||
tMqtt->disable();
|
tMqtt->disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
Sensors::setConnectionStatusByType(Sensors::Type::MANUAL, !settings.mqtt.enabled || vars.mqtt.connected, false);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (this->ntpStarted) {
|
if (this->ntpStarted) {
|
||||||
this->ntpStarted = false;
|
this->ntpStarted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->telnetStarted) {
|
|
||||||
telnetStream->stop();
|
|
||||||
this->telnetStarted = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tMqtt->isEnabled()) {
|
if (tMqtt->isEnabled()) {
|
||||||
tMqtt->disable();
|
tMqtt->disable();
|
||||||
}
|
}
|
||||||
@@ -160,23 +148,10 @@ protected:
|
|||||||
}
|
}
|
||||||
this->ledStatus();
|
this->ledStatus();
|
||||||
|
|
||||||
// telnet
|
|
||||||
if (this->telnetStarted) {
|
|
||||||
this->yield();
|
|
||||||
telnetStream->loop();
|
|
||||||
this->yield();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// anti memory leak
|
// anti memory leak
|
||||||
for (Stream* stream : Log.getStreams()) {
|
while (Serial.available() > 0) {
|
||||||
while (stream->available() > 0) {
|
Serial.read();
|
||||||
stream->read();
|
|
||||||
|
|
||||||
#ifdef ARDUINO_ARCH_ESP8266
|
|
||||||
::optimistic_yield(1000);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// heap info
|
// heap info
|
||||||
@@ -215,7 +190,7 @@ protected:
|
|||||||
vars.states.restarting = true;
|
vars.states.restarting = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.system.logLevel < TinyLogger::Level::VERBOSE) {
|
if (settings.system.logLevel < TinyLoggerLevel::VERBOSE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -245,12 +220,12 @@ protected:
|
|||||||
|
|
||||||
void heating() {
|
void heating() {
|
||||||
// freeze protection
|
// freeze protection
|
||||||
if (!settings.heating.enabled) {
|
{
|
||||||
float lowTemp = 255.0f;
|
float lowTemp = 255.0f;
|
||||||
uint8_t availableSensors = 0;
|
uint8_t availableSensors = 0;
|
||||||
|
|
||||||
if (Sensors::existsConnectedSensorsByPurpose(Sensors::Purpose::INDOOR_TEMP)) {
|
if (Sensors::existsConnectedSensorsByPurpose(Sensors::Purpose::INDOOR_TEMP)) {
|
||||||
auto value = Sensors::getMeanValueByPurpose(Sensors::Purpose::INDOOR_TEMP, Sensors::ValueType::PRIMARY);
|
auto value = Sensors::getMeanValueByPurpose(Sensors::Purpose::INDOOR_TEMP, Sensors::ValueType::PRIMARY, settings.heating.indoorTempAvgType);
|
||||||
if (value < lowTemp) {
|
if (value < lowTemp) {
|
||||||
lowTemp = value;
|
lowTemp = value;
|
||||||
}
|
}
|
||||||
@@ -276,29 +251,40 @@ protected:
|
|||||||
availableSensors++;
|
availableSensors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (availableSensors && lowTemp <= settings.heating.freezeProtection.lowTemp) {
|
if (availableSensors) {
|
||||||
if (!this->freezeDetected) {
|
if (vars.master.heating.freezing) {
|
||||||
this->freezeDetected = true;
|
if (lowTemp - (float) settings.heating.freezeProtection.highTemp + 0.0001f >= 0.0f) {
|
||||||
this->freezeDetectedTime = millis();
|
vars.master.heating.freezing = false;
|
||||||
|
|
||||||
} else if (millis() - this->freezeDetectedTime > (settings.heating.freezeProtection.thresholdTime * 1000)) {
|
Log.sinfoln(
|
||||||
this->freezeDetected = false;
|
FPSTR(L_MAIN),
|
||||||
settings.heating.enabled = true;
|
F("No freezing detected. Current low temp: %.2f, threshold (high): %hhu"),
|
||||||
fsSettings.update();
|
lowTemp, settings.heating.freezeProtection.highTemp
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
Log.sinfoln(
|
} else {
|
||||||
FPSTR(L_MAIN),
|
if ((float) settings.heating.freezeProtection.lowTemp - lowTemp + 0.0001f >= 0.0f) {
|
||||||
F("Heating turned on by freeze protection, current low temp: %.2f, threshold: %hhu"),
|
vars.master.heating.freezing = true;
|
||||||
lowTemp, settings.heating.freezeProtection.lowTemp
|
|
||||||
);
|
if (!settings.heating.enabled) {
|
||||||
|
settings.heating.enabled = true;
|
||||||
|
fsSettings.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.sinfoln(
|
||||||
|
FPSTR(L_MAIN),
|
||||||
|
F("Freezing detected! Current low temp: %.2f, threshold (low): %hhu"),
|
||||||
|
lowTemp, settings.heating.freezeProtection.lowTemp
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (this->freezeDetected) {
|
} else if (vars.master.heating.freezing) {
|
||||||
this->freezeDetected = false;
|
vars.master.heating.freezing = false;
|
||||||
}
|
|
||||||
|
|
||||||
} else if (this->freezeDetected) {
|
Log.sinfoln(FPSTR(L_MAIN), F("No sensors available, freeze protection unavailable!"));
|
||||||
this->freezeDetected = false;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+17
-1
@@ -292,6 +292,14 @@ protected:
|
|||||||
this->haHelper->deleteDynamicSensor(prevSettings, Sensors::ValueType::RSSI);
|
this->haHelper->deleteDynamicSensor(prevSettings, Sensors::ValueType::RSSI);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Sensors::Type::DHT11:
|
||||||
|
case Sensors::Type::DHT22:
|
||||||
|
this->haHelper->deleteConnectionDynamicSensor(prevSettings);
|
||||||
|
this->haHelper->deleteSignalQualityDynamicSensor(prevSettings);
|
||||||
|
this->haHelper->deleteDynamicSensor(prevSettings, Sensors::ValueType::TEMPERATURE);
|
||||||
|
this->haHelper->deleteDynamicSensor(prevSettings, Sensors::ValueType::HUMIDITY);
|
||||||
|
break;
|
||||||
|
|
||||||
case Sensors::Type::DALLAS_TEMP:
|
case Sensors::Type::DALLAS_TEMP:
|
||||||
this->haHelper->deleteConnectionDynamicSensor(prevSettings);
|
this->haHelper->deleteConnectionDynamicSensor(prevSettings);
|
||||||
this->haHelper->deleteSignalQualityDynamicSensor(prevSettings);
|
this->haHelper->deleteSignalQualityDynamicSensor(prevSettings);
|
||||||
@@ -319,6 +327,14 @@ protected:
|
|||||||
this->haHelper->publishDynamicSensor(sSettings, Sensors::ValueType::RSSI, settings.system.unitSystem, false);
|
this->haHelper->publishDynamicSensor(sSettings, Sensors::ValueType::RSSI, settings.system.unitSystem, false);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case Sensors::Type::DHT11:
|
||||||
|
case Sensors::Type::DHT22:
|
||||||
|
this->haHelper->publishConnectionDynamicSensor(sSettings);
|
||||||
|
this->haHelper->publishSignalQualityDynamicSensor(sSettings, false);
|
||||||
|
this->haHelper->publishDynamicSensor(sSettings, Sensors::ValueType::TEMPERATURE, settings.system.unitSystem);
|
||||||
|
this->haHelper->publishDynamicSensor(sSettings, Sensors::ValueType::HUMIDITY, settings.system.unitSystem);
|
||||||
|
break;
|
||||||
|
|
||||||
case Sensors::Type::DALLAS_TEMP:
|
case Sensors::Type::DALLAS_TEMP:
|
||||||
this->haHelper->publishConnectionDynamicSensor(sSettings);
|
this->haHelper->publishConnectionDynamicSensor(sSettings);
|
||||||
this->haHelper->publishSignalQualityDynamicSensor(sSettings, false);
|
this->haHelper->publishSignalQualityDynamicSensor(sSettings, false);
|
||||||
@@ -416,7 +432,7 @@ protected:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.system.logLevel >= TinyLogger::Level::TRACE) {
|
if (settings.system.logLevel >= TinyLoggerLevel::TRACE) {
|
||||||
Log.strace(FPSTR(L_MQTT_MSG), F("Topic: %s\r\n> "), topic.c_str());
|
Log.strace(FPSTR(L_MQTT_MSG), F("Topic: %s\r\n> "), topic.c_str());
|
||||||
if (Log.lock()) {
|
if (Log.lock()) {
|
||||||
for (size_t i = 0; i < length; i++) {
|
for (size_t i = 0; i < length; i++) {
|
||||||
|
|||||||
+6
-3
@@ -38,8 +38,12 @@ protected:
|
|||||||
return "OpenTherm";
|
return "OpenTherm";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t getTaskStackSize() override {
|
||||||
|
return 7500;
|
||||||
|
}
|
||||||
|
|
||||||
BaseType_t getTaskCore() override {
|
BaseType_t getTaskCore() override {
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int getTaskPriority() override {
|
int getTaskPriority() override {
|
||||||
@@ -170,8 +174,7 @@ protected:
|
|||||||
// Heating settings
|
// Heating settings
|
||||||
vars.master.heating.enabled = this->isReady()
|
vars.master.heating.enabled = this->isReady()
|
||||||
&& settings.heating.enabled
|
&& settings.heating.enabled
|
||||||
&& vars.cascadeControl.input
|
&& (vars.master.heating.freezing || (vars.cascadeControl.input && !vars.master.heating.blocking))
|
||||||
&& !vars.master.heating.blocking
|
|
||||||
&& !vars.master.heating.overheat;
|
&& !vars.master.heating.overheat;
|
||||||
|
|
||||||
// DHW settings
|
// DHW settings
|
||||||
|
|||||||
+319
-550
File diff suppressed because it is too large
Load Diff
@@ -20,6 +20,10 @@ protected:
|
|||||||
return "Regulator";
|
return "Regulator";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t getTaskStackSize() override {
|
||||||
|
return 5000;
|
||||||
|
}
|
||||||
|
|
||||||
/*BaseType_t getTaskCore() override {
|
/*BaseType_t getTaskCore() override {
|
||||||
return 1;
|
return 1;
|
||||||
}*/
|
}*/
|
||||||
@@ -240,6 +244,11 @@ protected:
|
|||||||
) * settings.heating.turboFactor;
|
) * settings.heating.turboFactor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If freezing, set temperature to no lower than low temp provided by freeze protection
|
||||||
|
if (vars.master.heating.freezing && fabsf(settings.heating.freezeProtection.lowTemp - newTemp) < 0.0001f) {
|
||||||
|
newTemp = settings.heating.freezeProtection.lowTemp;
|
||||||
|
}
|
||||||
|
|
||||||
return newTemp;
|
return newTemp;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+49
-18
@@ -39,6 +39,8 @@ public:
|
|||||||
NTC_10K_TEMP = 50,
|
NTC_10K_TEMP = 50,
|
||||||
DALLAS_TEMP = 51,
|
DALLAS_TEMP = 51,
|
||||||
BLUETOOTH = 52,
|
BLUETOOTH = 52,
|
||||||
|
DHT11 = 53,
|
||||||
|
DHT22 = 54,
|
||||||
|
|
||||||
HEATING_SETPOINT_TEMP = 253,
|
HEATING_SETPOINT_TEMP = 253,
|
||||||
MANUAL = 254,
|
MANUAL = 254,
|
||||||
@@ -75,6 +77,12 @@ public:
|
|||||||
RSSI = 3
|
RSSI = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum class AverageType : uint8_t {
|
||||||
|
MEAN = 0,
|
||||||
|
MINIMUM = 1,
|
||||||
|
MAXIMUM = 2
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
bool enabled = false;
|
bool enabled = false;
|
||||||
char name[33];
|
char name[33];
|
||||||
@@ -328,38 +336,61 @@ public:
|
|||||||
return updated;
|
return updated;
|
||||||
}
|
}
|
||||||
|
|
||||||
static float getMeanValueByPurpose(Purpose purpose, const ValueType valueType, bool onlyConnected = true) {
|
static float getMeanValueByPurpose(Purpose purpose, const ValueType valueType, const AverageType avgType = AverageType::MEAN, const bool onlyConnected = true, const float defaultValue = NAN) {
|
||||||
if (settings == nullptr || results == nullptr) {
|
if (settings == nullptr || results == nullptr) {
|
||||||
return 0.0f;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t valueId = (uint8_t) valueType;
|
uint8_t valueId = (uint8_t) valueType;
|
||||||
if (!isValidValueId(valueId)) {
|
if (!isValidValueId(valueId)) {
|
||||||
return 0.0f;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
float value = 0.0f;
|
float value = 0.0f;
|
||||||
uint8_t amount = 0;
|
uint8_t amount = 0;
|
||||||
|
|
||||||
for (uint8_t id = 0; id <= getMaxSensorId(); id++) {
|
if (avgType == AverageType::MEAN) {
|
||||||
auto& sSensor = settings[id];
|
float sum = 0.0f;
|
||||||
auto& rSensor = results[id];
|
for (uint8_t id = 0; id <= getMaxSensorId(); id++) {
|
||||||
|
auto& sSensor = settings[id];
|
||||||
|
auto& rSensor = results[id];
|
||||||
|
|
||||||
if (sSensor.purpose == purpose && (!onlyConnected || rSensor.connected)) {
|
if (sSensor.purpose == purpose && (!onlyConnected || rSensor.connected)) {
|
||||||
value += rSensor.values[valueId];
|
sum += rSensor.values[valueId];
|
||||||
amount++;
|
amount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
value = amount == 1 ? sum : (sum / amount);
|
||||||
|
|
||||||
|
} else if (avgType == AverageType::MINIMUM) {
|
||||||
|
for (uint8_t id = 0; id <= getMaxSensorId(); id++) {
|
||||||
|
auto& sSensor = settings[id];
|
||||||
|
auto& rSensor = results[id];
|
||||||
|
|
||||||
|
if (sSensor.purpose == purpose && (!onlyConnected || rSensor.connected)) {
|
||||||
|
if (amount == 0 || rSensor.values[valueId] < value) {
|
||||||
|
value = rSensor.values[valueId];
|
||||||
|
amount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (avgType == AverageType::MAXIMUM) {
|
||||||
|
for (uint8_t id = 0; id <= getMaxSensorId(); id++) {
|
||||||
|
auto& sSensor = settings[id];
|
||||||
|
auto& rSensor = results[id];
|
||||||
|
|
||||||
|
if (sSensor.purpose == purpose && (!onlyConnected || rSensor.connected)) {
|
||||||
|
if (amount == 0 || rSensor.values[valueId] > value) {
|
||||||
|
value = rSensor.values[valueId];
|
||||||
|
amount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!amount) {
|
return amount > 0 ? value : defaultValue;
|
||||||
return 0.0f;
|
|
||||||
|
|
||||||
} else if (amount == 1) {
|
|
||||||
return value;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return value / amount;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool existsConnectedSensorsByPurpose(Purpose purpose) {
|
static bool existsConnectedSensorsByPurpose(Purpose purpose) {
|
||||||
|
|||||||
+514
-584
File diff suppressed because it is too large
Load Diff
+6
-4
@@ -32,9 +32,8 @@ struct Settings {
|
|||||||
} serial;
|
} serial;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool enabled = DEFAULT_TELNET_ENABLED;
|
bool enabled = DEFAULT_WEBSERIAL_ENABLED;
|
||||||
unsigned short port = DEFAULT_TELNET_PORT;
|
} webSerial;
|
||||||
} telnet;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
char server[49] = "pool.ntp.org";
|
char server[49] = "pool.ntp.org";
|
||||||
@@ -108,6 +107,8 @@ struct Settings {
|
|||||||
uint8_t minTemp = DEFAULT_HEATING_MIN_TEMP;
|
uint8_t minTemp = DEFAULT_HEATING_MIN_TEMP;
|
||||||
uint8_t maxTemp = DEFAULT_HEATING_MAX_TEMP;
|
uint8_t maxTemp = DEFAULT_HEATING_MAX_TEMP;
|
||||||
uint8_t maxModulation = 100;
|
uint8_t maxModulation = 100;
|
||||||
|
Sensors::AverageType indoorTempAvgType = Sensors::AverageType::MEAN;
|
||||||
|
Sensors::AverageType outdoorTempAvgType = Sensors::AverageType::MEAN;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool enabled = true;
|
bool enabled = true;
|
||||||
@@ -121,8 +122,8 @@ struct Settings {
|
|||||||
} overheatProtection;
|
} overheatProtection;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
uint8_t highTemp = 15;
|
||||||
uint8_t lowTemp = 10;
|
uint8_t lowTemp = 10;
|
||||||
unsigned short thresholdTime = 600;
|
|
||||||
} freezeProtection;
|
} freezeProtection;
|
||||||
} heating;
|
} heating;
|
||||||
|
|
||||||
@@ -304,6 +305,7 @@ struct Variables {
|
|||||||
bool enabled = false;
|
bool enabled = false;
|
||||||
bool indoorTempControl = false;
|
bool indoorTempControl = false;
|
||||||
bool overheat = false;
|
bool overheat = false;
|
||||||
|
bool freezing = false;
|
||||||
float setpointTemp = 0.0f;
|
float setpointTemp = 0.0f;
|
||||||
float targetTemp = 0.0f;
|
float targetTemp = 0.0f;
|
||||||
float currentTemp = 0.0f;
|
float currentTemp = 0.0f;
|
||||||
|
|||||||
+7
-7
@@ -30,6 +30,10 @@
|
|||||||
#define BUILD_VERSION "0.0.0"
|
#define BUILD_VERSION "0.0.0"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef BUILD_COMMIT
|
||||||
|
#define BUILD_COMMIT "undefined"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef BUILD_ENV
|
#ifndef BUILD_ENV
|
||||||
#define BUILD_ENV "undefined"
|
#define BUILD_ENV "undefined"
|
||||||
#endif
|
#endif
|
||||||
@@ -42,12 +46,8 @@
|
|||||||
#define DEFAULT_SERIAL_BAUD 115200
|
#define DEFAULT_SERIAL_BAUD 115200
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DEFAULT_TELNET_ENABLED
|
#ifndef DEFAULT_WEBSERIAL_ENABLED
|
||||||
#define DEFAULT_TELNET_ENABLED true
|
#define DEFAULT_WEBSERIAL_ENABLED true
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef DEFAULT_TELNET_PORT
|
|
||||||
#define DEFAULT_TELNET_PORT 23
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef USE_BLE
|
#ifndef USE_BLE
|
||||||
@@ -75,7 +75,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DEFAULT_LOG_LEVEL
|
#ifndef DEFAULT_LOG_LEVEL
|
||||||
#define DEFAULT_LOG_LEVEL TinyLogger::Level::VERBOSE
|
#define DEFAULT_LOG_LEVEL TinyLoggerLevel::VERBOSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef DEFAULT_STATUS_LED_GPIO
|
#ifndef DEFAULT_STATUS_LED_GPIO
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
dependencies:
|
|
||||||
idf: ">=5.3.2"
|
|
||||||
h2zero/esp-nimble-cpp: ">=2.2.1"
|
|
||||||
+14
-17
@@ -1,11 +1,8 @@
|
|||||||
#define ARDUINOJSON_USE_DOUBLE 0
|
|
||||||
#define ARDUINOJSON_USE_LONG_LONG 0
|
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <FileData.h>
|
#include <FileData.h>
|
||||||
#include <LittleFS.h>
|
#include <LittleFS.h>
|
||||||
#include <ESPTelnetStream.h>
|
#include <MycilaWebSerial.h>
|
||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "strings.h"
|
#include "strings.h"
|
||||||
@@ -37,7 +34,7 @@
|
|||||||
using namespace NetworkUtils;
|
using namespace NetworkUtils;
|
||||||
|
|
||||||
// Vars
|
// Vars
|
||||||
ESPTelnetStream* telnetStream = nullptr;
|
WebSerial* webSerial = nullptr;
|
||||||
NetworkMgr* network = nullptr;
|
NetworkMgr* network = nullptr;
|
||||||
Sensors::Result sensorsResults[SENSORS_AMOUNT];
|
Sensors::Result sensorsResults[SENSORS_AMOUNT];
|
||||||
|
|
||||||
@@ -61,7 +58,7 @@ void setup() {
|
|||||||
Sensors::results = sensorsResults;
|
Sensors::results = sensorsResults;
|
||||||
LittleFS.begin();
|
LittleFS.begin();
|
||||||
|
|
||||||
Log.setLevel(TinyLogger::Level::VERBOSE);
|
Log.setLevel(TinyLoggerLevel::VERBOSE);
|
||||||
Log.setServiceTemplate("\033[1m[%s]\033[22m");
|
Log.setServiceTemplate("\033[1m[%s]\033[22m");
|
||||||
Log.setLevelTemplate("\033[1m[%s]\033[22m");
|
Log.setLevelTemplate("\033[1m[%s]\033[22m");
|
||||||
Log.setMsgPrefix("\033[m ");
|
Log.setMsgPrefix("\033[m ");
|
||||||
@@ -79,7 +76,7 @@ void setup() {
|
|||||||
#if ARDUINO_USB_MODE
|
#if ARDUINO_USB_MODE
|
||||||
Serial.setTxBufferSize(512);
|
Serial.setTxBufferSize(512);
|
||||||
#endif
|
#endif
|
||||||
Log.addStream(&Serial);
|
Log.addHandler(&Serial);
|
||||||
Log.print("\n\n\r");
|
Log.print("\n\n\r");
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -163,24 +160,24 @@ void setup() {
|
|||||||
// Logs settings
|
// Logs settings
|
||||||
if (!settings.system.serial.enabled) {
|
if (!settings.system.serial.enabled) {
|
||||||
Serial.end();
|
Serial.end();
|
||||||
Log.clearStreams();
|
Log.clearHandlers();
|
||||||
|
|
||||||
} else if (settings.system.serial.baudrate != 115200) {
|
} else if (settings.system.serial.baudrate != 115200) {
|
||||||
Serial.end();
|
Serial.end();
|
||||||
Log.clearStreams();
|
Log.clearHandlers();
|
||||||
|
|
||||||
Serial.begin(settings.system.serial.baudrate);
|
Serial.begin(settings.system.serial.baudrate);
|
||||||
Log.addStream(&Serial);
|
Log.addHandler(&Serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.system.telnet.enabled) {
|
if (settings.system.webSerial.enabled) {
|
||||||
telnetStream = new ESPTelnetStream;
|
webSerial = new WebSerial();
|
||||||
telnetStream->setKeepAliveInterval(500);
|
webSerial->setBuffer(100);
|
||||||
Log.addStream(telnetStream);
|
Log.addHandler(webSerial);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (settings.system.logLevel >= TinyLogger::Level::SILENT && settings.system.logLevel <= TinyLogger::Level::VERBOSE) {
|
if (settings.system.logLevel >= TinyLoggerLevel::SILENT && settings.system.logLevel <= TinyLoggerLevel::VERBOSE) {
|
||||||
Log.setLevel(static_cast<TinyLogger::Level>(settings.system.logLevel));
|
Log.setLevel(static_cast<TinyLoggerLevel>(settings.system.logLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -216,7 +213,7 @@ void setup() {
|
|||||||
tRegulator = new RegulatorTask(true, 10000);
|
tRegulator = new RegulatorTask(true, 10000);
|
||||||
Scheduler.start(tRegulator);
|
Scheduler.start(tRegulator);
|
||||||
|
|
||||||
tPortal = new PortalTask(true, 0);
|
tPortal = new PortalTask(true, 10);
|
||||||
Scheduler.start(tPortal);
|
Scheduler.start(tPortal);
|
||||||
|
|
||||||
tMain = new MainTask(true, 100);
|
tMain = new MainTask(true, 100);
|
||||||
|
|||||||
+7
-1
@@ -24,6 +24,7 @@ const char L_OT_CH2[] PROGMEM = "OT.CH2";
|
|||||||
const char L_SENSORS[] PROGMEM = "SENSORS";
|
const char L_SENSORS[] PROGMEM = "SENSORS";
|
||||||
const char L_SENSORS_SETTINGS[] PROGMEM = "SENSORS.SETTINGS";
|
const char L_SENSORS_SETTINGS[] PROGMEM = "SENSORS.SETTINGS";
|
||||||
const char L_SENSORS_DALLAS[] PROGMEM = "SENSORS.DALLAS";
|
const char L_SENSORS_DALLAS[] PROGMEM = "SENSORS.DALLAS";
|
||||||
|
const char L_SENSORS_DHT[] PROGMEM = "SENSORS.DHT";
|
||||||
const char L_SENSORS_NTC[] PROGMEM = "SENSORS.NTC";
|
const char L_SENSORS_NTC[] PROGMEM = "SENSORS.NTC";
|
||||||
const char L_SENSORS_BLE[] PROGMEM = "SENSORS.BLE";
|
const char L_SENSORS_BLE[] PROGMEM = "SENSORS.BLE";
|
||||||
const char L_REGULATOR[] PROGMEM = "REGULATOR";
|
const char L_REGULATOR[] PROGMEM = "REGULATOR";
|
||||||
@@ -56,6 +57,7 @@ const char S_CHANNEL[] PROGMEM = "channel";
|
|||||||
const char S_CH2_ALWAYS_ENABLED[] PROGMEM = "ch2AlwaysEnabled";
|
const char S_CH2_ALWAYS_ENABLED[] PROGMEM = "ch2AlwaysEnabled";
|
||||||
const char S_CHIP[] PROGMEM = "chip";
|
const char S_CHIP[] PROGMEM = "chip";
|
||||||
const char S_CODE[] PROGMEM = "code";
|
const char S_CODE[] PROGMEM = "code";
|
||||||
|
const char S_COMMIT[] PROGMEM = "commit";
|
||||||
const char S_CONNECTED[] PROGMEM = "connected";
|
const char S_CONNECTED[] PROGMEM = "connected";
|
||||||
const char S_CONTINUES[] PROGMEM = "continues";
|
const char S_CONTINUES[] PROGMEM = "continues";
|
||||||
const char S_COOLING[] PROGMEM = "cooling";
|
const char S_COOLING[] PROGMEM = "cooling";
|
||||||
@@ -87,6 +89,7 @@ const char S_EXTERNAL_PUMP[] PROGMEM = "externalPump";
|
|||||||
const char S_FACTOR[] PROGMEM = "factor";
|
const char S_FACTOR[] PROGMEM = "factor";
|
||||||
const char S_FAULT[] PROGMEM = "fault";
|
const char S_FAULT[] PROGMEM = "fault";
|
||||||
const char S_FREEZE_PROTECTION[] PROGMEM = "freezeProtection";
|
const char S_FREEZE_PROTECTION[] PROGMEM = "freezeProtection";
|
||||||
|
const char S_FREEZING[] PROGMEM = "freezing";
|
||||||
const char S_FILTERING[] PROGMEM = "filtering";
|
const char S_FILTERING[] PROGMEM = "filtering";
|
||||||
const char S_FILTERING_FACTOR[] PROGMEM = "filteringFactor";
|
const char S_FILTERING_FACTOR[] PROGMEM = "filteringFactor";
|
||||||
const char S_FLAGS[] PROGMEM = "flags";
|
const char S_FLAGS[] PROGMEM = "flags";
|
||||||
@@ -112,6 +115,7 @@ const char S_IGNORE_DIAG_STATE[] PROGMEM = "ignoreDiagState";
|
|||||||
const char S_IMMERGAS_FIX[] PROGMEM = "immergasFix";
|
const char S_IMMERGAS_FIX[] PROGMEM = "immergasFix";
|
||||||
const char S_ALWAYS_SEND_INDOOR_TEMP[] PROGMEM = "alwaysSendIndoorTemp";
|
const char S_ALWAYS_SEND_INDOOR_TEMP[] PROGMEM = "alwaysSendIndoorTemp";
|
||||||
const char S_INDOOR_TEMP[] PROGMEM = "indoorTemp";
|
const char S_INDOOR_TEMP[] PROGMEM = "indoorTemp";
|
||||||
|
const char S_INDOOR_TEMP_AVG_TYPE[] PROGMEM = "indoorTempAvgType";
|
||||||
const char S_INDOOR_TEMP_CONTROL[] PROGMEM = "indoorTempControl";
|
const char S_INDOOR_TEMP_CONTROL[] PROGMEM = "indoorTempControl";
|
||||||
const char S_IN_GPIO[] PROGMEM = "inGpio";
|
const char S_IN_GPIO[] PROGMEM = "inGpio";
|
||||||
const char S_INPUT[] PROGMEM = "input";
|
const char S_INPUT[] PROGMEM = "input";
|
||||||
@@ -152,6 +156,7 @@ const char S_ON_LOSS_CONNECTION[] PROGMEM = "onLossConnection"
|
|||||||
const char S_OPENTHERM[] PROGMEM = "opentherm";
|
const char S_OPENTHERM[] PROGMEM = "opentherm";
|
||||||
const char S_OPTIONS[] PROGMEM = "options";
|
const char S_OPTIONS[] PROGMEM = "options";
|
||||||
const char S_OUTDOOR_TEMP[] PROGMEM = "outdoorTemp";
|
const char S_OUTDOOR_TEMP[] PROGMEM = "outdoorTemp";
|
||||||
|
const char S_OUTDOOR_TEMP_AVG_TYPE[] PROGMEM = "outdoorTempAvgType";
|
||||||
const char S_OUT_GPIO[] PROGMEM = "outGpio";
|
const char S_OUT_GPIO[] PROGMEM = "outGpio";
|
||||||
const char S_OUTPUT[] PROGMEM = "output";
|
const char S_OUTPUT[] PROGMEM = "output";
|
||||||
const char S_OVERHEAT[] PROGMEM = "overheat";
|
const char S_OVERHEAT[] PROGMEM = "overheat";
|
||||||
@@ -165,6 +170,7 @@ const char S_POWER[] PROGMEM = "power";
|
|||||||
const char S_PREFIX[] PROGMEM = "prefix";
|
const char S_PREFIX[] PROGMEM = "prefix";
|
||||||
const char S_PROTOCOL_VERSION[] PROGMEM = "protocolVersion";
|
const char S_PROTOCOL_VERSION[] PROGMEM = "protocolVersion";
|
||||||
const char S_PURPOSE[] PROGMEM = "purpose";
|
const char S_PURPOSE[] PROGMEM = "purpose";
|
||||||
|
const char S_PSRAM[] PROGMEM = "psram";
|
||||||
const char S_P_FACTOR[] PROGMEM = "p_factor";
|
const char S_P_FACTOR[] PROGMEM = "p_factor";
|
||||||
const char S_P_MULTIPLIER[] PROGMEM = "p_multiplier";
|
const char S_P_MULTIPLIER[] PROGMEM = "p_multiplier";
|
||||||
const char S_REAL_SIZE[] PROGMEM = "realSize";
|
const char S_REAL_SIZE[] PROGMEM = "realSize";
|
||||||
@@ -201,7 +207,6 @@ const char S_SYSTEM[] PROGMEM = "system";
|
|||||||
const char S_TARGET[] PROGMEM = "target";
|
const char S_TARGET[] PROGMEM = "target";
|
||||||
const char S_TARGET_DIFF_FACTOR[] PROGMEM = "targetDiffFactor";
|
const char S_TARGET_DIFF_FACTOR[] PROGMEM = "targetDiffFactor";
|
||||||
const char S_TARGET_TEMP[] PROGMEM = "targetTemp";
|
const char S_TARGET_TEMP[] PROGMEM = "targetTemp";
|
||||||
const char S_TELNET[] PROGMEM = "telnet";
|
|
||||||
const char S_TEMPERATURE[] PROGMEM = "temperature";
|
const char S_TEMPERATURE[] PROGMEM = "temperature";
|
||||||
const char S_THRESHOLD_HIGH[] PROGMEM = "thresholdHigh";
|
const char S_THRESHOLD_HIGH[] PROGMEM = "thresholdHigh";
|
||||||
const char S_THRESHOLD_LOW[] PROGMEM = "thresholdLow";
|
const char S_THRESHOLD_LOW[] PROGMEM = "thresholdLow";
|
||||||
@@ -219,3 +224,4 @@ const char S_USE_DHCP[] PROGMEM = "useDhcp";
|
|||||||
const char S_USER[] PROGMEM = "user";
|
const char S_USER[] PROGMEM = "user";
|
||||||
const char S_VALUE[] PROGMEM = "value";
|
const char S_VALUE[] PROGMEM = "value";
|
||||||
const char S_VERSION[] PROGMEM = "version";
|
const char S_VERSION[] PROGMEM = "version";
|
||||||
|
const char S_WEBSERIAL[] PROGMEM = "webSerial";
|
||||||
+75
-39
@@ -425,9 +425,8 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) {
|
|||||||
serial[FPSTR(S_ENABLED)] = src.system.serial.enabled;
|
serial[FPSTR(S_ENABLED)] = src.system.serial.enabled;
|
||||||
serial[FPSTR(S_BAUDRATE)] = src.system.serial.baudrate;
|
serial[FPSTR(S_BAUDRATE)] = src.system.serial.baudrate;
|
||||||
|
|
||||||
auto telnet = system[FPSTR(S_TELNET)].to<JsonObject>();
|
auto webSerial = system[FPSTR(S_WEBSERIAL)].to<JsonObject>();
|
||||||
telnet[FPSTR(S_ENABLED)] = src.system.telnet.enabled;
|
webSerial[FPSTR(S_ENABLED)] = src.system.webSerial.enabled;
|
||||||
telnet[FPSTR(S_PORT)] = src.system.telnet.port;
|
|
||||||
|
|
||||||
auto ntp = system[FPSTR(S_NTP)].to<JsonObject>();
|
auto ntp = system[FPSTR(S_NTP)].to<JsonObject>();
|
||||||
ntp[FPSTR(S_SERVER)] = src.system.ntp.server;
|
ntp[FPSTR(S_SERVER)] = src.system.ntp.server;
|
||||||
@@ -499,14 +498,16 @@ void settingsToJson(const Settings& src, JsonVariant dst, bool safe = false) {
|
|||||||
heating[FPSTR(S_MIN_TEMP)] = src.heating.minTemp;
|
heating[FPSTR(S_MIN_TEMP)] = src.heating.minTemp;
|
||||||
heating[FPSTR(S_MAX_TEMP)] = src.heating.maxTemp;
|
heating[FPSTR(S_MAX_TEMP)] = src.heating.maxTemp;
|
||||||
heating[FPSTR(S_MAX_MODULATION)] = src.heating.maxModulation;
|
heating[FPSTR(S_MAX_MODULATION)] = src.heating.maxModulation;
|
||||||
|
heating[FPSTR(S_INDOOR_TEMP_AVG_TYPE)] = static_cast<uint8_t>(src.heating.indoorTempAvgType);
|
||||||
|
heating[FPSTR(S_OUTDOOR_TEMP_AVG_TYPE)] = static_cast<uint8_t>(src.heating.outdoorTempAvgType);
|
||||||
|
|
||||||
auto heatingOverheatProtection = heating[FPSTR(S_OVERHEAT_PROTECTION)].to<JsonObject>();
|
auto heatingOverheatProtection = heating[FPSTR(S_OVERHEAT_PROTECTION)].to<JsonObject>();
|
||||||
heatingOverheatProtection[FPSTR(S_HIGH_TEMP)] = src.heating.overheatProtection.highTemp;
|
heatingOverheatProtection[FPSTR(S_HIGH_TEMP)] = src.heating.overheatProtection.highTemp;
|
||||||
heatingOverheatProtection[FPSTR(S_LOW_TEMP)] = src.heating.overheatProtection.lowTemp;
|
heatingOverheatProtection[FPSTR(S_LOW_TEMP)] = src.heating.overheatProtection.lowTemp;
|
||||||
|
|
||||||
auto freezeProtection = heating[FPSTR(S_FREEZE_PROTECTION)].to<JsonObject>();
|
auto freezeProtection = heating[FPSTR(S_FREEZE_PROTECTION)].to<JsonObject>();
|
||||||
|
freezeProtection[FPSTR(S_HIGH_TEMP)] = src.heating.freezeProtection.highTemp;
|
||||||
freezeProtection[FPSTR(S_LOW_TEMP)] = src.heating.freezeProtection.lowTemp;
|
freezeProtection[FPSTR(S_LOW_TEMP)] = src.heating.freezeProtection.lowTemp;
|
||||||
freezeProtection[FPSTR(S_THRESHOLD_TIME)] = src.heating.freezeProtection.thresholdTime;
|
|
||||||
|
|
||||||
auto dhw = dst[FPSTR(S_DHW)].to<JsonObject>();
|
auto dhw = dst[FPSTR(S_DHW)].to<JsonObject>();
|
||||||
dhw[FPSTR(S_ENABLED)] = src.dhw.enabled;
|
dhw[FPSTR(S_ENABLED)] = src.dhw.enabled;
|
||||||
@@ -581,7 +582,7 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
|
|||||||
if (!src[FPSTR(S_SYSTEM)][FPSTR(S_LOG_LEVEL)].isNull()) {
|
if (!src[FPSTR(S_SYSTEM)][FPSTR(S_LOG_LEVEL)].isNull()) {
|
||||||
uint8_t value = src[FPSTR(S_SYSTEM)][FPSTR(S_LOG_LEVEL)].as<uint8_t>();
|
uint8_t value = src[FPSTR(S_SYSTEM)][FPSTR(S_LOG_LEVEL)].as<uint8_t>();
|
||||||
|
|
||||||
if (value != dst.system.logLevel && value >= TinyLogger::Level::SILENT && value <= TinyLogger::Level::VERBOSE) {
|
if (value != dst.system.logLevel && value >= TinyLoggerLevel::SILENT && value <= TinyLoggerLevel::VERBOSE) {
|
||||||
dst.system.logLevel = value;
|
dst.system.logLevel = value;
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
@@ -607,20 +608,11 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src[FPSTR(S_SYSTEM)][FPSTR(S_TELNET)][FPSTR(S_ENABLED)].is<bool>()) {
|
if (src[FPSTR(S_SYSTEM)][FPSTR(S_WEBSERIAL)][FPSTR(S_ENABLED)].is<bool>()) {
|
||||||
bool value = src[FPSTR(S_SYSTEM)][FPSTR(S_TELNET)][FPSTR(S_ENABLED)].as<bool>();
|
bool value = src[FPSTR(S_SYSTEM)][FPSTR(S_WEBSERIAL)][FPSTR(S_ENABLED)].as<bool>();
|
||||||
|
|
||||||
if (value != dst.system.telnet.enabled) {
|
if (value != dst.system.webSerial.enabled) {
|
||||||
dst.system.telnet.enabled = value;
|
dst.system.webSerial.enabled = value;
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!src[FPSTR(S_SYSTEM)][FPSTR(S_TELNET)][FPSTR(S_PORT)].isNull()) {
|
|
||||||
unsigned short value = src[FPSTR(S_SYSTEM)][FPSTR(S_TELNET)][FPSTR(S_PORT)].as<unsigned short>();
|
|
||||||
|
|
||||||
if (value > 0 && value <= 65535 && value != dst.system.telnet.port) {
|
|
||||||
dst.system.telnet.port = value;
|
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1403,6 +1395,42 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!src[FPSTR(S_HEATING)][FPSTR(S_INDOOR_TEMP_AVG_TYPE)].isNull()) {
|
||||||
|
uint8_t value = src[FPSTR(S_HEATING)][FPSTR(S_INDOOR_TEMP_AVG_TYPE)].as<uint8_t>();
|
||||||
|
|
||||||
|
switch (value) {
|
||||||
|
case static_cast<uint8_t>(Sensors::AverageType::MEAN):
|
||||||
|
case static_cast<uint8_t>(Sensors::AverageType::MINIMUM):
|
||||||
|
case static_cast<uint8_t>(Sensors::AverageType::MAXIMUM):
|
||||||
|
if (static_cast<uint8_t>(dst.heating.indoorTempAvgType) != value) {
|
||||||
|
dst.heating.indoorTempAvgType = static_cast<Sensors::AverageType>(value);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!src[FPSTR(S_HEATING)][FPSTR(S_OUTDOOR_TEMP_AVG_TYPE)].isNull()) {
|
||||||
|
uint8_t value = src[FPSTR(S_HEATING)][FPSTR(S_OUTDOOR_TEMP_AVG_TYPE)].as<uint8_t>();
|
||||||
|
|
||||||
|
switch (value) {
|
||||||
|
case static_cast<uint8_t>(Sensors::AverageType::MEAN):
|
||||||
|
case static_cast<uint8_t>(Sensors::AverageType::MINIMUM):
|
||||||
|
case static_cast<uint8_t>(Sensors::AverageType::MAXIMUM):
|
||||||
|
if (static_cast<uint8_t>(dst.heating.outdoorTempAvgType) != value) {
|
||||||
|
dst.heating.outdoorTempAvgType = static_cast<Sensors::AverageType>(value);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!src[FPSTR(S_HEATING)][FPSTR(S_OVERHEAT_PROTECTION)][FPSTR(S_HIGH_TEMP)].isNull()) {
|
if (!src[FPSTR(S_HEATING)][FPSTR(S_OVERHEAT_PROTECTION)][FPSTR(S_HIGH_TEMP)].isNull()) {
|
||||||
unsigned char value = src[FPSTR(S_HEATING)][FPSTR(S_OVERHEAT_PROTECTION)][FPSTR(S_HIGH_TEMP)].as<unsigned char>();
|
unsigned char value = src[FPSTR(S_HEATING)][FPSTR(S_OVERHEAT_PROTECTION)][FPSTR(S_HIGH_TEMP)].as<unsigned char>();
|
||||||
|
|
||||||
@@ -1426,6 +1454,15 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
|
|||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!src[FPSTR(S_HEATING)][FPSTR(S_FREEZE_PROTECTION)][FPSTR(S_HIGH_TEMP)].isNull()) {
|
||||||
|
unsigned short value = src[FPSTR(S_HEATING)][FPSTR(S_FREEZE_PROTECTION)][FPSTR(S_HIGH_TEMP)].as<uint8_t>();
|
||||||
|
|
||||||
|
if (isValidTemp(value, dst.system.unitSystem, 1, 50) && value != dst.heating.freezeProtection.highTemp) {
|
||||||
|
dst.heating.freezeProtection.highTemp = value;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!src[FPSTR(S_HEATING)][FPSTR(S_FREEZE_PROTECTION)][FPSTR(S_LOW_TEMP)].isNull()) {
|
if (!src[FPSTR(S_HEATING)][FPSTR(S_FREEZE_PROTECTION)][FPSTR(S_LOW_TEMP)].isNull()) {
|
||||||
unsigned short value = src[FPSTR(S_HEATING)][FPSTR(S_FREEZE_PROTECTION)][FPSTR(S_LOW_TEMP)].as<uint8_t>();
|
unsigned short value = src[FPSTR(S_HEATING)][FPSTR(S_FREEZE_PROTECTION)][FPSTR(S_LOW_TEMP)].as<uint8_t>();
|
||||||
|
|
||||||
@@ -1435,15 +1472,9 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!src[FPSTR(S_HEATING)][FPSTR(S_FREEZE_PROTECTION)][FPSTR(S_THRESHOLD_TIME)].isNull()) {
|
if (dst.heating.freezeProtection.highTemp < dst.heating.freezeProtection.lowTemp) {
|
||||||
unsigned short value = src[FPSTR(S_HEATING)][FPSTR(S_FREEZE_PROTECTION)][FPSTR(S_THRESHOLD_TIME)].as<unsigned short>();
|
dst.heating.freezeProtection.highTemp = dst.heating.freezeProtection.lowTemp;
|
||||||
|
changed = true;
|
||||||
if (value >= 30 && value <= 1800) {
|
|
||||||
if (value != dst.heating.freezeProtection.thresholdTime) {
|
|
||||||
dst.heating.freezeProtection.thresholdTime = value;
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1937,6 +1968,8 @@ bool jsonToSensorSettings(const uint8_t sensorId, const JsonVariantConst src, Se
|
|||||||
case static_cast<uint8_t>(Sensors::Type::NTC_10K_TEMP):
|
case static_cast<uint8_t>(Sensors::Type::NTC_10K_TEMP):
|
||||||
case static_cast<uint8_t>(Sensors::Type::DALLAS_TEMP):
|
case static_cast<uint8_t>(Sensors::Type::DALLAS_TEMP):
|
||||||
case static_cast<uint8_t>(Sensors::Type::BLUETOOTH):
|
case static_cast<uint8_t>(Sensors::Type::BLUETOOTH):
|
||||||
|
case static_cast<uint8_t>(Sensors::Type::DHT11):
|
||||||
|
case static_cast<uint8_t>(Sensors::Type::DHT22):
|
||||||
case static_cast<uint8_t>(Sensors::Type::HEATING_SETPOINT_TEMP):
|
case static_cast<uint8_t>(Sensors::Type::HEATING_SETPOINT_TEMP):
|
||||||
case static_cast<uint8_t>(Sensors::Type::MANUAL):
|
case static_cast<uint8_t>(Sensors::Type::MANUAL):
|
||||||
case static_cast<uint8_t>(Sensors::Type::NOT_CONFIGURED):
|
case static_cast<uint8_t>(Sensors::Type::NOT_CONFIGURED):
|
||||||
@@ -1953,7 +1986,8 @@ bool jsonToSensorSettings(const uint8_t sensorId, const JsonVariantConst src, Se
|
|||||||
|
|
||||||
// gpio
|
// gpio
|
||||||
if (!src[FPSTR(S_GPIO)].isNull()) {
|
if (!src[FPSTR(S_GPIO)].isNull()) {
|
||||||
if (dst.type != Sensors::Type::DALLAS_TEMP && dst.type != Sensors::Type::NTC_10K_TEMP) {
|
if (dst.type != Sensors::Type::DALLAS_TEMP && dst.type != Sensors::Type::NTC_10K_TEMP &&
|
||||||
|
dst.type != Sensors::Type::DHT11 && dst.type != Sensors::Type::DHT22) {
|
||||||
if (dst.gpio != GPIO_IS_NOT_CONFIGURED) {
|
if (dst.gpio != GPIO_IS_NOT_CONFIGURED) {
|
||||||
dst.gpio = GPIO_IS_NOT_CONFIGURED;
|
dst.gpio = GPIO_IS_NOT_CONFIGURED;
|
||||||
changed = true;
|
changed = true;
|
||||||
@@ -2094,6 +2128,10 @@ void sensorResultToJson(const uint8_t sensorId, JsonVariant dst) {
|
|||||||
dst[FPSTR(S_BATTERY)] = roundf(rSensor.values[static_cast<uint8_t>(Sensors::ValueType::BATTERY)], 1);
|
dst[FPSTR(S_BATTERY)] = roundf(rSensor.values[static_cast<uint8_t>(Sensors::ValueType::BATTERY)], 1);
|
||||||
dst[FPSTR(S_RSSI)] = roundf(rSensor.values[static_cast<uint8_t>(Sensors::ValueType::RSSI)], 0);
|
dst[FPSTR(S_RSSI)] = roundf(rSensor.values[static_cast<uint8_t>(Sensors::ValueType::RSSI)], 0);
|
||||||
|
|
||||||
|
} else if (sSensor.type == Sensors::Type::DHT11 || sSensor.type == Sensors::Type::DHT22) {
|
||||||
|
dst[FPSTR(S_TEMPERATURE)] = roundf(rSensor.values[static_cast<uint8_t>(Sensors::ValueType::TEMPERATURE)], 3);
|
||||||
|
dst[FPSTR(S_HUMIDITY)] = roundf(rSensor.values[static_cast<uint8_t>(Sensors::ValueType::HUMIDITY)], 3);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
dst[FPSTR(S_VALUE)] = roundf(rSensor.values[static_cast<uint8_t>(Sensors::ValueType::PRIMARY)], 3);
|
dst[FPSTR(S_VALUE)] = roundf(rSensor.values[static_cast<uint8_t>(Sensors::ValueType::PRIMARY)], 3);
|
||||||
}
|
}
|
||||||
@@ -2109,21 +2147,18 @@ bool jsonToSensorResult(const uint8_t sensorId, const JsonVariantConst src) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& dst = Sensors::results[sensorId];
|
|
||||||
bool changed = false;
|
|
||||||
|
|
||||||
// value
|
// value
|
||||||
if (!src[FPSTR(S_VALUE)].isNull()) {
|
if (!src[FPSTR(S_VALUE)].isNull()) {
|
||||||
float value = src[FPSTR(S_VALUE)].as<float>();
|
return Sensors::setValueById(
|
||||||
|
sensorId,
|
||||||
uint8_t vType = static_cast<uint8_t>(Sensors::ValueType::PRIMARY);
|
src[FPSTR(S_VALUE)].as<float>(),
|
||||||
if (fabsf(value - dst.values[vType]) > 0.0001f) {
|
Sensors::ValueType::PRIMARY,
|
||||||
dst.values[vType] = roundf(value, 2);
|
true,
|
||||||
changed = true;
|
true
|
||||||
}
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return changed;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void varsToJson(const Variables& src, JsonVariant dst) {
|
void varsToJson(const Variables& src, JsonVariant dst) {
|
||||||
@@ -2173,6 +2208,7 @@ void varsToJson(const Variables& src, JsonVariant dst) {
|
|||||||
mHeating[FPSTR(S_BLOCKING)] = src.master.heating.blocking;
|
mHeating[FPSTR(S_BLOCKING)] = src.master.heating.blocking;
|
||||||
mHeating[FPSTR(S_INDOOR_TEMP_CONTROL)] = src.master.heating.indoorTempControl;
|
mHeating[FPSTR(S_INDOOR_TEMP_CONTROL)] = src.master.heating.indoorTempControl;
|
||||||
mHeating[FPSTR(S_OVERHEAT)] = src.master.heating.overheat;
|
mHeating[FPSTR(S_OVERHEAT)] = src.master.heating.overheat;
|
||||||
|
mHeating[FPSTR(S_FREEZING)] = src.master.heating.freezing;
|
||||||
mHeating[FPSTR(S_SETPOINT_TEMP)] = roundf(src.master.heating.setpointTemp, 2);
|
mHeating[FPSTR(S_SETPOINT_TEMP)] = roundf(src.master.heating.setpointTemp, 2);
|
||||||
mHeating[FPSTR(S_TARGET_TEMP)] = roundf(src.master.heating.targetTemp, 2);
|
mHeating[FPSTR(S_TARGET_TEMP)] = roundf(src.master.heating.targetTemp, 2);
|
||||||
mHeating[FPSTR(S_CURRENT_TEMP)] = roundf(src.master.heating.currentTemp, 2);
|
mHeating[FPSTR(S_CURRENT_TEMP)] = roundf(src.master.heating.currentTemp, 2);
|
||||||
|
|||||||
+54
-66
@@ -8,15 +8,19 @@
|
|||||||
"issues": "问题与反馈",
|
"issues": "问题与反馈",
|
||||||
"releases": "发行版"
|
"releases": "发行版"
|
||||||
},
|
},
|
||||||
"dbm": "dBm",
|
"units": {
|
||||||
"kw": "kW",
|
|
||||||
"time": {
|
|
||||||
"days": "天",
|
"days": "天",
|
||||||
"hours": "小时",
|
"hours": "小时",
|
||||||
"min": "分",
|
"min": "分",
|
||||||
"sec": "秒"
|
"sec": "秒",
|
||||||
|
"dbm": "dBm",
|
||||||
|
"mhz": "MHz",
|
||||||
|
"kw": "kW",
|
||||||
|
"rpm": "RPM",
|
||||||
|
"ppm": "ppm",
|
||||||
|
"byte": "byte",
|
||||||
|
"mbyte": "MB"
|
||||||
},
|
},
|
||||||
|
|
||||||
"button": {
|
"button": {
|
||||||
"upgrade": "固件升级",
|
"upgrade": "固件升级",
|
||||||
"restart": "重启",
|
"restart": "重启",
|
||||||
@@ -31,26 +35,25 @@
|
|||||||
"success": "成功",
|
"success": "成功",
|
||||||
"error": "错误"
|
"error": "错误"
|
||||||
},
|
},
|
||||||
|
|
||||||
"index": {
|
"index": {
|
||||||
"title": "OpenTherm Gateway",
|
"title": "OpenTherm Gateway",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"network": "网络",
|
"network": "网络",
|
||||||
"system": "系统"
|
"system": "系统"
|
||||||
},
|
},
|
||||||
|
|
||||||
"system": {
|
"system": {
|
||||||
"build": {
|
"build": {
|
||||||
"title": "Build",
|
"title": "Build",
|
||||||
"version": "固件版本",
|
"version": "固件版本",
|
||||||
|
"commit": "Commit",
|
||||||
"date": "日期",
|
"date": "日期",
|
||||||
"core": "内核版本",
|
"core": "内核版本",
|
||||||
"sdk": "SDK"
|
"sdk": "SDK"
|
||||||
},
|
},
|
||||||
"uptime": "运行时间",
|
"uptime": "运行时间",
|
||||||
"memory": {
|
"memory": {
|
||||||
"title": "可用内存",
|
"heap": "内存 (heap)",
|
||||||
|
"psram": "内存 (PSRAM)",
|
||||||
"maxFreeBlock": "max free block",
|
"maxFreeBlock": "max free block",
|
||||||
"min": "min"
|
"min": "min"
|
||||||
},
|
},
|
||||||
@@ -67,26 +70,22 @@
|
|||||||
"lastResetReason": "上次重置原因"
|
"lastResetReason": "上次重置原因"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"name": "仪表盘",
|
"name": "仪表盘",
|
||||||
"title": "仪表盘 - OpenTherm Gateway",
|
"title": "仪表盘 - OpenTherm Gateway",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"control": "调节",
|
"control": "调节",
|
||||||
"states": "状态",
|
"states": "状态",
|
||||||
"sensors": "传感器",
|
"sensors": "传感器",
|
||||||
"diag": "OpenTherm 诊断"
|
"diag": "OpenTherm 诊断"
|
||||||
},
|
},
|
||||||
|
|
||||||
"thermostat": {
|
"thermostat": {
|
||||||
"heating": "供暖",
|
"heating": "供暖",
|
||||||
"dhw": "生活热水",
|
"dhw": "生活热水",
|
||||||
"temp.current": "当前温度",
|
"currentTemp": "当前温度",
|
||||||
"enable": "启用",
|
"enable": "启用",
|
||||||
"turbo": "Turbo 模式"
|
"turbo": "Turbo 模式"
|
||||||
},
|
},
|
||||||
|
|
||||||
"notify": {
|
"notify": {
|
||||||
"fault": {
|
"fault": {
|
||||||
"title": "锅炉报警状态已激活!",
|
"title": "锅炉报警状态已激活!",
|
||||||
@@ -98,7 +97,6 @@
|
|||||||
},
|
},
|
||||||
"reset": "点击复位"
|
"reset": "点击复位"
|
||||||
},
|
},
|
||||||
|
|
||||||
"states": {
|
"states": {
|
||||||
"mNetworkConnected": "网络连接状态",
|
"mNetworkConnected": "网络连接状态",
|
||||||
"mMqttConnected": "MQTT服务器连接状态",
|
"mMqttConnected": "MQTT服务器连接状态",
|
||||||
@@ -106,7 +104,6 @@
|
|||||||
"mExtPumpState": "外置循环泵",
|
"mExtPumpState": "外置循环泵",
|
||||||
"mCascadeControlInput": "Cascade 控制 (input)",
|
"mCascadeControlInput": "Cascade 控制 (input)",
|
||||||
"mCascadeControlOutput": "Cascade 控制 (output)",
|
"mCascadeControlOutput": "Cascade 控制 (output)",
|
||||||
|
|
||||||
"sConnected": "OpenTherm 通讯状态",
|
"sConnected": "OpenTherm 通讯状态",
|
||||||
"sFlame": "火焰",
|
"sFlame": "火焰",
|
||||||
"sCoolingActive": "制冷",
|
"sCoolingActive": "制冷",
|
||||||
@@ -115,10 +112,10 @@
|
|||||||
"sFaultCode": "报警代码",
|
"sFaultCode": "报警代码",
|
||||||
"sDiagActive": "诊断状态",
|
"sDiagActive": "诊断状态",
|
||||||
"sDiagCode": "诊断代码",
|
"sDiagCode": "诊断代码",
|
||||||
|
|
||||||
"mHeatEnabled": "供暖功能已启用",
|
"mHeatEnabled": "供暖功能已启用",
|
||||||
"mHeatBlocking": "供暖",
|
"mHeatBlocking": "供暖",
|
||||||
"mHeatOverheat": "供暖超热保护",
|
"mHeatOverheat": "供暖超热保护",
|
||||||
|
"mHeatFreezing": "防冻保护",
|
||||||
"sHeatActive": "供暖激活状态",
|
"sHeatActive": "供暖激活状态",
|
||||||
"mHeatSetpointTemp": "供暖供水设定温度",
|
"mHeatSetpointTemp": "供暖供水设定温度",
|
||||||
"mHeatTargetTemp": "供暖供水目标温度",
|
"mHeatTargetTemp": "供暖供水目标温度",
|
||||||
@@ -126,7 +123,6 @@
|
|||||||
"mHeatRetTemp": "供暖回水温度",
|
"mHeatRetTemp": "供暖回水温度",
|
||||||
"mHeatIndoorTemp": "供暖,室内温度",
|
"mHeatIndoorTemp": "供暖,室内温度",
|
||||||
"mHeatOutdoorTemp": "供暖,室外温度",
|
"mHeatOutdoorTemp": "供暖,室外温度",
|
||||||
|
|
||||||
"mDhwEnabled": "生活热水功能已启用",
|
"mDhwEnabled": "生活热水功能已启用",
|
||||||
"mDhwOverheat": "生活热水超热保护",
|
"mDhwOverheat": "生活热水超热保护",
|
||||||
"sDhwActive": "生活热水激活",
|
"sDhwActive": "生活热水激活",
|
||||||
@@ -134,7 +130,6 @@
|
|||||||
"mDhwCurrTemp": "生活热水当前出水温度",
|
"mDhwCurrTemp": "生活热水当前出水温度",
|
||||||
"mDhwRetTemp": "生活热水回水温度"
|
"mDhwRetTemp": "生活热水回水温度"
|
||||||
},
|
},
|
||||||
|
|
||||||
"sensors": {
|
"sensors": {
|
||||||
"values": {
|
"values": {
|
||||||
"temp": "温度",
|
"temp": "温度",
|
||||||
@@ -144,23 +139,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"network": {
|
"network": {
|
||||||
"title": "网络 - OpenTherm Gateway",
|
"title": "网络 - OpenTherm Gateway",
|
||||||
"name": "网络设置",
|
"name": "网络设置",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"static": "静态设置",
|
"static": "静态设置",
|
||||||
"availableNetworks": "可用网络",
|
"availableNetworks": "可用网络",
|
||||||
"staSettings": "WiFi 设置",
|
"staSettings": "WiFi 设置",
|
||||||
"apSettings": "AP 设置"
|
"apSettings": "AP 设置"
|
||||||
},
|
},
|
||||||
|
|
||||||
"scan": {
|
"scan": {
|
||||||
"pos": "#",
|
"pos": "#",
|
||||||
"info": "Info"
|
"info": "Info"
|
||||||
},
|
},
|
||||||
|
|
||||||
"wifi": {
|
"wifi": {
|
||||||
"ssid": "SSID",
|
"ssid": "SSID",
|
||||||
"password": "密码",
|
"password": "密码",
|
||||||
@@ -168,7 +159,6 @@
|
|||||||
"signal": "信号强度",
|
"signal": "信号强度",
|
||||||
"connected": "已连接"
|
"connected": "已连接"
|
||||||
},
|
},
|
||||||
|
|
||||||
"params": {
|
"params": {
|
||||||
"hostname": "Hostname",
|
"hostname": "Hostname",
|
||||||
"dhcp": "自动 (DHCP)",
|
"dhcp": "自动 (DHCP)",
|
||||||
@@ -178,16 +168,15 @@
|
|||||||
"gateway": "网关",
|
"gateway": "网关",
|
||||||
"dns": "DNS 服务器"
|
"dns": "DNS 服务器"
|
||||||
},
|
},
|
||||||
|
|
||||||
"sta": {
|
"sta": {
|
||||||
"channel.note": "自动选择设置为0"
|
"channel": {
|
||||||
|
"note": "自动选择设置为0"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"sensors": {
|
"sensors": {
|
||||||
"title": "传感器设置 - OpenTherm Gateway",
|
"title": "传感器设置 - OpenTherm Gateway",
|
||||||
"name": "传感器设置",
|
"name": "传感器设置",
|
||||||
|
|
||||||
"enabled": "启用",
|
"enabled": "启用",
|
||||||
"sensorName": {
|
"sensorName": {
|
||||||
"title": "传感器名称",
|
"title": "传感器名称",
|
||||||
@@ -244,10 +233,11 @@
|
|||||||
"otHeatingPumpHours": "OpenTherm, number of pump operating hours (heating)",
|
"otHeatingPumpHours": "OpenTherm, number of pump operating hours (heating)",
|
||||||
"otDhwPumpHours": "OpenTherm, number of pump operating hours (DHW)",
|
"otDhwPumpHours": "OpenTherm, number of pump operating hours (DHW)",
|
||||||
"otCoolingHours": "OpenTherm, number of cooling hours",
|
"otCoolingHours": "OpenTherm, number of cooling hours",
|
||||||
|
|
||||||
"ntcTemp": "NTC 传感器",
|
"ntcTemp": "NTC 传感器",
|
||||||
"dallasTemp": "DALLAS 传感器",
|
"dallasTemp": "DALLAS 传感器",
|
||||||
"bluetooth": "BLE 传感器",
|
"bluetooth": "BLE 传感器",
|
||||||
|
"dht11": "DHT11 传感器",
|
||||||
|
"dht22": "DHT22 传感器",
|
||||||
"heatSetpointTemp": "Heating, setpoint temp",
|
"heatSetpointTemp": "Heating, setpoint temp",
|
||||||
"manual": "通过 MQTT/API 手动配置",
|
"manual": "通过 MQTT/API 手动配置",
|
||||||
"notConfigured": "未配置"
|
"notConfigured": "未配置"
|
||||||
@@ -274,11 +264,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "设置 - OpenTherm Gateway",
|
"title": "设置 - OpenTherm Gateway",
|
||||||
"name": "设置",
|
"name": "设置",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"portal": "Portal 设置",
|
"portal": "Portal 设置",
|
||||||
"system": "系统设置",
|
"system": "系统设置",
|
||||||
@@ -293,18 +281,21 @@
|
|||||||
"extPump": "外置循环泵设置",
|
"extPump": "外置循环泵设置",
|
||||||
"cascadeControl": "Cascade 级联控制设置"
|
"cascadeControl": "Cascade 级联控制设置"
|
||||||
},
|
},
|
||||||
|
|
||||||
"enable": "启用",
|
"enable": "启用",
|
||||||
"note": {
|
"note": {
|
||||||
"restart": "更改这些设置后,必须重启设备以使变更生效",
|
"restart": "更改这些设置后,必须重启设备以使变更生效",
|
||||||
"blankNotUse": "空白 - 未使用",
|
"blankNotUse": "空白 - 未使用",
|
||||||
"bleDevice": "BLE设备仅支持搭载BLE功能的特定ESP32开发板使用!"
|
"bleDevice": "BLE设备仅支持搭载BLE功能的特定ESP32开发板使用!"
|
||||||
},
|
},
|
||||||
|
|
||||||
"temp": {
|
"temp": {
|
||||||
"min": "最低温度",
|
"min": "最低温度",
|
||||||
"max": "最高温度"
|
"max": "最高温度"
|
||||||
},
|
},
|
||||||
|
"avgType": {
|
||||||
|
"mean": "平均温度",
|
||||||
|
"min": "最低温度",
|
||||||
|
"max": "最高温度"
|
||||||
|
},
|
||||||
"maxModulation": "最大调制范围",
|
"maxModulation": "最大调制范围",
|
||||||
"ohProtection": {
|
"ohProtection": {
|
||||||
"title": "超温保护",
|
"title": "超温保护",
|
||||||
@@ -320,18 +311,22 @@
|
|||||||
},
|
},
|
||||||
"freezeProtection": {
|
"freezeProtection": {
|
||||||
"title": "防冻保护",
|
"title": "防冻保护",
|
||||||
"desc": "当热媒或室内温度在<b>等待时间</b> 内降至<b>低温阈值</b>以下时,系统将强制启动加热功能。",
|
"desc": "如果热载体或室内温度低于 <b>低温</b>,加热将被强制开启。",
|
||||||
"lowTemp": "低温阈值",
|
"highTemp": {
|
||||||
"thresholdTime": "等待时间<small>(秒)</small>"
|
"title": "高温阈值",
|
||||||
|
"note": "防冻保护激活后系统恢复正常模式的阈值"
|
||||||
|
},
|
||||||
|
"lowTemp": {
|
||||||
|
"title": "低温阈值",
|
||||||
|
"note": "强制开启加热的阈值"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"portal": {
|
"portal": {
|
||||||
"login": "登录",
|
"login": "登录",
|
||||||
"password": "密码",
|
"password": "密码",
|
||||||
"auth": "需身份验证",
|
"auth": "需身份验证",
|
||||||
"mdns": "使用 mDNS"
|
"mdns": "使用 mDNS"
|
||||||
},
|
},
|
||||||
|
|
||||||
"system": {
|
"system": {
|
||||||
"unit": "单位",
|
"unit": "单位",
|
||||||
"metric": "公制 <small>(摄氏度、升、巴)</small>",
|
"metric": "公制 <small>(摄氏度、升、巴)</small>",
|
||||||
@@ -342,12 +337,8 @@
|
|||||||
"enable": "启用串口",
|
"enable": "启用串口",
|
||||||
"baud": "串口波特率"
|
"baud": "串口波特率"
|
||||||
},
|
},
|
||||||
"telnet": {
|
"webSerial": {
|
||||||
"enable": "启用 Telnet",
|
"enable": "启用 WebSerial"
|
||||||
"port": {
|
|
||||||
"title": "Telnet 端口",
|
|
||||||
"note": "默认值:23"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"ntp": {
|
"ntp": {
|
||||||
"server": "NTP服务器",
|
"server": "NTP服务器",
|
||||||
@@ -355,7 +346,6 @@
|
|||||||
"timezonePresets": "选择预设配置..."
|
"timezonePresets": "选择预设配置..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"heating": {
|
"heating": {
|
||||||
"hyst": {
|
"hyst": {
|
||||||
"title": "滞回",
|
"title": "滞回",
|
||||||
@@ -367,19 +357,24 @@
|
|||||||
"set0target": "设置空目标"
|
"set0target": "设置空目标"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"turboFactor": "Turbo 模式系数"
|
"turboFactor": "Turbo 模式系数",
|
||||||
|
"indoorTempAvgType": {
|
||||||
|
"title": "室内温度平均类型",
|
||||||
|
"desc": "使用两个或更多室内温度传感器时可能有用(使用 «Equitherm» 和/或 «PID» 时)。"
|
||||||
|
},
|
||||||
|
"outdoorTempAvgType": {
|
||||||
|
"title": "室外温度平均类型",
|
||||||
|
"desc": "使用两个或更多室外温度传感器时可能有用(使用 «Equitherm» 时)。"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"emergency": {
|
"emergency": {
|
||||||
"desc": "紧急模式会在以下情况自动激活(当PID或气候补偿无法计算热媒设定值时):<br />启用气候补偿但室外温度传感器断开连接;<br />启用PID或 OpenTherm 选项中启用<i>原生供暖控制</i>但室内温度传感器断开连接。<br /><b>注意:</b> 网络故障或MQTT 服务器连接故障时,类型为<i>通过MQTT/API手动控制<i>的传感器将显示为断开连接状态。",
|
"desc": "紧急模式会在以下情况自动激活(当PID或气候补偿无法计算热媒设定值时):<br />启用气候补偿但室外温度传感器断开连接;<br />启用PID或 OpenTherm 选项中启用<i>原生供暖控制</i>但室内温度传感器断开连接。<br /><b>注意:</b> 网络故障或MQTT 服务器连接故障时,类型为<i>通过MQTT/API手动控制</i>的传感器将显示为断开连接状态。",
|
||||||
|
|
||||||
"target": {
|
"target": {
|
||||||
"title": "目标温度",
|
"title": "目标温度",
|
||||||
"note": "<b>重要提示:</b> 若启用OpenTherm选项 <i>«原生供暖控制»</i>,此处设定值为<u>目标室内温度</u>;<br />其他所有情况下,此处设定值为 <u>目标热媒出水温度</u>."
|
"note": "<b>重要提示:</b> 若启用OpenTherm选项 <i>«原生供暖控制»</i>,此处设定值为<u>目标室内温度</u>;<br />其他所有情况下,此处设定值为 <u>目标热媒出水温度</u>."
|
||||||
},
|
},
|
||||||
"treshold": "阈值时间 <small>(秒)</small>"
|
"treshold": "阈值时间 <small>(秒)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"equitherm": {
|
"equitherm": {
|
||||||
"slope": {
|
"slope": {
|
||||||
"title": "斜率",
|
"title": "斜率",
|
||||||
@@ -403,7 +398,6 @@
|
|||||||
"outdoorTemp": "室外温度"
|
"outdoorTemp": "室外温度"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"pid": {
|
"pid": {
|
||||||
"p": "P 系数",
|
"p": "P 系数",
|
||||||
"i": "I 系数",
|
"i": "I 系数",
|
||||||
@@ -423,7 +417,6 @@
|
|||||||
"thresholdLow": "Threshold low"
|
"thresholdLow": "Threshold low"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"ot": {
|
"ot": {
|
||||||
"advanced": "高级设置",
|
"advanced": "高级设置",
|
||||||
"inGpio": "In GPIO",
|
"inGpio": "In GPIO",
|
||||||
@@ -437,9 +430,8 @@
|
|||||||
},
|
},
|
||||||
"maxPower": {
|
"maxPower": {
|
||||||
"title": "最大锅炉功率 <small>(kW)</small>",
|
"title": "最大锅炉功率 <small>(kW)</small>",
|
||||||
"note": "<b>0</b> - 自动检测,通常在锅炉参数设置中的\"最大有效热输出\"。 "
|
"note": "<b>0</b> - 自动检测,通常在锅炉参数设置中的\"最大有效热输出\"。"
|
||||||
},
|
},
|
||||||
|
|
||||||
"options": {
|
"options": {
|
||||||
"title": "选项(附加设置)",
|
"title": "选项(附加设置)",
|
||||||
"desc": "附加设置选项可调整锅炉的运行逻辑。由于协议未完整记录所有选项,同一选项在不同锅炉上可能产生不同效果。<br /><b>注意:</b>若系统运行正常,无需修改设置。",
|
"desc": "附加设置选项可调整锅炉的运行逻辑。由于协议未完整记录所有选项,同一选项在不同锅炉上可能产生不同效果。<br /><b>注意:</b>若系统运行正常,无需修改设置。",
|
||||||
@@ -461,13 +453,11 @@
|
|||||||
"immergasFix": "针对Immergas锅炉的兼容性修复",
|
"immergasFix": "针对Immergas锅炉的兼容性修复",
|
||||||
"alwaysSendIndoorTemp": "向锅炉发送当前室内温度"
|
"alwaysSendIndoorTemp": "向锅炉发送当前室内温度"
|
||||||
},
|
},
|
||||||
|
|
||||||
"nativeOTC": {
|
"nativeOTC": {
|
||||||
"title": "原生热载体温度计算模式",
|
"title": "原生热载体温度计算模式",
|
||||||
"note": "仅在锅炉处于 OTC 模式时<u>才</u>工作:需要并接受目标室内温度,并基于内置曲线模式自行调节热载体温度。与 PID 和 Equitherm 不兼容。"
|
"note": "仅在锅炉处于 OTC 模式时<u>才</u>工作:需要并接受目标室内温度,并基于内置曲线模式自行调节热载体温度。与 PID 和 Equitherm 不兼容。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"mqtt": {
|
"mqtt": {
|
||||||
"homeAssistantDiscovery": "Home Assistant 自动发现",
|
"homeAssistantDiscovery": "Home Assistant 自动发现",
|
||||||
"server": "服务器地址",
|
"server": "服务器地址",
|
||||||
@@ -477,7 +467,6 @@
|
|||||||
"prefix": "Prefix 前缀",
|
"prefix": "Prefix 前缀",
|
||||||
"interval": "发布间隔 <small>(秒)</small>"
|
"interval": "发布间隔 <small>(秒)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"extPump": {
|
"extPump": {
|
||||||
"use": "使用外置循环泵",
|
"use": "使用外置循环泵",
|
||||||
"gpio": "继电器 GPIO引脚",
|
"gpio": "继电器 GPIO引脚",
|
||||||
@@ -486,7 +475,6 @@
|
|||||||
"antiStuckInterval": "防卡死间隔时间<small>(天)</small>",
|
"antiStuckInterval": "防卡死间隔时间<small>(天)</small>",
|
||||||
"antiStuckTime": "防卡死运行时长<small>(分钟)</small>"
|
"antiStuckTime": "防卡死运行时长<small>(分钟)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"cascadeControl": {
|
"cascadeControl": {
|
||||||
"input": {
|
"input": {
|
||||||
"desc": "仅当另一台锅炉发生故障时启用本锅炉加热。另一台锅炉的控制器需在故障发生时切换GPIO输入状态以触发本功能。",
|
"desc": "仅当另一台锅炉发生故障时启用本锅炉加热。另一台锅炉的控制器需在故障发生时切换GPIO输入状态以触发本功能。",
|
||||||
@@ -510,23 +498,23 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"upgrade": {
|
"upgrade": {
|
||||||
"title": "固件升级 - OpenTherm Gateway",
|
"title": "固件升级 - OpenTherm Gateway",
|
||||||
"name": "固件升级",
|
"name": "固件升级",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"backupAndRestore": "备份与恢复",
|
"backupAndRestore": {
|
||||||
"backupAndRestore.desc": "本功能支持备份和恢复全部设置",
|
"title": "备份与恢复",
|
||||||
"upgrade": "升级",
|
"desc": "本功能支持备份和恢复全部设置"
|
||||||
"upgrade.desc": "本模块支持升级设备的固件与系统文件。<br />可从以下地址下载最新版本 <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Releases page</a> 。"
|
},
|
||||||
|
"upgrade": {
|
||||||
|
"title": "升级",
|
||||||
|
"desc": "本模块支持升级设备的固件与系统文件。<br />可从以下地址下载最新版本 <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Releases page</a> 。"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"note": {
|
"note": {
|
||||||
"disclaimer1": "升级系统文件成功后,所有设置将恢复为默认值!升级前请务必备份配置。",
|
"disclaimer1": "升级系统文件成功后,所有设置将恢复为默认值!升级前请务必备份配置。",
|
||||||
"disclaimer2": "升级成功后,设备将在15秒后自动重启。"
|
"disclaimer2": "升级成功后,设备将在15秒后自动重启。"
|
||||||
},
|
},
|
||||||
|
|
||||||
"settingsFile": "设置文件",
|
"settingsFile": "设置文件",
|
||||||
"fw": "Firmware",
|
"fw": "Firmware",
|
||||||
"fs": "Filesystem"
|
"fs": "Filesystem"
|
||||||
|
|||||||
+52
-64
@@ -8,15 +8,19 @@
|
|||||||
"issues": "Issues & questions",
|
"issues": "Issues & questions",
|
||||||
"releases": "Releases"
|
"releases": "Releases"
|
||||||
},
|
},
|
||||||
"dbm": "dBm",
|
"units": {
|
||||||
"kw": "kW",
|
|
||||||
"time": {
|
|
||||||
"days": "d.",
|
"days": "d.",
|
||||||
"hours": "h.",
|
"hours": "h.",
|
||||||
"min": "min.",
|
"min": "min.",
|
||||||
"sec": "sec."
|
"sec": "sec.",
|
||||||
|
"dbm": "dBm",
|
||||||
|
"mhz": "MHz",
|
||||||
|
"kw": "kW",
|
||||||
|
"rpm": "RPM",
|
||||||
|
"ppm": "ppm",
|
||||||
|
"byte": "byte",
|
||||||
|
"mbyte": "MB"
|
||||||
},
|
},
|
||||||
|
|
||||||
"button": {
|
"button": {
|
||||||
"upgrade": "Upgrade",
|
"upgrade": "Upgrade",
|
||||||
"restart": "Restart",
|
"restart": "Restart",
|
||||||
@@ -31,26 +35,25 @@
|
|||||||
"success": "Success",
|
"success": "Success",
|
||||||
"error": "Error"
|
"error": "Error"
|
||||||
},
|
},
|
||||||
|
|
||||||
"index": {
|
"index": {
|
||||||
"title": "OpenTherm Gateway",
|
"title": "OpenTherm Gateway",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"network": "Network",
|
"network": "Network",
|
||||||
"system": "System"
|
"system": "System"
|
||||||
},
|
},
|
||||||
|
|
||||||
"system": {
|
"system": {
|
||||||
"build": {
|
"build": {
|
||||||
"title": "Build",
|
"title": "Build",
|
||||||
"version": "Version",
|
"version": "Version",
|
||||||
|
"commit": "Commit",
|
||||||
"date": "Date",
|
"date": "Date",
|
||||||
"core": "Core",
|
"core": "Core",
|
||||||
"sdk": "SDK"
|
"sdk": "SDK"
|
||||||
},
|
},
|
||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"memory": {
|
"memory": {
|
||||||
"title": "Free memory",
|
"heap": "Memory (heap)",
|
||||||
|
"psram": "Memory (PSRAM)",
|
||||||
"maxFreeBlock": "max free block",
|
"maxFreeBlock": "max free block",
|
||||||
"min": "min"
|
"min": "min"
|
||||||
},
|
},
|
||||||
@@ -67,26 +70,22 @@
|
|||||||
"lastResetReason": "Last reset reason"
|
"lastResetReason": "Last reset reason"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"name": "Dashboard",
|
"name": "Dashboard",
|
||||||
"title": "Dashboard - OpenTherm Gateway",
|
"title": "Dashboard - OpenTherm Gateway",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"control": "Control",
|
"control": "Control",
|
||||||
"states": "States",
|
"states": "States",
|
||||||
"sensors": "Sensors",
|
"sensors": "Sensors",
|
||||||
"diag": "OpenTherm diagnostic"
|
"diag": "OpenTherm diagnostic"
|
||||||
},
|
},
|
||||||
|
|
||||||
"thermostat": {
|
"thermostat": {
|
||||||
"heating": "Heating",
|
"heating": "Heating",
|
||||||
"dhw": "DHW",
|
"dhw": "DHW",
|
||||||
"temp.current": "Current",
|
"currentTemp": "Current",
|
||||||
"enable": "Enable",
|
"enable": "Enable",
|
||||||
"turbo": "Turbo mode"
|
"turbo": "Turbo mode"
|
||||||
},
|
},
|
||||||
|
|
||||||
"notify": {
|
"notify": {
|
||||||
"fault": {
|
"fault": {
|
||||||
"title": "Boiler Fault state is active!",
|
"title": "Boiler Fault state is active!",
|
||||||
@@ -98,7 +97,6 @@
|
|||||||
},
|
},
|
||||||
"reset": "Try reset"
|
"reset": "Try reset"
|
||||||
},
|
},
|
||||||
|
|
||||||
"states": {
|
"states": {
|
||||||
"mNetworkConnected": "Network connection",
|
"mNetworkConnected": "Network connection",
|
||||||
"mMqttConnected": "MQTT connection",
|
"mMqttConnected": "MQTT connection",
|
||||||
@@ -106,7 +104,6 @@
|
|||||||
"mExtPumpState": "External pump",
|
"mExtPumpState": "External pump",
|
||||||
"mCascadeControlInput": "Cascade control (input)",
|
"mCascadeControlInput": "Cascade control (input)",
|
||||||
"mCascadeControlOutput": "Cascade control (output)",
|
"mCascadeControlOutput": "Cascade control (output)",
|
||||||
|
|
||||||
"sConnected": "OpenTherm connection",
|
"sConnected": "OpenTherm connection",
|
||||||
"sFlame": "Flame",
|
"sFlame": "Flame",
|
||||||
"sCoolingActive": "Cooling",
|
"sCoolingActive": "Cooling",
|
||||||
@@ -115,10 +112,10 @@
|
|||||||
"sFaultCode": "Fault code",
|
"sFaultCode": "Fault code",
|
||||||
"sDiagActive": "Diagnostic",
|
"sDiagActive": "Diagnostic",
|
||||||
"sDiagCode": "Diagnostic code",
|
"sDiagCode": "Diagnostic code",
|
||||||
|
|
||||||
"mHeatEnabled": "Heating enabled",
|
"mHeatEnabled": "Heating enabled",
|
||||||
"mHeatBlocking": "Heating blocked",
|
"mHeatBlocking": "Heating blocked",
|
||||||
"mHeatOverheat": "Heating overheat",
|
"mHeatOverheat": "Heating overheat",
|
||||||
|
"mHeatFreezing": "Heating freezing",
|
||||||
"sHeatActive": "Heating active",
|
"sHeatActive": "Heating active",
|
||||||
"mHeatSetpointTemp": "Heating setpoint temp",
|
"mHeatSetpointTemp": "Heating setpoint temp",
|
||||||
"mHeatTargetTemp": "Heating target temp",
|
"mHeatTargetTemp": "Heating target temp",
|
||||||
@@ -126,7 +123,6 @@
|
|||||||
"mHeatRetTemp": "Heating return temp",
|
"mHeatRetTemp": "Heating return temp",
|
||||||
"mHeatIndoorTemp": "Heating, indoor temp",
|
"mHeatIndoorTemp": "Heating, indoor temp",
|
||||||
"mHeatOutdoorTemp": "Heating, outdoor temp",
|
"mHeatOutdoorTemp": "Heating, outdoor temp",
|
||||||
|
|
||||||
"mDhwEnabled": "DHW enabled",
|
"mDhwEnabled": "DHW enabled",
|
||||||
"mDhwOverheat": "DHW overheat",
|
"mDhwOverheat": "DHW overheat",
|
||||||
"sDhwActive": "DHW active",
|
"sDhwActive": "DHW active",
|
||||||
@@ -134,7 +130,6 @@
|
|||||||
"mDhwCurrTemp": "DHW current temp",
|
"mDhwCurrTemp": "DHW current temp",
|
||||||
"mDhwRetTemp": "DHW return temp"
|
"mDhwRetTemp": "DHW return temp"
|
||||||
},
|
},
|
||||||
|
|
||||||
"sensors": {
|
"sensors": {
|
||||||
"values": {
|
"values": {
|
||||||
"temp": "Temperature",
|
"temp": "Temperature",
|
||||||
@@ -144,23 +139,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"network": {
|
"network": {
|
||||||
"title": "Network - OpenTherm Gateway",
|
"title": "Network - OpenTherm Gateway",
|
||||||
"name": "Network settings",
|
"name": "Network settings",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"static": "Static settings",
|
"static": "Static settings",
|
||||||
"availableNetworks": "Available networks",
|
"availableNetworks": "Available networks",
|
||||||
"staSettings": "WiFi settings",
|
"staSettings": "WiFi settings",
|
||||||
"apSettings": "AP settings"
|
"apSettings": "AP settings"
|
||||||
},
|
},
|
||||||
|
|
||||||
"scan": {
|
"scan": {
|
||||||
"pos": "#",
|
"pos": "#",
|
||||||
"info": "Info"
|
"info": "Info"
|
||||||
},
|
},
|
||||||
|
|
||||||
"wifi": {
|
"wifi": {
|
||||||
"ssid": "SSID",
|
"ssid": "SSID",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
@@ -168,7 +159,6 @@
|
|||||||
"signal": "Signal",
|
"signal": "Signal",
|
||||||
"connected": "Connected"
|
"connected": "Connected"
|
||||||
},
|
},
|
||||||
|
|
||||||
"params": {
|
"params": {
|
||||||
"hostname": "Hostname",
|
"hostname": "Hostname",
|
||||||
"dhcp": "Use DHCP",
|
"dhcp": "Use DHCP",
|
||||||
@@ -178,16 +168,15 @@
|
|||||||
"gateway": "Gateway",
|
"gateway": "Gateway",
|
||||||
"dns": "DNS"
|
"dns": "DNS"
|
||||||
},
|
},
|
||||||
|
|
||||||
"sta": {
|
"sta": {
|
||||||
"channel.note": "set 0 for auto select"
|
"channel": {
|
||||||
|
"note": "set 0 for auto select"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"sensors": {
|
"sensors": {
|
||||||
"title": "Sensors settings - OpenTherm Gateway",
|
"title": "Sensors settings - OpenTherm Gateway",
|
||||||
"name": "Sensors settings",
|
"name": "Sensors settings",
|
||||||
|
|
||||||
"enabled": "Enabled",
|
"enabled": "Enabled",
|
||||||
"sensorName": {
|
"sensorName": {
|
||||||
"title": "Sensor name",
|
"title": "Sensor name",
|
||||||
@@ -244,10 +233,11 @@
|
|||||||
"otHeatingPumpHours": "OpenTherm, number of pump operating hours (heating)",
|
"otHeatingPumpHours": "OpenTherm, number of pump operating hours (heating)",
|
||||||
"otDhwPumpHours": "OpenTherm, number of pump operating hours (DHW)",
|
"otDhwPumpHours": "OpenTherm, number of pump operating hours (DHW)",
|
||||||
"otCoolingHours": "OpenTherm, number of cooling hours",
|
"otCoolingHours": "OpenTherm, number of cooling hours",
|
||||||
|
|
||||||
"ntcTemp": "NTC sensor",
|
"ntcTemp": "NTC sensor",
|
||||||
"dallasTemp": "DALLAS sensor",
|
"dallasTemp": "DALLAS sensor",
|
||||||
"bluetooth": "BLE sensor",
|
"bluetooth": "BLE sensor",
|
||||||
|
"dht11": "DHT11 sensor",
|
||||||
|
"dht22": "DHT22 sensor",
|
||||||
"heatSetpointTemp": "Heating, setpoint temp",
|
"heatSetpointTemp": "Heating, setpoint temp",
|
||||||
"manual": "Manual via MQTT/API",
|
"manual": "Manual via MQTT/API",
|
||||||
"notConfigured": "Not configured"
|
"notConfigured": "Not configured"
|
||||||
@@ -274,11 +264,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "Settings - OpenTherm Gateway",
|
"title": "Settings - OpenTherm Gateway",
|
||||||
"name": "Settings",
|
"name": "Settings",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"portal": "Portal settings",
|
"portal": "Portal settings",
|
||||||
"system": "System settings",
|
"system": "System settings",
|
||||||
@@ -293,18 +281,21 @@
|
|||||||
"extPump": "External pump settings",
|
"extPump": "External pump settings",
|
||||||
"cascadeControl": "Cascade control settings"
|
"cascadeControl": "Cascade control settings"
|
||||||
},
|
},
|
||||||
|
|
||||||
"enable": "Enable",
|
"enable": "Enable",
|
||||||
"note": {
|
"note": {
|
||||||
"restart": "After changing these settings, the device must be restarted for the changes to take effect.",
|
"restart": "After changing these settings, the device must be restarted for the changes to take effect.",
|
||||||
"blankNotUse": "blank - not use",
|
"blankNotUse": "blank - not use",
|
||||||
"bleDevice": "BLE device can be used <u>only</u> with some ESP32 boards with BLE support!"
|
"bleDevice": "BLE device can be used <u>only</u> with some ESP32 boards with BLE support!"
|
||||||
},
|
},
|
||||||
|
|
||||||
"temp": {
|
"temp": {
|
||||||
"min": "Minimum temperature",
|
"min": "Minimum temperature",
|
||||||
"max": "Maximum temperature"
|
"max": "Maximum temperature"
|
||||||
},
|
},
|
||||||
|
"avgType": {
|
||||||
|
"mean": "Mean temperature",
|
||||||
|
"min": "Minimum temperature",
|
||||||
|
"max": "Maximum temperature"
|
||||||
|
},
|
||||||
"maxModulation": "Max modulation level",
|
"maxModulation": "Max modulation level",
|
||||||
"ohProtection": {
|
"ohProtection": {
|
||||||
"title": "Overheating protection",
|
"title": "Overheating protection",
|
||||||
@@ -320,18 +311,22 @@
|
|||||||
},
|
},
|
||||||
"freezeProtection": {
|
"freezeProtection": {
|
||||||
"title": "Freeze protection",
|
"title": "Freeze protection",
|
||||||
"desc": "Heating will be forced to turn on if the heat carrier or indoor temperature drops below <b>Low temperature</b> during <b>Waiting time</b>.",
|
"desc": "Heating will be forced to turn on if the heat carrier or indoor temperature drops below <b>Low temperature</b>.",
|
||||||
"lowTemp": "Low temperature threshold",
|
"highTemp": {
|
||||||
"thresholdTime": "Waiting time <small>(sec)</small>"
|
"title": "High temperature threshold",
|
||||||
|
"note": "Threshold when the system returns to normal mode after freeze protection activation"
|
||||||
|
},
|
||||||
|
"lowTemp": {
|
||||||
|
"title": "Low temperature threshold",
|
||||||
|
"note": "Threshold when heating is forced to turn on"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"portal": {
|
"portal": {
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"auth": "Require authentication",
|
"auth": "Require authentication",
|
||||||
"mdns": "Use mDNS"
|
"mdns": "Use mDNS"
|
||||||
},
|
},
|
||||||
|
|
||||||
"system": {
|
"system": {
|
||||||
"unit": "Unit system",
|
"unit": "Unit system",
|
||||||
"metric": "Metric <small>(celsius, liters, bar)</small>",
|
"metric": "Metric <small>(celsius, liters, bar)</small>",
|
||||||
@@ -342,12 +337,8 @@
|
|||||||
"enable": "Enabled Serial port",
|
"enable": "Enabled Serial port",
|
||||||
"baud": "Serial port baud rate"
|
"baud": "Serial port baud rate"
|
||||||
},
|
},
|
||||||
"telnet": {
|
"webSerial": {
|
||||||
"enable": "Enabled Telnet",
|
"enable": "Enabled WebSerial"
|
||||||
"port": {
|
|
||||||
"title": "Telnet port",
|
|
||||||
"note": "Default: 23"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"ntp": {
|
"ntp": {
|
||||||
"server": "NTP server",
|
"server": "NTP server",
|
||||||
@@ -355,7 +346,6 @@
|
|||||||
"timezonePresets": "Select preset..."
|
"timezonePresets": "Select preset..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"heating": {
|
"heating": {
|
||||||
"hyst": {
|
"hyst": {
|
||||||
"title": "Hysteresis",
|
"title": "Hysteresis",
|
||||||
@@ -367,19 +357,24 @@
|
|||||||
"set0target": "Set null target"
|
"set0target": "Set null target"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"turboFactor": "Turbo mode coeff."
|
"turboFactor": "Turbo mode coeff.",
|
||||||
|
"indoorTempAvgType": {
|
||||||
|
"title": "Indoor temp. averaging type",
|
||||||
|
"desc": "May be useful when using two or more indoor temp. sensors (when using «Equitherm» and/or «PID»)."
|
||||||
|
},
|
||||||
|
"outdoorTempAvgType": {
|
||||||
|
"title": "Outdoor temp. averaging type",
|
||||||
|
"desc": "May be useful when using two or more outdoor temp. sensors (when using «Equitherm»)."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"emergency": {
|
"emergency": {
|
||||||
"desc": "Emergency mode is activated automatically when «PID» or «Equitherm» cannot calculate the heat carrier setpoint:<br />- if «Equitherm» is enabled and the outdoor temperature sensor is disconnected;<br />- if «PID» or OT option <i>«Native heating control»</i> is enabled and the indoor temperature sensor is disconnected.<br /><b>Note:</b> On network fault or MQTT fault, sensors with <i>«Manual via MQTT/API»</i> type will be in DISCONNECTED state.",
|
"desc": "Emergency mode is activated automatically when «PID» or «Equitherm» cannot calculate the heat carrier setpoint:<br />- if «Equitherm» is enabled and the outdoor temperature sensor is disconnected;<br />- if «PID» or OT option <i>«Native heating control»</i> is enabled and the indoor temperature sensor is disconnected.<br /><b>Note:</b> On network fault or MQTT fault, sensors with <i>«Manual via MQTT/API»</i> type will be in DISCONNECTED state.",
|
||||||
|
|
||||||
"target": {
|
"target": {
|
||||||
"title": "Target temperature",
|
"title": "Target temperature",
|
||||||
"note": "<b>Important:</b> <u>Target indoor temperature</u> if OT option <i>«Native heating control»</i> is enabled.<br />In all other cases, the <u>target heat carrier temperature</u>."
|
"note": "<b>Important:</b> <u>Target indoor temperature</u> if OT option <i>«Native heating control»</i> is enabled.<br />In all other cases, the <u>target heat carrier temperature</u>."
|
||||||
},
|
},
|
||||||
"treshold": "Treshold time <small>(sec)</small>"
|
"treshold": "Treshold time <small>(sec)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"equitherm": {
|
"equitherm": {
|
||||||
"slope": {
|
"slope": {
|
||||||
"title": "Slope",
|
"title": "Slope",
|
||||||
@@ -403,7 +398,6 @@
|
|||||||
"outdoorTemp": "Outdoor temperature"
|
"outdoorTemp": "Outdoor temperature"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"pid": {
|
"pid": {
|
||||||
"p": "P factor",
|
"p": "P factor",
|
||||||
"i": "I factor",
|
"i": "I factor",
|
||||||
@@ -423,7 +417,6 @@
|
|||||||
"thresholdLow": "Threshold low"
|
"thresholdLow": "Threshold low"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"ot": {
|
"ot": {
|
||||||
"advanced": "Advanced Settings",
|
"advanced": "Advanced Settings",
|
||||||
"inGpio": "In GPIO",
|
"inGpio": "In GPIO",
|
||||||
@@ -439,7 +432,6 @@
|
|||||||
"title": "Max boiler power <small>(kW)</small>",
|
"title": "Max boiler power <small>(kW)</small>",
|
||||||
"note": "<b>0</b> - try detect automatically. Typically found in the boiler specification as \"maximum useful heat output\"."
|
"note": "<b>0</b> - try detect automatically. Typically found in the boiler specification as \"maximum useful heat output\"."
|
||||||
},
|
},
|
||||||
|
|
||||||
"options": {
|
"options": {
|
||||||
"title": "Options (additional settings)",
|
"title": "Options (additional settings)",
|
||||||
"desc": "Options can change the logic of the boiler. Not all options are documented in the protocol, so the same option can have different effects on different boilers.<br /><b>Note:</b> There is no need to change anything if everything works well.",
|
"desc": "Options can change the logic of the boiler. Not all options are documented in the protocol, so the same option can have different effects on different boilers.<br /><b>Note:</b> There is no need to change anything if everything works well.",
|
||||||
@@ -461,13 +453,11 @@
|
|||||||
"immergasFix": "Fix for Immergas boilers",
|
"immergasFix": "Fix for Immergas boilers",
|
||||||
"alwaysSendIndoorTemp": "Send current indoor temp to boiler"
|
"alwaysSendIndoorTemp": "Send current indoor temp to boiler"
|
||||||
},
|
},
|
||||||
|
|
||||||
"nativeOTC": {
|
"nativeOTC": {
|
||||||
"title": "Native OTC mode",
|
"title": "Native OTC mode",
|
||||||
"note": "Works <u>ONLY</u> if the boiler is in OTC mode: requires and accepts the target indoor temperature and self-regulates the heat carrier temperature based on the built-in curves mode. Incompatible with PID and Equitherm."
|
"note": "Works <u>ONLY</u> if the boiler is in OTC mode: requires and accepts the target indoor temperature and self-regulates the heat carrier temperature based on the built-in curves mode. Incompatible with PID and Equitherm."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"mqtt": {
|
"mqtt": {
|
||||||
"homeAssistantDiscovery": "Home Assistant Discovery",
|
"homeAssistantDiscovery": "Home Assistant Discovery",
|
||||||
"server": "Server",
|
"server": "Server",
|
||||||
@@ -477,7 +467,6 @@
|
|||||||
"prefix": "Prefix",
|
"prefix": "Prefix",
|
||||||
"interval": "Publish interval <small>(sec)</small>"
|
"interval": "Publish interval <small>(sec)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"extPump": {
|
"extPump": {
|
||||||
"use": "Use external pump",
|
"use": "Use external pump",
|
||||||
"gpio": "Relay GPIO",
|
"gpio": "Relay GPIO",
|
||||||
@@ -486,7 +475,6 @@
|
|||||||
"antiStuckInterval": "Anti stuck interval <small>(days)</small>",
|
"antiStuckInterval": "Anti stuck interval <small>(days)</small>",
|
||||||
"antiStuckTime": "Anti stuck time <small>(min)</small>"
|
"antiStuckTime": "Anti stuck time <small>(min)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"cascadeControl": {
|
"cascadeControl": {
|
||||||
"input": {
|
"input": {
|
||||||
"desc": "Can be used to turn on the heating only if another boiler is faulty. The other boiler controller must change the state of the GPIO input in the event of a fault.",
|
"desc": "Can be used to turn on the heating only if another boiler is faulty. The other boiler controller must change the state of the GPIO input in the event of a fault.",
|
||||||
@@ -510,23 +498,23 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"upgrade": {
|
"upgrade": {
|
||||||
"title": "Upgrade - OpenTherm Gateway",
|
"title": "Upgrade - OpenTherm Gateway",
|
||||||
"name": "Upgrade",
|
"name": "Upgrade",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"backupAndRestore": "Backup & restore",
|
"backupAndRestore": {
|
||||||
"backupAndRestore.desc": "In this section you can save and restore a backup of ALL settings.",
|
"title": "Backup & restore",
|
||||||
"upgrade": "Upgrade",
|
"desc": "In this section you can save and restore a backup of ALL settings."
|
||||||
"upgrade.desc": "In this section you can upgrade the firmware and filesystem of your device.<br />Latest releases can be downloaded from the <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Releases page</a> of the project repository."
|
},
|
||||||
|
"upgrade": {
|
||||||
|
"title": "Upgrade",
|
||||||
|
"desc": "In this section you can upgrade the firmware and filesystem of your device.<br />Latest releases can be downloaded from the <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Releases page</a> of the project repository."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"note": {
|
"note": {
|
||||||
"disclaimer1": "After a successful upgrade the filesystem, ALL settings will be reset to default values! Save backup before upgrading.",
|
"disclaimer1": "After a successful upgrade the filesystem, ALL settings will be reset to default values! Save backup before upgrading.",
|
||||||
"disclaimer2": "After a successful upgrade, the device will automatically reboot after 15 seconds."
|
"disclaimer2": "After a successful upgrade, the device will automatically reboot after 15 seconds."
|
||||||
},
|
},
|
||||||
|
|
||||||
"settingsFile": "Settings file",
|
"settingsFile": "Settings file",
|
||||||
"fw": "Firmware",
|
"fw": "Firmware",
|
||||||
"fs": "Filesystem"
|
"fs": "Filesystem"
|
||||||
|
|||||||
+52
-64
@@ -8,15 +8,19 @@
|
|||||||
"issues": "Problemi e domande",
|
"issues": "Problemi e domande",
|
||||||
"releases": "Versione"
|
"releases": "Versione"
|
||||||
},
|
},
|
||||||
"dbm": "dBm",
|
"units": {
|
||||||
"kw": "kW",
|
|
||||||
"time": {
|
|
||||||
"days": "d.",
|
"days": "d.",
|
||||||
"hours": "h.",
|
"hours": "h.",
|
||||||
"min": "min.",
|
"min": "min.",
|
||||||
"sec": "sec."
|
"sec": "sec.",
|
||||||
|
"dbm": "dBm",
|
||||||
|
"mhz": "MHz",
|
||||||
|
"kw": "kW",
|
||||||
|
"rpm": "RPM",
|
||||||
|
"ppm": "ppm",
|
||||||
|
"byte": "byte",
|
||||||
|
"mbyte": "MB"
|
||||||
},
|
},
|
||||||
|
|
||||||
"button": {
|
"button": {
|
||||||
"upgrade": "Aggiorna",
|
"upgrade": "Aggiorna",
|
||||||
"restart": "Riavvia",
|
"restart": "Riavvia",
|
||||||
@@ -31,26 +35,25 @@
|
|||||||
"success": "Riuscito",
|
"success": "Riuscito",
|
||||||
"error": "Errore"
|
"error": "Errore"
|
||||||
},
|
},
|
||||||
|
|
||||||
"index": {
|
"index": {
|
||||||
"title": "OpenTherm Gateway",
|
"title": "OpenTherm Gateway",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"network": "Rete",
|
"network": "Rete",
|
||||||
"system": "Sistema"
|
"system": "Sistema"
|
||||||
},
|
},
|
||||||
|
|
||||||
"system": {
|
"system": {
|
||||||
"build": {
|
"build": {
|
||||||
"title": "Build",
|
"title": "Build",
|
||||||
"version": "Versione",
|
"version": "Versione",
|
||||||
|
"commit": "Commit",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"core": "Core",
|
"core": "Core",
|
||||||
"sdk": "SDK"
|
"sdk": "SDK"
|
||||||
},
|
},
|
||||||
"uptime": "Tempo di attività",
|
"uptime": "Tempo di attività",
|
||||||
"memory": {
|
"memory": {
|
||||||
"title": "Memoria libera",
|
"heap": "Memoria (heap)",
|
||||||
|
"psram": "Memoria (PSRAM)",
|
||||||
"maxFreeBlock": "max free block",
|
"maxFreeBlock": "max free block",
|
||||||
"min": "min"
|
"min": "min"
|
||||||
},
|
},
|
||||||
@@ -67,26 +70,22 @@
|
|||||||
"lastResetReason": "Motivo ultimo Reset"
|
"lastResetReason": "Motivo ultimo Reset"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"name": "Pannello",
|
"name": "Pannello",
|
||||||
"title": "Pannello - OpenTherm Gateway",
|
"title": "Pannello - OpenTherm Gateway",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"control": "Controlli",
|
"control": "Controlli",
|
||||||
"states": "Stato",
|
"states": "Stato",
|
||||||
"sensors": "Sensori",
|
"sensors": "Sensori",
|
||||||
"diag": "Diagnostica OpenTherm"
|
"diag": "Diagnostica OpenTherm"
|
||||||
},
|
},
|
||||||
|
|
||||||
"thermostat": {
|
"thermostat": {
|
||||||
"heating": "Riscaldamento",
|
"heating": "Riscaldamento",
|
||||||
"dhw": "ACS",
|
"dhw": "ACS",
|
||||||
"temp.current": "Attuale",
|
"currentTemp": "Attuale",
|
||||||
"enable": "Attiva",
|
"enable": "Attiva",
|
||||||
"turbo": "Turbo"
|
"turbo": "Turbo"
|
||||||
},
|
},
|
||||||
|
|
||||||
"notify": {
|
"notify": {
|
||||||
"fault": {
|
"fault": {
|
||||||
"title": "Rilevamento guasti caldiaia attivo!",
|
"title": "Rilevamento guasti caldiaia attivo!",
|
||||||
@@ -98,7 +97,6 @@
|
|||||||
},
|
},
|
||||||
"reset": "Prova a resettare"
|
"reset": "Prova a resettare"
|
||||||
},
|
},
|
||||||
|
|
||||||
"states": {
|
"states": {
|
||||||
"mNetworkConnected": "Connessione Rete",
|
"mNetworkConnected": "Connessione Rete",
|
||||||
"mMqttConnected": "Connessione MQTT",
|
"mMqttConnected": "Connessione MQTT",
|
||||||
@@ -106,7 +104,6 @@
|
|||||||
"mExtPumpState": "Pompa esterna",
|
"mExtPumpState": "Pompa esterna",
|
||||||
"mCascadeControlInput": "Controllo a cascata (input)",
|
"mCascadeControlInput": "Controllo a cascata (input)",
|
||||||
"mCascadeControlOutput": "Controllo a cascata (output)",
|
"mCascadeControlOutput": "Controllo a cascata (output)",
|
||||||
|
|
||||||
"sConnected": "Connessione OpenTherm",
|
"sConnected": "Connessione OpenTherm",
|
||||||
"sFlame": "Fiamma",
|
"sFlame": "Fiamma",
|
||||||
"sCoolingActive": "Raffrescamento",
|
"sCoolingActive": "Raffrescamento",
|
||||||
@@ -115,10 +112,10 @@
|
|||||||
"sFaultCode": "Codice anomalia",
|
"sFaultCode": "Codice anomalia",
|
||||||
"sDiagActive": "Diagnostica",
|
"sDiagActive": "Diagnostica",
|
||||||
"sDiagCode": "Codice Diagnostica",
|
"sDiagCode": "Codice Diagnostica",
|
||||||
|
|
||||||
"mHeatEnabled": "Riscaldamento attivato",
|
"mHeatEnabled": "Riscaldamento attivato",
|
||||||
"mHeatBlocking": "Riscaldamento bloccato",
|
"mHeatBlocking": "Riscaldamento bloccato",
|
||||||
"mHeatOverheat": "Riscaldamento surriscaldamento",
|
"mHeatOverheat": "Riscaldamento surriscaldamento",
|
||||||
|
"mHeatFreezing": "Protezione antigelo",
|
||||||
"sHeatActive": "Riscaldamento attivo",
|
"sHeatActive": "Riscaldamento attivo",
|
||||||
"mHeatSetpointTemp": "Temp riscaldamento impostato",
|
"mHeatSetpointTemp": "Temp riscaldamento impostato",
|
||||||
"mHeatTargetTemp": "Target Temp caldaia",
|
"mHeatTargetTemp": "Target Temp caldaia",
|
||||||
@@ -126,7 +123,6 @@
|
|||||||
"mHeatRetTemp": "Temp ritorno riscaldamento",
|
"mHeatRetTemp": "Temp ritorno riscaldamento",
|
||||||
"mHeatIndoorTemp": "Riscaldamento, temp interna",
|
"mHeatIndoorTemp": "Riscaldamento, temp interna",
|
||||||
"mHeatOutdoorTemp": "Riscaldamento, temp esterna",
|
"mHeatOutdoorTemp": "Riscaldamento, temp esterna",
|
||||||
|
|
||||||
"mDhwEnabled": "ACS attivata",
|
"mDhwEnabled": "ACS attivata",
|
||||||
"mDhwOverheat": "ACS surriscaldamento",
|
"mDhwOverheat": "ACS surriscaldamento",
|
||||||
"sDhwActive": "ACS attiva",
|
"sDhwActive": "ACS attiva",
|
||||||
@@ -134,7 +130,6 @@
|
|||||||
"mDhwCurrTemp": "ACS temp attuale",
|
"mDhwCurrTemp": "ACS temp attuale",
|
||||||
"mDhwRetTemp": "ACS temp ricircolo"
|
"mDhwRetTemp": "ACS temp ricircolo"
|
||||||
},
|
},
|
||||||
|
|
||||||
"sensors": {
|
"sensors": {
|
||||||
"values": {
|
"values": {
|
||||||
"temp": "Temperatura",
|
"temp": "Temperatura",
|
||||||
@@ -144,23 +139,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"network": {
|
"network": {
|
||||||
"title": "Rete - OpenTherm Gateway",
|
"title": "Rete - OpenTherm Gateway",
|
||||||
"name": "Impostazioni rete",
|
"name": "Impostazioni rete",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"static": "Impostazioni statico",
|
"static": "Impostazioni statico",
|
||||||
"availableNetworks": "Reti disponibili",
|
"availableNetworks": "Reti disponibili",
|
||||||
"staSettings": "Impostazioni WiFi",
|
"staSettings": "Impostazioni WiFi",
|
||||||
"apSettings": "Impostazioni AP"
|
"apSettings": "Impostazioni AP"
|
||||||
},
|
},
|
||||||
|
|
||||||
"scan": {
|
"scan": {
|
||||||
"pos": "#",
|
"pos": "#",
|
||||||
"info": "Info"
|
"info": "Info"
|
||||||
},
|
},
|
||||||
|
|
||||||
"wifi": {
|
"wifi": {
|
||||||
"ssid": "SSID",
|
"ssid": "SSID",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
@@ -168,7 +159,6 @@
|
|||||||
"signal": "Segnale",
|
"signal": "Segnale",
|
||||||
"connected": "Connesso"
|
"connected": "Connesso"
|
||||||
},
|
},
|
||||||
|
|
||||||
"params": {
|
"params": {
|
||||||
"hostname": "Hostname",
|
"hostname": "Hostname",
|
||||||
"dhcp": "Usa DHCP",
|
"dhcp": "Usa DHCP",
|
||||||
@@ -178,16 +168,15 @@
|
|||||||
"gateway": "Gateway",
|
"gateway": "Gateway",
|
||||||
"dns": "DNS"
|
"dns": "DNS"
|
||||||
},
|
},
|
||||||
|
|
||||||
"sta": {
|
"sta": {
|
||||||
"channel.note": "Metti 0 per auto selezione"
|
"channel": {
|
||||||
|
"note": "Metti 0 per auto selezione"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"sensors": {
|
"sensors": {
|
||||||
"title": "Impostazione sensori - OpenTherm Gateway",
|
"title": "Impostazione sensori - OpenTherm Gateway",
|
||||||
"name": "Impostazione sensori",
|
"name": "Impostazione sensori",
|
||||||
|
|
||||||
"enabled": "Attivato",
|
"enabled": "Attivato",
|
||||||
"sensorName": {
|
"sensorName": {
|
||||||
"title": "Nome sensore",
|
"title": "Nome sensore",
|
||||||
@@ -244,10 +233,11 @@
|
|||||||
"otHeatingPumpHours": "OpenTherm, numero di ore di funzionamento della pompa (riscaldamento)",
|
"otHeatingPumpHours": "OpenTherm, numero di ore di funzionamento della pompa (riscaldamento)",
|
||||||
"otDhwPumpHours": "OpenTherm, numero di ore di funzionamento della pompa (ACS)",
|
"otDhwPumpHours": "OpenTherm, numero di ore di funzionamento della pompa (ACS)",
|
||||||
"otCoolingHours": "OpenTherm, numero di ore di funzionamento della cooling",
|
"otCoolingHours": "OpenTherm, numero di ore di funzionamento della cooling",
|
||||||
|
|
||||||
"ntcTemp": "Sensore NTC",
|
"ntcTemp": "Sensore NTC",
|
||||||
"dallasTemp": "Sensore DALLAS",
|
"dallasTemp": "Sensore DALLAS",
|
||||||
"bluetooth": "Sensore BLE",
|
"bluetooth": "Sensore BLE",
|
||||||
|
"dht11": "Sensore DHT11",
|
||||||
|
"dht22": "Sensore DHT22",
|
||||||
"heatSetpointTemp": "Riscaldamento, temp impostata",
|
"heatSetpointTemp": "Riscaldamento, temp impostata",
|
||||||
"manual": "Manuale via MQTT/API",
|
"manual": "Manuale via MQTT/API",
|
||||||
"notConfigured": "Non configurato"
|
"notConfigured": "Non configurato"
|
||||||
@@ -274,11 +264,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "Impostazioni - OpenTherm Gateway",
|
"title": "Impostazioni - OpenTherm Gateway",
|
||||||
"name": "Impostazioni",
|
"name": "Impostazioni",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"portal": "Impostazioni Accesso",
|
"portal": "Impostazioni Accesso",
|
||||||
"system": "Impostazioni sistema",
|
"system": "Impostazioni sistema",
|
||||||
@@ -293,18 +281,21 @@
|
|||||||
"extPump": "Impostazioni pompa esterna",
|
"extPump": "Impostazioni pompa esterna",
|
||||||
"cascadeControl": "Impostazioni controllo a cascata"
|
"cascadeControl": "Impostazioni controllo a cascata"
|
||||||
},
|
},
|
||||||
|
|
||||||
"enable": "Attiva",
|
"enable": "Attiva",
|
||||||
"note": {
|
"note": {
|
||||||
"restart": "Dopo aver cambiato queste impostazioni, il sistema sarà riavviato perchè i cambiamenti abbiano effetto.",
|
"restart": "Dopo aver cambiato queste impostazioni, il sistema sarà riavviato perchè i cambiamenti abbiano effetto.",
|
||||||
"blankNotUse": "vuoto - non usare",
|
"blankNotUse": "vuoto - non usare",
|
||||||
"bleDevice": "Dispositivi BLE possono essere usati <u>solo</u> con alcune schede ESP32 che supportano il bluetooth!"
|
"bleDevice": "Dispositivi BLE possono essere usati <u>solo</u> con alcune schede ESP32 che supportano il bluetooth!"
|
||||||
},
|
},
|
||||||
|
|
||||||
"temp": {
|
"temp": {
|
||||||
"min": "Temperatura minima",
|
"min": "Temperatura minima",
|
||||||
"max": "Temperatura massima"
|
"max": "Temperatura massima"
|
||||||
},
|
},
|
||||||
|
"avgType": {
|
||||||
|
"mean": "Temperatura media",
|
||||||
|
"min": "Temperatura minima",
|
||||||
|
"max": "Temperatura massima"
|
||||||
|
},
|
||||||
"maxModulation": "Max livello modulazione",
|
"maxModulation": "Max livello modulazione",
|
||||||
"ohProtection": {
|
"ohProtection": {
|
||||||
"title": "Protezione contro il surriscaldamento",
|
"title": "Protezione contro il surriscaldamento",
|
||||||
@@ -320,18 +311,22 @@
|
|||||||
},
|
},
|
||||||
"freezeProtection": {
|
"freezeProtection": {
|
||||||
"title": "Protezione antigelo",
|
"title": "Protezione antigelo",
|
||||||
"desc": "Il riscaldamento verrà attivato forzatamente se la temperatura del vettore di calore o interna scende al di sotto della <b>temperatura minima</b> durante il <b>tempo di attesa</b>.",
|
"desc": "Il riscaldamento verrà forzatamente attivato se la temperatura del vettore termico o la temperatura interna scende al di sotto della <b>Soglia di temperatura bassa</b>.",
|
||||||
"lowTemp": "Soglia di temperatura minima",
|
"highTemp": {
|
||||||
"thresholdTime": "Tempo di attesa <small>(sec)</small>"
|
"title": "Soglia di temperatura alta",
|
||||||
|
"note": "Soglia quando il sistema ritorna alla modalità normale dopo l'attivazione della protezione antigelo"
|
||||||
|
},
|
||||||
|
"lowTemp": {
|
||||||
|
"title": "Soglia di temperatura bassa",
|
||||||
|
"note": "Soglia quando il riscaldamento viene forzatamente attivato"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"portal": {
|
"portal": {
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"auth": "Richiede autenticazione",
|
"auth": "Richiede autenticazione",
|
||||||
"mdns": "Usa mDNS"
|
"mdns": "Usa mDNS"
|
||||||
},
|
},
|
||||||
|
|
||||||
"system": {
|
"system": {
|
||||||
"unit": "Unità di misura",
|
"unit": "Unità di misura",
|
||||||
"metric": "Metrico <small>(celsius, litri, bar)</small>",
|
"metric": "Metrico <small>(celsius, litri, bar)</small>",
|
||||||
@@ -342,12 +337,8 @@
|
|||||||
"enable": "Porta seriale attivata",
|
"enable": "Porta seriale attivata",
|
||||||
"baud": "Porta seriale baud rate"
|
"baud": "Porta seriale baud rate"
|
||||||
},
|
},
|
||||||
"telnet": {
|
"webSerial": {
|
||||||
"enable": "Telnet attivato",
|
"enable": "WebSerial attivato"
|
||||||
"port": {
|
|
||||||
"title": "Porta Telnet",
|
|
||||||
"note": "Default: 23"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"ntp": {
|
"ntp": {
|
||||||
"server": "NTP server",
|
"server": "NTP server",
|
||||||
@@ -355,7 +346,6 @@
|
|||||||
"timezonePresets": "Seleziona preimpostato..."
|
"timezonePresets": "Seleziona preimpostato..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"heating": {
|
"heating": {
|
||||||
"hyst": {
|
"hyst": {
|
||||||
"title": "Isteresi",
|
"title": "Isteresi",
|
||||||
@@ -367,19 +357,24 @@
|
|||||||
"set0target": "Imposta target nullo"
|
"set0target": "Imposta target nullo"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"turboFactor": "Turbo mode coeff."
|
"turboFactor": "Turbo mode coeff.",
|
||||||
|
"indoorTempAvgType": {
|
||||||
|
"title": "Tipo di media temperatura interna",
|
||||||
|
"desc": "Utile con due o più sensori di temperatura interna (quando si usa «Equitherm» e/o «PID»)."
|
||||||
|
},
|
||||||
|
"outdoorTempAvgType": {
|
||||||
|
"title": "Tipo di media temperatura esterna",
|
||||||
|
"desc": "Utile con due o più sensori di temperatura esterna (quando si usa «Equitherm»)."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"emergency": {
|
"emergency": {
|
||||||
"desc": "Il modo emergenza è attivato automaticamente quando «PID» o «Equitherm» non possono calcolare il setpoint:<br />- se «Equitherm» è attivato e il sensore della temperatura esternare è disconnesso;<br />- se «PID» o l'opzione OT <i>«Impostazioni riscaldamento native»</i> è attiva e il sensore di temperatura interno è disconnesso.<br /><b>Nota:</b> In mancanza di rete o MQTT, sensore di tipo <i>«Manuale via MQTT/API»</i> è in stato Disconnesso.",
|
"desc": "Il modo emergenza è attivato automaticamente quando «PID» o «Equitherm» non possono calcolare il setpoint:<br />- se «Equitherm» è attivato e il sensore della temperatura esternare è disconnesso;<br />- se «PID» o l'opzione OT <i>«Impostazioni riscaldamento native»</i> è attiva e il sensore di temperatura interno è disconnesso.<br /><b>Nota:</b> In mancanza di rete o MQTT, sensore di tipo <i>«Manuale via MQTT/API»</i> è in stato Disconnesso.",
|
||||||
|
|
||||||
"target": {
|
"target": {
|
||||||
"title": "Temperatura impostata",
|
"title": "Temperatura impostata",
|
||||||
"note": "<b>Importante:</b> <u>Temperatura interna impostata</u> se l'opzione OT <i>«Controllo riscaldamento interno»</i> è attivato.<br />In tutti gli altri casi, la <u>target heat carrier temperature</u>."
|
"note": "<b>Importante:</b> <u>Temperatura interna impostata</u> se l'opzione OT <i>«Controllo riscaldamento interno»</i> è attivato.<br />In tutti gli altri casi, la <u>target heat carrier temperature</u>."
|
||||||
},
|
},
|
||||||
"treshold": "Tempo di soglia <small>(sec)</small>"
|
"treshold": "Tempo di soglia <small>(sec)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"equitherm": {
|
"equitherm": {
|
||||||
"slope": {
|
"slope": {
|
||||||
"title": "Pendenza",
|
"title": "Pendenza",
|
||||||
@@ -403,7 +398,6 @@
|
|||||||
"outdoorTemp": "Temperatura esterna"
|
"outdoorTemp": "Temperatura esterna"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"pid": {
|
"pid": {
|
||||||
"p": "Fattore P",
|
"p": "Fattore P",
|
||||||
"i": "Fattore I",
|
"i": "Fattore I",
|
||||||
@@ -423,7 +417,6 @@
|
|||||||
"thresholdLow": "Soglia inferiore"
|
"thresholdLow": "Soglia inferiore"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"ot": {
|
"ot": {
|
||||||
"advanced": "Impostazioni avanzate",
|
"advanced": "Impostazioni avanzate",
|
||||||
"inGpio": "In GPIO",
|
"inGpio": "In GPIO",
|
||||||
@@ -439,7 +432,6 @@
|
|||||||
"title": "Potenza massima caldaia <small>(kW)</small>",
|
"title": "Potenza massima caldaia <small>(kW)</small>",
|
||||||
"note": "<b>0</b> - prova a rilevarla automaticamente. Di solito si trova nelle specifiche delle caldaia come \"potenza massima disponibile\"."
|
"note": "<b>0</b> - prova a rilevarla automaticamente. Di solito si trova nelle specifiche delle caldaia come \"potenza massima disponibile\"."
|
||||||
},
|
},
|
||||||
|
|
||||||
"options": {
|
"options": {
|
||||||
"title": "Opzioni (impostazioni aggiuntive)",
|
"title": "Opzioni (impostazioni aggiuntive)",
|
||||||
"desc": "Le opzioni possono modificare la logica della caldaia. Non tutte le opzioni sono documentate nel protocollo, quindi la stessa opzione può avere effetti diversi su caldaie diverse.<br /><b>Nota:</b> Non è necessario modificare nulla se tutto funziona correttamente.",
|
"desc": "Le opzioni possono modificare la logica della caldaia. Non tutte le opzioni sono documentate nel protocollo, quindi la stessa opzione può avere effetti diversi su caldaie diverse.<br /><b>Nota:</b> Non è necessario modificare nulla se tutto funziona correttamente.",
|
||||||
@@ -461,13 +453,11 @@
|
|||||||
"immergasFix": "Fix per caldiaie Immergas",
|
"immergasFix": "Fix per caldiaie Immergas",
|
||||||
"alwaysSendIndoorTemp": "Invia la temp attuale interna alla caldaia"
|
"alwaysSendIndoorTemp": "Invia la temp attuale interna alla caldaia"
|
||||||
},
|
},
|
||||||
|
|
||||||
"nativeOTC": {
|
"nativeOTC": {
|
||||||
"title": "Modalità nativa di calcolo della temperatura del vettore termico",
|
"title": "Modalità nativa di calcolo della temperatura del vettore termico",
|
||||||
"note": "Funziona <u>SOLO</u> se la caldaia è in modalità OTC: richiede e accetta la temperatura interna target e regola autonomamente la temperatura del vettore termico basata sulla modalità curve integrata. Incompatibile con PID e Equitherm."
|
"note": "Funziona <u>SOLO</u> se la caldaia è in modalità OTC: richiede e accetta la temperatura interna target e regola autonomamente la temperatura del vettore termico basata sulla modalità curve integrata. Incompatibile con PID e Equitherm."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"mqtt": {
|
"mqtt": {
|
||||||
"homeAssistantDiscovery": "Home Assistant Discovery",
|
"homeAssistantDiscovery": "Home Assistant Discovery",
|
||||||
"server": "Server",
|
"server": "Server",
|
||||||
@@ -477,7 +467,6 @@
|
|||||||
"prefix": "Prefisso",
|
"prefix": "Prefisso",
|
||||||
"interval": "Intervallo invio <small>(sec)</small>"
|
"interval": "Intervallo invio <small>(sec)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"extPump": {
|
"extPump": {
|
||||||
"use": "Usa pompa/circolatore esterno",
|
"use": "Usa pompa/circolatore esterno",
|
||||||
"gpio": "GPIO relè",
|
"gpio": "GPIO relè",
|
||||||
@@ -486,7 +475,6 @@
|
|||||||
"antiStuckInterval": "Intervallo antiblocco <small>(days)</small>",
|
"antiStuckInterval": "Intervallo antiblocco <small>(days)</small>",
|
||||||
"antiStuckTime": "Tempo antiblocco <small>(min)</small>"
|
"antiStuckTime": "Tempo antiblocco <small>(min)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"cascadeControl": {
|
"cascadeControl": {
|
||||||
"input": {
|
"input": {
|
||||||
"desc": "Può essere attivata la caldaia se un'altra ha fallito. Il controllo dell'altra caldaia cambia lo stato dell'ingresso del GPIO in caso di errore.",
|
"desc": "Può essere attivata la caldaia se un'altra ha fallito. Il controllo dell'altra caldaia cambia lo stato dell'ingresso del GPIO in caso di errore.",
|
||||||
@@ -510,23 +498,23 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"upgrade": {
|
"upgrade": {
|
||||||
"title": "Aggiornamenti - OpenTherm Gateway",
|
"title": "Aggiornamenti - OpenTherm Gateway",
|
||||||
"name": "Aggiornamenti",
|
"name": "Aggiornamenti",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"backupAndRestore": "Backup & restore",
|
"backupAndRestore": {
|
||||||
"backupAndRestore.desc": "In questa sezione puoi salvare e recuperare un backup di tutte le impostazioni.",
|
"title": "Backup & restore",
|
||||||
"upgrade": "Aggiorna",
|
"desc": "In questa sezione puoi salvare e recuperare un backup di tutte le impostazioni."
|
||||||
"upgrade.desc": "In questa sezione puoi aggiornare il firmware il filesystem del tuo dispositivo.<br />L'ultimo aggiornamento può essere scaricato da <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Releases page</a> del progetto."
|
},
|
||||||
|
"upgrade": {
|
||||||
|
"title": "Aggiorna",
|
||||||
|
"desc": "In questa sezione puoi aggiornare il firmware il filesystem del tuo dispositivo.<br />L'ultimo aggiornamento può essere scaricato da <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Releases page</a> del progetto."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"note": {
|
"note": {
|
||||||
"disclaimer1": "Dopo un aggiornamento riuscito del filesystem, tutte le impostazioni sono impostate di default! Salva un backup prima di aggiornare.",
|
"disclaimer1": "Dopo un aggiornamento riuscito del filesystem, tutte le impostazioni sono impostate di default! Salva un backup prima di aggiornare.",
|
||||||
"disclaimer2": "Dopo un aggiornamento riuscito, il sistema viene automaticamente riavviato dopo 15 secondi."
|
"disclaimer2": "Dopo un aggiornamento riuscito, il sistema viene automaticamente riavviato dopo 15 secondi."
|
||||||
},
|
},
|
||||||
|
|
||||||
"settingsFile": "Settings file",
|
"settingsFile": "Settings file",
|
||||||
"fw": "Firmware",
|
"fw": "Firmware",
|
||||||
"fs": "Filesystem"
|
"fs": "Filesystem"
|
||||||
|
|||||||
+53
-24
@@ -8,13 +8,18 @@
|
|||||||
"issues": "Problemen & vragen",
|
"issues": "Problemen & vragen",
|
||||||
"releases": "Releases"
|
"releases": "Releases"
|
||||||
},
|
},
|
||||||
"dbm": "dBm",
|
"units": {
|
||||||
"kw": "kW",
|
|
||||||
"time": {
|
|
||||||
"days": "d.",
|
"days": "d.",
|
||||||
"hours": "u.",
|
"hours": "u.",
|
||||||
"min": "min.",
|
"min": "min.",
|
||||||
"sec": "sec."
|
"sec": "sec.",
|
||||||
|
"dbm": "dBm",
|
||||||
|
"mhz": "MHz",
|
||||||
|
"kw": "kW",
|
||||||
|
"rpm": "RPM",
|
||||||
|
"ppm": "ppm",
|
||||||
|
"byte": "byte",
|
||||||
|
"mbyte": "MB"
|
||||||
},
|
},
|
||||||
"button": {
|
"button": {
|
||||||
"upgrade": "Upgraden",
|
"upgrade": "Upgraden",
|
||||||
@@ -40,13 +45,15 @@
|
|||||||
"build": {
|
"build": {
|
||||||
"title": "Build",
|
"title": "Build",
|
||||||
"version": "Versie",
|
"version": "Versie",
|
||||||
|
"commit": "Commit",
|
||||||
"date": "Datum",
|
"date": "Datum",
|
||||||
"core": "Core",
|
"core": "Core",
|
||||||
"sdk": "SDK"
|
"sdk": "SDK"
|
||||||
},
|
},
|
||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"memory": {
|
"memory": {
|
||||||
"title": "Vrij geheugen",
|
"heap": "Geheugen (heap)",
|
||||||
|
"psram": "Geheugen (PSRAM)",
|
||||||
"maxFreeBlock": "max. vrij blok",
|
"maxFreeBlock": "max. vrij blok",
|
||||||
"min": "min"
|
"min": "min"
|
||||||
},
|
},
|
||||||
@@ -75,7 +82,7 @@
|
|||||||
"thermostat": {
|
"thermostat": {
|
||||||
"heating": "Verwarming",
|
"heating": "Verwarming",
|
||||||
"dhw": "Warm water",
|
"dhw": "Warm water",
|
||||||
"temp.current": "Huidig",
|
"currentTemp": "Huidig",
|
||||||
"enable": "Inschakelen",
|
"enable": "Inschakelen",
|
||||||
"turbo": "Turbomodus"
|
"turbo": "Turbomodus"
|
||||||
},
|
},
|
||||||
@@ -108,6 +115,7 @@
|
|||||||
"mHeatEnabled": "Verwarming ingeschakeld",
|
"mHeatEnabled": "Verwarming ingeschakeld",
|
||||||
"mHeatBlocking": "Verwarming geblokkeerd",
|
"mHeatBlocking": "Verwarming geblokkeerd",
|
||||||
"mHeatOverheat": "Verwarming oververhit",
|
"mHeatOverheat": "Verwarming oververhit",
|
||||||
|
"mHeatFreezing": "Verwarming vorstbescherming",
|
||||||
"sHeatActive": "Verwarming actief",
|
"sHeatActive": "Verwarming actief",
|
||||||
"mHeatSetpointTemp": "Insteltemperatuur verwarming",
|
"mHeatSetpointTemp": "Insteltemperatuur verwarming",
|
||||||
"mHeatTargetTemp": "Doeltemperatuur verwarming",
|
"mHeatTargetTemp": "Doeltemperatuur verwarming",
|
||||||
@@ -161,7 +169,9 @@
|
|||||||
"dns": "DNS"
|
"dns": "DNS"
|
||||||
},
|
},
|
||||||
"sta": {
|
"sta": {
|
||||||
"channel.note": "zet op 0 voor automatische selectie"
|
"channel": {
|
||||||
|
"note": "zet op 0 voor automatische selectie"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sensors": {
|
"sensors": {
|
||||||
@@ -223,10 +233,11 @@
|
|||||||
"otHeatingPumpHours": "OpenTherm, aantal pompuren (verwarming)",
|
"otHeatingPumpHours": "OpenTherm, aantal pompuren (verwarming)",
|
||||||
"otDhwPumpHours": "OpenTherm, aantal pompuren (warm water)",
|
"otDhwPumpHours": "OpenTherm, aantal pompuren (warm water)",
|
||||||
"otCoolingHours": "OpenTherm, aantal cooling",
|
"otCoolingHours": "OpenTherm, aantal cooling",
|
||||||
|
|
||||||
"ntcTemp": "NTC-sensor",
|
"ntcTemp": "NTC-sensor",
|
||||||
"dallasTemp": "DALLAS-sensor",
|
"dallasTemp": "DALLAS-sensor",
|
||||||
"bluetooth": "BLE-sensor",
|
"bluetooth": "BLE-sensor",
|
||||||
|
"dht11": "DHT11-sensor",
|
||||||
|
"dht22": "DHT22-sensor",
|
||||||
"heatSetpointTemp": "Verwarming, insteltemperatuur",
|
"heatSetpointTemp": "Verwarming, insteltemperatuur",
|
||||||
"manual": "Handmatig via MQTT/API",
|
"manual": "Handmatig via MQTT/API",
|
||||||
"notConfigured": "Niet geconfigureerd"
|
"notConfigured": "Niet geconfigureerd"
|
||||||
@@ -280,6 +291,11 @@
|
|||||||
"min": "Minimumtemperatuur",
|
"min": "Minimumtemperatuur",
|
||||||
"max": "Maximumtemperatuur"
|
"max": "Maximumtemperatuur"
|
||||||
},
|
},
|
||||||
|
"avgType": {
|
||||||
|
"mean": "Gemiddelde temperatuur",
|
||||||
|
"min": "Minimum temperatuur",
|
||||||
|
"max": "Maximum temperatuur"
|
||||||
|
},
|
||||||
"maxModulation": "Max. modulatieniveau",
|
"maxModulation": "Max. modulatieniveau",
|
||||||
"ohProtection": {
|
"ohProtection": {
|
||||||
"title": "Oververhittingsbeveiliging",
|
"title": "Oververhittingsbeveiliging",
|
||||||
@@ -294,10 +310,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"freezeProtection": {
|
"freezeProtection": {
|
||||||
"title": "Vorstbeveiliging",
|
"title": "Vorbeveiliging",
|
||||||
"desc": "De verwarming wordt geforceerd ingeschakeld als de temperatuur van de warmtedrager of de binnentemperatuur onder de <b>Lage temperatuur</b> daalt gedurende de <b>Wachttijd</b>.",
|
"desc": "Verwarming zal geforceerd worden ingeschakeld als de temperatuur van de warmtedrager of de binnentemperatuur daalt onder de <b>Lage temperatuurdrempel</b>.",
|
||||||
"lowTemp": "Drempelwaarde lage temperatuur",
|
"highTemp": {
|
||||||
"thresholdTime": "Wachttijd <small>(sec)</small>"
|
"title": "Hoge temperatuurdrempel",
|
||||||
|
"note": "Drempel waarna het systeem terugkeert naar de normale modus na activering van de vorbeveiliging"
|
||||||
|
},
|
||||||
|
"lowTemp": {
|
||||||
|
"title": "Lage temperatuurdrempel",
|
||||||
|
"note": "Drempel wanneer de verwarming geforceerd wordt ingeschakeld"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"portal": {
|
"portal": {
|
||||||
"login": "Gebruikersnaam",
|
"login": "Gebruikersnaam",
|
||||||
@@ -315,12 +337,8 @@
|
|||||||
"enable": "Seriële poort ingeschakeld",
|
"enable": "Seriële poort ingeschakeld",
|
||||||
"baud": "Baudrate seriële poort"
|
"baud": "Baudrate seriële poort"
|
||||||
},
|
},
|
||||||
"telnet": {
|
"webSerial": {
|
||||||
"enable": "Telnet ingeschakeld",
|
"enable": "WebSerial ingeschakeld"
|
||||||
"port": {
|
|
||||||
"title": "Telnet-poort",
|
|
||||||
"note": "Standaard: 23"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"ntp": {
|
"ntp": {
|
||||||
"server": "NTP-server",
|
"server": "NTP-server",
|
||||||
@@ -339,7 +357,15 @@
|
|||||||
"set0target": "Stel null target in"
|
"set0target": "Stel null target in"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"turboFactor": "Turbomodus coëff."
|
"turboFactor": "Turbomodus coëff.",
|
||||||
|
"indoorTempAvgType": {
|
||||||
|
"title": "Binnentemperatuur gemiddelde type",
|
||||||
|
"desc": "Nuttig bij twee of meer binnentemperatuursensoren (bij gebruik van «Equitherm» en/of «PID»)."
|
||||||
|
},
|
||||||
|
"outdoorTempAvgType": {
|
||||||
|
"title": "Buitentemperatuur gemiddelde type",
|
||||||
|
"desc": "Nuttig bij twee of meer buitensensoren (bij gebruik van «Equitherm»)."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"emergency": {
|
"emergency": {
|
||||||
"desc": "Noodmodus wordt automatisch geactiveerd wanneer «PID» of «Equitherm» het instelpunt van de warmtedrager niet kan berekenen:<br />- als «Equitherm» is ingeschakeld en de buitentemperatuursensor is losgekoppeld;<br />- als «PID» of OT-optie <i>«Natuurlijke verwarmingsregeling»</i> is ingeschakeld en de binnentemperatuursensor is losgekoppeld.<br /><b>Let op:</b> Bij een netwerk- of MQTT-storing krijgen sensoren van het type <i>«Handmatig via MQTT/API»</i> de status ONVERBONDEN.",
|
"desc": "Noodmodus wordt automatisch geactiveerd wanneer «PID» of «Equitherm» het instelpunt van de warmtedrager niet kan berekenen:<br />- als «Equitherm» is ingeschakeld en de buitentemperatuursensor is losgekoppeld;<br />- als «PID» of OT-optie <i>«Natuurlijke verwarmingsregeling»</i> is ingeschakeld en de binnentemperatuursensor is losgekoppeld.<br /><b>Let op:</b> Bij een netwerk- of MQTT-storing krijgen sensoren van het type <i>«Handmatig via MQTT/API»</i> de status ONVERBONDEN.",
|
||||||
@@ -427,7 +453,6 @@
|
|||||||
"immergasFix": "Fix voor Immergas-ketels",
|
"immergasFix": "Fix voor Immergas-ketels",
|
||||||
"alwaysSendIndoorTemp": "Stuur huidige binnentemp naar ketel"
|
"alwaysSendIndoorTemp": "Stuur huidige binnentemp naar ketel"
|
||||||
},
|
},
|
||||||
|
|
||||||
"nativeOTC": {
|
"nativeOTC": {
|
||||||
"title": "Native warmtedrager temperatuur berekeningsmodus",
|
"title": "Native warmtedrager temperatuur berekeningsmodus",
|
||||||
"note": "Werkt <u>ALLEEN</u> als de ketel in OTC-modus is: vereist en accepteert de doel binnentemperatuur en regelt zelf de warmtedrager temperatuur op basis van de ingebouwde curves modus. Incompatibel met PID en Equitherm."
|
"note": "Werkt <u>ALLEEN</u> als de ketel in OTC-modus is: vereist en accepteert de doel binnentemperatuur en regelt zelf de warmtedrager temperatuur op basis van de ingebouwde curves modus. Incompatibel met PID en Equitherm."
|
||||||
@@ -477,10 +502,14 @@
|
|||||||
"title": "Upgrade - OpenTherm Gateway",
|
"title": "Upgrade - OpenTherm Gateway",
|
||||||
"name": "Upgrade",
|
"name": "Upgrade",
|
||||||
"section": {
|
"section": {
|
||||||
"backupAndRestore": "Back-up & herstel",
|
"backupAndRestore": {
|
||||||
"backupAndRestore.desc": "In deze sectie kunt u een back-up van ALLE instellingen opslaan en herstellen.",
|
"title": "Back-up & herstel",
|
||||||
"upgrade": "Upgrade",
|
"desc": "In deze sectie kunt u een back-up van ALLE instellingen opslaan en herstellen."
|
||||||
"upgrade.desc": "In deze sectie kunt u de firmware en het bestandssysteem van uw apparaat upgraden.<br />De nieuwste releases kunnen worden gedownload van de <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Releases-pagina</a> van de projectrepository."
|
},
|
||||||
|
"upgrade": {
|
||||||
|
"title": "Upgrade",
|
||||||
|
"desc": "In deze sectie kunt u de firmware en het bestandssysteem van uw apparaat upgraden.<br />De nieuwste releases kunnen worden gedownload van de <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Releases-pagina</a> van de projectrepository."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"note": {
|
"note": {
|
||||||
"disclaimer1": "Na een succesvolle upgrade van het bestandssysteem worden ALLE instellingen teruggezet naar de standaardwaarden! Sla een back-up op voordat u gaat upgraden.",
|
"disclaimer1": "Na een succesvolle upgrade van het bestandssysteem worden ALLE instellingen teruggezet naar de standaardwaarden! Sla een back-up op voordat u gaat upgraden.",
|
||||||
|
|||||||
+52
-64
@@ -8,15 +8,19 @@
|
|||||||
"issues": "Проблемы и вопросы",
|
"issues": "Проблемы и вопросы",
|
||||||
"releases": "Релизы"
|
"releases": "Релизы"
|
||||||
},
|
},
|
||||||
"dbm": "дБм",
|
"units": {
|
||||||
"kw": "кВт",
|
|
||||||
"time": {
|
|
||||||
"days": "д.",
|
"days": "д.",
|
||||||
"hours": "ч.",
|
"hours": "ч.",
|
||||||
"min": "мин.",
|
"min": "мин.",
|
||||||
"sec": "сек."
|
"sec": "сек.",
|
||||||
|
"dbm": "дБм",
|
||||||
|
"mhz": "МГц",
|
||||||
|
"kw": "кВт",
|
||||||
|
"rpm": "RPM",
|
||||||
|
"ppm": "ppm",
|
||||||
|
"byte": "байт",
|
||||||
|
"mbyte": "мбайт"
|
||||||
},
|
},
|
||||||
|
|
||||||
"button": {
|
"button": {
|
||||||
"upgrade": "Обновить",
|
"upgrade": "Обновить",
|
||||||
"restart": "Перезагрузка",
|
"restart": "Перезагрузка",
|
||||||
@@ -31,26 +35,25 @@
|
|||||||
"success": "Успешно",
|
"success": "Успешно",
|
||||||
"error": "Ошибка"
|
"error": "Ошибка"
|
||||||
},
|
},
|
||||||
|
|
||||||
"index": {
|
"index": {
|
||||||
"title": "OpenTherm Gateway",
|
"title": "OpenTherm Gateway",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"network": "Сеть",
|
"network": "Сеть",
|
||||||
"system": "Система"
|
"system": "Система"
|
||||||
},
|
},
|
||||||
|
|
||||||
"system": {
|
"system": {
|
||||||
"build": {
|
"build": {
|
||||||
"title": "Билд",
|
"title": "Билд",
|
||||||
"version": "Версия",
|
"version": "Версия",
|
||||||
|
"commit": "Коммит",
|
||||||
"date": "Дата",
|
"date": "Дата",
|
||||||
"core": "Ядро",
|
"core": "Ядро",
|
||||||
"sdk": "SDK"
|
"sdk": "SDK"
|
||||||
},
|
},
|
||||||
"uptime": "Аптайм",
|
"uptime": "Аптайм",
|
||||||
"memory": {
|
"memory": {
|
||||||
"title": "ОЗУ",
|
"heap": "Память (heap)",
|
||||||
|
"psram": "Память (PSRAM)",
|
||||||
"maxFreeBlock": "макс. блок",
|
"maxFreeBlock": "макс. блок",
|
||||||
"min": "мин."
|
"min": "мин."
|
||||||
},
|
},
|
||||||
@@ -67,26 +70,22 @@
|
|||||||
"lastResetReason": "Причина перезагрузки"
|
"lastResetReason": "Причина перезагрузки"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"dashboard": {
|
"dashboard": {
|
||||||
"name": "Дашборд",
|
"name": "Дашборд",
|
||||||
"title": "Дашборд - OpenTherm Gateway",
|
"title": "Дашборд - OpenTherm Gateway",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"control": "Управление",
|
"control": "Управление",
|
||||||
"states": "Состояние",
|
"states": "Состояние",
|
||||||
"sensors": "Сенсоры",
|
"sensors": "Сенсоры",
|
||||||
"diag": "Диагностика OpenTherm"
|
"diag": "Диагностика OpenTherm"
|
||||||
},
|
},
|
||||||
|
|
||||||
"thermostat": {
|
"thermostat": {
|
||||||
"heating": "Отопление",
|
"heating": "Отопление",
|
||||||
"dhw": "ГВС",
|
"dhw": "ГВС",
|
||||||
"temp.current": "Текущая",
|
"currentTemp": "Текущая",
|
||||||
"enable": "Вкл",
|
"enable": "Вкл",
|
||||||
"turbo": "Турбо"
|
"turbo": "Турбо"
|
||||||
},
|
},
|
||||||
|
|
||||||
"notify": {
|
"notify": {
|
||||||
"fault": {
|
"fault": {
|
||||||
"title": "Состояние неисправности котла активно!",
|
"title": "Состояние неисправности котла активно!",
|
||||||
@@ -98,7 +97,6 @@
|
|||||||
},
|
},
|
||||||
"reset": "Сбросить"
|
"reset": "Сбросить"
|
||||||
},
|
},
|
||||||
|
|
||||||
"states": {
|
"states": {
|
||||||
"mNetworkConnected": "Подключение к сети",
|
"mNetworkConnected": "Подключение к сети",
|
||||||
"mMqttConnected": "Подключение к MQTT",
|
"mMqttConnected": "Подключение к MQTT",
|
||||||
@@ -106,7 +104,6 @@
|
|||||||
"mExtPumpState": "Внешний насос",
|
"mExtPumpState": "Внешний насос",
|
||||||
"mCascadeControlInput": "Каскадное управление (вход)",
|
"mCascadeControlInput": "Каскадное управление (вход)",
|
||||||
"mCascadeControlOutput": "Каскадное управление (выход)",
|
"mCascadeControlOutput": "Каскадное управление (выход)",
|
||||||
|
|
||||||
"sConnected": "Подключение к OpenTherm",
|
"sConnected": "Подключение к OpenTherm",
|
||||||
"sFlame": "Пламя",
|
"sFlame": "Пламя",
|
||||||
"sCoolingActive": "Охлаждение",
|
"sCoolingActive": "Охлаждение",
|
||||||
@@ -115,10 +112,10 @@
|
|||||||
"sFaultCode": "Код ошибки",
|
"sFaultCode": "Код ошибки",
|
||||||
"sDiagActive": "Диагностика",
|
"sDiagActive": "Диагностика",
|
||||||
"sDiagCode": "Диагностический код",
|
"sDiagCode": "Диагностический код",
|
||||||
|
|
||||||
"mHeatEnabled": "Отопление",
|
"mHeatEnabled": "Отопление",
|
||||||
"mHeatBlocking": "Блокировка отопления",
|
"mHeatBlocking": "Блокировка отопления",
|
||||||
"mHeatOverheat": "Отопление, перегрев",
|
"mHeatOverheat": "Отопление, перегрев",
|
||||||
|
"mHeatFreezing": "Отопление, защита от замерзания",
|
||||||
"sHeatActive": "Активность отопления",
|
"sHeatActive": "Активность отопления",
|
||||||
"mHeatSetpointTemp": "Отопление, уставка",
|
"mHeatSetpointTemp": "Отопление, уставка",
|
||||||
"mHeatTargetTemp": "Отопление, целевая температура",
|
"mHeatTargetTemp": "Отопление, целевая температура",
|
||||||
@@ -126,7 +123,6 @@
|
|||||||
"mHeatRetTemp": "Отопление, температура обратки",
|
"mHeatRetTemp": "Отопление, температура обратки",
|
||||||
"mHeatIndoorTemp": "Отопление, внутренняя темп.",
|
"mHeatIndoorTemp": "Отопление, внутренняя темп.",
|
||||||
"mHeatOutdoorTemp": "Отопление, наружная темп.",
|
"mHeatOutdoorTemp": "Отопление, наружная темп.",
|
||||||
|
|
||||||
"mDhwEnabled": "ГВС",
|
"mDhwEnabled": "ГВС",
|
||||||
"mDhwOverheat": "ГВС, перегрев",
|
"mDhwOverheat": "ГВС, перегрев",
|
||||||
"sDhwActive": "Активность ГВС",
|
"sDhwActive": "Активность ГВС",
|
||||||
@@ -134,7 +130,6 @@
|
|||||||
"mDhwCurrTemp": "ГВС, текущая температура",
|
"mDhwCurrTemp": "ГВС, текущая температура",
|
||||||
"mDhwRetTemp": "ГВС, температура обратки"
|
"mDhwRetTemp": "ГВС, температура обратки"
|
||||||
},
|
},
|
||||||
|
|
||||||
"sensors": {
|
"sensors": {
|
||||||
"values": {
|
"values": {
|
||||||
"temp": "Температура",
|
"temp": "Температура",
|
||||||
@@ -144,23 +139,19 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"network": {
|
"network": {
|
||||||
"title": "Сеть - OpenTherm Gateway",
|
"title": "Сеть - OpenTherm Gateway",
|
||||||
"name": "Настройки сети",
|
"name": "Настройки сети",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"static": "Статические параметры",
|
"static": "Статические параметры",
|
||||||
"availableNetworks": "Доступные сети",
|
"availableNetworks": "Доступные сети",
|
||||||
"staSettings": "Настройки подключения",
|
"staSettings": "Настройки подключения",
|
||||||
"apSettings": "Настройки точки доступа"
|
"apSettings": "Настройки точки доступа"
|
||||||
},
|
},
|
||||||
|
|
||||||
"scan": {
|
"scan": {
|
||||||
"pos": "#",
|
"pos": "#",
|
||||||
"info": "Инфо"
|
"info": "Инфо"
|
||||||
},
|
},
|
||||||
|
|
||||||
"wifi": {
|
"wifi": {
|
||||||
"ssid": "Имя сети",
|
"ssid": "Имя сети",
|
||||||
"password": "Пароль",
|
"password": "Пароль",
|
||||||
@@ -168,7 +159,6 @@
|
|||||||
"signal": "Сигнал",
|
"signal": "Сигнал",
|
||||||
"connected": "Подключено"
|
"connected": "Подключено"
|
||||||
},
|
},
|
||||||
|
|
||||||
"params": {
|
"params": {
|
||||||
"hostname": "Имя хоста",
|
"hostname": "Имя хоста",
|
||||||
"dhcp": "Использовать DHCP",
|
"dhcp": "Использовать DHCP",
|
||||||
@@ -178,16 +168,15 @@
|
|||||||
"gateway": "Адрес шлюза",
|
"gateway": "Адрес шлюза",
|
||||||
"dns": "DNS адрес"
|
"dns": "DNS адрес"
|
||||||
},
|
},
|
||||||
|
|
||||||
"sta": {
|
"sta": {
|
||||||
"channel.note": "установите 0 для автоматического выбора"
|
"channel": {
|
||||||
|
"note": "установите 0 для автоматического выбора"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"sensors": {
|
"sensors": {
|
||||||
"title": "Настройки сенсоров - OpenTherm Gateway",
|
"title": "Настройки сенсоров - OpenTherm Gateway",
|
||||||
"name": "Настройки сенсоров",
|
"name": "Настройки сенсоров",
|
||||||
|
|
||||||
"enabled": "Включить и использовать",
|
"enabled": "Включить и использовать",
|
||||||
"sensorName": {
|
"sensorName": {
|
||||||
"title": "Имя сенсора",
|
"title": "Имя сенсора",
|
||||||
@@ -244,10 +233,11 @@
|
|||||||
"otHeatingPumpHours": "OpenTherm, кол-во часов работы насоса (отопление)",
|
"otHeatingPumpHours": "OpenTherm, кол-во часов работы насоса (отопление)",
|
||||||
"otDhwPumpHours": "OpenTherm, кол-во часов работы насоса (ГВС)",
|
"otDhwPumpHours": "OpenTherm, кол-во часов работы насоса (ГВС)",
|
||||||
"otCoolingHours": "OpenTherm, кол-во часов работы охлаждения",
|
"otCoolingHours": "OpenTherm, кол-во часов работы охлаждения",
|
||||||
|
|
||||||
"ntcTemp": "NTC датчик",
|
"ntcTemp": "NTC датчик",
|
||||||
"dallasTemp": "DALLAS датчик",
|
"dallasTemp": "DALLAS датчик",
|
||||||
"bluetooth": "BLE датчик",
|
"bluetooth": "BLE датчик",
|
||||||
|
"dht11": "DHT11 датчик",
|
||||||
|
"dht22": "DHT22 датчик",
|
||||||
"heatSetpointTemp": "Отопление, температура уставки",
|
"heatSetpointTemp": "Отопление, температура уставки",
|
||||||
"manual": "Вручную через MQTT/API",
|
"manual": "Вручную через MQTT/API",
|
||||||
"notConfigured": "Не сконфигурировано"
|
"notConfigured": "Не сконфигурировано"
|
||||||
@@ -274,11 +264,9 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"settings": {
|
"settings": {
|
||||||
"title": "Настройки - OpenTherm Gateway",
|
"title": "Настройки - OpenTherm Gateway",
|
||||||
"name": "Настройки",
|
"name": "Настройки",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"portal": "Настройки портала",
|
"portal": "Настройки портала",
|
||||||
"system": "Системные настройки",
|
"system": "Системные настройки",
|
||||||
@@ -293,18 +281,21 @@
|
|||||||
"extPump": "Настройки дополнительного насоса",
|
"extPump": "Настройки дополнительного насоса",
|
||||||
"cascadeControl": "Настройки каскадного управления"
|
"cascadeControl": "Настройки каскадного управления"
|
||||||
},
|
},
|
||||||
|
|
||||||
"enable": "Вкл",
|
"enable": "Вкл",
|
||||||
"note": {
|
"note": {
|
||||||
"restart": "После изменения этих настроек устройство необходимо перезагрузить, чтобы изменения вступили в силу.",
|
"restart": "После изменения этих настроек устройство необходимо перезагрузить, чтобы изменения вступили в силу.",
|
||||||
"blankNotUse": "пусто - не использовать",
|
"blankNotUse": "пусто - не использовать",
|
||||||
"bleDevice": "BLE устройство можно использовать <u>только</u> с некоторыми платами ESP32, которые поддерживают BLE!"
|
"bleDevice": "BLE устройство можно использовать <u>только</u> с некоторыми платами ESP32, которые поддерживают BLE!"
|
||||||
},
|
},
|
||||||
|
|
||||||
"temp": {
|
"temp": {
|
||||||
"min": "Мин. температура",
|
"min": "Мин. температура",
|
||||||
"max": "Макс. температура"
|
"max": "Макс. температура"
|
||||||
},
|
},
|
||||||
|
"avgType": {
|
||||||
|
"mean": "Средняя температура",
|
||||||
|
"min": "Минимальная температура",
|
||||||
|
"max": "Максимальная температура"
|
||||||
|
},
|
||||||
"maxModulation": "Макс. уровень модуляции",
|
"maxModulation": "Макс. уровень модуляции",
|
||||||
"ohProtection": {
|
"ohProtection": {
|
||||||
"title": "Защита от перегрева",
|
"title": "Защита от перегрева",
|
||||||
@@ -320,18 +311,22 @@
|
|||||||
},
|
},
|
||||||
"freezeProtection": {
|
"freezeProtection": {
|
||||||
"title": "Защита от замерзания",
|
"title": "Защита от замерзания",
|
||||||
"desc": "Отопление будет принудительно включено, если темп. теплоносителя или внутренняя темп. опустится ниже <b>нижнего порога</b> в течение <b>времени ожидания</b>.",
|
"desc": "Отопление будет принудительно включено, если темп. теплоносителя или внутренняя темп. опустится ниже <b>нижнего порога</b>.",
|
||||||
"lowTemp": "Нижний порог температуры",
|
"highTemp": {
|
||||||
"thresholdTime": "Время ожидания <small>(сек)</small>"
|
"title": "Верхний порог температуры",
|
||||||
|
"note": "Порог, при котором система вернется в нормальное состояние после активации защиты от замерзания"
|
||||||
|
},
|
||||||
|
"lowTemp": {
|
||||||
|
"title": "Нижний порог температуры",
|
||||||
|
"note": "Порог, при котором отопление будет принудительно включено"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"portal": {
|
"portal": {
|
||||||
"login": "Логин",
|
"login": "Логин",
|
||||||
"password": "Пароль",
|
"password": "Пароль",
|
||||||
"auth": "Требовать аутентификацию",
|
"auth": "Требовать аутентификацию",
|
||||||
"mdns": "Использовать mDNS"
|
"mdns": "Использовать mDNS"
|
||||||
},
|
},
|
||||||
|
|
||||||
"system": {
|
"system": {
|
||||||
"unit": "Система единиц",
|
"unit": "Система единиц",
|
||||||
"metric": "Метрическая <small>(цельсии, литры, бары)</small>",
|
"metric": "Метрическая <small>(цельсии, литры, бары)</small>",
|
||||||
@@ -342,12 +337,8 @@
|
|||||||
"enable": "Вкл. Serial порт",
|
"enable": "Вкл. Serial порт",
|
||||||
"baud": "Скорость Serial порта"
|
"baud": "Скорость Serial порта"
|
||||||
},
|
},
|
||||||
"telnet": {
|
"webSerial": {
|
||||||
"enable": "Вкл. Telnet",
|
"enable": "Вкл. WebSerial"
|
||||||
"port": {
|
|
||||||
"title": "Telnet порт",
|
|
||||||
"note": "По умолчанию: 23"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"ntp": {
|
"ntp": {
|
||||||
"server": "NTP сервер",
|
"server": "NTP сервер",
|
||||||
@@ -355,7 +346,6 @@
|
|||||||
"timezonePresets": "Выберите пресет..."
|
"timezonePresets": "Выберите пресет..."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"heating": {
|
"heating": {
|
||||||
"hyst": {
|
"hyst": {
|
||||||
"title": "Гистерезис",
|
"title": "Гистерезис",
|
||||||
@@ -367,19 +357,24 @@
|
|||||||
"set0target": "Установить 0 в качестве целевой темп."
|
"set0target": "Установить 0 в качестве целевой темп."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"turboFactor": "Коэфф. турбо режима"
|
"turboFactor": "Коэфф. турбо режима",
|
||||||
|
"indoorTempAvgType": {
|
||||||
|
"title": "Тип усреднения внутренней темп.",
|
||||||
|
"desc": "Полезно при использовании двух и более датчиков внутренней температуры (при использовании «Equitherm» и/или «PID»)."
|
||||||
|
},
|
||||||
|
"outdoorTempAvgType": {
|
||||||
|
"title": "Тип усреднения наружнной темп.",
|
||||||
|
"desc": "Полезно при использовании двух и более датчиков наружной температуры (при использовании «Equitherm»)."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"emergency": {
|
"emergency": {
|
||||||
"desc": "Аварийный режим активируется автоматически, если «ПИД» или «ПЗА» не могут рассчитать уставку теплоносителя:<br />- если «ПЗА» включен и датчик наружной температуры отключен;<br />- если включен «ПИД» или OT опция <i>«Передать управление отоплением котлу»</i> и датчик внутренней температуры отключен.<br /><b>Примечание:</b> При сбое сети или MQTT датчики с типом <i>«Вручную через MQTT/API»</i> будут находиться в состоянии ОТКЛЮЧЕН.",
|
"desc": "Аварийный режим активируется автоматически, если «ПИД» или «ПЗА» не могут рассчитать уставку теплоносителя:<br />- если «ПЗА» включен и датчик наружной температуры отключен;<br />- если включен «ПИД» или OT опция <i>«Передать управление отоплением котлу»</i> и датчик внутренней температуры отключен.<br /><b>Примечание:</b> При сбое сети или MQTT датчики с типом <i>«Вручную через MQTT/API»</i> будут находиться в состоянии ОТКЛЮЧЕН.",
|
||||||
|
|
||||||
"target": {
|
"target": {
|
||||||
"title": "Целевая температура",
|
"title": "Целевая температура",
|
||||||
"note": "<b>Важно:</b> <u>Целевая температура в помещении</u>, если включена ОТ опция <i>«Передать управление отоплением котлу»</i>.<br />Во всех остальных случаях <u>целевая температура теплоносителя</u>."
|
"note": "<b>Важно:</b> <u>Целевая температура в помещении</u>, если включена ОТ опция <i>«Передать управление отоплением котлу»</i>.<br />Во всех остальных случаях <u>целевая температура теплоносителя</u>."
|
||||||
},
|
},
|
||||||
"treshold": "Пороговое время включения <small>(сек)</small>"
|
"treshold": "Пороговое время включения <small>(сек)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"equitherm": {
|
"equitherm": {
|
||||||
"slope": {
|
"slope": {
|
||||||
"title": "Наклон",
|
"title": "Наклон",
|
||||||
@@ -403,7 +398,6 @@
|
|||||||
"outdoorTemp": "Наружная температура"
|
"outdoorTemp": "Наружная температура"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"pid": {
|
"pid": {
|
||||||
"p": "Коэффициент P",
|
"p": "Коэффициент P",
|
||||||
"i": "Коэффициент I",
|
"i": "Коэффициент I",
|
||||||
@@ -423,7 +417,6 @@
|
|||||||
"thresholdLow": "Нижний порог"
|
"thresholdLow": "Нижний порог"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"ot": {
|
"ot": {
|
||||||
"advanced": "Дополнительные настройки",
|
"advanced": "Дополнительные настройки",
|
||||||
"inGpio": "Вход GPIO",
|
"inGpio": "Вход GPIO",
|
||||||
@@ -439,7 +432,6 @@
|
|||||||
"title": "Макс. мощность котла <small>(кВт)</small>",
|
"title": "Макс. мощность котла <small>(кВт)</small>",
|
||||||
"note": "<b>0</b> - попробовать определить автоматически. Обычно можно найти в спецификации котла как \"максимальная полезная тепловая мощность\"."
|
"note": "<b>0</b> - попробовать определить автоматически. Обычно можно найти в спецификации котла как \"максимальная полезная тепловая мощность\"."
|
||||||
},
|
},
|
||||||
|
|
||||||
"options": {
|
"options": {
|
||||||
"title": "Опции (дополнительные настройки)",
|
"title": "Опции (дополнительные настройки)",
|
||||||
"desc": "Опции могут менять логику работы котла. Не все опции задокументированы в протоколе, поэтому одна и та же опция может иметь разный эффект на разных котлах.<br /><b>Примечание:</b> Нет необходимости что-то менять, если всё работает хорошо.",
|
"desc": "Опции могут менять логику работы котла. Не все опции задокументированы в протоколе, поэтому одна и та же опция может иметь разный эффект на разных котлах.<br /><b>Примечание:</b> Нет необходимости что-то менять, если всё работает хорошо.",
|
||||||
@@ -461,13 +453,11 @@
|
|||||||
"immergasFix": "Фикс для котлов Immergas",
|
"immergasFix": "Фикс для котлов Immergas",
|
||||||
"alwaysSendIndoorTemp": "Передавать текущую темп. в помещении котлу"
|
"alwaysSendIndoorTemp": "Передавать текущую темп. в помещении котлу"
|
||||||
},
|
},
|
||||||
|
|
||||||
"nativeOTC": {
|
"nativeOTC": {
|
||||||
"title": "Нативный режим OTC (расчёт температуры теплоносителя)",
|
"title": "Нативный режим OTC (расчёт температуры теплоносителя)",
|
||||||
"note": "Работает <u>ТОЛЬКО</u> если котел в режиме OTC: требует и принимает целевую температуру в помещении и сам регулирует температуру теплоносителя на основе встроенного режима кривых. Несовместимо с ПИД и ПЗА."
|
"note": "Работает <u>ТОЛЬКО</u> если котел в режиме OTC: требует и принимает целевую температуру в помещении и сам регулирует температуру теплоносителя на основе встроенного режима кривых. Несовместимо с ПИД и ПЗА."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"mqtt": {
|
"mqtt": {
|
||||||
"homeAssistantDiscovery": "Home Assistant Discovery",
|
"homeAssistantDiscovery": "Home Assistant Discovery",
|
||||||
"server": "Адрес сервера",
|
"server": "Адрес сервера",
|
||||||
@@ -477,7 +467,6 @@
|
|||||||
"prefix": "Префикс",
|
"prefix": "Префикс",
|
||||||
"interval": "Интервал публикации <small>(сек)</small>"
|
"interval": "Интервал публикации <small>(сек)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"extPump": {
|
"extPump": {
|
||||||
"use": "Использовать доп. насос",
|
"use": "Использовать доп. насос",
|
||||||
"gpio": "GPIO реле",
|
"gpio": "GPIO реле",
|
||||||
@@ -486,7 +475,6 @@
|
|||||||
"antiStuckInterval": "Интервал защиты от блокировки <small>(в днях)</small>",
|
"antiStuckInterval": "Интервал защиты от блокировки <small>(в днях)</small>",
|
||||||
"antiStuckTime": "Время работы насоса <small>(в минутах)</small>"
|
"antiStuckTime": "Время работы насоса <small>(в минутах)</small>"
|
||||||
},
|
},
|
||||||
|
|
||||||
"cascadeControl": {
|
"cascadeControl": {
|
||||||
"input": {
|
"input": {
|
||||||
"desc": "Может использоваться для включения отопления только при неисправности другого котла. Контроллер другого котла должен изменить состояние входа GPIO в случае неисправности.",
|
"desc": "Может использоваться для включения отопления только при неисправности другого котла. Контроллер другого котла должен изменить состояние входа GPIO в случае неисправности.",
|
||||||
@@ -510,23 +498,23 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"upgrade": {
|
"upgrade": {
|
||||||
"title": "Обновление - OpenTherm Gateway",
|
"title": "Обновление - OpenTherm Gateway",
|
||||||
"name": "Обновление",
|
"name": "Обновление",
|
||||||
|
|
||||||
"section": {
|
"section": {
|
||||||
"backupAndRestore": "Резервное копирование и восстановление",
|
"backupAndRestore": {
|
||||||
"backupAndRestore.desc": "В этом разделе вы можете сохранить и восстановить резервную копию ВСЕХ настроек.",
|
"title": "Резервное копирование и восстановление",
|
||||||
"upgrade": "Обновление",
|
"desc": "В этом разделе вы можете сохранить и восстановить резервную копию ВСЕХ настроек."
|
||||||
"upgrade.desc": "В этом разделе вы можете обновить прошивку и файловую систему вашего устройства.<br />Последнюю версию можно загрузить со страницы <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Релизы</a> в репозитории проекта."
|
},
|
||||||
|
"upgrade": {
|
||||||
|
"title": "Обновление",
|
||||||
|
"desc": "В этом разделе вы можете обновить прошивку и файловую систему вашего устройства.<br />Последнюю версию можно загрузить со страницы <a href=\"https://github.com/Laxilef/OTGateway/releases\" target=\"_blank\">Релизы</a> в репозитории проекта."
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"note": {
|
"note": {
|
||||||
"disclaimer1": "После успешного обновления файловой системы ВСЕ настройки будут сброшены на стандартные! Создайте резервную копию ПЕРЕД обновлением.",
|
"disclaimer1": "После успешного обновления файловой системы ВСЕ настройки будут сброшены на стандартные! Создайте резервную копию ПЕРЕД обновлением.",
|
||||||
"disclaimer2": "После успешного обновления устройство автоматически перезагрузится через 15 секунд."
|
"disclaimer2": "После успешного обновления устройство автоматически перезагрузится через 15 секунд."
|
||||||
},
|
},
|
||||||
|
|
||||||
"settingsFile": "Файл настроек",
|
"settingsFile": "Файл настроек",
|
||||||
"fw": "Прошивка",
|
"fw": "Прошивка",
|
||||||
"fs": "Файловая система"
|
"fs": "Файловая система"
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
<div class="thermostat-header" data-i18n>dashboard.thermostat.heating</div>
|
<div class="thermostat-header" data-i18n>dashboard.thermostat.heating</div>
|
||||||
<div class="thermostat-temp">
|
<div class="thermostat-temp">
|
||||||
<div class="thermostat-temp-target"><span class="targetTemp"></span> <span class="tempUnit"></span></div>
|
<div class="thermostat-temp-target"><span class="targetTemp"></span> <span class="tempUnit"></span></div>
|
||||||
<div class="thermostat-temp-current"><span data-i18n>dashboard.thermostat.temp.current</span>: <span id="tHeatCurrentTemp"></span> <span class="tempUnit"></span></div>
|
<div class="thermostat-temp-current"><span data-i18n>dashboard.thermostat.currentTemp</span>: <span id="tHeatCurrentTemp"></span> <span class="tempUnit"></span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="thermostat-minus">
|
<div class="thermostat-minus">
|
||||||
<button class="tAction outline" data-action="decrement"><i class="icons-down"></i></button>
|
<button class="tAction outline" data-action="decrement"><i class="icons-down"></i></button>
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
<div class="thermostat-header" data-i18n>dashboard.thermostat.dhw</div>
|
<div class="thermostat-header" data-i18n>dashboard.thermostat.dhw</div>
|
||||||
<div class="thermostat-temp">
|
<div class="thermostat-temp">
|
||||||
<div class="thermostat-temp-target"><span class="targetTemp"></span> <span class="tempUnit"></span></div>
|
<div class="thermostat-temp-target"><span class="targetTemp"></span> <span class="tempUnit"></span></div>
|
||||||
<div class="thermostat-temp-current"><span data-i18n>dashboard.thermostat.temp.current</span>: <span id="tDhwCurrentTemp"></span> <span class="tempUnit"></span></div>
|
<div class="thermostat-temp-current"><span data-i18n>dashboard.thermostat.currentTemp</span>: <span id="tDhwCurrentTemp"></span> <span class="tempUnit"></span></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="thermostat-minus">
|
<div class="thermostat-minus">
|
||||||
<button class="tAction outline" data-action="decrement"><i class="icons-down"></i></button>
|
<button class="tAction outline" data-action="decrement"><i class="icons-down"></i></button>
|
||||||
@@ -195,6 +195,10 @@
|
|||||||
<th scope="row" data-i18n>dashboard.states.mHeatOverheat</th>
|
<th scope="row" data-i18n>dashboard.states.mHeatOverheat</th>
|
||||||
<td><i class="mHeatOverheat"></i></td>
|
<td><i class="mHeatOverheat"></i></td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row" data-i18n>dashboard.states.mHeatFreezing</th>
|
||||||
|
<td><i class="mHeatFreezing"></i></td>
|
||||||
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row" data-i18n>dashboard.states.sHeatActive</th>
|
<th scope="row" data-i18n>dashboard.states.sHeatActive</th>
|
||||||
<td><i class="sHeatActive"></i></td>
|
<td><i class="sHeatActive"></i></td>
|
||||||
@@ -320,7 +324,7 @@
|
|||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', async () => {
|
document.addEventListener('DOMContentLoaded', async () => {
|
||||||
const lang = new Lang(document.getElementById('lang'));
|
const lang = new Lang(document.getElementById('lang'));
|
||||||
lang.build();
|
await lang.build();
|
||||||
|
|
||||||
let actionTimer = null;
|
let actionTimer = null;
|
||||||
let actionLongPress = false;
|
let actionLongPress = false;
|
||||||
@@ -491,6 +495,9 @@
|
|||||||
if (modified) {
|
if (modified) {
|
||||||
parameters.method = "POST";
|
parameters.method = "POST";
|
||||||
parameters.body = JSON.stringify(newSettings);
|
parameters.body = JSON.stringify(newSettings);
|
||||||
|
parameters.headers = {
|
||||||
|
"Content-Type": "application/json"
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await fetch("/api/settings", parameters);
|
const response = await fetch("/api/settings", parameters);
|
||||||
@@ -633,6 +640,11 @@
|
|||||||
result.master.heating.overheat ? "success" : "error",
|
result.master.heating.overheat ? "success" : "error",
|
||||||
result.master.heating.overheat ? "red" : "green"
|
result.master.heating.overheat ? "red" : "green"
|
||||||
);
|
);
|
||||||
|
setStatus(
|
||||||
|
'.mHeatFreezing',
|
||||||
|
result.master.heating.freezing ? "success" : "error",
|
||||||
|
result.master.heating.freezing ? "red" : "green"
|
||||||
|
);
|
||||||
setValue('.mHeatSetpointTemp', result.master.heating.setpointTemp);
|
setValue('.mHeatSetpointTemp', result.master.heating.setpointTemp);
|
||||||
setValue('.mHeatTargetTemp', result.master.heating.targetTemp);
|
setValue('.mHeatTargetTemp', result.master.heating.targetTemp);
|
||||||
setValue('.mHeatCurrTemp', result.master.heating.currentTemp);
|
setValue('.mHeatCurrTemp', result.master.heating.currentTemp);
|
||||||
@@ -757,7 +769,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (sData.rssi !== undefined) {
|
if (sData.rssi !== undefined) {
|
||||||
appendValue(".sValue", `${i18n('dashboard.sensors.values.rssi')}: <b>${sData.rssi.toFixed(0)}</b> ${i18n('dbm')}`, `<br />`, sensorNode);
|
appendValue(".sValue", `${i18n('dashboard.sensors.values.rssi')}: <b>${sData.rssi.toFixed(0)}</b> ${i18n('units.dbm')}`, `<br />`, sensorNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+24
-10
@@ -104,6 +104,7 @@
|
|||||||
<th scope="row" data-i18n>index.system.build.title</th>
|
<th scope="row" data-i18n>index.system.build.title</th>
|
||||||
<td>
|
<td>
|
||||||
Env: <b id="build-env"></b><br />
|
Env: <b id="build-env"></b><br />
|
||||||
|
<span data-i18n>index.system.build.commit</span>: <b id="build-commit"></b><br />
|
||||||
<span data-i18n>index.system.build.date</span>: <b id="build-date"></b><br />
|
<span data-i18n>index.system.build.date</span>: <b id="build-date"></b><br />
|
||||||
<span data-i18n>index.system.build.core</span>: <b id="build-core"></b><br />
|
<span data-i18n>index.system.build.core</span>: <b id="build-core"></b><br />
|
||||||
<span data-i18n>index.system.build.sdk</span>: <b id="build-sdk"></b>
|
<span data-i18n>index.system.build.sdk</span>: <b id="build-sdk"></b>
|
||||||
@@ -112,25 +113,32 @@
|
|||||||
<tr>
|
<tr>
|
||||||
<th scope="row" data-i18n>index.system.uptime</th>
|
<th scope="row" data-i18n>index.system.uptime</th>
|
||||||
<td>
|
<td>
|
||||||
<b id="uptime-days"></b> <span data-i18n>time.days</span>,
|
<b id="uptime-days"></b> <span data-i18n>units.days</span>,
|
||||||
<b id="uptime-hours"></b> <span data-i18n>time.hours</span>,
|
<b id="uptime-hours"></b> <span data-i18n>units.hours</span>,
|
||||||
<b id="uptime-min"></b> <span data-i18n>time.min</span>,
|
<b id="uptime-min"></b> <span data-i18n>units.min</span>,
|
||||||
<b id="uptime-sec"></b> <span data-i18n>time.sec</span>
|
<b id="uptime-sec"></b> <span data-i18n>units.sec</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row" data-i18n>index.system.memory.title</th>
|
<th scope="row" data-i18n>index.system.memory.heap</th>
|
||||||
<td>
|
<td>
|
||||||
<b id="heap-free"></b> of <b id="heap-total"></b> bytes (<span data-i18n>index.system.memory.min</span>: <b id="heap-min-free"></b> bytes)<br />
|
<b id="heap-free"></b> of <b id="heap-total"></b> <span data-i18n>units.byte</span> (<span data-i18n>index.system.memory.min</span>: <b id="heap-min-free"></b> <span data-i18n>units.byte</span>)<br />
|
||||||
<span data-i18n>index.system.memory.maxFreeBlock</span>: <b id="heap-max-free-block"></b> bytes (<span data-i18n>index.system.memory.min</span>: <b id="heap-min-max-free-block"></b> bytes)
|
<span data-i18n>index.system.memory.maxFreeBlock</span>: <b id="heap-max-free-block"></b> <span data-i18n>units.byte</span> (<span data-i18n>index.system.memory.min</span>: <b id="heap-min-max-free-block"></b> <span data-i18n>units.byte</span>)
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row" data-i18n>index.system.memory.psram</th>
|
||||||
|
<td>
|
||||||
|
<b id="psram-free"></b> of <b id="psram-total"></b> <span data-i18n>units.byte</span> (<span data-i18n>index.system.memory.min</span>: <b id="psram-min-free"></b> <span data-i18n>units.byte</span>)<br />
|
||||||
|
<span data-i18n>index.system.memory.maxFreeBlock</span>: <b id="psram-max-free-block"></b> <span data-i18n>units.byte</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<th scope="row" data-i18n>index.system.board</th>
|
<th scope="row" data-i18n>index.system.board</th>
|
||||||
<td>
|
<td>
|
||||||
<span data-i18n>index.system.chip.model</span>: <b id="chip-model"></b> (rev. <span id="chip-rev"></span>)<br />
|
<span data-i18n>index.system.chip.model</span>: <b id="chip-model"></b> (rev. <span id="chip-rev"></span>)<br />
|
||||||
<span data-i18n>index.system.chip.cores</span>: <b id="chip-cores"></b>, <span data-i18n>index.system.chip.freq</span>: <b id="chip-freq"></b> mHz<br />
|
<span data-i18n>index.system.chip.cores</span>: <b id="chip-cores"></b>, <span data-i18n>index.system.chip.freq</span>: <b id="chip-freq"></b> <span data-i18n>units.mhz</span><br />
|
||||||
<span data-i18n>index.system.flash.size</span>: <b id="flash-size"></b> MB (<span data-i18n>index.system.flash.realSize</span>: <b id="flash-real-size"></b> MB)
|
<span data-i18n>index.system.flash.size</span>: <b id="flash-size"></b> <span data-i18n>units.mbyte</span> (<span data-i18n>index.system.flash.realSize</span>: <b id="flash-real-size"></b> <span data-i18n>units.mbyte</span>)
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -169,7 +177,7 @@
|
|||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', async () => {
|
document.addEventListener('DOMContentLoaded', async () => {
|
||||||
const lang = new Lang(document.getElementById('lang'));
|
const lang = new Lang(document.getElementById('lang'));
|
||||||
lang.build();
|
await lang.build();
|
||||||
|
|
||||||
setTimeout(async function onLoadPage() {
|
setTimeout(async function onLoadPage() {
|
||||||
try {
|
try {
|
||||||
@@ -206,6 +214,7 @@
|
|||||||
setBusy('#main-busy', '#main-table', false);
|
setBusy('#main-busy', '#main-table', false);
|
||||||
|
|
||||||
setValue('#build-version', result.build.version);
|
setValue('#build-version', result.build.version);
|
||||||
|
setValue('#build-commit', result.build.commit);
|
||||||
setValue('#build-date', result.build.date);
|
setValue('#build-date', result.build.date);
|
||||||
setValue('#build-env', result.build.env);
|
setValue('#build-env', result.build.env);
|
||||||
setValue('#build-core', result.build.core);
|
setValue('#build-core', result.build.core);
|
||||||
@@ -217,6 +226,11 @@
|
|||||||
setValue('#heap-max-free-block', result.heap.maxFreeBlock);
|
setValue('#heap-max-free-block', result.heap.maxFreeBlock);
|
||||||
setValue('#heap-min-max-free-block', result.heap.minMaxFreeBlock);
|
setValue('#heap-min-max-free-block', result.heap.minMaxFreeBlock);
|
||||||
|
|
||||||
|
setValue('#psram-total', result.psram.total);
|
||||||
|
setValue('#psram-free', result.psram.free);
|
||||||
|
setValue('#psram-min-free', result.psram.minFree);
|
||||||
|
setValue('#psram-max-free-block', result.psram.maxFreeBlock);
|
||||||
|
|
||||||
setValue('#chip-model', result.chip.model);
|
setValue('#chip-model', result.chip.model);
|
||||||
setValue('#chip-rev', result.chip.rev);
|
setValue('#chip-rev', result.chip.rev);
|
||||||
setValue('#chip-cores', result.chip.cores);
|
setValue('#chip-cores', result.chip.cores);
|
||||||
|
|||||||
@@ -179,7 +179,7 @@
|
|||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', async () => {
|
document.addEventListener('DOMContentLoaded', async () => {
|
||||||
const lang = new Lang(document.getElementById('lang'));
|
const lang = new Lang(document.getElementById('lang'));
|
||||||
lang.build();
|
await lang.build();
|
||||||
|
|
||||||
const fillData = (data) => {
|
const fillData = (data) => {
|
||||||
setInputValue("[name='hostname']", data.hostname);
|
setInputValue("[name='hostname']", data.hostname);
|
||||||
|
|||||||
@@ -118,6 +118,8 @@
|
|||||||
<option value="50" data-i18n>sensors.types.ntcTemp</option>
|
<option value="50" data-i18n>sensors.types.ntcTemp</option>
|
||||||
<option value="51" data-i18n>sensors.types.dallasTemp</option>
|
<option value="51" data-i18n>sensors.types.dallasTemp</option>
|
||||||
<option value="52" data-i18n>sensors.types.bluetooth</option>
|
<option value="52" data-i18n>sensors.types.bluetooth</option>
|
||||||
|
<option value="53" data-i18n>sensors.types.dht11</option>
|
||||||
|
<option value="54" data-i18n>sensors.types.dht22</option>
|
||||||
<option value="253" data-i18n>sensors.types.heatSetpointTemp</option>
|
<option value="253" data-i18n>sensors.types.heatSetpointTemp</option>
|
||||||
<option value="254" data-i18n>sensors.types.manual</option>
|
<option value="254" data-i18n>sensors.types.manual</option>
|
||||||
<option value="255" data-i18n>sensors.types.notConfigured</option>
|
<option value="255" data-i18n>sensors.types.notConfigured</option>
|
||||||
@@ -201,7 +203,7 @@
|
|||||||
<script>
|
<script>
|
||||||
document.addEventListener("DOMContentLoaded", async () => {
|
document.addEventListener("DOMContentLoaded", async () => {
|
||||||
const lang = new Lang(document.getElementById("lang"));
|
const lang = new Lang(document.getElementById("lang"));
|
||||||
lang.build();
|
await lang.build();
|
||||||
|
|
||||||
const container = document.querySelector("article");
|
const container = document.querySelector("article");
|
||||||
const templateNode = container.querySelector("#template");
|
const templateNode = container.querySelector("#template");
|
||||||
@@ -271,27 +273,35 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch(parseInt(event.target.value)) {
|
switch(parseInt(event.target.value)) {
|
||||||
// ntc
|
// NTC10K
|
||||||
case 50:
|
case 50:
|
||||||
parentGpio.classList.remove("hidden");
|
parentGpio.classList.remove("hidden");
|
||||||
parentAddress.classList.add("hidden");
|
parentAddress.classList.add("hidden");
|
||||||
address.removeAttribute("pattern");
|
address.removeAttribute("pattern");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// dallas
|
// OneWire
|
||||||
case 51:
|
case 51:
|
||||||
parentGpio.classList.remove("hidden");
|
parentGpio.classList.remove("hidden");
|
||||||
parentAddress.classList.remove("hidden");
|
parentAddress.classList.remove("hidden");
|
||||||
address.setAttribute("pattern", "([A-Fa-f0-9]{2}:){7}[A-Fa-f0-9]{2}");
|
address.setAttribute("pattern", "([A-Fa-f0-9]{2}:){7}[A-Fa-f0-9]{2}");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// ble
|
// Bluetooth
|
||||||
case 52:
|
case 52:
|
||||||
parentGpio.classList.add("hidden");
|
parentGpio.classList.add("hidden");
|
||||||
parentAddress.classList.remove("hidden");
|
parentAddress.classList.remove("hidden");
|
||||||
address.setAttribute("pattern", "([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}");
|
address.setAttribute("pattern", "([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
// DHT
|
||||||
|
case 53:
|
||||||
|
case 54:
|
||||||
|
parentGpio.classList.remove("hidden");
|
||||||
|
parentAddress.classList.add("hidden");
|
||||||
|
address.removeAttribute("pattern");
|
||||||
|
break;
|
||||||
|
|
||||||
// other
|
// other
|
||||||
default:
|
default:
|
||||||
parentGpio.classList.add("hidden");
|
parentGpio.classList.add("hidden");
|
||||||
|
|||||||
@@ -126,8 +126,8 @@
|
|||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" name="system[telnet][enabled]" value="true">
|
<input type="checkbox" name="system[webSerial][enabled]" value="true">
|
||||||
<span data-i18n>settings.system.telnet.enable</span>
|
<span data-i18n>settings.system.webSerial.enable</span>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label>
|
<label>
|
||||||
@@ -156,12 +156,6 @@
|
|||||||
<option value="115200">115200</option>
|
<option value="115200">115200</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label>
|
|
||||||
<span data-i18n>settings.system.telnet.port.title</span>
|
|
||||||
<input type="number" inputmode="numeric" name="system[telnet][port]" min="1" max="65535" step="1" required>
|
|
||||||
<small data-i18n>settings.system.telnet.port.note</small>
|
|
||||||
</label>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<mark data-i18n>settings.note.restart</mark>
|
<mark data-i18n>settings.note.restart</mark>
|
||||||
@@ -204,6 +198,28 @@
|
|||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="grid">
|
||||||
|
<label>
|
||||||
|
<span data-i18n>settings.heating.indoorTempAvgType.title</span>
|
||||||
|
<select name="heating[indoorTempAvgType]">
|
||||||
|
<option value="0" data-i18n>settings.avgType.mean</option>
|
||||||
|
<option value="1" data-i18n>settings.avgType.min</option>
|
||||||
|
<option value="2" data-i18n>settings.avgType.max</option>
|
||||||
|
</select>
|
||||||
|
<small data-i18n>settings.heating.indoorTempAvgType.desc</small>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<span data-i18n>settings.heating.outdoorTempAvgType.title</span>
|
||||||
|
<select name="heating[outdoorTempAvgType]">
|
||||||
|
<option value="0" data-i18n>settings.avgType.mean</option>
|
||||||
|
<option value="1" data-i18n>settings.avgType.min</option>
|
||||||
|
<option value="2" data-i18n>settings.avgType.max</option>
|
||||||
|
</select>
|
||||||
|
<small data-i18n>settings.heating.outdoorTempAvgType.desc</small>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
@@ -265,13 +281,15 @@
|
|||||||
|
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
<label>
|
<label>
|
||||||
<span data-i18n>settings.freezeProtection.lowTemp</span>
|
<span data-i18n>settings.freezeProtection.highTemp.title</span>
|
||||||
<input type="number" inputmode="numeric" name="heating[freezeProtection][lowTemp]" min="0" max="0" step="1" required>
|
<input type="number" inputmode="numeric" name="heating[freezeProtection][highTemp]" min="0" max="0" step="1" required>
|
||||||
|
<small data-i18n>settings.freezeProtection.highTemp.note</small>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label>
|
<label>
|
||||||
<span data-i18n>settings.freezeProtection.thresholdTime</span>
|
<span data-i18n>settings.freezeProtection.lowTemp.title</span>
|
||||||
<input type="number" inputmode="numeric" name="heating[freezeProtection][thresholdTime]" min="30" max="1800" step="1" required>
|
<input type="number" inputmode="numeric" name="heating[freezeProtection][lowTemp]" min="0" max="0" step="1" required>
|
||||||
|
<small data-i18n>settings.freezeProtection.lowTemp.note</small>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -925,7 +943,7 @@
|
|||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', async () => {
|
document.addEventListener('DOMContentLoaded', async () => {
|
||||||
const lang = new Lang(document.getElementById('lang'));
|
const lang = new Lang(document.getElementById('lang'));
|
||||||
lang.build();
|
await lang.build();
|
||||||
|
|
||||||
let etChart = null;
|
let etChart = null;
|
||||||
let etChartConfig = {
|
let etChartConfig = {
|
||||||
@@ -1083,8 +1101,7 @@
|
|||||||
setSelectValue("[name='system[logLevel]']", data.system.logLevel);
|
setSelectValue("[name='system[logLevel]']", data.system.logLevel);
|
||||||
setCheckboxValue("[name='system[serial][enabled]']", data.system.serial.enabled);
|
setCheckboxValue("[name='system[serial][enabled]']", data.system.serial.enabled);
|
||||||
setSelectValue("[name='system[serial][baudrate]']", data.system.serial.baudrate);
|
setSelectValue("[name='system[serial][baudrate]']", data.system.serial.baudrate);
|
||||||
setCheckboxValue("[name='system[telnet][enabled]']", data.system.telnet.enabled);
|
setCheckboxValue("[name='system[webSerial][enabled]']", data.system.webSerial.enabled);
|
||||||
setInputValue("[name='system[telnet][port]']", data.system.telnet.port);
|
|
||||||
setInputValue("[name='system[ntp][server]']", data.system.ntp.server);
|
setInputValue("[name='system[ntp][server]']", data.system.ntp.server);
|
||||||
setInputValue("[name='system[ntp][timezone]']", data.system.ntp.timezone);
|
setInputValue("[name='system[ntp][timezone]']", data.system.ntp.timezone);
|
||||||
setRadioValue("[name='system[unitSystem]']", data.system.unitSystem);
|
setRadioValue("[name='system[unitSystem]']", data.system.unitSystem);
|
||||||
@@ -1176,6 +1193,8 @@
|
|||||||
setSelectValue("[name='heating[hysteresis][action]']", data.heating.hysteresis.action);
|
setSelectValue("[name='heating[hysteresis][action]']", data.heating.hysteresis.action);
|
||||||
setInputValue("[name='heating[turboFactor]']", data.heating.turboFactor);
|
setInputValue("[name='heating[turboFactor]']", data.heating.turboFactor);
|
||||||
setInputValue("[name='heating[maxModulation]']", data.heating.maxModulation);
|
setInputValue("[name='heating[maxModulation]']", data.heating.maxModulation);
|
||||||
|
setSelectValue("[name='heating[indoorTempAvgType]']", data.heating.indoorTempAvgType);
|
||||||
|
setSelectValue("[name='heating[outdoorTempAvgType]']", data.heating.outdoorTempAvgType);
|
||||||
setInputValue("[name='heating[overheatProtection][highTemp]']", data.heating.overheatProtection.highTemp, {
|
setInputValue("[name='heating[overheatProtection][highTemp]']", data.heating.overheatProtection.highTemp, {
|
||||||
"min": 0,
|
"min": 0,
|
||||||
"max": data.system.unitSystem == 0 ? 100 : 212
|
"max": data.system.unitSystem == 0 ? 100 : 212
|
||||||
@@ -1184,11 +1203,14 @@
|
|||||||
"min": 0,
|
"min": 0,
|
||||||
"max": data.system.unitSystem == 0 ? 99 : 211
|
"max": data.system.unitSystem == 0 ? 99 : 211
|
||||||
});
|
});
|
||||||
|
setInputValue("[name='heating[freezeProtection][highTemp]']", data.heating.freezeProtection.highTemp, {
|
||||||
|
"min": data.system.unitSystem == 0 ? 1 : 34,
|
||||||
|
"max": data.system.unitSystem == 0 ? 50 : 122
|
||||||
|
});
|
||||||
setInputValue("[name='heating[freezeProtection][lowTemp]']", data.heating.freezeProtection.lowTemp, {
|
setInputValue("[name='heating[freezeProtection][lowTemp]']", data.heating.freezeProtection.lowTemp, {
|
||||||
"min": data.system.unitSystem == 0 ? 1 : 34,
|
"min": data.system.unitSystem == 0 ? 1 : 34,
|
||||||
"max": data.system.unitSystem == 0 ? 30 : 86
|
"max": data.system.unitSystem == 0 ? 30 : 86
|
||||||
});
|
});
|
||||||
setInputValue("[name='heating[freezeProtection][thresholdTime]']", data.heating.freezeProtection.thresholdTime);
|
|
||||||
setBusy('#heating-settings-busy', '#heating-settings', false);
|
setBusy('#heating-settings-busy', '#heating-settings', false);
|
||||||
|
|
||||||
// DHW
|
// DHW
|
||||||
|
|||||||
+126
-10
@@ -35,7 +35,7 @@
|
|||||||
<article>
|
<article>
|
||||||
<div>
|
<div>
|
||||||
<hgroup>
|
<hgroup>
|
||||||
<h2 data-i18n>upgrade.section.backupAndRestore</h2>
|
<h2 data-i18n>upgrade.section.backupAndRestore.title</h2>
|
||||||
<p data-i18n>upgrade.section.backupAndRestore.desc</p>
|
<p data-i18n>upgrade.section.backupAndRestore.desc</p>
|
||||||
</hgroup>
|
</hgroup>
|
||||||
|
|
||||||
@@ -56,25 +56,25 @@
|
|||||||
<article>
|
<article>
|
||||||
<div>
|
<div>
|
||||||
<hgroup>
|
<hgroup>
|
||||||
<h2 data-i18n>upgrade.section.upgrade</h2>
|
<h2 data-i18n>upgrade.section.upgrade.title</h2>
|
||||||
<p data-i18n>upgrade.section.upgrade.desc</p>
|
<p data-i18n>upgrade.section.upgrade.desc</p>
|
||||||
</hgroup>
|
</hgroup>
|
||||||
|
|
||||||
<form action="/api/upgrade" id="upgrade">
|
<form action="/api/upgrade" id="upgrade">
|
||||||
<fieldset class="primary">
|
<fieldset class="primary">
|
||||||
<label for="firmware-file">
|
<label>
|
||||||
<span data-i18n>upgrade.fw</span>:
|
<span data-i18n>upgrade.fw</span>:
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
<input type="file" name="firmware" id="firmware-file" accept=".bin">
|
<input type="file" name="fw" accept=".bin">
|
||||||
<button type="button" class="upgrade-firmware-result hidden" disabled></button>
|
<button type="button" class="fwResult hidden" disabled></button>
|
||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<label for="filesystem-file">
|
<label>
|
||||||
<span data-i18n>upgrade.fs</span>:
|
<span data-i18n>upgrade.fs</span>:
|
||||||
<div class="grid">
|
<div class="grid">
|
||||||
<input type="file" name="filesystem" id="filesystem-file" accept=".bin">
|
<input type="file" name="fs" accept=".bin">
|
||||||
<button type="button" class="upgrade-filesystem-result hidden" disabled></button>
|
<button type="button" class="fsResult hidden" disabled></button>
|
||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
@@ -105,10 +105,126 @@
|
|||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', async () => {
|
document.addEventListener('DOMContentLoaded', async () => {
|
||||||
const lang = new Lang(document.getElementById('lang'));
|
const lang = new Lang(document.getElementById('lang'));
|
||||||
lang.build();
|
await lang.build();
|
||||||
|
|
||||||
setupRestoreBackupForm('#restore');
|
setupRestoreBackupForm('#restore');
|
||||||
setupUpgradeForm('#upgrade');
|
|
||||||
|
const upgradeForm = document.querySelector('#upgrade');
|
||||||
|
if (upgradeForm) {
|
||||||
|
upgradeForm.reset();
|
||||||
|
const statusToText = (status) => {
|
||||||
|
switch (status) {
|
||||||
|
case 0:
|
||||||
|
return "None";
|
||||||
|
case 1:
|
||||||
|
return "No file";
|
||||||
|
case 2:
|
||||||
|
return "Success";
|
||||||
|
case 3:
|
||||||
|
return "Prohibited";
|
||||||
|
case 4:
|
||||||
|
return "Size mismatch";
|
||||||
|
case 5:
|
||||||
|
return "Error on start";
|
||||||
|
case 6:
|
||||||
|
return "Error on write";
|
||||||
|
case 7:
|
||||||
|
return "Error on finish";
|
||||||
|
default:
|
||||||
|
return "Unknown";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
upgradeForm.addEventListener('submit', async (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
hide('.fwResult');
|
||||||
|
hide('.fsResult');
|
||||||
|
|
||||||
|
let button = upgradeForm.querySelector('button[type="submit"]');
|
||||||
|
button.textContent = i18n('button.uploading');
|
||||||
|
button.setAttribute('disabled', true);
|
||||||
|
button.setAttribute('aria-busy', true);
|
||||||
|
|
||||||
|
try {
|
||||||
|
let fd = new FormData();
|
||||||
|
|
||||||
|
const fw = upgradeForm.querySelector("[name='fw']").files;
|
||||||
|
if (fw.length > 0) {
|
||||||
|
fd.append("fw_size", fw[0].size);
|
||||||
|
fd.append("fw", fw[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const fs = upgradeForm.querySelector("[name='fs']").files;
|
||||||
|
if (fs.length > 0) {
|
||||||
|
fd.append("fs_size", fs[0].size);
|
||||||
|
fd.append("fs", fs[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
let response = await fetch(upgradeForm.action, {
|
||||||
|
method: "POST",
|
||||||
|
cache: "no-cache",
|
||||||
|
credentials: "include",
|
||||||
|
body: fd
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.status != 202 && response.status != 406) {
|
||||||
|
throw new Error('Response not valid');
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
let resItem = upgradeForm.querySelector('.fwResult');
|
||||||
|
if (resItem && result.firmware.status > 1) {
|
||||||
|
resItem.textContent = statusToText(result.firmware.status);
|
||||||
|
resItem.classList.remove('hidden');
|
||||||
|
|
||||||
|
if (result.firmware.status == 2) {
|
||||||
|
resItem.classList.remove('failed');
|
||||||
|
resItem.classList.add('success');
|
||||||
|
} else {
|
||||||
|
resItem.classList.remove('success');
|
||||||
|
resItem.classList.add('failed');
|
||||||
|
|
||||||
|
if (result.firmware.error != "") {
|
||||||
|
resItem.textContent += `: ${result.firmware.error}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resItem = upgradeForm.querySelector('.fsResult');
|
||||||
|
if (resItem && result.filesystem.status > 1) {
|
||||||
|
resItem.textContent = statusToText(result.filesystem.status);
|
||||||
|
resItem.classList.remove('hidden');
|
||||||
|
|
||||||
|
if (result.filesystem.status == 2) {
|
||||||
|
resItem.classList.remove('failed');
|
||||||
|
resItem.classList.add('success');
|
||||||
|
} else {
|
||||||
|
resItem.classList.remove('success');
|
||||||
|
resItem.classList.add('failed');
|
||||||
|
|
||||||
|
if (result.filesystem.error != "") {
|
||||||
|
resItem.textContent += `: ${result.filesystem.error}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err);
|
||||||
|
button.textContent = i18n('button.error');
|
||||||
|
button.classList.add('failed');
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
setTimeout(() => {
|
||||||
|
button.removeAttribute('aria-busy');
|
||||||
|
button.removeAttribute('disabled');
|
||||||
|
button.classList.remove('success', 'failed');
|
||||||
|
button.textContent = i18n(button.dataset.i18n);
|
||||||
|
upgradeForm.reset();
|
||||||
|
}, 10000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
+21
-15
@@ -318,19 +318,25 @@ const setupRestoreBackupForm = (formSelector) => {
|
|||||||
console.log("Backup: ", data);
|
console.log("Backup: ", data);
|
||||||
|
|
||||||
if (data.settings != undefined) {
|
if (data.settings != undefined) {
|
||||||
let response = await fetch(url, {
|
for (var key in data.settings) {
|
||||||
method: "POST",
|
let response = await fetch(url, {
|
||||||
cache: "no-cache",
|
method: "POST",
|
||||||
credentials: "include",
|
cache: "no-cache",
|
||||||
headers: {
|
credentials: "include",
|
||||||
"Content-Type": "application/json"
|
headers: {
|
||||||
},
|
"Content-Type": "application/json"
|
||||||
body: JSON.stringify({"settings": data.settings})
|
},
|
||||||
});
|
body: JSON.stringify({
|
||||||
|
"settings": {
|
||||||
|
[key]: data.settings[key]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
onFailed();
|
onFailed();
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -778,9 +784,9 @@ const purposeUnit = (purpose, unitSystem) => {
|
|||||||
7: tUnit,
|
7: tUnit,
|
||||||
8: "%",
|
8: "%",
|
||||||
248: "%",
|
248: "%",
|
||||||
249: i18n('kw'),
|
249: i18n('units.kw'),
|
||||||
250: "RPM",
|
250: i18n('units.rpm'),
|
||||||
251: "ppm",
|
251: i18n('units.ppm'),
|
||||||
252: pressureUnit(unitSystem),
|
252: pressureUnit(unitSystem),
|
||||||
253: "%",
|
253: "%",
|
||||||
254: tUnit
|
254: tUnit
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import subprocess
|
||||||
|
Import("env")
|
||||||
|
|
||||||
|
try:
|
||||||
|
commit_hash = "undefined"
|
||||||
|
result = subprocess.check_output(
|
||||||
|
["git", "rev-parse", "--short", "HEAD"]
|
||||||
|
)
|
||||||
|
commit_hash = result.decode("utf-8").strip()
|
||||||
|
env.Append(
|
||||||
|
CPPDEFINES=[
|
||||||
|
("BUILD_COMMIT", '\\"{}\\"'.format(commit_hash))
|
||||||
|
]
|
||||||
|
)
|
||||||
|
except Exception as error:
|
||||||
|
print("Failed to get commit hash: {}".format(error))
|
||||||
Reference in New Issue
Block a user