Browse Source

0.8.102

* fix MDNS #1538
* improved Wizard
* improved MqTT on devcontrol e.g. set power limit
pull/1552/head
lumapu 6 months ago
parent
commit
4d5ae72cb6
  1. 1
      .gitignore
  2. 2
      src/.gitignore
  3. 3
      src/CHANGES.md
  4. 31
      src/app.cpp
  5. 11
      src/app.h
  6. 3
      src/appInterface.h
  7. 5
      src/network/AhoyNetwork.h
  8. 3
      src/network/AhoyWifiAp.h
  9. 6
      src/network/AhoyWifiEsp32.h
  10. 4
      src/network/AhoyWifiEsp8266.h
  11. 2
      src/web/RestApi.h
  12. 28
      src/web/html/setup.html
  13. 9
      src/web/html/wizard.html
  14. 20
      src/web/lang.json
  15. 9
      src/web/web.h

1
.gitignore

@ -15,3 +15,4 @@ src/web/html/tmp/*
src/output.map src/output.map
/.venv /.venv
/scripts/__pycache__/htmlPreprocessorDefines.cpython-311.pyc

2
src/.gitignore

@ -3,3 +3,5 @@
.vscode/c_cpp_properties.json .vscode/c_cpp_properties.json
.vscode/launch.json .vscode/launch.json
.vscode/ipch .vscode/ipch
scripts/__pycache__/*
*.pyc

3
src/CHANGES.md

@ -3,6 +3,9 @@
## 0.8.102 - 2024-04-01 ## 0.8.102 - 2024-04-01
* fix NTP for `opendtufusion` #1542 * fix NTP for `opendtufusion` #1542
* fix scan WiFi in AP mode * fix scan WiFi in AP mode
* fix MDNS #1538
* improved Wizard
* improved MqTT on devcontrol e.g. set power limit
## 0.8.101 - 2024-03-28 ## 0.8.101 - 2024-03-28
* updated converter scripts to include all enabled features again (redundant scan of build flags) #1534 * updated converter scripts to include all enabled features again (redundant scan of build flags) #1534

31
src/app.cpp

@ -403,18 +403,33 @@ void app::tickSend(void) {
for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) { for (uint8_t i = 0; i < MAX_NUM_INVERTERS; i++) {
Inverter<> *iv = mSys.getInverterByPos(i); Inverter<> *iv = mSys.getInverterByPos(i);
sendIv(iv);
}
if(mAllIvNotAvail != notAvail)
once(std::bind(&app::notAvailChanged, this), 1, "avail");
mAllIvNotAvail = notAvail;
updateLed();
}
//-----------------------------------------------------------------------------
bool app::sendIv(Inverter<> *iv) {
bool notAvail = true;
if(NULL == iv) if(NULL == iv)
continue; return notAvail;
if(!iv->config->enabled)
return notAvail;
if(iv->config->enabled) {
if(!iv->commEnabled) { if(!iv->commEnabled) {
DPRINT_IVID(DBG_INFO, iv->id); DPRINT_IVID(DBG_INFO, iv->id);
DBGPRINTLN(F("no communication to the inverter (night time)")); DBGPRINTLN(F("no communication to the inverter (night time)"));
continue; return notAvail;
} }
if(!iv->radio->isChipConnected()) if(!iv->radio->isChipConnected())
continue; return notAvail;
if(InverterStatus::OFF != iv->status) if(InverterStatus::OFF != iv->status)
notAvail = false; notAvail = false;
@ -425,14 +440,8 @@ void app::tickSend(void) {
else else
mCommunication.add(iv, cmd); mCommunication.add(iv, cmd);
}); });
}
}
if(mAllIvNotAvail != notAvail) return notAvail;
once(std::bind(&app::notAvailChanged, this), 1, "avail");
mAllIvNotAvail = notAvail;
updateLed();
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

11
src/app.h

@ -188,6 +188,10 @@ class app : public IApp, public ah::Scheduler {
return mNetwork->getIp(); return mNetwork->getIp();
} }
bool isApActive(void) override {
return mNetwork->isApActive();
}
void setRebootFlag() override { void setRebootFlag() override {
once(std::bind(&app::tickReboot, this), 3, "rboot"); once(std::bind(&app::tickReboot, this), 3, "rboot");
} }
@ -386,8 +390,10 @@ class app : public IApp, public ah::Scheduler {
bool mNtpReceived = false; bool mNtpReceived = false;
void updateNtp(void); void updateNtp(void);
void triggerTickSend() override { void triggerTickSend(uint8_t id) override {
once(std::bind(&app::tickSend, this), 0, "tSend"); once([this, id]() {
sendIv(mSys.getInverterByPos(id));
}, 0, "devct");
} }
void tickCalcSunrise(void); void tickCalcSunrise(void);
@ -396,6 +402,7 @@ class app : public IApp, public ah::Scheduler {
void tickSunrise(void); void tickSunrise(void);
void tickComm(void); void tickComm(void);
void tickSend(void); void tickSend(void);
bool sendIv(Inverter<> *iv);
void tickMinute(void); void tickMinute(void);
void tickZeroValues(void); void tickZeroValues(void);
void tickMidnight(void); void tickMidnight(void);

3
src/appInterface.h

@ -31,6 +31,7 @@ class IApp {
virtual bool getWasInCh12to14(void) const = 0; virtual bool getWasInCh12to14(void) const = 0;
#endif /* defined(ETHERNET) */ #endif /* defined(ETHERNET) */
virtual String getIp(void) = 0; virtual String getIp(void) = 0;
virtual bool isApActive(void) = 0;
virtual uint32_t getUptime() = 0; virtual uint32_t getUptime() = 0;
virtual uint32_t getTimestamp() = 0; virtual uint32_t getTimestamp() = 0;
@ -42,7 +43,7 @@ class IApp {
virtual void getSchedulerInfo(uint8_t *max) = 0; virtual void getSchedulerInfo(uint8_t *max) = 0;
virtual void getSchedulerNames() = 0; virtual void getSchedulerNames() = 0;
virtual void triggerTickSend() = 0; virtual void triggerTickSend(uint8_t id) = 0;
virtual bool getRebootRequestState() = 0; virtual bool getRebootRequestState() = 0;
virtual bool getSettingsValid() = 0; virtual bool getSettingsValid() = 0;

5
src/network/AhoyNetwork.h

@ -85,12 +85,17 @@ class AhoyNetwork {
return false; return false;
} }
bool isApActive() {
return mAp.isEnabled();
}
#if !defined(ETHERNET) #if !defined(ETHERNET)
bool getAvailNetworks(JsonObject obj) { bool getAvailNetworks(JsonObject obj) {
JsonArray nets = obj.createNestedArray(F("networks")); JsonArray nets = obj.createNestedArray(F("networks"));
if(!mScanActive) { if(!mScanActive) {
mScanActive = true; mScanActive = true;
if(NetworkState::GOT_IP != mStatus)
WiFi.disconnect(); WiFi.disconnect();
WiFi.scanNetworks(true, true); WiFi.scanNetworks(true, true);
return false; return false;

3
src/network/AhoyWifiAp.h

@ -54,6 +54,9 @@ class AhoyWifiAp {
if(!mEnabled) if(!mEnabled)
return; return;
if(WiFi.softAPgetStationNum() > 0)
return;
mDns.stop(); mDns.stop();
WiFi.softAPdisconnect(); WiFi.softAPdisconnect();
#if defined(ETHERNET) #if defined(ETHERNET)

6
src/network/AhoyWifiEsp32.h

@ -43,6 +43,7 @@ class AhoyWifi : public AhoyNetwork {
mConnected = false; mConnected = false;
mOnNetworkCB(false); mOnNetworkCB(false);
mAp.enable(); mAp.enable();
MDNS.end();
} }
break; break;
@ -50,11 +51,14 @@ class AhoyWifi : public AhoyNetwork {
break; break;
case NetworkState::GOT_IP: case NetworkState::GOT_IP:
if(!mConnected) { if(mAp.isEnabled())
mAp.disable(); mAp.disable();
if(!mConnected) {
mConnected = true; mConnected = true;
ah::welcome(WiFi.localIP().toString(), F("Station")); ah::welcome(WiFi.localIP().toString(), F("Station"));
MDNS.begin(mConfig->sys.deviceName); MDNS.begin(mConfig->sys.deviceName);
MDNS.addServiceTxt("http", "tcp", "path", "/");
mOnNetworkCB(true); mOnNetworkCB(true);
} }
break; break;

4
src/network/AhoyWifiEsp8266.h

@ -39,6 +39,7 @@ class AhoyWifi : public AhoyNetwork {
mConnected = false; mConnected = false;
mOnNetworkCB(false); mOnNetworkCB(false);
mAp.enable(); mAp.enable();
MDNS.end();
} }
if (WiFi.softAPgetStationNum() > 0) { if (WiFi.softAPgetStationNum() > 0) {
@ -93,6 +94,9 @@ class AhoyWifi : public AhoyNetwork {
mConnected = true; mConnected = true;
ah::welcome(WiFi.localIP().toString(), F("Station")); ah::welcome(WiFi.localIP().toString(), F("Station"));
MDNS.begin(mConfig->sys.deviceName); MDNS.begin(mConfig->sys.deviceName);
MDNSResponder::hMDNSService hRes = MDNS.addService(NULL, "http", "tcp", 80);
MDNS.addServiceTxt(hRes, "path", "/");
MDNS.announce();
mOnNetworkCB(true); mOnNetworkCB(true);
} }

2
src/web/RestApi.h

@ -1011,7 +1011,7 @@ class RestApi {
accepted = iv->setDevControlRequest(ActivePowerContr); accepted = iv->setDevControlRequest(ActivePowerContr);
if(accepted) if(accepted)
mApp->triggerTickSend(); mApp->triggerTickSend(iv->id);
} else if(F("dev") == jsonIn[F("cmd")]) { } else if(F("dev") == jsonIn[F("cmd")]) {
DPRINTLN(DBG_INFO, F("dev cmd")); DPRINTLN(DBG_INFO, F("dev cmd"));
iv->setDevCommand(jsonIn[F("val")].as<int>()); iv->setDevCommand(jsonIn[F("val")].as<int>());

28
src/web/html/setup.html

@ -57,22 +57,9 @@
<div class="col-12 col-sm-3 my-2">{#AP_PWD}</div> <div class="col-12 col-sm-3 my-2">{#AP_PWD}</div>
<div class="col-12 col-sm-9"><input type="text" name="ap_pwd" minlength="8" /></div> <div class="col-12 col-sm-9"><input type="text" name="ap_pwd" minlength="8" /></div>
</div> </div>
<div class="row mb-3">
<div class="col-12 col-sm-3 my-2">{#SEARCH_NETWORKS}</div>
<div class="col-12 col-sm-9"><input type="button" name="scanbtn" id="scanbtn" class="btn" value="{#BTN_SCAN}" onclick="scan()"/></div>
</div>
<div class="row mb-2 mb-sm-3">
<div class="col-12 col-sm-3 my-2">{#AVAIL_NETWORKS}</div>
<div class="col-12 col-sm-9">
<select name="networks" id="networks" onChange="selNet()">
<option value="-1" selected disabled hidden>{#NETWORK_NOT_SCANNED}</option>
</select>
</div>
</div>
<div class="row mb-2 mb-sm-3"> <div class="row mb-2 mb-sm-3">
<div class="col-12 col-sm-3 my-2">SSID</div> <div class="col-12 col-sm-3 my-2">SSID</div>
<div class="col-12 col-sm-9"><input type="text" name="ssid"/></div> <div class="col-12 col-sm-9"><input type="text" name="ssid"/><br/><a href="/wizard">{#SCAN_WIFI}</a></div>
</div> </div>
<div class="row mb-2 mb-sm-3"> <div class="row mb-2 mb-sm-3">
<div class="col-12 col-sm-3">{#SSID_HIDDEN}</div> <div class="col-12 col-sm-3">{#SSID_HIDDEN}</div>
@ -606,12 +593,6 @@
setTimeout(function() {getAjax('/api/index', apiCbNtp2)}, 2000) setTimeout(function() {getAjax('/api/index', apiCbNtp2)}, 2000)
} }
function scan() {
var obj = {cmd: "scan_wifi", token: "*"}
getAjax("/api/setup", apiCbWifi, "POST", JSON.stringify(obj));
setTimeout(function() {getAjax('/api/setup/networks', listNetworks)}, 5000);
}
function syncTime() { function syncTime() {
var obj = {cmd: "sync_ntp", token: "*"} var obj = {cmd: "sync_ntp", token: "*"}
getAjax("/api/setup", apiCbNtp, "POST", JSON.stringify(obj)) getAjax("/api/setup", apiCbNtp, "POST", JSON.stringify(obj))
@ -1319,13 +1300,6 @@
s.appendChild(opt("-1", "{#NO_NETWORK_FOUND}")); s.appendChild(opt("-1", "{#NO_NETWORK_FOUND}"));
} }
function selNet() {
var s = document.getElementById("networks");
var e = document.getElementsByName("ssid")[0];
if(-1 != s.value)
e.value = s.value;
}
getAjax("/api/setup", parse); getAjax("/api/setup", parse);
</script> </script>
</body> </body>

9
src/web/html/wizard.html

@ -218,7 +218,7 @@
sect("{#WIFI_MANUAL}", ml("input", {id: "man", type: "text"})), sect("{#WIFI_MANUAL}", ml("input", {id: "man", type: "text"})),
sect("{#WIFI_PASSWORD}", ml("input", {id: "pwd", type: "password"})), sect("{#WIFI_PASSWORD}", ml("input", {id: "pwd", type: "password"})),
ml("div", {class: "row my-4"}, ml("div", {class: "col a-r"}, ml("input", {type: "button", class:"btn", value: "{#BTN_NEXT}", onclick: () => {saveWifi()}}, null))), ml("div", {class: "row my-4"}, ml("div", {class: "col a-r"}, ml("input", {type: "button", class:"btn", value: "{#BTN_NEXT}", onclick: () => {saveWifi()}}, null))),
ml("div", {class: "row mt-5"}, ml("div", {class: "col a-c"}, ml("a", {href: "http://192.168.4.1/"}, "{#STOP_WIZARD}"))) ml("div", {class: "row mt-5"}, ml("div", {class: "col a-c"}, ml("a", {href: "http://192.168.4.1/index"}, "{#STOP_WIZARD}")))
]) ])
} }
/*ENDIF_ETHERNET*/ /*ENDIF_ETHERNET*/
@ -229,9 +229,9 @@
ml("div", {class: "row"}, ml("div", {class: "col"}, ml("span", {class: "fs-5"}, "{#TEST_CONNECTION}"))), ml("div", {class: "row"}, ml("div", {class: "col"}, ml("span", {class: "fs-5"}, "{#TEST_CONNECTION}"))),
sect("{#TRY_TO_CONNECT}", ml("span", {id: "state"}, "{#CONNECTING}")), sect("{#TRY_TO_CONNECT}", ml("span", {id: "state"}, "{#CONNECTING}")),
ml("div", {class: "row my-4"}, ml("div", {class: "col a-r"}, ml("input", {type: "button", class:"btn hide", id: "btn", value: "{#BTN_FINISH}", onclick: () => {redirect()}}, null))), ml("div", {class: "row my-4"}, ml("div", {class: "col a-r"}, ml("input", {type: "button", class:"btn hide", id: "btn", value: "{#BTN_FINISH}", onclick: () => {redirect()}}, null))),
ml("div", {class: "row mt-5"}, ml("div", {class: "col a-c"}, ml("a", {href: "http://192.168.4.1/"}, "{#STOP_WIZARD}"))) ml("div", {class: "row mt-5"}, ml("div", {class: "col a-c"}, ml("a", {href: "http://192.168.4.1/index"}, "{#STOP_WIZARD}")))
) )
v = setInterval(() => {getAjax('/api/setup/getip', printIp)}, 1000); v = setInterval(() => {getAjax('/api/setup/getip', printIp)}, 300);
} }
function redirect() { function redirect() {
@ -286,7 +286,8 @@
} }
c.append(step1()) c.append(step1())
v = setInterval(() => {getAjax('/api/setup/networks', nets)}, 1000); getAjax('/api/setup/networks', nets)
v = setInterval(() => {getAjax('/api/setup/networks', nets)}, 1000)
/*ENDIF_ETHERNET*/ /*ENDIF_ETHERNET*/
</script> </script>

