translate dashboard status

This commit is contained in:
Proddy
2022-08-25 15:50:23 +02:00
parent 1a4ce643fc
commit 1f8e6cc82b
10 changed files with 361 additions and 74 deletions

View File

@@ -105,7 +105,7 @@ const SignIn: FC = () => {
> >
<ValidatedTextField <ValidatedTextField
name="locale" name="locale"
label={LL.LANGUAGE()} label="Language/Sprache"
variant="outlined" variant="outlined"
value={locale || ''} value={locale || ''}
onChange={onLocaleSelected} onChange={onLocaleSelected}

View File

@@ -1,12 +1,29 @@
import { FC, useState, useContext } from 'react'; import { FC, useState, useContext, ChangeEventHandler } from 'react';
import { Box, Button, Divider, IconButton, Popover, Typography, Avatar, styled, TypographyProps } from '@mui/material'; import {
Box,
Button,
Divider,
IconButton,
Popover,
Typography,
Avatar,
styled,
TypographyProps,
MenuItem,
TextField
} from '@mui/material';
import PersonIcon from '@mui/icons-material/Person'; import PersonIcon from '@mui/icons-material/Person';
import AccountCircleIcon from '@mui/icons-material/AccountCircle'; import AccountCircleIcon from '@mui/icons-material/AccountCircle';
import { AuthenticatedContext } from '../../contexts/authentication'; import { AuthenticatedContext } from '../../contexts/authentication';
import { I18nContext } from '../../i18n/i18n-react';
import type { Locales } from '../../i18n/i18n-types';
import { locales } from '../..//i18n/i18n-util';
import { loadLocaleAsync } from '../../i18n/i18n-util.async';
const ItemTypography = styled(Typography)<TypographyProps>({ const ItemTypography = styled(Typography)<TypographyProps>({
maxWidth: '250px', maxWidth: '250px',
whiteSpace: 'nowrap', whiteSpace: 'nowrap',
@@ -23,6 +40,15 @@ const LayoutAuthMenu: FC = () => {
setAnchorEl(event.currentTarget); setAnchorEl(event.currentTarget);
}; };
const { locale, LL, setLocale } = useContext(I18nContext);
const onLocaleSelected: ChangeEventHandler<HTMLInputElement> = async ({ target }) => {
const loc = target.value as Locales;
localStorage.setItem('lang', loc);
await loadLocaleAsync(loc);
setLocale(loc);
};
const handleClose = () => { const handleClose = () => {
setAnchorEl(null); setAnchorEl(null);
}; };
@@ -32,7 +58,20 @@ const LayoutAuthMenu: FC = () => {
return ( return (
<> <>
<IconButton id="open-auth-menu" sx={{ padding: 0 }} aria-describedby={id} color="inherit" onClick={handleClick}> <TextField name="locale" variant="outlined" value={locale} onChange={onLocaleSelected} size="small" select>
{locales.map((loc) => (
<MenuItem key={loc} value={loc}>
{loc}
</MenuItem>
))}
</TextField>
<IconButton
id="open-auth-menu"
sx={{ ml: 1, padding: 0 }}
aria-describedby={id}
color="inherit"
onClick={handleClick}
>
<AccountCircleIcon /> <AccountCircleIcon />
</IconButton> </IconButton>
<Popover <Popover
@@ -62,7 +101,7 @@ const LayoutAuthMenu: FC = () => {
<Divider /> <Divider />
<Box p={1.5}> <Box p={1.5}>
<Button variant="outlined" fullWidth color="primary" onClick={() => signOut(true)}> <Button variant="outlined" fullWidth color="primary" onClick={() => signOut(true)}>
Sign Out {LL.SIGN_OUT()}
</Button> </Button>
</Box> </Box>
</Popover> </Popover>

View File

@@ -4,6 +4,7 @@ const de: Translation = {
LANGUAGE: 'Sprache', LANGUAGE: 'Sprache',
IS_REQUIRED: 'ist nötig', IS_REQUIRED: 'ist nötig',
SIGN_IN: 'Einloggen', SIGN_IN: 'Einloggen',
SIGN_OUT: 'Ausloggen',
USERNAME: 'Nutzername', USERNAME: 'Nutzername',
PASSWORD: 'Passwort', PASSWORD: 'Passwort',
DASHBOARD: 'Armaturenbrett', DASHBOARD: 'Armaturenbrett',
@@ -38,12 +39,36 @@ const de: Translation = {
REMOVE: 'Entfernen', REMOVE: 'Entfernen',
PROBLEM_UPDATING: 'Problem beim Aktualisieren', PROBLEM_UPDATING: 'Problem beim Aktualisieren',
ACCESS_DENIED: 'Zugriff abgelehnt', ACCESS_DENIED: 'Zugriff abgelehnt',
ANALOG_SENSOR: 'Analoger Sensor {cmd}', ANALOG_SENSOR: 'Analoger Sensor{post}',
TEMP_SENSOR: 'Temperatursensor {cmd}', TEMP_SENSOR: 'Temperatursensor{post}',
WRITE_COMMAND: 'Befehl schreiben {cmd}', WRITE_COMMAND: 'Befehl schreiben {cmd}',
EMS_BUS_WARNING: EMS_BUS_WARNING:
'EMS-Bus getrennt. Wenn diese Warnung nach einigen Sekunden immer noch besteht, überprüfen Sie bitte die Einstellungen und das Board-Profil', 'EMS-Bus getrennt. Wenn diese Warnung nach einigen Sekunden immer noch besteht, überprüfen Sie bitte die Einstellungen und das Board-Profil',
EMS_BUS_SCANNING: 'Scannen nach EMS devices...' EMS_BUS_SCANNING: 'Scannen nach EMS devices...',
CONNECTED: 'in Verbindung gebracht',
TX_ISSUES: 'Tx-Probleme - versuchen Sie einen anderen Tx-Modus',
DISCONNECTED: 'Getrennt',
SCANNING: 'Suche nach Geräten...',
EMS_SCAN: 'Möchten Sie wirklich einen vollständigen Gerätescan des EMS-Busses starten?',
EMS_BUS_STATUS: 'EMS Bus Status',
ACTIVE_DEVICES: 'Aktive Geräte und Sensoren',
DEVICE: 'Device',
SUCCESS: 'ERFOLG',
FAIL: 'SCHEITERN',
QUALITY: 'QUALITÄT',
SCAN_DEVICES: 'Nach neuen Geräten suchen',
EMS_BUS_STATUS_TITLE: 'EMS Bus und Aktivitätsstatus',
SCAN: 'Scan',
STATUS_NAMES: [
'EMS Telegramme erhalten (Rx)',
'EMS Liest (Tx)',
'EMS Schreibt (Tx)',
'Temperatursensor liest',
'Analoger Sensor liest',
'MQTT Veröffentlicht',
'API Aufrufe',
'Syslog Mitteilungen'
]
}; };
export default de; export default de;

View File

@@ -4,6 +4,7 @@ const en: BaseTranslation = {
LANGUAGE: 'Language', LANGUAGE: 'Language',
IS_REQUIRED: 'is required', IS_REQUIRED: 'is required',
SIGN_IN: 'Sign In', SIGN_IN: 'Sign In',
SIGN_OUT: 'Sign Out',
USERNAME: 'Username', USERNAME: 'Username',
PASSWORD: 'Password', PASSWORD: 'Password',
DASHBOARD: 'Dashboard', DASHBOARD: 'Dashboard',
@@ -38,12 +39,36 @@ const en: BaseTranslation = {
REMOVE: 'Remove', REMOVE: 'Remove',
PROBLEM_UPDATING: 'Problem updating', PROBLEM_UPDATING: 'Problem updating',
ACCESS_DENIED: 'Access Denied', ACCESS_DENIED: 'Access Denied',
ANALOG_SENSOR: 'Analog Sensor {cmd}', ANALOG_SENSOR: 'Analog Sensor{post}',
TEMP_SENSOR: 'Temperature Sensor {cmd}', TEMP_SENSOR: 'Temperature Sensor{post}',
WRITE_COMMAND: 'Write command {cmd}', WRITE_COMMAND: 'Write command {cmd}',
EMS_BUS_WARNING: EMS_BUS_WARNING:
'EMS bus disconnected. If this warning still persists after a few seconds please check settings and board profile', 'EMS bus disconnected. If this warning still persists after a few seconds please check settings and board profile',
EMS_BUS_SCANNING: 'Scanning for EMS devices...' EMS_BUS_SCANNING: 'Scanning for EMS devices...',
CONNECTED: 'Connected',
TX_ISSUES: 'Tx issues - try a different Tx Mode',
DISCONNECTED: 'Disconnected',
SCANNING: 'Scanning for devices...',
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',
DEVICE: 'Device',
SUCCESS: 'SUCCESS',
FAIL: 'FAIL',
QUALITY: 'QUALITY',
SCAN_DEVICES: 'Scan for new devices',
EMS_BUS_STATUS_TITLE: 'EMS Bus & Activity Status',
SCAN: 'Scan',
STATUS_NAMES: [
'EMS Telegrams Received (Rx)',
'EMS Reads (Tx)',
'EMS Writes (Tx)',
'Temperature Sensor Reads',
'Analog Sensor Reads',
'MQTT Publishes',
'API Calls',
'Syslog Messages'
]
}; };
export default en; export default en;

View File

@@ -26,6 +26,10 @@ type RootTranslation = {
* Sign In * Sign In
*/ */
SIGN_IN: string SIGN_IN: string
/**
* Sign Out
*/
SIGN_OUT: string
/** /**
* Username * Username
*/ */
@@ -164,15 +168,15 @@ type RootTranslation = {
*/ */
ACCESS_DENIED: string ACCESS_DENIED: string
/** /**
* Analog Sensor {cmd} * Analog Sensor{post}
* @param {unknown} cmd * @param {unknown} post
*/ */
ANALOG_SENSOR: RequiredParams<'cmd'> ANALOG_SENSOR: RequiredParams<'post'>
/** /**
* Temperature Sensor {cmd} * Temperature Sensor{post}
* @param {unknown} cmd * @param {unknown} post
*/ */
TEMP_SENSOR: RequiredParams<'cmd'> TEMP_SENSOR: RequiredParams<'post'>
/** /**
* Write command {cmd} * Write command {cmd}
* @param {unknown} cmd * @param {unknown} cmd
@@ -186,6 +190,96 @@ type RootTranslation = {
* Scanning for EMS devices... * Scanning for EMS devices...
*/ */
EMS_BUS_SCANNING: string EMS_BUS_SCANNING: string
/**
* Connected
*/
CONNECTED: string
/**
* Tx issues - try a different Tx Mode
*/
TX_ISSUES: string
/**
* Disconnected
*/
DISCONNECTED: string
/**
* Scanning for devices...
*/
SCANNING: string
/**
* Are you sure you want to initiate a full device scan of the EMS bus?
*/
EMS_SCAN: string
/**
* EMS Bus Status
*/
EMS_BUS_STATUS: string
/**
* Active Devices & Sensors
*/
ACTIVE_DEVICES: string
/**
* Device
*/
DEVICE: string
/**
* SUCCESS
*/
SUCCESS: string
/**
* FAIL
*/
FAIL: string
/**
* QUALITY
*/
QUALITY: string
/**
* Scan for new devices
*/
SCAN_DEVICES: string
/**
* EMS Bus & Activity Status
*/
EMS_BUS_STATUS_TITLE: string
/**
* Scan
*/
SCAN: string
STATUS_NAMES: {
/**
* EMS Telegrams Received (Rx)
*/
'0': string
/**
* EMS Reads (Tx)
*/
'1': string
/**
* EMS Writes (Tx)
*/
'2': string
/**
* Temperature Sensor Reads
*/
'3': string
/**
* Analog Sensor Reads
*/
'4': string
/**
* MQTT Publishes
*/
'5': string
/**
* API Calls
*/
'6': string
/**
* Syslog Messages
*/
'7': string
}
} }
export type TranslationFunctions = { export type TranslationFunctions = {
@@ -201,6 +295,10 @@ export type TranslationFunctions = {
* Sign In * Sign In
*/ */
SIGN_IN: () => LocalizedString SIGN_IN: () => LocalizedString
/**
* Sign Out
*/
SIGN_OUT: () => LocalizedString
/** /**
* Username * Username
*/ */
@@ -338,13 +436,13 @@ export type TranslationFunctions = {
*/ */
ACCESS_DENIED: () => LocalizedString ACCESS_DENIED: () => LocalizedString
/** /**
* Analog Sensor {cmd} * Analog Sensor{post}
*/ */
ANALOG_SENSOR: (arg: { cmd: unknown }) => LocalizedString ANALOG_SENSOR: (arg: { post: unknown }) => LocalizedString
/** /**
* Temperature Sensor {cmd} * Temperature Sensor{post}
*/ */
TEMP_SENSOR: (arg: { cmd: unknown }) => LocalizedString TEMP_SENSOR: (arg: { post: unknown }) => LocalizedString
/** /**
* Write command {cmd} * Write command {cmd}
*/ */
@@ -357,6 +455,96 @@ export type TranslationFunctions = {
* Scanning for EMS devices... * Scanning for EMS devices...
*/ */
EMS_BUS_SCANNING: () => LocalizedString EMS_BUS_SCANNING: () => LocalizedString
/**
* Connected
*/
CONNECTED: () => LocalizedString
/**
* Tx issues - try a different Tx Mode
*/
TX_ISSUES: () => LocalizedString
/**
* Disconnected
*/
DISCONNECTED: () => LocalizedString
/**
* Scanning for devices...
*/
SCANNING: () => LocalizedString
/**
* Are you sure you want to initiate a full device scan of the EMS bus?
*/
EMS_SCAN: () => LocalizedString
/**
* EMS Bus Status
*/
EMS_BUS_STATUS: () => LocalizedString
/**
* Active Devices & Sensors
*/
ACTIVE_DEVICES: () => LocalizedString
/**
* Device
*/
DEVICE: () => LocalizedString
/**
* SUCCESS
*/
SUCCESS: () => LocalizedString
/**
* FAIL
*/
FAIL: () => LocalizedString
/**
* QUALITY
*/
QUALITY: () => LocalizedString
/**
* Scan for new devices
*/
SCAN_DEVICES: () => LocalizedString
/**
* EMS Bus & Activity Status
*/
EMS_BUS_STATUS_TITLE: () => LocalizedString
/**
* Scan
*/
SCAN: () => LocalizedString
STATUS_NAMES: {
/**
* EMS Telegrams Received (Rx)
*/
'0': () => LocalizedString
/**
* EMS Reads (Tx)
*/
'1': () => LocalizedString
/**
* EMS Writes (Tx)
*/
'2': () => LocalizedString
/**
* Temperature Sensor Reads
*/
'3': () => LocalizedString
/**
* Analog Sensor Reads
*/
'4': () => LocalizedString
/**
* MQTT Publishes
*/
'5': () => LocalizedString
/**
* API Calls
*/
'6': () => LocalizedString
/**
* Syslog Messages
*/
'7': () => LocalizedString
}
} }
export type Formatters = {} export type Formatters = {}

View File

@@ -530,11 +530,11 @@ const DashboardData: FC = () => {
offset: sensor.o offset: sensor.o
}); });
if (response.status === 204) { if (response.status === 204) {
enqueueSnackbar(LL.TEMP_SENSOR({ cmd: 'change failed' }), { variant: 'error' }); enqueueSnackbar(LL.TEMP_SENSOR({ post: ' change failed' }), { variant: 'error' });
} else if (response.status === 403) { } else if (response.status === 403) {
enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' }); enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' });
} else { } else {
enqueueSnackbar(LL.TEMP_SENSOR({ cmd: 'removed' }), { variant: 'success' }); enqueueSnackbar(LL.TEMP_SENSOR({ post: ' removed' }), { variant: 'success' });
} }
setSensor(undefined); setSensor(undefined);
} catch (error: unknown) { } catch (error: unknown) {
@@ -955,11 +955,11 @@ const DashboardData: FC = () => {
}); });
if (response.status === 204) { if (response.status === 204) {
enqueueSnackbar(LL.ANALOG_SENSOR({ cmd: 'deletion failed' }), { variant: 'error' }); enqueueSnackbar(LL.ANALOG_SENSOR({ post: ' deletion failed' }), { variant: 'error' });
} else if (response.status === 403) { } else if (response.status === 403) {
enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' }); enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' });
} else { } else {
enqueueSnackbar(LL.ANALOG_SENSOR({ cmd: 'removed' }), { variant: 'success' }); enqueueSnackbar(LL.ANALOG_SENSOR({ post: ' removed' }), { variant: 'success' });
} }
} catch (error: unknown) { } catch (error: unknown) {
enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' }); enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' });
@@ -983,11 +983,11 @@ const DashboardData: FC = () => {
}); });
if (response.status === 204) { if (response.status === 204) {
enqueueSnackbar(LL.ANALOG_SENSOR({ cmd: 'update failed' }), { variant: 'error' }); enqueueSnackbar(LL.ANALOG_SENSOR({ post: ' update failed' }), { variant: 'error' });
} else if (response.status === 403) { } else if (response.status === 403) {
enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' }); enqueueSnackbar(LL.ACCESS_DENIED(), { variant: 'error' });
} else { } else {
enqueueSnackbar(LL.ANALOG_SENSOR({ cmd: 'updated' }), { variant: 'success' }); enqueueSnackbar(LL.ANALOG_SENSOR({ post: ' updated' }), { variant: 'success' });
} }
} catch (error: unknown) { } catch (error: unknown) {
enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' }); enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' });

