Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Develop03 devil #652

Closed
wants to merge 61 commits into from
Closed

Develop03 devil #652

wants to merge 61 commits into from

Conversation

beegee3
Copy link
Contributor

@beegee3 beegee3 commented Feb 5, 2023

Suggestions for improvement for Radio and Wifi as discussed in #564, #536, #611. And some small additional corrections.

lumapu and others added 30 commits January 1, 2023 23:37
… comm. stop lumapu#515

moved payload send to `payload.h`, function `ivSend` lumapu#515
added SH1106 to automatic build
added IP address to MQTT (version, device and IP are retained and only transmitted once after boot) lumapu#556
added `set_power_limit` acknowledge MQTT publish lumapu#553
changed: version, device name are only published via MQTT once after boot
added `Login` to menu if admin password is set lumapu#554
added `development` to second changelog link in `index.html` lumapu#543
added interval for MQTT (as option). With this settings MQTT live data is published in a fixed timing (only if inverter is available) lumapu#542, lumapu#523
added MQTT `comm_disabled` lumapu#529
corrected MQTT `comm_disabled` lumapu#529
fix Prometheus and JSON endpoints (`config_override.h`) lumapu#561
publish MQTT with fixed interval even if inverter is not available lumapu#542
added JSON settings upload. NOTE: settings JSON download changed, so only settings should be uploaded starting from version `0.5.70` lumapu#551
MQTT topic and inverter name have more allowed characters: `[A-Za-z0-9./#$%&=+_-]+`, thx: @mo Demman
improved potential issue with `checkTicker`, thx @cbscpe
MQTT option for reset values on midnight / not avail / communication stop lumapu#539
small fix in `tickIVCommunication` lumapu#534
add `YieldTotal` correction, eg. to have the option to zero at year start lumapu#512
Displays werden nun mit der Lib u8g2 verwendet.
da Display überladen aussah.
fix Prometheus and JSON endpoints (`config_override.h`) lumapu#561
publish MQTT with fixed interval even if inverter is not available lumapu#542
added JSON settings upload. NOTE: settings JSON download changed, so only settings should be uploaded starting from version `0.5.70` lumapu#551
MQTT topic and inverter name have more allowed characters: `[A-Za-z0-9./#$%&=+_-]+`, thx: @mo Demman
improved potential issue with `checkTicker`, thx @cbscpe
MQTT option for reset values on midnight / not avail / communication stop lumapu#539
small fix in `tickIVCommunication` lumapu#534
add `YieldTotal` correction, eg. to have the option to zero at year start lumapu#512
fixed YieldTotal correction calculation lumapu#589
fixed serial output of power limit acknowledge lumapu#569
…ettings are introduced but not able to be modified, will be included in next version)
@lumapu
Copy link
Owner

lumapu commented Feb 5, 2023

@beegee3:
Glückwunsch zum ersten PR! Und schon gemerged 😄
Vielen Dank für deine Beitrage. Echt toll was du da geschaffen hast! Der Circularbuffer ist weg - sehr schöne neue Implementierung mit std::queue 😃. Bin gespannt was mit Sonne passiert und wie stabil das ganze jetzt läuft.
Ich habe mir alles angeschaut und war hin und weg. Deine Beiträge bringen Ahoy so richtig voran.

@lumapu lumapu closed this Feb 5, 2023
@beegee3
Copy link
Contributor Author

beegee3 commented Feb 6, 2023

@lumapu danke für die Lorbeeren, hatten die Anpassungen ja lange genug diskutiert und ich wollte es dir mal einfacher machen. Musste es allerdings online machen, daher die vielen commits in meinem PR (sorry dafür).

Aber noch eine Frage: beim neusten commit wird in ahoywifi der Scan erst nach Ablauf der timeout Zeit gestartet. Das verzögert natürlich den STA Verbindungsversuch, bis der Scan fertig ist. Welche Probleme gibt es bei dir, wenn der Scan sofort gestartet wird? Eine Verbindung im AP Mode sollte doch trotzdem möglich sein.

@lumapu
Copy link
Owner

