diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 3afe24493..a35d0dc12 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -2,7 +2,6 @@
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
- "arcanis.vscode-zipfs",
"dbaeumer.vscode-eslint",
"esbenp.prettier-vscode",
"platformio.platformio-ide"
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 932d9fce9..1b4c362dd 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -41,5 +41,6 @@
"**/*.min.*",
"**/*.map",
"**/ArduinoJson/**"
- ]
+ ],
+ "cSpell.enableFiletypes": ["!cpp"]
}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 51c2b2e25..3a33589d4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,27 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+# [3.6.1] September 9 2023
+
+## **IMPORTANT! BREAKING CHANGES**
+
+- `shower_data` MQTT topic shows duration is seconds (was previously a full english sentence)
+
+## Added
+
+- show WiFi rssi in Network Status Page, show quality as color
+
+## Fixed
+
+- Issue in espMqttClient causing a memory leak when MQTT broker is disconnected due to network unavailability [#1264](https://github.com/emsesp/EMS-ESP32/issues/1264)
+- Using MQTT enum values correctly formatted in MQTT Discovery [#1280](https://github.com/emsesp/EMS-ESP32/issues/1280)
+
+## Changed
+
+- mqtt free mem check set to 60 kb
+- small cosmetic changes to Searching in Customization web page
+- updated to espressif32@6.4.0
+
# [3.6.0] August 13 2023
## **IMPORTANT! BREAKING CHANGES**
diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md
index 9d1fc704e..cfb39924f 100644
--- a/CHANGELOG_LATEST.md
+++ b/CHANGELOG_LATEST.md
@@ -1,11 +1,22 @@
# Changelog
-# [3.7.0]
+## [3.6.1]
## **IMPORTANT! BREAKING CHANGES**
+- `shower_data` MQTT topic shows duration is seconds (was previously a full english sentence)
+
## Added
+- show WiFi rssi in Network Status Page, show quality as color
+
## Fixed
+- Issue in espMqttClient causing a memory leak when MQTT broker is disconnected due to network unavailability [#1264](https://github.com/emsesp/EMS-ESP32/issues/1264)
+- Using MQTT enum values correctly formatted in MQTT Discovery [#1280](https://github.com/emsesp/EMS-ESP32/issues/1280)
+
## Changed
+
+- mqtt free mem check set to 60 kb
+- small cosmetic changes to Searching in Customization web page
+- updated to espressif32@6.4.0
diff --git a/Makefile b/Makefile
index e39169edb..c860bdc79 100644
--- a/Makefile
+++ b/Makefile
@@ -42,7 +42,7 @@ DEFINES += -DARDUINOJSON_ENABLE_STD_STRING=1 -DARDUINOJSON_ENABLE_PROGMEM=1 -DAR
DEFINES += -DEMSESP_DEBUG -DEMSESP_STANDALONE -DEMSESP_TEST -D__linux__ -DEMC_RX_BUFFER_SIZE=1500
DEFINES += $(ARGS)
-DEFAULTS = -DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.6.0-dev\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32\"
+DEFAULTS = -DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.7.0-dev\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32\"
#----------------------------------------------------------------------
# Sources & Files
diff --git a/interface/.typesafe-i18n.json b/interface/.typesafe-i18n.json
index 00ccfe2f4..ab39dacfa 100644
--- a/interface/.typesafe-i18n.json
+++ b/interface/.typesafe-i18n.json
@@ -1,5 +1,5 @@
{
"adapter": "react",
"baseLocale": "pl",
- "$schema": "https://unpkg.com/typesafe-i18n@5.26.0/schema/typesafe-i18n.json"
+ "$schema": "https://unpkg.com/typesafe-i18n@5.26.2/schema/typesafe-i18n.json"
}
\ No newline at end of file
diff --git a/interface/package.json b/interface/package.json
index d88012510..334fd10f1 100644
--- a/interface/package.json
+++ b/interface/package.json
@@ -12,7 +12,7 @@
"build-hosted": "vite build --mode hosted",
"preview": "vite preview",
"preview-standalone": "npm-run-all -p preview typesafe-i18n mock-api",
- "mock-api": "nodemon --watch ../mock-api ../mock-api/server.js",
+ "mock-api": "node --watch ../mock-api ../mock-api/server.js",
"standalone": "npm-run-all -p dev typesafe-i18n mock-api",
"typesafe-i18n": "typesafe-i18n",
"format": "prettier --write '**/*.{ts,tsx,js,css,json,md}'",
@@ -22,55 +22,54 @@
"@alova/adapter-xhr": "^1.0.1",
"@emotion/react": "^11.11.1",
"@emotion/styled": "^11.11.0",
- "@mui/icons-material": "^5.14.3",
- "@mui/material": "^5.14.4",
+ "@mui/icons-material": "^5.14.8",
+ "@mui/material": "^5.14.8",
"@preact/compat": "^17.1.2",
"@prefresh/vite": "^2.4.1",
"@table-library/react-table-library": "4.1.7",
- "@types/lodash-es": "^4.17.8",
- "@types/node": "^20.4.10",
- "@types/react": "^18.2.20",
+ "@types/lodash-es": "^4.17.9",
+ "@types/node": "^20.6.0",
+ "@types/react": "^18.2.21",
"@types/react-dom": "^18.2.7",
"@types/react-router-dom": "^5.3.3",
- "alova": "^2.10.0",
+ "alova": "^2.11.1",
"async-validator": "^4.2.5",
"history": "^5.3.0",
"jwt-decode": "^3.1.2",
"lodash-es": "^4.17.21",
"mime-types": "^2.1.35",
- "preact": "^10.16.0",
+ "preact": "^10.17.1",
"react": "latest",
"react-dom": "latest",
"react-dropzone": "^14.2.3",
- "react-icons": "^4.10.1",
+ "react-icons": "^4.11.0",
"react-router-dom": "^6.15.0",
"react-toastify": "^9.1.3",
"sockette": "^2.0.6",
- "typesafe-i18n": "^5.26.0",
- "typescript": "^5.1.6"
+ "typesafe-i18n": "^5.26.2",
+ "typescript": "^5.2.2"
},
"devDependencies": {
- "@babel/core": "^7.22.10",
+ "@babel/core": "^7.22.17",
"@preact/preset-vite": "^2.5.0",
"@types/babel__core": "^7",
- "@typescript-eslint/eslint-plugin": "^6.3.0",
- "@typescript-eslint/parser": "^6.3.0",
- "eslint": "^8.47.0",
+ "@typescript-eslint/eslint-plugin": "^6.6.0",
+ "@typescript-eslint/parser": "^6.6.0",
+ "eslint": "^8.49.0",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-typescript": "^17.1.0",
"eslint-config-prettier": "^9.0.0",
"eslint-import-resolver-typescript": "^3.6.0",
"eslint-plugin-autofix": "^1.1.0",
- "eslint-plugin-import": "^2.28.0",
+ "eslint-plugin-import": "^2.28.1",
"eslint-plugin-jsx-a11y": "^6.7.1",
"eslint-plugin-prettier": "alpha",
- "eslint-plugin-react": "^7.33.1",
+ "eslint-plugin-react": "^7.33.2",
"eslint-plugin-react-hooks": "^4.6.0",
- "nodemon": "^3.0.1",
"npm-run-all": "^4.1.5",
- "prettier": "^3.0.1",
+ "prettier": "^3.0.3",
"rollup-plugin-visualizer": "^5.9.2",
- "terser": "^5.19.2",
+ "terser": "^5.19.4",
"vite": "^4.4.9",
"vite-plugin-svgr": "^3.2.0",
"vite-tsconfig-paths": "^4.2.0"
diff --git a/interface/src/framework/network/NetworkStatusForm.tsx b/interface/src/framework/network/NetworkStatusForm.tsx
index 5994237c1..9d94d2490 100644
--- a/interface/src/framework/network/NetworkStatusForm.tsx
+++ b/interface/src/framework/network/NetworkStatusForm.tsx
@@ -38,6 +38,15 @@ const networkStatusHighlight = ({ status }: NetworkStatus, theme: Theme) => {
}
};
+const networkQualityHighlight = ({ rssi }: NetworkStatus, theme: Theme) => {
+ if (rssi <= -85) {
+ return theme.palette.error.main;
+ } else if (rssi <= -75) {
+ return theme.palette.warning.main;
+ }
+ return theme.palette.success.main;
+};
+
export const isWiFi = ({ status }: NetworkStatus) => status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED;
export const isEthernet = ({ status }: NetworkStatus) => status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED;
@@ -110,11 +119,11 @@ const NetworkStatusForm: FC = () => {
<>
-
+
-
+
>
diff --git a/interface/src/framework/network/WiFiNetworkSelector.tsx b/interface/src/framework/network/WiFiNetworkSelector.tsx
index 9b3593ac4..865db65ab 100644
--- a/interface/src/framework/network/WiFiNetworkSelector.tsx
+++ b/interface/src/framework/network/WiFiNetworkSelector.tsx
@@ -1,10 +1,11 @@
import LockIcon from '@mui/icons-material/Lock';
import LockOpenIcon from '@mui/icons-material/LockOpen';
import WifiIcon from '@mui/icons-material/Wifi';
-import { Avatar, Badge, List, ListItem, ListItemAvatar, ListItemIcon, ListItemText } from '@mui/material';
+import { Avatar, Badge, List, ListItem, ListItemAvatar, ListItemIcon, ListItemText, useTheme } from '@mui/material';
import { useContext } from 'react';
import { WiFiConnectionContext } from './WiFiConnectionContext';
+import type { Theme } from '@mui/material';
import type { FC } from 'react';
import type { WiFiNetwork, WiFiNetworkList } from 'types';
import { MessageBox } from 'components';
@@ -42,8 +43,18 @@ export const networkSecurityMode = ({ encryption_type }: WiFiNetwork) => {
}
};
+const networkQualityHighlight = ({ rssi }: WiFiNetwork, theme: Theme) => {
+ if (rssi <= -85) {
+ return theme.palette.error.main;
+ } else if (rssi <= -75) {
+ return theme.palette.warning.main;
+ }
+ return theme.palette.success.main;
+};
+
const WiFiNetworkSelector: FC = ({ networkList }) => {
const { LL } = useI18nContext();
+ const theme = useTheme();
const wifiConnectionContext = useContext(WiFiConnectionContext);
@@ -57,8 +68,8 @@ const WiFiNetworkSelector: FC = ({ networkList }) => {
secondary={'Security: ' + networkSecurityMode(network) + ', Ch: ' + network.channel}
/>
-
-
+
+
diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx
index 2fb0e47b0..db41d3761 100644
--- a/interface/src/project/SettingsCustomization.tsx
+++ b/interface/src/project/SettingsCustomization.tsx
@@ -86,7 +86,7 @@ const SettingsCustomization: FC = () => {
const entities_theme = useTheme({
Table: `
- --data-table-library_grid-template-columns: 150px repeat(1, minmax(80px, 1fr)) 45px minmax(45px, auto) minmax(120px, auto);
+ --data-table-library_grid-template-columns: 156px repeat(1, minmax(80px, 1fr)) 45px minmax(45px, auto) minmax(120px, auto);
`,
BaseRow: `
font-size: 14px;
@@ -192,17 +192,9 @@ const SettingsCustomization: FC = () => {
return value;
}
- function formatName(de: DeviceEntity) {
- return (
- <>
- {de.n && (de.n[0] === '!' ? LL.COMMAND(1) + ': ' + de.n.slice(1) : de.cn && de.cn !== '' ? de.cn : de.n) + ' '}(
-
- {de.id}
-
- )
- >
- );
- }
+ const formatName = (de: DeviceEntity, withShortname: boolean) =>
+ (de.n && de.n[0] === '!' ? LL.COMMAND(1) + ': ' + de.n.slice(1) : de.cn && de.cn !== '' ? de.cn : de.n) +
+ (withShortname ? ' ' + de.id : '');
const getMaskNumber = (newMask: string[]) => {
let new_mask = 0;
@@ -232,10 +224,13 @@ const SettingsCustomization: FC = () => {
return new_masks;
};
+ const filter_entity = (de: DeviceEntity) =>
+ (de.m & selectedFilters || !selectedFilters) && formatName(de, true).includes(search.toLocaleLowerCase());
+
const maskDisabled = (set: boolean) => {
setDeviceEntities(
deviceEntities.map(function (de) {
- if ((de.m & selectedFilters || !selectedFilters) && de.id.toLowerCase().includes(search.toLowerCase())) {
+ if (filter_entity(de)) {
return {
...de,
m: set
@@ -353,7 +348,7 @@ const SettingsCustomization: FC = () => {
margin="normal"
select
>
-