15 Commits
1.5.1 ... 1.5.2

Author SHA1 Message Date
Yurii
1982843624 chore: bump version to 1.5.2 2025-01-19 22:44:52 +03:00
Yurii
bf161c1200 feat: added Italian locale by @bredy73 #132 2025-01-19 22:20:16 +03:00
Yurii
57f1129cee style: formatting 2025-01-14 06:22:04 +03:00
Yurii
0425cdc499 refactor: prohibition of enabling portal auth with an empty login or password 2025-01-14 06:21:32 +03:00
Yurii
53ff69f03a fix: removed `required` attribute for optional parameters on settings page #128 2025-01-14 06:16:15 +03:00
Yurii
e7cae4b950 refactor: improved OT bus reset 2025-01-13 10:56:19 +03:00
Yurii
3ff8f40654 refactor: sensors pos from 1 on `Sensors settings` page 2025-01-13 01:26:22 +03:00
Yurii
d2499a2727 docs: update readme 2025-01-13 01:02:07 +03:00
Yurii
5b7da4ed2a fix: typo 2025-01-09 20:44:12 +03:00
Yurii
8d516c7f95 refactor: optimized work with etag 2025-01-09 19:35:56 +03:00
Yurii
d756716497 chore: bump pioarduino/platform-espressif32 from 3.1.0 to 3.1.1 2025-01-09 19:35:24 +03:00
Stefan S
9a2f9d64ec feat: add support board "OT Thing" (#123)
* Add board "OT Thing"

* style: formatting

---------

Co-authored-by: Yurii <34578544+Laxilef@users.noreply.github.com>
2025-01-08 23:41:06 +03:00
Yurii
0d0926cdac chore: update README 2025-01-07 07:14:19 +03:00
Yurii
3ce3ce5016 chore: move web flasher to `gh-pages` branch 2025-01-07 06:53:08 +03:00
Yurii
6ca6d3cab7 chore: added web flasher 2025-01-07 06:22:41 +03:00
15 changed files with 548 additions and 53 deletions

View File

@@ -45,9 +45,11 @@ All available information and instructions can be found in the wiki:
* [Home](https://github.com/Laxilef/OTGateway/wiki)
* [Quick Start](https://github.com/Laxilef/OTGateway/wiki#quick-start)
* [Build firmware](https://github.com/Laxilef/OTGateway/wiki#build-firmware)
* [Flash firmware via ESP Flash Download Tool](https://github.com/Laxilef/OTGateway/wiki#flash-firmware-via-esp-flash-download-tool)
* [Flashing via Web Flasher](https://github.com/Laxilef/OTGateway/wiki#flashing-via-web-flasher)
* [Flashing via ESP Flash Download Tool](https://github.com/Laxilef/OTGateway/wiki#flashing-via-esp-flash-download-tool)
* [Settings](https://github.com/Laxilef/OTGateway/wiki#settings)
* [External temperature sensors](https://github.com/Laxilef/OTGateway/wiki#external-temperature-sensors)
* [Other external sensors](https://github.com/Laxilef/OTGateway/wiki#other-external-sensors)
* [Reporting indoor/outdoor temperature from any Home Assistant sensor](https://github.com/Laxilef/OTGateway/wiki#reporting-indooroutdoor-temperature-from-any-home-assistant-sensor)
* [Reporting outdoor temperature from Home Assistant weather integration](https://github.com/Laxilef/OTGateway/wiki#reporting-outdoor-temperature-from-home-assistant-weather-integration)
* [DHW meter](https://github.com/Laxilef/OTGateway/wiki#dhw-meter)

View File

@@ -7,9 +7,7 @@ public:
typedef std::function<void(unsigned long, byte)> BeforeSendRequestCallback;
typedef std::function<void(unsigned long, unsigned long, OpenThermResponseStatus, byte)> AfterSendRequestCallback;
CustomOpenTherm(int inPin = 4, int outPin = 5, bool isSlave = false) : OpenTherm(inPin, outPin, isSlave) {
this->_outPin = outPin;
}
CustomOpenTherm(int inPin = 4, int outPin = 5, bool isSlave = false) : OpenTherm(inPin, outPin, isSlave) {}
~CustomOpenTherm() {}
CustomOpenTherm* setDelayCallback(DelayCallback callback = nullptr) {
@@ -30,22 +28,6 @@ public:
return this;
}
void reset() {
if (this->status == OpenThermStatus::NOT_INITIALIZED) {
return;
}
this->end();
this->status = OpenThermStatus::NOT_INITIALIZED;
digitalWrite(this->_outPin, LOW);
if (this->delayCallback) {
this->delayCallback(1000);
}
this->begin();
}
unsigned long sendRequest(unsigned long request, byte attempts = 5, byte _attempt = 0) {
_attempt++;
@@ -166,5 +148,4 @@ protected:
DelayCallback delayCallback;
BeforeSendRequestCallback beforeSendRequestCallback;
AfterSendRequestCallback afterSendRequestCallback;
int _outPin;
};

View File

@@ -1,8 +1,5 @@
#include <FS.h>
#include <detail/mimetable.h>
#if defined(ARDUINO_ARCH_ESP32)
#include <detail/RequestHandlersImpl.h>
#endif
using namespace mime;
@@ -54,13 +51,6 @@ public:
if (this->eTag.isEmpty()) {
if (server._eTagFunction) {
this->eTag = (server._eTagFunction)(*this->fs, this->path);
} else {
#if defined(ARDUINO_ARCH_ESP8266)
this->eTag = esp8266webserver::calcETag(*this->fs, this->path);
#elif defined(ARDUINO_ARCH_ESP32)
this->eTag = StaticRequestHandler::calcETag(*this->fs, this->path);
#endif
}
}

View File

@@ -14,14 +14,13 @@ extra_configs = secrets.default.ini
core_dir = .pio
[env]
version = 1.5.1
version = 1.5.2
framework = arduino
lib_deps =
bblanchon/ArduinoJson@^7.3.0
;ihormelnyk/OpenTherm Library@^1.1.5
https://github.com/ihormelnyk/opentherm_library#master
;arduino-libraries/ArduinoMqttClient@^0.1.8
https://github.com/Laxilef/ArduinoMqttClient.git#esp32_core_310
arduino-libraries/ArduinoMqttClient@^0.1.8
lennarthennigs/ESP Telnet@^2.2
gyverlibs/FileData@^1.0.2
gyverlibs/GyverPID@^3.3.2
@@ -85,7 +84,7 @@ board_build.ldscript = eagle.flash.4m1m.ld
;platform_packages =
; framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#3.0.5
; 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
platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.10/platform-espressif32.zip
platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.11/platform-espressif32.zip
platform_packages =
board_build.partitions = esp32_partitions.csv
lib_deps =
@@ -300,4 +299,28 @@ build_type = ${esp32_defaults.build_type}
build_flags =
${esp32_defaults.build_flags}
; Currently the NimBLE library is incompatible with ESP32 C6
;-D USE_BLE=1
;-D USE_BLE=1
[env:otthing]
platform = ${esp32_defaults.platform}
platform_packages = ${esp32_defaults.platform_packages}
board = lolin_c3_mini
board_build.partitions = ${esp32_defaults.board_build.partitions}
lib_deps =
${esp32_defaults.lib_deps}
${esp32_defaults.nimble_lib}
lib_ignore = ${esp32_defaults.lib_ignore}
extra_scripts = ${esp32_defaults.extra_scripts}
build_unflags =
-mtext-section-literals
build_type = ${esp32_defaults.build_type}
build_flags =
${esp32_defaults.build_flags}
-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

View File

@@ -197,14 +197,13 @@ protected:
this->haHelper->setDevicePrefix(settings.mqtt.prefix);
this->haHelper->updateCachedTopics();
this->client->stop();
this->client->setId(networkSettings.hostname);
this->client->setUsernamePassword(settings.mqtt.user, settings.mqtt.password);
this->client->beginWill(this->haHelper->getDeviceTopic(F("status")).c_str(), 7, true, 1);
this->client->print(F("offline"));
this->client->endWill();
this->client->connect(settings.mqtt.server, settings.mqtt.port);
this->lastReconnectTime = millis();
this->yield();

View File

@@ -10,17 +10,21 @@ public:
}
protected:
const unsigned short readyTime = 60000;
const unsigned short heatingSetTempInterval = 60000;
const unsigned short dhwSetTempInterval = 60000;
const unsigned short ch2SetTempInterval = 60000;
const unsigned int initializingInterval = 3600000;
const unsigned short readyTime = 60000u;
const unsigned int resetBusInterval = 120000u;
const unsigned short heatingSetTempInterval = 60000u;
const unsigned short dhwSetTempInterval = 60000u;
const unsigned short ch2SetTempInterval = 60000u;
const unsigned int initializingInterval = 3600000u;
CustomOpenTherm* instance = nullptr;
unsigned long instanceCreatedTime = 0;
byte instanceInGpio = 0;
byte instanceOutGpio = 0;
bool initialized = false;
unsigned long connectedTime = 0;
unsigned long disconnectedTime = 0;
unsigned long resetBusTime = 0;
unsigned long initializedTime = 0;
unsigned long lastSuccessResponse = 0;
unsigned long prevUpdateNonEssentialVars = 0;
@@ -69,6 +73,11 @@ protected:
return;
}
#ifdef OT_BYPASS_RELAY_GPIO
pinMode(OT_BYPASS_RELAY_GPIO, OUTPUT);
digitalWrite(OT_BYPASS_RELAY_GPIO, true);
#endif
// create instance
this->instance = new CustomOpenTherm(settings.opentherm.inGpio, settings.opentherm.outGpio);
@@ -76,6 +85,7 @@ protected:
this->instanceCreatedTime = millis();
this->instanceInGpio = settings.opentherm.inGpio;
this->instanceOutGpio = settings.opentherm.outGpio;
this->resetBusTime = millis();
this->initialized = false;
Log.sinfoln(FPSTR(L_OT), F("Started. GPIO IN: %hhu, GPIO OUT: %hhu"), settings.opentherm.inGpio, settings.opentherm.outGpio);
@@ -101,8 +111,6 @@ protected:
this->instance->setDelayCallback([this](unsigned int time) {
this->delay(time);
});
this->instance->begin();
}
void loop() {
@@ -128,6 +136,9 @@ protected:
if (this->instance == nullptr) {
this->delay(5000);
return;
} else if (this->instance->status == OpenThermStatus::NOT_INITIALIZED) {
this->instance->begin();
}
// RX LED GPIO setup
@@ -204,12 +215,21 @@ protected:
}
if (!vars.slave.connected && millis() - this->lastSuccessResponse < 1325) {
Log.sinfoln(FPSTR(L_OT), F("Connected"));
Log.sinfoln(
FPSTR(L_OT),
F("Connected, downtime: %lu s."),
(millis() - this->disconnectedTime) / 1000
);
this->connectedTime = millis();
vars.slave.connected = true;
} else if (vars.slave.connected && millis() - this->lastSuccessResponse > 1325) {
Log.swarningln(FPSTR(L_OT), F("Disconnected"));
Log.swarningln(
FPSTR(L_OT),
F("Disconnected, uptime: %lu s."),
(millis() - this->connectedTime) / 1000
);
// Mark sensors as disconnected
Sensors::setConnectionStatusByType(Sensors::Type::OT_OUTDOOR_TEMP, false);
@@ -233,6 +253,7 @@ protected:
Sensors::setConnectionStatusByType(Sensors::Type::OT_FAN_SPEED_CURRENT, false);
this->initialized = false;
this->disconnectedTime = millis();
vars.slave.connected = false;
}
@@ -248,7 +269,19 @@ protected:
vars.slave.diag.active = false;
vars.slave.diag.code = 0;
this->instance->reset();
// reset bus
if (millis() - this->disconnectedTime > this->resetBusInterval) {
if (millis() - this->resetBusTime > this->resetBusInterval) {
Log.sinfoln(FPSTR(L_OT), F("Reset bus..."));
this->instance->end();
this->instance->status = OpenThermStatus::NOT_INITIALIZED;
digitalWrite(this->instanceOutGpio, LOW);
this->resetBusTime = millis();
this->delay(5000);
}
}
return;
}

View File

@@ -602,6 +602,11 @@ bool jsonToSettings(const JsonVariantConst src, Settings& dst, bool safe = false
}
}
if (dst.portal.auth && (!strlen(dst.portal.login) || !strlen(dst.portal.password))) {
dst.portal.auth = false;
changed = true;
}
// opentherm
if (!src[FPSTR(S_OPENTHERM)][FPSTR(S_UNIT_SYSTEM)].isNull()) {

455
src_data/locales/it.json Normal file
View File

@@ -0,0 +1,455 @@
{
"values": {
"logo": "OpenTherm Gateway",
"nav": {
"license": "Licenza",
"source": "Codice",
"help": "Aiuto",
"issues": "Problemi e domande",
"releases": "Versione"
},
"dbm": "dBm",
"kw": "kW",
"time": {
"days": "d.",
"hours": "h.",
"min": "min.",
"sec": "sec."
},
"button": {
"upgrade": "Aggiorna",
"restart": "Riavvia",
"save": "Salva",
"saved": "Salvato",
"refresh": "Ricarica",
"restore": "Recupera",
"restored": "Recuperato",
"backup": "Backup",
"wait": "Attendi...",
"uploading": "caricamento...",
"success": "Riuscito",
"error": "Errore"
},
"index": {
"title": "OpenTherm Gateway",
"section": {
"network": "Rete",
"system": "Sistema"
},
"system": {
"build": {
"title": "Build",
"version": "Versione",
"date": "Data",
"core": "Core",
"sdk": "SDK"
},
"uptime": "Tempo di attività",
"memory": {
"title": "Memoria libera",
"maxFreeBlock": "max free block",
"min": "min"
},
"board": "Scheda",
"chip": {
"model": "Chip",
"cores": "Cores",
"freq": "frequenza"
},
"flash": {
"size": "Dimensioni del flash",
"realSize": "dimensione reale"
},
"lastResetReason": "Motivo ultimo Reset"
}
},
"dashboard": {
"name": "Pannello",
"title": "Pannello - OpenTherm Gateway",
"section": {
"control": "Controlli",
"states": "Stato",
"sensors": "Sensori",
"diag": "Diagnostica OpenTherm"
},
"thermostat": {
"heating": "Riscaldamento",
"dhw": "ACS",
"temp.current": "Attuale",
"enable": "Attiva",
"turbo": "Turbo"
},
"notify": {
"fault": {
"title": "Rilevamento guasti caldiaia attivo!",
"note": "Si consiglia di ispezionare la caldaia e studiare la documentazione per interpretare il codice di errore:"
},
"diag": {
"title": "Stato diagnostica Caldaia attivo!",
"note": "Forse la tua caldaia ha bisogno di un'ispezione? Si consiglia di studiare la documentazione per interpretare il codice diagnostico:"
},
"reset": "Prova a resettare"
},
"states": {
"mNetworkConnected": "Connessione Rete",
"mMqttConnected": "Connessione MQTT",
"mEmergencyState": "Modo Emergenza",
"mExtPumpState": "Pompa esterna",
"mCascadeControlInput": "Controllo a cascata (input)",
"mCascadeControlOutput": "Controllo a cascata (output)",
"sConnected": "Connessione OpenTherm",
"sFlame": "Fiamma",
"sCooling": "Raffrescamento",
"sFaultActive": "Anomalia",
"sFaultCode": "Codice anomalia",
"sDiagActive": "Diagnostica",
"sDiagCode": "Codice Diagnostica",
"mHeatEnabled": "Riscaldamento attivato",
"mHeatBlocking": "Riscaldamento bloccato",
"sHeatActive": "Riscaldamento attivo",
"mHeatSetpointTemp": "Temp riscaldamento impostato",
"mHeatTargetTemp": "Target Temp caldaia",
"mHeatCurrTemp": "Temp attuale riscaldamento",
"mHeatRetTemp": "Temp ritorno riscaldamento",
"mHeatIndoorTemp": "Riscaldamento, temp interna",
"mHeatOutdoorTemp": "Riscaldamento, temp esterna",
"mDhwEnabled": "ACS attivata",
"sDhwActive": "ACS attiva",
"mDhwTargetTemp": "ACS temp impostata",
"mDhwCurrTemp": "ACS temp attuale",
"mDhwRetTemp": "ACS temp ricircolo"
},
"sensors": {
"values": {
"temp": "Temperatura",
"humidity": "Umidità",
"battery": "Batteria",
"rssi": "RSSI"
}
}
},
"network": {
"title": "Rete - OpenTherm Gateway",
"name": "Impostazioni rete",
"section": {
"static": "Impostazioni statico",
"availableNetworks": "Reti disponibili",
"staSettings": "Impostazioni WiFi",
"apSettings": "Impostazioni AP"
},
"scan": {
"pos": "#",
"info": "Info"
},
"wifi": {
"ssid": "SSID",
"password": "Password",
"channel": "Canale",
"signal": "Segnale",
"connected": "Connesso"
},
"params": {
"hostname": "Hostname",
"dhcp": "Usa DHCP",
"mac": "MAC",
"ip": "IP",
"subnet": "Subnet",
"gateway": "Gateway",
"dns": "DNS"
},
"sta": {
"channel.note": "Metti 0 per auto selezione"
}
},
"sensors": {
"title": "Impostazione sensori - OpenTherm Gateway",
"name": "Impostazione sensori",
"enabled": "Attivato",
"sensorName": {
"title": "Nome sensore",
"note": "Può contenere solo: a-z, A-Z, 0-9, _ e spazi"
},
"purpose": "Funzione",
"purposes": {
"outdoorTemp": "Temperatura esterna",
"indoorTemp": "Temperatura interna",
"heatTemp": "Riscaldamento, temperatura mandata",
"heatRetTemp": "Riscaldamento, temperatura ritorno",
"dhwTemp": "ACS, temperatura",
"dhwRetTemp": "ACS, temperatura ritorno",
"dhwFlowRate": "ACS, prelievo",
"exhaustTemp": "Temperatura fumi",
"modLevel": "Livello Modulazione (%)",
"powerFactor": "Potenza (%)",
"power": "Potenza (in kW)",
"fanSpeed": "Velocità ventilatore",
"co2": "CO2",
"pressure": "Pressione",
"humidity": "Umidità",
"temperature": "Temperatura",
"notConfigured": "Non configurato"
},
"type": "Tipo/sorgente",
"types": {
"otOutdoorTemp": "OpenTherm, temp esterna",
"otHeatTemp": "OpenTherm, riscaldamento, temp",
"otHeatRetTemp": "OpenTherm, riscaldamento, temp ritorno",
"otDhwTemp": "OpenTherm, ACS, temperatura",
"otDhwTemp2": "OpenTherm, ACS, temperatura 2",
"otDhwFlowRate": "OpenTherm, ACS, prelievo",
"otCh2Temp": "OpenTherm, canale 2, temp",
"otExhaustTemp": "OpenTherm, temp fumi",
"otHeatExchangerTemp": "OpenTherm, temp scambiatore",
"otPressure": "OpenTherm, pressione",
"otModLevel": "OpenTherm, livello modulazione",
"otCurrentPower": "OpenTherm, potenza attuale",
"otExhaustCo2": "OpenTherm, CO2 fumi",
"otExhaustFanSpeed": "OpenTherm, velocità ventola fumi",
"otSupplyFanSpeed": "OpenTherm, velocità ventola supporto",
"otSolarStorageTemp": "OpenTherm, temp accumulo solare",
"otSolarCollectorTemp": "OpenTherm, temp collettore solare",
"otFanSpeedSetpoint": "OpenTherm, velocità ventola impostata",
"otFanSpeedCurrent": "OpenTherm, velocità ventola attuale",
"ntcTemp": "Sensore NTC",
"dallasTemp": "Sensore DALLAS",
"bluetooth": "Sensore BLE",
"heatSetpointTemp": "Riscaldamento, temp impostata",
"manual": "Manuale via MQTT/API",
"notConfigured": "Non configurato"
},
"gpio": "GPIO",
"address": {
"title": "Indirizzo sensore",
"note": "Per l'autoriconoscimento del sensore DALLAS lasciare quello di default, per sensore BLE richiede indirizzo MAC"
},
"correction": {
"desc": "Correzione del valore",
"offset": "Compensazione (offset)",
"factor": "Moltiplicatore"
},
"filtering": {
"desc": "Filtraggio valore",
"enabled": {
"title": "Filtraggio attivo",
"note": "Può servire in caso vi siano molti sbalzi nel grafico. Il filtro usato è \"Running Average\"."
},
"factor": {
"title": "Fattore di filtrazione",
"note": "Quanto più basso è il valore, tanto più graduale e prolungata sarà la variazione dei valori numerici."
}
}
},
"settings": {
"title": "Impostazioni - OpenTherm Gateway",
"name": "Impostazioni",
"section": {
"portal": "Impostazioni Accesso",
"system": "Impostazioni sistema",
"diag": "Diagnostica",
"heating": "Impostazioni riscaldamento",
"dhw": "Impostazioni ACS",
"emergency": "Impostazioni modo Emergenza",
"equitherm": "Impostazioni Equitherm",
"pid": "Impostazioni PID",
"ot": "Impostazioni OpenTherm",
"mqtt": "Impostazioni MQTT",
"extPump": "Impostazioni pompa esterna",
"cascadeControl": "Impostazioni controllo a cascata"
},
"enable": "Attiva",
"note": {
"restart": "Dopo aver cambiato queste impostazioni, il sistema sarà riavviato perchè i cambiamenti abbiano effetto.",
"blankNotUse": "vuoto - non usare",
"bleDevice": "Dispositivi BLE possono essere usati <u>solo</u> con alcune schede ESP32 che supportano il bluetooth!"
},
"temp": {
"min": "Temperatura minima",
"max": "Temperatura massima"
},
"portal": {
"login": "Login",
"password": "Password",
"auth": "Richiede autenticazione"
},
"system": {
"unit": "Unità di misura",
"metric": "Metrico <small>(celsius, litri, bar)</small>",
"imperial": "Imperiale <small>(fahrenheit, galloni, psi)</small>",
"statusLedGpio": "LED di stato GPIO",
"logLevel": "Log livello",
"serial": {
"enable": "Porta seriale attivata",
"baud": "Porta seriale baud rate"
},
"telnet": {
"enable": "Telnet attivato",
"port": {
"title": "Porta Telnet",
"note": "Default: 23"
}
}
},
"heating": {
"hyst": "Isteresi <small>(in gradi)</small>",
"turboFactor": "Turbo mode coeff."
},
"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.",
"target": {
"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>."
},
"treshold": "Tempo di soglia <small>(sec)</small>"
},
"equitherm": {
"n": "Fattore N",
"k": "Fattore K",
"t": {
"title": "Fattore T",
"note": "Non usato se PID è attivato"
}
},
"pid": {
"p": "Fattore P",
"i": "Fattore I",
"d": "Fattore D",
"dt": "DT <small>in secondi</small>",
"noteMinMaxTemp": "<b>Importante:</b> Quando usi «Equitherm» e «PID» allo stesso tempo, i limiti della temperatura min e max influenzano il risultato della temperatura «Equitherm».<br />Thus, se la temperatura minima è impostata a -15 e la massima a 15, il riscaldamento finale sarà impostato fra <code>equitherm_result - 15</code> a <code>equitherm_result + 15</code>."
},
"ot": {
"advanced": "Impostazioni avanzate",
"inGpio": "In GPIO",
"outGpio": "Out GPIO",
"ledGpio": "RX LED GPIO",
"memberId": "Master member ID",
"flags": "Master flags",
"maxMod": "Max livello modulazione",
"minPower": {
"title": "Potenza minima caldaia <small>(kW)</small>",
"note": "Questo valore corrisponde allo livello 0-1% di modulazione della caldaia. Di solito si trova nelle specifiche delle caldaia come \"potenza minima disponibile\"."
},
"maxPower": {
"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\"."
},
"options": {
"desc": "Opzioni",
"dhwSupport": "Supporto ACS",
"coolingSupport": "Supporto rafferscamento",
"summerWinterMode": "Modalità Estate/inverno",
"heatingStateToSummerWinterMode": "Stato di riscaldamento come modalità estate/inverno",
"ch2AlwaysEnabled": "CH2 sempre abilitato",
"heatingToCh2": "Riproduci riscaldamento su CH2",
"dhwToCh2": "Riproduci ACS su CH2",
"dhwBlocking": "Bloccare ACS",
"modulationSyncWithHeating": "Sincronizzare modulazione con caldaia",
"maxTempSyncWithTargetTemp": "Sincronizza la temperatura massima di riscaldamento con la temperatura target",
"getMinMaxTemp": "Prendi temp min/max dalla caldaia",
"immergasFix": "Fix per caldiaie Immergas"
},
"nativeHeating": {
"title": "Controllo del riscaldamento nativo (caldaia)",
"note": "Lavora <u>SOLO</u> se la caldaia richiede la temperatura ambiente desiderata e regola autonomamente la temperatura del fluido. Non compatiblile con regolazioni PID e Equitherm del sistema."
}
},
"mqtt": {
"homeAssistantDiscovery": "Home Assistant Discovery",
"server": "Server",
"port": "Porta",
"user": "Utente",
"password": "Password",
"prefix": "Prefisso",
"interval": "Intervallo invio <small>(sec)</small>"
},
"extPump": {
"use": "Usa pompa/circolatore esterno",
"gpio": "GPIO relè",
"postCirculationTime": "Tempo di post circolazione <small>(min)</small>",
"antiStuckInterval": "Intervallo antiblocco <small>(days)</small>",
"antiStuckTime": "Tempo antiblocco <small>(min)</small>"
},
"cascadeControl": {
"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.",
"enable": "Ingresso abilitato",
"gpio": "GPIO",
"invertState": "Inverti stato GPIO",
"thresholdTime": "Tempo soglia di modifica dello stato <small>(sec)</small>"
},
"output": {
"desc": "Può essere usato per passare ad un'altra caldaia tramite <u>relè</u>.",
"enable": "Uscita abilitata",
"gpio": "GPIO",
"invertState": "Invert GPIO state",
"thresholdTime": "Tempo soglia di modifica dello stato <small>(sec)</small>",
"events": {
"desc": "Eventi",
"onFault": "Se lo stato di errore è attivo",
"onLossConnection": "Se non c'è la connessione via Opentherm",
"onEnabledHeating": "Se il riscaldamento è attivato"
}
}
}
},
"upgrade": {
"title": "Aggiornamenti - OpenTherm Gateway",
"name": "Aggiornamenti",
"section": {
"backupAndRestore": "Backup & restore",
"backupAndRestore.desc": "In questa sezione puoi salvare e recuperare un backup di tutte le impostazioni.",
"upgrade": "Aggiorna",
"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."
},
"note": {
"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."
},
"settingsFile": "Settings file",
"fw": "Firmware",
"fs": "Filesystem"
}
}
}

View File

@@ -301,7 +301,7 @@
"system": {
"unit": "Система единиц",
"metric": "Метрическая <small>(цильсии, литры, бары)</small>",
"metric": "Метрическая <small>(цельсии, литры, бары)</small>",
"imperial": "Imperial <small>(фаренгейты, галлоны, psi)</small>",
"statusLedGpio": "Статус LED GPIO",
"logLevel": "Уровень логирования",

View File

@@ -21,6 +21,7 @@
<li>
<select id="lang" aria-label="Lang">
<option value="en" selected>EN</option>
<option value="it">IT</option>
<option value="ru">RU</option>
</select>
</li>

View File

@@ -21,6 +21,7 @@
<li>
<select id="lang" aria-label="Lang">
<option value="en" selected>EN</option>
<option value="it">IT</option>
<option value="ru">RU</option>
</select>
</li>

View File

@@ -21,6 +21,7 @@
<li>
<select id="lang" aria-label="Lang">
<option value="en" selected>EN</option>
<option value="it">IT</option>
<option value="ru">RU</option>
</select>
</li>

View File

@@ -21,6 +21,7 @@
<li>
<select id="lang" aria-label="Lang">
<option value="en" selected>EN</option>
<option value="it">IT</option>
<option value="ru">RU</option>
</select>
</li>
@@ -36,7 +37,7 @@
</hgroup>
<details id="template" class="sensor hidden" data-id="" data-preloaded="0">
<summary><b>#<span class="id"></span>: <span class="name"></span></b></summary>
<summary><b>#<span class="pos"></span>: <span class="name"></span></b></summary>
<div>
<div class="form-busy" aria-busy="true"></div>
@@ -210,6 +211,7 @@
sensorNode.classList.remove("hidden");
sensorNode.dataset.id = sensorId;
setValue(".id", sensorId, sensorNode);
setValue(".pos", sensorId + 1, sensorNode);
setValue(".name", result[sensorId], sensorNode);
container.appendChild(sensorNode);

View File

@@ -21,6 +21,7 @@
<li>
<select id="lang" aria-label="Lang">
<option value="en" selected>EN</option>
<option value="it">IT</option>
<option value="ru">RU</option>
</select>
</li>
@@ -43,12 +44,12 @@
<div class="grid">
<label>
<span data-i18n>settings.portal.login</span>
<input type="text" name="portal[login]" maxlength="12" required>
<input type="text" name="portal[login]" maxlength="12">
</label>
<label>
<span data-i18n>settings.portal.password</span>
<input type="password" name="portal[password]" maxlength="32" required>
<input type="password" name="portal[password]" maxlength="32">
</label>
</div>
@@ -511,7 +512,7 @@
<div class="grid">
<label>
<span data-i18n>settings.mqtt.user</span>
<input type="text" name="mqtt[user]" maxlength="32" required>
<input type="text" name="mqtt[user]" maxlength="32">
</label>
<label>

View File

@@ -21,6 +21,7 @@
<li>
<select id="lang" aria-label="Lang">
<option value="en" selected>EN</option>
<option value="it">IT</option>
<option value="ru">RU</option>
</select>
</li>