Browse Source

0.8.86

* RestAPI check for parent element to be JsonObject #1449
* fix translation #1448 #1442
* fix reset values when inverter status is 'not available' #1035 #1437
pull/1465/head
lumapu 7 months ago
parent
commit
6d887e1540
  1. 5
      src/CHANGES.md
  2. 2
      src/app.cpp
  3. 2
      src/defines.h
  4. 52
      src/web/RestApi.h
  5. 6
      src/web/html/serial.html
  6. 18
      src/web/lang.json

5
src/CHANGES.md

@ -1,5 +1,10 @@
# Development Changes
## 0.8.86 - 2024-02-23
* RestAPI check for parent element to be JsonObject #1449
* fix translation #1448 #1442
* fix reset values when inverter status is 'not available' #1035 #1437
## 0.8.85 - 2024-02-22
* possible fix of MqTT fix "total values are sent to often" #1421
* fix translation #1442

2
src/app.cpp

@ -468,7 +468,7 @@ void app:: zeroIvValues(bool checkAvail, bool skipYieldDay) {
continue; // skip to next inverter
if (checkAvail) {
if (!iv->isAvailable())
if (iv->isAvailable())
continue;
}

2
src/defines.h

@ -13,7 +13,7 @@
//-------------------------------------
#define VERSION_MAJOR 0
#define VERSION_MINOR 8
#define VERSION_PATCH 85
#define VERSION_PATCH 86
//-------------------------------------
typedef struct {

52
src/web/RestApi.h

@ -141,7 +141,7 @@ class RestApi {
DPRINTLN(DBG_VERBOSE, "onApiPostBody");
if(0 == index) {
if(NULL != mTmpBuf)
if(nullptr != mTmpBuf)
delete[] mTmpBuf;
mTmpBuf = new uint8_t[total+1];
mTmpSize = total;
@ -154,36 +154,40 @@ class RestApi {
DynamicJsonDocument json(1000);
DeserializationError err = deserializeJson(json, reinterpret_cast<const char*>(mTmpBuf), mTmpSize);
JsonObject obj = json.as<JsonObject>();
AsyncJsonResponse* response = new AsyncJsonResponse(false, 200);
JsonObject root = response->getRoot();
root[F("success")] = (err) ? false : true;
if(!err) {
String path = request->url().substring(5);
if(path == "ctrl")
root[F("success")] = setCtrl(obj, root, request->client()->remoteIP().toString().c_str());
else if(path == "setup")
root[F("success")] = setSetup(obj, root, request->client()->remoteIP().toString().c_str());
else {
root[F("success")] = false;
root[F("error")] = F(PATH_NOT_FOUND) + path;
}
} else {
switch (err.code()) {
case DeserializationError::Ok: break;
case DeserializationError::IncompleteInput: root[F("error")] = F(INCOMPLETE_INPUT); break;
case DeserializationError::InvalidInput: root[F("error")] = F(INVALID_INPUT); break;
case DeserializationError::NoMemory: root[F("error")] = F(NOT_ENOUGH_MEM); break;
default: root[F("error")] = F(DESER_FAILED); break;
DeserializationError err = deserializeJson(json, reinterpret_cast<const char*>(mTmpBuf), mTmpSize);
if(!json.is<JsonObject>())
root[F("error")] = F(DESER_FAILED);
else {
JsonObject obj = json.as<JsonObject>();
root[F("success")] = (err) ? false : true;
if(!err) {
String path = request->url().substring(5);
if(path == "ctrl")
root[F("success")] = setCtrl(obj, root, request->client()->remoteIP().toString().c_str());
else if(path == "setup")
root[F("success")] = setSetup(obj, root, request->client()->remoteIP().toString().c_str());
else {
root[F("success")] = false;
root[F("error")] = F(PATH_NOT_FOUND) + path;
}
} else {
switch (err.code()) {
case DeserializationError::Ok: break;
case DeserializationError::IncompleteInput: root[F("error")] = F(INCOMPLETE_INPUT); break;
case DeserializationError::InvalidInput: root[F("error")] = F(INVALID_INPUT); break;
case DeserializationError::NoMemory: root[F("error")] = F(NOT_ENOUGH_MEM); break;
default: root[F("error")] = F(DESER_FAILED); break;
}
}
}
response->setLength();
request->send(response);
delete[] mTmpBuf;
mTmpBuf = NULL;
mTmpBuf = nullptr;
}
void getNotFound(JsonObject obj, String url) {
@ -974,7 +978,7 @@ class RestApi {
uint32_t mTimezoneOffset = 0;
uint32_t mHeapFree = 0, mHeapFreeBlk = 0;
uint8_t mHeapFrag = 0;
uint8_t *mTmpBuf = NULL;
uint8_t *mTmpBuf = nullptr;
uint32_t mTmpSize = 0;
};

6
src/web/html/serial.html

@ -65,7 +65,7 @@
});
document.getElementById("scroll").addEventListener("click", function() {
mAutoScroll = !mAutoScroll;
this.value = (mAutoScroll) ? "autoscroll" : "manual scroll";
this.value = (mAutoScroll) ? "{#BTN_AUTOSCROLL}" : "{#BTN_MANUALSCROLL}";
});
document.getElementById("copy").addEventListener("click", function() {
con.value = version + " - " + build + "\n---------------\n" + con.value;
@ -80,10 +80,10 @@
try {
return document.execCommand("copy"); // Security exception may be thrown by some browsers.
} catch (ex) {
alert("Copy to clipboard failed" + ex);
alert("CLIPBOARD_FAILED " + ex);
} finally {
document.body.removeChild(ta);
alert("Copied to clipboard");
alert("{#COPIED_TO_CLIPBOARD}");
}
}
});

18
src/web/lang.json

@ -883,6 +883,11 @@
"en": "autoscroll",
"de": "automatisch scrollen"
},
{
"token": "BTN_MANUALSCROLL",
"en": "manual scroll",
"de": "manuell scrollen"
},
{
"token": "BTN_COPY",
"en": "copy",
@ -897,12 +902,21 @@
"token": "UPTIME",
"en": "uptime",
"de": "Laufzeit"
}
,
},
{
"token": "DAYS",
"en": "days",
"de": "Tage"
},
{
"token": "COPIED_TO_CLIPBOARD",
"en": "Copied to clipboard",
"de": "in die Zwischenablage kopiert"
},
{
"token": "CLIPBOARD_FAILED",
"en": "Copy failed",
"de": "kopieren fehlgeschlagen"
}
]
},

Loading…
Cancel
Save