Skip to content

Commit 5c6d704

Browse files
committed
alova updates #4
1 parent e11d5be commit 5c6d704

File tree

8 files changed

+112
-44
lines changed

8 files changed

+112
-44
lines changed

interface/package.json

+4-4
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@
2020
},
2121
"dependencies": {
2222
"@alova/adapter-xhr": "^1.0.0",
23-
"@emotion/react": "^11.11.0",
23+
"@emotion/react": "^11.11.1",
2424
"@emotion/styled": "^11.11.0",
2525
"@mui/icons-material": "^5.11.16",
2626
"@mui/material": "^5.13.4",
2727
"@table-library/react-table-library": "4.1.4",
2828
"@types/lodash-es": "^4.17.7",
2929
"@types/node": "^20.2.5",
30-
"@types/react": "^18.2.8",
30+
"@types/react": "^18.2.9",
3131
"@types/react-dom": "^18.2.4",
3232
"@types/react-router-dom": "^5.3.3",
33-
"alova": "^2.5.5",
33+
"alova": "^2.6.0",
3434
"async-validator": "^4.2.5",
3535
"axios": "^1.4.0",
3636
"history": "^5.3.0",
@@ -40,7 +40,7 @@
4040
"react-dom": "latest",
4141
"react-dropzone": "^14.2.3",
4242
"react-icons": "^4.9.0",
43-
"react-router-dom": "^6.11.2",
43+
"react-router-dom": "^6.12.0",
4444
"react-toastify": "^9.1.3",
4545
"sockette": "^2.0.6",
4646
"typesafe-i18n": "^5.24.3",

interface/src/api/endpoints.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export const alovaInstance = createAlova({
3333
},
3434

3535
responded: {
36-
onSuccess: async (response, method) => {
36+
onSuccess: async (response) => {
3737
if (response.status === 400) {
3838
throw new Error('Invalid command');
3939
}

interface/src/project/api.ts

+4-5
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ export function writeSettings(settings: Settings): AxiosPromise<Settings> {
5151
export function getBoardProfile(boardProfile: BoardProfileName): AxiosPromise<BoardProfile> {
5252
return AXIOS.post('/boardProfile', boardProfile);
5353
}
54+
// TODO change to GET
55+
export function readDeviceEntities(unique_id: UniqueID): AxiosPromise<DeviceEntity[]> {
56+
return AXIOS_BIN.post('/deviceEntities', unique_id);
57+
}
5458

5559
export function readStatus(): AxiosPromise<Status> {
5660
return AXIOS.get('/status');
@@ -68,11 +72,6 @@ export function readSensorData(): AxiosPromise<SensorData> {
6872
return AXIOS.get('/sensorData');
6973
}
7074

71-
// TODO change to GET
72-
export function readDeviceEntities(unique_id: UniqueID): AxiosPromise<DeviceEntity[]> {
73-
return AXIOS_BIN.post('/deviceEntities', unique_id);
74-
}
75-
7675
export function writeCustomEntities(customEntities: CustomEntities): AxiosPromise<void> {
7776
return AXIOS.post('/customEntities', customEntities);
7877
}

interface/src/utils/endpoints.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// TODO can be removed!
12
export const extractErrorMessage = (error: any, defaultMessage: string) => {
23
if (error.request) {
34
return defaultMessage + ' (' + error.request.status + ': ' + error.request.statusText + ')';

interface/yarn.lock

+31-31
Original file line numberDiff line numberDiff line change
@@ -340,9 +340,9 @@ __metadata:
340340
languageName: node
341341
linkType: hard
342342

343-
"@emotion/react@npm:^11.11.0":
344-
version: 11.11.0
345-
resolution: "@emotion/react@npm:11.11.0"
343+
"@emotion/react@npm:^11.11.1":
344+
version: 11.11.1
345+
resolution: "@emotion/react@npm:11.11.1"
346346
dependencies:
347347
"@babel/runtime": ^7.18.3
348348
"@emotion/babel-plugin": ^11.11.0
@@ -357,7 +357,7 @@ __metadata:
357357
peerDependenciesMeta:
358358
"@types/react":
359359
optional: true
360-
checksum: c287fdef680c6cc95c021d2ccd48891052cd97edfe371ef0c0a9aa78f1cb764587c80a50e9f22eb943f522258dc4d7b80c4778c45331720e330e338db32f8a95
360+
checksum: 1aea4d735b537fbfbeda828bbf929488a7e1b5b7d131f14aeede8737e92bb3b611e15fec353e97f85aed7a65a1c86a695a04ba6e9be905231beef6bd624cb705
361361
languageName: node
362362
linkType: hard
363363

@@ -961,10 +961,10 @@ __metadata:
961961
languageName: node
962962
linkType: hard
963963

964-
"@remix-run/router@npm:1.6.2":
965-
version: 1.6.2
966-
resolution: "@remix-run/router@npm:1.6.2"
967-
checksum: 73da6884e53873e4290abb3978373cafc3f351994273b0663eda5e12c81cb427fc6fe4df1924569d9a214f701d0106cf37122455951e0239d7e6fa35071df558
964+
"@remix-run/router@npm:1.6.3":
965+
version: 1.6.3
966+
resolution: "@remix-run/router@npm:1.6.3"
967+
checksum: d419fab24288123d8564a051c4a0e8cf46fb0f8fb7285701a819efb7f30b67785d0b63d21900a781485dea2d27271d78f2c56cb8b4b3fdb2ad72b61483989bd3
968968
languageName: node
969969
linkType: hard
970970

@@ -1368,14 +1368,14 @@ __metadata:
13681368
languageName: node
13691369
linkType: hard
13701370

1371-
"@types/react@npm:^18.2.8":
1372-
version: 18.2.8
1373-
resolution: "@types/react@npm:18.2.8"
1371+
"@types/react@npm:^18.2.9":
1372+
version: 18.2.9
1373+
resolution: "@types/react@npm:18.2.9"
13741374
dependencies:
13751375
"@types/prop-types": "*"
13761376
"@types/scheduler": "*"
13771377
csstype: ^3.0.2
1378-
checksum: 4ed72e0cb9974f7002ebdd27bdb55beb7e715f18e1f537748f3a64ddd5b11ac25f61287d146feb4e2dd876eb615c49eead8cae65d75d5a4584572c00ab2093c5
1378+
checksum: 5935a8cb8efc2804dbb0f85989970f654fb4117274b6d2836baa58d5e9dbfc09fd9d60e1f23a8d0fca70ad75e9f0e074790947899be40525cbe62f7ac58adcc6
13791379
languageName: node
13801380
linkType: hard
13811381

@@ -1530,20 +1530,20 @@ __metadata:
15301530
resolution: "EMS-ESP@workspace:."
15311531
dependencies:
15321532
"@alova/adapter-xhr": ^1.0.0
1533-
"@emotion/react": ^11.11.0
1533+
"@emotion/react": ^11.11.1
15341534
"@emotion/styled": ^11.11.0
15351535
"@mui/icons-material": ^5.11.16
15361536
"@mui/material": ^5.13.4
15371537
"@table-library/react-table-library": 4.1.4
15381538
"@types/lodash-es": ^4.17.7
15391539
"@types/node": ^20.2.5
1540-
"@types/react": ^18.2.8
1540+
"@types/react": ^18.2.9
15411541
"@types/react-dom": ^18.2.4
15421542
"@types/react-router-dom": ^5.3.3
15431543
"@typescript-eslint/eslint-plugin": ^5.59.9
15441544
"@typescript-eslint/parser": ^5.59.9
15451545
"@vitejs/plugin-react-swc": ^3.3.2
1546-
alova: ^2.5.5
1546+
alova: ^2.6.0
15471547
async-validator: ^4.2.5
15481548
axios: ^1.4.0
15491549
eslint: ^8.42.0
@@ -1567,7 +1567,7 @@ __metadata:
15671567
react-dom: latest
15681568
react-dropzone: ^14.2.3
15691569
react-icons: ^4.9.0
1570-
react-router-dom: ^6.11.2
1570+
react-router-dom: ^6.12.0
15711571
react-toastify: ^9.1.3
15721572
rollup-plugin-visualizer: ^5.9.0
15731573
sockette: ^2.0.6
@@ -1647,10 +1647,10 @@ __metadata:
16471647
languageName: node
16481648
linkType: hard
16491649

1650-
"alova@npm:^2.5.5":
1651-
version: 2.5.5
1652-
resolution: "alova@npm:2.5.5"
1653-
checksum: 028c24678fd91a5e2350b6c9c930475dd650fb766efad4d3dd8cd15d1ca85b2424e0857ba41d8f6eb2ad60999424269d8488b4aec66a4f74c98efd3378f21427
1650+
"alova@npm:^2.6.0":
1651+
version: 2.6.0
1652+
resolution: "alova@npm:2.6.0"
1653+
checksum: a99dd001f094cccbc6166c5cc56ed8d417434f9edf05aa5176992a3a3735600a3b626b41b50dd867b8a86b3edf44cfbd576568349af937626a7023f9b839226b
16541654
languageName: node
16551655
linkType: hard
16561656

@@ -4807,27 +4807,27 @@ __metadata:
48074807
languageName: node
48084808
linkType: hard
48094809

4810-
"react-router-dom@npm:^6.11.2":
4811-
version: 6.11.2
4812-
resolution: "react-router-dom@npm:6.11.2"
4810+
"react-router-dom@npm:^6.12.0":
4811+
version: 6.12.0
4812+
resolution: "react-router-dom@npm:6.12.0"
48134813
dependencies:
4814-
"@remix-run/router": 1.6.2
4815-
react-router: 6.11.2
4814+
"@remix-run/router": 1.6.3
4815+
react-router: 6.12.0
48164816
peerDependencies:
48174817
react: ">=16.8"
48184818
react-dom: ">=16.8"
4819-
checksum: be7433bc290e56c0dd3e1008d53a76cc9866bf460980658501880876420086f11810ec3355a3abcd79ac537d6a1351eda009fade841c266456d0e8df60967b76
4819+
checksum: 910b23ae3555e7baff97038c478b8fa65d5b54856c74e789c529850c002850a961329b692a8f1f4643100f46075918d2b55cbf3c7f87f85588387148010600f5
48204820
languageName: node
48214821
linkType: hard
48224822

4823-
"react-router@npm:6.11.2":
4824-
version: 6.11.2
4825-
resolution: "react-router@npm:6.11.2"
4823+
"react-router@npm:6.12.0":
4824+
version: 6.12.0
4825+
resolution: "react-router@npm:6.12.0"
48264826
dependencies:
4827-
"@remix-run/router": 1.6.2
4827+
"@remix-run/router": 1.6.3
48284828
peerDependencies:
48294829
react: ">=16.8"
4830-
checksum: a437606078d6096a6dfa322adf80d00ce153f20cd470ad888088c8da99f44477b963425c53f5461a540b909fc274154292ed80d636482dcdc58a423915ca1433
4830+
checksum: b7cee04f5edbf48f1aa0303107514a3a9dc2b6f94a7a753fbf4eb8dde1d3eb67940204ff0b8b907c5b09f69c716dd958a6187346b1c35ccf19162d74e77d99af
48314831
languageName: node
48324832
linkType: hard
48334833

mock-api/server.js

+1
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ const emsesp_coredata = {
396396
tn: 'Boiler',
397397
b: 'Nefit',
398398
n: 'GBx72/Trendline/Cerapur/Greenstar Si/27i',
399+
// n: 'Enviline/Compress 6000AW/Hybrid 3000-7000iAW/SupraEco/Geo 5xx/WLW196i/WSW196i',
399400
d: 8,
400401
p: 123,
401402
v: '06.01'

src/web/WebDataService.cpp

+63-3
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ WebDataService::WebDataService(AsyncWebServer * server, SecurityManager * securi
3232
AuthenticationPredicates::IS_ADMIN))
3333
, _write_analog_handler(WRITE_ANALOG_SENSOR_SERVICE_PATH,
3434
securityManager->wrapCallback(std::bind(&WebDataService::write_analog_sensor, this, _1, _2), AuthenticationPredicates::IS_ADMIN)) {
35+
// TODO Get for /deviceData
36+
server->on(DEVICE_DATA_SERVICE_PATH,
37+
HTTP_GET,
38+
securityManager->wrapRequest(std::bind(&WebDataService::device_data2, this, _1), AuthenticationPredicates::IS_AUTHENTICATED));
39+
40+
3541
server->on(CORE_DATA_SERVICE_PATH,
3642
HTTP_GET,
3743
securityManager->wrapRequest(std::bind(&WebDataService::core_data, this, _1), AuthenticationPredicates::IS_AUTHENTICATED));
@@ -88,7 +94,6 @@ void WebDataService::core_data(AsyncWebServerRequest * request) {
8894
obj["d"] = emsdevice->device_id(); // deviceid
8995
obj["p"] = emsdevice->product_id(); // productid
9096
obj["v"] = emsdevice->version(); // version
91-
// obj["e"] = emsdevice->count_entities(); // number of entities (device values)
9297
}
9398
}
9499

@@ -103,7 +108,6 @@ void WebDataService::core_data(AsyncWebServerRequest * request) {
103108
obj["d"] = 0; // deviceid
104109
obj["p"] = 0; // productid
105110
obj["v"] = 0; // version
106-
// obj["e"] = EMSESP::webEntityService.count_entities(); // number of entities (device values)
107111
}
108112

109113
root["connected"] = EMSESP::bus_status() != 2;
@@ -169,6 +173,63 @@ void WebDataService::sensor_data(AsyncWebServerRequest * request) {
169173
request->send(response);
170174
}
171175

176+
// The unique_id is the unique record ID from the Web table to identify which device to load
177+
// Compresses the JSON using MsgPack https://msgpack.org/index.html
178+
void WebDataService::device_data2(AsyncWebServerRequest * request) {
179+
uint8_t id;
180+
if (request->hasParam(F_(id))) {
181+
// TODO get id
182+
id = Helpers::atoint(request->getParam(F_(id))->value().c_str());
183+
184+
size_t buffer = EMSESP_JSON_SIZE_XXXXLARGE;
185+
auto * response = new MsgpackAsyncJsonResponse(false, buffer);
186+
187+
// check size
188+
while (!response->getSize()) {
189+
delete response;
190+
buffer -= 1024;
191+
response = new MsgpackAsyncJsonResponse(false, buffer);
192+
}
193+
194+
for (const auto & emsdevice : EMSESP::emsdevices) {
195+
if (emsdevice->unique_id() == id) {
196+
// wait max 2.5 sec for updated data (post_send_delay is 2 sec)
197+
for (uint16_t i = 0; i < (emsesp::TxService::POST_SEND_DELAY + 500) && EMSESP::wait_validate(); i++) {
198+
delay(1);
199+
}
200+
EMSESP::wait_validate(0); // reset in case of timeout
201+
#ifndef EMSESP_STANDALONE
202+
JsonObject output = response->getRoot();
203+
emsdevice->generate_values_web(output);
204+
#endif
205+
206+
#if defined(EMSESP_DEBUG)
207+
size_t length = response->setLength();
208+
EMSESP::logger().debug("Dashboard buffer used: %d", length);
209+
#else
210+
response->setLength();
211+
#endif
212+
request->send(response);
213+
return;
214+
}
215+
}
216+
217+
#ifndef EMSESP_STANDALONE
218+
if (id == 99) {
219+
JsonObject output = response->getRoot();
220+
EMSESP::webEntityService.generate_value_web(output);
221+
response->setLength();
222+
request->send(response);
223+
return;
224+
}
225+
#endif
226+
}
227+
228+
// invalid
229+
AsyncWebServerResponse * response = request->beginResponse(400);
230+
request->send(response);
231+
}
232+
172233
// The unique_id is the unique record ID from the Web table to identify which device to load
173234
// Compresses the JSON using MsgPack https://msgpack.org/index.html
174235
void WebDataService::device_data(AsyncWebServerRequest * request, JsonVariant & json) {
@@ -218,7 +279,6 @@ void WebDataService::device_data(AsyncWebServerRequest * request, JsonVariant &
218279
request->send(response);
219280
}
220281

221-
222282
// takes a command and its data value from a specific EMS Device, from the Web
223283
// assumes the service has been checked for admin authentication
224284
void WebDataService::write_device_value(AsyncWebServerRequest * request, JsonVariant & json) {

src/web/WebDataService.h

+7
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,15 @@ class WebDataService {
4545
void core_data(AsyncWebServerRequest * request);
4646
void sensor_data(AsyncWebServerRequest * request);
4747

48+
// TODO make it a Get
49+
void device_data2(AsyncWebServerRequest * request);
50+
51+
4852
// POST
53+
// TODO probably can be removed
4954
void device_data(AsyncWebServerRequest * request, JsonVariant & json);
55+
56+
5057
void write_device_value(AsyncWebServerRequest * request, JsonVariant & json);
5158
void write_temperature_sensor(AsyncWebServerRequest * request, JsonVariant & json);
5259
void write_analog_sensor(AsyncWebServerRequest * request, JsonVariant & json);

0 commit comments

Comments
 (0)