autodetect, download and install firmware upgrades

This commit is contained in:
proddy
2024-08-29 13:51:17 +02:00
parent f1e6d5a331
commit fe50c9f6d0
18 changed files with 290 additions and 177 deletions

View File

@@ -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]<https://github.com/emsesp/EMS-ESP32/issues/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]<https://github.com/emsesp/EMS-ESP32/discussions/1903>
- Autodetect and download firmware upgrades
## Fixed

View File

@@ -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);

View File

@@ -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<boolean>(false);
const [restartNeeded, setRestartNeeded] = useState<boolean>(false);
const [openDialog, setOpenDialog] = useState<boolean>(false);
const [useDev, setUseDev] = useState<boolean>(false);
const [upgradeAvailable, setUpgradeAvailable] = useState<boolean>(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 (
<Dialog
sx={dialogStyle}
open={openDialog}
onClose={() => setOpenDialog(false)}
>
<DialogTitle>
{LL.INSTALL('') +
' ' +
(useDev ? LL.DEVELOPMENT() : LL.STABLE()) +
' Firmware'}
</DialogTitle>
<DialogContent dividers>
<Typography mb={2}>
{LL.INSTALL_VERSION(useDev ? latestDevVersion : latestVersion)}
</Typography>
<Link
target="_blank"
href={useDev ? DEV_RELNOTES_URL : STABLE_RELNOTES_URL}
color="primary"
>
{LL.RELEASE_NOTES()}
</Link>
&nbsp;|&nbsp;
<Link target="_blank" href={getBinURL(useDev)} color="primary">
{LL.DOWNLOAD(1)}
</Link>
</DialogContent>
<DialogActions>
<Button
startIcon={<CancelIcon />}
variant="outlined"
onClick={() => setOpenDialog(false)}
color="secondary"
>
{LL.CANCEL()}
</Button>
<Button
startIcon={<WarningIcon color="warning" />}
variant="outlined"
onClick={() => installFirmwareURL(getBinURL(useDev))}
color="primary"
>
{LL.INSTALL('')}
</Button>
</DialogActions>
</Dialog>
);
};
const showFirmwareDialog = (useDev: boolean) => {
setUseDev(useDev);
setOpenDialog(true);
};
const content = () => {
if (!data) {
return <FormLoader onRetry={loadData} errorMessage={error?.message} />;
}
const isDev = data.emsesp_version.includes('dev');
return (
<>
<Typography sx={{ pb: 2 }} variant="h6" color="primary">
@@ -274,76 +362,49 @@ const DownloadUpload = () => {
</Typography>
</Box>
<Box p={2} mt={2} border="1px solid grey" borderRadius={2}>
{LL.VERSION_ON() + ' '}
<b>{data.emsesp_version}</b>&nbsp;({getPlatform()})
<Divider />
{latestVersion && (
<Box mt={2}>
{LL.THE_LATEST()}&nbsp;{LL.OFFICIAL()}&nbsp;{LL.RELEASE_IS()}
&nbsp;<b>{latestVersion}</b>
&nbsp;(
<Link target="_blank" href={STABLE_RELNOTES_URL} color="primary">
{LL.RELEASE_NOTES()}
</Link>
)&nbsp;(
<Link
target="_blank"
href={
STABLE_URL + 'v' + latestVersion + '/' + getBinURL(latestVersion)
}
color="primary"
>
{LL.DOWNLOAD(1)}
</Link>
)
<Typography>
<b>{LL.VERSION() + ':'}</b>&nbsp;{data.emsesp_version}
{data.build_flags && (
<Typography variant="caption">
&nbsp; &#40;{data.build_flags}&#41;
</Typography>
)}
</Typography>
<Typography>
<b>Platform:</b>&nbsp;{getPlatform()}
</Typography>
<Typography>
<b>Release:</b>&nbsp;{isDev ? LL.DEVELOPMENT() : LL.STABLE()}
{!isDev && (
<Button
sx={{ ml: 2 }}
size="small"
startIcon={<WarningIcon color="warning" />}
variant="outlined"
color="primary"
onClick={() =>
installFirmwareURL(
STABLE_URL + 'v' + latestVersion + '/' + getBinURL(latestVersion)
)
}
onClick={() => showFirmwareDialog(true)}
>
{LL.INSTALL(0)}
{LL.SWITCH_DEV()}
</Button>
</Box>
)}
{latestDevVersion && (
<Box mt={2}>
{LL.THE_LATEST()}&nbsp;{LL.DEVELOPMENT()}&nbsp;{LL.RELEASE_IS()}
&nbsp;
<b>{latestDevVersion}</b>
&nbsp;(
<Link target="_blank" href={DEV_RELNOTES_URL} color="primary">
{LL.RELEASE_NOTES()}
</Link>
)&nbsp;(
<Link
target="_blank"
href={DEV_URL + getBinURL(latestDevVersion)}
color="primary"
>
{LL.DOWNLOAD(1)}
</Link>
)
)}
</Typography>
{upgradeAvailable ? (
<Typography mt={2} color="secondary">
<InfoOutlinedIcon color="secondary" sx={{ verticalAlign: 'middle' }} />
&nbsp;&nbsp;{LL.UPGRADE_AVAILABLE()}
<Button
sx={{ ml: 2 }}
size="small"
startIcon={<WarningIcon color="warning" />}
variant="outlined"
color="primary"
onClick={() =>
installFirmwareURL(DEV_URL + getBinURL(latestDevVersion))
}
onClick={() => showFirmwareDialog(true)}
>
{LL.INSTALL(0)}
{LL.INSTALL('v' + isDev ? latestDevVersion : latestVersion)}
</Button>
</Box>
</Typography>
) : (
<Typography mt={2}>{LL.LATEST_VERSION()}</Typography>
)}
{renderUploadDialog()}
</Box>
<Typography sx={{ pt: 2, pb: 2 }} variant="h6" color="primary">
@@ -374,11 +435,7 @@ const DownloadUpload = () => {
return (
<SectionContent>
{restarting ? (
<RestartMonitor message="Please wait while the firmware is being uploaded and installed. This can take a few minutes. EMS-ESP will automatically restart when completed." />
) : (
content()
)}
{restarting ? <RestartMonitor message={LL.WAIT_FIRMWARE()} /> : content()}
</SectionContent>
);
};

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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();

View File

@@ -1 +1 @@
#define EMSESP_APP_VERSION "3.7.0-dev.32"
#define EMSESP_APP_VERSION "3.7.0-dev.33"

View File

@@ -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

View File

@@ -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 <semver200.h>
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