lumapu commented Feb 6, 2023

Ja gerne 😊

Ich habe nur eine Fritzbox ohne Repeater, da will sich Ahoy partout nicht verbinden, da die Liste immer nur 6 Einträge (= eine BSSID) hat. Als nächstes wird die Liste um 6 Elemente erleichtert und ist damit leer. Hier wird der Verbindungsaufbau gestartet.
Die Prüfung, ob die Liste leer ist passiert ca. 2 Sekunden später und fängt an nach BSSIDs zu suchen, was gleichzeitig den Verbindungsaufbau abbricht.
Ich denke das funktioniert für Szenarien ab zwei BSSIDs aber leider nicht für nur einen.
Ich kann gerne mal bei Gelegenheit ein serielles Log anhängen.

@beegee3 beegee3 deleted the develop03-devil branch February 6, 2023 21:49
@beegee3
Copy link
Contributor Author

beegee3 commented Feb 6, 2023

eine BSSID

ja klar, da kommt der nächste Scan viel zu schnell. Nur blöd, dass man bis zum ersten Scan 10 sec warten muss, denn je mehr Repeater man hat, umso länger dauert der Scan. Müsste sich das nicht mit einer mStaConn == DISCONNECTED Prüfung für den Scan Start beheben lassen. Braucht noch eine kleine Änderung im reconnect Block: immer WiFi.disconnect aufrufen und bei leerer Liste mStaConn = DISCONNECTED setzen, damit ein neuer Scan gestartet wird.
Dann ist der Ablauf: 1. Scan startet sofort -> findet (bei dir) eine BSSID -> Timeout erreicht -> Status CONNECTING, BSSID aus Liste lesen und Verbindungsversuch -> nicht erfolgreich -> nächster Timeout -> leere Liste, Status auf DISCONNECTED -> 2.Scan
Hier die komplette Loop zum ausprobieren 😃:

void ahoywifi::tickWifiLoop() {
    #if !defined(AP_ONLY)
    if(mStaConn != GOT_IP) {
        if (WiFi.softAPgetStationNum() > 0) { // do not reconnect if any AP connection exists
            if(mStaConn != IN_AP_MODE) {
                mStaConn = IN_AP_MODE;
                // first time switch to AP Mode
                if (mScanActive) {
                    WiFi.scanDelete();
                    mScanActive = false;
                }
                DBGPRINTLN(F("AP client connected"));
                welcome(mApIp.toString());
                WiFi.mode(WIFI_AP);
                mDns.start(53, "*", mApIp);
                mAppWifiCb(true);
            }
            mDns.processNextRequest();
            return;
        }
        else if(mStaConn == IN_AP_MODE) {
            mCnt = 0;
            mDns.stop();
            WiFi.mode(WIFI_AP_STA);
            mStaConn = DISCONNECTED;
        }
        mCnt++;

        uint8_t timeout = 10; // seconds
        if (mStaConn == CONNECTED) // connected but no ip
            timeout = 20;

        if(!mScanActive && mBSSIDList.empty() && (mStaConn == DISCONNECTED)) { // start scanning APs with the given SSID
            DBGPRINT(F("scanning APs with SSID "));
            DBGPRINTLN(String(mConfig->sys.stationSsid));
            mScanCnt = 0;
            mScanActive = true;
            #if defined(ESP8266)
            WiFi.scanNetworks(true, false, 0U, (uint8_t *)mConfig->sys.stationSsid);
            #else
            WiFi.scanNetworks(true, false, false, 300U, 0U, mConfig->sys.stationSsid);
            #endif
            return;
        }
        DBGPRINT(F("reconnect in "));
        DBGPRINT(String(timeout-mCnt));
        DBGPRINTLN(F(" seconds"));
        if(mScanActive) {
            getBSSIDs();
            if(!mScanActive)        // scan completed
                if ((mCnt % timeout) < timeout - 2)
                    mCnt = timeout - 2;
        }
        if((mCnt % timeout) == 0) { // try to reconnect after x sec without connection
            mStaConn = CONNECTING;
            WiFi.disconnect();

            if(mBSSIDList.size() > 0) { // get first BSSID in list
                DBGPRINT("try to connect to AP with BSSID:");
                uint8_t bssid[6];
                for (int j = 0; j < 6; j++) {
                    bssid[j] = mBSSIDList.front();
                    mBSSIDList.pop_front();
                    DBGPRINT(" "  + String(bssid[j], HEX));
                }
                DBGPRINTLN("");
                WiFi.begin(mConfig->sys.stationSsid, mConfig->sys.stationPwd, 0, &bssid[0]);
            }
            else
                mStaConn = DISCONNECTED;

            mCnt = 0;
        }
    }
    #endif
}

