diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md
index a1950a3c9..5b61be991 100644
--- a/CHANGELOG_LATEST.md
+++ b/CHANGELOG_LATEST.md
@@ -22,7 +22,7 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/).
- Internal sensors of E32V2_2
- FW200 display options [#2610](https://github.com/emsesp/EMS-ESP32/discussions/2610)
- CR11 mode settings OFF/MANUAL depends on selTemp [#2437](https://github.com/emsesp/EMS-ESP32/issues/2437)
-- Fuse settings for BBQKees boards
+- implemented eFuse settings for BBQKees boards to store model type and ESP chipset
- Analogsensors for pulse output [#2624](https://github.com/emsesp/EMS-ESP32/discussions/2624)
- Analogsensors frequency input [#2631](https://github.com/emsesp/EMS-ESP32/discussions/2631)
- SRC plus thermostats [#2636](https://github.com/emsesp/EMS-ESP32/issues/2636)
@@ -65,4 +65,4 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/).
- internal system analog sensors (core_voltage, supply_voltage and gateway_temperature) cannot be accidentally removed
- double click button reconnects EMS-ESP to AP
- place system message command in side scheduler loop to reduce stack memory usage by 2KB
-- syslog mark interval up to 1 hour [#2733](https://github.com/emsesp/EMS-ESP32/issues/2733)
+- syslog mark interval set to 1 hour
diff --git a/interface/src/app/main/Customizations.tsx b/interface/src/app/main/Customizations.tsx
index 2b85bf26f..bc1743b5f 100644
--- a/interface/src/app/main/Customizations.tsx
+++ b/interface/src/app/main/Customizations.tsx
@@ -512,22 +512,24 @@ const Customizations = () => {
>
) : (
- }
- variant="outlined"
- onClick={() => setRename(true)}
- >
- {LL.RENAME()}
-
+ <>
+ }
+ variant="outlined"
+ onClick={() => setRename(true)}
+ >
+ {LL.RENAME()}
+
+ }
+ variant="outlined"
+ color="error"
+ onClick={() => setConfirmReset(true)}
+ >
+ {LL.REMOVE_ALL()}
+
+ >
))}
- }
- variant="outlined"
- color="error"
- onClick={() => setConfirmReset(true)}
- >
- {LL.REMOVE_ALL()}
-
>
);
diff --git a/interface/src/app/main/UserProfile.tsx b/interface/src/app/main/UserProfile.tsx
index 73338975d..87d86146a 100644
--- a/interface/src/app/main/UserProfile.tsx
+++ b/interface/src/app/main/UserProfile.tsx
@@ -1,7 +1,16 @@
import { memo, useCallback, useContext } from 'react';
import PersonIcon from '@mui/icons-material/Person';
-import { Avatar, Box, Button, List, ListItem, ListItemText } from '@mui/material';
+import {
+ Avatar,
+ Box,
+ Button,
+ Divider,
+ List,
+ ListItem,
+ ListItemText,
+ Typography
+} from '@mui/material';
import { AuthenticatedContext } from '@/contexts/authentication';
import { SectionContent, useLayoutTitle } from 'components';
@@ -12,7 +21,7 @@ const UserProfileComponent = () => {
const { LL } = useI18nContext();
const { me, signOut } = useContext(AuthenticatedContext);
- useLayoutTitle(LL.USER(1));
+ useLayoutTitle(LL.USER_PROFILE());
const handleSignOut = useCallback(() => {
signOut(true);
@@ -20,32 +29,33 @@ const UserProfileComponent = () => {
return (
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+ {LL.LANGUAGE()}:
+
+
+
+
);
};
diff --git a/interface/src/app/status/Version.tsx b/interface/src/app/status/Version.tsx
index 34d2430da..85b4098ec 100644
--- a/interface/src/app/status/Version.tsx
+++ b/interface/src/app/status/Version.tsx
@@ -284,7 +284,6 @@ const Version = () => {
const [downloadOnly, setDownloadOnly] = useState(false);
const [showVersionInfo, setShowVersionInfo] = useState(0);
- // API calls with optimized error handling
const { send: sendCheckUpgrade } = useRequest(
(versions: string) => callAction({ action: 'checkUpgrade', param: versions }),
{ immediate: false }
diff --git a/interface/src/components/index.ts b/interface/src/components/index.ts
index 74de4154b..ed2ffc878 100644
--- a/interface/src/components/index.ts
+++ b/interface/src/components/index.ts
@@ -1,4 +1,4 @@
-// Optimized exports - use direct exports to reduce bundle size
+// use direct exports to reduce bundle size
export { default as SectionContent } from './SectionContent';
export { default as ButtonRow } from './ButtonRow';
export { default as MessageBox } from './MessageBox';
diff --git a/interface/src/i18n/cz/index.ts b/interface/src/i18n/cz/index.ts
index 0d608b341..61b156e6c 100644
--- a/interface/src/i18n/cz/index.ts
+++ b/interface/src/i18n/cz/index.ts
@@ -355,7 +355,8 @@ const cz: Translation = {
INTERNET_CONNECTION_REQUIRED: 'Pro automatickou kontrolu a instalaci aktualizací je třeba internetové připojení',
SWITCH_RELEASE_TYPE: 'Přepnout na {0} verzi',
FIRMWARE_VERSION_INFO: 'Informace o verzi firmwaru',
- NO_DATA: 'Žádná data'
+ NO_DATA: 'Žádná data',
+ USER_PROFILE: 'Uživatelský profil'
};
export default cz;
diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts
index 694082bed..cb481cb0e 100644
--- a/interface/src/i18n/de/index.ts
+++ b/interface/src/i18n/de/index.ts
@@ -40,7 +40,7 @@ const de: Translation = {
RUN_COMMAND: 'Befehl ausführen',
CHANGE_VALUE: 'Wert ändern',
CANCEL: 'Abbrechen',
- REMOVE_ALL: 'Entfernen alles',
+ REMOVE_ALL: 'Alles entfernen',
APPLY_CHANGES: 'Änderungen anwenden ({0})',
UPDATE: 'Aktualisieren',
EXECUTE: 'Ausführen',
@@ -355,7 +355,8 @@ const de: Translation = {
INTERNET_CONNECTION_REQUIRED: 'Für die automatische Versionsprüfung und Aktualisierung ist eine Internetverbindung erforderlich',
SWITCH_RELEASE_TYPE: 'Zum {0}-Release wechseln',
FIRMWARE_VERSION_INFO: 'Firmware-Versionsinformation',
- NO_DATA: 'Keine Daten'
+ NO_DATA: 'Keine Daten',
+ USER_PROFILE: 'Benutzerprofil'
};
export default de;
diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts
index bea5c14d6..81f07294d 100644
--- a/interface/src/i18n/en/index.ts
+++ b/interface/src/i18n/en/index.ts
@@ -355,7 +355,8 @@ const en: Translation = {
INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading',
SWITCH_RELEASE_TYPE: 'Switch to {0} release',
FIRMWARE_VERSION_INFO: 'Firmware Version Information',
- NO_DATA: 'No data'
+ NO_DATA: 'No data',
+ USER_PROFILE: 'User Profile'
};
export default en;
diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts
index c748210e6..cda12b9f0 100644
--- a/interface/src/i18n/fr/index.ts
+++ b/interface/src/i18n/fr/index.ts
@@ -355,7 +355,8 @@ const fr: Translation = {
INTERNET_CONNECTION_REQUIRED: 'Connexion Internet requise pour la vérification automatique des versions et la mise à niveau',
SWITCH_RELEASE_TYPE: 'Passer à la version {0}',
FIRMWARE_VERSION_INFO: 'Informations sur la version du firmware',
- NO_DATA: 'Aucune donnée'
+ NO_DATA: 'Aucune donnée',
+ USER_PROFILE: 'Profil utilisateur'
};
export default fr;
diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts
index 3bf46414b..44cf4f9b6 100644
--- a/interface/src/i18n/it/index.ts
+++ b/interface/src/i18n/it/index.ts
@@ -47,7 +47,7 @@ const it: Translation = {
REMOVE: 'Elimina',
PROBLEM_UPDATING: 'Problema aggiornamento',
PROBLEM_LOADING: 'Problema caricamento',
- ANALOG_SENSOR: 'Sensore Analogico',
+ ANALOG_SENSOR: 'Sensore Analogico',
ANALOG_SENSORS: 'Sensori Analogici',
SETTINGS: 'Settings',
UPDATED_OF: '{0} Aggiornati',
@@ -355,7 +355,8 @@ const it: Translation = {
INTERNET_CONNECTION_REQUIRED: 'Connessione internet richiesta per il controllo automatico delle versioni e l\'aggiornamento',
SWITCH_RELEASE_TYPE: 'Cambia in {0} rilascio',
FIRMWARE_VERSION_INFO: 'Informazioni sulla versione del firmware',
- NO_DATA: 'Nessun dato'
+ NO_DATA: 'Nessun dato',
+ USER_PROFILE: 'Profilo utente'
};
export default it;
diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts
index c08c07556..affdddfe2 100644
--- a/interface/src/i18n/nl/index.ts
+++ b/interface/src/i18n/nl/index.ts
@@ -355,7 +355,8 @@ const nl: Translation = {
INTERNET_CONNECTION_REQUIRED: 'Internetverbinding vereist voor automatische versiecontrole en -upgrade',
SWITCH_RELEASE_TYPE: 'Switch naar {0} release',
FIRMWARE_VERSION_INFO: 'Informatie over firmwareversie',
- NO_DATA: 'Geen data'
+ NO_DATA: 'Geen data',
+ USER_PROFILE: 'Gebruikersprofiel'
};
export default nl;
\ No newline at end of file
diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts
index 33de1411f..0c1e88133 100644
--- a/interface/src/i18n/no/index.ts
+++ b/interface/src/i18n/no/index.ts
@@ -355,7 +355,8 @@ const no: Translation = {
INTERNET_CONNECTION_REQUIRED: 'Internettilkobling kreves for automatisk versjonskontroll og oppgradering',
SWITCH_RELEASE_TYPE: 'Bytt til {0} utgivelse',
FIRMWARE_VERSION_INFO: 'Informasjon om firmwareversjon',
- NO_DATA: 'Ingen data'
+ NO_DATA: 'Ingen data',
+ USER_PROFILE: 'Brukerprofil'
};
export default no;
diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts
index 5eefe411f..bbc90b380 100644
--- a/interface/src/i18n/pl/index.ts
+++ b/interface/src/i18n/pl/index.ts
@@ -355,7 +355,8 @@ const pl: BaseTranslation = {
INTERNET_CONNECTION_REQUIRED: 'Połączenie internetowe jest wymagane do automatycznej kontroli wersji i aktualizacji',
SWITCH_RELEASE_TYPE: 'Zmień na {0} wydanie',
FIRMWARE_VERSION_INFO: 'Informacje o wersji firmware',
- NO_DATA: 'Brak danych'
+ NO_DATA: 'Brak danych',
+ USER_PROFILE: 'Profil użytkownika'
};
export default pl;
diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts
index 2177ddc8c..aa22a83cb 100644
--- a/interface/src/i18n/sk/index.ts
+++ b/interface/src/i18n/sk/index.ts
@@ -355,7 +355,8 @@ const sk: Translation = {
INTERNET_CONNECTION_REQUIRED: 'Internetové pripojenie je potrebné pre automatickú kontrolu a aktualizáciu',
SWITCH_RELEASE_TYPE: 'Prepnúť na {0} verziu',
FIRMWARE_VERSION_INFO: 'Informácie o verzii firmware',
- NO_DATA: 'Žiadne dáta'
+ NO_DATA: 'Žiadne dáta',
+ USER_PROFILE: 'Profil používateľa'
};
export default sk;
diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts
index 9730fe5e1..9a07450b8 100644
--- a/interface/src/i18n/sv/index.ts
+++ b/interface/src/i18n/sv/index.ts
@@ -355,7 +355,8 @@ const sv: Translation = {
INTERNET_CONNECTION_REQUIRED: 'Internetanslutning krävs för automatisk version kontroll och uppdatering',
SWITCH_RELEASE_TYPE: 'Byt till {0} utgåva',
FIRMWARE_VERSION_INFO: 'Information om firmwareversion',
- NO_DATA: 'Ingen data'
+ NO_DATA: 'Ingen data',
+ USER_PROFILE: 'Användarprofil'
};
export default sv;
diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts
index 9f6068a2c..e212ea274 100644
--- a/interface/src/i18n/tr/index.ts
+++ b/interface/src/i18n/tr/index.ts
@@ -355,7 +355,8 @@ const tr: Translation = {
INTERNET_CONNECTION_REQUIRED: 'Otomatik sürüm kontrolü ve güncelleme için internet bağlantısı gereklidir',
SWITCH_RELEASE_TYPE: '{0} sürümüne geç',
FIRMWARE_VERSION_INFO: 'Firmware Sürüm Bilgisi',
- NO_DATA: 'Hiçbir veri yok'
+ NO_DATA: 'Hiçbir veri yok',
+ USER_PROFILE: 'Kullanıcı Profili'
};
export default tr;
diff --git a/interface/src/utils/binding.ts b/interface/src/utils/binding.ts
index d5c0bb4a3..75cacaaa3 100644
--- a/interface/src/utils/binding.ts
+++ b/interface/src/utils/binding.ts
@@ -11,9 +11,29 @@ export const numberValue = (value?: number): string =>
export const extractEventValue = (
event: React.ChangeEvent
): string | number | boolean => {
- const { type, valueAsNumber, checked, value } = event.target;
+ const { type, checked, value } = event.target;
- if (type === 'number') return valueAsNumber;
+ if (type === 'number') {
+ if (value === '') return NaN;
+
+ const normalizedValue = value.replace(',', '.');
+
+ // For incomplete number entries, keep the raw string to allow smooth typing
+ // This includes: "0.", "1.0", "0.00", "-", "-.", "-.5", etc.
+ const endsWithDecimalAndZeros = /\.\d*0$/.test(normalizedValue);
+ const isIncomplete =
+ normalizedValue.endsWith('.') ||
+ normalizedValue === '-' ||
+ normalizedValue === '-.' ||
+ endsWithDecimalAndZeros;
+
+ if (isIncomplete) {
+ return normalizedValue;
+ }
+
+ const parsedValue = parseFloat(normalizedValue);
+ return parsedValue;
+ }
if (type === 'checkbox') return checked;
return value;
};
diff --git a/mock-api/mockServer.js b/mock-api/mockServer.js
index ef1e82845..2987ac012 100644
--- a/mock-api/mockServer.js
+++ b/mock-api/mockServer.js
@@ -7,7 +7,7 @@ const VALID_EXTENSIONS = new Set(['bin', 'json', 'md5']);
const ONE_SECOND_MS = 1000;
const TEN_PERCENT = 10;
-// Optimized padding function
+// padding function
const pad = (number) => String(number).padStart(2, '0');
// Simple throttle helper (time-based)
diff --git a/mock-api/restServer.ts b/mock-api/restServer.ts
index d87bb794c..eb8f18acb 100644
--- a/mock-api/restServer.ts
+++ b/mock-api/restServer.ts
@@ -276,10 +276,10 @@ function updateMask(entity: any, de: any, dd: any) {
const old_custom_name = dd.nodes[dd_objIndex].cn;
console.log(
'comparing names, old (' +
- old_custom_name +
- ') with new (' +
- new_custom_name +
- ')'
+ old_custom_name +
+ ') with new (' +
+ new_custom_name +
+ ')'
);
if (old_custom_name !== new_custom_name) {
changed = true;
@@ -375,15 +375,15 @@ function check_upgrade(version: string) {
console.log(
'Upgrade this version (' +
- THIS_VERSION +
- ') to dev (' +
- dev_version +
- ') is ' +
- (DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') +
- ' and to stable (' +
- stable_version +
- ') is ' +
- (STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO')
+ THIS_VERSION +
+ ') to dev (' +
+ dev_version +
+ ') is ' +
+ (DEV_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO') +
+ ' and to stable (' +
+ stable_version +
+ ') is ' +
+ (STABLE_VERSION_IS_UPGRADEABLE ? 'YES' : 'NO')
);
data = {
emsesp_version: THIS_VERSION,
@@ -4559,8 +4559,8 @@ router
let dashboard_object: { id?: number; n?: string; t?: number; nodes?: any[] } =
{};
- // let fake = false;
- let fake = true; // toggle for testing, shows a subset of data
+ let fake = false;
+ // let fake = true; // toggle for testing, shows a subset of data
if (!fake) {
// pick EMS devices from coredata
diff --git a/project-words.txt b/project-words.txt
index f5d4b01b6..b9eb064f1 100644
--- a/project-words.txt
+++ b/project-words.txt
@@ -1436,4 +1436,10 @@ washingmachine
switchprogram
brotlin
fanspd
-currhum
\ No newline at end of file
+currhum
+pumpstep
+constmed
+constlow
+proplow
+chimneysweeper
+
\ No newline at end of file