mirror of
https://github.com/Laxilef/OTGateway.git
synced 2026-05-20 08:18:15 +05:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| a4ca20f9a9 | |||
| f5e08f20a2 | |||
| 07650b4878 | |||
| ffcacb3d48 |
@@ -19,7 +19,9 @@
|
||||
"rpm": "RPM",
|
||||
"ppm": "ppm",
|
||||
"byte": "byte",
|
||||
"mbyte": "MB"
|
||||
"mbyte": "MB",
|
||||
"liter": "升",
|
||||
"gallon": "加仑"
|
||||
},
|
||||
"button": {
|
||||
"upgrade": "固件升级",
|
||||
|
||||
@@ -19,7 +19,9 @@
|
||||
"rpm": "RPM",
|
||||
"ppm": "ppm",
|
||||
"byte": "byte",
|
||||
"mbyte": "MB"
|
||||
"mbyte": "MB",
|
||||
"liter": "L",
|
||||
"gallon": "gal"
|
||||
},
|
||||
"button": {
|
||||
"upgrade": "Upgrade",
|
||||
|
||||
@@ -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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,9 @@
|
||||
"rpm": "RPM",
|
||||
"ppm": "ppm",
|
||||
"byte": "byte",
|
||||
"mbyte": "MB"
|
||||
"mbyte": "MB",
|
||||
"liter": "litro",
|
||||
"gallon": "gal"
|
||||
},
|
||||
"button": {
|
||||
"upgrade": "Aggiorna",
|
||||
|
||||
@@ -19,7 +19,9 @@
|
||||
"rpm": "RPM",
|
||||
"ppm": "ppm",
|
||||
"byte": "byte",
|
||||
"mbyte": "MB"
|
||||
"mbyte": "MB",
|
||||
"liter": "L",
|
||||
"gallon": "gal"
|
||||
},
|
||||
"button": {
|
||||
"upgrade": "Upgraden",
|
||||
|
||||
@@ -19,7 +19,9 @@
|
||||
"rpm": "RPM",
|
||||
"ppm": "ppm",
|
||||
"byte": "байт",
|
||||
"mbyte": "мбайт"
|
||||
"mbyte": "мбайт",
|
||||
"liter": "Л.",
|
||||
"gallon": "гал."
|
||||
},
|
||||
"button": {
|
||||
"upgrade": "Обновить",
|
||||
|
||||
@@ -351,9 +351,14 @@
|
||||
value = -(step);
|
||||
}
|
||||
|
||||
newSettings[purpose].target = parseFloat(constrain(newSettings[purpose].target + value, minTemp, maxTemp).toFixed(2));
|
||||
modifiedTime = Date.now();
|
||||
setValue('.targetTemp', newSettings[purpose].target, tContainer);
|
||||
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', 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));
|
||||
modifiedTime = Date.now();
|
||||
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', 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);
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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: "%",
|
||||
|
||||
Reference in New Issue
Block a user