diff --git a/src/CHANGES.md b/src/CHANGES.md
index fd8f2e50..e85814ed 100644
--- a/src/CHANGES.md
+++ b/src/CHANGES.md
@@ -1,5 +1,12 @@
# Development Changes
+## 0.7.50 - 2023-09-12
+* moved MqTT info to `system`
+* added CMT info for ESP32 devices
+* improved CMT settings, now `SCLK` and `SDIO` are configurable #1046, #1150
+* changed `Power-Limit` in live-view to `Active Power Control`
+* increase length of update file selector #1132
+
## 0.7.49 - 2023-09-11
* merge PR: symbolic icons for mono displays, PR #1136
* merge MI code restructuring PR #1145
diff --git a/src/app.cpp b/src/app.cpp
index 8cefcb38..42f0f352 100644
--- a/src/app.cpp
+++ b/src/app.cpp
@@ -42,7 +42,7 @@ void app::setup() {
}
#if defined(ESP32)
if(mConfig->cmt.enabled) {
- mCmtRadio.setup(mConfig->cmt.pinCsb, mConfig->cmt.pinFcsb, false);
+ mCmtRadio.setup(mConfig->cmt.pinSclk, mConfig->cmt.pinSdio, mConfig->cmt.pinCsb, mConfig->cmt.pinFcsb, false);
mCmtRadio.enableDebug();
}
#endif
@@ -111,7 +111,7 @@ void app::setup() {
mWeb.setup(this, &mSys, mConfig);
mWeb.setProtection(strlen(mConfig->sys.adminPwd) != 0);
- mApi.setup(this, &mSys, &mNrfRadio, mWeb.getWebSrvPtr(), mConfig);
+ mApi.setup(this, &mSys, mWeb.getWebSrvPtr(), mConfig);
// Plugins
if (mConfig->plugin.display.type != 0)
diff --git a/src/app.h b/src/app.h
index b5dccdae..39eeb331 100644
--- a/src/app.h
+++ b/src/app.h
@@ -45,11 +45,11 @@ typedef HmSystem HmSystemType;
typedef HmPayload> PayloadType;
typedef MiPayload> MiPayloadType;
#ifdef ESP32
-typedef CmtRadio> CmtRadioType;
+typedef CmtRadio CmtRadioType;
typedef HmsPayload HmsPayloadType;
#endif
typedef Web WebType;
-typedef RestApi> RestApiType;
+typedef RestApi RestApiType;
typedef PubMqtt PubMqttType;
typedef PubSerial PubSerialType;
@@ -75,17 +75,21 @@ class app : public IApp, public ah::Scheduler {
void handleIntr(void) {
mNrfRadio.handleIntr();
}
- const HmRadio<>& getNrfRadioObj(void) const {
- return mNrfRadio;
+ void* getRadioObj(bool nrf) {
+ if(nrf)
+ return (void*)&mNrfRadio;
+ else {
+ #ifdef ESP32
+ return (void*)&mCmtRadio;
+ #else
+ return NULL;
+ #endif
+ }
}
-
#ifdef ESP32
void handleHmsIntr(void) {
mCmtRadio.handleIntr();
}
- const CmtRadioType& getCmtRadioObj(void) const {
- return mCmtRadio;
- }
#endif
uint32_t getUptime() {
diff --git a/src/appInterface.h b/src/appInterface.h
index a44d884d..a7299f7e 100644
--- a/src/appInterface.h
+++ b/src/appInterface.h
@@ -68,6 +68,7 @@ class IApp {
virtual void getNrfRadioCounters(uint32_t *sendCnt, uint32_t *retransmits) = 0;
//virtual void getCmtRadioCounters(uint32_t *sendCnt, uint32_t *retransmits) = 0;
+ virtual void* getRadioObj(bool nrf) = 0;
#if defined(ESP32)
//virtual const CmtRadioType& getCmtRadioObj(void) const = 0;
#endif
diff --git a/src/config/config.h b/src/config/config.h
index 54686ab8..ad3a73b1 100644
--- a/src/config/config.h
+++ b/src/config/config.h
@@ -74,15 +74,21 @@
#define DEF_NRF_IRQ_PIN 16
#endif
#ifndef DEF_NRF_MISO_PIN
- #define DEF_NRF_MISO_PIN 19
+ #define DEF_NRF_MISO_PIN 12
#endif
#ifndef DEF_NRF_MOSI_PIN
- #define DEF_NRF_MOSI_PIN 23
+ #define DEF_NRF_MOSI_PIN 13
#endif
#ifndef DEF_NRF_SCLK_PIN
- #define DEF_NRF_SCLK_PIN 18
+ #define DEF_NRF_SCLK_PIN 14
#endif
+ #ifndef DEF_CMT_SCLK
+ #define DEF_CMT_SCLK 18
+ #endif
+ #ifndef DEF_CMT_SDIO
+ #define DEF_CMT_SDIO 23
+ #endif
#ifndef DEF_CMT_CSB
#define DEF_CMT_CSB 27
#endif
diff --git a/src/config/settings.h b/src/config/settings.h
index 99da3265..ec774352 100644
--- a/src/config/settings.h
+++ b/src/config/settings.h
@@ -94,6 +94,8 @@ typedef struct {
typedef struct {
bool enabled;
+ uint8_t pinSclk;
+ uint8_t pinSdio;
uint8_t pinCsb;
uint8_t pinFcsb;
uint8_t pinIrq;
@@ -395,10 +397,14 @@ class settings {
mCfg.nrf.enabled = true;
#if defined(ESP32)
+ mCfg.cmt.pinSclk = DEF_CMT_SCLK;
+ mCfg.cmt.pinSdio = DEF_CMT_SDIO;
mCfg.cmt.pinCsb = DEF_CMT_CSB;
mCfg.cmt.pinFcsb = DEF_CMT_FCSB;
mCfg.cmt.pinIrq = DEF_CMT_IRQ;
#else
+ mCfg.cmt.pinSclk = DEF_PIN_OFF;
+ mCfg.cmt.pinSdio = DEF_PIN_OFF;
mCfg.cmt.pinCsb = DEF_PIN_OFF;
mCfg.cmt.pinFcsb = DEF_PIN_OFF;
mCfg.cmt.pinIrq = DEF_PIN_OFF;
diff --git a/src/defines.h b/src/defines.h
index 8172b4bf..2d9f983c 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -13,7 +13,7 @@
//-------------------------------------
#define VERSION_MAJOR 0
#define VERSION_MINOR 7
-#define VERSION_PATCH 49
+#define VERSION_PATCH 50
//-------------------------------------
typedef struct {
diff --git a/src/hms/cmt2300a.h b/src/hms/cmt2300a.h
index f27ce3c3..d99875b9 100644
--- a/src/hms/cmt2300a.h
+++ b/src/hms/cmt2300a.h
@@ -184,8 +184,8 @@ class Cmt2300a {
public:
Cmt2300a() {}
- void setup(uint8_t pinCsb, uint8_t pinFcsb) {
- mSpi.setup(pinCsb, pinFcsb);
+ void setup(uint8_t pinSclk, uint8_t pinSdio, uint8_t pinCsb, uint8_t pinFcsb) {
+ mSpi.setup(pinSclk, pinSdio, pinCsb, pinFcsb);
init();
}
@@ -315,6 +315,8 @@ class Cmt2300a {
mSpi.writeReg(CMT2300A_CUS_MODE_STA, 0x52);
mSpi.writeReg(0x62, 0x20);
+ if(mSpi.readReg(0x62) != 0x20)
+ return false; // not connected!
for(uint8_t i = 0; i < 0x60; i++) {
mSpi.writeReg(i, cmtConfig[i]);
diff --git a/src/hms/esp32_3wSpi.h b/src/hms/esp32_3wSpi.h
index 080e2251..4fe47497 100644
--- a/src/hms/esp32_3wSpi.h
+++ b/src/hms/esp32_3wSpi.h
@@ -11,14 +11,6 @@
#include "driver/spi_master.h"
#include "esp_rom_gpio.h" // for esp_rom_gpio_connect_out_signal
-#if CONFIG_IDF_TARGET_ESP32S3
-#define CLK_PIN 6
-#define MOSI_PIN 5
-#else
-#define CLK_PIN 18
-#define MOSI_PIN 23
-#endif
-
#define SPI_CLK 1 * 1000 * 1000 // 1MHz
#define SPI_PARAM_LOCK() \
@@ -31,19 +23,18 @@
// it is simply the first externally usable hardware SPI master controller
#define SPI_CMT SPI2_HOST
-template //, uint8_t GPIO3_PIN=15>
class esp32_3wSpi {
public:
esp32_3wSpi() {
mInitialized = false;
}
- void setup(uint8_t pinCsb = CSB_PIN, uint8_t pinFcsb = FCSB_PIN) { //, uint8_t pinGpio3 = GPIO3_PIN) {
+ void setup(uint8_t pinSclk = DEF_CMT_SCLK, uint8_t pinSdio = DEF_CMT_SDIO, uint8_t pinCsb = DEF_CMT_CSB, uint8_t pinFcsb = DEF_CMT_FCSB) {
paramLock = xSemaphoreCreateMutex();
spi_bus_config_t buscfg = {
- .mosi_io_num = MOSI_PIN,
+ .mosi_io_num = pinSdio,
.miso_io_num = -1, // single wire MOSI/MISO
- .sclk_io_num = CLK_PIN,
+ .sclk_io_num = pinSclk,
.quadwp_io_num = -1,
.quadhd_io_num = -1,
.max_transfer_sz = 32,
@@ -83,7 +74,7 @@ class esp32_3wSpi {
};
ESP_ERROR_CHECK(spi_bus_add_device(SPI_CMT, &devcfg2, &spi_fifo));
- esp_rom_gpio_connect_out_signal(MOSI_PIN, spi_periph_signal[SPI_CMT].spid_out, true, false);
+ esp_rom_gpio_connect_out_signal(pinSdio, spi_periph_signal[SPI_CMT].spid_out, true, false);
delay(100);
//pinMode(pinGpio3, INPUT);
@@ -162,13 +153,13 @@ class esp32_3wSpi {
.rx_buffer = &rx_data
};
- SPI_PARAM_LOCK();
+ SPI_PARAM_LOCK();
for(uint8_t i = 0; i < len; i++) {
ESP_ERROR_CHECK(spi_device_polling_transmit(spi_fifo, &t));
delayMicroseconds(4); // > 4 us
buf[i] = rx_data;
}
- SPI_PARAM_UNLOCK();
+ SPI_PARAM_UNLOCK();
}
private:
diff --git a/src/hms/hmsRadio.h b/src/hms/hmsRadio.h
index c515ae0e..9b1323de 100644
--- a/src/hms/hmsRadio.h
+++ b/src/hms/hmsRadio.h
@@ -29,8 +29,8 @@ class CmtRadio {
mCmtAvail = false;
}
- void setup(uint8_t pinCsb, uint8_t pinFcsb, bool genDtuSn = true) {
- mCmt.setup(pinCsb, pinFcsb);
+ void setup(uint8_t pinSclk, uint8_t pinSdio, uint8_t pinCsb, uint8_t pinFcsb, bool genDtuSn = true) {
+ mCmt.setup(pinSclk, pinSdio, pinCsb, pinFcsb);
reset(genDtuSn);
}
@@ -64,7 +64,7 @@ class CmtRadio {
mSerialDebug = true;
}
- bool cmtIsAvail() {
+ bool isConnected() {
return mCmtAvail;
}
@@ -151,8 +151,7 @@ class CmtRadio {
if(!mCmt.reset()) {
mCmtAvail = false;
DPRINTLN(DBG_WARN, F("Initializing CMT2300A failed!"));
- }
- else {
+ } else {
mCmtAvail = true;
mCmt.goRx();
}
diff --git a/src/web/RestApi.h b/src/web/RestApi.h
index aea16517..24122748 100644
--- a/src/web/RestApi.h
+++ b/src/web/RestApi.h
@@ -31,7 +31,7 @@ const uint8_t acList[] = {FLD_UAC, FLD_IAC, FLD_PAC, FLD_F, FLD_PF, FLD_T, FLD_Y
const uint8_t acListHmt[] = {FLD_UAC_1N, FLD_IAC_1, FLD_PAC, FLD_F, FLD_PF, FLD_T, FLD_YT, FLD_YD, FLD_PDC, FLD_EFF, FLD_Q, FLD_MP};
const uint8_t dcList[] = {FLD_UDC, FLD_IDC, FLD_PDC, FLD_YD, FLD_YT, FLD_IRR, FLD_MP};
-template
+template
class RestApi {
public:
RestApi() {
@@ -42,12 +42,15 @@ class RestApi {
nr = 0;
}
- void setup(IApp *app, HMSYSTEM *sys, HMRADIO *radio, AsyncWebServer *srv, settings_t *config) {
- mApp = app;
- mSrv = srv;
- mSys = sys;
- mRadio = radio;
- mConfig = config;
+ void setup(IApp *app, HMSYSTEM *sys, AsyncWebServer *srv, settings_t *config) {
+ mApp = app;
+ mSrv = srv;
+ mSys = sys;
+ mRadioNrf = (HmRadio<>*)mApp->getRadioObj(true);
+ #if defined(ESP32)
+ mRadioCmt = (CmtRadio*)mApp->getRadioObj(false);
+ #endif
+ mConfig = config;
mSrv->on("/api", HTTP_GET, std::bind(&RestApi::onApi, this, std::placeholders::_1));
mSrv->on("/api", HTTP_POST, std::bind(&RestApi::onApiPost, this, std::placeholders::_1)).onBody(
std::bind(&RestApi::onApiPostBody, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5));
@@ -238,10 +241,11 @@ class RestApi {
obj[F("sketch_used")] = ESP.getSketchSize() / 1024; // in kb
getGeneric(request, obj);
- getRadioNrf(obj.createNestedObject(F("radio")));
+ getRadioNrf(obj.createNestedObject(F("radioNrf")));
#if defined(ESP32)
getRadioCmtInfo(obj.createNestedObject(F("radioCmt")));
#endif
+ getMqttInfo(obj.createNestedObject(F("mqtt")));
getStatistics(obj.createNestedObject(F("statistics")));
#if defined(ESP32)
@@ -313,8 +317,8 @@ class RestApi {
obj[F("rx_fail")] = stat->rxFail;
obj[F("rx_fail_answer")] = stat->rxFailNoAnser;
obj[F("frame_cnt")] = stat->frmCnt;
- obj[F("tx_cnt")] = mRadio->mSendCnt;
- obj[F("retransmits")] = mRadio->mRetransmits;
+ obj[F("tx_cnt")] = mRadioNrf->mSendCnt;
+ obj[F("retransmits")] = mRadioNrf->mRetransmits;
}
void getInverterList(JsonObject obj) {
@@ -495,6 +499,8 @@ class RestApi {
#if defined(ESP32)
void getRadioCmt(JsonObject obj) {
+ obj[F("sclk")] = mConfig->cmt.pinSclk;
+ obj[F("sdio")] = mConfig->cmt.pinSdio;
obj[F("csb")] = mConfig->cmt.pinCsb;
obj[F("fcsb")] = mConfig->cmt.pinFcsb;
obj[F("gpio3")] = mConfig->cmt.pinIrq;
@@ -503,15 +509,16 @@ class RestApi {
void getRadioCmtInfo(JsonObject obj) {
obj[F("en")] = (bool) mConfig->cmt.enabled;
+ obj[F("isconnected")] = mRadioCmt->isConnected();
}
#endif
void getRadioNrf(JsonObject obj) {
- obj[F("power_level")] = mConfig->nrf.amplifierPower;
- obj[F("isconnected")] = mRadio->isChipConnected();
- //obj[F("DataRate")] = mRadio->getDataRate();
- //obj[F("isPVariant")] = mRadio->isPVariant();
obj[F("en")] = (bool) mConfig->nrf.enabled;
+ obj[F("isconnected")] = mRadioNrf->isChipConnected();
+ obj[F("power_level")] = mConfig->nrf.amplifierPower;
+ obj[F("dataRate")] = mRadioNrf->getDataRate();
+ //obj[F("isPVariant")] = mRadioNrf->isPVariant();
}
void getSerial(JsonObject obj) {
@@ -543,6 +550,14 @@ class RestApi {
obj[F("disp_bsy")] = (mConfig->plugin.display.type < 10) ? DEF_PIN_OFF : mConfig->plugin.display.disp_busy;
}
+ void getMqttInfo(JsonObject obj) {
+ obj[F("enabled")] = (mConfig->mqtt.broker[0] != '\0');
+ obj[F("connected")] = mApp->getMqttIsConnected();
+ obj[F("tx_cnt")] = mApp->getMqttTxCnt();
+ obj[F("rx_cnt")] = mApp->getMqttRxCnt();
+ obj[F("interval")] = mConfig->mqtt.interval;
+ }
+
void getIndex(AsyncWebServerRequest *request, JsonObject obj) {
getGeneric(request, obj.createNestedObject(F("generic")));
obj[F("ts_now")] = mApp->getTimestamp();
@@ -569,9 +584,9 @@ class RestApi {
}
JsonArray warn = obj.createNestedArray(F("warnings"));
- if(!mRadio->isChipConnected() && mConfig->nrf.enabled)
+ if(!mRadioNrf->isChipConnected() && mConfig->nrf.enabled)
warn.add(F("your NRF24 module can't be reached, check the wiring, pinout and enable"));
- else if(!mRadio->isPVariant() && mConfig->nrf.enabled)
+ else if(!mRadioNrf->isPVariant() && mConfig->nrf.enabled)
warn.add(F("your NRF24 module isn't a plus version(+), maybe incompatible"));
if(!mApp->getSettingsValid())
warn.add(F("your settings are invalid"));
@@ -579,19 +594,6 @@ class RestApi {
warn.add(F("reboot your ESP to apply all your configuration changes"));
if(0 == mApp->getTimestamp())
warn.add(F("time not set. No communication to inverter possible"));
-
-
- /*if(0 == mSys->getNumInverters())
- warn.add(F("no inverter configured"));*/
-
- if((!mApp->getMqttIsConnected()) && (String(mConfig->mqtt.broker).length() > 0))
- warn.add(F("MQTT is not connected"));
-
- JsonArray info = obj.createNestedArray(F("infos"));
- if(mApp->getMqttIsConnected())
- info.add(F("MQTT is connected, ") + String(mApp->getMqttTxCnt()) + F(" packets sent, ") + String(mApp->getMqttRxCnt()) + F(" packets received"));
- if(mConfig->mqtt.interval > 0)
- info.add(F("MQTT publishes in a fixed interval of ") + String(mConfig->mqtt.interval) + F(" seconds"));
}
void getSetup(AsyncWebServerRequest *request, JsonObject obj) {
@@ -729,7 +731,10 @@ class RestApi {
IApp *mApp;
HMSYSTEM *mSys;
- HMRADIO *mRadio;
+ HmRadio<> *mRadioNrf;
+ #if defined(ESP32)
+ CmtRadio *mRadioCmt;
+ #endif
AsyncWebServer *mSrv;
settings_t *mConfig;
diff --git a/src/web/html/index.html b/src/web/html/index.html
index a7c79c25..088d6410 100644
--- a/src/web/html/index.html
+++ b/src/web/html/index.html
@@ -19,7 +19,6 @@
-
Support this project:
@@ -157,14 +156,11 @@
document.getElementById("iv").replaceChildren(p);
}
- function parseWarnInfo(warn, success) {
+ function parseWarn(warn) {
var p = div(["none"]);
for(var w of warn) {
p.append(svg(iconWarn, 30, 30, "icon icon-warn"), span(w), br());
}
- for(var i of success) {
- p.append(svg(iconSuccess, 30, 30, "icon icon-success"), span(i), br());
- }
if(commInfo.length > 0)
p.append(svg(iconInfo, 30, 30, "icon icon-info"), span(commInfo), br());
@@ -197,7 +193,7 @@
parseGeneric(obj["generic"]);
parseSys(obj);
parseIv(obj["inverter"]);
- parseWarnInfo(obj["warnings"], obj["infos"]);
+ parseWarn(obj["warnings"]);
if(exeOnce) {
window.setInterval("tick()", 1000);
exeOnce = false;
diff --git a/src/web/html/setup.html b/src/web/html/setup.html
index 7ae2a952..69090ea5 100644
--- a/src/web/html/setup.html
+++ b/src/web/html/setup.html
@@ -376,26 +376,26 @@
[3, "RX (GPIO3)"],
[4, "GPIO4"],
[5, "GPIO5"],
- [12, "GPIO12"],
- [13, "GPIO13"],
- [14, "GPIO14"],
+ [12, "GPIO12 (HSPI MISO)"],
+ [13, "GPIO13 (HSPI MOSI)"],
+ [14, "GPIO14 (HSPI SCLK)"],
[15, "GPIO15"],
[16, "GPIO16"],
[17, "GPIO17"],
- [18, "GPIO18"],
- [19, "GPIO19"],
+ [18, "GPIO18 (VSPI SCLK)"],
+ [19, "GPIO19 (VSPI MISO)"],
[21, "GPIO21 (SDA)"],
[22, "GPIO22 (SCL)"],
- [23, "GPIO23"],
+ [23, "GPIO23 (VSPI MOSI)"],
[25, "GPIO25"],
[26, "GPIO26"],
[27, "GPIO27"],
[32, "GPIO32"],
[33, "GPIO33"],
- [34, "GPIO34"],
- [35, "GPIO35"],
- [36, "VP (GPIO36)"],
- [39, "VN (GPIO39)"]
+ [34, "GPIO34 (in only)"],
+ [35, "GPIO35 (in only)"],
+ [36, "VP (GPIO36, in only)"],
+ [39, "VN (GPIO39, in only)"]
];
var esp32s3pins = [
[255, "off / default"],
@@ -811,13 +811,13 @@
ml("div", {class: "col-4 col-sm-9"}, en)
])
);
- pins = [['csb', 'pinCsb'], ['fcsb', 'pinFcsb'], ['gpio3', 'pinGpio3']];
+ pins = [['sclk', 'pinCmtSclk'], ['sdio', 'pinSdio'], ['csb', 'pinCsb'], ['fcsb', 'pinFcsb'], ['gpio3', 'pinGpio3']];
for(p of pins) {
e.append(
ml("div", {class: "row mb-3"}, [
ml("div", {class: "col-12 col-sm-3 my-2"}, p[0].toUpperCase()),
ml("div", {class: "col-12 col-sm-9"},
- sel(p[1], ("ESP8266" == type) ? esp8266pins : ("ESP32-S3" == system["chip_model"]) ? esp32s3pins : esp32pins, obj[p[0]])
+ sel(p[1], ("ESP32-S3" == system["chip_model"]) ? esp32s3pins : esp32pins, obj[p[0]])
)
])
);
diff --git a/src/web/html/style.css b/src/web/html/style.css
index 9824b723..4be30110 100644
--- a/src/web/html/style.css
+++ b/src/web/html/style.css
@@ -20,6 +20,10 @@ fieldset, input[type=submit], .btn {
border-radius: 4px;
}
+input[type=file] {
+ width: 100%;
+}
+
#live span {
color: var(--fg2);
}
diff --git a/src/web/html/system.html b/src/web/html/system.html
index 1cd828b6..11be689a 100644
--- a/src/web/html/system.html
+++ b/src/web/html/system.html
@@ -63,19 +63,29 @@
]);
}
- function parseRadio(obj, stat) {
+ function parseRadio(obj) {
const pa = ["MIN (recommended)", "LOW", "HIGH", "MAX"];
+ const dr = ["1 M", "2 M", "250 k"]
- if(obj.en)
+ if(obj.radioNrf.en)
lines = [
- tr("NRF24L01", badge(obj.isconnected, ((obj.isconnected) ? "" : "not ") + "connected")),
- tr("Power Level", pa[obj.power_level])
+ tr("NRF24L01", badge(obj.radioNrf.isconnected, ((obj.radioNrf.isconnected) ? "" : "not ") + "connected")),
+ tr("NRF24 Power Level", pa[obj.radioNrf.power_level]),
+ tr("NRF24 Data Rate", dr[obj.radioNrf.dataRate] + "bps")
];
else
- lines = tr("NRF24L01", badge(false, "not enabled"));
+ lines = [tr("NRF24L01", badge(false, "not enabled"))];
+ /*IF_ESP32*/
+ if(obj.radioCmt.en)
+ lines.push(tr("CMT2300A", badge(obj.radioCmt.isconnected, ((obj.radioCmt.isconnected) ? "" : "not ") + "connected")));
+ else
+ lines.push(tr("CMT2300A", badge(false, "not enabled")));
+ /*ENDIF_ESP32*/
+
+ var stat = obj.statistics;
document.getElementById("info").append(
- headline("NRF Radio"),
+ headline("Radio"),
ml("table", {class: "table"},
ml("tbody", {}, lines)
),
@@ -94,23 +104,24 @@
);
}
- /*IF_ESP32*/
- function parseCmt(obj) {
- if(obj.en)
+ function parseMqtt(obj) {
+ if(obj.enabled) {
lines = [
- tr("CMT2300A", badge(obj.isconnected, ((obj.isconnected) ? "" : "not ") + "connected"))
+ tr("connected", badge(obj.connected, ((obj.connected) ? "true" : "false"))),
+ tr("#TX", obj.tx_cnt),
+ tr("#RX", obj.rx_cnt)
];
- else
- lines = tr("CMT2300A", badge(false, "not enabled"));
+
+ } else
+ lines = tr("enabled", badge(false, "false"));
document.getElementById("info").append(
- headline("CMT Radio"),
+ headline("MqTT"),
ml("table", {class: "table"},
ml("tbody", {}, lines)
)
);
}
- /*ENDIF_ESP32*/
function parseIndex(obj) {
if(obj.ts_sunrise > 0) {
@@ -140,11 +151,9 @@
document.getElementsByTagName('head')[0].appendChild(meta);
}
else {
+ parseRadio(obj.system);
+ parseMqtt(obj.system.mqtt);
parseSysInfo(obj["system"]);
- parseRadio(obj["system"]["radio"], obj["system"]["statistics"]);
- /*IF_ESP32*/
- parseCmt(obj["system"]["radioCmt"]);
- /*ENDIF_ESP32*/
getAjax('/api/index', parseIndex);
}
document.getElementById("html").innerHTML = obj["html"];
diff --git a/src/web/html/visualization.html b/src/web/html/visualization.html
index 03ff4083..0b3efefd 100644
--- a/src/web/html/visualization.html
+++ b/src/web/html/visualization.html
@@ -105,7 +105,7 @@
ml("div", {class: "col mx-2 mx-md-1"}, ml("span", { class: "pointer", onclick: function() {
getAjax("/api/inverter/version/" + obj.id, parseIvVersion);
}}, obj.name)),
- ml("div", {class: "col a-c"}, "Power limit " + ((obj.power_limit_read == 65535) ? "n/a" : (obj.power_limit_read + " %"))),
+ ml("div", {class: "col a-c"}, "Active Power Control: " + ((obj.power_limit_read == 65535) ? "n/a" : (obj.power_limit_read + " %"))),
ml("div", {class: "col a-c"}, ml("span", { class: "pointer", onclick: function() {
getAjax("/api/inverter/alarm/" + obj.id, parseIvAlarm);
}}, ("Alarms: " + obj.alarm_cnt))),
diff --git a/src/web/web.h b/src/web/web.h
index d4f5d069..efce1494 100644
--- a/src/web/web.h
+++ b/src/web/web.h
@@ -38,7 +38,7 @@
#define WEB_SERIAL_BUF_SIZE 2048
-const char* const pinArgNames[] = {"pinCs", "pinCe", "pinIrq", "pinSclk", "pinMosi", "pinMiso", "pinLed0", "pinLed1", "pinLedHighActive", "pinCsb", "pinFcsb", "pinGpio3"};
+const char* const pinArgNames[] = {"pinCs", "pinCe", "pinIrq", "pinSclk", "pinMosi", "pinMiso", "pinLed0", "pinLed1", "pinLedHighActive", "pinCmtSclk", "pinSdio", "pinCsb", "pinFcsb", "pinGpio3"};
template
class Web {
@@ -555,9 +555,11 @@ class Web {
case 6: mConfig->led.led0 = pin; break;
case 7: mConfig->led.led1 = pin; break;
case 8: mConfig->led.led_high_active = pin; break; // this is not really a pin but a polarity, but handling it close to here makes sense
- case 9: mConfig->cmt.pinCsb = pin; break;
- case 10: mConfig->cmt.pinFcsb = pin; break;
- case 11: mConfig->cmt.pinIrq = pin; break;
+ case 9: mConfig->cmt.pinSclk = pin; break;
+ case 10: mConfig->cmt.pinSdio = pin; break;
+ case 11: mConfig->cmt.pinCsb = pin; break;
+ case 12: mConfig->cmt.pinFcsb = pin; break;
+ case 13: mConfig->cmt.pinIrq = pin; break;
}
}