20
src/web/lang.json

@ -81,7 +81,7 @@
{ {
"token": "BTN_NEXT", "token": "BTN_NEXT",
"en": "next >>", "en": "next >>",
"de": "prüfen >>" "de": "pr&uuml;fen >>"
}, },
{ {
"token": "BTN_REBOOT", "token": "BTN_REBOOT",
@ -91,7 +91,7 @@
{ {
"token": "TEST_CONNECTION", "token": "TEST_CONNECTION",
"en": "Test Connection", "en": "Test Connection",
"de": "Verbindung wird überprüft" "de": "Verbindung wird &uuml;berpr&uuml;ft"
}, },
{ {
"token": "TRY_TO_CONNECT", "token": "TRY_TO_CONNECT",
@ -259,19 +259,9 @@
"de": "Netzwerke suchen" "de": "Netzwerke suchen"
}, },
{ {
"token": "BTN_SCAN", "token": "SCAN_WIFI",
"en": "scan", "en": "scan for WiFi networks",
"de": "Suche starten" "de": "nach WiFi Netzwerken suchen"
},
{
"token": "AVAIL_NETWORKS",
"en": "Avail Networks",
"de": "Verf&uuml;gbare Netzwerke"
},
{
"token": "NETWORK_NOT_SCANNED",
"en": "not scanned",
"de": "nicht gesucht"
}, },
{ {
"token": "SSID_HIDDEN", "token": "SSID_HIDDEN",

9
src/web/web.h

@ -57,7 +57,8 @@ class Web {
mConfig = config; mConfig = config;
DPRINTLN(DBG_VERBOSE, F("app::setup-on")); DPRINTLN(DBG_VERBOSE, F("app::setup-on"));
mWeb.on("/", HTTP_GET, std::bind(&Web::onIndex, this, std::placeholders::_1)); mWeb.on("/", HTTP_GET, std::bind(&Web::onIndex, this, std::placeholders::_1, true));
mWeb.on("/index", HTTP_GET, std::bind(&Web::onIndex, this, std::placeholders::_1, false));
mWeb.on("/login", HTTP_ANY, std::bind(&Web::onLogin, this, std::placeholders::_1)); mWeb.on("/login", HTTP_ANY, std::bind(&Web::onLogin, this, std::placeholders::_1));
mWeb.on("/logout", HTTP_GET, std::bind(&Web::onLogout, this, std::placeholders::_1)); mWeb.on("/logout", HTTP_GET, std::bind(&Web::onLogout, this, std::placeholders::_1));
mWeb.on("/colors.css", HTTP_GET, std::bind(&Web::onColor, this, std::placeholders::_1)); mWeb.on("/colors.css", HTTP_GET, std::bind(&Web::onColor, this, std::placeholders::_1));
@ -319,7 +320,11 @@ class Web {
client->send("hello!", NULL, millis(), 1000); client->send("hello!", NULL, millis(), 1000);
} }
void onIndex(AsyncWebServerRequest *request) { void onIndex(AsyncWebServerRequest *request, bool checkAp = true) {
if(mApp->isApActive() && checkAp) {
onWizard(request);
return;
}
getPage(request, PROT_MASK_INDEX, index_html, index_html_len); getPage(request, PROT_MASK_INDEX, index_html, index_html_len);
} }

Loading…
Cancel
Save