Repeatable OSError: Wifi Internal Error in sta_if.connect
Port, board and/or hardware
ESP32-C3 and S3
MicroPython version
MicroPython v1.25.0 on 2025-04-15; ESP32C3 module with ESP32C3
Reproduction
Power-cycle the board and run the following code (in my case, in Thonny):
import network, time
sta_if = network.WLAN(network.WLAN.IF_STA)
sta_if.active(True)
print('foo')
sta_if.connect("no-such-network", "password")
time.sleep(5)
print('bar')
sta_if.connect("no-such-network", "password")
time.sleep(5)
print('baz')
Expected behaviour
No response
Observed behaviour
foo
bar
Traceback (most recent call last):
File "<stdin>", line 10, in <module>
OSError: Wifi Internal Error
(where line 10 is the second connect)
I get similar results when the first connect() is a real network with the wrong password, the second connect() is the same wrong network/password as the first, or the second connect() is a real network with the right password.
In fact, the sleep()s don't seem to be required either.
Additional Information
Power-cycling the board before running the test may be required for reproducibility.
Bug also manifests in the latest preview ESP32_GENERIC_C3-20250709-v1.26.0-preview.364.gdf05caea6.bin
and ESP32_GENERIC_S3-SPIRAM_OCT-20250709-v1.26.0-preview.364.gdf05caea6.bin
Unfortunately I don't have other boards to test with right now.
Code of Conduct
Yes, I agree
WLAN.connect() behavior has changed
This problem is specific to esp32-20210418-v1.15.bin.
When preparing WiFi like,
station = network.WLAN(network.STA_IF)
station.active(True)
And then connecting with,
station.connect("mynet", "mypass")
I used to be able to attempt to reconnect by repeating the above statements, regardless if the station is already connected. In this new version, the third -- not second, but third -- time I say,
station.connect("mynet", "mypass")
If the station is already connected, I get this error,
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: Wifi Internal Error
This can be easily tested from REPL.
The workaround for this is to test for a connection, disconnect, and reconnect as in,
if station.isconnected():
station.disconnect()
station.connect("mynet", "mypass")
If this was intentional, it will likely break a lot of code -- well... at least a lot of my code. :)
But if it's intentional, why error on 3rd and not 2nd time?