@lumapu
Copy link
Owner

lumapu commented Feb 6, 2023

danke probiere ich morgen 😎

@beegee3
Copy link
Contributor Author

beegee3 commented Feb 6, 2023

sehe, du baust die MIs ein👍. Dachte, die kann man mit derselben Kommunikation erschlagen?!

Die Korrektur zur Compiler Warning in Radio.h ist falsch!!!
nicht len+1 bei crc8, sondern len:
mTxBuf[len+1] = ah::crc8(mTxBuf, len);
ersetzen durch
mTxBuf[len] = ah::crc8(mTxBuf, len);
Vielleicht danach noch ein
len++;
Dann musst du nicht überall das len+1 rumschleppen 😁

@beegee3
Copy link
Contributor Author

beegee3 commented Feb 7, 2023

Version 0.5.81:
Korrektur in hmRadio.h s.o. und in app.cpp Zeile 98 (loopStandard) statt 'gleich' muss es 'ungleich' sein:
if(NULL != iv) {
dann gibt's auch wieder Empfang 😀

@lumapu
Copy link
Owner

lumapu commented Feb 7, 2023

@beegee3 du bist so fix, da kann ich die Fehler gar nicht mehr selber suchen 😂 danke

@lumapu
Copy link
Owner

lumapu commented Feb 7, 2023

@beegee3 das ist der Output deiner neuen loop von oben. Gefühl klappt es nur ganz knapp:

Log 1
connect to network 'durchsichtig' ...
I: resetPayload: id: 0
I: resetPayload: id: 1
I: resetPayload: id: 2
I: resetPayload: id: 3
I: resetPayload: id: 4
I: resetPayload: id: 5
I: resetPayload: id: 6
I: resetPayload: id: 7
I: resetPayload: id: 8
I: resetPayload: id: 9
I: resetPayload: id: 0
I: resetPayload: id: 1
I: resetPayload: id: 2
I: resetPayload: id: 3
I: resetPayload: id: 4
I: resetPayload: id: 5
I: resetPayload: id: 6
I: resetPayload: id: 7
I: resetPayload: id: 8
I: resetPayload: id: 9
W: WARNING! your NRF24 module can't be reached, check the wiring
scanning APs with SSID durchsichtig
reconnect in 8 seconds
reconnect in 7 seconds
reconnect in 6 seconds
reconnect in 5 seconds
BSSID 0: 50 e6 36 37 69 b3
reconnect in 1 seconds
reconnect in 0 seconds
try to connect to AP with BSSID: 50 e6 36 37 69 b3
reconnect in 9 seconds
reconnect in 8 seconds
reconnect in 7 seconds
reconnect in 6 seconds
reconnect in 5 seconds
reconnect in 4 seconds
reconnect in 3 seconds
reconnect in 2 seconds
reconnect in 1 seconds
reconnect in 0 seconds
connect to network 'durchsichtig' ...
I: [WiFi] Connection Lost
scanning APs with SSID durchsichtig
reconnect in 3 seconds
reconnect in 2 seconds
reconnect in 1 seconds
BSSID 0: 50 e6 36 37 69 b3
reconnect in 0 seconds
try to connect to AP with BSSID: 50 e6 36 37 69 b3
reconnect in 9 seconds

[WiFi] Connected


--------------------------------
Welcome to AHOY!

point your browser to http://10.20.3.44 (Station)
to configure your device
--------------------------------

[WiFi] AP disabled
I: [NTP]: 2023-02-07 21:15:29 UTC

Aber leider passiert ab und zu auch folgendes (endlos)

Log 2
connect to network 'durchsichtig' ...
I: resetPayload: id: 0
I: resetPayload: id: 1
I: resetPayload: id: 2
I: resetPayload: id: 3
I: resetPayload: id: 4
I: resetPayload: id: 5
I: resetPayload: id: 6
I: resetPayload: id: 7
I: resetPayload: id: 8
I: resetPayload: id: 9
I: resetPayload: id: 0
I: resetPayload: id: 1
I: resetPayload: id: 2
I: resetPayload: id: 3
I: resetPayload: id: 4
I: resetPayload: id: 5
I: resetPayload: id: 6
I: resetPayload: id: 7
I: resetPayload: id: 8
I: resetPayload: id: 9
W: WARNING! your NRF24 module can't be reached, check the wiring
scanning APs with SSID durchsichtig
reconnect in 8 seconds
reconnect in 7 seconds
reconnect in 6 seconds
reconnect in 5 seconds
scanning APs with SSID durchsichtig
reconnect in 0 seconds
reconnect in 9 seconds
scanning APs with SSID durchsichtig
reconnect in 0 seconds
reconnect in 9 seconds
scanning APs with SSID durchsichtig
reconnect in 0 seconds
reconnect in 9 seconds
scanning APs with SSID durchsichtig
reconnect in 0 seconds
reconnect in 9 seconds
scanning APs with SSID durchsichtig
reconnect in 0 seconds
reconnect in 9 seconds
scanning APs with SSID durchsichtig
reconnect in 0 seconds
reconnect in 9 seconds
scanning APs with SSID durchsichtig
reconnect in 0 seconds
reconnect in 9 seconds
scanning APs with SSID durchsichtig

und mal gehts sehr schnell:

Log 3
connect to network 'durchsichtig' ...
I: resetPayload: id: 0
I: resetPayload: id: 1
I: resetPayload: id: 2
I: resetPayload: id: 3
I: resetPayload: id: 4
I: resetPayload: id: 5
I: resetPayload: id: 6
I: resetPayload: id: 7
I: resetPayload: id: 8
I: resetPayload: id: 9
I: resetPayload: id: 0
I: resetPayload: id: 1
I: resetPayload: id: 2
I: resetPayload: id: 3
I: resetPayload: id: 4
I: resetPayload: id: 5
I: resetPayload: id: 6
I: resetPayload: id: 7
I: resetPayload: id: 8
I: resetPayload: id: 9
W: WARNING! your NRF24 module can't be reached, check the wiring
scanning APs with SSID durchsichtig
reconnect in 8 seconds
reconnect in 7 seconds
reconnect in 6 seconds
reconnect in 5 seconds
BSSID 0: 50 e6 36 37 69 b3
reconnect in 1 seconds
reconnect in 0 seconds
try to connect to AP with BSSID: 50 e6 36 37 69 b3
reconnect in 9 seconds

[WiFi] Connected


--------------------------------
Welcome to AHOY!

point your browser to http://10.20.3.44 (Station)
to configure your device
--------------------------------

[WiFi] AP disabled
I: [NTP]: 2023-02-07 21:26:41 UTC

lumapu added a commit that referenced this pull request Feb 7, 2023
reset values is no bound to MQTT any more, setting moved to `inverter` #649
fixed wording on `index.hmtl` #661
@beegee3
Copy link
Contributor Author

beegee3 commented Feb 8, 2023

@lumapu upps, ist dein RSSI so schlecht? (Schlechte Verbindung könnte auch eine Erklärung für das Web-Seiten Problem sein, das in verschiedenen Issues angesprochen wird. Werde dort heute noch etwas dazu schreiben)
Aber ansonsten stimmt, bei nur einer BSSID wird ja sofort ein neuer Scan aktiviert. Da braucht es eine Verzögerung. Insgesamt braucht die tickWifiLoop eine klarere Block Strukturierung für AP Mode - Scan - Connect.
AP Mode passt, aber für STA sollte zuerst der Scan Block aufgerufen werden und solange da keine BSSID ermittelt wurde, macht ein Connect keinen Sinn. Ein sofortiger neuer Scan ist wahrscheinlich auch nicht hilfreich. Evtl. neigt die Fritzbox (bzw. der Router) dazu, permanente Scans zeitweise zu blockieren (wie es bei zu häufigen Connect Versuchen passiert).
Hat man eine BSSID, so sollte der Connect Block gestartet werden. Solange der läuft, darf kein neuer Scan gestartet werden.

All das lässt sich mit den bereits vorhandenen Countern mCnt (für den Connect Block) und mScanCnt (für den Scan Block) realisieren. Die Idee ist, dass der Scan Block nichts zum Connect Block durchlässt, solange keine BSSID vorhanden ist. Ein Scan wird nur gestartet, wenn die Liste leer und der Status DISCONNECTED ist. Ist der Scan fertig, wird bei leerer BSSID Liste mScanCnt als Countdown für den nächsten Scan auf eine Verzögerung von 5 Sekunden gesetzt. Bei vorhandener BSSID wird mCnt bestimmt und Connect beginnt. Erst wenn die BSSID Liste durch den Connect Block geleert wurde und der letzte Versuch mit dem Status DISCONNECTED beendet wird, startet ein neuer Scan.
Hier der Vorschlag mit jeder Menge Kommentare, die mehr für dich zur Illustration gedacht sind:

void ahoywifi::tickWifiLoop() {
    #if !defined(AP_ONLY)
    if(mStaConn != GOT_IP) {
        // AP Mode
        if (WiFi.softAPgetStationNum() > 0) { // do not reconnect if any AP connection exists
            if(mStaConn != IN_AP_MODE) {
                mStaConn = IN_AP_MODE;
                // first time switch to AP Mode
                if (mScanActive) {
                    WiFi.scanDelete();
                    mScanActive = false;
                    DBGPRINTLN(F(" aborted")); // end of scan animation
                }
                DBGPRINTLN(F("AP client connected"));
                welcome(mApIp.toString());
                WiFi.mode(WIFI_AP);
                mDns.start(53, "*", mApIp);
                mAppWifiCb(true);
            }
            mDns.processNextRequest();
            return;
        }
        else if(mStaConn == IN_AP_MODE) {
            mScanCnt = 0; // prepare scanning
            mDns.stop();
            WiFi.mode(WIFI_AP_STA);
            mStaConn = DISCONNECTED;
        }

        uint8_t timeout = (mStaConn == CONNECTED) ? 20 : 10; // if connected but no ip 20 seconds else 10 seconds

        // Scan
        if (!mScanActive) {
            if(mBSSIDList.empty() && (mStaConn == DISCONNECTED)) {
                if (mScanCnt == 0) { // start scanning APs with the given SSID
                    DBGPRINT(F("scanning APs with SSID "));
                    DBGPRINT(String(mConfig->sys.stationSsid));
                    mScanActive = true;
                    #if defined(ESP8266)
                    WiFi.scanNetworks(true, false, 0U, (uint8_t *)mConfig->sys.stationSsid);
                    #else
                    WiFi.scanNetworks(true, false, false, 300U, 0U, mConfig->sys.stationSsid);
                    #endif
                }
                else {
                    DBGPRINT(F("start next scan in "));
                    DBGPRINT(String(mScanCnt));
                    DBGPRINTLN(F(" seconds"));
                    mScanCnt--;
                }
                return;
            }
        }
        else {
            getBSSIDs();
            if(!mScanActive) {              // scan completed
                mScanCnt = 5;               // set counter for next scan to 5 seconds
                if (mBSSIDList.empty())     // no BSSID found
                    return;
                else                        // set counter for connecting
                    mCnt = (mScanCnt < timeout) ? mScanCnt : timeout;
            }
            else {
                DBGPRINT(F("."));           // animate scanning
                return;
            }
        }

        // Connect
        if((mCnt % timeout) == 0) { // try to reconnect after x sec without connection
            mStaConn = CONNECTING;
            WiFi.disconnect();

            if(mBSSIDList.size() > 0) { // get first BSSID in list
                DBGPRINT("try to connect to AP with BSSID:");
                uint8_t bssid[6];
                for (int j = 0; j < 6; j++) {
                    bssid[j] = mBSSIDList.front();
                    mBSSIDList.pop_front();
                    DBGPRINT(" "  + String(bssid[j], HEX));
                }
                DBGPRINTLN("");
                WiFi.begin(mConfig->sys.stationSsid, mConfig->sys.stationPwd, 0, &bssid[0]);
            }
            else // reconnection failed
                mStaConn = DISCONNECTED;

            mCnt = 0;
        }
        else{
            DBGPRINT(F("reconnect in "));
            DBGPRINT(String(timeout-mCnt));
            DBGPRINTLN(F(" seconds"));
        }
        mCnt++;
    }
    #endif
}

//-----------------------------------------------------------------------------
void ahoywifi::setupStation(void) {
    DPRINTLN(DBG_VERBOSE, F("wifi::setupStation"));
    if(mConfig->sys.ip.ip[0] != 0) {
        IPAddress ip(mConfig->sys.ip.ip);
        IPAddress mask(mConfig->sys.ip.mask);
        IPAddress dns1(mConfig->sys.ip.dns1);
        IPAddress dns2(mConfig->sys.ip.dns2);
        IPAddress gateway(mConfig->sys.ip.gateway);
        if(!WiFi.config(ip, gateway, mask, dns1, dns2))
            DPRINTLN(DBG_ERROR, F("failed to set static IP!"));
    }
    mBSSIDList.clear();
    if(String(mConfig->sys.deviceName) != "")
        WiFi.hostname(mConfig->sys.deviceName);
    WiFi.mode(WIFI_AP_STA);
    mScanCnt = 0;   // start scan immediately

    DBGPRINT(F("connect to network '"));
    DBGPRINT(mConfig->sys.stationSsid);
    DBGPRINTLN(F("' ..."));
}

//-----------------------------------------------------------------------------
void ahoywifi::getBSSIDs() {
    int n = WiFi.scanComplete();
    if (n < 0) {
        mScanCnt++;
        if (mScanCnt < 20)
            return;
    }
    if(n > 0) {
        DBGPRINTLN(F(" completed")); // end of scan animation
        mBSSIDList.clear();
        int sort[n];
        sortRSSI(&sort[0], n);
        for (int i = 0; i < n; i++) {
            DBGPRINT("BSSID " + String(i) + ":");
            uint8_t *bssid = WiFi.BSSID(sort[i]);
            for (int j = 0; j < 6; j++){
                DBGPRINT(" " + String(bssid[j], HEX));
                mBSSIDList.push_back(bssid[j]);
            }
            DBGPRINTLN("");
        }
    }
    else
        DBGPRINTLN(F(" failed")); // end of scan animation

    mScanActive = false;
    WiFi.scanDelete();
}

//-----------------------------------------------------------------------------
void ahoywifi::connectionEvent(WiFiStatus_t status) {
    switch(status) {
        case CONNECTED:
            if(mStaConn != CONNECTED) {
                mStaConn = CONNECTED;
                DBGPRINTLN(F("\n[WiFi] Connected"));
            }
            break;

        case GOT_IP:
            mStaConn = GOT_IP;
            if (mScanActive) {              // maybe another scan has started
                WiFi.scanDelete();
                mScanActive = false;
                DBGPRINTLN(F(" aborted"));  // end of scan animation
            }
            welcome(WiFi.localIP().toString() + F(" (Station)"));
            WiFi.mode(WIFI_STA);
            DBGPRINTLN(F("[WiFi] AP disabled"));
            mAppWifiCb(true);
            break;

        case DISCONNECTED:
            if(mStaConn != CONNECTING) {
                mStaConn = DISCONNECTED;
                setupWifi();                // reconnect with AP / Station setup
                mAppWifiCb(false);
                DPRINTLN(DBG_INFO, "[WiFi] Connection Lost");
            }
            break;

        default:
            break;
    }
}
    //-------------------------------------------------------------------------
    void ahoywifi::onWiFiEvent(WiFiEvent_t event) {
        DPRINTLN(DBG_DEBUG, F("Wifi event: "));
        DPRINTLN(DBG_DEBUG, String(event));
        ...
    }

bei onWiFiEvent habe ich die ersten beiden Zeilen als DBG_DEBUG Ausgabe gemacht, um die neue Scan Animation nicht zu stören.

@stefan123t
Copy link
Collaborator

@beegee3 ich meine irgendwo hatte uns mal jemand auf ein Issue mit der FritzBox verwiesen.
Da musste zweimal (zweimal!) hintereinander gescannt werden, damit ein STA Connect stattfinden kann.
War auch mit Hinweis auf einige Issues upstream in der ESP / Arduino Implementierung.

@beegee3
Copy link
Contributor Author

beegee3 commented Feb 9, 2023

@lumapu ja, erinnere mich auch schwach. Glaube aber, das kam eher daher, dass mehrere Verbindungsversuche zu schnell hintereinander gestartet wurden und die Fritzbox dann den Verbindungsaufbau für eine gewisse Zeit sperrt (mind. 1 sec).
Jedenfalls funktioniert bei mir (RSSI -45dBm) die Verbindung (fast) immer beim ersten Versuch. Zwischen 2 bis 7 Sekunden nach WiFi.begin kommt die Welcome Message.
In (sehr) seltenen Fällen funktioniert anschließend die DNS Namensauflösung für den NTP Server (bei mir fritz.box) nicht, was im serial log mit einer WiFi internen Fehlermeldung angezeigt wird. Das führt komischerweise dazu, dass die Verbindung verloren geht und neu aufgebaut wird. Dann geht es aber reibungslos. Passiert extrem selten, daher kein Problem, auch wenn WiFi.hostByName das eigentlich abfangen sollte.

@knickohr
Copy link

knickohr commented Mar 6, 2023

Ich verstehe diesen PR jetzt nicht ganz 😲

ist das das Problem das bei mir bisher meine SSID nicht sichtbar war mit der original Software und jetzt mit Deiner modifizierten Variante plötzlich wieder funktioniert ?

@beegee3
Copy link
Contributor Author

beegee3 commented Mar 6, 2023

Ich versuche das mal zu beschreiben, ohne das es eine neue Diskussion zur Wifi Verbindung lostritt 😨

Zusammenfassend gesagt:

  • die aktuelle Originalversion startet im AP Modus mit dem 10 Sekunden Countdown. Danach wird der SSID Scan gestartet und auch ein neuer 10 Sekunden Countdown. Sobald die Scanergebnisse vorliegen, wird der Verbindungsaufbau gestartet. Währenddessen läuft der Countdown weiter. Kommt es bis zum Ablauf des Countdown nicht zu einer Verbindung, wird der nächste AP ausprobiert (wenn alle AP erfolglos waren, startet ein neuer Scan).
  • die modifizierte Version startet im AP Modus, ruft aber den Scan sofort auf und danach erst den 10 Sekunden Countdown.
    Mit Ende des Countdowns wird der Verbindungsaufbau gestartet und auch ein neuer 10 Sekunden Countdown. Der Rest ist analog zur aktuellen Methode (nächster AP, neuer Scan).

Bei @lumapu funktioniert die aktuelle Version ohne Probleme. Du bestätigst mir gerade, dass sie aber auch bei dir Schwierigkeiten verursacht. War bei mir auch so. Beide haben wir mehrere APs, daher dauert der Scan wohl länger und der weiterlaufende Countdown reicht nicht immer für Scan inklusive Verbindung, was zumindest bei mir häufiger zu Abbrüchen während des Verbindungsaufbaus führte. Daher meine Modifikation. Die ersten Vorschläge dazu machten aber bei @lumapu mit nur einem AP Probleme, daher ist das (bisher) nicht in die dev. Versionen eingegangen. Der neuste Vorschlag (die Variante, die du gerade hast) ist wohl durch die MQTT und Web Issues in den Hintergrund gedrängt worden. Hat ja auch keine Prio, Wifi Verbindung funktioniert prinzipiell. Hat mich nur bei meinen Tests und den dadurch häufigen Updates und Reboots genervt, dass es meistens erst im 2. oder 3. Anlauf ging.

@lumapu
Copy link
Owner

lumapu commented Mar 7, 2023

ich hatte die ganze Zeit in Hinterkopf, dass bzgl. WiFi noch was offen ist.

@lumapu
Copy link
Owner

lumapu commented Mar 8, 2023

@beegee3 ich schicke dir gerne einen ESP8266, melde dich einfach bei [email protected] oder per PM hier in Github (gibt es das?).

Ich weiß nicht, ob wir der Einfachheit halber uns mit dem Multi-AP Modus auf den ESP32 beschränken und es als Compile-Flag mit if defined(ESP32) kapseln.

Dann könnte man wahrscheinlich auch

WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN);
WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL);

