Compare commits

..

4 Commits

Author SHA1 Message Date
Yurii a4ca20f9a9 fix(portal): fix i18n name for extPump.invertState 2026-05-19 23:25:24 +03:00
Weblate (bot) f5e08f20a2 refactor(translation): update translation files (#249)
* feat(translation): added Estonian language

* refactor(translation): updated Chinese (Simplified Han script) language

Currently translated at 100.0% (355 of 355 strings)

Translation: OTGateway/Portal
Translate-URL: https://hosted.weblate.org/projects/otgateway/portal/zh_Hans/

* refactor(translation): updated Russian language

Currently translated at 100.0% (355 of 355 strings)

Translation: OTGateway/Portal
Translate-URL: https://hosted.weblate.org/projects/otgateway/portal/ru/

* refactor(translation): updated Dutch language

Currently translated at 100.0% (355 of 355 strings)

Translation: OTGateway/Portal
Translate-URL: https://hosted.weblate.org/projects/otgateway/portal/nl/

* refactor(translation): updated Italian language

Currently translated at 100.0% (355 of 355 strings)

Translation: OTGateway/Portal
Translate-URL: https://hosted.weblate.org/projects/otgateway/portal/it/

---------

Co-authored-by: Priit Jõerüüt <jrthwlate@users.noreply.hosted.weblate.org>
Co-authored-by: Yurii <34578544+Laxilef@users.noreply.github.com>
2026-05-19 21:55:14 +03:00
Yurii 07650b4878 refactor: improved dashboard & restore settings 2026-05-19 21:39:29 +03:00
Yurii ffcacb3d48 fix: translation for volume unit 2026-05-19 19:42:29 +03:00
9 changed files with 612 additions and 16 deletions
+3 -1
View File
@@ -19,7 +19,9 @@
"rpm": "RPM",
"ppm": "ppm",
"byte": "byte",
"mbyte": "MB"
"mbyte": "MB",
"liter": "升",
"gallon": "加仑"
},
"button": {
"upgrade": "固件升级",
+3 -1
View File
@@ -19,7 +19,9 @@
"rpm": "RPM",
"ppm": "ppm",
"byte": "byte",
"mbyte": "MB"
"mbyte": "MB",
"liter": "L",
"gallon": "gal"
},
"button": {
"upgrade": "Upgrade",
+523
View File
@@ -0,0 +1,523 @@
{
"values": {
"logo": "",
"nav": {
"license": "",
"source": "",
"help": "",
"issues": "",
"releases": ""
},
"units": {
"days": "",
"hours": "",
"min": "",
"sec": "",
"dbm": "",
"mhz": "",
"kw": "",
"rpm": "",
"ppm": "",
"byte": "",
"mbyte": ""
},
"button": {
"upgrade": "",
"restart": "",
"save": "",
"saved": "",
"refresh": "",
"restore": "",
"restored": "",
"backup": "",
"wait": "",
"uploading": "",
"success": "",
"error": ""
},
"index": {
"title": "",
"section": {
"network": "",
"system": ""
},
"system": {
"build": {
"title": "",
"version": "",
"commit": "",
"date": "",
"core": "",
"sdk": ""
},
"uptime": "",
"memory": {
"heap": "",
"psram": "",
"maxFreeBlock": "",
"min": ""
},
"board": "",
"chip": {
"model": "",
"cores": "",
"freq": ""
},
"flash": {
"size": "",
"realSize": ""
},
"lastResetReason": ""
}
},
"dashboard": {
"name": "",
"title": "",
"section": {
"control": "",
"states": "",
"sensors": "",
"diag": ""
},
"thermostat": {
"heating": "",
"dhw": "",
"currentTemp": "",
"enable": "",
"turbo": ""
},
"notify": {
"fault": {
"title": "",
"note": ""
},
"diag": {
"title": "",
"note": ""
},
"reset": ""
},
"states": {
"mNetworkConnected": "",
"mMqttConnected": "",
"mEmergencyState": "",
"mExtPumpState": "",
"mCascadeControlInput": "",
"mCascadeControlOutput": "",
"sConnected": "",
"sFlame": "",
"sCoolingActive": "",
"sCoolingSetpoint": "",
"sFaultActive": "",
"sFaultCode": "",
"sDiagActive": "",
"sDiagCode": "",
"mHeatEnabled": "",
"mHeatBlocking": "",
"mHeatOverheat": "",
"mHeatFreezing": "",
"sHeatActive": "",
"mHeatSetpointTemp": "",
"mHeatTargetTemp": "",
"mHeatCurrTemp": "",
"mHeatRetTemp": "",
"mHeatIndoorTemp": "",
"mHeatOutdoorTemp": "",
"mDhwEnabled": "",
"mDhwOverheat": "",
"sDhwActive": "",
"mDhwTargetTemp": "",
"mDhwCurrTemp": "",
"mDhwRetTemp": ""
},
"sensors": {
"values": {
"temp": "",
"humidity": "",
"battery": "",
"rssi": ""
}
}
},
"network": {
"title": "",
"name": "",
"section": {
"static": "",
"availableNetworks": "",
"staSettings": "",
"apSettings": ""
},
"scan": {
"pos": "",
"info": ""
},
"wifi": {
"ssid": "",
"password": "",
"channel": "",
"signal": "",
"connected": ""
},
"params": {
"hostname": "",
"dhcp": "",
"mac": "",
"ip": "",
"subnet": "",
"gateway": "",
"dns": ""
},
"sta": {
"channel": {
"note": ""
}
}
},
"sensors": {
"title": "",
"name": "",
"enabled": "",
"sensorName": {
"title": "",
"note": ""
},
"purpose": "",
"purposes": {
"outdoorTemp": "",
"indoorTemp": "",
"heatTemp": "",
"heatRetTemp": "",
"dhwTemp": "",
"dhwRetTemp": "",
"dhwFlowRate": "",
"exhaustTemp": "",
"modLevel": "",
"number": "",
"powerFactor": "",
"power": "",
"fanSpeed": "",
"co2": "",
"pressure": "",
"humidity": "",
"temperature": "",
"notConfigured": ""
},
"type": "",
"types": {
"otOutdoorTemp": "",
"otHeatTemp": "",
"otHeatRetTemp": "",
"otDhwTemp": "",
"otDhwTemp2": "",
"otDhwFlowRate": "",
"otCh2Temp": "",
"otExhaustTemp": "",
"otHeatExchangerTemp": "",
"otPressure": "",
"otModLevel": "",
"otCurrentPower": "",
"otExhaustCo2": "",
"otExhaustFanSpeed": "",
"otSupplyFanSpeed": "",
"otSolarStorageTemp": "",
"otSolarCollectorTemp": "",
"otFanSpeedSetpoint": "",
"otFanSpeedCurrent": "",
"otBurnerStarts": "",
"otDhwBurnerStarts": "",
"otHeatingPumpStarts": "",
"otDhwPumpStarts": "",
"otBurnerHours": "",
"otDhwBurnerHours": "",
"otHeatingPumpHours": "",
"otDhwPumpHours": "",
"otCoolingHours": "",
"ntcTemp": "",
"dallasTemp": "",
"bluetooth": "",
"dht11": "",
"dht22": "",
"heatSetpointTemp": "",
"manual": "",
"notConfigured": ""
},
"gpio": "",
"address": {
"title": "",
"note": ""
},
"correction": {
"desc": "",
"offset": "",
"factor": ""
},
"filtering": {
"desc": "",
"enabled": {
"title": "",
"note": ""
},
"factor": {
"title": "",
"note": ""
}
}
},
"settings": {
"title": "",
"name": "",
"section": {
"portal": "",
"system": "",
"diag": "",
"heating": "",
"dhw": "",
"emergency": "",
"equitherm": "",
"pid": "",
"ot": "",
"mqtt": "",
"extPump": "",
"cascadeControl": ""
},
"enable": "",
"note": {
"restart": "",
"blankNotUse": "",
"bleDevice": ""
},
"temp": {
"min": "",
"max": ""
},
"avgType": {
"mean": "",
"min": "",
"max": ""
},
"maxModulation": "",
"ohProtection": {
"title": "",
"desc": "",
"highTemp": {
"title": "",
"note": ""
},
"lowTemp": {
"title": "",
"note": ""
}
},
"freezeProtection": {
"title": "",
"desc": "",
"highTemp": {
"title": "",
"note": ""
},
"lowTemp": {
"title": "",
"note": ""
}
},
"portal": {
"login": "",
"password": "",
"auth": "",
"mdns": ""
},
"system": {
"unit": "",
"metric": "",
"imperial": "",
"statusLedGpio": "",
"logLevel": "",
"serial": {
"enable": "",
"baud": ""
},
"webSerial": {
"enable": ""
},
"ntp": {
"server": "",
"timezone": "",
"timezonePresets": ""
}
},
"heating": {
"hyst": {
"title": "",
"desc": "",
"value": "",
"action": {
"title": "",
"disableHeating": "",
"set0target": ""
}
},
"turboFactor": "",
"indoorTempAvgType": {
"title": "",
"desc": ""
},
"outdoorTempAvgType": {
"title": "",
"desc": ""
}
},
"emergency": {
"desc": "",
"target": {
"title": "",
"note": ""
},
"treshold": ""
},
"equitherm": {
"slope": {
"title": "",
"note": ""
},
"exponent": {
"title": "",
"note": ""
},
"shift": {
"title": "",
"note": ""
},
"targetDiffFactor": {
"title": "",
"note": ""
},
"chart": {
"targetTemp": "",
"setpointTemp": "",
"outdoorTemp": ""
}
},
"pid": {
"p": "",
"i": "",
"d": "",
"dt": "",
"limits": {
"title": "",
"note": ""
},
"deadband": {
"title": "",
"note": "",
"p_multiplier": "",
"i_multiplier": "",
"d_multiplier": "",
"thresholdHigh": "",
"thresholdLow": ""
}
},
"ot": {
"advanced": "",
"inGpio": "",
"outGpio": "",
"ledGpio": "",
"memberId": "",
"flags": "",
"minPower": {
"title": "",
"note": ""
},
"maxPower": {
"title": "",
"note": ""
},
"options": {
"title": "",
"desc": "",
"dhwSupport": "",
"coolingSupport": "",
"summerWinterMode": "",
"heatingStateToSummerWinterMode": "",
"ch2AlwaysEnabled": "",
"heatingToCh2": "",
"dhwToCh2": "",
"dhwBlocking": "",
"dhwStateAsDhwBlocking": "",
"maxTempSyncWithTargetTemp": "",
"getMinMaxTemp": "",
"ignoreDiagState": "",
"autoFaultReset": "",
"autoDiagReset": "",
"setDateAndTime": "",
"immergasFix": "",
"alwaysSendIndoorTemp": ""
},
"nativeOTC": {
"title": "",
"note": ""
}
},
"mqtt": {
"homeAssistantDiscovery": "",
"server": "",
"port": "",
"user": "",
"password": "",
"prefix": "",
"interval": ""
},
"extPump": {
"use": "",
"gpio": "",
"invertState": "",
"postCirculationTime": "",
"antiStuckInterval": "",
"antiStuckTime": ""
},
"cascadeControl": {
"input": {
"desc": "",
"enable": "",
"gpio": "",
"invertState": "",
"thresholdTime": ""
},
"output": {
"desc": "",
"enable": "",
"gpio": "",
"invertState": "",
"thresholdTime": "",
"events": {
"desc": "",
"onFault": "",
"onLossConnection": "",
"onEnabledHeating": ""
}
}
}
},
"upgrade": {
"title": "",
"name": "",
"section": {
"backupAndRestore": {
"title": "",
"desc": ""
},
"upgrade": {
"title": "",
"desc": ""
}
},
"note": {
"disclaimer1": "",
"disclaimer2": ""
},
"settingsFile": "",
"fw": "",
"fs": ""
}
}
}
+3 -1
View File
@@ -19,7 +19,9 @@
"rpm": "RPM",
"ppm": "ppm",
"byte": "byte",
"mbyte": "MB"
"mbyte": "MB",
"liter": "litro",
"gallon": "gal"
},
"button": {
"upgrade": "Aggiorna",
+3 -1
View File
@@ -19,7 +19,9 @@
"rpm": "RPM",
"ppm": "ppm",
"byte": "byte",
"mbyte": "MB"
"mbyte": "MB",
"liter": "L",
"gallon": "gal"
},
"button": {
"upgrade": "Upgraden",
+3 -1
View File
@@ -19,7 +19,9 @@
"rpm": "RPM",
"ppm": "ppm",
"byte": "байт",
"mbyte": "мбайт"
"mbyte": "мбайт",
"liter": "Л.",
"gallon": "гал."
},
"button": {
"upgrade": "Обновить",
+31 -3
View File
@@ -351,9 +351,14 @@
value = -(step);
}
newSettings[purpose].target = parseFloat(constrain(newSettings[purpose].target + value, minTemp, maxTemp).toFixed(2));
const newValue = parseFloat(constrain(newSettings[purpose].target + value, minTemp, maxTemp).toFixed(2));
if (newSettings[purpose].target != newValue) {
newSettings[purpose].target = newValue;
modifiedTime = Date.now();
setValue('.targetTemp', newSettings[purpose].target, tContainer);
setValue('.targetTemp', newValue, tContainer);
tContainer.querySelector('.thermostat-header').setAttribute("aria-busy", "true");
}
}
});
}
@@ -383,27 +388,46 @@
value = -(bigStep);
}
newSettings[purpose].target = parseFloat(constrain(newSettings[purpose].target + value, minTemp, maxTemp).toFixed(2));
const newValue = parseFloat(constrain(newSettings[purpose].target + value, minTemp, maxTemp).toFixed(2));
if (newSettings[purpose].target != newValue) {
newSettings[purpose].target = newValue;
modifiedTime = Date.now();
setValue('.targetTemp', newSettings[purpose].target, tContainer);
tContainer.querySelector('.thermostat-header').setAttribute("aria-busy", "true");
}
}, 500);
});
});
document.querySelector('#tHeatEnabled').addEventListener('change', (event) => {
if (newSettings.heating.enabled == event.currentTarget.checked) {
return;
}
modifiedTime = Date.now();
newSettings.heating.enabled = event.currentTarget.checked;
document.querySelector('.tHeat .thermostat-header').setAttribute("aria-busy", "true");
});
document.querySelector('#tHeatTurbo').addEventListener('change', (event) => {
if (newSettings.heating.turbo == event.currentTarget.checked) {
return;
}
modifiedTime = Date.now();
newSettings.heating.turbo = event.currentTarget.checked;
document.querySelector('.tHeat .thermostat-header').setAttribute("aria-busy", "true");
});
document.querySelector('#tDhwEnabled').addEventListener('change', (event) => {
if (newSettings.dhw.enabled == event.currentTarget.checked) {
return;
}
modifiedTime = Date.now();
newSettings.dhw.enabled = event.currentTarget.checked;
document.querySelector('.tDhw .thermostat-header').setAttribute("aria-busy", "true");
});
document.querySelector('.notify-fault .reset').addEventListener('click', async (event) => {
@@ -531,6 +555,10 @@
setValue('.pressureUnit', pressureUnit(unitSystem));
setValue('.volumeUnit', volumeUnit(unitSystem));
document.querySelectorAll('.thermostat-header').forEach((item) => {
item.setAttribute("aria-busy", "false");
});
} catch (error) {
console.log(error);
}
+1 -1
View File
@@ -807,7 +807,7 @@
<label>
<input type="checkbox" name="externalPump[invertState]" value="true">
<span data-i18n>settings.externalPump.invertState</span>
<span data-i18n>settings.extPump.invertState</span>
</label>
</fieldset>
+39 -4
View File
@@ -318,7 +318,7 @@ const setupRestoreBackupForm = (formSelector) => {
console.log("Backup: ", data);
if (data.settings != undefined) {
for (var key in data.settings) {
for (const key in data.settings) {
let response = await fetch(url, {
method: "POST",
cache: "no-cache",
@@ -338,6 +338,41 @@ const setupRestoreBackupForm = (formSelector) => {
return;
}
}
let finalPayload = {};
if (data.settings.emergency?.target !== undefined) {
finalPayload.emergency ??= {};
finalPayload.emergency.target = data.settings.emergency.target;
}
if (data.settings.heating?.target !== undefined) {
finalPayload.heating ??= {};
finalPayload.heating.target = data.settings.heating.target;
}
if (data.settings.dhw?.target !== undefined) {
finalPayload.dhw ??= {};
finalPayload.dhw.target = data.settings.dhw.target;
}
if (Object.keys(finalPayload).length) {
let response = await fetch(url, {
method: "POST",
cache: "no-cache",
credentials: "include",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"settings": finalPayload
})
});
if (!response.ok) {
onFailed();
return;
}
}
}
if (data.sensors != undefined) {
@@ -765,8 +800,8 @@ const pressureUnit = (unitSystem) => {
const volumeUnit = (unitSystem) => {
return unit2str(unitSystem, {
0: "L",
1: "gal"
0: i18n('units.liter'),
1: i18n('units.gallon')
});
}
@@ -780,7 +815,7 @@ const purposeUnit = (purpose, unitSystem) => {
3: tUnit,
4: tUnit,
5: tUnit,
6: `${volumeUnit(unitSystem)}/${i18n('time.min')}`,
6: `${volumeUnit(unitSystem)}/${i18n('units.min')}`,
7: tUnit,
8: "%",
248: "%",