From fe50c9f6d0f69ea8375925042db9d26d1104174b Mon Sep 17 00:00:00 2001 From: proddy Date: Thu, 29 Aug 2024 13:51:17 +0200 Subject: [PATCH] autodetect, download and install firmware upgrades --- CHANGELOG_LATEST.md | 3 +- interface/src/api/system.ts | 3 + interface/src/app/settings/DownloadUpload.tsx | 199 +++++++++++------- interface/src/i18n/de/index.ts | 18 +- interface/src/i18n/en/index.ts | 16 +- interface/src/i18n/fr/index.ts | 16 +- interface/src/i18n/it/index.ts | 16 +- interface/src/i18n/nl/index.ts | 16 +- interface/src/i18n/no/index.ts | 16 +- interface/src/i18n/pl/index.ts | 16 +- interface/src/i18n/sk/index.ts | 16 +- interface/src/i18n/sv/index.ts | 16 +- interface/src/i18n/tr/index.ts | 16 +- interface/src/types/system.ts | 2 +- mock-api/rest_server.ts | 20 +- src/version.h | 2 +- src/web/WebStatusService.cpp | 68 +++--- src/web/WebStatusService.h | 8 +- 18 files changed, 290 insertions(+), 177 deletions(-) diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index b43cc5c6b..5a5e0a2bb 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -5,7 +5,7 @@ ## **IMPORTANT! BREAKING CHANGES with 3.6.5** - new device WATER shows dhw entities from MM100 and SM100 in dhw setting -- renamed WWC to DHW, always create DHW nests/topics, remove ww prefix from mqtt names [#1634](https://github.com/emsesp/EMS-ESP32/issues/1634). To preserve current value of dhw energy (nrgww), follow ([#1938]https://github.com/emsesp/EMS-ESP32/issues/1938) +- renamed WWC to DHW, always create DHW nests/topics, remove ww prefix from mqtt names [#1634](https://github.com/emsesp/EMS-ESP32/issues/1634). To preserve current value of dhw energy (nrgww), follow ([#1938]) - change temperaturesensor id to underscore - system/info API command has it's JSON keys and names changed to camelCase @@ -35,6 +35,7 @@ - RC310 cooling parameters [#1857](https://github.com/emsesp/EMS-ESP32/issues/1857) - command `api/device/entities` [#1897](https://github.com/emsesp/EMS-ESP32/issues/1897) - switchprogmode [#1903] +- Autodetect and download firmware upgrades ## Fixed diff --git a/interface/src/api/system.ts b/interface/src/api/system.ts index ce380e8b8..a9749e7e9 100644 --- a/interface/src/api/system.ts +++ b/interface/src/api/system.ts @@ -48,3 +48,6 @@ export const uploadFile = (file: File) => { export const uploadURL = (data: { url: string }) => alovaInstance.Post('/rest/uploadURL', data); + +export const checkUpgrade = (data: { version: string }) => + alovaInstance.Post('/rest/checkUpgrade', data); diff --git a/interface/src/app/settings/DownloadUpload.tsx b/interface/src/app/settings/DownloadUpload.tsx index 058ec7ebc..a195049d2 100644 --- a/interface/src/app/settings/DownloadUpload.tsx +++ b/interface/src/app/settings/DownloadUpload.tsx @@ -1,10 +1,21 @@ import { useState } from 'react'; import { toast } from 'react-toastify'; +import CancelIcon from '@mui/icons-material/Cancel'; import DownloadIcon from '@mui/icons-material/GetApp'; +import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; import WarningIcon from '@mui/icons-material/Warning'; -import { Box, Button, Divider, Link, Typography } from '@mui/material'; +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Link, + Typography +} from '@mui/material'; import * as SystemApi from 'api/system'; import { @@ -14,7 +25,7 @@ import { getSchedule, getSettings } from 'api/app'; -import { getDevVersion, getStableVersion } from 'api/system'; +import { checkUpgrade, getDevVersion, getStableVersion } from 'api/system'; import { dialogStyle } from 'CustomTheme'; import { useRequest } from 'alova/client'; @@ -34,6 +45,9 @@ const DownloadUpload = () => { const [restarting, setRestarting] = useState(false); const [restartNeeded, setRestartNeeded] = useState(false); + const [openDialog, setOpenDialog] = useState(false); + const [useDev, setUseDev] = useState(false); + const [upgradeAvailable, setUpgradeAvailable] = useState(false); const { send: sendSettings } = useRequest(getSettings(), { immediate: false @@ -95,20 +109,24 @@ const DownloadUpload = () => { }); }; + const { send: sendCheckUpgrade } = useRequest(checkUpgrade, { + immediate: false + }).onSuccess((event) => { + setUpgradeAvailable(event.data.upgradeable); + }); + // called immediately to get the latest version, on page load const { data: latestVersion } = useRequest(getStableVersion, { - immediate: true - // uncomment for testing - // https://github.com/emsesp/EMS-ESP32/releases/download/v3.6.5/EMS-ESP-3_6_5-ESP32-16MB+.bin + // uncomment next 2 lines for testing, uses https://github.com/emsesp/EMS-ESP32/releases/download/v3.6.5/EMS-ESP-3_6_5-ESP32-16MB+.bin // immediate: false, // initialData: '3.6.5' }); const { data: latestDevVersion } = useRequest(getDevVersion, { - immediate: true - // uncomment for testing - // https://github.com/emsesp/EMS-ESP32/releases/download/latest/EMS-ESP-3_7_0-dev_31-ESP32-16MB+.bin + // uncomment next 2 lines for testing, uses https://github.com/emsesp/EMS-ESP32/releases/download/latest/EMS-ESP-3_7_0-dev_31-ESP32-16MB+.bin // immediate: false, - // initialData: '3.7.0-dev.31' + // initialData: '3.7.0-dev.32' + }).onSuccess((event) => { + void sendCheckUpgrade({ version: event.data }); }); const STABLE_URL = 'https://github.com/emsesp/EMS-ESP32/releases/download/'; @@ -119,8 +137,17 @@ const DownloadUpload = () => { const DEV_RELNOTES_URL = 'https://github.com/emsesp/EMS-ESP32/blob/dev/CHANGELOG_LATEST.md'; - const getBinURL = (v: string) => - 'EMS-ESP-' + v.replaceAll('.', '_') + '-' + getPlatform() + '.bin'; + const getBinURL = (useDev: boolean) => { + const filename = + 'EMS-ESP-' + + (useDev ? latestDevVersion : latestVersion).replaceAll('.', '_') + + '-' + + getPlatform() + + '.bin'; + return useDev + ? DEV_URL + filename + : STABLE_URL + 'v' + latestVersion + '/' + filename; + }; const getPlatform = () => { return ( @@ -181,11 +208,72 @@ const DownloadUpload = () => { useLayoutTitle(LL.DOWNLOAD_UPLOAD()); + const renderUploadDialog = () => { + if (latestDevVersion === undefined || latestVersion === undefined) { + return null; + } + return ( + setOpenDialog(false)} + > + + {LL.INSTALL('') + + ' ' + + (useDev ? LL.DEVELOPMENT() : LL.STABLE()) + + ' Firmware'} + + + + {LL.INSTALL_VERSION(useDev ? latestDevVersion : latestVersion)} + + + {LL.RELEASE_NOTES()} + +  |  + + {LL.DOWNLOAD(1)} + + + + + + + + ); + }; + + const showFirmwareDialog = (useDev: boolean) => { + setUseDev(useDev); + setOpenDialog(true); + }; + const content = () => { if (!data) { return ; } + const isDev = data.emsesp_version.includes('dev'); + return ( <> @@ -274,76 +362,49 @@ const DownloadUpload = () => { - {LL.VERSION_ON() + ' '} - {data.emsesp_version} ({getPlatform()}) - - {latestVersion && ( - - {LL.THE_LATEST()} {LL.OFFICIAL()} {LL.RELEASE_IS()} -  {latestVersion} -  ( - - {LL.RELEASE_NOTES()} - - ) ( - - {LL.DOWNLOAD(1)} - - ) + + {LL.VERSION() + ':'} {data.emsesp_version} + {data.build_flags && ( + +   ({data.build_flags}) + + )} + + + Platform: {getPlatform()} + + + Release: {isDev ? LL.DEVELOPMENT() : LL.STABLE()} + {!isDev && ( - - )} - {latestDevVersion && ( - - {LL.THE_LATEST()} {LL.DEVELOPMENT()} {LL.RELEASE_IS()} -   - {latestDevVersion} -  ( - - {LL.RELEASE_NOTES()} - - ) ( - - {LL.DOWNLOAD(1)} - - ) + )} + + {upgradeAvailable ? ( + + +   {LL.UPGRADE_AVAILABLE()} - + + ) : ( + {LL.LATEST_VERSION()} )} + {renderUploadDialog()} @@ -374,11 +435,7 @@ const DownloadUpload = () => { return ( - {restarting ? ( - - ) : ( - content() - )} + {restarting ? : content()} ); }; diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index aca27cd43..a71224853 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -145,7 +145,7 @@ const de: Translation = { CUSTOMIZATIONS_HELP_1: 'Wählen Sie ein Gerät aus und passen Sie die Entitäten mithilfe der Optionen an', CUSTOMIZATIONS_HELP_2: 'Als Favorit markieren', CUSTOMIZATIONS_HELP_3: 'Schreibaktion deaktivieren', - CUSTOMIZATIONS_HELP_4: 'von MQTT und API ausschließen', + CUSTOMIZATIONS_HELP_4: 'Von MQTT und API ausschließen', CUSTOMIZATIONS_HELP_5: 'Aus dem Kontrollzentrum ausblenden', CUSTOMIZATIONS_HELP_6: 'Aus dem Speicher löschen', SELECT_DEVICE: 'Wählen Sie ein Gerät aus', @@ -161,7 +161,7 @@ const de: Translation = { HELP_INFORMATION_5: 'EMS-ESP ist ein freies Open-Source Projekt. Bitte unterstützen Sie die zukünftige Entwicklung mit einem "Star" auf GitHub!', UPLOAD: 'Hochladen', DOWNLOAD: '{{H|h|h}}erunterladen', - INSTALL: 'Installieren', + INSTALL: 'Installieren {0}', ABORTED: 'abgebrochen', FAILED: 'gescheitert', SUCCESSFUL: 'erfolgreich', @@ -169,16 +169,13 @@ const de: Translation = { LOG_OF: '{0}protokoll', STATUS_OF: '{0} Status', DOWNLOAD_UPLOAD: 'Herunterladen/Hochladen', - VERSION_ON: 'Sie verwenden derzeit', CLOSE: 'Schließen', USE: 'Verwenden Sie', FACTORY_RESET: 'Werkseinstellung', SYSTEM_FACTORY_TEXT: 'EMS-ESP wurde auf Werkseinstellung gesetzt und startet als Zugangspunkt neu', SYSTEM_FACTORY_TEXT_DIALOG: 'Sind Sie sicher alle Einstellungen auf Werkseinstellung zu setzen?', - THE_LATEST: 'Die neueste', - OFFICIAL: 'offizielle', + STABLE: 'Stable', // TODO translate DEVELOPMENT: 'Entwicklungs', - RELEASE_IS: 'Release ist', RELEASE_NOTES: 'Versionshinweise', EMS_ESP_VER: 'EMS-ESP Version', UPTIME: 'System Betriebszeit', @@ -333,9 +330,14 @@ const de: Translation = { ENABLE_MODBUS: 'Modbus aktivieren', VIEW_LOG: 'Sehen Sie sich das Protokoll an, um Probleme zu diagnostizieren', UPLOAD_DRAG: 'Ziehen Sie eine Datei hierher oder klicken Sie, um eine auszuwählen', - SERVICES: 'Dienstleistungen', + SERVICES: 'Dienste', ALLVALUES: 'Alle Werte', - SPECIAL_FUNCTIONS: 'Special Functions' // TODO translate + SPECIAL_FUNCTIONS: 'Sonderfunktionen', + WAIT_FIRMWARE: 'Please wait while the firmware is being uploaded. The device will restart automatically.', // TODO translate + INSTALL_VERSION: 'This will install vesion {0}. Are you sure?', // TODO translate + SWITCH_DEV: 'Switch to development version', // TODO translate + UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate + LATEST_VERSION: 'You are using the latest version.' // TODO translate }; export default de; diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index 196b3da34..ac069aab2 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -161,7 +161,7 @@ const en: Translation = { HELP_INFORMATION_5: 'EMS-ESP is a free and open-source project. Please support its future development by giving it a star on GitHub!', UPLOAD: 'Upload', DOWNLOAD: '{{D|d|d}}ownload', - INSTALL: 'Install', + INSTALL: 'Install {0}', ABORTED: 'aborted', FAILED: 'failed', SUCCESSFUL: 'successful', @@ -169,16 +169,13 @@ const en: Translation = { LOG_OF: '{0} Log', STATUS_OF: '{0} Status', DOWNLOAD_UPLOAD: 'Download/Upload', - VERSION_ON: 'You are currently on version', CLOSE: 'Close', USE: 'Use', FACTORY_RESET: 'Factory Reset', SYSTEM_FACTORY_TEXT: 'Device has been factory reset and will now restart', SYSTEM_FACTORY_TEXT_DIALOG: 'Are you sure you want to reset EMS-ESP to its factory defaults?', - THE_LATEST: 'The latest', - OFFICIAL: 'official', - DEVELOPMENT: 'development', - RELEASE_IS: 'release is', + STABLE: 'Stable', + DEVELOPMENT: 'Development', RELEASE_NOTES: 'release notes', EMS_ESP_VER: 'EMS-ESP Version', UPTIME: 'System Uptime', @@ -335,7 +332,12 @@ const en: Translation = { UPLOAD_DRAG: 'drag and drop a file here or click to select one', SERVICES: 'Services', ALLVALUES: 'All Values', - SPECIAL_FUNCTIONS: 'Special Functions' + SPECIAL_FUNCTIONS: 'Special Functions', + WAIT_FIRMWARE: 'Please wait while the firmware is being uploaded. The device will restart automatically.', // TODO translate + INSTALL_VERSION: 'This will install vesion {0}. Are you sure?', // TODO translate + SWITCH_DEV: 'Switch to development version', // TODO translate + UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate + LATEST_VERSION: 'You are using the latest version.' // TODO translate }; export default en; diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index 6fee7f0a5..cd614e02c 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -161,7 +161,7 @@ const fr: Translation = { HELP_INFORMATION_5: 'EMS-ESP est un projet libre et open-source. Merci de soutenir son développement futur en lui donnant une étoile sur GitHub !', UPLOAD: 'Upload', DOWNLOAD: '{{D|d|d}}ownload', - INSTALL: 'Installer', + INSTALL: 'Installer {0}', ABORTED: 'annulé', FAILED: 'échoué', SUCCESSFUL: 'réussi', @@ -169,16 +169,13 @@ const fr: Translation = { LOG_OF: '{0} Log', STATUS_OF: 'Statut {0}', DOWNLOAD_UPLOAD: 'Download/Upload', // TODO translate - VERSION_ON: 'You are currently on', // TODO translate CLOSE: 'Fermer', USE: 'Utiliser', FACTORY_RESET: 'Réinitialisation', SYSTEM_FACTORY_TEXT: "L'appareil a été réinitialisé et va maintenant redémarrer", SYSTEM_FACTORY_TEXT_DIALOG: "Êtes-vous sûr de vouloir réinitialiser l'appareil à ses paramètres d'usine ?", - THE_LATEST: 'La dernière', - OFFICIAL: 'officielle', - DEVELOPMENT: 'développement', - RELEASE_IS: 'release est', // TODO translate + STABLE: 'Stable', // TODO translate + DEVELOPMENT: 'Développement', RELEASE_NOTES: 'notes de version', EMS_ESP_VER: 'Version EMS-ESP', UPTIME: 'Durée de fonctionnement du système', @@ -335,7 +332,12 @@ const fr: Translation = { UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate SERVICES: 'Services', // TODO translate ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions' // TODO translate + SPECIAL_FUNCTIONS: 'Special Functions', + WAIT_FIRMWARE: 'Please wait while the firmware is being uploaded. The device will restart automatically.', // TODO translate + INSTALL_VERSION: 'This will install vesion {0}. Are you sure?', // TODO translate + SWITCH_DEV: 'Switch to development version', // TODO translate + UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate + LATEST_VERSION: 'You are using the latest version.' // TODO translate // TODO translate }; export default fr; diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts index 2b837addb..6dbf4707c 100644 --- a/interface/src/i18n/it/index.ts +++ b/interface/src/i18n/it/index.ts @@ -161,7 +161,7 @@ const it: Translation = { HELP_INFORMATION_5: 'EMS-ESP è un progetto gratuito e open-source. Supporta il suo sviluppo futuro assegnandogli una stella su GitHub!', UPLOAD: 'Carica', DOWNLOAD: 'Scarica', - INSTALL: 'Installare', + INSTALL: 'Installare {0}', ABORTED: 'Annullato', FAILED: 'Fallito', SUCCESSFUL: 'Riuscito', @@ -169,16 +169,13 @@ const it: Translation = { LOG_OF: 'Registro {0}', STATUS_OF: 'Stato {0}', DOWNLOAD_UPLOAD: 'Scaricamento/Caricamento', - VERSION_ON: 'Attualmente stai eseguendo la versione', CLOSE: 'Chiudere', USE: 'Usa', FACTORY_RESET: 'Impostazioni di fabbrica', SYSTEM_FACTORY_TEXT: 'Il dispositivo è stato ripristinato alle impostazioni di fabbrica e ora verrà riavviato', SYSTEM_FACTORY_TEXT_DIALOG: 'Sei sicuro di voler ripristinare il dispositivo alle impostazioni di fabbrica??', - THE_LATEST: 'Ultima', - OFFICIAL: 'ufficiale', - DEVELOPMENT: 'sviluppo', - RELEASE_IS: 'rilascio é', + STABLE: 'Stable', // TODO translate + DEVELOPMENT: 'Sviluppo', RELEASE_NOTES: 'note rilascio', EMS_ESP_VER: 'Versione EMS-ESP', UPTIME: 'Tempo di attività del sistema', @@ -335,7 +332,12 @@ const it: Translation = { UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate SERVICES: 'Services', // TODO translate ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions' // TODO translate + SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate + WAIT_FIRMWARE: 'Please wait while the firmware is being uploaded. The device will restart automatically.', // TODO translate + INSTALL_VERSION: 'This will install vesion {0}. Are you sure?', // TODO translate + SWITCH_DEV: 'Switch to development version', // TODO translate + UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate + LATEST_VERSION: 'You are using the latest version.' // TODO translate }; export default it; diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index a6d93bfe9..bf47983e9 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -161,7 +161,7 @@ const nl: Translation = { HELP_INFORMATION_5: 'EMS-ESP is een gratis en open source project. Steun ons met een Star op GitHub!', UPLOAD: 'Upload', DOWNLOAD: '{{D|d|d}}ownload', - INSTALL: 'Installeren', + INSTALL: 'Installeren {0}', ABORTED: 'afgebroken', FAILED: 'mislukt', SUCCESSFUL: 'successvol', @@ -169,16 +169,13 @@ const nl: Translation = { LOG_OF: '{0} Log', STATUS_OF: '{0} Status', DOWNLOAD_UPLOAD: 'Download/Upload', - VERSION_ON: 'U bevindt zich momenteel op versie', CLOSE: 'Sluiten', USE: 'Gebruik', FACTORY_RESET: 'Fabrieksinstellingen', SYSTEM_FACTORY_TEXT: 'Gateway is gereset en start nu weer op met fabrieksinstellingen', SYSTEM_FACTORY_TEXT_DIALOG: 'Weet je zeker dat je een reset naar fabrieksinstellingen uit wilt voeren?', - THE_LATEST: 'De laatste', - OFFICIAL: 'official', - DEVELOPMENT: 'development', - RELEASE_IS: 'release is', + STABLE: 'Stable', + DEVELOPMENT: 'Development', RELEASE_NOTES: 'release notes', EMS_ESP_VER: 'EMS-ESP Versie', UPTIME: 'Systeem Uptime', @@ -335,7 +332,12 @@ const nl: Translation = { UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate SERVICES: 'Services', // TODO translate ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions' // TODO translate + SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate + WAIT_FIRMWARE: 'Please wait while the firmware is being uploaded. The device will restart automatically.', // TODO translate + INSTALL_VERSION: 'This will install vesion {0}. Are you sure?', // TODO translate + SWITCH_DEV: 'Switch to development version', // TODO translate + UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate + LATEST_VERSION: 'You are using the latest version.' // TODO translate }; export default nl; diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index 51dacd356..7471b596b 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -161,7 +161,7 @@ const no: Translation = { HELP_INFORMATION_5: 'EMS-ESP er gratis og åpen kildekode. Bidra til utviklingen ved å gi oss en stjerne på GitHub!', UPLOAD: 'Opplasning', DOWNLOAD: '{{N|n|n}}edlasting', - INSTALL: 'Installer', + INSTALL: 'Installer {0}', ABORTED: 'avbrutt', FAILED: 'feilet', SUCCESSFUL: 'vellykket', @@ -169,16 +169,13 @@ const no: Translation = { LOG_OF: '{0} Logg', STATUS_OF: '{0} Status', DOWNLOAD_UPLOAD: 'Nedlasting/Opp', - VERSION_ON: 'You are currently on', // TODO translate CLOSE: 'Steng', USE: 'Bruk', FACTORY_RESET: 'Sett tilbake til fabrikkinstilling', SYSTEM_FACTORY_TEXT: 'Enhet har blitt satt tilbake til fabrikkinstilling og vil restarte', SYSTEM_FACTORY_TEXT_DIALOG: 'Er du sikker på at du vil resette enheten til fabrikkinstillinger?', - THE_LATEST: 'Den nyeste', - OFFICIAL: 'official', - DEVELOPMENT: 'development', - RELEASE_IS: 'release er', + STABLE: 'Stable', // TODO translate + DEVELOPMENT: 'Development', RELEASE_NOTES: 'release notes', EMS_ESP_VER: 'EMS-ESP Version', UPTIME: 'System Oppetid', @@ -335,7 +332,12 @@ const no: Translation = { UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate SERVICES: 'Services', // TODO translate ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions' // TODO translate + SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate + WAIT_FIRMWARE: 'Please wait while the firmware is being uploaded. The device will restart automatically.', // TODO translate + INSTALL_VERSION: 'This will install vesion {0}. Are you sure?', // TODO translate + SWITCH_DEV: 'Switch to development version', // TODO translate + UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate + LATEST_VERSION: 'You are using the latest version.' // TODO translate }; export default no; diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index b19451681..48f97782e 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -161,7 +161,7 @@ const pl: BaseTranslation = { HELP_INFORMATION_5: 'EMS-ESP jest darmowym projektem typu open-source. Aby go wesprzeć, rozważ przyznanie nam gwiazdki na GitHub!', UPLOAD: 'Wysyłanie', DOWNLOAD: '{{P|p||P}}obier{{anie|z||z}}', - INSTALL: 'Zainstalować', + INSTALL: 'Zainstalować {0}', ABORTED: 'zostało przerwane!', FAILED: 'nie powiodł{{o|a|}} się!', SUCCESSFUL: 'powiodło się.', @@ -169,16 +169,13 @@ const pl: BaseTranslation = { LOG_OF: 'Log {0}', STATUS_OF: 'Status {0}', DOWNLOAD_UPLOAD: 'Plików przesyłanie', - VERSION_ON: 'Aktualnie używasz', CLOSE: 'Zamknij', USE: 'Aby zaktualizować firmware skorzystaj z funkcji', FACTORY_RESET: 'Ustawienia fabryczne', SYSTEM_FACTORY_TEXT: 'Interfejs EMS-ESP został przywrócony do ustawień fabrycznych i zostanie teraz ponownie uruchomiony.', SYSTEM_FACTORY_TEXT_DIALOG: 'Na pewno chcesz przywrócić ustawienia fabryczne interfejsu EMS-ESP? ', - THE_LATEST: 'Najnowsze', - OFFICIAL: 'oficjalne', - DEVELOPMENT: 'testowe', - RELEASE_IS: 'wydanie to', + STABLE: 'Stable', // TODO translate + DEVELOPMENT: 'Testowe', RELEASE_NOTES: 'lista zmian', EMS_ESP_VER: 'Wersja EMS-ESP', UPTIME: 'Czas działania systemu', @@ -335,7 +332,12 @@ const pl: BaseTranslation = { UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate SERVICES: 'Services', // TODO translate ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions' // TODO translate + SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate + WAIT_FIRMWARE: 'Please wait while the firmware is being uploaded. The device will restart automatically.', // TODO translate + INSTALL_VERSION: 'This will install vesion {0}. Are you sure?', // TODO translate + SWITCH_DEV: 'Switch to development version', // TODO translate + UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate + LATEST_VERSION: 'You are using the latest version.' // TODO translate }; export default pl; diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts index b1d996c48..7360741f7 100644 --- a/interface/src/i18n/sk/index.ts +++ b/interface/src/i18n/sk/index.ts @@ -161,7 +161,7 @@ const sk: Translation = { HELP_INFORMATION_5: 'EMS-ESP je bezplatný a open source projekt. Podporte jeho budúci vývoj tým, že mu dáte hviezdičku na GitHub!', UPLOAD: 'Nahrať', DOWNLOAD: '{{S|s|s}}tiahnuť', - INSTALL: 'Inštalovať', + INSTALL: 'Inštalovať {0}', ABORTED: 'zrušené', FAILED: 'chybné', SUCCESSFUL: 'úspešné', @@ -169,16 +169,13 @@ const sk: Translation = { LOG_OF: '{0} Log', STATUS_OF: '{0} Stav', DOWNLOAD_UPLOAD: 'Stiahnuť/Nahrať', - VERSION_ON: 'Momentálne nainštalovaná verzia: ', CLOSE: 'Zatvoriť', USE: 'Použiť', FACTORY_RESET: 'Továrenské nastavenia', SYSTEM_FACTORY_TEXT: 'Zariadenie bolo obnovené z výroby a teraz sa reštartuje', SYSTEM_FACTORY_TEXT_DIALOG: 'Naozaj chcete resetovať EMS-ESP na predvolené výrobné nastavenia?', - THE_LATEST: 'Posledná', - OFFICIAL: 'officiálna', - DEVELOPMENT: 'vývojárska', - RELEASE_IS: 'verzia je', + STABLE: 'Stable', // TODO translate + DEVELOPMENT: 'Vývojárska', RELEASE_NOTES: 'poznámky k verzii', EMS_ESP_VER: 'EMS-ESP verzia', UPTIME: 'Beh systému', @@ -335,7 +332,12 @@ const sk: Translation = { UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate SERVICES: 'Services', // TODO translate ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions' // TODO translate + SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate + WAIT_FIRMWARE: 'Please wait while the firmware is being uploaded. The device will restart automatically.', // TODO translate + INSTALL_VERSION: 'This will install vesion {0}. Are you sure?', // TODO translate + SWITCH_DEV: 'Switch to development version', // TODO translate + UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate + LATEST_VERSION: 'You are using the latest version.' // TODO translate }; export default sk; diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts index 68635b772..4b71f483a 100644 --- a/interface/src/i18n/sv/index.ts +++ b/interface/src/i18n/sv/index.ts @@ -161,7 +161,7 @@ const sv: Translation = { HELP_INFORMATION_5: 'EMS-ESP är gratis och är öppen källkod. Bidra till utvecklingen genom att ge oss en stjärna på GitHub!', UPLOAD: 'Uppladdning', DOWNLOAD: '{{N|n|n}}edladdning', - INSTALL: 'Installera', + INSTALL: 'Installera {0}', ABORTED: 'Avbruten', FAILED: 'Misslyckades', SUCCESSFUL: 'Lyckades', @@ -169,16 +169,13 @@ const sv: Translation = { LOG_OF: '{0} Logg', STATUS_OF: '{0} Status', DOWNLOAD_UPLOAD: 'Nedladdning/Upp', - VERSION_ON: 'You are currently on', // TODO translate CLOSE: 'Stäng', USE: 'Använd', FACTORY_RESET: 'Fabriksåterställning', SYSTEM_FACTORY_TEXT: 'Enheten har blivit fabriksåterställd och startar nu om', SYSTEM_FACTORY_TEXT_DIALOG: 'Är du säker att du vill fabriksåterställa enheten?', - THE_LATEST: 'Den senaste', - OFFICIAL: 'officiell', - DEVELOPMENT: 'utveckling', - RELEASE_IS: 'release är', + STABLE: 'Stable', // TODO translate + DEVELOPMENT: 'Utveckling', RELEASE_NOTES: 'release-logg', EMS_ESP_VER: 'EMS-ESP Version', UPTIME: 'Systemets Upptid', @@ -335,7 +332,12 @@ const sv: Translation = { UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate SERVICES: 'Services', // TODO translate ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions' // TODO translate + SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate + WAIT_FIRMWARE: 'Please wait while the firmware is being uploaded. The device will restart automatically.', // TODO translate + INSTALL_VERSION: 'This will install vesion {0}. Are you sure?', // TODO translate + SWITCH_DEV: 'Switch to development version', // TODO translate + UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate + LATEST_VERSION: 'You are using the latest version.' // TODO translate }; export default sv; diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts index 083074faf..6e2f3e3b8 100644 --- a/interface/src/i18n/tr/index.ts +++ b/interface/src/i18n/tr/index.ts @@ -161,7 +161,7 @@ const tr: Translation = { HELP_INFORMATION_5: 'EMS-ESP ücretsiz ve açık kaynaklı bir projedir. Lütfen geliştirmeyi desteklemek için GitHubda projeye yıldız verin!', UPLOAD: 'Yükleme', DOWNLOAD: '{{İ|i|i}}İndirme', - INSTALL: 'Düzenlemek', + INSTALL: 'Düzenlemek {0}', ABORTED: 'iptal edildi', FAILED: 'başarısız', SUCCESSFUL: 'başarılı', @@ -169,16 +169,13 @@ const tr: Translation = { LOG_OF: '{0} Kaydı', STATUS_OF: '{0} Durumu', DOWNLOAD_UPLOAD: 'İndirme/Yükleme', - VERSION_ON: 'You are currently on', // TODO translate CLOSE: 'Kapat', USE: 'KUllan', FACTORY_RESET: 'Fabrika ayarına dönme', SYSTEM_FACTORY_TEXT: 'Cihaz fabrika ayarlarına döndü ve şimdi yendiden başlatılacak', SYSTEM_FACTORY_TEXT_DIALOG: 'Cihazı fabrika ayarlarına döndürmek istediğinize emin misiniz?', - THE_LATEST: 'En son', - OFFICIAL: 'resmi', - DEVELOPMENT: 'geliştirme', - RELEASE_IS: 'release is', // TODO translate + STABLE: 'Stable', // TODO translate + DEVELOPMENT: 'Geliştirme', RELEASE_NOTES: 'yayınlanma notları', EMS_ESP_VER: 'EMS-ESP Sürümü', UPTIME: 'Sistem Çalışma Süresi', @@ -335,7 +332,12 @@ const tr: Translation = { UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate SERVICES: 'Services', // TODO translate ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions' // TODO translate + SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate + WAIT_FIRMWARE: 'Please wait while the firmware is being uploaded. The device will restart automatically.', // TODO translate + INSTALL_VERSION: 'This will install vesion {0}. Are you sure?', // TODO translate + SWITCH_DEV: 'Switch to development version', // TODO translate + UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate + LATEST_VERSION: 'You are using the latest version.' // TODO translate }; export default tr; diff --git a/interface/src/types/system.ts b/interface/src/types/system.ts index 2d59ca9d4..62b425677 100644 --- a/interface/src/types/system.ts +++ b/interface/src/types/system.ts @@ -4,6 +4,7 @@ import type { NetworkConnectionStatus } from './network'; export interface HardwareStatus { emsesp_version: string; + build_flags: string; esp_platform: string; max_alloc_heap: number; cpu_type: string; @@ -30,7 +31,6 @@ export interface HardwareStatus { export interface SystemStatus { emsesp_version: string; - esp_platform: string; status: busConnectionStatus; uptime: number; bus_uptime: number; diff --git a/mock-api/rest_server.ts b/mock-api/rest_server.ts index 5162afc3c..fa6dd60a3 100644 --- a/mock-api/rest_server.ts +++ b/mock-api/rest_server.ts @@ -368,8 +368,10 @@ const SIGN_IN_ENDPOINT = REST_ENDPOINT_ROOT + 'signIn'; const GENERATE_TOKEN_ENDPOINT = REST_ENDPOINT_ROOT + 'generateToken'; const hardware_status = { - emsesp_version: '3.7-demo', + emsesp_version: '3.7.0-dev.33', + // emsesp_version: '3.6.5', esp_platform: 'ESP32S3', + build_flags: 'DEMO', cpu_type: 'ESP32-S3', cpu_rev: 0, cpu_cores: 2, @@ -395,8 +397,8 @@ const hardware_status = { }; const system_status = { - emsesp_version: '3.7-demo', - esp_platform: 'ESP32', + emsesp_version: '3.7.0-dev.33', + // emsesp_version: '3.6.5', status: 0, // status: 2, uptime: 77186, @@ -452,6 +454,7 @@ const EMSESP_DEVICEDATA_ENDPOINT2 = REST_ENDPOINT_ROOT + 'deviceData/:id?'; const EMSESP_DEVICEENTITIES_ENDPOINT1 = REST_ENDPOINT_ROOT + 'deviceEntities'; const EMSESP_DEVICEENTITIES_ENDPOINT2 = REST_ENDPOINT_ROOT + 'deviceEntities/:id?'; +const EMSESP_CHECK_UPGRADE_ENDPOINT = REST_ENDPOINT_ROOT + 'checkUpgrade'; const EMSESP_BOARDPROFILE_ENDPOINT = REST_ENDPOINT_ROOT + 'boardProfile'; const EMSESP_WRITE_DEVICEVALUE_ENDPOINT = REST_ENDPOINT_ROOT + 'writeDeviceValue'; const EMSESP_WRITE_DEVICENAME_ENDPOINT = REST_ENDPOINT_ROOT + 'writeDeviceName'; @@ -4529,6 +4532,17 @@ router return status(200); }) + // check upgrade + .post(EMSESP_CHECK_UPGRADE_ENDPOINT, async (request: any) => { + const content = await request.json(); + console.log('check upgrade', content.version); + const data = { + upgradeable: true + // upgradeable: false + }; + return data; + }) + // Settings - board profile .post(EMSESP_BOARDPROFILE_ENDPOINT, async (request: any) => { const content = await request.json(); diff --git a/src/version.h b/src/version.h index a993524cf..639371d84 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.7.0-dev.32" +#define EMSESP_APP_VERSION "3.7.0-dev.33" diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index a9d56cedc..d7037f838 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -24,12 +24,15 @@ namespace emsesp { -// /rest/hardwareStatus WebStatusService::WebStatusService(AsyncWebServer * server, SecurityManager * securityManager) { - server->on(HARDWARE_STATUS_SERVICE_PATH, HTTP_GET, [this](AsyncWebServerRequest * request) { hardwareStatus(request); }); - server->on(SYSTEM_STATUS_SERVICE_PATH, HTTP_GET, [this](AsyncWebServerRequest * request) { systemStatus(request); }); + // GET + server->on(EMSESP_HARDWARE_STATUS_SERVICE_PATH, HTTP_GET, [this](AsyncWebServerRequest * request) { hardwareStatus(request); }); + server->on(EMSESP_SYSTEM_STATUS_SERVICE_PATH, HTTP_GET, [this](AsyncWebServerRequest * request) { systemStatus(request); }); + // POST + server->on(EMSESP_CHECK_UPGRADE_PATH, [this](AsyncWebServerRequest * request, JsonVariant json) { checkUpgrade(request, json); }); } +// /rest/systemStatus void WebStatusService::systemStatus(AsyncWebServerRequest * request) { // This is a litle trick for the OTA upload. We don't want the React RestartService to think we're finished // with the upload so we fake it and pretent the /rest/systemStatus is not available. That way the spinner keeps spinning. @@ -42,25 +45,15 @@ void WebStatusService::systemStatus(AsyncWebServerRequest * request) { auto * response = new AsyncJsonResponse(false); JsonObject root = response->getRoot(); -#ifdef EMSESP_DEBUG - root["emsesp_version"] = std::string(EMSESP_APP_VERSION) + " (DEBUG)"; -#else -#ifdef EMSESP_TEST - root["emsesp_version"] = std::string(EMSESP_APP_VERSION) + " (TEST)"; -#else root["emsesp_version"] = EMSESP_APP_VERSION; -#endif -#endif - - root["esp_platform"] = EMSESP_PLATFORM; // from default_settings.h: ESP32, ESP32C3, ESP32S2, ESP32S3 - root["status"] = EMSESP::bus_status(); // 0, 1 or 2 - root["bus_uptime"] = EMSbus::bus_uptime(); - root["num_devices"] = EMSESP::count_devices(); - root["num_sensors"] = EMSESP::temperaturesensor_.no_sensors(); - root["num_analogs"] = EMSESP::analogsensor_.no_sensors(); - root["free_heap"] = EMSESP::system_.getHeapMem(); - root["uptime"] = uuid::get_uptime_sec(); - root["mqtt_status"] = EMSESP::mqtt_.connected(); + root["status"] = EMSESP::bus_status(); // 0, 1 or 2 + root["bus_uptime"] = EMSbus::bus_uptime(); + root["num_devices"] = EMSESP::count_devices(); + root["num_sensors"] = EMSESP::temperaturesensor_.no_sensors(); + root["num_analogs"] = EMSESP::analogsensor_.no_sensors(); + root["free_heap"] = EMSESP::system_.getHeapMem(); + root["uptime"] = uuid::get_uptime_sec(); + root["mqtt_status"] = EMSESP::mqtt_.connected(); #ifndef EMSESP_STANDALONE root["ntp_status"] = [] { @@ -104,21 +97,25 @@ void WebStatusService::systemStatus(AsyncWebServerRequest * request) { request->send(response); } +// /rest/hardwareStatus void WebStatusService::hardwareStatus(AsyncWebServerRequest * request) { EMSESP::system_.refreshHeapMem(); // refresh free heap and max alloc heap auto * response = new AsyncJsonResponse(false); JsonObject root = response->getRoot(); -#ifdef EMSESP_DEBUG - root["emsesp_version"] = std::string(EMSESP_APP_VERSION) + " (DEBUG)"; -#else -#ifdef EMSESP_TEST - root["emsesp_version"] = std::string(EMSESP_APP_VERSION) + " (TEST)"; -#else root["emsesp_version"] = EMSESP_APP_VERSION; + +#ifdef EMSESP_DEBUG +#ifdef EMSESP_TEST + root["build_flags"] = "DEBUG,TEST"; +#else + root["build_flags"] = "DEBUG"; #endif +#elif defined(EMSESP_TEST) + root["build_flags"] = "TEST"; #endif + root["esp_platform"] = EMSESP_PLATFORM; #ifndef EMSESP_STANDALONE @@ -154,4 +151,21 @@ void WebStatusService::hardwareStatus(AsyncWebServerRequest * request) { request->send(response); } +// returns trues if there is an upgrade available +void WebStatusService::checkUpgrade(AsyncWebServerRequest * request, JsonVariant json) { + auto * response = new AsyncJsonResponse(); + JsonObject root = response->getRoot(); + + version::Semver200_version settings_version(EMSESP_APP_VERSION); + std::string latest_version = json["version"] | EMSESP_APP_VERSION; + version::Semver200_version this_version(latest_version); + + emsesp::EMSESP::logger().debug("Checking for upgrade: %s > %s", EMSESP_APP_VERSION, latest_version.c_str()); + + root["upgradeable"] = (this_version > settings_version); + + response->setLength(); + request->send(response); +} + } // namespace emsesp diff --git a/src/web/WebStatusService.h b/src/web/WebStatusService.h index e3fe28083..0eb3cbe2f 100644 --- a/src/web/WebStatusService.h +++ b/src/web/WebStatusService.h @@ -1,8 +1,11 @@ #ifndef WebStatusService_h #define WebStatusService_h -#define HARDWARE_STATUS_SERVICE_PATH "/rest/hardwareStatus" -#define SYSTEM_STATUS_SERVICE_PATH "/rest/systemStatus" +#define EMSESP_HARDWARE_STATUS_SERVICE_PATH "/rest/hardwareStatus" +#define EMSESP_SYSTEM_STATUS_SERVICE_PATH "/rest/systemStatus" +#define EMSESP_CHECK_UPGRADE_PATH "/rest/checkUpgrade" + +#include namespace emsesp { @@ -13,6 +16,7 @@ class WebStatusService { private: void systemStatus(AsyncWebServerRequest * request); void hardwareStatus(AsyncWebServerRequest * request); + void checkUpgrade(AsyncWebServerRequest * request, JsonVariant json); }; } // namespace emsesp