verwernden, was alles noch einfacher macht. Ich möchte hier nicht die Funktion schlecht machen, aber sie wirkt auf die User unterschiedlich. Was ich merke: Wer viel will (Display, viele Abfragen, etc.) muss früher oder später sowieso zum ESP32 greifen - der ESP8266 bleibt die Low-Budget Option mit gewissen Abstrichen

@knickohr
Copy link

knickohr commented Mar 8, 2023

Ja, da hast Du ganz recht @lumapu . Geht ja schon los, die ersten plärren rum weil es kein Nokia mehr beim 8266 gibt. Andere wiederum sind beleidigt weil es das ePaper nicht am 8266 gibt. So geht’s halt nicht, wir können keine eierlegende Wollmichsau basteln die auch dann auf x Plattformen funktioniert. Erst gestern war einer da der wollte das auf einen japanischen 8266 Clone haben. Wußte bis dahin nicht mal das es sowas gibt 🤪

Kurzum, ist auch meine Meinung, wer jeden Schnickschack haben möchte, der soll doch bitte zum ESP32 greifen, ohne wenn und aber. Wer nur eine DTU möchte, der kann beim 8266 bleiben, dann aber nicht rummäkeln wenn da nicht alles machbar ist. Irgendwo sind halt doch Grenzen.

