Merge pull request #1791 from proddy/feat_modules

Feat modules
This commit is contained in:
Proddy
2024-06-08 16:01:40 +02:00
committed by GitHub
14 changed files with 51 additions and 85 deletions

View File

@@ -327,7 +327,7 @@ const de: Translation = {
UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate
MODULES: 'Module', // TODO translate MODULES: 'Module', // TODO translate
MODULES_UPDATED: 'Modules updated', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate
MODULES_DESCRIPTION: 'Click on the Module to Activate or de-activate EMS-ESP library modules', // TODO translate MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate
MODULES_NONE: 'No external modules detected' // TODO translate MODULES_NONE: 'No external modules detected' // TODO translate
}; };

View File

@@ -327,7 +327,7 @@ const en: Translation = {
UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware',
MODULES: 'Modules', MODULES: 'Modules',
MODULES_UPDATED: 'Modules updated', MODULES_UPDATED: 'Modules updated',
MODULES_DESCRIPTION: 'Click on the Module to Activate or de-activate EMS-ESP library modules', MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules',
MODULES_NONE: 'No external modules detected' MODULES_NONE: 'No external modules detected'
}; };

View File

@@ -327,7 +327,7 @@ const fr: Translation = {
UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate
MODULES: 'Module', // TODO translate MODULES: 'Module', // TODO translate
MODULES_UPDATED: 'Modules updated', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate
MODULES_DESCRIPTION: 'Click on the Module to Activate or de-activate EMS-ESP library modules', // TODO translate MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate
MODULES_NONE: 'No external modules detected' // TODO translate MODULES_NONE: 'No external modules detected' // TODO translate
}; };

View File

@@ -327,7 +327,7 @@ const it: Translation = {
UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate
MODULES: 'Module', // TODO translate MODULES: 'Module', // TODO translate
MODULES_UPDATED: 'Modules updated', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate
MODULES_DESCRIPTION: 'Click on the Module to Activate or de-activate EMS-ESP library modules', // TODO translate MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate
MODULES_NONE: 'No external modules detected' // TODO translate MODULES_NONE: 'No external modules detected' // TODO translate
}; };

View File

@@ -327,7 +327,7 @@ const no: Translation = {
UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate
MODULES: 'Module', // TODO translate MODULES: 'Module', // TODO translate
MODULES_UPDATED: 'Modules updated', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate
MODULES_DESCRIPTION: 'Click on the Module to Activate or de-activate EMS-ESP library modules', // TODO translate MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate
MODULES_NONE: 'No external modules detected' // TODO translate MODULES_NONE: 'No external modules detected' // TODO translate
}; };

View File

@@ -327,7 +327,7 @@ const pl: BaseTranslation = {
UPLOAD_DOWNLOAD_1: 'Wysyłanie/pobieranie ustawień i firmware', UPLOAD_DOWNLOAD_1: 'Wysyłanie/pobieranie ustawień i firmware',
MODULES: 'Module', // TODO translate MODULES: 'Module', // TODO translate
MODULES_UPDATED: 'Modules updated', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate
MODULES_DESCRIPTION: 'Click on the Module to Activate or de-activate EMS-ESP library modules', // TODO translate MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate
MODULES_NONE: 'No external modules detected' // TODO translate MODULES_NONE: 'No external modules detected' // TODO translate
}; };

View File

@@ -327,7 +327,7 @@ const sk: Translation = {
UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate
MODULES: 'Module', // TODO translate MODULES: 'Module', // TODO translate
MODULES_UPDATED: 'Modules updated', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate
MODULES_DESCRIPTION: 'Click on the Module to Activate or de-activate EMS-ESP library modules', // TODO translate MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate
MODULES_NONE: 'No external modules detected' // TODO translate MODULES_NONE: 'No external modules detected' // TODO translate
}; };

View File

@@ -327,7 +327,7 @@ const sv: Translation = {
UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate
MODULES: 'Module', // TODO translate MODULES: 'Module', // TODO translate
MODULES_UPDATED: 'Modules updated', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate
MODULES_DESCRIPTION: 'Click on the Module to Activate or de-activate EMS-ESP library modules', // TODO translate MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate
MODULES_NONE: 'No external modules detected' // TODO translate MODULES_NONE: 'No external modules detected' // TODO translate
}; };

