Merge pull request #1891 from proddy/dev

camelCase, added free_caps to webUI, renamed EMSESPStatus endpoint to Hardware
This commit is contained in:
Proddy
2024-07-25 15:20:03 +02:00
committed by GitHub
13 changed files with 217 additions and 210 deletions

View File

@@ -23,10 +23,10 @@ _Make sure your have performed every step and checked the applicable boxes befor
- [ ] Searched the issue in [discussions](https://github.com/emsesp/EMS-ESP32/discussions)
- [ ] Searched the issue in the [docs](https://emsesp.github.io/docs/Troubleshooting/)
- [ ] Searched the issue in the [chat](https://discord.gg/3J3GgnzpyT)
- [ ] Provide the output of <http://ems-esp.local/api/system> :
- [ ] Provide the System information in the area below, taken from `http://<IP>/api/system`
```lua
System information output here:
```json
Paste System information here....
```
@@ -47,4 +47,4 @@ _If applicable, add screenshots to help explain your issue._
_Add any other context about the issue here._
**(Please, remember to close the issue when it has been addressed)**
**(Please remember to close the issue when it has been addressed)**

View File

@@ -2,12 +2,12 @@
## [3.7.0]
## **IMPORTANT! BREAKING CHANGES**
## **IMPORTANT! BREAKING CHANGES with 3.6.5**
- new device WATER shows dhw entities from MM100 and SM100 in dhw setting
- renamed WWC to DHW, always create DHW nests/topics, remove ww prefix from mqtt names [#1634](https://github.com/emsesp/EMS-ESP32/issues/1634)
- change temperaturesensor id to underscore
- system/info API command has the word 'Info' removed from the object name for each section (E.g. 'Network Info' is now just 'Network')
- system/info API command has it's JSON keys and names changed to camelCase
## Added
@@ -52,3 +52,4 @@
- Include TXT file along with the generated CSV for Device Data export/download
- thermostat/remotetemp as command [#1835](https://github.com/emsesp/EMS-ESP32/discussions/1835)
- temperaturesensor id notation with underscore [#1794](https://github.com/emsesp/EMS-ESP32/discussions/1794)
- Change key-names in JSON to be compliant and consistent [#1860](https://github.com/emsesp/EMS-ESP32/issues/1860)

View File

@@ -26,8 +26,8 @@
"@alova/scene-react": "^1.6.1",
"@emotion/react": "^11.13.0",
"@emotion/styled": "^11.13.0",
"@mui/icons-material": "^5.16.4",
"@mui/material": "^5.16.4",
"@mui/icons-material": "^5.16.5",
"@mui/material": "^5.16.5",
"@table-library/react-table-library": "4.1.7",
"@types/lodash-es": "^4.17.12",
"@types/node": "^20.14.12",
@@ -59,12 +59,12 @@
"concurrently": "^8.2.2",
"eslint": "^9.7.0",
"eslint-config-prettier": "^9.1.0",
"preact": "^10.23.0",
"preact": "^10.23.1",
"prettier": "^3.3.3",
"rollup-plugin-visualizer": "^5.12.0",
"terser": "^5.31.3",
"typescript-eslint": "8.0.0-alpha.10",
"vite": "^5.3.4",
"vite": "^5.3.5",
"vite-plugin-imagemin": "^0.6.1",
"vite-tsconfig-paths": "^4.3.2"
},

View File

@@ -3,13 +3,13 @@
/* eslint-disable @typescript-eslint/no-unsafe-call */
/* eslint-disable @typescript-eslint/no-unsafe-return */
import type { ESPSystemStatus, LogSettings, SystemStatus } from 'types';
import type { HardwareStatus, LogSettings, SystemStatus } from 'types';
import { alovaInstance, alovaInstanceGH } from './endpoints';
// ESPSystemStatus - also used to ping in Restart monitor for pinging
export const readESPSystemStatus = () =>
alovaInstance.Get<ESPSystemStatus>('/rest/ESPSystemStatus');
// HardwareStatus - also used to ping in Restart monitor for pinging
export const readHardwareStatus = () =>
alovaInstance.Get<HardwareStatus>('/rest/HardwareStatus');
// SystemStatus
export const readSystemStatus = () =>

View File

@@ -57,7 +57,7 @@ const UploadDownload: FC = () => {
data: data,
send: loadData,
error
} = useRequest(SystemApi.readESPSystemStatus, { force: true });
} = useRequest(SystemApi.readHardwareStatus, { force: true });
const { data: latestVersion } = useRequest(SystemApi.getStableVersion, {
immediate: true,

View File

@@ -32,7 +32,7 @@ function formatNumber(num: number) {
return new Intl.NumberFormat().format(num);
}
const ESPSystemStatus: FC = () => {
const HardwareStatus: FC = () => {
const { LL } = useI18nContext();
useLayoutTitle(LL.STATUS_OF(LL.HARDWARE()));
@@ -41,7 +41,7 @@ const ESPSystemStatus: FC = () => {
data: data,
send: loadData,
error
} = useRequest(SystemApi.readESPSystemStatus, { force: true });
} = useRequest(SystemApi.readHardwareStatus, { force: true });
const content = () => {
if (!data) {
@@ -117,7 +117,9 @@ const ESPSystemStatus: FC = () => {
formatNumber(data.free_heap) +
' KB (' +
formatNumber(data.max_alloc_heap) +
' KB max alloc)'
' KB max alloc, ' +
formatNumber(data.free_caps) +
' KB caps)'
}
/>
</ListItem>
@@ -218,4 +220,4 @@ const ESPSystemStatus: FC = () => {
return <SectionContent>{content()}</SectionContent>;
};
export default ESPSystemStatus;
export default HardwareStatus;

View File

@@ -2,7 +2,7 @@ import type { busConnectionStatus } from 'app/main/types';
import type { NetworkConnectionStatus } from './network';
export interface ESPSystemStatus {
export interface HardwareStatus {
emsesp_version: string;
esp_platform: string;
max_alloc_heap: number;
@@ -24,6 +24,7 @@ export interface ESPSystemStatus {
psram_size?: number;
free_psram?: number;
has_loader: boolean;
free_caps: number;
model: string;
}

View File

@@ -1187,16 +1187,16 @@ __metadata:
languageName: node
linkType: hard
"@mui/core-downloads-tracker@npm:^5.16.4":
version: 5.16.4
resolution: "@mui/core-downloads-tracker@npm:5.16.4"
checksum: 10c0/639099e14132a66a472a92432d2b0fca7c2ebb718afcc22b4a1ebd537fe34f96fed57d95e84525461d1ab2a41672a14a746da7de8060ed3a60fafc0beadb3ebb
"@mui/core-downloads-tracker@npm:^5.16.5":
version: 5.16.5
resolution: "@mui/core-downloads-tracker@npm:5.16.5"
checksum: 10c0/f8052e42e0694b4c95b0edf1893325417ac76fbe9b7714ddad56f607f251d5edbdecf3e7ae34b28ecd7e6d9eee4d3f958d3ff743db98cb35d4e69eef30dd0e23
languageName: node
linkType: hard
"@mui/icons-material@npm:^5.16.4":
version: 5.16.4
resolution: "@mui/icons-material@npm:5.16.4"
"@mui/icons-material@npm:^5.16.5":
version: 5.16.5
resolution: "@mui/icons-material@npm:5.16.5"
dependencies:
"@babel/runtime": "npm:^7.23.9"
peerDependencies:
@@ -1206,19 +1206,19 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
checksum: 10c0/e6cd3b64dd02d21182f0a0509d412a084fdea8752e4a202907cd1cf92a5476ec87e6074a409ebcb9a35e29c91d20729e9eddd9530c1d3755a93b0f56cf3be519
checksum: 10c0/6ba9cbb5bc7a5d3fbc297683973c7c15c4a95f8b12cf55cadd069d4ecbaf5639bb9044da82ddc029c04203ee81a8ac691ea5ada769dc86fef3f25a13fcec44fe
languageName: node
linkType: hard
"@mui/material@npm:^5.16.4":
version: 5.16.4
resolution: "@mui/material@npm:5.16.4"
"@mui/material@npm:^5.16.5":
version: 5.16.5
resolution: "@mui/material@npm:5.16.5"
dependencies:
"@babel/runtime": "npm:^7.23.9"
"@mui/core-downloads-tracker": "npm:^5.16.4"
"@mui/system": "npm:^5.16.4"
"@mui/core-downloads-tracker": "npm:^5.16.5"
"@mui/system": "npm:^5.16.5"
"@mui/types": "npm:^7.2.15"
"@mui/utils": "npm:^5.16.4"
"@mui/utils": "npm:^5.16.5"
"@popperjs/core": "npm:^2.11.8"
"@types/react-transition-group": "npm:^4.4.10"
clsx: "npm:^2.1.0"
@@ -1239,16 +1239,16 @@ __metadata:
optional: true
"@types/react":
optional: true
checksum: 10c0/ab12f3219d3a6b5dd3564e7b3826e283167c64b947774e3e35301419d35cd9875d45d8625e8c145d59fe38c7a7ef110251b11a47b94e5468fa96afbb179d2e1f
checksum: 10c0/d147f4c0b8b7cb640da2c4e2511bb8a8dd4152caaf49dc4f380dc37bac4960722b30e7fc310f3339e34a560a3c873f764cac6c37295407ca1f771d4e0854febb
languageName: node
linkType: hard
"@mui/private-theming@npm:^5.16.4":
version: 5.16.4
resolution: "@mui/private-theming@npm:5.16.4"
"@mui/private-theming@npm:^5.16.5":
version: 5.16.5
resolution: "@mui/private-theming@npm:5.16.5"
dependencies:
"@babel/runtime": "npm:^7.23.9"
"@mui/utils": "npm:^5.16.4"
"@mui/utils": "npm:^5.16.5"
prop-types: "npm:^15.8.1"
peerDependencies:
"@types/react": ^17.0.0 || ^18.0.0
@@ -1256,7 +1256,7 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
checksum: 10c0/3c191afe4025cac9bbdecae1ea6232155e71c45c2929acce1ce31dd4c913800d6e9eaa38897e91dd7bff74529de3247768d26120c54c33ef69e40136c9ec6b04
checksum: 10c0/4850ff47b5a4b1b19356fbd30ed675db6f688eda02bebf16d8b23bebc67bd55baaf4fdba1acae7d5b5e6bbdc2ac0f01c1c85005886b1ba098df65a9b26d4d4c7
languageName: node
linkType: hard
@@ -1281,15 +1281,15 @@ __metadata:
languageName: node
linkType: hard
"@mui/system@npm:^5.16.4":
version: 5.16.4
resolution: "@mui/system@npm:5.16.4"
"@mui/system@npm:^5.16.5":
version: 5.16.5
resolution: "@mui/system@npm:5.16.5"
dependencies:
"@babel/runtime": "npm:^7.23.9"
"@mui/private-theming": "npm:^5.16.4"
"@mui/private-theming": "npm:^5.16.5"
"@mui/styled-engine": "npm:^5.16.4"
"@mui/types": "npm:^7.2.15"
"@mui/utils": "npm:^5.16.4"
"@mui/utils": "npm:^5.16.5"
clsx: "npm:^2.1.0"
csstype: "npm:^3.1.3"
prop-types: "npm:^15.8.1"
@@ -1305,7 +1305,7 @@ __metadata:
optional: true
"@types/react":
optional: true
checksum: 10c0/1665e2f9b6b30f2177b49b19bc778980e3f076167a1436f8b8bf513075674192e33684ab3a9262144f6008d3f9521ac4c073f5e15abfb4c989efc78cd09f8ecc
checksum: 10c0/af3eccfa96e78e00a8b5a71c025b57baeb85b02adb44a7e1e96779ddcb3f0070d9880dcb6b8a7bdb78339fa1bbf892b63ef80b81d0497c9bbd45f5ea14958c91
languageName: node
linkType: hard
@@ -1321,11 +1321,12 @@ __metadata:
languageName: node
linkType: hard
"@mui/utils@npm:^5.16.4":
version: 5.16.4
resolution: "@mui/utils@npm:5.16.4"
"@mui/utils@npm:^5.16.5":
version: 5.16.5
resolution: "@mui/utils@npm:5.16.5"
dependencies:
"@babel/runtime": "npm:^7.23.9"
"@mui/types": "npm:^7.2.15"
"@types/prop-types": "npm:^15.7.12"
clsx: "npm:^2.1.1"
prop-types: "npm:^15.8.1"
@@ -1336,7 +1337,7 @@ __metadata:
peerDependenciesMeta:
"@types/react":
optional: true
checksum: 10c0/f3d6c22a61440b76c3396c437669668e5733db7fcbb82de571a98b9d8259d690b6817081269e961cb20a67a28bedcfa85f234342ee560daf6a981fcce85ab088
checksum: 10c0/8b51190232c192db7dfd9fd33e054a789bf162d7ccfb40ee21d6b2636f07aa69d60e3f5bdc6ded1b3520fa4f93134101a5c4158772f589e56eff3a04f1a59a10
languageName: node
linkType: hard
@@ -2077,8 +2078,8 @@ __metadata:
"@emotion/react": "npm:^11.13.0"
"@emotion/styled": "npm:^11.13.0"
"@eslint/js": "npm:^9.7.0"
"@mui/icons-material": "npm:^5.16.4"
"@mui/material": "npm:^5.16.4"
"@mui/icons-material": "npm:^5.16.5"
"@mui/material": "npm:^5.16.5"
"@preact/compat": "npm:^17.1.2"
"@preact/preset-vite": "npm:^2.9.0"
"@table-library/react-table-library": "npm:4.1.7"
@@ -2098,7 +2099,7 @@ __metadata:
jwt-decode: "npm:^4.0.0"
lodash-es: "npm:^4.17.21"
mime-types: "npm:^2.1.35"
preact: "npm:^10.23.0"
preact: "npm:^10.23.1"
prettier: "npm:^3.3.3"
react: "npm:latest"
react-dom: "npm:latest"
@@ -2111,7 +2112,7 @@ __metadata:
typesafe-i18n: "npm:^5.26.2"
typescript: "npm:^5.5.4"
typescript-eslint: "npm:8.0.0-alpha.10"
vite: "npm:^5.3.4"
vite: "npm:^5.3.5"
vite-plugin-imagemin: "npm:^0.6.1"
vite-tsconfig-paths: "npm:^4.3.2"
languageName: unknown
@@ -6070,10 +6071,10 @@ __metadata:
languageName: node
linkType: hard
"preact@npm:^10.23.0":
version: 10.23.0
resolution: "preact@npm:10.23.0"
checksum: 10c0/00bcf490ce13c0fd70e3d2e2418466419b31f201b28d35f173d7ddcb66b421a3f6ca569541de581cbbf4ec7b2adef3f391d631dca7a4fd86708d81ca08259c1c
"preact@npm:^10.23.1":
version: 10.23.1
resolution: "preact@npm:10.23.1"
checksum: 10c0/f0eb37999bfa9cbc725e57e189387c77919fa05d17cdc3c4ff41660298805159867689f1d974eb8e6496288c0212760490d0e6f1c12022e0f5a74d06cc618e85
languageName: node
linkType: hard
@@ -7496,9 +7497,9 @@ __metadata:
languageName: node
linkType: hard
"vite@npm:^5.3.4":
version: 5.3.4
resolution: "vite@npm:5.3.4"
"vite@npm:^5.3.5":
version: 5.3.5
resolution: "vite@npm:5.3.5"
dependencies:
esbuild: "npm:^0.21.3"
fsevents: "npm:~2.3.3"
@@ -7532,7 +7533,7 @@ __metadata:
optional: true
bin:
vite: bin/vite.js
checksum: 10c0/604a1c8698bcf09d6889533c552f20137c80cb5027e9e7ddf6215d51e3df763414f8712168c22b3c8c16383aff9447094c05f21d7cca3c115874ff9d12e1538e
checksum: 10c0/795c7e0dbc94b96c4a0aff0d5d4b349dd28ad8b7b70979c1010f96b4d83f7d6c1700ebd6fed91de2e021b0a3689b9abc2d8017f6dfa8c9a6ca5c7af637d6afc6
languageName: node
linkType: hard

View File

@@ -336,7 +336,7 @@ const SYSTEM_STATUS_ENDPOINT = REST_ENDPOINT_ROOT + 'systemStatus';
const ACTIVITY_ENDPOINT = REST_ENDPOINT_ROOT + 'activity';
// SETTINGS
const ESPSYSTEM_STATUS_ENDPOINT = REST_ENDPOINT_ROOT + 'ESPSystemStatus';
const HARDWARE_STATUS_ENDPOINT = REST_ENDPOINT_ROOT + 'HardwareStatus';
const SECURITY_SETTINGS_ENDPOINT = REST_ENDPOINT_ROOT + 'securitySettings';
const RESTART_ENDPOINT = REST_ENDPOINT_ROOT + 'restart';
const RESTART_PARTITION_ENDPOINT = REST_ENDPOINT_ROOT + 'partition';
@@ -347,28 +347,29 @@ const VERIFY_AUTHORIZATION_ENDPOINT = REST_ENDPOINT_ROOT + 'verifyAuthorization'
const SIGN_IN_ENDPOINT = REST_ENDPOINT_ROOT + 'signIn';
const GENERATE_TOKEN_ENDPOINT = REST_ENDPOINT_ROOT + 'generateToken';
const ESPsystem_status = {
const hardware_status = {
emsesp_version: '3.7-demo',
esp_platform: 'ESP32',
max_alloc_heap: 89,
max_alloc_heap: 107,
cpu_type: 'ESP32-S3',
cpu_rev: '0',
cpu_rev: 3,
cpu_cores: 2,
cpu_freq_mhz: 240,
free_heap: 143,
arduino_version: 'ESP32 Arduino v2.0.14',
sdk_version: 'v4.4.2',
free_heap: 166,
arduino_version: 'ESP32 Arduino v2.0.16',
sdk_version: 'v4.4.7',
partition: 'app0',
flash_chip_size: 4096,
flash_chip_speed: 40000000,
app_used: 1863,
app_free: 121,
fs_used: 40,
fs_free: 24,
fs_used: 24,
fs_free: 2024,
free_mem: 100,
psram_size: 0,
free_psram: 0,
psram_size: 4093,
free_psram: 4074,
has_loader: true,
free_caps: 4204,
// model: ''
model: 'BBQKees Electronics EMS Gateway E32 V2 (E32 V2.0 P3/2024011)'
};
@@ -4203,7 +4204,7 @@ router
router
.get(SYSTEM_STATUS_ENDPOINT, () => system_status)
.get(ACTIVITY_ENDPOINT, () => activity)
.get(ESPSYSTEM_STATUS_ENDPOINT, () => ESPsystem_status)
.get(HARDWARE_STATUS_ENDPOINT, () => hardware_status)
.get(SECURITY_SETTINGS_ENDPOINT, () => security_settings)
.post(SECURITY_SETTINGS_ENDPOINT, async (request: any) => {
security_settings = await request.json();

View File

@@ -1358,30 +1358,29 @@ bool System::get_value_info(JsonObject root, const char * command) {
// export status information including the device information
// http://ems-esp/api/system/info
// TODO camelCase - #1860
bool System::command_info(const char * value, const int8_t id, JsonObject output) {
JsonObject node;
// System
node = output["System"].to<JsonObject>();
node["version"] = EMSESP_APP_VERSION;
node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3);
node["uptime (seconds)"] = uuid::get_uptime_sec();
node = output["system"].to<JsonObject>();
node["version"] = EMSESP_APP_VERSION;
node["uptime"] = uuid::log::format_timestamp_ms(uuid::get_uptime_ms(), 3);
node["uptimeSec"] = uuid::get_uptime_sec();
#ifndef EMSESP_STANDALONE
node["platform"] = EMSESP_PLATFORM;
node["arduino"] = ARDUINO_VERSION;
node["sdk"] = ESP.getSdkVersion();
node["free mem"] = getHeapMem();
node["max alloc"] = getMaxAllocMem();
node["free caps"] = heap_caps_get_free_size(MALLOC_CAP_8BIT) / 1024; // includes heap and psram
node["used app"] = EMSESP::system_.appUsed(); // kilobytes
node["free app"] = EMSESP::system_.appFree(); // kilobytes
node["freeMem"] = getHeapMem();
node["maxAlloc"] = getMaxAllocMem();
node["freeCaps"] = heap_caps_get_free_size(MALLOC_CAP_8BIT) / 1024; // includes heap and psram
node["usedApp"] = EMSESP::system_.appUsed(); // kilobytes
node["freeApp"] = EMSESP::system_.appFree(); // kilobytes
node["partition"] = esp_ota_get_running_partition()->label;
#endif
node["reset reason"] = EMSESP::system_.reset_reason(0) + " / " + EMSESP::system_.reset_reason(1);
node["resetReason"] = EMSESP::system_.reset_reason(0) + " / " + EMSESP::system_.reset_reason(1);
// Network Status
node = output["Network"].to<JsonObject>();
node = output["network"].to<JsonObject>();
#ifndef EMSESP_STANDALONE
if (EMSESP::system_.ethernet_connected()) {
node["network"] = "Ethernet";
@@ -1415,201 +1414,202 @@ bool System::command_info(const char * value, const int8_t id, JsonObject output
if (WiFi.status() == WL_CONNECTED && !settings.bssid.isEmpty()) {
node["BSSID"] = "set"; // we don't disclose the name
}
node["TxPower setting"] = settings.tx_power;
node["static ip config"] = settings.staticIPConfig;
node["low bandwidth"] = settings.bandwidth20;
node["disable sleep"] = settings.nosleep;
node["enable MDNS"] = settings.enableMDNS;
node["enable CORS"] = settings.enableCORS;
node["TxPowerSetting"] = settings.tx_power;
node["staticIP"] = settings.staticIPConfig;
node["lowBandwidth"] = settings.bandwidth20;
node["disableSleep"] = settings.nosleep;
node["enableMDNS"] = settings.enableMDNS;
node["enableCORS"] = settings.enableCORS;
if (settings.enableCORS) {
node["CORS origin"] = settings.CORSOrigin;
node["CORSOrigin"] = settings.CORSOrigin;
}
});
#ifndef EMSESP_STANDALONE
EMSESP::esp8266React.getAPSettingsService()->read([&](APSettings & settings) {
const char * pM[] = {"always", "disconnected", "never"};
node["AP provision mode"] = pM[settings.provisionMode];
node["AP security"] = settings.password.length() ? "wpa2" : "open";
node["AP ssid"] = settings.ssid;
const char * pM[] = {"always", "disconnected", "never"};
node["APProvisionMode"] = pM[settings.provisionMode];
node["APSecurity"] = settings.password.length() ? "wpa2" : "open";
node["APSSID"] = settings.ssid;
});
#endif
// NTP status
node = output["NTP"].to<JsonObject>();
node = output["ntp"].to<JsonObject>();
#ifndef EMSESP_STANDALONE
node["NTP status"] = EMSESP::system_.ntp_connected() ? "connected" : "disconnected";
node["NTPStatus"] = EMSESP::system_.ntp_connected() ? "connected" : "disconnected";
EMSESP::esp8266React.getNTPSettingsService()->read([&](NTPSettings & settings) {
node["enabled"] = settings.enabled;
node["server"] = settings.server;
node["tz label"] = settings.tzLabel;
node["enabled"] = settings.enabled;
node["server"] = settings.server;
node["tzLabel"] = settings.tzLabel;
// node["tz format"] = settings.tzFormat;
});
#endif
// MQTT Status
node = output["MQTT"].to<JsonObject>();
node["MQTT status"] = Mqtt::connected() ? F_(connected) : F_(disconnected);
node = output["mqtt"].to<JsonObject>();
node["MQTTStatus"] = Mqtt::connected() ? F_(connected) : F_(disconnected);
if (Mqtt::enabled()) {
node["MQTT publishes"] = Mqtt::publish_count();
node["MQTT queued"] = Mqtt::publish_queued();
node["MQTT publish fails"] = Mqtt::publish_fails();
node["MQTT connects"] = Mqtt::connect_count();
node["MQTTPublishes"] = Mqtt::publish_count();
node["MQTTQueued"] = Mqtt::publish_queued();
node["MQTTPublishFails"] = Mqtt::publish_fails();
node["MQTTConnects"] = Mqtt::connect_count();
}
EMSESP::esp8266React.getMqttSettingsService()->read([&](MqttSettings & settings) {
node["enabled"] = settings.enabled;
node["client id"] = settings.clientId;
node["keep alive"] = settings.keepAlive;
node["clean session"] = settings.cleanSession;
node["entity format"] = settings.entity_format;
node["base"] = settings.base;
node["discovery prefix"] = settings.discovery_prefix;
node["discovery type"] = settings.discovery_type;
node["nested format"] = settings.nested_format;
node["ha enabled"] = settings.ha_enabled;
node["mqtt qos"] = settings.mqtt_qos;
node["mqtt retain"] = settings.mqtt_retain;
node["publish time heartbeat"] = settings.publish_time_heartbeat;
node["publish time boiler"] = settings.publish_time_boiler;
node["publish time thermostat"] = settings.publish_time_thermostat;
node["publish time solar"] = settings.publish_time_solar;
node["publish time mixer"] = settings.publish_time_mixer;
node["publish time water"] = settings.publish_time_water;
node["publish time other"] = settings.publish_time_other;
node["publish time sensor"] = settings.publish_time_sensor;
node["publish single"] = settings.publish_single;
node["publish2command"] = settings.publish_single2cmd;
node["send response"] = settings.send_response;
node["enabled"] = settings.enabled;
node["clientID"] = settings.clientId;
node["keepAlive"] = settings.keepAlive;
node["cleanSession"] = settings.cleanSession;
node["entityFormat"] = settings.entity_format;
node["base"] = settings.base;
node["discoveryPrefix"] = settings.discovery_prefix;
node["discoveryType"] = settings.discovery_type;
node["nestedFormat"] = settings.nested_format;
node["haEnabled"] = settings.ha_enabled;
node["mqttQos"] = settings.mqtt_qos;
node["mqttRetain"] = settings.mqtt_retain;
node["publishTimeHeartbeat"] = settings.publish_time_heartbeat;
node["publishTimeBoiler"] = settings.publish_time_boiler;
node["publishTimeThermostat"] = settings.publish_time_thermostat;
node["publishTimeSolar"] = settings.publish_time_solar;
node["publishTimeMixer"] = settings.publish_time_mixer;
node["publishTimeWater"] = settings.publish_time_water;
node["publishTimeOther"] = settings.publish_time_other;
node["publishTimeSensor"] = settings.publish_time_sensor;
node["publishSingle"] = settings.publish_single;
node["publish2command"] = settings.publish_single2cmd;
node["sendResponse"] = settings.send_response;
});
// Syslog Status
node = output["Syslog"].to<JsonObject>();
node = output["syslog"].to<JsonObject>();
node["enabled"] = EMSESP::system_.syslog_enabled_;
#ifndef EMSESP_STANDALONE
if (EMSESP::system_.syslog_enabled_) {
node["syslog started"] = syslog_.started();
node["syslog level"] = FL_(list_syslog_level)[syslog_.log_level() + 1];
node["syslog ip"] = syslog_.ip();
node["syslog queue"] = syslog_.queued();
node["syslogStarted"] = syslog_.started();
node["syslogLevel"] = FL_(list_syslog_level)[syslog_.log_level() + 1];
node["syslogIP"] = syslog_.ip();
node["syslogQueue"] = syslog_.queued();
}
#endif
// Sensor Status
node = output["Sensor"].to<JsonObject>();
node = output["sensor"].to<JsonObject>();
if (EMSESP::sensor_enabled()) {
node["temperature sensors"] = EMSESP::temperaturesensor_.no_sensors();
node["temperature sensor reads"] = EMSESP::temperaturesensor_.reads();
node["temperature sensor fails"] = EMSESP::temperaturesensor_.fails();
node["temperatureSensors"] = EMSESP::temperaturesensor_.no_sensors();
node["temperatureSensorReads"] = EMSESP::temperaturesensor_.reads();
node["temperatureSensorFails"] = EMSESP::temperaturesensor_.fails();
}
if (EMSESP::analog_enabled()) {
node["analog sensors"] = EMSESP::analogsensor_.no_sensors();
node["analog sensor reads"] = EMSESP::analogsensor_.reads();
node["analog sensor fails"] = EMSESP::analogsensor_.fails();
node["analogSensors"] = EMSESP::analogsensor_.no_sensors();
node["analogSensorReads"] = EMSESP::analogsensor_.reads();
node["analogSensorFails"] = EMSESP::analogsensor_.fails();
}
// API Status
node = output["API"].to<JsonObject>();
node["API calls"] = WebAPIService::api_count();
node["API fails"] = WebAPIService::api_fails();
node = output["api"].to<JsonObject>();
node["APICalls"] = WebAPIService::api_count();
node["APIFails"] = WebAPIService::api_fails();
// EMS Bus Status
node = output["Bus"].to<JsonObject>();
node = output["bus"].to<JsonObject>();
switch (EMSESP::bus_status()) {
case EMSESP::BUS_STATUS_OFFLINE:
node["bus status"] = "disconnected";
node["busStatus"] = "disconnected";
break;
case EMSESP::BUS_STATUS_TX_ERRORS:
node["bus status"] = "connected, tx issues - try a different Tx Mode";
node["busStatus"] = "connected, tx issues - try a different Tx Mode";
break;
case EMSESP::BUS_STATUS_CONNECTED:
node["bus status"] = "connected";
node["busStatus"] = "connected";
break;
default:
node["bus status"] = "unknown";
node["busStatus"] = "unknown";
break;
}
// if (EMSESP::bus_status() != EMSESP::BUS_STATUS_OFFLINE) {
node["bus protocol"] = EMSbus::is_ht3() ? "HT3" : "Buderus";
node["bus telegrams received (rx)"] = EMSESP::rxservice_.telegram_count();
node["bus reads (tx)"] = EMSESP::txservice_.telegram_read_count();
node["bus writes (tx)"] = EMSESP::txservice_.telegram_write_count();
node["bus incomplete telegrams"] = EMSESP::rxservice_.telegram_error_count();
node["bus reads failed"] = EMSESP::txservice_.telegram_read_fail_count();
node["bus writes failed"] = EMSESP::txservice_.telegram_write_fail_count();
node["bus rx line quality"] = EMSESP::rxservice_.quality();
node["bus tx line quality"] = (EMSESP::txservice_.read_quality() + EMSESP::txservice_.read_quality()) / 2;
node["busProtocol"] = EMSbus::is_ht3() ? "HT3" : "Buderus";
node["busTelegramsReceived"] = EMSESP::rxservice_.telegram_count();
node["busReads"] = EMSESP::txservice_.telegram_read_count();
node["busWrites"] = EMSESP::txservice_.telegram_write_count();
node["busIncompleteTelegrams"] = EMSESP::rxservice_.telegram_error_count();
node["busReadsFailed"] = EMSESP::txservice_.telegram_read_fail_count();
node["busWritesFailed"] = EMSESP::txservice_.telegram_write_fail_count();
node["busRxLineQuality"] = EMSESP::rxservice_.quality();
node["busTxLineQuality"] = (EMSESP::txservice_.read_quality() + EMSESP::txservice_.read_quality()) / 2;
// }
// Settings
node = output["Settings"].to<JsonObject>();
node = output["settings"].to<JsonObject>();
EMSESP::webSettingsService.read([&](WebSettings & settings) {
node["board profile"] = settings.board_profile;
node["locale"] = settings.locale;
node["tx mode"] = settings.tx_mode;
node["ems bus id"] = settings.ems_bus_id;
node["shower timer"] = settings.shower_timer;
node["shower min duration"] = settings.shower_min_duration; // seconds
node["shower alert"] = settings.shower_alert;
node["boardProfile"] = settings.board_profile;
node["locale"] = settings.locale;
node["txMode"] = settings.tx_mode;
node["emsBusID"] = settings.ems_bus_id;
node["showerTimer"] = settings.shower_timer;
node["showerMinDuration"] = settings.shower_min_duration; // seconds
node["showerAlert"] = settings.shower_alert;
if (settings.shower_alert) {
node["shower alert coldshot"] = settings.shower_alert_coldshot; // seconds
node["shower alert trigger"] = settings.shower_alert_trigger; // minutes
node["showerAlertColdshot"] = settings.shower_alert_coldshot; // seconds
node["showerAlertTrigger"] = settings.shower_alert_trigger; // minutes
}
if (settings.board_profile == "CUSTOM") {
node["phy type"] = settings.phy_type;
node["phyType"] = settings.phy_type;
if (settings.phy_type != PHY_type::PHY_TYPE_NONE) {
node["eth power"] = settings.eth_power;
node["eth phy addr"] = settings.eth_phy_addr;
node["eth clock_mode"] = settings.eth_clock_mode;
node["ethPower"] = settings.eth_power;
node["ethPhyAddr"] = settings.eth_phy_addr;
node["ethClockMmode"] = settings.eth_clock_mode;
}
node["rx gpio"] = settings.rx_gpio;
node["tx gpio"] = settings.tx_gpio;
node["dallas gpio"] = settings.dallas_gpio;
node["pbutton gpio"] = settings.pbutton_gpio;
node["led gpio"] = settings.led_gpio;
node["rxGPIO"] = settings.rx_gpio;
node["txGPIO"] = settings.tx_gpio;
node["dallasGPIO"] = settings.dallas_gpio;
node["pbuttonGPIO"] = settings.pbutton_gpio;
node["ledGPIO"] = settings.led_gpio;
}
node["hide led"] = settings.hide_led;
node["notoken api"] = settings.notoken_api;
node["readonly mode"] = settings.readonly_mode;
node["fahrenheit"] = settings.fahrenheit;
node["dallas parasite"] = settings.dallas_parasite;
node["bool format"] = settings.bool_format;
node["bool dashboard"] = settings.bool_dashboard;
node["enum format"] = settings.enum_format;
node["analog enabled"] = settings.analog_enabled;
node["telnet enabled"] = settings.telnet_enabled;
node["max web log buffer"] = settings.weblog_buffer;
node["web log buffer"] = EMSESP::webLogService.num_log_messages();
node["hideLed"] = settings.hide_led;
node["noTokenApi"] = settings.notoken_api;
node["readonlyMode"] = settings.readonly_mode;
node["fahrenheit"] = settings.fahrenheit;
node["dallasParasite"] = settings.dallas_parasite;
node["boolFormat"] = settings.bool_format;
node["boolDashboard"] = settings.bool_dashboard;
node["enumFormat"] = settings.enum_format;
node["analogEnabled"] = settings.analog_enabled;
node["telnetEnabled"] = settings.telnet_enabled;
node["maxWebLogBuffer"] = settings.weblog_buffer;
node["webLogBuffer"] = EMSESP::webLogService.num_log_messages();
node["modbusEnabled"] = settings.modbus_enabled;
});
// Devices - show EMS devices if we have any
if (!EMSESP::emsdevices.empty()) {
JsonArray devices = output["Devices"].to<JsonArray>();
JsonArray devices = output["devices"].to<JsonArray>();
for (const auto & device_class : EMSFactory::device_handlers()) {
for (const auto & emsdevice : EMSESP::emsdevices) {
if (emsdevice && (emsdevice->device_type() == device_class.first)) {
JsonObject obj = devices.add<JsonObject>();
obj["type"] = emsdevice->device_type_name(); // non translated name
obj["name"] = emsdevice->name(); // custom name
obj["device id"] = Helpers::hextoa(emsdevice->device_id());
obj["product id"] = emsdevice->product_id();
obj["brand"] = emsdevice->brand_to_char();
obj["version"] = emsdevice->version();
obj["entities"] = emsdevice->count_entities();
JsonObject obj = devices.add<JsonObject>();
obj["type"] = emsdevice->device_type_name(); // non translated name
obj["name"] = emsdevice->name(); // custom name
obj["deviceID"] = Helpers::hextoa(emsdevice->device_id());
obj["productID"] = emsdevice->product_id();
obj["brand"] = emsdevice->brand_to_char();
obj["version"] = emsdevice->version();
obj["entities"] = emsdevice->count_entities();
char result[500];
(void)emsdevice->show_telegram_handlers(result, sizeof(result), EMSdevice::Handlers::RECEIVED);
if (result[0] != '\0') {
obj["handlers received"] = result; // don't show handlers if there aren't any
obj["handlersReceived"] = result; // don't show handlers if there aren't any
}
(void)emsdevice->show_telegram_handlers(result, sizeof(result), EMSdevice::Handlers::FETCHED);
if (result[0] != '\0') {
obj["handlers fetched"] = result;
obj["handlersFetched"] = result;
}
(void)emsdevice->show_telegram_handlers(result, sizeof(result), EMSdevice::Handlers::PENDING);
if (result[0] != '\0') {
obj["handlers pending"] = result;
obj["handlersPending"] = result;
}
(void)emsdevice->show_telegram_handlers(result, sizeof(result), EMSdevice::Handlers::IGNORED);
if (result[0] != '\0') {
obj["handlers ignored"] = result;
obj["handlersIgnored"] = result;
}
}
}

View File

@@ -41,7 +41,7 @@ namespace emsesp {
// #define EMSESP_DEBUG_DEFAULT "310"
// #define EMSESP_DEBUG_DEFAULT "render"
// #define EMSESP_DEBUG_DEFAULT "api"
#define EMSESP_DEBUG_DEFAULT "api3"
// #define EMSESP_DEBUG_DEFAULT "api3"
// #define EMSESP_DEBUG_DEFAULT "crash"
// #define EMSESP_DEBUG_DEFAULT "dv"
// #define EMSESP_DEBUG_DEFAULT "lastcode"

View File

@@ -24,9 +24,9 @@
namespace emsesp {
// /rest/ESPSystemStatus
// /rest/HardwareStatus
WebStatusService::WebStatusService(AsyncWebServer * server, SecurityManager * securityManager) {
server->on(ESPSYSTEM_STATUS_SERVICE_PATH, HTTP_GET, [this](AsyncWebServerRequest * request) { ESPsystemStatus(request); });
server->on(HARDWARE_STATUS_SERVICE_PATH, HTTP_GET, [this](AsyncWebServerRequest * request) { HardwareStatus(request); });
server->on(SYSTEM_STATUS_SERVICE_PATH, HTTP_GET, [this](AsyncWebServerRequest * request) { systemStatus(request); });
}
@@ -85,7 +85,7 @@ void WebStatusService::systemStatus(AsyncWebServerRequest * request) {
request->send(response);
}
void WebStatusService::ESPsystemStatus(AsyncWebServerRequest * request) {
void WebStatusService::HardwareStatus(AsyncWebServerRequest * request) {
EMSESP::system_.refreshHeapMem(); // refresh free heap and max alloc heap
auto * response = new AsyncJsonResponse(false);
@@ -119,6 +119,7 @@ void WebStatusService::ESPsystemStatus(AsyncWebServerRequest * request) {
uint32_t FSused = LittleFS.usedBytes() / 1024;
root["fs_used"] = FSused;
root["fs_free"] = EMSESP::system_.FStotal() - FSused;
root["free_caps"] = heap_caps_get_free_size(MALLOC_CAP_8BIT) / 1024; // includes heap and psram
if (EMSESP::system_.PSram()) {
root["psram_size"] = EMSESP::system_.PSram();

View File

@@ -1,7 +1,7 @@
#ifndef WebStatusService_h
#define WebStatusService_h
#define ESPSYSTEM_STATUS_SERVICE_PATH "/rest/ESPSystemStatus"
#define HARDWARE_STATUS_SERVICE_PATH "/rest/HardwareStatus"
#define SYSTEM_STATUS_SERVICE_PATH "/rest/systemStatus"
namespace emsesp {
@@ -12,7 +12,7 @@ class WebStatusService {
private:
void systemStatus(AsyncWebServerRequest * request);
void ESPsystemStatus(AsyncWebServerRequest * request);
void HardwareStatus(AsyncWebServerRequest * request);
};
} // namespace emsesp