@beegee3
Copy link
Contributor Author

beegee3 commented Mar 8, 2023

naja, Display ist eine Sache. Beim Wifi wäre die Unterscheidung schwerer einzusehen. Und all die mit mehreren APs, wo dann zum "falschen" verbunden wird 😞

@lumapu hab mich ja bei deinem heutigen log gewundert, dass kein [WiFi] Connected kam, wohl aber [WiFi] Connection Lost. Vielleicht war es ein "kurz vor knapp" ähnlich wie bei den Logs oben.
Eventuell braucht dein ESP etwas mehr Zeit für den Verbindungsaufbau. Er hatte ja nur 10 Sekunden. Sprich timeout in tickWifiLoop so ändern, dass nur disconnected die kurze Laufzeit hat:
uint8_t timeout = (mStaConn == DISCONNECTED) ? 10 : 20; // if disconnected 10 seconds else 20 seconds
Oder fürs testen statt der 20 einfach 60 Sekunden, dann siehst du wie lange es wirklich dauert.

@beegee3
Copy link
Contributor Author

beegee3 commented Mar 8, 2023

Nachtrag: Danke für's Angebot, aber kein Problem, ESP8266 kann ich mir selber besorgen. Nur wofür? Die wenigen Tests, wo es auf den Prozessor ankommt, kannst du oder @knickohr (oder andere) machen 😆
Ist hier auch wahrscheinlich kein Prozessor Problem, sondern hängt eher an der Zeit von der Connection Anfrage bis zur Verbindung, also am AP selbst, oder dem RSSI.

@lumapu
Copy link
Owner

lumapu commented Mar 9, 2023

ok, klar ESP8266 ist mein Gebiet 😊. ich teste es mir großem timeout nochmal.

lumapu added a commit that referenced this pull request Mar 19, 2023
* improved wifi connection #652
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants