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 = () => { ) : ( - + <> + + + ))} - ); 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