diff --git a/.gitignore b/.gitignore
index 81f72621f..2eb46fa12 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,6 +40,7 @@ yarn.lock
analyse.html
interface/vite.config.ts.timestamp*
*.local
+
# i18n generated files
interface/src/i18n/i18n-react.tsx
interface/src/i18n/i18n-types.ts
diff --git a/interface/src/AuthenticatedRouting.tsx b/interface/src/AuthenticatedRouting.tsx
index 4be4fcd42..3e9a619e2 100644
--- a/interface/src/AuthenticatedRouting.tsx
+++ b/interface/src/AuthenticatedRouting.tsx
@@ -1,26 +1,32 @@
import { type FC, useContext } from 'react';
import { Navigate, Route, Routes } from 'react-router-dom';
+import CustomEntities from 'app/main/CustomEntities';
+import Customization from 'app/main/Customization';
+import Devices from 'app/main/Devices';
+import Modules from 'app/main/Modules';
+import Scheduler from 'app/main/Scheduler';
+import Sensors from 'app/main/Sensors';
+import APSettings from 'app/settings/APSettings';
+import ApplicationSettings from 'app/settings/ApplicationSettings';
+import MqttSettings from 'app/settings/MqttSettings';
+import NTPSettings from 'app/settings/NTPSettings';
+import Settings from 'app/settings/Settings';
+import UploadDownload from 'app/settings/UploadDownload';
+import Network from 'app/settings/network/Network';
+import Security from 'app/settings/security/Security';
+import APStatus from 'app/status/APStatus';
+import Activity from 'app/status/Activity';
+import HardwareStatus from 'app/status/HardwareStatus';
+import MqttStatus from 'app/status/MqttStatus';
+import NTPStatus from 'app/status/NTPStatus';
+import NetworkStatus from 'app/status/NetworkStatus';
+import Status from 'app/status/Status';
+import SystemLog from 'app/status/SystemLog';
import { Layout } from 'components';
import { AuthenticatedContext } from 'contexts/authentication';
-import Settings from 'framework/Settings';
-import AccessPoint from 'framework/ap/AccessPoint';
-import Mqtt from 'framework/mqtt/Mqtt';
-import Network from 'framework/network/Network';
-import NetworkTime from 'framework/ntp/NetworkTime';
-import Security from 'framework/security/Security';
-import ESPSystemStatus from 'framework/system/ESPSystemStatus';
-import System from 'framework/system/System';
-import UploadDownload from 'framework/system/UploadDownload';
-import ApplicationSettings from 'project/ApplicationSettings';
-import CustomEntities from 'project/CustomEntities';
-import Customization from 'project/Customization';
-import Devices from 'project/Devices';
-import Modules from 'project/Modules';
-import Scheduler from 'project/Scheduler';
-import Sensors from 'project/Sensors';
-import Help from './project/Help';
+import Help from './app/main/Help';
const AuthenticatedRouting: FC = () => {
const { me } = useContext(AuthenticatedContext);
@@ -29,24 +35,34 @@ const AuthenticatedRouting: FC = () => {
} />
} />
- } />
+ } />
} />
} />
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
{me.admin && (
<>
- } />
- } />
- } />
- } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
} />
- } />
- } />
- } />
- } />
} />
- } />
- } />
- } />
+
+ } />
+ } />
+ } />
>
)}
diff --git a/interface/src/project/CustomEntities.tsx b/interface/src/app/main/CustomEntities.tsx
similarity index 100%
rename from interface/src/project/CustomEntities.tsx
rename to interface/src/app/main/CustomEntities.tsx
diff --git a/interface/src/project/CustomEntitiesDialog.tsx b/interface/src/app/main/CustomEntitiesDialog.tsx
similarity index 100%
rename from interface/src/project/CustomEntitiesDialog.tsx
rename to interface/src/app/main/CustomEntitiesDialog.tsx
diff --git a/interface/src/project/Customization.tsx b/interface/src/app/main/Customization.tsx
similarity index 99%
rename from interface/src/project/Customization.tsx
rename to interface/src/app/main/Customization.tsx
index be34f04bf..00e3905ea 100644
--- a/interface/src/project/Customization.tsx
+++ b/interface/src/app/main/Customization.tsx
@@ -41,6 +41,7 @@ import {
import { useTheme } from '@table-library/react-table-library/theme';
import { dialogStyle } from 'CustomTheme';
import { useRequest } from 'alova';
+import RestartMonitor from 'app/status/RestartMonitor';
import {
BlockNavigation,
ButtonRow,
@@ -48,7 +49,6 @@ import {
SectionContent,
useLayoutTitle
} from 'components';
-import RestartMonitor from 'framework/system/RestartMonitor';
import { useI18nContext } from 'i18n/i18n-react';
import * as EMSESP from './api';
diff --git a/interface/src/project/CustomizationDialog.tsx b/interface/src/app/main/CustomizationDialog.tsx
similarity index 100%
rename from interface/src/project/CustomizationDialog.tsx
rename to interface/src/app/main/CustomizationDialog.tsx
diff --git a/interface/src/project/DeviceIcon.tsx b/interface/src/app/main/DeviceIcon.tsx
similarity index 100%
rename from interface/src/project/DeviceIcon.tsx
rename to interface/src/app/main/DeviceIcon.tsx
diff --git a/interface/src/project/Devices.tsx b/interface/src/app/main/Devices.tsx
similarity index 100%
rename from interface/src/project/Devices.tsx
rename to interface/src/app/main/Devices.tsx
diff --git a/interface/src/project/DevicesDialog.tsx b/interface/src/app/main/DevicesDialog.tsx
similarity index 100%
rename from interface/src/project/DevicesDialog.tsx
rename to interface/src/app/main/DevicesDialog.tsx
diff --git a/interface/src/project/EntityMaskToggle.tsx b/interface/src/app/main/EntityMaskToggle.tsx
similarity index 100%
rename from interface/src/project/EntityMaskToggle.tsx
rename to interface/src/app/main/EntityMaskToggle.tsx
diff --git a/interface/src/project/Help.tsx b/interface/src/app/main/Help.tsx
similarity index 99%
rename from interface/src/project/Help.tsx
rename to interface/src/app/main/Help.tsx
index 85be550ce..129db407d 100644
--- a/interface/src/project/Help.tsx
+++ b/interface/src/app/main/Help.tsx
@@ -18,7 +18,7 @@ import {
Typography
} from '@mui/material';
-import * as EMSESP from 'project/api';
+import * as EMSESP from 'app/main/api';
import { useRequest } from 'alova';
import { SectionContent, useLayoutTitle } from 'components';
import { useI18nContext } from 'i18n/i18n-react';
diff --git a/interface/src/project/Modules.tsx b/interface/src/app/main/Modules.tsx
similarity index 100%
rename from interface/src/project/Modules.tsx
rename to interface/src/app/main/Modules.tsx
diff --git a/interface/src/project/ModulesDialog.tsx b/interface/src/app/main/ModulesDialog.tsx
similarity index 100%
rename from interface/src/project/ModulesDialog.tsx
rename to interface/src/app/main/ModulesDialog.tsx
diff --git a/interface/src/project/OptionIcon.tsx b/interface/src/app/main/OptionIcon.tsx
similarity index 100%
rename from interface/src/project/OptionIcon.tsx
rename to interface/src/app/main/OptionIcon.tsx
diff --git a/interface/src/project/Scheduler.tsx b/interface/src/app/main/Scheduler.tsx
similarity index 100%
rename from interface/src/project/Scheduler.tsx
rename to interface/src/app/main/Scheduler.tsx
diff --git a/interface/src/project/SchedulerDialog.tsx b/interface/src/app/main/SchedulerDialog.tsx
similarity index 100%
rename from interface/src/project/SchedulerDialog.tsx
rename to interface/src/app/main/SchedulerDialog.tsx
diff --git a/interface/src/project/Sensors.tsx b/interface/src/app/main/Sensors.tsx
similarity index 100%
rename from interface/src/project/Sensors.tsx
rename to interface/src/app/main/Sensors.tsx
diff --git a/interface/src/project/SensorsAnalogDialog.tsx b/interface/src/app/main/SensorsAnalogDialog.tsx
similarity index 100%
rename from interface/src/project/SensorsAnalogDialog.tsx
rename to interface/src/app/main/SensorsAnalogDialog.tsx
diff --git a/interface/src/project/SensorsTemperatureDialog.tsx b/interface/src/app/main/SensorsTemperatureDialog.tsx
similarity index 100%
rename from interface/src/project/SensorsTemperatureDialog.tsx
rename to interface/src/app/main/SensorsTemperatureDialog.tsx
diff --git a/interface/src/project/api.ts b/interface/src/app/main/api.ts
similarity index 98%
rename from interface/src/project/api.ts
rename to interface/src/app/main/api.ts
index 7f123c7b6..b2c4bd0d0 100644
--- a/interface/src/project/api.ts
+++ b/interface/src/app/main/api.ts
@@ -50,9 +50,6 @@ export const writeAnalogSensor = (as: WriteAnalogSensor) =>
// Activity
export const readActivity = () => alovaInstance.Get('/rest/activity');
-// Scan devices
-export const scanDevices = () => alovaInstance.Post('/rest/scanDevices');
-
// API, used in HelpInformation
export const API = (apiCall: APIcall) => alovaInstance.Post('/api', apiCall);
diff --git a/interface/src/project/deviceValue.ts b/interface/src/app/main/deviceValue.ts
similarity index 100%
rename from interface/src/project/deviceValue.ts
rename to interface/src/app/main/deviceValue.ts
diff --git a/interface/src/project/types.ts b/interface/src/app/main/types.ts
similarity index 100%
rename from interface/src/project/types.ts
rename to interface/src/app/main/types.ts
diff --git a/interface/src/project/validators.ts b/interface/src/app/main/validators.ts
similarity index 100%
rename from interface/src/project/validators.ts
rename to interface/src/app/main/validators.ts
diff --git a/interface/src/framework/ap/APSettings.tsx b/interface/src/app/settings/APSettings.tsx
similarity index 98%
rename from interface/src/framework/ap/APSettings.tsx
rename to interface/src/app/settings/APSettings.tsx
index 21a8d49ae..d2a9accb4 100644
--- a/interface/src/framework/ap/APSettings.tsx
+++ b/interface/src/app/settings/APSettings.tsx
@@ -15,7 +15,8 @@ import {
FormLoader,
SectionContent,
ValidatedPasswordField,
- ValidatedTextField
+ ValidatedTextField,
+ useLayoutTitle
} from 'components';
import { useI18nContext } from 'i18n/i18n-react';
import { range } from 'lodash-es';
@@ -47,6 +48,8 @@ const APSettings: FC = () => {
const { LL } = useI18nContext();
+ useLayoutTitle(LL.SETTINGS_OF(LL.ACCESS_POINT(0)));
+
const [fieldErrors, setFieldErrors] = useState();
const updateFormValue = updateValueDirty(
diff --git a/interface/src/project/ApplicationSettings.tsx b/interface/src/app/settings/ApplicationSettings.tsx
similarity index 98%
rename from interface/src/project/ApplicationSettings.tsx
rename to interface/src/app/settings/ApplicationSettings.tsx
index 069863994..b419aa9b7 100644
--- a/interface/src/project/ApplicationSettings.tsx
+++ b/interface/src/app/settings/ApplicationSettings.tsx
@@ -20,6 +20,7 @@ import {
import * as SystemApi from 'api/system';
import { useRequest } from 'alova';
+import RestartMonitor from 'app/status/RestartMonitor';
import type { ValidateFieldsError } from 'async-validator';
import {
BlockFormControlLabel,
@@ -31,15 +32,14 @@ import {
ValidatedTextField,
useLayoutTitle
} from 'components';
-import RestartMonitor from 'framework/system/RestartMonitor';
import { useI18nContext } from 'i18n/i18n-react';
import { numberValue, updateValueDirty, useRest } from 'utils';
import { validate } from 'validators';
-import * as EMSESP from './api';
-import { BOARD_PROFILES } from './types';
-import type { Settings } from './types';
-import { createSettingsValidator } from './validators';
+import * as EMSESP from '../main/api';
+import { BOARD_PROFILES } from '../main/types';
+import type { Settings } from '../main/types';
+import { createSettingsValidator } from '../main/validators';
export function boardProfileSelectItems() {
return Object.keys(BOARD_PROFILES).map((code) => (
@@ -115,7 +115,7 @@ const ApplicationSettings: FC = () => {
});
};
- useLayoutTitle(LL.APPLICATION());
+ useLayoutTitle(LL.SETTINGS_OF(LL.APPLICATION()));
const content = () => {
if (!data) {
diff --git a/interface/src/framework/mqtt/MqttSettings.tsx b/interface/src/app/settings/MqttSettings.tsx
similarity index 99%
rename from interface/src/framework/mqtt/MqttSettings.tsx
rename to interface/src/app/settings/MqttSettings.tsx
index ce59362c5..6ccf77680 100644
--- a/interface/src/framework/mqtt/MqttSettings.tsx
+++ b/interface/src/app/settings/MqttSettings.tsx
@@ -23,7 +23,8 @@ import {
FormLoader,
SectionContent,
ValidatedPasswordField,
- ValidatedTextField
+ ValidatedTextField,
+ useLayoutTitle
} from 'components';
import { useI18nContext } from 'i18n/i18n-react';
import type { MqttSettingsType } from 'types';
@@ -48,6 +49,7 @@ const MqttSettings: FC = () => {
});
const { LL } = useI18nContext();
+ useLayoutTitle(LL.SETTINGS_OF('MQTT'));
const [fieldErrors, setFieldErrors] = useState();
diff --git a/interface/src/framework/ntp/NTPSettings.tsx b/interface/src/app/settings/NTPSettings.tsx
similarity index 98%
rename from interface/src/framework/ntp/NTPSettings.tsx
rename to interface/src/app/settings/NTPSettings.tsx
index b24f22633..ae8ef094a 100644
--- a/interface/src/framework/ntp/NTPSettings.tsx
+++ b/interface/src/app/settings/NTPSettings.tsx
@@ -15,7 +15,8 @@ import {
ButtonRow,
FormLoader,
SectionContent,
- ValidatedTextField
+ ValidatedTextField,
+ useLayoutTitle
} from 'components';
import { useI18nContext } from 'i18n/i18n-react';
import type { NTPSettingsType } from 'types';
@@ -43,6 +44,7 @@ const NTPSettings: FC = () => {
});
const { LL } = useI18nContext();
+ useLayoutTitle(LL.SETTINGS_OF('NTP'));
const updateFormValue = updateValueDirty(
origData,
diff --git a/interface/src/framework/Settings.tsx b/interface/src/app/settings/Settings.tsx
similarity index 93%
rename from interface/src/framework/Settings.tsx
rename to interface/src/app/settings/Settings.tsx
index 1d17db0fb..a9e49f8ca 100644
--- a/interface/src/framework/Settings.tsx
+++ b/interface/src/app/settings/Settings.tsx
@@ -79,15 +79,15 @@ const Settings: FC = () => {
@@ -95,7 +95,7 @@ const Settings: FC = () => {
@@ -103,7 +103,7 @@ const Settings: FC = () => {
@@ -111,14 +111,14 @@ const Settings: FC = () => {
diff --git a/interface/src/framework/ntp/TZ.tsx b/interface/src/app/settings/TZ.tsx
similarity index 100%
rename from interface/src/framework/ntp/TZ.tsx
rename to interface/src/app/settings/TZ.tsx
diff --git a/interface/src/framework/system/UploadDownload.tsx b/interface/src/app/settings/UploadDownload.tsx
similarity index 98%
rename from interface/src/framework/system/UploadDownload.tsx
rename to interface/src/app/settings/UploadDownload.tsx
index 8c159ef4e..6c49d6842 100644
--- a/interface/src/framework/system/UploadDownload.tsx
+++ b/interface/src/app/settings/UploadDownload.tsx
@@ -6,8 +6,9 @@ import { Box, Button, Divider, Link, Typography } from '@mui/material';
import * as SystemApi from 'api/system';
-import * as EMSESP from 'project/api';
+import * as EMSESP from 'app/main/api';
import { useRequest } from 'alova';
+import type { APIcall } from 'app/main/types';
import {
FormLoader,
SectionContent,
@@ -15,9 +16,8 @@ import {
useLayoutTitle
} from 'components';
import { useI18nContext } from 'i18n/i18n-react';
-import type { APIcall } from 'project/types';
-import RestartMonitor from './RestartMonitor';
+import RestartMonitor from '../status/RestartMonitor';
const UploadDownload: FC = () => {
const { LL } = useI18nContext();
diff --git a/interface/src/framework/network/Network.tsx b/interface/src/app/settings/network/Network.tsx
similarity index 88%
rename from interface/src/framework/network/Network.tsx
rename to interface/src/app/settings/network/Network.tsx
index 2d524c63a..0088a93b8 100644
--- a/interface/src/framework/network/Network.tsx
+++ b/interface/src/app/settings/network/Network.tsx
@@ -9,13 +9,12 @@ import { useI18nContext } from 'i18n/i18n-react';
import type { WiFiNetwork } from 'types';
import NetworkSettings from './NetworkSettings';
-import NetworkStatus from './NetworkStatus';
import { WiFiConnectionContext } from './WiFiConnectionContext';
import WiFiNetworkScanner from './WiFiNetworkScanner';
const Network: FC = () => {
const { LL } = useI18nContext();
- useLayoutTitle(LL.NETWORK(0));
+ useLayoutTitle(LL.SETTINGS_OF(LL.NETWORK(0)));
const { routerTab } = useRouterTab();
@@ -45,11 +44,9 @@ const Network: FC = () => {
>
-
- } />
} />
} />
} />
diff --git a/interface/src/framework/network/NetworkSettings.tsx b/interface/src/app/settings/network/NetworkSettings.tsx
similarity index 99%
rename from interface/src/framework/network/NetworkSettings.tsx
rename to interface/src/app/settings/network/NetworkSettings.tsx
index 16d173f2b..cc1d8386a 100644
--- a/interface/src/framework/network/NetworkSettings.tsx
+++ b/interface/src/app/settings/network/NetworkSettings.tsx
@@ -44,7 +44,7 @@ import { updateValueDirty, useRest } from 'utils';
import { validate } from 'validators';
import { createNetworkSettingsValidator } from 'validators/network';
-import RestartMonitor from '../system/RestartMonitor';
+import RestartMonitor from '../../status/RestartMonitor';
import { WiFiConnectionContext } from './WiFiConnectionContext';
import { isNetworkOpen, networkSecurityMode } from './WiFiNetworkSelector';
diff --git a/interface/src/framework/network/WiFiConnectionContext.tsx b/interface/src/app/settings/network/WiFiConnectionContext.tsx
similarity index 100%
rename from interface/src/framework/network/WiFiConnectionContext.tsx
rename to interface/src/app/settings/network/WiFiConnectionContext.tsx
diff --git a/interface/src/framework/network/WiFiNetworkScanner.tsx b/interface/src/app/settings/network/WiFiNetworkScanner.tsx
similarity index 100%
rename from interface/src/framework/network/WiFiNetworkScanner.tsx
rename to interface/src/app/settings/network/WiFiNetworkScanner.tsx
diff --git a/interface/src/framework/network/WiFiNetworkSelector.tsx b/interface/src/app/settings/network/WiFiNetworkSelector.tsx
similarity index 100%
rename from interface/src/framework/network/WiFiNetworkSelector.tsx
rename to interface/src/app/settings/network/WiFiNetworkSelector.tsx
diff --git a/interface/src/framework/security/GenerateToken.tsx b/interface/src/app/settings/security/GenerateToken.tsx
similarity index 100%
rename from interface/src/framework/security/GenerateToken.tsx
rename to interface/src/app/settings/security/GenerateToken.tsx
diff --git a/interface/src/framework/security/ManageUsers.tsx b/interface/src/app/settings/security/ManageUsers.tsx
similarity index 100%
rename from interface/src/framework/security/ManageUsers.tsx
rename to interface/src/app/settings/security/ManageUsers.tsx
diff --git a/interface/src/framework/security/Security.tsx b/interface/src/app/settings/security/Security.tsx
similarity index 94%
rename from interface/src/framework/security/Security.tsx
rename to interface/src/app/settings/security/Security.tsx
index 94e306b22..32d452af2 100644
--- a/interface/src/framework/security/Security.tsx
+++ b/interface/src/app/settings/security/Security.tsx
@@ -11,7 +11,7 @@ import SecuritySettings from './SecuritySettings';
const Security: FC = () => {
const { LL } = useI18nContext();
- useLayoutTitle(LL.SECURITY(0));
+ useLayoutTitle(LL.SETTINGS_OF(LL.SECURITY(0)));
const { routerTab } = useRouterTab();
diff --git a/interface/src/framework/security/SecuritySettings.tsx b/interface/src/app/settings/security/SecuritySettings.tsx
similarity index 100%
rename from interface/src/framework/security/SecuritySettings.tsx
rename to interface/src/app/settings/security/SecuritySettings.tsx
diff --git a/interface/src/framework/security/User.tsx b/interface/src/app/settings/security/User.tsx
similarity index 100%
rename from interface/src/framework/security/User.tsx
rename to interface/src/app/settings/security/User.tsx
diff --git a/interface/src/framework/ap/APStatus.tsx b/interface/src/app/status/APStatus.tsx
similarity index 96%
rename from interface/src/framework/ap/APStatus.tsx
rename to interface/src/app/status/APStatus.tsx
index 9c3e0cbe7..de43be859 100644
--- a/interface/src/framework/ap/APStatus.tsx
+++ b/interface/src/app/status/APStatus.tsx
@@ -19,7 +19,7 @@ import type { Theme } from '@mui/material';
import * as APApi from 'api/ap';
import { useRequest } from 'alova';
-import { ButtonRow, FormLoader, SectionContent } from 'components';
+import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components';
import { useI18nContext } from 'i18n/i18n-react';
import type { APStatusType } from 'types';
import { APNetworkStatus } from 'types';
@@ -41,6 +41,7 @@ const APStatus: FC = () => {
const { data: data, send: loadData, error } = useRequest(APApi.readAPStatus);
const { LL } = useI18nContext();
+ useLayoutTitle(LL.STATUS_OF(LL.ACCESS_POINT(0)));
const theme = useTheme();
diff --git a/interface/src/project/SystemActivity.tsx b/interface/src/app/status/Activity.tsx
similarity index 96%
rename from interface/src/project/SystemActivity.tsx
rename to interface/src/app/status/Activity.tsx
index ade2e653c..1caf3ee86 100644
--- a/interface/src/project/SystemActivity.tsx
+++ b/interface/src/app/status/Activity.tsx
@@ -19,15 +19,15 @@ import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'component
import { useI18nContext } from 'i18n/i18n-react';
import type { Translation } from 'i18n/i18n-types';
-import * as EMSESP from './api';
-import type { Stat } from './types';
+import * as EMSESP from '../main/api';
+import type { Stat } from '../main/types';
const SystemActivity: FC = () => {
const { data: data, send: loadData, error } = useRequest(EMSESP.readActivity);
const { LL } = useI18nContext();
- useLayoutTitle(LL.SYSTEM(0));
+ useLayoutTitle(LL.DATA_TRAFFIC());
const stats_theme = tableTheme({
Table: `
diff --git a/interface/src/framework/system/ESPSystemStatus.tsx b/interface/src/app/status/HardwareStatus.tsx
similarity index 99%
rename from interface/src/framework/system/ESPSystemStatus.tsx
rename to interface/src/app/status/HardwareStatus.tsx
index 5cdc61bbf..e97d77a55 100644
--- a/interface/src/framework/system/ESPSystemStatus.tsx
+++ b/interface/src/app/status/HardwareStatus.tsx
@@ -26,7 +26,7 @@ import { useRequest } from 'alova';
import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components';
import { useI18nContext } from 'i18n/i18n-react';
-import BBQKeesIcon from '../../project/bbqkees.svg';
+import BBQKeesIcon from './bbqkees.svg';
function formatNumber(num: number) {
return new Intl.NumberFormat().format(num);
diff --git a/interface/src/framework/mqtt/MqttStatus.tsx b/interface/src/app/status/MqttStatus.tsx
similarity index 97%
rename from interface/src/framework/mqtt/MqttStatus.tsx
rename to interface/src/app/status/MqttStatus.tsx
index f171b5cee..81475b481 100644
--- a/interface/src/framework/mqtt/MqttStatus.tsx
+++ b/interface/src/app/status/MqttStatus.tsx
@@ -20,7 +20,7 @@ import type { Theme } from '@mui/material';
import * as MqttApi from 'api/mqtt';
import { useRequest } from 'alova';
-import { ButtonRow, FormLoader, SectionContent } from 'components';
+import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components';
import { useI18nContext } from 'i18n/i18n-react';
import type { MqttStatusType } from 'types';
import { MqttDisconnectReason } from 'types';
@@ -61,6 +61,7 @@ const MqttStatus: FC = () => {
const { data: data, send: loadData, error } = useRequest(MqttApi.readMqttStatus);
const { LL } = useI18nContext();
+ useLayoutTitle(LL.STATUS_OF('MQTT'));
const theme = useTheme();
diff --git a/interface/src/framework/ntp/NTPStatus.tsx b/interface/src/app/status/NTPStatus.tsx
similarity index 98%
rename from interface/src/framework/ntp/NTPStatus.tsx
rename to interface/src/app/status/NTPStatus.tsx
index d1a9af611..a07753f8e 100644
--- a/interface/src/framework/ntp/NTPStatus.tsx
+++ b/interface/src/app/status/NTPStatus.tsx
@@ -31,7 +31,7 @@ import * as NTPApi from 'api/ntp';
import { dialogStyle } from 'CustomTheme';
import { useRequest } from 'alova';
-import { ButtonRow, FormLoader, SectionContent } from 'components';
+import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components';
import { useI18nContext } from 'i18n/i18n-react';
import type { NTPStatusType, Time } from 'types';
import { NTPSyncStatus } from 'types';
@@ -45,6 +45,7 @@ const NTPStatus: FC = () => {
const [processing, setProcessing] = useState(false);
const { LL } = useI18nContext();
+ useLayoutTitle(LL.STATUS_OF('NTP'));
const { send: updateTime } = useRequest(
(local_time: Time) => NTPApi.updateTime(local_time),
diff --git a/interface/src/framework/network/NetworkStatus.tsx b/interface/src/app/status/NetworkStatus.tsx
similarity index 98%
rename from interface/src/framework/network/NetworkStatus.tsx
rename to interface/src/app/status/NetworkStatus.tsx
index b189bbc91..683ed0727 100644
--- a/interface/src/framework/network/NetworkStatus.tsx
+++ b/interface/src/app/status/NetworkStatus.tsx
@@ -23,7 +23,7 @@ import type { Theme } from '@mui/material';
import * as NetworkApi from 'api/network';
import { useRequest } from 'alova';
-import { ButtonRow, FormLoader, SectionContent } from 'components';
+import { ButtonRow, FormLoader, SectionContent, useLayoutTitle } from 'components';
import { useI18nContext } from 'i18n/i18n-react';
import type { NetworkStatusType } from 'types';
import { NetworkConnectionStatus } from 'types';
@@ -91,6 +91,7 @@ const NetworkStatus: FC = () => {
} = useRequest(NetworkApi.readNetworkStatus);
const { LL } = useI18nContext();
+ useLayoutTitle(LL.STATUS_OF(LL.NETWORK(1)));
const theme = useTheme();
diff --git a/interface/src/framework/system/RestartMonitor.tsx b/interface/src/app/status/RestartMonitor.tsx
similarity index 100%
rename from interface/src/framework/system/RestartMonitor.tsx
rename to interface/src/app/status/RestartMonitor.tsx
diff --git a/interface/src/framework/system/SystemStatus.tsx b/interface/src/app/status/Status.tsx
similarity index 78%
rename from interface/src/framework/system/SystemStatus.tsx
rename to interface/src/app/status/Status.tsx
index 7c115c495..e3e1f679a 100644
--- a/interface/src/framework/system/SystemStatus.tsx
+++ b/interface/src/app/status/Status.tsx
@@ -1,4 +1,5 @@
import { type FC, useContext, useState } from 'react';
+import { useNavigate } from 'react-router-dom';
import { toast } from 'react-toastify';
import AccessTimeIcon from '@mui/icons-material/AccessTime';
@@ -6,6 +7,7 @@ import BuildIcon from '@mui/icons-material/Build';
import CancelIcon from '@mui/icons-material/Cancel';
import DeviceHubIcon from '@mui/icons-material/DeviceHub';
import DirectionsBusIcon from '@mui/icons-material/DirectionsBus';
+import LogoDevIcon from '@mui/icons-material/LogoDev';
import MemoryIcon from '@mui/icons-material/Memory';
import PermScanWifiIcon from '@mui/icons-material/PermScanWifi';
import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew';
@@ -13,6 +15,7 @@ import RefreshIcon from '@mui/icons-material/Refresh';
import RouterIcon from '@mui/icons-material/Router';
import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna';
import TimerIcon from '@mui/icons-material/Timer';
+import UpgradeIcon from '@mui/icons-material/Upgrade';
import WifiIcon from '@mui/icons-material/Wifi';
import {
Avatar,
@@ -22,7 +25,6 @@ import {
DialogActions,
DialogContent,
DialogTitle,
- Divider,
List,
ListItem,
ListItemAvatar,
@@ -32,14 +34,14 @@ import {
import * as SystemApi from 'api/system';
-import * as EMSESP from 'project/api';
+import * as EMSESP from 'app/main/api';
import { dialogStyle } from 'CustomTheme';
import { useRequest } from 'alova';
+import { busConnectionStatus } from 'app/main/types';
import { FormLoader, SectionContent, useLayoutTitle } from 'components';
import ListMenuItem from 'components/layout/ListMenuItem';
import { AuthenticatedContext } from 'contexts/authentication';
import { useI18nContext } from 'i18n/i18n-react';
-import { busConnectionStatus } from 'project/types';
import { NTPSyncStatus, NetworkConnectionStatus } from 'types';
import RestartMonitor from './RestartMonitor';
@@ -47,12 +49,13 @@ import RestartMonitor from './RestartMonitor';
const SystemStatus: FC = () => {
const { LL } = useI18nContext();
- useLayoutTitle(LL.SYSTEM(0));
+ const navigate = useNavigate();
+
+ useLayoutTitle(LL.STATUS_OF(''));
const { me } = useContext(AuthenticatedContext);
const [confirmRestart, setConfirmRestart] = useState(false);
- const [confirmScan, setConfirmScan] = useState(false);
const [processing, setProcessing] = useState(false);
const [restarting, setRestarting] = useState();
@@ -70,10 +73,6 @@ const SystemStatus: FC = () => {
error
} = useRequest(SystemApi.readSystemStatus, { force: true });
- const { send: scanDevices } = useRequest(EMSESP.scanDevices, {
- immediate: false
- });
-
const theme = useTheme();
const formatDurationSec = (duration_sec: number) => {
@@ -104,14 +103,20 @@ const SystemStatus: FC = () => {
if (data) {
switch (data.status) {
case busConnectionStatus.BUS_STATUS_CONNECTED:
- return LL.CONNECTED(0) + ' (' + formatDurationSec(data.bus_uptime) + ')';
+ return (
+ 'EMS ' +
+ LL.CONNECTED(0) +
+ ' (' +
+ formatDurationSec(data.bus_uptime) +
+ ')'
+ );
case busConnectionStatus.BUS_STATUS_TX_ERRORS:
- return LL.TX_ISSUES();
+ return 'EMS ' + LL.TX_ISSUES();
case busConnectionStatus.BUS_STATUS_OFFLINE:
- return LL.DISCONNECTED();
+ return 'EMS ' + LL.DISCONNECTED();
}
}
- return 'Unknown';
+ return 'EMS state unknown';
};
const busStatusHighlight = () => {
@@ -196,46 +201,6 @@ const SystemStatus: FC = () => {
const activeHighlight = (value: boolean) =>
value ? theme.palette.success.main : theme.palette.info.main;
- const scan = async () => {
- await scanDevices()
- .then(() => {
- toast.info(LL.SCANNING() + '...');
- })
- .catch((error: Error) => {
- toast.error(error.message);
- });
- setConfirmScan(false);
- };
-
- const renderScanDialog = () => (
-
- );
-
const restart = async () => {
setProcessing(true);
await restartCommand()
@@ -313,7 +278,29 @@ const SystemStatus: FC = () => {
return (
<>
-
+
+
+
+
+
+
+
+
+ {me.admin && (
+ }
+ variant="outlined"
+ color="primary"
+ onClick={() => navigate('/settings/upload')}
+ >
+ {LL.UPDATE()}
+
+ )}
+
+
@@ -336,66 +323,24 @@ const SystemStatus: FC = () => {
)}
-
-
-
-
-
-
-
-
- {me.admin && (
- }
- variant="outlined"
- color="primary"
- onClick={() => setConfirmScan(true)}
- >
- {LL.SCAN_DEVICES()}
-
- )}
-
-
-
-
-
-
-
-
{
bgcolor={networkStatusHighlight()}
label={LL.STATUS_OF(LL.NETWORK(1))}
text={networkStatus()}
- to="/settings/network/status"
+ to="/status/network"
/>
-
-
-
+
+
-
- {renderScanDialog()}
{renderRestartDialog()}
diff --git a/interface/src/framework/system/SystemLog.tsx b/interface/src/app/status/SystemLog.tsx
similarity index 99%
rename from interface/src/framework/system/SystemLog.tsx
rename to interface/src/app/status/SystemLog.tsx
index 8ee65396a..bf2ba5f48 100644
--- a/interface/src/framework/system/SystemLog.tsx
+++ b/interface/src/app/status/SystemLog.tsx
@@ -75,7 +75,7 @@ const levelLabel = (level: LogLevel) => {
const SystemLog: FC = () => {
const { LL } = useI18nContext();
- useLayoutTitle(LL.SYSTEM(0));
+ useLayoutTitle(LL.LOG_OF(LL.SYSTEM(0)));
const {
loadData,
diff --git a/interface/src/project/bbqkees.svg b/interface/src/app/status/bbqkees.svg
similarity index 100%
rename from interface/src/project/bbqkees.svg
rename to interface/src/app/status/bbqkees.svg
diff --git a/interface/src/components/layout/LayoutAppBar.tsx b/interface/src/components/layout/LayoutAppBar.tsx
index 3d1a5c433..06e43e798 100644
--- a/interface/src/components/layout/LayoutAppBar.tsx
+++ b/interface/src/components/layout/LayoutAppBar.tsx
@@ -16,11 +16,9 @@ const LayoutAppBar: FC = ({ title, onToggleDrawer }) => {
const pathnames = useLocation()
.pathname.split('/')
.filter((x) => x);
+ const show_back = pathnames.length > 1;
+
const navigate = useNavigate();
- let show_back = false;
- if (pathnames.length > 1) {
- show_back = pathnames[0] !== 'system' || pathnames[1] === 'espsystemstatus';
- }
return (
{
-
+
= ({
}
>
-
+
) : (
-
+
)}
>
diff --git a/interface/src/framework/ap/AccessPoint.tsx b/interface/src/framework/ap/AccessPoint.tsx
deleted file mode 100644
index 08e55ca1f..000000000
--- a/interface/src/framework/ap/AccessPoint.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import type { FC } from 'react';
-import { Navigate, Route, Routes } from 'react-router-dom';
-
-import { Tab } from '@mui/material';
-
-import { RouterTabs, useLayoutTitle, useRouterTab } from 'components';
-import { useI18nContext } from 'i18n/i18n-react';
-
-import APSettings from './APSettings';
-import APStatus from './APStatus';
-
-const AccessPoint: FC = () => {
- const { LL } = useI18nContext();
-
- useLayoutTitle(LL.ACCESS_POINT(0));
-
- const { routerTab } = useRouterTab();
-
- return (
- <>
-
-
-
-
-
- } />
- } />
- } />
-
- >
- );
-};
-
-export default AccessPoint;
diff --git a/interface/src/framework/mqtt/Mqtt.tsx b/interface/src/framework/mqtt/Mqtt.tsx
deleted file mode 100644
index c4e2c9d56..000000000
--- a/interface/src/framework/mqtt/Mqtt.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-import type { FC } from 'react';
-import { Navigate, Route, Routes } from 'react-router-dom';
-
-import { Tab } from '@mui/material';
-
-import { RouterTabs, useLayoutTitle, useRouterTab } from 'components';
-import { useI18nContext } from 'i18n/i18n-react';
-
-import MqttSettings from './MqttSettings';
-import MqttStatus from './MqttStatus';
-
-const Mqtt: FC = () => {
- const { LL } = useI18nContext();
-
- useLayoutTitle('MQTT');
-
- const { routerTab } = useRouterTab();
-
- return (
- <>
-
-
-
-
-
- } />
- } />
- } />
-
- >
- );
-};
-
-export default Mqtt;
diff --git a/interface/src/framework/ntp/NetworkTime.tsx b/interface/src/framework/ntp/NetworkTime.tsx
deleted file mode 100644
index b34f09699..000000000
--- a/interface/src/framework/ntp/NetworkTime.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import type { FC } from 'react';
-import { Navigate, Route, Routes } from 'react-router-dom';
-
-import { Tab } from '@mui/material';
-
-import { RouterTabs, useLayoutTitle, useRouterTab } from 'components';
-import { useI18nContext } from 'i18n/i18n-react';
-
-import NTPSettings from './NTPSettings';
-import NTPStatus from './NTPStatus';
-
-const NetworkTime: FC = () => {
- const { LL } = useI18nContext();
- useLayoutTitle('NTP');
-
- const { routerTab } = useRouterTab();
-
- return (
- <>
-
-
-
-
-
- } />
- } />
- } />
-
- >
- );
-};
-
-export default NetworkTime;
diff --git a/interface/src/framework/system/System.tsx b/interface/src/framework/system/System.tsx
deleted file mode 100644
index 0cc0c28d6..000000000
--- a/interface/src/framework/system/System.tsx
+++ /dev/null
@@ -1,50 +0,0 @@
-import { type FC, useContext } from 'react';
-import { Navigate, Route, Routes } from 'react-router-dom';
-
-import { Tab } from '@mui/material';
-
-import { RequireAdmin, RouterTabs, useLayoutTitle, useRouterTab } from 'components';
-import { AuthenticatedContext } from 'contexts/authentication';
-import { useI18nContext } from 'i18n/i18n-react';
-import SystemActivity from 'project/SystemActivity';
-
-import SystemLog from './SystemLog';
-import SystemStatus from './SystemStatus';
-
-const System: FC = () => {
- const { LL } = useI18nContext();
-
- useLayoutTitle(LL.SYSTEM(0));
-
- const { routerTab } = useRouterTab();
- const { me } = useContext(AuthenticatedContext);
-
- return (
- <>
-
-
-
-
-
-
- } />
- } />
-
-
-
- }
- />
- } />
-
- >
- );
-};
-
-export default System;
diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts
index fe2113107..f0405f0a3 100644
--- a/interface/src/i18n/de/index.ts
+++ b/interface/src/i18n/de/index.ts
@@ -71,13 +71,11 @@ const de: Translation = {
TX_ISSUES: 'Tx-Probleme - versuchen Sie einen anderen Tx-Modus',
DISCONNECTED: 'Getrennt',
EMS_SCAN: 'Möchten Sie wirklich eine vollständige Gerätesuche des EMS-Busses starten?',
- EMS_BUS_STATUS: 'EMS-Busstatus',
- ACTIVE_DEVICES: 'Aktive Geräte und Sensoren',
+ DATA_TRAFFIC: 'Data Traffic', // TODO Translate
EMS_DEVICE: 'EMS Gerät',
SUCCESS: 'ERFOLG',
FAIL: 'FEHLER',
QUALITY: 'QUALITÄT',
- SCAN_DEVICES: 'Nach neuen Geräten suchen',
SCAN: 'Suche',
STATUS_NAMES: [
'EMS-Telegramme empfangen (Rx)',
@@ -89,9 +87,6 @@ const de: Translation = {
'API-Aufrufe',
'Syslog-Mitteilungen'
],
- NUM_DEVICES: '{num} Gerät{{e}}',
- NUM_TEMP_SENSORS: '{num} Temperatursensor{{en}}',
- NUM_ANALOG_SENSORS: '{num} Analogsensor{{en}}',
NUM_DAYS: '{num} Tag{{e}}',
NUM_SECONDS: '{num} Sekunde{{n}}',
NUM_HOURS: '{num} Stunde{{n}}',
@@ -333,7 +328,8 @@ const de: Translation = {
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
RENAME: 'Rename', // TODO translate
- ENABLE_MODBUS: 'Modbus aktivieren'
+ ENABLE_MODBUS: 'Modbus aktivieren',
+ VIEW_LOG: 'View log to diagnose issues' // TODO translate
};
export default de;
diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts
index 42df7e815..78086b8ff 100644
--- a/interface/src/i18n/en/index.ts
+++ b/interface/src/i18n/en/index.ts
@@ -71,13 +71,11 @@ const en: Translation = {
TX_ISSUES: 'Tx issues - check Tx Mode',
DISCONNECTED: 'Disconnected',
EMS_SCAN: 'Are you sure you want to initiate a full device scan of the EMS bus?',
- EMS_BUS_STATUS: 'EMS Bus Status',
- ACTIVE_DEVICES: 'Active Devices & Sensors',
+ DATA_TRAFFIC: 'Data Traffic',
EMS_DEVICE: 'EMS Device',
SUCCESS: 'SUCCESS',
FAIL: 'FAIL',
QUALITY: 'QUALITY',
- SCAN_DEVICES: 'Scan for new devices',
SCAN: 'Scan',
STATUS_NAMES: [
'EMS Telegrams Received (Rx)',
@@ -89,9 +87,6 @@ const en: Translation = {
'API Calls',
'Syslog Messages'
],
- NUM_DEVICES: '{num} Device{{s}}',
- NUM_TEMP_SENSORS: '{num} Temperature Sensor{{s}}',
- NUM_ANALOG_SENSORS: '{num} Analog Sensor{{s}}',
NUM_DAYS: '{num} day{{s}}',
NUM_SECONDS: '{num} second{{s}}',
NUM_HOURS: '{num} hour{{s}}',
@@ -333,7 +328,8 @@ const en: Translation = {
MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules',
MODULES_NONE: 'No external modules detected',
RENAME: 'Rename',
- ENABLE_MODBUS: 'Enable Modbus'
+ ENABLE_MODBUS: 'Enable Modbus',
+ VIEW_LOG: 'View log to diagnose issues'
};
export default en;
diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts
index bca5d1ecd..7a6d8c7fa 100644
--- a/interface/src/i18n/fr/index.ts
+++ b/interface/src/i18n/fr/index.ts
@@ -71,13 +71,11 @@ const fr: Translation = {
TX_ISSUES: 'Problèmes de transmission (Tx) - Essayez un autre mode Tx',
DISCONNECTED: 'Déconnecté',
EMS_SCAN: 'Etes-vous sûr de vouloir lancer un scan complet du bus EMS ?',
- EMS_BUS_STATUS: 'Statut du bus EMS',
- ACTIVE_DEVICES: 'Appareils et capteurs actifs',
+ DATA_TRAFFIC: 'Data Traffic', // TODO Translate
EMS_DEVICE: 'Appareils EMS',
SUCCESS: 'SUCCÈS',
FAIL: 'ÉCHEC',
QUALITY: 'QUALITÉ',
- SCAN_DEVICES: 'Rechercher de nouveaux appareils',
SCAN: 'Scan',
STATUS_NAMES: [
'Télégrammes EMS reçus (Rx)',
@@ -89,9 +87,6 @@ const fr: Translation = {
"Appels à l'API",
'Messages Syslog'
],
- NUM_DEVICES: '{num} Appareil{{s}}',
- NUM_TEMP_SENSORS: '{num} Capteur{{s}} de température',
- NUM_ANALOG_SENSORS: '{num} Capteur{{s}} analogique{{s}}',
NUM_DAYS: '{num} jour{{s}}',
NUM_SECONDS: '{num} seconde{{s}}',
NUM_HOURS: '{num} heure{{s}}',
@@ -333,7 +328,8 @@ const fr: Translation = {
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
RENAME: 'Rename', // TODO translate
- ENABLE_MODBUS: 'Activer Modbus'
+ ENABLE_MODBUS: 'Activer Modbus',
+ VIEW_LOG: 'View log to diagnose issues' // TODO translate
};
export default fr;
diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts
index 0b0e05bf8..ac0b40a65 100644
--- a/interface/src/i18n/it/index.ts
+++ b/interface/src/i18n/it/index.ts
@@ -71,13 +71,11 @@ const it: Translation = {
TX_ISSUES: 'Problema di Tx - prova una modalità differente',
DISCONNECTED: 'Disconnesso',
EMS_SCAN: 'Sei sicuro di voler iniziare una scansione completa del bus EMS ?',
- EMS_BUS_STATUS: 'Stato Bus EMS',
- ACTIVE_DEVICES: 'Dispositivi & sensori attivi',
+ DATA_TRAFFIC: 'Data Traffic', // TODO Translate
EMS_DEVICE: 'Dispositivo EMS ',
SUCCESS: 'SUCCESSO',
FAIL: 'FALLITO',
QUALITY: 'QUALITÂ',
- SCAN_DEVICES: 'Scansione per nuovi dispositivi',
SCAN: 'Scansione',
STATUS_NAMES: [
'Telegrammi EMS Ricevuti (Rx)',
@@ -89,9 +87,6 @@ const it: Translation = {
'Chiamate API',
'Messaggi Syslog'
],
- NUM_DEVICES: '{num} Dispositivi {{s}}',
- NUM_TEMP_SENSORS: '{num} Sensori Temperatura {{s}}',
- NUM_ANALOG_SENSORS: '{num} Sensori Analogici {{s}}',
NUM_DAYS: '{num} giorni {{s}}',
NUM_SECONDS: '{num} secondi {{s}}',
NUM_HOURS: '{num} ore {{s}}',
@@ -333,7 +328,8 @@ const it: Translation = {
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
RENAME: 'Rename', // TODO translate
- ENABLE_MODBUS: 'Abilita Modbus'
+ ENABLE_MODBUS: 'Abilita Modbus',
+ VIEW_LOG: 'View log to diagnose issues' // TODO translate
};
export default it;
diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts
index ef82e4596..68f7a7f0e 100644
--- a/interface/src/i18n/nl/index.ts
+++ b/interface/src/i18n/nl/index.ts
@@ -71,13 +71,11 @@ const nl: Translation = {
TX_ISSUES: 'Tx bus probleem. Probeer een andere Tx verzendmodus',
DISCONNECTED: 'Niet verbonden',
EMS_SCAN: 'Weet je zeker dat je een volledige EMS bus scan uit wilt voeren?',
- EMS_BUS_STATUS: 'EMS busstatus',
- ACTIVE_DEVICES: 'Actieve Apparaten & Sensoren',
+ DATA_TRAFFIC: 'Data Traffic', // TODO Translate
EMS_DEVICE: 'EMS Apparaat',
SUCCESS: 'SUCCESS',
FAIL: 'MISLUKT',
QUALITY: 'QUALITEIT',
- SCAN_DEVICES: 'Scannen naar nieuwe apparaten',
SCAN: 'Scan',
STATUS_NAMES: [
'EMS Telegrammen ontvangen (Rx)',
@@ -89,9 +87,6 @@ const nl: Translation = {
'API calls',
'Syslog berichten'
],
- NUM_DEVICES: '{num} Apparaat{{en}}',
- NUM_TEMP_SENSORS: '{num} Temperatuursensor{{en}}',
- NUM_ANALOG_SENSORS: '{num} Analoge sensor{{en}}',
NUM_DAYS: '{num} dag{{en}}',
NUM_SECONDS: '{num} second{{en}}',
NUM_HOURS: '{num} {{uur|uren}}',
@@ -333,7 +328,8 @@ const nl: Translation = {
MODULES_DESCRIPTION: 'Klik op de module om EMS-ESP library modules te activeren of te deactiveren',
MODULES_NONE: 'Geen externe modules gedetecteerd',
RENAME: 'Hernoemen',
- ENABLE_MODBUS: 'Activeer Modbus'
+ ENABLE_MODBUS: 'Activeer Modbus',
+ VIEW_LOG: 'View log to diagnose issues' // TODO translate
};
export default nl;
diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts
index af78ba486..64b213371 100644
--- a/interface/src/i18n/no/index.ts
+++ b/interface/src/i18n/no/index.ts
@@ -71,13 +71,11 @@ const no: Translation = {
TX_ISSUES: 'Tx problemer - prøv en annen Tx Modus',
DISCONNECTED: 'Frakoblet',
EMS_SCAN: 'Er du sikker på du vil starte full søking av EMS bussen?',
- EMS_BUS_STATUS: 'EMS Buss Status',
- ACTIVE_DEVICES: 'Aktive Enheter og Sensorer',
+ DATA_TRAFFIC: 'Data Traffic', // TODO Translate
EMS_DEVICE: 'EMS Enhet',
SUCCESS: 'VELLYKKET',
FAIL: 'MISLYKKET',
QUALITY: 'KVALITET',
- SCAN_DEVICES: 'Søk etter nye enheter',
SCAN: 'Søk',
STATUS_NAMES: [
'EMS Telegrammer Mottatt (Rx)',
@@ -89,9 +87,6 @@ const no: Translation = {
'API Anrop',
'Syslog Meldinger'
],
- NUM_DEVICES: '{num} Enhet{{er}}',
- NUM_TEMP_SENSORS: '{num} Temperatursensor{{er}}',
- NUM_ANALOG_SENSORS: '{num} Analogsensor{{er}}',
NUM_DAYS: '{num} Dag{{er}}',
NUM_SECONDS: '{num} Sekund{{er}}',
NUM_HOURS: '{num} Time{{r}}',
@@ -333,7 +328,8 @@ const no: Translation = {
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
RENAME: 'Rename', // TODO translate
- ENABLE_MODBUS: 'Aktiver Modbus'
+ ENABLE_MODBUS: 'Aktiver Modbus',
+ VIEW_LOG: 'View log to diagnose issues' // TODO translate
};
export default no;
diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts
index a9ac4803a..1801513ab 100644
--- a/interface/src/i18n/pl/index.ts
+++ b/interface/src/i18n/pl/index.ts
@@ -71,13 +71,11 @@ const pl: BaseTranslation = {
TX_ISSUES: 'problem z zapisem na magistralę EMS, spróbuj wybrać inny "Tryb transmisji (Tx)"',
DISCONNECTED: 'brak połączenia',
EMS_SCAN: 'Czy na pewno wykonać pełne skanowanie magistrali EMS?',
- EMS_BUS_STATUS: 'Status magistrali EMS',
- ACTIVE_DEVICES: 'Aktywne urządzenia i czujniki',
+ DATA_TRAFFIC: 'Data Traffic', // TODO Translate
EMS_DEVICE: 'Urządzenie EMS',
SUCCESS: 'Udane',
FAIL: 'Nieudane',
QUALITY: 'Jakość',
- SCAN_DEVICES: 'Wyszukiwanie nowych urządzeń',
SCAN: 'Skanuj',
STATUS_NAMES: [
'EMS, telegramy odebrane (Rx)',
@@ -89,9 +87,6 @@ const pl: BaseTranslation = {
'Wywołania API',
'Wpisy w SysLog'
],
- NUM_DEVICES: '{num} urządze{{ń|nie|nia|nia|ń}} EMS',
- NUM_TEMP_SENSORS: '{num} czujni{{ków|k|ki|ki|ków}} temperatury',
- NUM_ANALOG_SENSORS: '{num} inn{{ych|e|e|e|ych}} urządze{{ń|nie|nia(two)|nia|ń}} podłączon{{ych|e|e|e|ych}} do EMS-ESP',
NUM_DAYS: '{num} d{{ni|zień|ni|ni|ni}}',
NUM_SECONDS: '{num} sekun{{d|da|dy|dy|d}}',
NUM_HOURS: '{num} godzi{{n|na|ny|ny|n}}',
@@ -333,7 +328,8 @@ const pl: BaseTranslation = {
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
RENAME: 'Rename', // TODO translate
- ENABLE_MODBUS: 'Aktywuj Modbus'
+ ENABLE_MODBUS: 'Aktywuj Modbus',
+ VIEW_LOG: 'View log to diagnose issues' // TODO translate
};
export default pl;
diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts
index 19e4dc097..62c991461 100644
--- a/interface/src/i18n/sk/index.ts
+++ b/interface/src/i18n/sk/index.ts
@@ -71,13 +71,11 @@ const sk: Translation = {
TX_ISSUES: 'Problémy s Tx – skontrolujte Tx režim',
DISCONNECTED: 'Odpojené',
EMS_SCAN: 'Naozaj chcete spustiť úplnú kontrolu zariadenia zbernice EMS?',
- EMS_BUS_STATUS: 'Stav zbernice EMS',
- ACTIVE_DEVICES: 'Aktívne zariadenia a snímače',
+ DATA_TRAFFIC: 'Data Traffic', // TODO Translate
EMS_DEVICE: 'EMS zariadenie',
SUCCESS: 'ÚSPEŠNÉ',
FAIL: 'ZLÝHANIE',
QUALITY: 'KVALITA',
- SCAN_DEVICES: 'Scan pre nové zariadenia',
SCAN: 'Scan',
STATUS_NAMES: [
'EMS Telegramy prijaté (Rx)',
@@ -89,9 +87,6 @@ const sk: Translation = {
'Externé API volania',
'Syslog správy'
],
- NUM_DEVICES: '{num} Zariaden{{í|ie|ia|ia|í|í}}',
- NUM_TEMP_SENSORS: '{num} Teplotn{{ých|ý|é|é|ých|ých}} sníma{{čov|č|če|če|čov|čov}}',
- NUM_ANALOG_SENSORS: '{num} Analogov{{ých|ý|é|é|ých|ých}} sníma{{čov|č|če|če|čov|čov}}',
NUM_DAYS: '{num} d{{ní|eň|ní|ní|ní|ní}}',
NUM_SECONDS: '{num} sek{{únd|unda|undy|undy|únd|únd}}',
NUM_HOURS: '{num} hod{{ín|ina|iny|iny|ín|ín}}',
@@ -333,7 +328,8 @@ const sk: Translation = {
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
RENAME: 'Rename', // TODO translate
- ENABLE_MODBUS: 'Povoliť Modbus'
+ ENABLE_MODBUS: 'Povoliť Modbus',
+ VIEW_LOG: 'View log to diagnose issues' // TODO translate
};
export default sk;
diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts
index afd865a7b..6026de769 100644
--- a/interface/src/i18n/sv/index.ts
+++ b/interface/src/i18n/sv/index.ts
@@ -71,13 +71,11 @@ const sv: Translation = {
TX_ISSUES: 'Sändfel - Prova ett annat TX-läge',
DISCONNECTED: 'Nedkopplad',
EMS_SCAN: 'Är du säker att du vill initiera en full genomsökning av EMS-bussen?',
- EMS_BUS_STATUS: 'Status',
- ACTIVE_DEVICES: 'Aktiva Enheter',
+ DATA_TRAFFIC: 'Data Traffic', // TODO Translate
EMS_DEVICE: 'EMS Enhet',
SUCCESS: 'Lyckades',
FAIL: 'Misslyckades',
QUALITY: 'Kvalitet',
- SCAN_DEVICES: 'Sök efter nya enheter',
SCAN: 'Sök',
STATUS_NAMES: [
'EMS-telegram (Rx)',
@@ -89,9 +87,6 @@ const sv: Translation = {
'API-anrop',
'Syslog-meddelanden'
],
- NUM_DEVICES: '{num} Enhet{{er}}',
- NUM_TEMP_SENSORS: '{num} Temperatur-sensor{{er}}',
- NUM_ANALOG_SENSORS: '{num} Analoga Sensor{{er}}',
NUM_DAYS: '{num} dag{{ar}}',
NUM_SECONDS: '{num} sekund{{er}}',
NUM_HOURS: '{num} timmar',
@@ -333,7 +328,8 @@ const sv: Translation = {
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
RENAME: 'Rename', // TODO translate
- ENABLE_MODBUS: 'Aktivera Modbus'
+ ENABLE_MODBUS: 'Aktivera Modbus',
+ VIEW_LOG: 'View log to diagnose issues' // TODO translate
};
export default sv;
diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts
index bd968418d..07c7b1f84 100644
--- a/interface/src/i18n/tr/index.ts
+++ b/interface/src/i18n/tr/index.ts
@@ -71,13 +71,11 @@ const tr: Translation = {
TX_ISSUES: 'Tx sorunu - başka bir Tx Modu deneyin',
DISCONNECTED: 'Bağlantı kesildi',
EMS_SCAN: 'EMS Hattında tam bir cihaz taraması başlatmak istediğinizden emin misiniz?',
- EMS_BUS_STATUS: 'EMS Hattı Durumu',
- ACTIVE_DEVICES: 'Aktif Cihazlar ve Sensörler',
+ DATA_TRAFFIC: 'Data Traffic', // TODO Translate
EMS_DEVICE: 'EMS Cihazı',
SUCCESS: 'BAŞARILI',
FAIL: 'HATA',
QUALITY: 'KALİTE',
- SCAN_DEVICES: 'Yeni cihaz taraması',
SCAN: 'Tara',
STATUS_NAMES: [
'EMS Telegramlar Alındı (Rx)',
@@ -89,9 +87,6 @@ const tr: Translation = {
'API Aramaları',
'Sistem Kayıt Mesajları'
],
- NUM_DEVICES: '{num} Cihaz{{ları}}',
- NUM_TEMP_SENSORS: '{num} Sıcaklık Sensör{{leri}}',
- NUM_ANALOG_SENSORS: '{num} Analog Sensör{{ler}}',
NUM_DAYS: '{num} gün{{ler}}',
NUM_SECONDS: '{num} saniye{{ler}}',
NUM_HOURS: '{num} saat{{ler}}',
@@ -333,7 +328,8 @@ const tr: Translation = {
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
RENAME: 'Rename', // TODO translate
- ENABLE_MODBUS: 'Enable Modbus' // TODO translate
+ ENABLE_MODBUS: 'Enable Modbus', // TODO translate
+ VIEW_LOG: 'View log to diagnose issues' // TODO translate
};
export default tr;
diff --git a/interface/src/types/system.ts b/interface/src/types/system.ts
index 8bdfdddff..5dfca23c3 100644
--- a/interface/src/types/system.ts
+++ b/interface/src/types/system.ts
@@ -1,4 +1,4 @@
-import type { busConnectionStatus } from 'project/types';
+import type { busConnectionStatus } from 'app/main/types';
import type { NetworkConnectionStatus } from './network';
diff --git a/interface/src/validators/ap.ts b/interface/src/validators/ap.ts
index f67c830e4..5a1514909 100644
--- a/interface/src/validators/ap.ts
+++ b/interface/src/validators/ap.ts
@@ -1,5 +1,5 @@
+import { isAPEnabled } from 'app/settings/APSettings';
import Schema from 'async-validator';
-import { isAPEnabled } from 'framework/ap/APSettings';
import type { APSettingsType } from 'types';
import { IP_ADDRESS_VALIDATOR } from './shared';
diff --git a/lib_standalone/ArduinoJson.h b/lib/ArduinoJson/ArduinoJson.h
similarity index 100%
rename from lib_standalone/ArduinoJson.h
rename to lib/ArduinoJson/ArduinoJson.h
diff --git a/lib/ArduinoJson/README.txt b/lib/ArduinoJson/README.txt
new file mode 100644
index 000000000..78892cf61
--- /dev/null
+++ b/lib/ArduinoJson/README.txt
@@ -0,0 +1,7 @@
+Version 7.1.0
+
+From https://github.com/bblanchon/ArduinoJson/releases
+
+MIT License (MIT)
+
+Copyright © 2014-2024, Benoit BLANCHON
diff --git a/lib_standalone/ModuleLibrary.cpp b/lib_standalone/ModuleLibrary.cpp
new file mode 100644
index 000000000..eae248dd4
--- /dev/null
+++ b/lib_standalone/ModuleLibrary.cpp
@@ -0,0 +1,31 @@
+/*
+ * EMS-ESP - https://github.com/emsesp/EMS-ESP
+ * Copyright 2020-2024 Paul Derbyshire
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+
+#include
+
+void ModuleLibrary::list(JsonObject output) {};
+
+void ModuleLibrary::loop() {};
+
+void ModuleLibrary::start(emsesp::EMSESP * emsesp_main, bool test_mode) {};
+
+bool ModuleLibrary::enable(const char * key, const char * license, bool enable) {
+ return true;
+};
diff --git a/lib_standalone/ModuleLibrary.h b/lib_standalone/ModuleLibrary.h
index 8d77f0e6e..e1d27f236 100644
--- a/lib_standalone/ModuleLibrary.h
+++ b/lib_standalone/ModuleLibrary.h
@@ -38,12 +38,10 @@ class ModuleLibrary {
std::unique_ptr module;
};
- void start(emsesp::EMSESP * emsesp_main, bool test_mode = false) {};
- void loop() {};
- void list(JsonObject output) {};
- bool enable(const char * key, const char * license, bool enable) {
- return true;
- };
+ void start(emsesp::EMSESP * emsesp_main, bool test_mode = false);
+ void loop();
+ void list(JsonObject output);
+ bool enable(const char * key, const char * license, bool enable);
static uuid::log::Logger logger_;
diff --git a/mock-api/rest_server.ts b/mock-api/rest_server.ts
index 4da77f457..a79e400a6 100644
--- a/mock-api/rest_server.ts
+++ b/mock-api/rest_server.ts
@@ -411,6 +411,7 @@ const guest_signin = {
access_token:
'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Imd1ZXN0IiwiYWRtaW4iOmZhbHNlfQ.E_lylR_vGIQFZUGNwcl5F6OkHoaELGsC5zqhi0pAiJE'
};
+
// modify here to simulate admin and guest logins
const signin = admin_signin;
// const signin = guest_signin;
@@ -424,7 +425,6 @@ const EMSESP_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'settings';
const EMSESP_CORE_DATA_ENDPOINT = REST_ENDPOINT_ROOT + 'coreData';
const EMSESP_SENSOR_DATA_ENDPOINT = REST_ENDPOINT_ROOT + 'sensorData';
const EMSESP_DEVICES_ENDPOINT = REST_ENDPOINT_ROOT + 'devices';
-const EMSESP_SCANDEVICES_ENDPOINT = REST_ENDPOINT_ROOT + 'scanDevices';
const EMSESP_DEVICEDATA_ENDPOINT1 = REST_ENDPOINT_ROOT + 'deviceData';
const EMSESP_DEVICEDATA_ENDPOINT2 = REST_ENDPOINT_ROOT + 'deviceData/:id?';
@@ -4324,8 +4324,6 @@ router
return { devices: sorted_devices };
})
- .post(EMSESP_SCANDEVICES_ENDPOINT, () => status(200))
-
.get(EMSESP_DEVICEDATA_ENDPOINT1, (request) =>
request.query.id ? deviceData(Number(request.query.id)) : status(404)
)
diff --git a/pio_local.ini_example b/pio_local.ini_example
index 28a01c6c9..d99543c7d 100644
--- a/pio_local.ini_example
+++ b/pio_local.ini_example
@@ -38,7 +38,6 @@ custom_password = admin
; rm -rf .pio/libdeps/native/EMS-ESP-Modules; pio run -e native -t clean; pio run -e native -t exec
; lib_deps =
; file://../modules/EMS-ESP-Modules
-; bblanchon/ArduinoJson@^7.0.4
[env:native]
extra_scripts =
diff --git a/platformio.ini b/platformio.ini
index 05fd80548..97f4d732a 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -81,7 +81,6 @@ check_flags =
lib_ldf_mode = chain+
lib_deps =
https://github.com/emsesp/EMS-ESP-Modules.git
- bblanchon/ArduinoJson@7.1.0
; build for GitHub Actions CI
; the Web interface is built seperately, so is skipped in extra_scripts
@@ -229,6 +228,7 @@ build_src_flags =
-I./lib/uuid-log/src
-I./lib/semver
-I./lib/PButton
+ -I./lib/ArduinoJson
-I./lib/espMqttClient/src
-I./lib/espMqttClient/src/Transport
build_src_filter =
@@ -244,4 +244,4 @@ build_src_filter =
+<../lib/espMqttClient/src/Transport>
lib_compat_mode = off
lib_ldf_mode = off
-lib_ignore = ArduinoJson
+lib_ignore = Module EMS-ESP-Modules
diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp
index 46c2d26a1..7cfb6b2f0 100644
--- a/src/web/WebDataService.cpp
+++ b/src/web/WebDataService.cpp
@@ -43,18 +43,6 @@ WebDataService::WebDataService(AsyncWebServer * server, SecurityManager * securi
server->on(SENSOR_DATA_SERVICE_PATH,
HTTP_GET,
securityManager->wrapRequest([this](AsyncWebServerRequest * request) { sensor_data(request); }, AuthenticationPredicates::IS_AUTHENTICATED));
-
- // POST's
- server->on(SCAN_DEVICES_SERVICE_PATH,
- HTTP_POST,
- securityManager->wrapRequest([this](AsyncWebServerRequest * request) { scan_devices(request); }, AuthenticationPredicates::IS_ADMIN));
-}
-
-// scan devices service
-void WebDataService::scan_devices(AsyncWebServerRequest * request) {
- EMSESP::logger().info("Scanning devices...");
- EMSESP::scan_devices();
- request->send(200);
}
// this is used in the dashboard and contains all ems device information
diff --git a/src/web/WebDataService.h b/src/web/WebDataService.h
index f85fbe358..390cb80e9 100644
--- a/src/web/WebDataService.h
+++ b/src/web/WebDataService.h
@@ -28,7 +28,6 @@
#define WRITE_DEVICE_VALUE_SERVICE_PATH "/rest/writeDeviceValue"
#define WRITE_TEMPERATURE_SENSOR_SERVICE_PATH "/rest/writeTemperatureSensor"
#define WRITE_ANALOG_SENSOR_SERVICE_PATH "/rest/writeAnalogSensor"
-#define SCAN_DEVICES_SERVICE_PATH "/rest/scanDevices"
namespace emsesp {
@@ -50,7 +49,6 @@ class WebDataService {
void write_device_value(AsyncWebServerRequest * request, JsonVariant json);
void write_temperature_sensor(AsyncWebServerRequest * request, JsonVariant json);
void write_analog_sensor(AsyncWebServerRequest * request, JsonVariant json);
- void scan_devices(AsyncWebServerRequest * request); // command
};
} // namespace emsesp
diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp
index 929ec0f97..63cbd1766 100644
--- a/src/web/WebStatusService.cpp
+++ b/src/web/WebStatusService.cpp
@@ -24,6 +24,7 @@
namespace emsesp {
+// /rest/ESPSystemStatus
WebStatusService::WebStatusService(AsyncWebServer * server, SecurityManager * securityManager) {
server->on(ESPSYSTEM_STATUS_SERVICE_PATH, HTTP_GET, [this](AsyncWebServerRequest * request) { ESPsystemStatus(request); });
server->on(SYSTEM_STATUS_SERVICE_PATH, HTTP_GET, [this](AsyncWebServerRequest * request) { systemStatus(request); });