View File

@@ -327,7 +327,7 @@ const tr: Translation = {
UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate UPLOAD_DOWNLOAD_1: 'Upload/Download Settings and Firmware', // TODO translate
MODULES: 'Module', // TODO translate MODULES: 'Module', // TODO translate
MODULES_UPDATED: 'Modules updated', // TODO translate MODULES_UPDATED: 'Modules updated', // TODO translate
MODULES_DESCRIPTION: 'Click on the Module to Activate or de-activate EMS-ESP library modules', // TODO translate MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate
MODULES_NONE: 'No external modules detected' // TODO translate MODULES_NONE: 'No external modules detected' // TODO translate
}; };

View File

@@ -5,12 +5,9 @@ import { toast } from 'react-toastify';
import CancelIcon from '@mui/icons-material/Cancel'; import CancelIcon from '@mui/icons-material/Cancel';
import CircleIcon from '@mui/icons-material/Circle'; import CircleIcon from '@mui/icons-material/Circle';
import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew';
import WarningIcon from '@mui/icons-material/Warning'; import WarningIcon from '@mui/icons-material/Warning';
import { Box, Button, Typography } from '@mui/material'; import { Box, Button, Typography } from '@mui/material';
import * as SystemApi from 'api/system';
import { import {
Body, Body,
Cell, Cell,
@@ -26,11 +23,9 @@ import {
BlockNavigation, BlockNavigation,
ButtonRow, ButtonRow,
FormLoader, FormLoader,
MessageBox,
SectionContent, SectionContent,
useLayoutTitle useLayoutTitle
} from 'components'; } from 'components';
import RestartMonitor from 'framework/system/RestartMonitor';
import { useI18nContext } from 'i18n/i18n-react'; import { useI18nContext } from 'i18n/i18n-react';
import * as EMSESP from './api'; import * as EMSESP from './api';
@@ -40,13 +35,10 @@ import type { ModuleItem, Modules } from './types';
const Modules: FC = () => { const Modules: FC = () => {
const { LL } = useI18nContext(); const { LL } = useI18nContext();
const [numChanges, setNumChanges] = useState<number>(0); const [numChanges, setNumChanges] = useState<number>(0);
const [licenseChanges, setLicenseChanges] = useState<number>(0);
const blocker = useBlocker(numChanges !== 0); const blocker = useBlocker(numChanges !== 0);
const [selectedModuleItem, setSelectedModuleItem] = useState<ModuleItem>(); const [selectedModuleItem, setSelectedModuleItem] = useState<ModuleItem>();
const [dialogOpen, setDialogOpen] = useState<boolean>(false); const [dialogOpen, setDialogOpen] = useState<boolean>(false);
const [restarting, setRestarting] = useState<boolean>(false);
const [restartNeeded, setRestartNeeded] = useState<boolean>(false);
const { const {
data: modules, data: modules,
@@ -56,17 +48,6 @@ const Modules: FC = () => {
initialData: [] initialData: []
}); });
const { send: restartCommand } = useRequest(SystemApi.restart(), {
immediate: false
});
const restart = async () => {
await restartCommand().catch((error: Error) => {
toast.error(error.message);
});
setRestarting(true);
};
const { send: writeModules } = useRequest( const { send: writeModules } = useRequest(
(data: Modules) => EMSESP.writeModules(data), (data: Modules) => EMSESP.writeModules(data),
{ {
@@ -140,17 +121,12 @@ const Modules: FC = () => {
return mi.enabled !== mi.o_enabled || mi.license !== mi.o_license; return mi.enabled !== mi.o_enabled || mi.license !== mi.o_license;
} }
function hasModuleLicenseChanged(mi: ModuleItem) {
return mi.license !== mi.o_license;
}
const updateModuleItem = (updatedItem: ModuleItem) => { const updateModuleItem = (updatedItem: ModuleItem) => {
updateState('modules', (data: ModuleItem[]) => { updateState('modules', (data: ModuleItem[]) => {
const new_data = data.map((mi) => const new_data = data.map((mi) =>
mi.id === updatedItem.id ? { ...mi, ...updatedItem } : mi mi.id === updatedItem.id ? { ...mi, ...updatedItem } : mi
); );
setNumChanges(new_data.filter((mi) => hasModulesChanged(mi)).length); setNumChanges(new_data.filter((mi) => hasModulesChanged(mi)).length);
setLicenseChanges(new_data.filter((mi) => hasModuleLicenseChanged(mi)).length);
return new_data; return new_data;
}); });
}; };
@@ -172,7 +148,6 @@ const Modules: FC = () => {
.finally(() => { .finally(() => {
setNumChanges(0); setNumChanges(0);
}); });
setRestartNeeded(licenseChanges > 0);
}; };
const renderContent = () => { const renderContent = () => {
@@ -213,8 +188,10 @@ const Modules: FC = () => {
<HeaderRow> <HeaderRow>
<HeaderCell /> <HeaderCell />
<HeaderCell>{LL.NAME(0)}</HeaderCell> <HeaderCell>{LL.NAME(0)}</HeaderCell>
{/* TODO translate */}
<HeaderCell>Author</HeaderCell> <HeaderCell>Author</HeaderCell>
<HeaderCell>{LL.VERSION()}</HeaderCell> <HeaderCell>{LL.VERSION()}</HeaderCell>
{/* TODO translate */}
<HeaderCell>Message</HeaderCell> <HeaderCell>Message</HeaderCell>
<HeaderCell>{LL.STATUS_OF('')}</HeaderCell> <HeaderCell>{LL.STATUS_OF('')}</HeaderCell>
</HeaderRow> </HeaderRow>
@@ -247,43 +224,30 @@ const Modules: FC = () => {
)} )}
</Table> </Table>
{restartNeeded ? ( <Box mt={1} display="flex" flexWrap="wrap">
<MessageBox my={2} level="warning" message={LL.RESTART_TEXT(0)}> <Box flexGrow={1}>
<Button {numChanges !== 0 && (
startIcon={<PowerSettingsNewIcon />} <ButtonRow>
variant="contained" <Button
color="error" startIcon={<CancelIcon />}
onClick={restart} variant="outlined"
> onClick={onCancel}
{LL.RESTART()} color="secondary"
</Button> >
</MessageBox> {LL.CANCEL()}
) : ( </Button>
<Box mt={1} display="flex" flexWrap="wrap"> <Button
<Box flexGrow={1}> startIcon={<WarningIcon color="warning" />}
{numChanges !== 0 && ( variant="contained"
<ButtonRow> color="info"
<Button onClick={saveModules}
startIcon={<CancelIcon />} >
variant="outlined" {LL.APPLY_CHANGES(numChanges)}
onClick={onCancel} </Button>
color="secondary" </ButtonRow>
> )}
{LL.CANCEL()}
</Button>
<Button
startIcon={<WarningIcon color="warning" />}
variant="contained"
color="info"
onClick={saveModules}
>
{LL.APPLY_CHANGES(numChanges)}
</Button>
</ButtonRow>
)}
</Box>
</Box> </Box>
)} </Box>
</> </>
); );
}; };
@@ -291,7 +255,7 @@ const Modules: FC = () => {
return ( return (
<SectionContent> <SectionContent>
{blocker ? <BlockNavigation blocker={blocker} /> : null} {blocker ? <BlockNavigation blocker={blocker} /> : null}
{restarting ? <RestartMonitor /> : renderContent()} {renderContent()}
{selectedModuleItem && ( {selectedModuleItem && (
<ModulesDialog <ModulesDialog
open={dialogOpen} open={dialogOpen}

View File

@@ -55,9 +55,7 @@ const ModulesDialog = ({
return ( return (
<Dialog sx={dialogStyle} open={open} onClose={onClose}> <Dialog sx={dialogStyle} open={open} onClose={onClose}>
<DialogTitle> <DialogTitle>{LL.EDIT() + ' ' + editItem.key}</DialogTitle>
{LL.EDIT() + ' ' + LL.MODULES() + ' : ' + editItem.key}
</DialogTitle>
<DialogContent dividers> <DialogContent dividers>
<Grid container> <Grid container>
<BlockFormControlLabel <BlockFormControlLabel

View File

@@ -11,13 +11,13 @@
; -DEMSESP_DE_ONLY ; only DE translated entity names ; -DEMSESP_DE_ONLY ; only DE translated entity names
; -DEMSESP_EN_ONLY ; only EN translated entity names ; -DEMSESP_EN_ONLY ; only EN translated entity names
; -DEMSESP_PINGTEST ; send log message every 1/2 second ; -DEMSESP_PINGTEST ; send log message every 1/2 second
; my_build_flags = -DEMSESP_TEST my_build_flags = -DEMSESP_TEST
; my_build_flags = -DEMSESP_DEBUG -DEMSESP_TEST ; my_build_flags = -DEMSESP_DEBUG -DEMSESP_TEST
; my_build_flags = -DEMSESP_DEBUG -DEMSESP_TEST -DEMSESP_PINGTEST ; my_build_flags = -DEMSESP_DEBUG -DEMSESP_TEST -DEMSESP_PINGTEST
[platformio] [platformio]
default_envs = esp32_4M ; default_envs = esp32_4M
; default_envs = esp32_16M default_envs = esp32_16M
; default_envs = lolin_s3 ; default_envs = lolin_s3
; default_envs = native ; default_envs = native
; default_envs = debug ; default_envs = debug
@@ -26,10 +26,10 @@ default_envs = esp32_4M
[env] [env]
; upload settings ; upload settings
; for USB ; for USB
; upload_protocol = esptool upload_protocol = esptool
; upload_port = /dev/ttyUSB* upload_port = /dev/ttyUSB*
; for OTA ; for OTA add scripts/upload.py to extra_scripts
upload_protocol = custom ; upload_protocol = custom
custom_emsesp_ip = 10.10.10.173 custom_emsesp_ip = 10.10.10.173
; custom_emsesp_ip = ems-esp.local ; custom_emsesp_ip = ems-esp.local
custom_username = admin custom_username = admin
@@ -39,7 +39,6 @@ custom_password = admin
lib_deps = lib_deps =
file://../../modules/EMS-ESP-Modules file://../../modules/EMS-ESP-Modules
bblanchon/ArduinoJson@^7.0.4 bblanchon/ArduinoJson@^7.0.4
https://github.com/mathieucarbou/AsyncTCP.git ; based on ESPHome
[env:native] [env:native]
extra_scripts = extra_scripts =
@@ -54,10 +53,16 @@ extra_scripts =
[env:lolin_s3] [env:lolin_s3]
extra_scripts = extra_scripts =
; pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time
scripts/rename_fw.py scripts/rename_fw.py
scripts/upload.py scripts/upload.py
[env:esp32_16M]
extra_scripts =
; pre:scripts/build_interface.py ; comment out if you don't want to re-build the WebUI each time
scripts/rename_fw.py
; scripts/upload.py
[env:custom] [env:custom]
; use for basic ESP boards with 4MB flash ; use for basic ESP boards with 4MB flash
; make sure -D TASMOTA_SDK is also enabled ; make sure -D TASMOTA_SDK is also enabled

View File

@@ -218,7 +218,7 @@
#endif #endif
#ifndef EMSESP_DEFAULT_ENTITY_FORMAT #ifndef EMSESP_DEFAULT_ENTITY_FORMAT
#define EMSESP_DEFAULT_ENTITY_FORMAT 1 // in MQTT discovery, use shortnames and not multiple (prefixed with base) #define EMSESP_DEFAULT_ENTITY_FORMAT 3 // in MQTT discovery, single instance, shortname, v3.6
#endif #endif
// matches Web UI settings // matches Web UI settings

View File

@@ -50,7 +50,6 @@ void WebModulesService::loop() {
// it adds data to an empty 'root' json object // it adds data to an empty 'root' json object
// and also calls when the Modules web page is refreshed/loaded // and also calls when the Modules web page is refreshed/loaded
void WebModules::read(WebModules & webModules, JsonObject root) { void WebModules::read(WebModules & webModules, JsonObject root) {
emsesp_->logger().err("debug: in WebModules::read()"); // TODO remove
JsonDocument doc_modules; JsonDocument doc_modules;
JsonObject root_modules = doc_modules.to<JsonObject>(); JsonObject root_modules = doc_modules.to<JsonObject>();
moduleLibrary.list(root_modules); // get list the external library modules, put in a json object moduleLibrary.list(root_modules); // get list the external library modules, put in a json object