View File

@@ -36,6 +36,9 @@ import { formatDurationSec, pluralize, extractErrorMessage, useRest } from '../u
import * as EMSESP from './api'; import * as EMSESP from './api';
import type { Translation } from '../i18n/i18n-types';
import { useI18nContext } from '../i18n/i18n-react';
export const isConnected = ({ status }: Status) => status !== busConnectionStatus.BUS_STATUS_OFFLINE; export const isConnected = ({ status }: Status) => status !== busConnectionStatus.BUS_STATUS_OFFLINE;
const busStatusHighlight = ({ status }: Status, theme: Theme) => { const busStatusHighlight = ({ status }: Status, theme: Theme) => {
@@ -51,19 +54,6 @@ const busStatusHighlight = ({ status }: Status, theme: Theme) => {
} }
}; };
const busStatus = ({ status }: Status) => {
switch (status) {
case busConnectionStatus.BUS_STATUS_CONNECTED:
return 'Connected';
case busConnectionStatus.BUS_STATUS_TX_ERRORS:
return 'Tx issues - try a different Tx Mode';
case busConnectionStatus.BUS_STATUS_OFFLINE:
return 'Disconnected';
default:
return 'Unknown';
}
};
const showQuality = (stat: Stat) => { const showQuality = (stat: Stat) => {
if (stat.q === 0 || stat.s + stat.f === 0) { if (stat.q === 0 || stat.s + stat.f === 0) {
return; return;
@@ -81,12 +71,32 @@ const showQuality = (stat: Stat) => {
const DashboardStatus: FC = () => { const DashboardStatus: FC = () => {
const { loadData, data, errorMessage } = useRest<Status>({ read: EMSESP.readStatus }); const { loadData, data, errorMessage } = useRest<Status>({ read: EMSESP.readStatus });
const { LL } = useI18nContext();
const theme = useTheme(); const theme = useTheme();
const [confirmScan, setConfirmScan] = useState<boolean>(false); const [confirmScan, setConfirmScan] = useState<boolean>(false);
const { enqueueSnackbar } = useSnackbar(); const { enqueueSnackbar } = useSnackbar();
const { me } = useContext(AuthenticatedContext); const { me } = useContext(AuthenticatedContext);
const showName = (id: any) => {
let name: keyof Translation['STATUS_NAMES'] = id;
return LL.STATUS_NAMES[name]();
};
const busStatus = ({ status }: Status) => {
switch (status) {
case busConnectionStatus.BUS_STATUS_CONNECTED:
return LL.CONNECTED();
case busConnectionStatus.BUS_STATUS_TX_ERRORS:
return LL.TX_ISSUES();
case busConnectionStatus.BUS_STATUS_OFFLINE:
return LL.DISCONNECTED();
default:
return 'Unknown';
}
};
const stats_theme = tableTheme({ const stats_theme = tableTheme({
Table: ` Table: `
--data-table-library_grid-template-columns: repeat(1, minmax(0, 1fr)) 90px 90px 80px; --data-table-library_grid-template-columns: repeat(1, minmax(0, 1fr)) 90px 90px 80px;
@@ -137,9 +147,9 @@ const DashboardStatus: FC = () => {
const scan = async () => { const scan = async () => {
try { try {
await EMSESP.scanDevices(); await EMSESP.scanDevices();
enqueueSnackbar('Scanning for devices...', { variant: 'info' }); enqueueSnackbar(LL.SCANNING(), { variant: 'info' });
} catch (error: unknown) { } catch (error: unknown) {
enqueueSnackbar(extractErrorMessage(error, 'Problem initiating scan'), { variant: 'error' }); enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' });
} finally { } finally {
setConfirmScan(false); setConfirmScan(false);
} }
@@ -147,14 +157,14 @@ const DashboardStatus: FC = () => {
const renderScanDialog = () => ( const renderScanDialog = () => (
<Dialog open={confirmScan} onClose={() => setConfirmScan(false)}> <Dialog open={confirmScan} onClose={() => setConfirmScan(false)}>
<DialogTitle>EMS Device Scan</DialogTitle> <DialogTitle>{LL.SCAN_DEVICES()}</DialogTitle>
<DialogContent dividers>Are you sure you want to initiate a full device scan of the EMS bus?</DialogContent> <DialogContent dividers>{LL.EMS_SCAN()}</DialogContent>
<DialogActions> <DialogActions>
<Button startIcon={<CancelIcon />} variant="outlined" onClick={() => setConfirmScan(false)} color="secondary"> <Button startIcon={<CancelIcon />} variant="outlined" onClick={() => setConfirmScan(false)} color="secondary">
Cancel {LL.CANCEL()}
</Button> </Button>
<Button startIcon={<PermScanWifiIcon />} variant="outlined" onClick={scan} color="primary" autoFocus> <Button startIcon={<PermScanWifiIcon />} variant="outlined" onClick={scan} color="primary" autoFocus>
Scan {LL.SCAN()}
</Button> </Button>
</DialogActions> </DialogActions>
</Dialog> </Dialog>
@@ -174,7 +184,7 @@ const DashboardStatus: FC = () => {
<DirectionsBusIcon /> <DirectionsBusIcon />
</Avatar> </Avatar>
</ListItemAvatar> </ListItemAvatar>
<ListItemText primary="EMS Bus Status" secondary={busStatus(data) + formatDurationSec(data.uptime)} /> <ListItemText primary={LL.EMS_BUS_STATUS()} secondary={busStatus(data) + formatDurationSec(data.uptime)} />
</ListItem> </ListItem>
<ListItem> <ListItem>
<ListItemAvatar> <ListItemAvatar>
@@ -183,13 +193,13 @@ const DashboardStatus: FC = () => {
</Avatar> </Avatar>
</ListItemAvatar> </ListItemAvatar>
<ListItemText <ListItemText
primary="Active Devices &amp; Sensors" primary={LL.ACTIVE_DEVICES()}
secondary={ secondary={
pluralize(data.num_devices, 'EMS Device') + pluralize(data.num_devices, 'EMS ' + LL.DEVICE()) +
', ' + ', ' +
pluralize(data.num_sensors, 'Temperature Sensor') + pluralize(data.num_sensors, LL.TEMP_SENSOR({ post: '' })) +
', ' + ', ' +
pluralize(data.num_analogs, 'Analog Sensor') pluralize(data.num_analogs, LL.ANALOG_SENSOR({ post: '' }))
} }
/> />
</ListItem> </ListItem>
@@ -200,15 +210,15 @@ const DashboardStatus: FC = () => {
<Header> <Header>
<HeaderRow> <HeaderRow>
<HeaderCell resize></HeaderCell> <HeaderCell resize></HeaderCell>
<HeaderCell stiff>SUCCESS</HeaderCell> <HeaderCell stiff>{LL.SUCCESS()}</HeaderCell>
<HeaderCell stiff>FAIL</HeaderCell> <HeaderCell stiff>{LL.FAIL()}</HeaderCell>
<HeaderCell stiff>QUALITY</HeaderCell> <HeaderCell stiff>{LL.QUALITY()}</HeaderCell>
</HeaderRow> </HeaderRow>
</Header> </Header>
<Body> <Body>
{tableList.map((stat: Stat) => ( {tableList.map((stat: Stat) => (
<Row key={stat.id} item={stat}> <Row key={stat.id} item={stat}>
<Cell>{stat.id}</Cell> <Cell>{showName(stat.id)}</Cell>
<Cell stiff>{Intl.NumberFormat().format(stat.s)}</Cell> <Cell stiff>{Intl.NumberFormat().format(stat.s)}</Cell>
<Cell stiff>{Intl.NumberFormat().format(stat.f)}</Cell> <Cell stiff>{Intl.NumberFormat().format(stat.f)}</Cell>
<Cell stiff>{showQuality(stat)}</Cell> <Cell stiff>{showQuality(stat)}</Cell>
@@ -223,7 +233,7 @@ const DashboardStatus: FC = () => {
<Box display="flex" flexWrap="wrap"> <Box display="flex" flexWrap="wrap">
<Box flexGrow={1} sx={{ '& button': { mt: 2 } }}> <Box flexGrow={1} sx={{ '& button': { mt: 2 } }}>
<Button startIcon={<RefreshIcon />} variant="outlined" color="secondary" onClick={loadData}> <Button startIcon={<RefreshIcon />} variant="outlined" color="secondary" onClick={loadData}>
Refresh {LL.REFRESH()}
</Button> </Button>
</Box> </Box>
<Box flexWrap="nowrap" whiteSpace="nowrap"> <Box flexWrap="nowrap" whiteSpace="nowrap">
@@ -235,7 +245,7 @@ const DashboardStatus: FC = () => {
disabled={!me.admin} disabled={!me.admin}
onClick={() => setConfirmScan(true)} onClick={() => setConfirmScan(true)}
> >
Scan for new devices {LL.SCAN_DEVICES()}
</Button> </Button>
</ButtonRow> </ButtonRow>
</Box> </Box>
@@ -245,7 +255,7 @@ const DashboardStatus: FC = () => {
}; };
return ( return (
<SectionContent title="EMS Bus &amp; Activity Status" titleGutter> <SectionContent title={LL.EMS_BUS_STATUS_TITLE()} titleGutter>
{content()} {content()}
</SectionContent> </SectionContent>
); );

View File

@@ -42,7 +42,7 @@ export enum busConnectionStatus {
} }
export interface Stat { export interface Stat {
id: string; // name id: string; // id - needs to be a string
s: number; // success s: number; // success
f: number; // fail f: number; // fail
q: number; // quality q: number; // quality

View File

@@ -425,13 +425,13 @@ const status = {
num_sensors: 1, num_sensors: 1,
num_analogs: 1, num_analogs: 1,
stats: [ stats: [
{ id: 'EMS Telegrams Received (Rx)', s: 56506, f: 11, q: 100 }, { id: '0', s: 56506, f: 11, q: 100 },
{ id: 'EMS Reads (Tx)', s: 9026, f: 0, q: 100 }, { id: '1', s: 9026, f: 0, q: 100 },
{ id: 'EMS Writes (Tx)', s: 33, f: 2, q: 95 }, { id: '2', s: 33, f: 2, q: 95 },
{ id: 'Temperature Sensor Reads', s: 56506, f: 11, q: 100 }, { id: '3', s: 56506, f: 11, q: 100 },
{ id: 'Analog Sensor Reads', s: 0, f: 0, q: 100 }, { id: '4', s: 0, f: 0, q: 100 },
{ id: 'MQTT Publishes', s: 12, f: 10, q: 20 }, { id: '5', s: 12, f: 10, q: 20 },
{ id: 'API Calls', s: 0, f: 0, q: 0 }, { id: '6', s: 0, f: 0, q: 0 },
], ],
} }

View File

@@ -141,47 +141,47 @@ void WebStatusService::webStatusService(AsyncWebServerRequest * request) {
JsonObject statJson; JsonObject statJson;
statJson = statsJson.createNestedObject(); statJson = statsJson.createNestedObject();
statJson["id"] = "EMS Telegrams Received (Rx)"; statJson["id"] = "0";
statJson["s"] = EMSESP::rxservice_.telegram_count(); statJson["s"] = EMSESP::rxservice_.telegram_count();
statJson["f"] = EMSESP::rxservice_.telegram_error_count(); statJson["f"] = EMSESP::rxservice_.telegram_error_count();
statJson["q"] = EMSESP::rxservice_.quality(); statJson["q"] = EMSESP::rxservice_.quality();
statJson = statsJson.createNestedObject(); statJson = statsJson.createNestedObject();
statJson["id"] = "EMS Reads (Tx)"; statJson["id"] = "1";
statJson["s"] = EMSESP::txservice_.telegram_read_count(); statJson["s"] = EMSESP::txservice_.telegram_read_count();
statJson["f"] = EMSESP::txservice_.telegram_read_fail_count(); statJson["f"] = EMSESP::txservice_.telegram_read_fail_count();
statJson["q"] = EMSESP::txservice_.read_quality(); statJson["q"] = EMSESP::txservice_.read_quality();
statJson = statsJson.createNestedObject(); statJson = statsJson.createNestedObject();
statJson["id"] = "EMS Writes (Tx)"; statJson["id"] = "2";
statJson["s"] = EMSESP::txservice_.telegram_write_count(); statJson["s"] = EMSESP::txservice_.telegram_write_count();
statJson["f"] = EMSESP::txservice_.telegram_write_fail_count(); statJson["f"] = EMSESP::txservice_.telegram_write_fail_count();
statJson["q"] = EMSESP::txservice_.write_quality(); statJson["q"] = EMSESP::txservice_.write_quality();
if (EMSESP::dallassensor_.dallas_enabled()) { if (EMSESP::dallassensor_.dallas_enabled()) {
statJson = statsJson.createNestedObject(); statJson = statsJson.createNestedObject();
statJson["id"] = "Temperature Sensor Reads"; statJson["id"] = "3";
statJson["s"] = EMSESP::dallassensor_.reads(); statJson["s"] = EMSESP::dallassensor_.reads();
statJson["f"] = EMSESP::dallassensor_.fails(); statJson["f"] = EMSESP::dallassensor_.fails();
statJson["q"] = EMSESP::dallassensor_.reads() == 0 ? 100 : 100 - (uint8_t)((100 * EMSESP::dallassensor_.fails()) / EMSESP::dallassensor_.reads()); statJson["q"] = EMSESP::dallassensor_.reads() == 0 ? 100 : 100 - (uint8_t)((100 * EMSESP::dallassensor_.fails()) / EMSESP::dallassensor_.reads());
} }
if (EMSESP::analog_enabled()) { if (EMSESP::analog_enabled()) {
statJson = statsJson.createNestedObject(); statJson = statsJson.createNestedObject();
statJson["id"] = "Analog Sensor Reads"; statJson["id"] = "4";
statJson["s"] = EMSESP::analogsensor_.reads(); statJson["s"] = EMSESP::analogsensor_.reads();
statJson["f"] = EMSESP::analogsensor_.fails(); statJson["f"] = EMSESP::analogsensor_.fails();
statJson["q"] = EMSESP::analogsensor_.reads() == 0 ? 100 : 100 - (uint8_t)((100 * EMSESP::analogsensor_.fails()) / EMSESP::analogsensor_.reads()); statJson["q"] = EMSESP::analogsensor_.reads() == 0 ? 100 : 100 - (uint8_t)((100 * EMSESP::analogsensor_.fails()) / EMSESP::analogsensor_.reads());
} }
if (Mqtt::enabled()) { if (Mqtt::enabled()) {
statJson = statsJson.createNestedObject(); statJson = statsJson.createNestedObject();
statJson["id"] = "MQTT Publishes"; statJson["id"] = "5";
statJson["s"] = Mqtt::publish_count(); statJson["s"] = Mqtt::publish_count();
statJson["f"] = Mqtt::publish_fails(); statJson["f"] = Mqtt::publish_fails();
statJson["q"] = Mqtt::publish_count() == 0 ? 100 : 100 - (uint8_t)((100 * Mqtt::publish_fails()) / (Mqtt::publish_count() + Mqtt::publish_fails())); statJson["q"] = Mqtt::publish_count() == 0 ? 100 : 100 - (uint8_t)((100 * Mqtt::publish_fails()) / (Mqtt::publish_count() + Mqtt::publish_fails()));
} }
statJson = statsJson.createNestedObject(); statJson = statsJson.createNestedObject();
statJson["id"] = "API Calls"; statJson["id"] = "6";
statJson["s"] = WebAPIService::api_count(); // + WebAPIService::api_fails(); statJson["s"] = WebAPIService::api_count(); // + WebAPIService::api_fails();
statJson["f"] = WebAPIService::api_fails(); statJson["f"] = WebAPIService::api_fails();
statJson["q"] = statJson["q"] =
@@ -190,7 +190,7 @@ void WebStatusService::webStatusService(AsyncWebServerRequest * request) {
#ifndef EMSESP_STANDALONE #ifndef EMSESP_STANDALONE
if (EMSESP::system_.syslog_enabled()) { if (EMSESP::system_.syslog_enabled()) {
statJson = statsJson.createNestedObject(); statJson = statsJson.createNestedObject();
statJson["id"] = "Syslog Messages"; statJson["id"] = "7";
statJson["s"] = EMSESP::system_.syslog_count(); statJson["s"] = EMSESP::system_.syslog_count();
statJson["f"] = EMSESP::system_.syslog_fails(); statJson["f"] = EMSESP::system_.syslog_fails();
statJson["q"] = EMSESP::system_.syslog_count() == 0 statJson["q"] = EMSESP::system_.syslog_count() == 0