MicroPython mpy_network

Sat, 25 Feb 2023 19:18:07 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 25 Feb 2023 19:18:07 +0100
branch
mpy_network
changeset 9799
a79430a8811d
parent 9798
4402d76c5fa9
child 9800
25f388536caf

MicroPython
- added support for 'paste' mode to circumvent the reset of CircuitPython when executing some commands through the device interface

src/eric7/APIs/Python3/eric7.api file | annotate | diff | comparison | revisions
src/eric7/APIs/Python3/eric7.bas file | annotate | diff | comparison | revisions
src/eric7/Documentation/Help/source.qch file | annotate | diff | comparison | revisions
src/eric7/Documentation/Help/source.qhp file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.MicroPython.Devices.DeviceBase.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.MicroPython.Devices.EspDevices.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.MicroPython.Devices.RP2040Devices.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonDeviceInterface.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonFileManagerWidget.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonSerialPort.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonWidget.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/eric7.Preferences.ConfigurationPages.MicroPythonPage.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/index-eric7.EricNetwork.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/index-eric7.MicroPython.Devices.html file | annotate | diff | comparison | revisions
src/eric7/Documentation/Source/index-eric7.MicroPython.html file | annotate | diff | comparison | revisions
src/eric7/MicroPython/Devices/CircuitPythonDevices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/Devices/DeviceBase.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/Devices/EspDevices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/Devices/MicrobitDevices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/Devices/RP2040Devices.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonDeviceInterface.py file | annotate | diff | comparison | revisions
src/eric7/MicroPython/MicroPythonWidget.py file | annotate | diff | comparison | revisions
--- a/src/eric7/APIs/Python3/eric7.api	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/APIs/Python3/eric7.api	Sat Feb 25 19:18:07 2023 +0100
@@ -1124,6 +1124,15 @@
 eric7.EricNetwork.EricGoogleMailHelpers.TOKEN_FILE?7
 eric7.EricNetwork.EricGoogleMailHelpers.installGoogleAPIPackages?4()
 eric7.EricNetwork.EricGoogleMailHelpers.isClientSecretFileAvailable?4()
+eric7.EricNetwork.EricIPv4InputWidget.EricIPv4InputWidget.address?4()
+eric7.EricNetwork.EricIPv4InputWidget.EricIPv4InputWidget.addressChanged?7
+eric7.EricNetwork.EricIPv4InputWidget.EricIPv4InputWidget.clear?4()
+eric7.EricNetwork.EricIPv4InputWidget.EricIPv4InputWidget.eventFilter?4(obj, evt)
+eric7.EricNetwork.EricIPv4InputWidget.EricIPv4InputWidget.hasAcceptableInput?4()
+eric7.EricNetwork.EricIPv4InputWidget.EricIPv4InputWidget.setAddress?4(address)
+eric7.EricNetwork.EricIPv4InputWidget.EricIPv4InputWidget.setText?4(address)
+eric7.EricNetwork.EricIPv4InputWidget.EricIPv4InputWidget.text?4()
+eric7.EricNetwork.EricIPv4InputWidget.EricIPv4InputWidget?1(parent=None)
 eric7.EricNetwork.EricJsonClient.EricJsonClient.handleCall?4(method, params)
 eric7.EricNetwork.EricJsonClient.EricJsonClient.poll?4(waitMethod="")
 eric7.EricNetwork.EricJsonClient.EricJsonClient.run?4()
@@ -2590,43 +2599,55 @@
 eric7.MicroPython.Devices.DeviceBase.BaseDevice._getSetTimeCode?5()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice._shortError?5(error)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.addDeviceMenuEntries?4(menu)
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.addDeviceWifiEntries?4(menu)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.canRunScript?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.canStartFileManager?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.canStartPlotter?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.canStartRepl?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.cd?4(dirname)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.checkDeviceData?4()
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.checkInternet?4()
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.connectWifi?4(ssid, password)
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.deactivateInterface?4(interface)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.deviceName?4()
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.disconnectWifi?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.downloadFirmware?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.fileSystemInfo?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.forceInterrupt?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.get?4(deviceFileName, hostFileName=None)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.getBoardInformation?4()
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.getConnectedClients?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.getData?4(deviceFileName)
-eric7.MicroPython.Devices.DeviceBase.BaseDevice.getDeviceData?4()
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.getDeviceData?4(key=None)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.getDeviceType?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.getDocumentationUrl?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.getDownloadMenuEntries?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.getFirmwareUrl?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.getModules?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.getTime?4()
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.getWifiData?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.getWorkspace?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.handleDataFlood?4()
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.hasBluetooth?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.hasCircuitPython?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.hasDocumentationUrl?4()
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.hasEthernet?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.hasFirmwareUrl?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.hasFlashMenuEntry?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.hasTimeCommands?4()
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.hasWifi?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.lls?4(dirname="", fullstat=False, showHidden=False)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.ls?4(dirname="")
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.mkdir?4(dirname)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.put?4(hostFileName, deviceFileName=None)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.putData?4(deviceFileName, content)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.pwd?4()
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.removeCredentials?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.rm?4(filename)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.rmdir?4(dirname)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.rmrf?4(name, recursive=False, force=False)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.runScript?4(script)
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.scanNetworks?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.selectDeviceDirectory?4(deviceDirectories)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.sendCommands?4(commandsList)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.setButtons?4()
@@ -2634,8 +2655,11 @@
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.setFileManager?4(on)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.setPlotter?4(on)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.setRepl?4(on)
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.startAccessPoint?4(ssid, security=None, password=None, ifconfig=None)
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.stopAccessPoint?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.supportsLocalFileAccess?4()
 eric7.MicroPython.Devices.DeviceBase.BaseDevice.syncTime?4(deviceType, hasCPy=False)
+eric7.MicroPython.Devices.DeviceBase.BaseDevice.writeCredentials?4(ssid, password)
 eric7.MicroPython.Devices.DeviceBase.BaseDevice?1(microPythonWidget, deviceType, parent=None)
 eric7.MicroPython.Devices.EspDevices.EspDevice._getSetTimeCode?5()
 eric7.MicroPython.Devices.EspDevices.EspDevice.addDeviceMenuEntries?4(menu)
@@ -2643,13 +2667,25 @@
 eric7.MicroPython.Devices.EspDevices.EspDevice.canStartFileManager?4()
 eric7.MicroPython.Devices.EspDevices.EspDevice.canStartPlotter?4()
 eric7.MicroPython.Devices.EspDevices.EspDevice.canStartRepl?4()
+eric7.MicroPython.Devices.EspDevices.EspDevice.checkInternet?4()
+eric7.MicroPython.Devices.EspDevices.EspDevice.connectWifi?4(ssid, password)
+eric7.MicroPython.Devices.EspDevices.EspDevice.deactivateInterface?4(interface)
 eric7.MicroPython.Devices.EspDevices.EspDevice.deviceName?4()
+eric7.MicroPython.Devices.EspDevices.EspDevice.disconnectWifi?4()
 eric7.MicroPython.Devices.EspDevices.EspDevice.forceInterrupt?4()
+eric7.MicroPython.Devices.EspDevices.EspDevice.getConnectedClients?4()
 eric7.MicroPython.Devices.EspDevices.EspDevice.getDocumentationUrl?4()
 eric7.MicroPython.Devices.EspDevices.EspDevice.getFirmwareUrl?4()
+eric7.MicroPython.Devices.EspDevices.EspDevice.getWifiData?4()
 eric7.MicroPython.Devices.EspDevices.EspDevice.hasFlashMenuEntry?4()
+eric7.MicroPython.Devices.EspDevices.EspDevice.hasWifi?4()
+eric7.MicroPython.Devices.EspDevices.EspDevice.removeCredentials?4()
 eric7.MicroPython.Devices.EspDevices.EspDevice.runScript?4(script)
+eric7.MicroPython.Devices.EspDevices.EspDevice.scanNetworks?4()
 eric7.MicroPython.Devices.EspDevices.EspDevice.setButtons?4()
+eric7.MicroPython.Devices.EspDevices.EspDevice.startAccessPoint?4(ssid, security=None, password=None, ifconfig=None)
+eric7.MicroPython.Devices.EspDevices.EspDevice.stopAccessPoint?4()
+eric7.MicroPython.Devices.EspDevices.EspDevice.writeCredentials?4(ssid, password)
 eric7.MicroPython.Devices.EspDevices.EspDevice?1(microPythonWidget, deviceType, parent=None)
 eric7.MicroPython.Devices.EspDevices.createDevice?4(microPythonWidget, deviceType, vid, pid, boardName, serialNumber)
 eric7.MicroPython.Devices.EspDialogs.EspBackupRestoreFirmwareDialog.EspBackupRestoreFirmwareDialog.Chips?7
@@ -2681,6 +2717,8 @@
 eric7.MicroPython.Devices.GenericMicroPythonDevices.GenericMicroPythonDevice?1(microPythonWidget, deviceType, vid, pid, parent=None)
 eric7.MicroPython.Devices.GenericMicroPythonDevices.createDevice?4(microPythonWidget, deviceType, vid, pid, boardName, serialNumber)
 eric7.MicroPython.Devices.IgnoredBoards?7
+eric7.MicroPython.Devices.MCUScripts.esp32WiFiConnect.connectWiFi?4()
+eric7.MicroPython.Devices.MCUScripts.picowWiFiConnect.connectWiFi?4()
 eric7.MicroPython.Devices.MicrobitDevices.MicrobitDevice._getSetTimeCode?5()
 eric7.MicroPython.Devices.MicrobitDevices.MicrobitDevice.addDeviceMenuEntries?4(menu)
 eric7.MicroPython.Devices.MicrobitDevices.MicrobitDevice.canRunScript?4()
@@ -2721,17 +2759,30 @@
 eric7.MicroPython.Devices.PyBoardDevices.createDevice?4(microPythonWidget, deviceType, vid, pid, boardName, serialNumber)
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device._getSetTimeCode?5()
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.addDeviceMenuEntries?4(menu)
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.addDeviceWifiEntries?4(menu)
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.canRunScript?4()
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.canStartFileManager?4()
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.canStartPlotter?4()
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.canStartRepl?4()
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.checkInternet?4()
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.connectWifi?4(ssid, password)
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.deactivateInterface?4(interface)
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.deviceName?4()
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.disconnectWifi?4()
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.forceInterrupt?4()
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.getConnectedClients?4()
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.getDocumentationUrl?4()
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.getDownloadMenuEntries?4()
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.getWifiData?4()
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.hasFlashMenuEntry?4()
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.hasWifi?4()
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.removeCredentials?4()
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.runScript?4(script)
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.scanNetworks?4()
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device.setButtons?4()
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.startAccessPoint?4(ssid, security=None, password=None, ifconfig=None)
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.stopAccessPoint?4()
+eric7.MicroPython.Devices.RP2040Devices.RP2040Device.writeCredentials?4(ssid, password)
 eric7.MicroPython.Devices.RP2040Devices.RP2040Device?1(microPythonWidget, deviceType, parent=None)
 eric7.MicroPython.Devices.RP2040Devices.createDevice?4(microPythonWidget, deviceType, vid, pid, boardName, serialNumber)
 eric7.MicroPython.Devices.SupportedBoards?7
@@ -2755,12 +2806,15 @@
 eric7.MicroPython.Devices.getSupportedDevices?4()
 eric7.MicroPython.IgnoredDevicesDialog.IgnoredDevicesDialog.getDevices?4()
 eric7.MicroPython.IgnoredDevicesDialog.IgnoredDevicesDialog?1(deviceList, parent=None)
+eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.PasteModePrompt?7
+eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.TracebackMarker?7
 eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.connectToDevice?4(port)
 eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.dataReceived?7
 eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.disconnectFromDevice?4()
-eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.execute?4(commands)
+eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.execute?4(commands, *, mode="raw", timeout=0)
 eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.executeAsync?4(commandsList)
 eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.executeAsyncFinished?7
+eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.executeAsyncPaste?4(commandsList)
 eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.handlePreferencesChanged?4()
 eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.isConnected?4()
 eric7.MicroPython.MicroPythonDeviceInterface.MicroPythonDeviceInterface.probeDevice?4()
@@ -2836,7 +2890,7 @@
 eric7.MicroPython.MicroPythonSerialPort.MicroPythonSerialPort.hasTimedOut?4()
 eric7.MicroPython.MicroPythonSerialPort.MicroPythonSerialPort.isConnected?4()
 eric7.MicroPython.MicroPythonSerialPort.MicroPythonSerialPort.openSerialLink?4(port)
-eric7.MicroPython.MicroPythonSerialPort.MicroPythonSerialPort.readUntil?4(expected=b"\n", size=None)
+eric7.MicroPython.MicroPythonSerialPort.MicroPythonSerialPort.readUntil?4(expected=b"\n", size=None, timeout=0)
 eric7.MicroPython.MicroPythonSerialPort.MicroPythonSerialPort.setTimeout?4(timeout)
 eric7.MicroPython.MicroPythonSerialPort.MicroPythonSerialPort?1(timeout=10000, parent=None)
 eric7.MicroPython.MicroPythonWidget.AnsiColorSchemes?7
@@ -2855,6 +2909,7 @@
 eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.eventFilter?4(obj, evt)
 eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.getCurrentBoard?4()
 eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.getCurrentPort?4()
+eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.getDevice?4()
 eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.getDeviceWorkspace?4()
 eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.handleDataFlood?4()
 eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.isConnected?4()
@@ -2868,6 +2923,7 @@
 eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.on_replButton_clicked?4(checked)
 eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.on_runButton_clicked?4()
 eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.setActionButtons?4(**kwargs)
+eric7.MicroPython.MicroPythonWidget.MicroPythonWidget.showError?4(method, error)
 eric7.MicroPython.MicroPythonWidget.MicroPythonWidget?1(parent=None)
 eric7.MicroPython.ShowModulesDialog.ShowModulesDialog.getSelection?4()
 eric7.MicroPython.ShowModulesDialog.ShowModulesDialog.on_modulesList_itemChanged?4(item)
@@ -2894,6 +2950,25 @@
 eric7.MicroPython.UnknownDevicesDialog.UnknownDevicesDialog.on_reportButton_clicked?4()
 eric7.MicroPython.UnknownDevicesDialog.UnknownDevicesDialog.on_restoreButton_clicked?4()
 eric7.MicroPython.UnknownDevicesDialog.UnknownDevicesDialog?1(parent=None)
+eric7.MicroPython.WifiDialogs.WifiApConfigDialog.WifiApConfigDialog.getApConfig?4()
+eric7.MicroPython.WifiDialogs.WifiApConfigDialog.WifiApConfigDialog.on_apShowPasswordButton_clicked?4(checked)
+eric7.MicroPython.WifiDialogs.WifiApConfigDialog.WifiApConfigDialog?1(withIP, parent=None)
+eric7.MicroPython.WifiDialogs.WifiApStationsDialog.WifiApStationsDialog?1(stations, parent=None)
+eric7.MicroPython.WifiDialogs.WifiConnectionDialog.WifiConnectionDialog.getConnectionParameters?4()
+eric7.MicroPython.WifiDialogs.WifiConnectionDialog.WifiConnectionDialog.on_showPasswordButton_clicked?4(checked)
+eric7.MicroPython.WifiDialogs.WifiConnectionDialog.WifiConnectionDialog.on_ssidEdit_textChanged?4(ssid)
+eric7.MicroPython.WifiDialogs.WifiConnectionDialog.WifiConnectionDialog?1(parent=None)
+eric7.MicroPython.WifiDialogs.WifiController.WifiController.createMenu?4(menu)
+eric7.MicroPython.WifiDialogs.WifiController.WifiController?1(microPython, parent=None)
+eric7.MicroPython.WifiDialogs.WifiCountryDialog.WifiCountryDialog.getCountry?4()
+eric7.MicroPython.WifiDialogs.WifiCountryDialog.WifiCountryDialog.on_countryEdit_textChanged?4(country)
+eric7.MicroPython.WifiDialogs.WifiCountryDialog.WifiCountryDialog?1(parent=None)
+eric7.MicroPython.WifiDialogs.WifiNetworksWindow.WifiNetworksWindow.closeEvent?4(evt)
+eric7.MicroPython.WifiDialogs.WifiNetworksWindow.WifiNetworksWindow.on_intervalSpinBox_valueChanged?4(interval)
+eric7.MicroPython.WifiDialogs.WifiNetworksWindow.WifiNetworksWindow.on_periodicCheckBox_toggled?4(checked)
+eric7.MicroPython.WifiDialogs.WifiNetworksWindow.WifiNetworksWindow.scanNetworks?4()
+eric7.MicroPython.WifiDialogs.WifiNetworksWindow.WifiNetworksWindow?1(device, parent=None)
+eric7.MicroPython.WifiDialogs.WifiStatusDialog.WifiStatusDialog?1(clientStatus, apStatus, overallStatus, parent=None)
 eric7.MultiProject.AddProjectDialog.AddProjectDialog.getData?4()
 eric7.MultiProject.AddProjectDialog.AddProjectDialog.on_filenamePicker_textChanged?4(txt)
 eric7.MultiProject.AddProjectDialog.AddProjectDialog.on_nameEdit_textChanged?4(txt)
@@ -7295,6 +7370,8 @@
 eric7.Preferences.ConfigurationPages.MasterPasswordEntryDialog.MasterPasswordEntryDialog.on_newPasswordAgainEdit_textChanged?4(txt)
 eric7.Preferences.ConfigurationPages.MasterPasswordEntryDialog.MasterPasswordEntryDialog.on_newPasswordEdit_textChanged?4(txt)
 eric7.Preferences.ConfigurationPages.MasterPasswordEntryDialog.MasterPasswordEntryDialog?1(oldPasswordHash, parent=None)
+eric7.Preferences.ConfigurationPages.MicroPythonPage.MicroPythonPage.on_apShowPasswordButton_clicked?4(checked)
+eric7.Preferences.ConfigurationPages.MicroPythonPage.MicroPythonPage.on_showPasswordButton_clicked?4(checked)
 eric7.Preferences.ConfigurationPages.MicroPythonPage.MicroPythonPage.save?4()
 eric7.Preferences.ConfigurationPages.MicroPythonPage.MicroPythonPage?1(parent=None)
 eric7.Preferences.ConfigurationPages.MicroPythonPage.create?4(dlg)
--- a/src/eric7/APIs/Python3/eric7.bas	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/APIs/Python3/eric7.bas	Sat Feb 25 19:18:07 2023 +0100
@@ -240,6 +240,7 @@
 EricGoogleMail QObject
 EricGraphicsView QGraphicsView
 EricHorizontalToolBox EricTabWidget
+EricIPv4InputWidget QWidget Ui_EricIPv4InputWidget
 EricIconBar QWidget
 EricJsonReader QTcpServer
 EricJsonServer QTcpServer
@@ -1123,6 +1124,13 @@
 WebInspector QWebEngineView
 WidgetArea QMdiArea
 WidgetView QWidget
+WifiApConfigDialog QDialog Ui_WifiApConfigDialog
+WifiApStationsDialog QDialog Ui_WifiApStationsDialog
+WifiConnectionDialog QDialog Ui_WifiConnectionDialog
+WifiController QObject
+WifiCountryDialog QDialog Ui_WifiCountryDialog
+WifiNetworksWindow QWidget Ui_WifiNetworksWindow
+WifiStatusDialog QDialog Ui_WifiStatusDialog
 WizardEricPluginWizard QObject
 XMLStreamReaderBase QXmlStreamReader
 XbelImporter BookmarksImporter
Binary file src/eric7/Documentation/Help/source.qch has changed
--- a/src/eric7/Documentation/Help/source.qhp	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Help/source.qhp	Sat Feb 25 19:18:07 2023 +0100
@@ -126,6 +126,7 @@
             <section title="eric7.EricNetwork.EricFtp" ref="eric7.EricNetwork.EricFtp.html" />
             <section title="eric7.EricNetwork.EricGoogleMail" ref="eric7.EricNetwork.EricGoogleMail.html" />
             <section title="eric7.EricNetwork.EricGoogleMailHelpers" ref="eric7.EricNetwork.EricGoogleMailHelpers.html" />
+            <section title="eric7.EricNetwork.EricIPv4InputWidget" ref="eric7.EricNetwork.EricIPv4InputWidget.html" />
             <section title="eric7.EricNetwork.EricJsonClient" ref="eric7.EricNetwork.EricJsonClient.html" />
             <section title="eric7.EricNetwork.EricJsonServer" ref="eric7.EricNetwork.EricJsonServer.html" />
             <section title="eric7.EricNetwork.EricJsonStreamReader" ref="eric7.EricNetwork.EricJsonStreamReader.html" />
@@ -280,6 +281,10 @@
                 <section title="eric7.MicroPython.Devices.EspDialogs.EspBackupRestoreFirmwareDialog" ref="eric7.MicroPython.Devices.EspDialogs.EspBackupRestoreFirmwareDialog.html" />
                 <section title="eric7.MicroPython.Devices.EspDialogs.EspFirmwareSelectionDialog" ref="eric7.MicroPython.Devices.EspDialogs.EspFirmwareSelectionDialog.html" />
               </section>
+              <section title="eric7.MicroPython.Devices.MCUScripts" ref="index-eric7.MicroPython.Devices.MCUScripts.html">
+                <section title="eric7.MicroPython.Devices.MCUScripts.esp32WiFiConnect" ref="eric7.MicroPython.Devices.MCUScripts.esp32WiFiConnect.html" />
+                <section title="eric7.MicroPython.Devices.MCUScripts.picowWiFiConnect" ref="eric7.MicroPython.Devices.MCUScripts.picowWiFiConnect.html" />
+              </section>
               <section title="eric7.MicroPython.Devices.CircuitPythonDevices" ref="eric7.MicroPython.Devices.CircuitPythonDevices.html" />
               <section title="eric7.MicroPython.Devices.DeviceBase" ref="eric7.MicroPython.Devices.DeviceBase.html" />
               <section title="eric7.MicroPython.Devices.EspDevices" ref="eric7.MicroPython.Devices.EspDevices.html" />
@@ -290,6 +295,15 @@
               <section title="eric7.MicroPython.Devices.TeensyDevices" ref="eric7.MicroPython.Devices.TeensyDevices.html" />
               <section title="eric7.MicroPython.Devices.__init__" ref="eric7.MicroPython.Devices.__init__.html" />
             </section>
+            <section title="eric7.MicroPython.WifiDialogs" ref="index-eric7.MicroPython.WifiDialogs.html">
+              <section title="eric7.MicroPython.WifiDialogs.WifiApConfigDialog" ref="eric7.MicroPython.WifiDialogs.WifiApConfigDialog.html" />
+              <section title="eric7.MicroPython.WifiDialogs.WifiApStationsDialog" ref="eric7.MicroPython.WifiDialogs.WifiApStationsDialog.html" />
+              <section title="eric7.MicroPython.WifiDialogs.WifiConnectionDialog" ref="eric7.MicroPython.WifiDialogs.WifiConnectionDialog.html" />
+              <section title="eric7.MicroPython.WifiDialogs.WifiController" ref="eric7.MicroPython.WifiDialogs.WifiController.html" />
+              <section title="eric7.MicroPython.WifiDialogs.WifiCountryDialog" ref="eric7.MicroPython.WifiDialogs.WifiCountryDialog.html" />
+              <section title="eric7.MicroPython.WifiDialogs.WifiNetworksWindow" ref="eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html" />
+              <section title="eric7.MicroPython.WifiDialogs.WifiStatusDialog" ref="eric7.MicroPython.WifiDialogs.WifiStatusDialog.html" />
+            </section>
             <section title="eric7.MicroPython.AddEditDevicesDialog" ref="eric7.MicroPython.AddEditDevicesDialog.html" />
             <section title="eric7.MicroPython.BoardDataDialog" ref="eric7.MicroPython.BoardDataDialog.html" />
             <section title="eric7.MicroPython.ConnectionSelectionDialog" ref="eric7.MicroPython.ConnectionSelectionDialog.html" />
@@ -2048,18 +2062,24 @@
       <keyword name="BaseDevice._getSetTimeCode" id="BaseDevice._getSetTimeCode" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice._getSetTimeCode" />
       <keyword name="BaseDevice._shortError" id="BaseDevice._shortError" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice._shortError" />
       <keyword name="BaseDevice.addDeviceMenuEntries" id="BaseDevice.addDeviceMenuEntries" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.addDeviceMenuEntries" />
+      <keyword name="BaseDevice.addDeviceWifiEntries" id="BaseDevice.addDeviceWifiEntries" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.addDeviceWifiEntries" />
       <keyword name="BaseDevice.canRunScript" id="BaseDevice.canRunScript" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.canRunScript" />
       <keyword name="BaseDevice.canStartFileManager" id="BaseDevice.canStartFileManager" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.canStartFileManager" />
       <keyword name="BaseDevice.canStartPlotter" id="BaseDevice.canStartPlotter" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.canStartPlotter" />
       <keyword name="BaseDevice.canStartRepl" id="BaseDevice.canStartRepl" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.canStartRepl" />
       <keyword name="BaseDevice.cd" id="BaseDevice.cd" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.cd" />
       <keyword name="BaseDevice.checkDeviceData" id="BaseDevice.checkDeviceData" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.checkDeviceData" />
+      <keyword name="BaseDevice.checkInternet" id="BaseDevice.checkInternet" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.checkInternet" />
+      <keyword name="BaseDevice.connectWifi" id="BaseDevice.connectWifi" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.connectWifi" />
+      <keyword name="BaseDevice.deactivateInterface" id="BaseDevice.deactivateInterface" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.deactivateInterface" />
       <keyword name="BaseDevice.deviceName" id="BaseDevice.deviceName" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.deviceName" />
+      <keyword name="BaseDevice.disconnectWifi" id="BaseDevice.disconnectWifi" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.disconnectWifi" />
       <keyword name="BaseDevice.downloadFirmware" id="BaseDevice.downloadFirmware" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.downloadFirmware" />
       <keyword name="BaseDevice.fileSystemInfo" id="BaseDevice.fileSystemInfo" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.fileSystemInfo" />
       <keyword name="BaseDevice.forceInterrupt" id="BaseDevice.forceInterrupt" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.forceInterrupt" />
       <keyword name="BaseDevice.get" id="BaseDevice.get" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.get" />
       <keyword name="BaseDevice.getBoardInformation" id="BaseDevice.getBoardInformation" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.getBoardInformation" />
+      <keyword name="BaseDevice.getConnectedClients" id="BaseDevice.getConnectedClients" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.getConnectedClients" />
       <keyword name="BaseDevice.getData" id="BaseDevice.getData" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.getData" />
       <keyword name="BaseDevice.getDeviceData" id="BaseDevice.getDeviceData" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.getDeviceData" />
       <keyword name="BaseDevice.getDeviceType" id="BaseDevice.getDeviceType" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.getDeviceType" />
@@ -2068,23 +2088,29 @@
       <keyword name="BaseDevice.getFirmwareUrl" id="BaseDevice.getFirmwareUrl" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.getFirmwareUrl" />
       <keyword name="BaseDevice.getModules" id="BaseDevice.getModules" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.getModules" />
       <keyword name="BaseDevice.getTime" id="BaseDevice.getTime" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.getTime" />
+      <keyword name="BaseDevice.getWifiData" id="BaseDevice.getWifiData" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.getWifiData" />
       <keyword name="BaseDevice.getWorkspace" id="BaseDevice.getWorkspace" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.getWorkspace" />
       <keyword name="BaseDevice.handleDataFlood" id="BaseDevice.handleDataFlood" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.handleDataFlood" />
+      <keyword name="BaseDevice.hasBluetooth" id="BaseDevice.hasBluetooth" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.hasBluetooth" />
       <keyword name="BaseDevice.hasCircuitPython" id="BaseDevice.hasCircuitPython" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.hasCircuitPython" />
       <keyword name="BaseDevice.hasDocumentationUrl" id="BaseDevice.hasDocumentationUrl" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.hasDocumentationUrl" />
+      <keyword name="BaseDevice.hasEthernet" id="BaseDevice.hasEthernet" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.hasEthernet" />
       <keyword name="BaseDevice.hasFirmwareUrl" id="BaseDevice.hasFirmwareUrl" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.hasFirmwareUrl" />
       <keyword name="BaseDevice.hasFlashMenuEntry" id="BaseDevice.hasFlashMenuEntry" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.hasFlashMenuEntry" />
       <keyword name="BaseDevice.hasTimeCommands" id="BaseDevice.hasTimeCommands" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.hasTimeCommands" />
+      <keyword name="BaseDevice.hasWifi" id="BaseDevice.hasWifi" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.hasWifi" />
       <keyword name="BaseDevice.lls" id="BaseDevice.lls" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.lls" />
       <keyword name="BaseDevice.ls" id="BaseDevice.ls" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.ls" />
       <keyword name="BaseDevice.mkdir" id="BaseDevice.mkdir" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.mkdir" />
       <keyword name="BaseDevice.put" id="BaseDevice.put" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.put" />
       <keyword name="BaseDevice.putData" id="BaseDevice.putData" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.putData" />
       <keyword name="BaseDevice.pwd" id="BaseDevice.pwd" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.pwd" />
+      <keyword name="BaseDevice.removeCredentials" id="BaseDevice.removeCredentials" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.removeCredentials" />
       <keyword name="BaseDevice.rm" id="BaseDevice.rm" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.rm" />
       <keyword name="BaseDevice.rmdir" id="BaseDevice.rmdir" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.rmdir" />
       <keyword name="BaseDevice.rmrf" id="BaseDevice.rmrf" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.rmrf" />
       <keyword name="BaseDevice.runScript" id="BaseDevice.runScript" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.runScript" />
+      <keyword name="BaseDevice.scanNetworks" id="BaseDevice.scanNetworks" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.scanNetworks" />
       <keyword name="BaseDevice.selectDeviceDirectory" id="BaseDevice.selectDeviceDirectory" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.selectDeviceDirectory" />
       <keyword name="BaseDevice.sendCommands" id="BaseDevice.sendCommands" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.sendCommands" />
       <keyword name="BaseDevice.setButtons" id="BaseDevice.setButtons" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.setButtons" />
@@ -2092,8 +2118,11 @@
       <keyword name="BaseDevice.setFileManager" id="BaseDevice.setFileManager" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.setFileManager" />
       <keyword name="BaseDevice.setPlotter" id="BaseDevice.setPlotter" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.setPlotter" />
       <keyword name="BaseDevice.setRepl" id="BaseDevice.setRepl" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.setRepl" />
+      <keyword name="BaseDevice.startAccessPoint" id="BaseDevice.startAccessPoint" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.startAccessPoint" />
+      <keyword name="BaseDevice.stopAccessPoint" id="BaseDevice.stopAccessPoint" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.stopAccessPoint" />
       <keyword name="BaseDevice.supportsLocalFileAccess" id="BaseDevice.supportsLocalFileAccess" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.supportsLocalFileAccess" />
       <keyword name="BaseDevice.syncTime" id="BaseDevice.syncTime" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.syncTime" />
+      <keyword name="BaseDevice.writeCredentials" id="BaseDevice.writeCredentials" ref="eric7.MicroPython.Devices.DeviceBase.html#BaseDevice.writeCredentials" />
       <keyword name="BaseDocstringGenerator" id="BaseDocstringGenerator" ref="eric7.QScintilla.DocstringGenerator.BaseDocstringGenerator.html#BaseDocstringGenerator" />
       <keyword name="BaseDocstringGenerator (Constructor)" id="BaseDocstringGenerator (Constructor)" ref="eric7.QScintilla.DocstringGenerator.BaseDocstringGenerator.html#BaseDocstringGenerator.__init__" />
       <keyword name="BaseDocstringGenerator (Module)" id="BaseDocstringGenerator (Module)" ref="eric7.QScintilla.DocstringGenerator.BaseDocstringGenerator.html" />
@@ -5211,6 +5240,17 @@
       <keyword name="EricHorizontalToolBox.removeItem" id="EricHorizontalToolBox.removeItem" ref="eric7.EricWidgets.EricToolBox.html#EricHorizontalToolBox.removeItem" />
       <keyword name="EricHorizontalToolBox.setItemEnabled" id="EricHorizontalToolBox.setItemEnabled" ref="eric7.EricWidgets.EricToolBox.html#EricHorizontalToolBox.setItemEnabled" />
       <keyword name="EricHorizontalToolBox.setItemToolTip" id="EricHorizontalToolBox.setItemToolTip" ref="eric7.EricWidgets.EricToolBox.html#EricHorizontalToolBox.setItemToolTip" />
+      <keyword name="EricIPv4InputWidget" id="EricIPv4InputWidget" ref="eric7.EricNetwork.EricIPv4InputWidget.html#EricIPv4InputWidget" />
+      <keyword name="EricIPv4InputWidget (Constructor)" id="EricIPv4InputWidget (Constructor)" ref="eric7.EricNetwork.EricIPv4InputWidget.html#EricIPv4InputWidget.__init__" />
+      <keyword name="EricIPv4InputWidget (Module)" id="EricIPv4InputWidget (Module)" ref="eric7.EricNetwork.EricIPv4InputWidget.html" />
+      <keyword name="EricIPv4InputWidget.__clear" id="EricIPv4InputWidget.__clear" ref="eric7.EricNetwork.EricIPv4InputWidget.html#EricIPv4InputWidget.__clear" />
+      <keyword name="EricIPv4InputWidget.address" id="EricIPv4InputWidget.address" ref="eric7.EricNetwork.EricIPv4InputWidget.html#EricIPv4InputWidget.address" />
+      <keyword name="EricIPv4InputWidget.clear" id="EricIPv4InputWidget.clear" ref="eric7.EricNetwork.EricIPv4InputWidget.html#EricIPv4InputWidget.clear" />
+      <keyword name="EricIPv4InputWidget.eventFilter" id="EricIPv4InputWidget.eventFilter" ref="eric7.EricNetwork.EricIPv4InputWidget.html#EricIPv4InputWidget.eventFilter" />
+      <keyword name="EricIPv4InputWidget.hasAcceptableInput" id="EricIPv4InputWidget.hasAcceptableInput" ref="eric7.EricNetwork.EricIPv4InputWidget.html#EricIPv4InputWidget.hasAcceptableInput" />
+      <keyword name="EricIPv4InputWidget.setAddress" id="EricIPv4InputWidget.setAddress" ref="eric7.EricNetwork.EricIPv4InputWidget.html#EricIPv4InputWidget.setAddress" />
+      <keyword name="EricIPv4InputWidget.setText" id="EricIPv4InputWidget.setText" ref="eric7.EricNetwork.EricIPv4InputWidget.html#EricIPv4InputWidget.setText" />
+      <keyword name="EricIPv4InputWidget.text" id="EricIPv4InputWidget.text" ref="eric7.EricNetwork.EricIPv4InputWidget.html#EricIPv4InputWidget.text" />
       <keyword name="EricIconBar" id="EricIconBar" ref="eric7.EricWidgets.EricIconBar.html#EricIconBar" />
       <keyword name="EricIconBar (Constructor)" id="EricIconBar (Constructor)" ref="eric7.EricWidgets.EricIconBar.html#EricIconBar.__init__" />
       <keyword name="EricIconBar (Module)" id="EricIconBar (Module)" ref="eric7.EricWidgets.EricIconBar.html" />
@@ -6130,13 +6170,25 @@
       <keyword name="EspDevice.canStartFileManager" id="EspDevice.canStartFileManager" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.canStartFileManager" />
       <keyword name="EspDevice.canStartPlotter" id="EspDevice.canStartPlotter" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.canStartPlotter" />
       <keyword name="EspDevice.canStartRepl" id="EspDevice.canStartRepl" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.canStartRepl" />
+      <keyword name="EspDevice.checkInternet" id="EspDevice.checkInternet" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.checkInternet" />
+      <keyword name="EspDevice.connectWifi" id="EspDevice.connectWifi" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.connectWifi" />
+      <keyword name="EspDevice.deactivateInterface" id="EspDevice.deactivateInterface" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.deactivateInterface" />
       <keyword name="EspDevice.deviceName" id="EspDevice.deviceName" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.deviceName" />
+      <keyword name="EspDevice.disconnectWifi" id="EspDevice.disconnectWifi" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.disconnectWifi" />
       <keyword name="EspDevice.forceInterrupt" id="EspDevice.forceInterrupt" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.forceInterrupt" />
+      <keyword name="EspDevice.getConnectedClients" id="EspDevice.getConnectedClients" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.getConnectedClients" />
       <keyword name="EspDevice.getDocumentationUrl" id="EspDevice.getDocumentationUrl" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.getDocumentationUrl" />
       <keyword name="EspDevice.getFirmwareUrl" id="EspDevice.getFirmwareUrl" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.getFirmwareUrl" />
+      <keyword name="EspDevice.getWifiData" id="EspDevice.getWifiData" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.getWifiData" />
       <keyword name="EspDevice.hasFlashMenuEntry" id="EspDevice.hasFlashMenuEntry" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.hasFlashMenuEntry" />
+      <keyword name="EspDevice.hasWifi" id="EspDevice.hasWifi" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.hasWifi" />
+      <keyword name="EspDevice.removeCredentials" id="EspDevice.removeCredentials" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.removeCredentials" />
       <keyword name="EspDevice.runScript" id="EspDevice.runScript" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.runScript" />
+      <keyword name="EspDevice.scanNetworks" id="EspDevice.scanNetworks" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.scanNetworks" />
       <keyword name="EspDevice.setButtons" id="EspDevice.setButtons" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.setButtons" />
+      <keyword name="EspDevice.startAccessPoint" id="EspDevice.startAccessPoint" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.startAccessPoint" />
+      <keyword name="EspDevice.stopAccessPoint" id="EspDevice.stopAccessPoint" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.stopAccessPoint" />
+      <keyword name="EspDevice.writeCredentials" id="EspDevice.writeCredentials" ref="eric7.MicroPython.Devices.EspDevices.html#EspDevice.writeCredentials" />
       <keyword name="EspDevices (Module)" id="EspDevices (Module)" ref="eric7.MicroPython.Devices.EspDevices.html" />
       <keyword name="EspDialogs (Package)" id="EspDialogs (Package)" ref="index-eric7.MicroPython.Devices.EspDialogs.html" />
       <keyword name="EspFirmwareSelectionDialog" id="EspFirmwareSelectionDialog" ref="eric7.MicroPython.Devices.EspDialogs.EspFirmwareSelectionDialog.html#EspFirmwareSelectionDialog" />
@@ -10428,6 +10480,7 @@
       <keyword name="M520NameFinder.visit_Lambda" id="M520NameFinder.visit_Lambda" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.Miscellaneous.MiscellaneousChecker.html#M520NameFinder.visit_Lambda" />
       <keyword name="M520NameFinder.visit_ListComp" id="M520NameFinder.visit_ListComp" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.Miscellaneous.MiscellaneousChecker.html#M520NameFinder.visit_ListComp" />
       <keyword name="M520NameFinder.visit_comprehension" id="M520NameFinder.visit_comprehension" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.Miscellaneous.MiscellaneousChecker.html#M520NameFinder.visit_comprehension" />
+      <keyword name="MCUScripts (Package)" id="MCUScripts (Package)" ref="index-eric7.MicroPython.Devices.MCUScripts.html" />
       <keyword name="MakePropertiesDialog" id="MakePropertiesDialog" ref="eric7.Project.MakePropertiesDialog.html#MakePropertiesDialog" />
       <keyword name="MakePropertiesDialog (Constructor)" id="MakePropertiesDialog (Constructor)" ref="eric7.Project.MakePropertiesDialog.html#MakePropertiesDialog.__init__" />
       <keyword name="MakePropertiesDialog (Module)" id="MakePropertiesDialog (Module)" ref="eric7.Project.MakePropertiesDialog.html" />
@@ -10562,6 +10615,10 @@
       <keyword name="MicroPythonDeviceInterface" id="MicroPythonDeviceInterface" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface" />
       <keyword name="MicroPythonDeviceInterface (Constructor)" id="MicroPythonDeviceInterface (Constructor)" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.__init__" />
       <keyword name="MicroPythonDeviceInterface (Module)" id="MicroPythonDeviceInterface (Module)" ref="eric7.MicroPython.MicroPythonDeviceInterface.html" />
+      <keyword name="MicroPythonDeviceInterface.__execute_paste" id="MicroPythonDeviceInterface.__execute_paste" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.__execute_paste" />
+      <keyword name="MicroPythonDeviceInterface.__execute_raw" id="MicroPythonDeviceInterface.__execute_raw" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.__execute_raw" />
+      <keyword name="MicroPythonDeviceInterface.__pasteOff" id="MicroPythonDeviceInterface.__pasteOff" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.__pasteOff" />
+      <keyword name="MicroPythonDeviceInterface.__pasteOn" id="MicroPythonDeviceInterface.__pasteOn" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.__pasteOn" />
       <keyword name="MicroPythonDeviceInterface.__rawOff" id="MicroPythonDeviceInterface.__rawOff" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.__rawOff" />
       <keyword name="MicroPythonDeviceInterface.__rawOn" id="MicroPythonDeviceInterface.__rawOn" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.__rawOn" />
       <keyword name="MicroPythonDeviceInterface.__readSerial" id="MicroPythonDeviceInterface.__readSerial" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.__readSerial" />
@@ -10569,6 +10626,7 @@
       <keyword name="MicroPythonDeviceInterface.disconnectFromDevice" id="MicroPythonDeviceInterface.disconnectFromDevice" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.disconnectFromDevice" />
       <keyword name="MicroPythonDeviceInterface.execute" id="MicroPythonDeviceInterface.execute" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.execute" />
       <keyword name="MicroPythonDeviceInterface.executeAsync" id="MicroPythonDeviceInterface.executeAsync" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.executeAsync" />
+      <keyword name="MicroPythonDeviceInterface.executeAsyncPaste" id="MicroPythonDeviceInterface.executeAsyncPaste" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.executeAsyncPaste" />
       <keyword name="MicroPythonDeviceInterface.handlePreferencesChanged" id="MicroPythonDeviceInterface.handlePreferencesChanged" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.handlePreferencesChanged" />
       <keyword name="MicroPythonDeviceInterface.isConnected" id="MicroPythonDeviceInterface.isConnected" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.isConnected" />
       <keyword name="MicroPythonDeviceInterface.probeDevice" id="MicroPythonDeviceInterface.probeDevice" ref="eric7.MicroPython.MicroPythonDeviceInterface.html#MicroPythonDeviceInterface.probeDevice" />
@@ -10654,6 +10712,8 @@
       <keyword name="MicroPythonPage" id="MicroPythonPage" ref="eric7.Preferences.ConfigurationPages.MicroPythonPage.html#MicroPythonPage" />
       <keyword name="MicroPythonPage (Constructor)" id="MicroPythonPage (Constructor)" ref="eric7.Preferences.ConfigurationPages.MicroPythonPage.html#MicroPythonPage.__init__" />
       <keyword name="MicroPythonPage (Module)" id="MicroPythonPage (Module)" ref="eric7.Preferences.ConfigurationPages.MicroPythonPage.html" />
+      <keyword name="MicroPythonPage.on_apShowPasswordButton_clicked" id="MicroPythonPage.on_apShowPasswordButton_clicked" ref="eric7.Preferences.ConfigurationPages.MicroPythonPage.html#MicroPythonPage.on_apShowPasswordButton_clicked" />
+      <keyword name="MicroPythonPage.on_showPasswordButton_clicked" id="MicroPythonPage.on_showPasswordButton_clicked" ref="eric7.Preferences.ConfigurationPages.MicroPythonPage.html#MicroPythonPage.on_showPasswordButton_clicked" />
       <keyword name="MicroPythonPage.save" id="MicroPythonPage.save" ref="eric7.Preferences.ConfigurationPages.MicroPythonPage.html#MicroPythonPage.save" />
       <keyword name="MicroPythonProgressInfoDialog" id="MicroPythonProgressInfoDialog" ref="eric7.MicroPython.MicroPythonProgressInfoDialog.html#MicroPythonProgressInfoDialog" />
       <keyword name="MicroPythonProgressInfoDialog (Constructor)" id="MicroPythonProgressInfoDialog (Constructor)" ref="eric7.MicroPython.MicroPythonProgressInfoDialog.html#MicroPythonProgressInfoDialog.__init__" />
@@ -10701,7 +10761,6 @@
       <keyword name="MicroPythonWidget.__showDeviceTime" id="MicroPythonWidget.__showDeviceTime" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showDeviceTime" />
       <keyword name="MicroPythonWidget.__showDeviceVersion" id="MicroPythonWidget.__showDeviceVersion" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showDeviceVersion" />
       <keyword name="MicroPythonWidget.__showDocumentation" id="MicroPythonWidget.__showDocumentation" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showDocumentation" />
-      <keyword name="MicroPythonWidget.__showError" id="MicroPythonWidget.__showError" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showError" />
       <keyword name="MicroPythonWidget.__showImplementation" id="MicroPythonWidget.__showImplementation" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showImplementation" />
       <keyword name="MicroPythonWidget.__showLocalAndDeviceTime" id="MicroPythonWidget.__showLocalAndDeviceTime" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showLocalAndDeviceTime" />
       <keyword name="MicroPythonWidget.__showLocalTime" id="MicroPythonWidget.__showLocalTime" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.__showLocalTime" />
@@ -10712,6 +10771,7 @@
       <keyword name="MicroPythonWidget.eventFilter" id="MicroPythonWidget.eventFilter" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.eventFilter" />
       <keyword name="MicroPythonWidget.getCurrentBoard" id="MicroPythonWidget.getCurrentBoard" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.getCurrentBoard" />
       <keyword name="MicroPythonWidget.getCurrentPort" id="MicroPythonWidget.getCurrentPort" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.getCurrentPort" />
+      <keyword name="MicroPythonWidget.getDevice" id="MicroPythonWidget.getDevice" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.getDevice" />
       <keyword name="MicroPythonWidget.getDeviceWorkspace" id="MicroPythonWidget.getDeviceWorkspace" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.getDeviceWorkspace" />
       <keyword name="MicroPythonWidget.handleDataFlood" id="MicroPythonWidget.handleDataFlood" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.handleDataFlood" />
       <keyword name="MicroPythonWidget.isConnected" id="MicroPythonWidget.isConnected" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.isConnected" />
@@ -10725,6 +10785,7 @@
       <keyword name="MicroPythonWidget.on_replButton_clicked" id="MicroPythonWidget.on_replButton_clicked" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.on_replButton_clicked" />
       <keyword name="MicroPythonWidget.on_runButton_clicked" id="MicroPythonWidget.on_runButton_clicked" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.on_runButton_clicked" />
       <keyword name="MicroPythonWidget.setActionButtons" id="MicroPythonWidget.setActionButtons" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.setActionButtons" />
+      <keyword name="MicroPythonWidget.showError" id="MicroPythonWidget.showError" ref="eric7.MicroPython.MicroPythonWidget.html#MicroPythonWidget.showError" />
       <keyword name="MicrobitDevice" id="MicrobitDevice" ref="eric7.MicroPython.Devices.MicrobitDevices.html#MicrobitDevice" />
       <keyword name="MicrobitDevice (Constructor)" id="MicrobitDevice (Constructor)" ref="eric7.MicroPython.Devices.MicrobitDevices.html#MicrobitDevice.__init__" />
       <keyword name="MicrobitDevice.__createMicrobitMenu" id="MicrobitDevice.__createMicrobitMenu" ref="eric7.MicroPython.Devices.MicrobitDevices.html#MicrobitDevice.__createMicrobitMenu" />
@@ -13650,20 +13711,34 @@
       <keyword name="RP2040Device.__createRP2040Menu" id="RP2040Device.__createRP2040Menu" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.__createRP2040Menu" />
       <keyword name="RP2040Device.__firmwareVersionResponse" id="RP2040Device.__firmwareVersionResponse" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.__firmwareVersionResponse" />
       <keyword name="RP2040Device.__flashPython" id="RP2040Device.__flashPython" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.__flashPython" />
+      <keyword name="RP2040Device.__setCountry" id="RP2040Device.__setCountry" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.__setCountry" />
       <keyword name="RP2040Device.__showFirmwareVersions" id="RP2040Device.__showFirmwareVersions" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.__showFirmwareVersions" />
       <keyword name="RP2040Device._getSetTimeCode" id="RP2040Device._getSetTimeCode" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device._getSetTimeCode" />
       <keyword name="RP2040Device.addDeviceMenuEntries" id="RP2040Device.addDeviceMenuEntries" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.addDeviceMenuEntries" />
+      <keyword name="RP2040Device.addDeviceWifiEntries" id="RP2040Device.addDeviceWifiEntries" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.addDeviceWifiEntries" />
       <keyword name="RP2040Device.canRunScript" id="RP2040Device.canRunScript" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.canRunScript" />
       <keyword name="RP2040Device.canStartFileManager" id="RP2040Device.canStartFileManager" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.canStartFileManager" />
       <keyword name="RP2040Device.canStartPlotter" id="RP2040Device.canStartPlotter" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.canStartPlotter" />
       <keyword name="RP2040Device.canStartRepl" id="RP2040Device.canStartRepl" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.canStartRepl" />
+      <keyword name="RP2040Device.checkInternet" id="RP2040Device.checkInternet" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.checkInternet" />
+      <keyword name="RP2040Device.connectWifi" id="RP2040Device.connectWifi" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.connectWifi" />
+      <keyword name="RP2040Device.deactivateInterface" id="RP2040Device.deactivateInterface" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.deactivateInterface" />
       <keyword name="RP2040Device.deviceName" id="RP2040Device.deviceName" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.deviceName" />
+      <keyword name="RP2040Device.disconnectWifi" id="RP2040Device.disconnectWifi" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.disconnectWifi" />
       <keyword name="RP2040Device.forceInterrupt" id="RP2040Device.forceInterrupt" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.forceInterrupt" />
+      <keyword name="RP2040Device.getConnectedClients" id="RP2040Device.getConnectedClients" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.getConnectedClients" />
       <keyword name="RP2040Device.getDocumentationUrl" id="RP2040Device.getDocumentationUrl" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.getDocumentationUrl" />
       <keyword name="RP2040Device.getDownloadMenuEntries" id="RP2040Device.getDownloadMenuEntries" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.getDownloadMenuEntries" />
+      <keyword name="RP2040Device.getWifiData" id="RP2040Device.getWifiData" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.getWifiData" />
       <keyword name="RP2040Device.hasFlashMenuEntry" id="RP2040Device.hasFlashMenuEntry" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.hasFlashMenuEntry" />
+      <keyword name="RP2040Device.hasWifi" id="RP2040Device.hasWifi" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.hasWifi" />
+      <keyword name="RP2040Device.removeCredentials" id="RP2040Device.removeCredentials" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.removeCredentials" />
       <keyword name="RP2040Device.runScript" id="RP2040Device.runScript" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.runScript" />
+      <keyword name="RP2040Device.scanNetworks" id="RP2040Device.scanNetworks" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.scanNetworks" />
       <keyword name="RP2040Device.setButtons" id="RP2040Device.setButtons" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.setButtons" />
+      <keyword name="RP2040Device.startAccessPoint" id="RP2040Device.startAccessPoint" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.startAccessPoint" />
+      <keyword name="RP2040Device.stopAccessPoint" id="RP2040Device.stopAccessPoint" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.stopAccessPoint" />
+      <keyword name="RP2040Device.writeCredentials" id="RP2040Device.writeCredentials" ref="eric7.MicroPython.Devices.RP2040Devices.html#RP2040Device.writeCredentials" />
       <keyword name="RP2040Devices (Module)" id="RP2040Devices (Module)" ref="eric7.MicroPython.Devices.RP2040Devices.html" />
       <keyword name="RbModule" id="RbModule" ref="eric7.Utilities.ModuleParser.html#RbModule" />
       <keyword name="RbModule (Constructor)" id="RbModule (Constructor)" ref="eric7.Utilities.ModuleParser.html#RbModule.__init__" />
@@ -18564,6 +18639,56 @@
       <keyword name="WidgetView.buildWidget" id="WidgetView.buildWidget" ref="eric7.Tools.TRPreviewer.html#WidgetView.buildWidget" />
       <keyword name="WidgetView.isValid" id="WidgetView.isValid" ref="eric7.Tools.TRPreviewer.html#WidgetView.isValid" />
       <keyword name="WidgetView.uiFileName" id="WidgetView.uiFileName" ref="eric7.Tools.TRPreviewer.html#WidgetView.uiFileName" />
+      <keyword name="WifiApConfigDialog" id="WifiApConfigDialog" ref="eric7.MicroPython.WifiDialogs.WifiApConfigDialog.html#WifiApConfigDialog" />
+      <keyword name="WifiApConfigDialog (Constructor)" id="WifiApConfigDialog (Constructor)" ref="eric7.MicroPython.WifiDialogs.WifiApConfigDialog.html#WifiApConfigDialog.__init__" />
+      <keyword name="WifiApConfigDialog (Module)" id="WifiApConfigDialog (Module)" ref="eric7.MicroPython.WifiDialogs.WifiApConfigDialog.html" />
+      <keyword name="WifiApConfigDialog.__updateOk" id="WifiApConfigDialog.__updateOk" ref="eric7.MicroPython.WifiDialogs.WifiApConfigDialog.html#WifiApConfigDialog.__updateOk" />
+      <keyword name="WifiApConfigDialog.getApConfig" id="WifiApConfigDialog.getApConfig" ref="eric7.MicroPython.WifiDialogs.WifiApConfigDialog.html#WifiApConfigDialog.getApConfig" />
+      <keyword name="WifiApConfigDialog.on_apShowPasswordButton_clicked" id="WifiApConfigDialog.on_apShowPasswordButton_clicked" ref="eric7.MicroPython.WifiDialogs.WifiApConfigDialog.html#WifiApConfigDialog.on_apShowPasswordButton_clicked" />
+      <keyword name="WifiApStationsDialog" id="WifiApStationsDialog" ref="eric7.MicroPython.WifiDialogs.WifiApStationsDialog.html#WifiApStationsDialog" />
+      <keyword name="WifiApStationsDialog (Constructor)" id="WifiApStationsDialog (Constructor)" ref="eric7.MicroPython.WifiDialogs.WifiApStationsDialog.html#WifiApStationsDialog.__init__" />
+      <keyword name="WifiApStationsDialog (Module)" id="WifiApStationsDialog (Module)" ref="eric7.MicroPython.WifiDialogs.WifiApStationsDialog.html" />
+      <keyword name="WifiConnectionDialog" id="WifiConnectionDialog" ref="eric7.MicroPython.WifiDialogs.WifiConnectionDialog.html#WifiConnectionDialog" />
+      <keyword name="WifiConnectionDialog (Constructor)" id="WifiConnectionDialog (Constructor)" ref="eric7.MicroPython.WifiDialogs.WifiConnectionDialog.html#WifiConnectionDialog.__init__" />
+      <keyword name="WifiConnectionDialog (Module)" id="WifiConnectionDialog (Module)" ref="eric7.MicroPython.WifiDialogs.WifiConnectionDialog.html" />
+      <keyword name="WifiConnectionDialog.getConnectionParameters" id="WifiConnectionDialog.getConnectionParameters" ref="eric7.MicroPython.WifiDialogs.WifiConnectionDialog.html#WifiConnectionDialog.getConnectionParameters" />
+      <keyword name="WifiConnectionDialog.on_showPasswordButton_clicked" id="WifiConnectionDialog.on_showPasswordButton_clicked" ref="eric7.MicroPython.WifiDialogs.WifiConnectionDialog.html#WifiConnectionDialog.on_showPasswordButton_clicked" />
+      <keyword name="WifiConnectionDialog.on_ssidEdit_textChanged" id="WifiConnectionDialog.on_ssidEdit_textChanged" ref="eric7.MicroPython.WifiDialogs.WifiConnectionDialog.html#WifiConnectionDialog.on_ssidEdit_textChanged" />
+      <keyword name="WifiController" id="WifiController" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController" />
+      <keyword name="WifiController (Constructor)" id="WifiController (Constructor)" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__init__" />
+      <keyword name="WifiController (Module)" id="WifiController (Module)" ref="eric7.MicroPython.WifiDialogs.WifiController.html" />
+      <keyword name="WifiController.__checkInternet" id="WifiController.__checkInternet" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__checkInternet" />
+      <keyword name="WifiController.__connectWifi" id="WifiController.__connectWifi" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__connectWifi" />
+      <keyword name="WifiController.__deactivateInterface" id="WifiController.__deactivateInterface" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__deactivateInterface" />
+      <keyword name="WifiController.__disconnectWifi" id="WifiController.__disconnectWifi" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__disconnectWifi" />
+      <keyword name="WifiController.__removeCredentials" id="WifiController.__removeCredentials" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__removeCredentials" />
+      <keyword name="WifiController.__scanNetwork" id="WifiController.__scanNetwork" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__scanNetwork" />
+      <keyword name="WifiController.__showConnectedClients" id="WifiController.__showConnectedClients" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__showConnectedClients" />
+      <keyword name="WifiController.__showWifiStatus" id="WifiController.__showWifiStatus" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__showWifiStatus" />
+      <keyword name="WifiController.__startAccessPoint" id="WifiController.__startAccessPoint" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__startAccessPoint" />
+      <keyword name="WifiController.__startAccessPointIP" id="WifiController.__startAccessPointIP" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__startAccessPointIP" />
+      <keyword name="WifiController.__stopAccessPoint" id="WifiController.__stopAccessPoint" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__stopAccessPoint" />
+      <keyword name="WifiController.__writeCredentials" id="WifiController.__writeCredentials" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.__writeCredentials" />
+      <keyword name="WifiController.createMenu" id="WifiController.createMenu" ref="eric7.MicroPython.WifiDialogs.WifiController.html#WifiController.createMenu" />
+      <keyword name="WifiCountryDialog" id="WifiCountryDialog" ref="eric7.MicroPython.WifiDialogs.WifiCountryDialog.html#WifiCountryDialog" />
+      <keyword name="WifiCountryDialog (Constructor)" id="WifiCountryDialog (Constructor)" ref="eric7.MicroPython.WifiDialogs.WifiCountryDialog.html#WifiCountryDialog.__init__" />
+      <keyword name="WifiCountryDialog (Module)" id="WifiCountryDialog (Module)" ref="eric7.MicroPython.WifiDialogs.WifiCountryDialog.html" />
+      <keyword name="WifiCountryDialog.getCountry" id="WifiCountryDialog.getCountry" ref="eric7.MicroPython.WifiDialogs.WifiCountryDialog.html#WifiCountryDialog.getCountry" />
+      <keyword name="WifiCountryDialog.on_countryEdit_textChanged" id="WifiCountryDialog.on_countryEdit_textChanged" ref="eric7.MicroPython.WifiDialogs.WifiCountryDialog.html#WifiCountryDialog.on_countryEdit_textChanged" />
+      <keyword name="WifiDialogs (Package)" id="WifiDialogs (Package)" ref="index-eric7.MicroPython.WifiDialogs.html" />
+      <keyword name="WifiNetworksWindow" id="WifiNetworksWindow" ref="eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html#WifiNetworksWindow" />
+      <keyword name="WifiNetworksWindow (Constructor)" id="WifiNetworksWindow (Constructor)" ref="eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html#WifiNetworksWindow.__init__" />
+      <keyword name="WifiNetworksWindow (Module)" id="WifiNetworksWindow (Module)" ref="eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html" />
+      <keyword name="WifiNetworksWindow.__resizeColumns" id="WifiNetworksWindow.__resizeColumns" ref="eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html#WifiNetworksWindow.__resizeColumns" />
+      <keyword name="WifiNetworksWindow.__resort" id="WifiNetworksWindow.__resort" ref="eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html#WifiNetworksWindow.__resort" />
+      <keyword name="WifiNetworksWindow.closeEvent" id="WifiNetworksWindow.closeEvent" ref="eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html#WifiNetworksWindow.closeEvent" />
+      <keyword name="WifiNetworksWindow.on_intervalSpinBox_valueChanged" id="WifiNetworksWindow.on_intervalSpinBox_valueChanged" ref="eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html#WifiNetworksWindow.on_intervalSpinBox_valueChanged" />
+      <keyword name="WifiNetworksWindow.on_periodicCheckBox_toggled" id="WifiNetworksWindow.on_periodicCheckBox_toggled" ref="eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html#WifiNetworksWindow.on_periodicCheckBox_toggled" />
+      <keyword name="WifiNetworksWindow.scanNetworks" id="WifiNetworksWindow.scanNetworks" ref="eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html#WifiNetworksWindow.scanNetworks" />
+      <keyword name="WifiStatusDialog" id="WifiStatusDialog" ref="eric7.MicroPython.WifiDialogs.WifiStatusDialog.html#WifiStatusDialog" />
+      <keyword name="WifiStatusDialog (Constructor)" id="WifiStatusDialog (Constructor)" ref="eric7.MicroPython.WifiDialogs.WifiStatusDialog.html#WifiStatusDialog.__init__" />
+      <keyword name="WifiStatusDialog (Module)" id="WifiStatusDialog (Module)" ref="eric7.MicroPython.WifiDialogs.WifiStatusDialog.html" />
+      <keyword name="WifiStatusDialog.__createHeader" id="WifiStatusDialog.__createHeader" ref="eric7.MicroPython.WifiDialogs.WifiStatusDialog.html#WifiStatusDialog.__createHeader" />
       <keyword name="WizardEricPluginWizard" id="WizardEricPluginWizard" ref="eric7.Plugins.PluginWizardEricPlugin.html#WizardEricPluginWizard" />
       <keyword name="WizardEricPluginWizard (Constructor)" id="WizardEricPluginWizard (Constructor)" ref="eric7.Plugins.PluginWizardEricPlugin.html#WizardEricPluginWizard.__init__" />
       <keyword name="WizardEricPluginWizard.__callForm" id="WizardEricPluginWizard.__callForm" ref="eric7.Plugins.PluginWizardEricPlugin.html#WizardEricPluginWizard.__callForm" />
@@ -18910,6 +19035,8 @@
       <keyword name="condaVersionStr" id="condaVersionStr" ref="eric7.CondaInterface.__init__.html#condaVersionStr" />
       <keyword name="confirmOverwrite" id="confirmOverwrite" ref="eric7.EricWidgets.EricFileSaveConfirmDialog.html#confirmOverwrite" />
       <keyword name="conflicting_deps" id="conflicting_deps" ref="eric7.PipInterface.pipdeptree.html#conflicting_deps" />
+      <keyword name="connectWiFi" id="connectWiFi" ref="eric7.MicroPython.Devices.MCUScripts.esp32WiFiConnect.html#connectWiFi" />
+      <keyword name="connectWiFi" id="connectWiFi" ref="eric7.MicroPython.Devices.MCUScripts.picowWiFiConnect.html#connectWiFi" />
       <keyword name="containsSpace" id="containsSpace" ref="eric7.WebBrowser.Tools.WebBrowserTools.html#containsSpace" />
       <keyword name="continued_indentation" id="continued_indentation" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.pycodestyle.html#continued_indentation" />
       <keyword name="convertLineEnds" id="convertLineEnds" ref="eric7.Utilities.__init__.html#convertLineEnds" />
@@ -19168,6 +19295,7 @@
       <keyword name="escape_entities" id="escape_entities" ref="eric7.Utilities.__init__.html#escape_entities" />
       <keyword name="escape_uentities" id="escape_uentities" ref="eric7.Utilities.__init__.html#escape_uentities" />
       <keyword name="escapedBytesRepresentation" id="escapedBytesRepresentation" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.Security.SecurityUtils.html#escapedBytesRepresentation" />
+      <keyword name="esp32WiFiConnect (Module)" id="esp32WiFiConnect (Module)" ref="eric7.MicroPython.Devices.MCUScripts.esp32WiFiConnect.html" />
       <keyword name="evaluateCall" id="evaluateCall" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.html#evaluateCall" />
       <keyword name="evaluateVar" id="evaluateVar" ref="eric7.Plugins.CheckerPlugins.CodeStyleChecker.Security.Checks.djangoXssVulnerability.html#evaluateVar" />
       <keyword name="excepthook" id="excepthook" ref="eric7.eric7_ide.html#excepthook" />
@@ -19639,6 +19767,7 @@
       <keyword name="patchSubprocess" id="patchSubprocess" ref="eric7.DebugClients.Python.SubprocessExtension.html#patchSubprocess" />
       <keyword name="patch_circup" id="patch_circup" ref="eric7.MicroPython.Devices.CircuitPythonUpdater.CircupFunctions.html#patch_circup" />
       <keyword name="pbkdf2" id="pbkdf2" ref="eric7.Utilities.crypto.py3PBKDF2.html#pbkdf2" />
+      <keyword name="picowWiFiConnect (Module)" id="picowWiFiConnect (Module)" ref="eric7.MicroPython.Devices.MCUScripts.picowWiFiConnect.html" />
       <keyword name="pipdeptree (Module)" id="pipdeptree (Module)" ref="eric7.PipInterface.pipdeptree.html" />
       <keyword name="piplicenses (Module)" id="piplicenses (Module)" ref="eric7.PipInterface.piplicenses.html" />
       <keyword name="pixmapFileToDataUrl" id="pixmapFileToDataUrl" ref="eric7.WebBrowser.Tools.WebBrowserTools.html#pixmapFileToDataUrl" />
@@ -20011,6 +20140,7 @@
       <file>eric7.EricNetwork.EricFtp.html</file>
       <file>eric7.EricNetwork.EricGoogleMail.html</file>
       <file>eric7.EricNetwork.EricGoogleMailHelpers.html</file>
+      <file>eric7.EricNetwork.EricIPv4InputWidget.html</file>
       <file>eric7.EricNetwork.EricJsonClient.html</file>
       <file>eric7.EricNetwork.EricJsonServer.html</file>
       <file>eric7.EricNetwork.EricJsonStreamReader.html</file>
@@ -20145,6 +20275,8 @@
       <file>eric7.MicroPython.Devices.EspDialogs.EspBackupRestoreFirmwareDialog.html</file>
       <file>eric7.MicroPython.Devices.EspDialogs.EspFirmwareSelectionDialog.html</file>
       <file>eric7.MicroPython.Devices.GenericMicroPythonDevices.html</file>
+      <file>eric7.MicroPython.Devices.MCUScripts.esp32WiFiConnect.html</file>
+      <file>eric7.MicroPython.Devices.MCUScripts.picowWiFiConnect.html</file>
       <file>eric7.MicroPython.Devices.MicrobitDevices.html</file>
       <file>eric7.MicroPython.Devices.PyBoardDevices.html</file>
       <file>eric7.MicroPython.Devices.RP2040Devices.html</file>
@@ -20162,6 +20294,13 @@
       <file>eric7.MicroPython.ShowModulesDialog.html</file>
       <file>eric7.MicroPython.UF2FlashDialog.html</file>
       <file>eric7.MicroPython.UnknownDevicesDialog.html</file>
+      <file>eric7.MicroPython.WifiDialogs.WifiApConfigDialog.html</file>
+      <file>eric7.MicroPython.WifiDialogs.WifiApStationsDialog.html</file>
+      <file>eric7.MicroPython.WifiDialogs.WifiConnectionDialog.html</file>
+      <file>eric7.MicroPython.WifiDialogs.WifiController.html</file>
+      <file>eric7.MicroPython.WifiDialogs.WifiCountryDialog.html</file>
+      <file>eric7.MicroPython.WifiDialogs.WifiNetworksWindow.html</file>
+      <file>eric7.MicroPython.WifiDialogs.WifiStatusDialog.html</file>
       <file>eric7.MultiProject.AddProjectDialog.html</file>
       <file>eric7.MultiProject.MultiProject.html</file>
       <file>eric7.MultiProject.MultiProjectBrowser.html</file>
@@ -21139,7 +21278,9 @@
       <file>index-eric7.JediInterface.html</file>
       <file>index-eric7.MicroPython.Devices.CircuitPythonUpdater.html</file>
       <file>index-eric7.MicroPython.Devices.EspDialogs.html</file>
+      <file>index-eric7.MicroPython.Devices.MCUScripts.html</file>
       <file>index-eric7.MicroPython.Devices.html</file>
+      <file>index-eric7.MicroPython.WifiDialogs.html</file>
       <file>index-eric7.MicroPython.html</file>
       <file>index-eric7.MultiProject.html</file>
       <file>index-eric7.Network.IRC.html</file>
--- a/src/eric7/Documentation/Source/eric7.MicroPython.Devices.DeviceBase.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/eric7.MicroPython.Devices.DeviceBase.html	Sat Feb 25 19:18:07 2023 +0100
@@ -47,19 +47,19 @@
     the time on the board and getting board related data. Supported file system
     commands are:
     <ul>
-    <li>ls: directory listing</li>
+    <li>cd: change directory</li>
+    <li>fileSystemInfo: get information about the file system
+    <li>get: get a file from the connected device</li>
+    <li>getData: read data of a file of the connected device</li>
     <li>lls: directory listing with meta data</li>
-    <li>cd: change directory</li>
-    <li>pwd: get the current directory</li>
+    <li>ls: directory listing</li>
+    <li>mkdir: create a new directory</li>
     <li>put: copy a file to the connected device</li>
     <li>putData: write data to a file of the connected device</li>
-    <li>get: get a file from the connected device</li>
-    <li>getData: read data of a file of the connected device</li>
+    <li>pwd: get the current directory</li>
     <li>rm: remove a file from the connected device</li>
+    <li>rmdir: remove an empty directory</li>
     <li>rmrf: remove a file/directory recursively (like 'rm -rf' in bash)
-    <li>mkdir: create a new directory</li>
-    <li>rmdir: remove an empty directory</li>
-    <li>fileSystemInfo: get information about the file system
     </ul>
 </p>
 <p>
@@ -70,8 +70,26 @@
         information</li>
     <li>getModules: get a list of built-in modules</li>
     <li>getTime: get the current time</li>
+    <li>showTime: show the current time of the connected device</li>
     <li>syncTime: synchronize the time of the connected device</li>
-    <li>showTime: show the current time of the connected device</li>
+    </ul>
+</p>
+<p>
+    Supported WiFi commands are:
+    <ul>
+    <li>hasWifi: check, if the board has WiFi functionality</li>
+    <li>getWifiData: get WiFi status data</li>
+    <li>connectWifi: connect to a WiFi network</li>
+    <li>disconnectWifi: disconnect from a WiFi network</li>
+    <li>writeCredentials: save the WiFi credentials to the board and create
+        functionality to auto-connect at boot time</li>
+    <li>removeCredentials: remove the saved credentials</li>
+    <li>checkInternet: check, if internet access is possible</li>
+    <li>scanNetworks: scan for available WiFi networks</li>
+    <li>deactivateInterface: deactivate a WiFi interface</li>
+    <li>startAccessPoint: start an access point</li>
+    <li>stopAccessPoint: stop the access point</li>
+    <li>getConnectedClients: get a list of connected WiFi clients</li>
     </ul>
 </p>
 <h3>Derived from</h3>
@@ -111,6 +129,10 @@
 <td>Public method to add device specific entries to the given menu.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.addDeviceWifiEntries">addDeviceWifiEntries</a></td>
+<td>Public method to add device specific entries to the given menu.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.canRunScript">canRunScript</a></td>
 <td>Public method to determine, if a script can be executed.</td>
 </tr>
@@ -135,10 +157,26 @@
 <td>Public method to check the validity of the device data determined during connecting the device.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.checkInternet">checkInternet</a></td>
+<td>Public method to check, if the internet can be reached.</td>
+</tr>
+<tr>
+<td><a href="#BaseDevice.connectWifi">connectWifi</a></td>
+<td>Public method to connect a device to a WiFi network.</td>
+</tr>
+<tr>
+<td><a href="#BaseDevice.deactivateInterface">deactivateInterface</a></td>
+<td>Public method to deactivate a given WiFi interface of the connected device.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.deviceName">deviceName</a></td>
 <td>Public method to get the name of the device.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.disconnectWifi">disconnectWifi</a></td>
+<td>Public method to disconnect a device from the WiFi network.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.downloadFirmware">downloadFirmware</a></td>
 <td>Public method to download the device firmware.</td>
 </tr>
@@ -159,6 +197,10 @@
 <td>Public method to get some information data of the connected board.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.getConnectedClients">getConnectedClients</a></td>
+<td>Public method to get a list of connected clients.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.getData">getData</a></td>
 <td>Public method to read data from the connected device.</td>
 </tr>
@@ -191,6 +233,10 @@
 <td>Public method to get the current time of the device.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.getWifiData">getWifiData</a></td>
+<td>Public method to get data related to the current WiFi status.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.getWorkspace">getWorkspace</a></td>
 <td>Public method to get the workspace directory.</td>
 </tr>
@@ -199,6 +245,10 @@
 <td>Public slot handling a data floof from the device.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.hasBluetooth">hasBluetooth</a></td>
+<td>Public method to check the availability of Bluetooth.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.hasCircuitPython">hasCircuitPython</a></td>
 <td>Public method to check, if the connected device is flashed with CircuitPython.</td>
 </tr>
@@ -207,6 +257,10 @@
 <td>Public method to check, if the device has a configured documentation URL.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.hasEthernet">hasEthernet</a></td>
+<td>Public method to check the availability of Ethernet.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.hasFirmwareUrl">hasFirmwareUrl</a></td>
 <td>Public method to check, if the device has a configured firmware download URL.</td>
 </tr>
@@ -219,6 +273,10 @@
 <td>Public method to check, if the device supports time commands.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.hasWifi">hasWifi</a></td>
+<td>Public method to check the availability of WiFi.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.lls">lls</a></td>
 <td>Public method to get a long directory listing of the connected device including meta data.</td>
 </tr>
@@ -243,6 +301,10 @@
 <td>Public method to get the current directory of the connected device.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.removeCredentials">removeCredentials</a></td>
+<td>Public method to remove the saved credentials from the connected device.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.rm">rm</a></td>
 <td>Public method to remove a file from the connected device.</td>
 </tr>
@@ -259,6 +321,10 @@
 <td>Public method to run the given Python script.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.scanNetworks">scanNetworks</a></td>
+<td>Public method to scan for available WiFi networks.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.selectDeviceDirectory">selectDeviceDirectory</a></td>
 <td>Public method to select the device directory from a list of detected ones.</td>
 </tr>
@@ -287,6 +353,14 @@
 <td>Public method to set the REPL status and dependent status.</td>
 </tr>
 <tr>
+<td><a href="#BaseDevice.startAccessPoint">startAccessPoint</a></td>
+<td>Public method to start the access point interface.</td>
+</tr>
+<tr>
+<td><a href="#BaseDevice.stopAccessPoint">stopAccessPoint</a></td>
+<td>Public method to stop the access point interface.</td>
+</tr>
+<tr>
 <td><a href="#BaseDevice.supportsLocalFileAccess">supportsLocalFileAccess</a></td>
 <td>Public method to indicate file access via a local directory.</td>
 </tr>
@@ -294,6 +368,10 @@
 <td><a href="#BaseDevice.syncTime">syncTime</a></td>
 <td>Public method to set the time of the connected device to the local computer's time.</td>
 </tr>
+<tr>
+<td><a href="#BaseDevice.writeCredentials">writeCredentials</a></td>
+<td>Public method to write the given credentials to the connected device and modify the start script to connect automatically.</td>
+</tr>
 </table>
 <h3>Static Methods</h3>
 
@@ -412,6 +490,20 @@
 reference to the context menu
 </dd>
 </dl>
+<a NAME="BaseDevice.addDeviceWifiEntries" ID="BaseDevice.addDeviceWifiEntries"></a>
+<h4>BaseDevice.addDeviceWifiEntries</h4>
+<b>addDeviceWifiEntries</b>(<i>menu</i>)
+
+<p>
+        Public method to add device specific entries to the given menu.
+</p>
+<dl>
+
+<dt><i>menu</i> (QMenu)</dt>
+<dd>
+reference to the context menu
+</dd>
+</dl>
 <a NAME="BaseDevice.canRunScript" ID="BaseDevice.canRunScript"></a>
 <h4>BaseDevice.canRunScript</h4>
 <b>canRunScript</b>(<i></i>)
@@ -533,6 +625,82 @@
 bool
 </dd>
 </dl>
+<a NAME="BaseDevice.checkInternet" ID="BaseDevice.checkInternet"></a>
+<h4>BaseDevice.checkInternet</h4>
+<b>checkInternet</b>(<i></i>)
+
+<p>
+        Public method to check, if the internet can be reached.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating reachability and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="BaseDevice.connectWifi" ID="BaseDevice.connectWifi"></a>
+<h4>BaseDevice.connectWifi</h4>
+<b>connectWifi</b>(<i>ssid, password</i>)
+
+<p>
+        Public method to connect a device to a WiFi network.
+</p>
+<dl>
+
+<dt><i>ssid</i> (str)</dt>
+<dd>
+name (SSID) of the WiFi network
+</dd>
+<dt><i>password</i> (str)</dt>
+<dd>
+password needed to connect
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing the connection status and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="BaseDevice.deactivateInterface" ID="BaseDevice.deactivateInterface"></a>
+<h4>BaseDevice.deactivateInterface</h4>
+<b>deactivateInterface</b>(<i>interface</i>)
+
+<p>
+        Public method to deactivate a given WiFi interface of the connected device.
+</p>
+<dl>
+
+<dt><i>interface</i> (str)</dt>
+<dd>
+designation of the interface to be deactivated (one of 'AP'
+            or 'STA')
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containg a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <a NAME="BaseDevice.deviceName" ID="BaseDevice.deviceName"></a>
 <h4>BaseDevice.deviceName</h4>
 <b>deviceName</b>(<i></i>)
@@ -552,6 +720,25 @@
 str
 </dd>
 </dl>
+<a NAME="BaseDevice.disconnectWifi" ID="BaseDevice.disconnectWifi"></a>
+<h4>BaseDevice.disconnectWifi</h4>
+<b>disconnectWifi</b>(<i></i>)
+
+<p>
+        Public method to disconnect a device from the WiFi network.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <a NAME="BaseDevice.downloadFirmware" ID="BaseDevice.downloadFirmware"></a>
 <h4>BaseDevice.downloadFirmware</h4>
 <b>downloadFirmware</b>(<i></i>)
@@ -670,6 +857,26 @@
 raised to indicate an issue with the device
 </dd>
 </dl>
+<a NAME="BaseDevice.getConnectedClients" ID="BaseDevice.getConnectedClients"></a>
+<h4>BaseDevice.getConnectedClients</h4>
+<b>getConnectedClients</b>(<i></i>)
+
+<p>
+        Public method to get a list of connected clients.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+a tuple containing a list of tuples containing the client MAC-Address
+            and the RSSI (if supported and available) and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of ([(bytes, int)], str)
+</dd>
+</dl>
 <a NAME="BaseDevice.getData" ID="BaseDevice.getData"></a>
 <h4>BaseDevice.getData</h4>
 <b>getData</b>(<i>deviceFileName</i>)
@@ -705,12 +912,19 @@
 </dl>
 <a NAME="BaseDevice.getDeviceData" ID="BaseDevice.getDeviceData"></a>
 <h4>BaseDevice.getDeviceData</h4>
-<b>getDeviceData</b>(<i></i>)
+<b>getDeviceData</b>(<i>key=None</i>)
 
 <p>
         Public method to get a copy of the determined device data.
 </p>
 <dl>
+
+<dt><i>key</i> (str (optional))</dt>
+<dd>
+name of the data to get (None to get all data) (defaults to None)
+</dd>
+</dl>
+<dl>
 <dt>Return:</dt>
 <dd>
 dictionary containing the essential device data
@@ -851,6 +1065,26 @@
 raised to indicate an issue with the device
 </dd>
 </dl>
+<a NAME="BaseDevice.getWifiData" ID="BaseDevice.getWifiData"></a>
+<h4>BaseDevice.getWifiData</h4>
+<b>getWifiData</b>(<i></i>)
+
+<p>
+        Public method to get data related to the current WiFi status.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple of three dictionaries containing the WiFi status data
+            for the WiFi client, access point and overall data
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (dict, dict, dict)
+</dd>
+</dl>
 <a NAME="BaseDevice.getWorkspace" ID="BaseDevice.getWorkspace"></a>
 <h4>BaseDevice.getWorkspace</h4>
 <b>getWorkspace</b>(<i></i>)
@@ -877,6 +1111,25 @@
 <p>
         Public slot handling a data floof from the device.
 </p>
+<a NAME="BaseDevice.hasBluetooth" ID="BaseDevice.hasBluetooth"></a>
+<h4>BaseDevice.hasBluetooth</h4>
+<b>hasBluetooth</b>(<i></i>)
+
+<p>
+        Public method to check the availability of Bluetooth.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+flag indicating the availability of Bluetooth
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
 <a NAME="BaseDevice.hasCircuitPython" ID="BaseDevice.hasCircuitPython"></a>
 <h4>BaseDevice.hasCircuitPython</h4>
 <b>hasCircuitPython</b>(<i></i>)
@@ -916,6 +1169,25 @@
 bool
 </dd>
 </dl>
+<a NAME="BaseDevice.hasEthernet" ID="BaseDevice.hasEthernet"></a>
+<h4>BaseDevice.hasEthernet</h4>
+<b>hasEthernet</b>(<i></i>)
+
+<p>
+        Public method to check the availability of Ethernet.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+flag indicating the availability of Ethernet
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
 <a NAME="BaseDevice.hasFirmwareUrl" ID="BaseDevice.hasFirmwareUrl"></a>
 <h4>BaseDevice.hasFirmwareUrl</h4>
 <b>hasFirmwareUrl</b>(<i></i>)
@@ -977,6 +1249,26 @@
 bool
 </dd>
 </dl>
+<a NAME="BaseDevice.hasWifi" ID="BaseDevice.hasWifi"></a>
+<h4>BaseDevice.hasWifi</h4>
+<b>hasWifi</b>(<i></i>)
+
+<p>
+        Public method to check the availability of WiFi.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating the availability of WiFi
+            and the WiFi type (picow or pimoroni)
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <a NAME="BaseDevice.lls" ID="BaseDevice.lls"></a>
 <h4>BaseDevice.lls</h4>
 <b>lls</b>(<i>dirname="", fullstat=False, showHidden=False</i>)
@@ -1176,6 +1468,25 @@
 raised to indicate an issue with the device
 </dd>
 </dl>
+<a NAME="BaseDevice.removeCredentials" ID="BaseDevice.removeCredentials"></a>
+<h4>BaseDevice.removeCredentials</h4>
+<b>removeCredentials</b>(<i></i>)
+
+<p>
+        Public method to remove the saved credentials from the connected device.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <a NAME="BaseDevice.rm" ID="BaseDevice.rm"></a>
 <h4>BaseDevice.rm</h4>
 <b>rm</b>(<i>filename</i>)
@@ -1273,6 +1584,26 @@
 script to be executed
 </dd>
 </dl>
+<a NAME="BaseDevice.scanNetworks" ID="BaseDevice.scanNetworks"></a>
+<h4>BaseDevice.scanNetworks</h4>
+<b>scanNetworks</b>(<i></i>)
+
+<p>
+        Public method to scan for available WiFi networks.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing the list of available networks as a tuple of 'Name',
+            'MAC-Address', 'channel', 'RSSI' and 'security' and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (list of tuple of (str, str, int, int, str), str)
+</dd>
+</dl>
 <a NAME="BaseDevice.selectDeviceDirectory" ID="BaseDevice.selectDeviceDirectory"></a>
 <h4>BaseDevice.selectDeviceDirectory</h4>
 <b>selectDeviceDirectory</b>(<i>deviceDirectories</i>)
@@ -1381,6 +1712,64 @@
 flag indicating the active status
 </dd>
 </dl>
+<a NAME="BaseDevice.startAccessPoint" ID="BaseDevice.startAccessPoint"></a>
+<h4>BaseDevice.startAccessPoint</h4>
+<b>startAccessPoint</b>(<i>ssid, security=None, password=None, ifconfig=None</i>)
+
+<p>
+        Public method to start the access point interface.
+</p>
+<dl>
+
+<dt><i>ssid</i> (str)</dt>
+<dd>
+SSID of the access point
+</dd>
+<dt><i>security</i> (int (optional))</dt>
+<dd>
+security method (defaults to None)
+</dd>
+<dt><i>password</i> (str (optional))</dt>
+<dd>
+password (defaults to None)
+</dd>
+<dt><i>ifconfig</i> (tuple of (str, str, str, str))</dt>
+<dd>
+IPv4 configuration for the access point if not default
+            (IPv4 address, netmask, gateway address, DNS server address)
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="BaseDevice.stopAccessPoint" ID="BaseDevice.stopAccessPoint"></a>
+<h4>BaseDevice.stopAccessPoint</h4>
+<b>stopAccessPoint</b>(<i></i>)
+
+<p>
+        Public method to stop the access point interface.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containg a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <a NAME="BaseDevice.supportsLocalFileAccess" ID="BaseDevice.supportsLocalFileAccess"></a>
 <h4>BaseDevice.supportsLocalFileAccess</h4>
 <b>supportsLocalFileAccess</b>(<i></i>)
@@ -1427,6 +1816,37 @@
 raised to indicate an issue with the device
 </dd>
 </dl>
+<a NAME="BaseDevice.writeCredentials" ID="BaseDevice.writeCredentials"></a>
+<h4>BaseDevice.writeCredentials</h4>
+<b>writeCredentials</b>(<i>ssid, password</i>)
+
+<p>
+        Public method to write the given credentials to the connected device and modify
+        the start script to connect automatically.
+</p>
+<dl>
+
+<dt><i>ssid</i> (str)</dt>
+<dd>
+SSID of the network to connect to
+</dd>
+<dt><i>password</i> (str)</dt>
+<dd>
+password needed to authenticate
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 </body></html>
\ No newline at end of file
--- a/src/eric7/Documentation/Source/eric7.MicroPython.Devices.EspDevices.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/eric7.MicroPython.Devices.EspDevices.html	Sat Feb 25 19:18:07 2023 +0100
@@ -140,14 +140,34 @@
 <td>Public method to determine, if a REPL can be started.</td>
 </tr>
 <tr>
+<td><a href="#EspDevice.checkInternet">checkInternet</a></td>
+<td>Public method to check, if the internet can be reached.</td>
+</tr>
+<tr>
+<td><a href="#EspDevice.connectWifi">connectWifi</a></td>
+<td>Public method to connect a device to a WiFi network.</td>
+</tr>
+<tr>
+<td><a href="#EspDevice.deactivateInterface">deactivateInterface</a></td>
+<td>Public method to deactivate a given WiFi interface of the connected device.</td>
+</tr>
+<tr>
 <td><a href="#EspDevice.deviceName">deviceName</a></td>
 <td>Public method to get the name of the device.</td>
 </tr>
 <tr>
+<td><a href="#EspDevice.disconnectWifi">disconnectWifi</a></td>
+<td>Public method to disconnect a device from the WiFi network.</td>
+</tr>
+<tr>
 <td><a href="#EspDevice.forceInterrupt">forceInterrupt</a></td>
 <td>Public method to determine the need for an interrupt when opening the serial connection.</td>
 </tr>
 <tr>
+<td><a href="#EspDevice.getConnectedClients">getConnectedClients</a></td>
+<td>Public method to get a list of connected clients.</td>
+</tr>
+<tr>
 <td><a href="#EspDevice.getDocumentationUrl">getDocumentationUrl</a></td>
 <td>Public method to get the device documentation URL.</td>
 </tr>
@@ -156,17 +176,45 @@
 <td>Public method to get the device firmware download URL.</td>
 </tr>
 <tr>
+<td><a href="#EspDevice.getWifiData">getWifiData</a></td>
+<td>Public method to get data related to the current WiFi status.</td>
+</tr>
+<tr>
 <td><a href="#EspDevice.hasFlashMenuEntry">hasFlashMenuEntry</a></td>
 <td>Public method to check, if the device has its own flash menu entry.</td>
 </tr>
 <tr>
+<td><a href="#EspDevice.hasWifi">hasWifi</a></td>
+<td>Public method to check the availability of WiFi.</td>
+</tr>
+<tr>
+<td><a href="#EspDevice.removeCredentials">removeCredentials</a></td>
+<td>Public method to remove the saved credentials from the connected device.</td>
+</tr>
+<tr>
 <td><a href="#EspDevice.runScript">runScript</a></td>
 <td>Public method to run the given Python script.</td>
 </tr>
 <tr>
+<td><a href="#EspDevice.scanNetworks">scanNetworks</a></td>
+<td>Public method to scan for available WiFi networks.</td>
+</tr>
+<tr>
 <td><a href="#EspDevice.setButtons">setButtons</a></td>
 <td>Public method to enable the supported action buttons.</td>
 </tr>
+<tr>
+<td><a href="#EspDevice.startAccessPoint">startAccessPoint</a></td>
+<td>Public method to start the access point interface.</td>
+</tr>
+<tr>
+<td><a href="#EspDevice.stopAccessPoint">stopAccessPoint</a></td>
+<td>Public method to stop the access point interface.</td>
+</tr>
+<tr>
+<td><a href="#EspDevice.writeCredentials">writeCredentials</a></td>
+<td>Public method to write the given credentials to the connected device and modify the start script to connect automatically.</td>
+</tr>
 </table>
 <h3>Static Methods</h3>
 
@@ -412,6 +460,89 @@
 tuple of (bool, str)
 </dd>
 </dl>
+<a NAME="EspDevice.checkInternet" ID="EspDevice.checkInternet"></a>
+<h4>EspDevice.checkInternet</h4>
+<b>checkInternet</b>(<i></i>)
+
+<p>
+        Public method to check, if the internet can be reached.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating reachability and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="EspDevice.connectWifi" ID="EspDevice.connectWifi"></a>
+<h4>EspDevice.connectWifi</h4>
+<b>connectWifi</b>(<i>ssid, password</i>)
+
+<p>
+        Public method to connect a device to a WiFi network.
+</p>
+<dl>
+
+<dt><i>ssid</i> (str)</dt>
+<dd>
+name (SSID) of the WiFi network
+</dd>
+<dt><i>password</i> (str)</dt>
+<dd>
+password needed to connect
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing the connection status and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="EspDevice.deactivateInterface" ID="EspDevice.deactivateInterface"></a>
+<h4>EspDevice.deactivateInterface</h4>
+<b>deactivateInterface</b>(<i>interface</i>)
+
+<p>
+        Public method to deactivate a given WiFi interface of the connected device.
+</p>
+<dl>
+
+<dt><i>interface</i> (str)</dt>
+<dd>
+designation of the interface to be deactivated (one of 'AP'
+            or 'STA')
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containg a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a wrong value for the interface type
+</dd>
+</dl>
 <a NAME="EspDevice.deviceName" ID="EspDevice.deviceName"></a>
 <h4>EspDevice.deviceName</h4>
 <b>deviceName</b>(<i></i>)
@@ -431,6 +562,25 @@
 str
 </dd>
 </dl>
+<a NAME="EspDevice.disconnectWifi" ID="EspDevice.disconnectWifi"></a>
+<h4>EspDevice.disconnectWifi</h4>
+<b>disconnectWifi</b>(<i></i>)
+
+<p>
+        Public method to disconnect a device from the WiFi network.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <a NAME="EspDevice.forceInterrupt" ID="EspDevice.forceInterrupt"></a>
 <h4>EspDevice.forceInterrupt</h4>
 <b>forceInterrupt</b>(<i></i>)
@@ -451,6 +601,26 @@
 bool
 </dd>
 </dl>
+<a NAME="EspDevice.getConnectedClients" ID="EspDevice.getConnectedClients"></a>
+<h4>EspDevice.getConnectedClients</h4>
+<b>getConnectedClients</b>(<i></i>)
+
+<p>
+        Public method to get a list of connected clients.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+a tuple containing a list of tuples containing the client MAC-Address
+            and the RSSI (if supported and available) and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of ([(bytes, int)], str)
+</dd>
+</dl>
 <a NAME="EspDevice.getDocumentationUrl" ID="EspDevice.getDocumentationUrl"></a>
 <h4>EspDevice.getDocumentationUrl</h4>
 <b>getDocumentationUrl</b>(<i></i>)
@@ -489,6 +659,33 @@
 str
 </dd>
 </dl>
+<a NAME="EspDevice.getWifiData" ID="EspDevice.getWifiData"></a>
+<h4>EspDevice.getWifiData</h4>
+<b>getWifiData</b>(<i></i>)
+
+<p>
+        Public method to get data related to the current WiFi status.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple of three dictionaries containing the WiFi status data
+            for the WiFi client, access point and overall data
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (dict, dict, dict)
+</dd>
+</dl>
+<dl>
+
+<dt>Raises <b>OSError</b>:</dt>
+<dd>
+raised to indicate an issue with the device
+</dd>
+</dl>
 <a NAME="EspDevice.hasFlashMenuEntry" ID="EspDevice.hasFlashMenuEntry"></a>
 <h4>EspDevice.hasFlashMenuEntry</h4>
 <b>hasFlashMenuEntry</b>(<i></i>)
@@ -508,6 +705,45 @@
 bool
 </dd>
 </dl>
+<a NAME="EspDevice.hasWifi" ID="EspDevice.hasWifi"></a>
+<h4>EspDevice.hasWifi</h4>
+<b>hasWifi</b>(<i></i>)
+
+<p>
+        Public method to check the availability of WiFi.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating the availability of WiFi
+            and the WiFi type (esp32)
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="EspDevice.removeCredentials" ID="EspDevice.removeCredentials"></a>
+<h4>EspDevice.removeCredentials</h4>
+<b>removeCredentials</b>(<i></i>)
+
+<p>
+        Public method to remove the saved credentials from the connected device.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <a NAME="EspDevice.runScript" ID="EspDevice.runScript"></a>
 <h4>EspDevice.runScript</h4>
 <b>runScript</b>(<i>script</i>)
@@ -522,6 +758,26 @@
 script to be executed
 </dd>
 </dl>
+<a NAME="EspDevice.scanNetworks" ID="EspDevice.scanNetworks"></a>
+<h4>EspDevice.scanNetworks</h4>
+<b>scanNetworks</b>(<i></i>)
+
+<p>
+        Public method to scan for available WiFi networks.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing the list of available networks as a tuple of 'Name',
+            'MAC-Address', 'channel', 'RSSI' and 'security' and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (list of tuple of (str, str, int, int, str), str)
+</dd>
+</dl>
 <a NAME="EspDevice.setButtons" ID="EspDevice.setButtons"></a>
 <h4>EspDevice.setButtons</h4>
 <b>setButtons</b>(<i></i>)
@@ -529,6 +785,95 @@
 <p>
         Public method to enable the supported action buttons.
 </p>
+<a NAME="EspDevice.startAccessPoint" ID="EspDevice.startAccessPoint"></a>
+<h4>EspDevice.startAccessPoint</h4>
+<b>startAccessPoint</b>(<i>ssid, security=None, password=None, ifconfig=None</i>)
+
+<p>
+        Public method to start the access point interface.
+</p>
+<dl>
+
+<dt><i>ssid</i> (str)</dt>
+<dd>
+SSID of the access point
+</dd>
+<dt><i>security</i> (int (optional))</dt>
+<dd>
+security method (defaults to None)
+</dd>
+<dt><i>password</i> (str (optional))</dt>
+<dd>
+password (defaults to None)
+</dd>
+<dt><i>ifconfig</i> (tuple of (str, str, str, str))</dt>
+<dd>
+IPv4 configuration for the access point if not default
+            (IPv4 address, netmask, gateway address, DNS server address)
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="EspDevice.stopAccessPoint" ID="EspDevice.stopAccessPoint"></a>
+<h4>EspDevice.stopAccessPoint</h4>
+<b>stopAccessPoint</b>(<i></i>)
+
+<p>
+        Public method to stop the access point interface.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containg a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="EspDevice.writeCredentials" ID="EspDevice.writeCredentials"></a>
+<h4>EspDevice.writeCredentials</h4>
+<b>writeCredentials</b>(<i>ssid, password</i>)
+
+<p>
+        Public method to write the given credentials to the connected device and modify
+        the start script to connect automatically.
+</p>
+<dl>
+
+<dt><i>ssid</i> (str)</dt>
+<dd>
+SSID of the network to connect to
+</dd>
+<dt><i>password</i> (str)</dt>
+<dd>
+password needed to authenticate
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
--- a/src/eric7/Documentation/Source/eric7.MicroPython.Devices.RP2040Devices.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/eric7.MicroPython.Devices.RP2040Devices.html	Sat Feb 25 19:18:07 2023 +0100
@@ -80,6 +80,10 @@
 <td>Private slot to flash a MicroPython firmware to the device.</td>
 </tr>
 <tr>
+<td><a href="#RP2040Device.__setCountry">__setCountry</a></td>
+<td>Private slot to configure the country of the connected RP2040 device.</td>
+</tr>
+<tr>
 <td><a href="#RP2040Device.__showFirmwareVersions">__showFirmwareVersions</a></td>
 <td>Private slot to show the firmware version of the connected device and the available firmware version.</td>
 </tr>
@@ -92,6 +96,10 @@
 <td>Public method to add device specific entries to the given menu.</td>
 </tr>
 <tr>
+<td><a href="#RP2040Device.addDeviceWifiEntries">addDeviceWifiEntries</a></td>
+<td>Public method to add device specific entries to the given menu.</td>
+</tr>
+<tr>
 <td><a href="#RP2040Device.canRunScript">canRunScript</a></td>
 <td>Public method to determine, if a script can be executed.</td>
 </tr>
@@ -108,14 +116,34 @@
 <td>Public method to determine, if a REPL can be started.</td>
 </tr>
 <tr>
+<td><a href="#RP2040Device.checkInternet">checkInternet</a></td>
+<td>Public method to check, if the internet can be reached.</td>
+</tr>
+<tr>
+<td><a href="#RP2040Device.connectWifi">connectWifi</a></td>
+<td>Public method to connect a device to a WiFi network.</td>
+</tr>
+<tr>
+<td><a href="#RP2040Device.deactivateInterface">deactivateInterface</a></td>
+<td>Public method to deactivate a given WiFi interface of the connected device.</td>
+</tr>
+<tr>
 <td><a href="#RP2040Device.deviceName">deviceName</a></td>
 <td>Public method to get the name of the device.</td>
 </tr>
 <tr>
+<td><a href="#RP2040Device.disconnectWifi">disconnectWifi</a></td>
+<td>Public method to disconnect a device from the WiFi network.</td>
+</tr>
+<tr>
 <td><a href="#RP2040Device.forceInterrupt">forceInterrupt</a></td>
 <td>Public method to determine the need for an interrupt when opening the serial connection.</td>
 </tr>
 <tr>
+<td><a href="#RP2040Device.getConnectedClients">getConnectedClients</a></td>
+<td>Public method to get a list of connected clients.</td>
+</tr>
+<tr>
 <td><a href="#RP2040Device.getDocumentationUrl">getDocumentationUrl</a></td>
 <td>Public method to get the device documentation URL.</td>
 </tr>
@@ -124,17 +152,45 @@
 <td>Public method to retrieve the entries for the downloads menu.</td>
 </tr>
 <tr>
+<td><a href="#RP2040Device.getWifiData">getWifiData</a></td>
+<td>Public method to get data related to the current WiFi status.</td>
+</tr>
+<tr>
 <td><a href="#RP2040Device.hasFlashMenuEntry">hasFlashMenuEntry</a></td>
 <td>Public method to check, if the device has its own flash menu entry.</td>
 </tr>
 <tr>
+<td><a href="#RP2040Device.hasWifi">hasWifi</a></td>
+<td>Public method to check the availability of WiFi.</td>
+</tr>
+<tr>
+<td><a href="#RP2040Device.removeCredentials">removeCredentials</a></td>
+<td>Public method to remove the saved credentials from the connected device.</td>
+</tr>
+<tr>
 <td><a href="#RP2040Device.runScript">runScript</a></td>
 <td>Public method to run the given Python script.</td>
 </tr>
 <tr>
+<td><a href="#RP2040Device.scanNetworks">scanNetworks</a></td>
+<td>Public method to scan for available WiFi networks.</td>
+</tr>
+<tr>
 <td><a href="#RP2040Device.setButtons">setButtons</a></td>
 <td>Public method to enable the supported action buttons.</td>
 </tr>
+<tr>
+<td><a href="#RP2040Device.startAccessPoint">startAccessPoint</a></td>
+<td>Public method to start the access point interface.</td>
+</tr>
+<tr>
+<td><a href="#RP2040Device.stopAccessPoint">stopAccessPoint</a></td>
+<td>Public method to stop the access point interface.</td>
+</tr>
+<tr>
+<td><a href="#RP2040Device.writeCredentials">writeCredentials</a></td>
+<td>Public method to write the given credentials to the connected device and modify the start script to connect automatically.</td>
+</tr>
 </table>
 <h3>Static Methods</h3>
 
@@ -199,6 +255,16 @@
 <p>
         Private slot to flash a MicroPython firmware to the device.
 </p>
+<a NAME="RP2040Device.__setCountry" ID="RP2040Device.__setCountry"></a>
+<h4>RP2040Device.__setCountry</h4>
+<b>__setCountry</b>(<i></i>)
+
+<p>
+        Private slot to configure the country of the connected RP2040 device.
+</p>
+<p>
+        The country is the two letter country code.
+</p>
 <a NAME="RP2040Device.__showFirmwareVersions" ID="RP2040Device.__showFirmwareVersions"></a>
 <h4>RP2040Device.__showFirmwareVersions</h4>
 <b>__showFirmwareVersions</b>(<i></i>)
@@ -244,6 +310,20 @@
 reference to the context menu
 </dd>
 </dl>
+<a NAME="RP2040Device.addDeviceWifiEntries" ID="RP2040Device.addDeviceWifiEntries"></a>
+<h4>RP2040Device.addDeviceWifiEntries</h4>
+<b>addDeviceWifiEntries</b>(<i>menu</i>)
+
+<p>
+        Public method to add device specific entries to the given menu.
+</p>
+<dl>
+
+<dt><i>menu</i> (QMenu)</dt>
+<dd>
+reference to the context menu
+</dd>
+</dl>
 <a NAME="RP2040Device.canRunScript" ID="RP2040Device.canRunScript"></a>
 <h4>RP2040Device.canRunScript</h4>
 <b>canRunScript</b>(<i></i>)
@@ -324,6 +404,89 @@
 tuple of (bool, str)
 </dd>
 </dl>
+<a NAME="RP2040Device.checkInternet" ID="RP2040Device.checkInternet"></a>
+<h4>RP2040Device.checkInternet</h4>
+<b>checkInternet</b>(<i></i>)
+
+<p>
+        Public method to check, if the internet can be reached.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating reachability and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="RP2040Device.connectWifi" ID="RP2040Device.connectWifi"></a>
+<h4>RP2040Device.connectWifi</h4>
+<b>connectWifi</b>(<i>ssid, password</i>)
+
+<p>
+        Public method to connect a device to a WiFi network.
+</p>
+<dl>
+
+<dt><i>ssid</i> (str)</dt>
+<dd>
+name (SSID) of the WiFi network
+</dd>
+<dt><i>password</i> (str)</dt>
+<dd>
+password needed to connect
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing the connection status and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="RP2040Device.deactivateInterface" ID="RP2040Device.deactivateInterface"></a>
+<h4>RP2040Device.deactivateInterface</h4>
+<b>deactivateInterface</b>(<i>interface</i>)
+
+<p>
+        Public method to deactivate a given WiFi interface of the connected device.
+</p>
+<dl>
+
+<dt><i>interface</i> (str)</dt>
+<dd>
+designation of the interface to be deactivated (one of 'AP'
+            or 'STA')
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containg a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised to indicate a wrong value for the interface type
+</dd>
+</dl>
 <a NAME="RP2040Device.deviceName" ID="RP2040Device.deviceName"></a>
 <h4>RP2040Device.deviceName</h4>
 <b>deviceName</b>(<i></i>)
@@ -343,6 +506,25 @@
 str
 </dd>
 </dl>
+<a NAME="RP2040Device.disconnectWifi" ID="RP2040Device.disconnectWifi"></a>
+<h4>RP2040Device.disconnectWifi</h4>
+<b>disconnectWifi</b>(<i></i>)
+
+<p>
+        Public method to disconnect a device from the WiFi network.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <a NAME="RP2040Device.forceInterrupt" ID="RP2040Device.forceInterrupt"></a>
 <h4>RP2040Device.forceInterrupt</h4>
 <b>forceInterrupt</b>(<i></i>)
@@ -363,6 +545,26 @@
 bool
 </dd>
 </dl>
+<a NAME="RP2040Device.getConnectedClients" ID="RP2040Device.getConnectedClients"></a>
+<h4>RP2040Device.getConnectedClients</h4>
+<b>getConnectedClients</b>(<i></i>)
+
+<p>
+        Public method to get a list of connected clients.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+a tuple containing a list of tuples containing the client MAC-Address
+            and the RSSI (if supported and available) and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of ([(bytes, int)], str)
+</dd>
+</dl>
 <a NAME="RP2040Device.getDocumentationUrl" ID="RP2040Device.getDocumentationUrl"></a>
 <h4>RP2040Device.getDocumentationUrl</h4>
 <b>getDocumentationUrl</b>(<i></i>)
@@ -402,6 +604,33 @@
 list of tuple of (str, str)
 </dd>
 </dl>
+<a NAME="RP2040Device.getWifiData" ID="RP2040Device.getWifiData"></a>
+<h4>RP2040Device.getWifiData</h4>
+<b>getWifiData</b>(<i></i>)
+
+<p>
+        Public method to get data related to the current WiFi status.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple of three dictionaries containing the WiFi status data
+            for the WiFi client, access point and overall data
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (dict, dict, dict)
+</dd>
+</dl>
+<dl>
+
+<dt>Raises <b>OSError</b>:</dt>
+<dd>
+raised to indicate an issue with the device
+</dd>
+</dl>
 <a NAME="RP2040Device.hasFlashMenuEntry" ID="RP2040Device.hasFlashMenuEntry"></a>
 <h4>RP2040Device.hasFlashMenuEntry</h4>
 <b>hasFlashMenuEntry</b>(<i></i>)
@@ -421,6 +650,52 @@
 bool
 </dd>
 </dl>
+<a NAME="RP2040Device.hasWifi" ID="RP2040Device.hasWifi"></a>
+<h4>RP2040Device.hasWifi</h4>
+<b>hasWifi</b>(<i></i>)
+
+<p>
+        Public method to check the availability of WiFi.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating the availability of WiFi
+            and the WiFi type (picow or pimoroni)
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<dl>
+
+<dt>Raises <b>OSError</b>:</dt>
+<dd>
+raised to indicate an issue with the device
+</dd>
+</dl>
+<a NAME="RP2040Device.removeCredentials" ID="RP2040Device.removeCredentials"></a>
+<h4>RP2040Device.removeCredentials</h4>
+<b>removeCredentials</b>(<i></i>)
+
+<p>
+        Public method to remove the saved credentials from the connected device.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <a NAME="RP2040Device.runScript" ID="RP2040Device.runScript"></a>
 <h4>RP2040Device.runScript</h4>
 <b>runScript</b>(<i>script</i>)
@@ -435,6 +710,26 @@
 script to be executed
 </dd>
 </dl>
+<a NAME="RP2040Device.scanNetworks" ID="RP2040Device.scanNetworks"></a>
+<h4>RP2040Device.scanNetworks</h4>
+<b>scanNetworks</b>(<i></i>)
+
+<p>
+        Public method to scan for available WiFi networks.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing the list of available networks as a tuple of 'Name',
+            'MAC-Address', 'channel', 'RSSI' and 'security' and an error string
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (list of tuple of (str, str, int, int, str), str)
+</dd>
+</dl>
 <a NAME="RP2040Device.setButtons" ID="RP2040Device.setButtons"></a>
 <h4>RP2040Device.setButtons</h4>
 <b>setButtons</b>(<i></i>)
@@ -442,6 +737,95 @@
 <p>
         Public method to enable the supported action buttons.
 </p>
+<a NAME="RP2040Device.startAccessPoint" ID="RP2040Device.startAccessPoint"></a>
+<h4>RP2040Device.startAccessPoint</h4>
+<b>startAccessPoint</b>(<i>ssid, security=None, password=None, ifconfig=None</i>)
+
+<p>
+        Public method to start the access point interface.
+</p>
+<dl>
+
+<dt><i>ssid</i> (str)</dt>
+<dd>
+SSID of the access point
+</dd>
+<dt><i>security</i> (int (optional))</dt>
+<dd>
+security method (defaults to None)
+</dd>
+<dt><i>password</i> (str (optional))</dt>
+<dd>
+password (defaults to None)
+</dd>
+<dt><i>ifconfig</i> (tuple of (str, str, str, str))</dt>
+<dd>
+IPv4 configuration for the access point if not default
+            (IPv4 address, netmask, gateway address, DNS server address)
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="RP2040Device.stopAccessPoint" ID="RP2040Device.stopAccessPoint"></a>
+<h4>RP2040Device.stopAccessPoint</h4>
+<b>stopAccessPoint</b>(<i></i>)
+
+<p>
+        Public method to stop the access point interface.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containg a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
+<a NAME="RP2040Device.writeCredentials" ID="RP2040Device.writeCredentials"></a>
+<h4>RP2040Device.writeCredentials</h4>
+<b>writeCredentials</b>(<i>ssid, password</i>)
+
+<p>
+        Public method to write the given credentials to the connected device and modify
+        the start script to connect automatically.
+</p>
+<dl>
+
+<dt><i>ssid</i> (str)</dt>
+<dd>
+SSID of the network to connect to
+</dd>
+<dt><i>password</i> (str)</dt>
+<dd>
+password needed to authenticate
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing a flag indicating success and an error message
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bool, str)
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
--- a/src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonDeviceInterface.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonDeviceInterface.html	Sat Feb 25 19:18:07 2023 +0100
@@ -57,7 +57,7 @@
 <h3>Class Attributes</h3>
 
 <table>
-<tr><td>None</td></tr>
+<tr><td>PasteModePrompt</td></tr><tr><td>TracebackMarker</td></tr>
 </table>
 <h3>Class Methods</h3>
 
@@ -73,6 +73,22 @@
 <td>Constructor</td>
 </tr>
 <tr>
+<td><a href="#MicroPythonDeviceInterface.__execute_paste">__execute_paste</a></td>
+<td>Private method to send commands to the connected device using 'paste' mode and return the result.</td>
+</tr>
+<tr>
+<td><a href="#MicroPythonDeviceInterface.__execute_raw">__execute_raw</a></td>
+<td>Private method to send commands to the connected device using 'raw REPL' mode and return the result.</td>
+</tr>
+<tr>
+<td><a href="#MicroPythonDeviceInterface.__pasteOff">__pasteOff</a></td>
+<td>Private method to switch 'paste' mode off.</td>
+</tr>
+<tr>
+<td><a href="#MicroPythonDeviceInterface.__pasteOn">__pasteOn</a></td>
+<td>Private method to switch the connected device to 'paste' mode.</td>
+</tr>
+<tr>
 <td><a href="#MicroPythonDeviceInterface.__rawOff">__rawOff</a></td>
 <td>Private method to switch 'raw' mode off.</td>
 </tr>
@@ -101,6 +117,10 @@
 <td>Public method to execute a series of commands over a period of time without returning any result (asynchronous execution).</td>
 </tr>
 <tr>
+<td><a href="#MicroPythonDeviceInterface.executeAsyncPaste">executeAsyncPaste</a></td>
+<td>Public method to execute a series of commands over a period of time without returning any result (asynchronous execution).</td>
+</tr>
+<tr>
 <td><a href="#MicroPythonDeviceInterface.handlePreferencesChanged">handlePreferencesChanged</a></td>
 <td>Public slot to handle a change of the preferences.</td>
 </tr>
@@ -137,6 +157,105 @@
 reference to the parent object
 </dd>
 </dl>
+<a NAME="MicroPythonDeviceInterface.__execute_paste" ID="MicroPythonDeviceInterface.__execute_paste"></a>
+<h4>MicroPythonDeviceInterface.__execute_paste</h4>
+<b>__execute_paste</b>(<i>commands, timeout=0</i>)
+
+<p>
+        Private method to send commands to the connected device using 'paste' mode
+        and return the result.
+</p>
+<p>
+        If no serial connection is available, empty results will be returned.
+</p>
+<dl>
+
+<dt><i>commands</i> (str or list of str)</dt>
+<dd>
+list of commands to be executed
+</dd>
+<dt><i>timeout</i> (int (optional))</dt>
+<dd>
+per command timeout in milliseconds (0 for configured default)
+            (defaults to 0)
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing stdout and stderr output of the device
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bytes, bytes)
+</dd>
+</dl>
+<a NAME="MicroPythonDeviceInterface.__execute_raw" ID="MicroPythonDeviceInterface.__execute_raw"></a>
+<h4>MicroPythonDeviceInterface.__execute_raw</h4>
+<b>__execute_raw</b>(<i>commands, timeout=0</i>)
+
+<p>
+        Private method to send commands to the connected device using 'raw REPL' mode
+        and return the result.
+</p>
+<p>
+        If no serial connection is available, empty results will be returned.
+</p>
+<dl>
+
+<dt><i>commands</i> (str or list of str)</dt>
+<dd>
+list of commands to be executed
+</dd>
+<dt><i>timeout</i> (int (optional))</dt>
+<dd>
+per command timeout in milliseconds (0 for configured default)
+            (defaults to 0)
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+tuple containing stdout and stderr output of the device
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+tuple of (bytes, bytes)
+</dd>
+</dl>
+<a NAME="MicroPythonDeviceInterface.__pasteOff" ID="MicroPythonDeviceInterface.__pasteOff"></a>
+<h4>MicroPythonDeviceInterface.__pasteOff</h4>
+<b>__pasteOff</b>(<i></i>)
+
+<p>
+        Private method to switch 'paste' mode off.
+</p>
+<a NAME="MicroPythonDeviceInterface.__pasteOn" ID="MicroPythonDeviceInterface.__pasteOn"></a>
+<h4>MicroPythonDeviceInterface.__pasteOn</h4>
+<b>__pasteOn</b>(<i></i>)
+
+<p>
+        Private method to switch the connected device to 'paste' mode.
+</p>
+<p>
+        Note: switching to paste mode is done with synchronous writes.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+flag indicating success
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
+</dd>
+</dl>
 <a NAME="MicroPythonDeviceInterface.__rawOff" ID="MicroPythonDeviceInterface.__rawOff"></a>
 <h4>MicroPythonDeviceInterface.__rawOff</h4>
 <b>__rawOff</b>(<i></i>)
@@ -158,7 +277,12 @@
 <dt>Return:</dt>
 <dd>
 flag indicating success
-@rtype bool
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+bool
 </dd>
 </dl>
 <a NAME="MicroPythonDeviceInterface.__readSerial" ID="MicroPythonDeviceInterface.__readSerial"></a>
@@ -204,7 +328,7 @@
 </p>
 <a NAME="MicroPythonDeviceInterface.execute" ID="MicroPythonDeviceInterface.execute"></a>
 <h4>MicroPythonDeviceInterface.execute</h4>
-<b>execute</b>(<i>commands</i>)
+<b>execute</b>(<i>commands, *, mode="raw", timeout=0</i>)
 
 <p>
         Public method to send commands to the connected device and return the
@@ -219,6 +343,16 @@
 <dd>
 list of commands to be executed
 </dd>
+<dt><i>mode=</i> (str)</dt>
+<dd>
+submit mode to be used (one of 'raw' or 'paste') (defaults to
+            'raw')
+</dd>
+<dt><i>timeout=</i> (int (optional))</dt>
+<dd>
+per command timeout in milliseconds (0 for configured default)
+            (defaults to 0)
+</dd>
 </dl>
 <dl>
 <dt>Return:</dt>
@@ -232,6 +366,13 @@
 tuple of (bytes, bytes)
 </dd>
 </dl>
+<dl>
+
+<dt>Raises <b>ValueError</b>:</dt>
+<dd>
+raised in case of an unsupported submit mode
+</dd>
+</dl>
 <a NAME="MicroPythonDeviceInterface.executeAsync" ID="MicroPythonDeviceInterface.executeAsync"></a>
 <h4>MicroPythonDeviceInterface.executeAsync</h4>
 <b>executeAsync</b>(<i>commandsList</i>)
@@ -247,6 +388,21 @@
 list of commands to be execute on the device
 </dd>
 </dl>
+<a NAME="MicroPythonDeviceInterface.executeAsyncPaste" ID="MicroPythonDeviceInterface.executeAsyncPaste"></a>
+<h4>MicroPythonDeviceInterface.executeAsyncPaste</h4>
+<b>executeAsyncPaste</b>(<i>commandsList</i>)
+
+<p>
+        Public method to execute a series of commands over a period of time
+        without returning any result (asynchronous execution).
+</p>
+<dl>
+
+<dt><i>commandsList</i> (list of bytes)</dt>
+<dd>
+list of commands to be execute on the device
+</dd>
+</dl>
 <a NAME="MicroPythonDeviceInterface.handlePreferencesChanged" ID="MicroPythonDeviceInterface.handlePreferencesChanged"></a>
 <h4>MicroPythonDeviceInterface.handlePreferencesChanged</h4>
 <b>handlePreferencesChanged</b>(<i></i>)
--- a/src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonFileManagerWidget.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonFileManagerWidget.html	Sat Feb 25 19:18:07 2023 +0100
@@ -160,7 +160,7 @@
 </tr>
 <tr>
 <td><a href="#MicroPythonFileManagerWidget.on_deviceCwd_textChanged">on_deviceCwd_textChanged</a></td>
-<td>Public slot handling a change of the current device working directory.</td>
+<td>Private slot handling a change of the current device working directory.</td>
 </tr>
 <tr>
 <td><a href="#MicroPythonFileManagerWidget.on_deviceFileTreeWidget_itemActivated">on_deviceFileTreeWidget_itemActivated</a></td>
@@ -192,7 +192,7 @@
 </tr>
 <tr>
 <td><a href="#MicroPythonFileManagerWidget.on_localCwd_textChanged">on_localCwd_textChanged</a></td>
-<td>Public slot handling a change of the current local working directory.</td>
+<td>Private slot handling a change of the current local working directory.</td>
 </tr>
 <tr>
 <td><a href="#MicroPythonFileManagerWidget.on_localFileTreeWidget_itemActivated">on_localFileTreeWidget_itemActivated</a></td>
@@ -609,7 +609,7 @@
 <b>on_deviceCwd_textChanged</b>(<i>cwd</i>)
 
 <p>
-        Public slot handling a change of the current device working directory.
+        Private slot handling a change of the current device working directory.
 </p>
 <dl>
 
@@ -695,7 +695,7 @@
 <b>on_localCwd_textChanged</b>(<i>cwd</i>)
 
 <p>
-        Public slot handling a change of the current local working directory.
+        Private slot handling a change of the current local working directory.
 </p>
 <dl>
 
--- a/src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonSerialPort.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonSerialPort.html	Sat Feb 25 19:18:07 2023 +0100
@@ -177,7 +177,7 @@
 </dl>
 <a NAME="MicroPythonSerialPort.readUntil" ID="MicroPythonSerialPort.readUntil"></a>
 <h4>MicroPythonSerialPort.readUntil</h4>
-<b>readUntil</b>(<i>expected=b"\n", size=None</i>)
+<b>readUntil</b>(<i>expected=b"\n", size=None, timeout=0</i>)
 
 <p>
         Public method to read data until an expected sequence is found
@@ -189,9 +189,14 @@
 <dd>
 expected bytes sequence
 </dd>
-<dt><i>size</i> (int)</dt>
+<dt><i>size</i> (int (optional))</dt>
 <dd>
-maximum data to be read
+maximum data to be read (defaults to None)
+</dd>
+<dt><i>timeout</i> (int (optional))</dt>
+<dd>
+timeout in milliseconds (0 for configured default)
+            (defaults to 0)
 </dd>
 </dl>
 <dl>
--- a/src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonWidget.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/eric7.MicroPython.MicroPythonWidget.html	Sat Feb 25 19:18:07 2023 +0100
@@ -188,10 +188,6 @@
 <td>Private slot to open the documentation URL for the selected device.</td>
 </tr>
 <tr>
-<td><a href="#MicroPythonWidget.__showError">__showError</a></td>
-<td>Private method to show some error message.</td>
-</tr>
-<tr>
 <td><a href="#MicroPythonWidget.__showImplementation">__showImplementation</a></td>
 <td>Private slot to show some implementation related information.</td>
 </tr>
@@ -232,6 +228,10 @@
 <td>Public method to determine the port path of the selected device.</td>
 </tr>
 <tr>
+<td><a href="#MicroPythonWidget.getDevice">getDevice</a></td>
+<td>Public method to get a reference to the current device.</td>
+</tr>
+<tr>
 <td><a href="#MicroPythonWidget.getDeviceWorkspace">getDeviceWorkspace</a></td>
 <td>Public method to get the workspace directory of the device.</td>
 </tr>
@@ -283,6 +283,10 @@
 <td><a href="#MicroPythonWidget.setActionButtons">setActionButtons</a></td>
 <td>Public method to set the enabled state of the various action buttons.</td>
 </tr>
+<tr>
+<td><a href="#MicroPythonWidget.showError">showError</a></td>
+<td>Public method to show some error message.</td>
+</tr>
 </table>
 <h3>Static Methods</h3>
 
@@ -686,24 +690,6 @@
 <p>
         Private slot to open the documentation URL for the selected device.
 </p>
-<a NAME="MicroPythonWidget.__showError" ID="MicroPythonWidget.__showError"></a>
-<h4>MicroPythonWidget.__showError</h4>
-<b>__showError</b>(<i>method, error</i>)
-
-<p>
-        Private method to show some error message.
-</p>
-<dl>
-
-<dt><i>method</i> (str)</dt>
-<dd>
-name of the method the error occured in
-</dd>
-<dt><i>error</i> (str)</dt>
-<dd>
-error message
-</dd>
-</dl>
 <a NAME="MicroPythonWidget.__showImplementation" ID="MicroPythonWidget.__showImplementation"></a>
 <h4>MicroPythonWidget.__showImplementation</h4>
 <b>__showImplementation</b>(<i></i>)
@@ -854,6 +840,25 @@
 str
 </dd>
 </dl>
+<a NAME="MicroPythonWidget.getDevice" ID="MicroPythonWidget.getDevice"></a>
+<h4>MicroPythonWidget.getDevice</h4>
+<b>getDevice</b>(<i></i>)
+
+<p>
+        Public method to get a reference to the current device.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+reference to the current device
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+BaseDevice
+</dd>
+</dl>
 <a NAME="MicroPythonWidget.getDeviceWorkspace" ID="MicroPythonWidget.getDeviceWorkspace"></a>
 <h4>MicroPythonWidget.getDeviceWorkspace</h4>
 <b>getDeviceWorkspace</b>(<i></i>)
@@ -1041,6 +1046,24 @@
             are 'run', 'repl', 'files', 'chart', 'open', 'save'
 </dd>
 </dl>
+<a NAME="MicroPythonWidget.showError" ID="MicroPythonWidget.showError"></a>
+<h4>MicroPythonWidget.showError</h4>
+<b>showError</b>(<i>method, error</i>)
+
+<p>
+        Public method to show some error message.
+</p>
+<dl>
+
+<dt><i>method</i> (str)</dt>
+<dd>
+name of the method the error occured in
+</dd>
+<dt><i>error</i> (str)</dt>
+<dd>
+error message
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 </body></html>
\ No newline at end of file
--- a/src/eric7/Documentation/Source/eric7.Preferences.ConfigurationPages.MicroPythonPage.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/eric7.Preferences.ConfigurationPages.MicroPythonPage.html	Sat Feb 25 19:18:07 2023 +0100
@@ -63,6 +63,14 @@
 <td>Constructor</td>
 </tr>
 <tr>
+<td><a href="#MicroPythonPage.on_apShowPasswordButton_clicked">on_apShowPasswordButton_clicked</a></td>
+<td>Private slot to show or hide the WiFi Access Point password.</td>
+</tr>
+<tr>
+<td><a href="#MicroPythonPage.on_showPasswordButton_clicked">on_showPasswordButton_clicked</a></td>
+<td>Private slot to show or hide the WiFi client password.</td>
+</tr>
+<tr>
 <td><a href="#MicroPythonPage.save">save</a></td>
 <td>Public slot to save the MicroPython configuration.</td>
 </tr>
@@ -87,6 +95,34 @@
 reference to the parent widget
 </dd>
 </dl>
+<a NAME="MicroPythonPage.on_apShowPasswordButton_clicked" ID="MicroPythonPage.on_apShowPasswordButton_clicked"></a>
+<h4>MicroPythonPage.on_apShowPasswordButton_clicked</h4>
+<b>on_apShowPasswordButton_clicked</b>(<i>checked</i>)
+
+<p>
+        Private slot to show or hide the WiFi Access Point password.
+</p>
+<dl>
+
+<dt><i>checked</i> (bool)</dt>
+<dd>
+state of the button
+</dd>
+</dl>
+<a NAME="MicroPythonPage.on_showPasswordButton_clicked" ID="MicroPythonPage.on_showPasswordButton_clicked"></a>
+<h4>MicroPythonPage.on_showPasswordButton_clicked</h4>
+<b>on_showPasswordButton_clicked</b>(<i>checked</i>)
+
+<p>
+        Private slot to show or hide the WiFi client password.
+</p>
+<dl>
+
+<dt><i>checked</i> (bool)</dt>
+<dd>
+state of the button
+</dd>
+</dl>
 <a NAME="MicroPythonPage.save" ID="MicroPythonPage.save"></a>
 <h4>MicroPythonPage.save</h4>
 <b>save</b>(<i></i>)
--- a/src/eric7/Documentation/Source/index-eric7.EricNetwork.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/index-eric7.EricNetwork.html	Sat Feb 25 19:18:07 2023 +0100
@@ -36,6 +36,10 @@
 <td>Module implementing some helpers for Google mail.</td>
 </tr>
 <tr>
+<td><a href="eric7.EricNetwork.EricIPv4InputWidget.html">EricIPv4InputWidget</a></td>
+<td>Module implementing a widget to enter an IPv4 address.</td>
+</tr>
+<tr>
 <td><a href="eric7.EricNetwork.EricJsonClient.html">EricJsonClient</a></td>
 <td>Module implementing the JSON based client base class.</td>
 </tr>
--- a/src/eric7/Documentation/Source/index-eric7.MicroPython.Devices.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/index-eric7.MicroPython.Devices.html	Sat Feb 25 19:18:07 2023 +0100
@@ -22,6 +22,10 @@
 <td><a href="index-eric7.MicroPython.Devices.EspDialogs.html">EspDialogs</a></td>
 <td>Package implementing dialogs used by the EspDevices module.</td>
 </tr>
+<tr>
+<td><a href="index-eric7.MicroPython.Devices.MCUScripts.html">MCUScripts</a></td>
+<td>Package containing scripts for copying to the micro controller board.</td>
+</tr>
 </table>
 
 <h3>Modules</h3>
--- a/src/eric7/Documentation/Source/index-eric7.MicroPython.html	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/Documentation/Source/index-eric7.MicroPython.html	Sat Feb 25 19:18:07 2023 +0100
@@ -18,6 +18,10 @@
 <td><a href="index-eric7.MicroPython.Devices.html">Devices</a></td>
 <td>Package containing the device interface modules and device specific dialogs.</td>
 </tr>
+<tr>
+<td><a href="index-eric7.MicroPython.WifiDialogs.html">WifiDialogs</a></td>
+<td>Package implementing WiFi related dialogs.</td>
+</tr>
 </table>
 
 <h3>Modules</h3>
--- a/src/eric7/MicroPython/Devices/CircuitPythonDevices.py	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/MicroPython/Devices/CircuitPythonDevices.py	Sat Feb 25 19:18:07 2023 +0100
@@ -50,6 +50,8 @@
         """
         super().__init__(microPythonWidget, deviceType, parent)
 
+        self.submitMode = "paste"  # use 'paste' mode to avoid loosing state
+
         self.__boardName = boardName
         self.__workspace = self.__findWorkspace()
 
--- a/src/eric7/MicroPython/Devices/DeviceBase.py	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/MicroPython/Devices/DeviceBase.py	Sat Feb 25 19:18:07 2023 +0100
@@ -95,6 +95,8 @@
         self.microPython = microPythonWidget
         self._deviceData = {}  # dictionary with essential device data
 
+        self.submitMode = "raw"  # default is 'raw' mode to submit commands
+
     def setConnected(self, connected):
         """
         Public method to set the connection state.
@@ -319,6 +321,7 @@
             # user cancelled
             return ""
 
+    # TODO: add sending in 'paste' mode
     def sendCommands(self, commandsList):
         """
         Public method to send a list of commands to the device.
@@ -326,21 +329,25 @@
         @param commandsList list of commands to be sent to the device
         @type list of str
         """
-        rawOn = [  # sequence of commands to enter raw mode
-            b"\x02",  # Ctrl-B: exit raw repl (just in case)
-            b"\r\x03\x03\x03",  # Ctrl-C three times: interrupt any running
-            # program
-            b"\r\x01",  # Ctrl-A: enter raw REPL
-        ]
-        newLine = [
-            b'print("\\n")\r',
-        ]
-        commands = [c.encode("utf-8)") + b"\r" for c in commandsList]
-        commands.append(b"\r")
-        commands.append(b"\x04")
-        rawOff = [b"\x02", b"\x02"]
-        commandSequence = rawOn + newLine + commands + rawOff
-        self._interface.executeAsync(commandSequence)
+        if self.submitMode == "raw":
+            rawOn = [  # sequence of commands to enter raw mode
+                b"\x02",  # Ctrl-B: exit raw repl (just in case)
+                b"\r\x03\x03\x03",  # Ctrl-C three times: interrupt any running program
+                b"\r\x01",  # Ctrl-A: enter raw REPL
+            ]
+            newLine = [
+                b'print("\\n")\r',
+            ]
+            commands = [c.encode("utf-8)") + b"\r" for c in commandsList]
+            commands.append(b"\r")
+            commands.append(b"\x04")
+            rawOff = [b"\x02", b"\x02"]
+            commandSequence = rawOn + newLine + commands + rawOff
+            self._interface.executeAsync(commandSequence)
+        elif self.submitMode == "paste":
+            commands = b"\n".join([c.encode("utf-8)") for c in commandsList])
+            commandSequence = ["@PasteOn@", commands]
+            self._interface.executeAsyncPaste(commandSequence)
 
     @pyqtSlot()
     def handleDataFlood(self):
@@ -473,7 +480,7 @@
 """.format(
             dirname
         )
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
         return ast.literal_eval(out.decode("utf-8"))
@@ -525,7 +532,7 @@
 """.format(
             dirname, showHidden
         )
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
         fileslist = ast.literal_eval(out.decode("utf-8"))
@@ -553,7 +560,7 @@
 """.format(
                 dirname
             )
-            out, err = self._interface.execute(command)
+            out, err = self._interface.execute(command, mode=self.submitMode)
             if err:
                 raise OSError(self._shortError(err))
 
@@ -570,7 +577,7 @@
 print(__os_.getcwd())
 del __os_
 """
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
         return out.decode("utf-8").strip()
@@ -595,7 +602,7 @@
 """.format(
                 filename
             )
-            out, err = self._interface.execute(command)
+            out, err = self._interface.execute(command, mode=self.submitMode)
             if err:
                 raise OSError(self._shortError(err))
 
@@ -642,7 +649,7 @@
 """.format(
                 name, recursive, force
             )
-            out, err = self._interface.execute(command)
+            out, err = self._interface.execute(command, mode=self.submitMode)
             if err:
                 raise OSError(self._shortError(err))
             return ast.literal_eval(out.decode("utf-8"))
@@ -665,7 +672,7 @@
 """.format(
                 dirname
             )
-            out, err = self._interface.execute(command)
+            out, err = self._interface.execute(command, mode=self.submitMode)
             if err:
                 raise OSError(self._shortError(err))
 
@@ -692,7 +699,7 @@
 """.format(
                 dirname
             )
-            out, err = self._interface.execute(command)
+            out, err = self._interface.execute(command, mode=self.submitMode)
             if err:
                 raise OSError(self._shortError(err))
 
@@ -754,7 +761,7 @@
         )
         command = "\n".join(commands)
 
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
         return True
@@ -823,7 +830,7 @@
 """.format(
             deviceFileName
         )
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
 
@@ -862,7 +869,7 @@
 print(fsinfo())
 del __os_, fsinfo
 """
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
         infolist = ast.literal_eval(out.decode("utf-8"))
@@ -935,7 +942,7 @@
 print(res)
 del res, uname, __os_, __sys_
 """
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
         return ast.literal_eval(out.decode("utf-8"))
@@ -1042,9 +1049,9 @@
     res['ulab'] = None
 
 print(res)
-del res, __os_, __sys_
+del res, __os_, __sys_, uname
 """
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
         return ast.literal_eval(out.decode("utf-8"))
@@ -1058,7 +1065,7 @@
         @exception OSError raised to indicate an issue with the device
         """
         commands = ["help('modules')"]
-        out, err = self._interface.execute(commands)
+        out, err = self._interface.execute(commands, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
 
@@ -1100,7 +1107,7 @@
         del tm
     del __time_
 """
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             if b"NotImplementedError" in err:
                 return "&lt;unsupported&gt; &lt;unsupported&gt;"
@@ -1172,7 +1179,7 @@
                     now.tm_isdst,
                 ),
             )
-            out, err = self._interface.execute(command)
+            out, err = self._interface.execute(command, mode=self.submitMode)
             if err:
                 raise OSError(self._shortError(err))
 
--- a/src/eric7/MicroPython/Devices/EspDevices.py	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/MicroPython/Devices/EspDevices.py	Sat Feb 25 19:18:07 2023 +0100
@@ -717,7 +717,7 @@
 del wifi_status
 """
 
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
 
@@ -771,7 +771,9 @@
         )
 
         with EricOverrideCursor():
-            out, err = self._interface.execute(command, timeout=15000)
+            out, err = self._interface.execute(
+                command, mode=self.submitMode, timeout=15000
+            )
         if err:
             return False, err
 
@@ -808,7 +810,7 @@
 del disconnect_wifi
 """
 
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             return False, err
 
@@ -860,7 +862,7 @@
 del modify_boot
 """
 
-        out, err = self._interface.execute(nvsCommand)
+        out, err = self._interface.execute(nvsCommand, mode=self.submitMode)
         if err:
             return False, self.tr("Error saving credentials: {0}").format(err)
 
@@ -875,7 +877,7 @@
         except OSError as err:
             return False, self.tr("Error saving auto-connect script: {0}").format(err)
 
-        out, err = self._interface.execute(bootCommand)
+        out, err = self._interface.execute(bootCommand, mode=self.submitMode)
         if err:
             return False, self.tr("Error modifying 'boot.py': {0}").format(err)
 
@@ -904,7 +906,7 @@
 del delete_wifi_creds
 """
 
-        out, err = self._interface.execute(nvsCommand)
+        out, err = self._interface.execute(nvsCommand, mode=self.submitMode)
         if err:
             return False, self.tr("Error deleting credentials: {0}").format(err)
 
@@ -938,7 +940,7 @@
 del check_internet
 """
 
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             return False, err
 
@@ -969,7 +971,7 @@
 del scan_networks
 """
 
-        out, err = self._interface.execute(command, timeout=15000)
+        out, err = self._interface.execute(command, mode=self.submitMode, timeout=15000)
         if err:
             return [], err
 
@@ -1021,7 +1023,7 @@
             interface
         )
 
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             return False, err
         else:
@@ -1069,7 +1071,7 @@
             repr(ssid), security, repr(password), ifconfig
         )
 
-        out, err = self._interface.execute(command, timeout=15000)
+        out, err = self._interface.execute(command, mode=self.submitMode, timeout=15000)
         if err:
             return False, err
         else:
@@ -1104,7 +1106,7 @@
 del get_stations
 """
 
-        out, err = self._interface.execute(command, timeout=10000)
+        out, err = self._interface.execute(command, mode=self.submitMode, timeout=10000)
         if err:
             return [], err
 
--- a/src/eric7/MicroPython/Devices/MicrobitDevices.py	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/MicroPython/Devices/MicrobitDevices.py	Sat Feb 25 19:18:07 2023 +0100
@@ -601,7 +601,7 @@
 print(__os_.listdir())
 del __os_
 """
-            out, err = self._interface.execute(command)
+            out, err = self._interface.execute(command, mode=self.submitMode)
             if err:
                 raise OSError(self._shortError(err))
             return ast.literal_eval(out.decode("utf-8"))
@@ -649,7 +649,7 @@
 """.format(
                 showHidden
             )
-            out, err = self._interface.execute(command)
+            out, err = self._interface.execute(command, mode=self.submitMode)
             if err:
                 raise OSError(self._shortError(err))
             fileslist = ast.literal_eval(out.decode("utf-8"))
--- a/src/eric7/MicroPython/Devices/RP2040Devices.py	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/MicroPython/Devices/RP2040Devices.py	Sat Feb 25 19:18:07 2023 +0100
@@ -414,7 +414,7 @@
 print(has_wifi())
 del has_wifi
 """
-        out, err = self._interface.execute(command, timeout=10000)
+        out, err = self._interface.execute(command, mode=self.submitMode, timeout=10000)
         if err:
             raise OSError(self._shortError(err))
         return ast.literal_eval(out.decode("utf-8"))
@@ -477,7 +477,7 @@
         else:
             return super().getWifiData()
 
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             raise OSError(self._shortError(err))
 
@@ -548,7 +548,9 @@
             return super().connectWifi(ssid, password)
 
         with EricOverrideCursor():
-            out, err = self._interface.execute(command, timeout=15000)
+            out, err = self._interface.execute(
+                command, mode=self.submitMode, timeout=15000
+            )
         if err:
             return False, err
 
@@ -593,7 +595,7 @@
         else:
             return super().disconnectWifi()
 
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             return False, err
 
@@ -657,7 +659,7 @@
             return False, str(err)
 
         # modify boot.py
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             return False, err
 
@@ -711,7 +713,7 @@
         else:
             return super().checkInternet()
 
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             return False, err
 
@@ -755,7 +757,7 @@
         else:
             return super().scanNetworks()
 
-        out, err = self._interface.execute(command, timeout=15000)
+        out, err = self._interface.execute(command, mode=self.submitMode, timeout=15000)
         if err:
             return [], err
 
@@ -813,7 +815,7 @@
         else:
             return super().deactivateInterface(interface)
 
-        out, err = self._interface.execute(command)
+        out, err = self._interface.execute(command, mode=self.submitMode)
         if err:
             return False, err
         else:
@@ -874,7 +876,7 @@
         else:
             return super().startAccessPoint(ssid, security=security, password=password)
 
-        out, err = self._interface.execute(command, timeout=15000)
+        out, err = self._interface.execute(command, mode=self.submitMode, timeout=15000)
         if err:
             return False, err
         else:
@@ -921,7 +923,7 @@
         else:
             return super().checkInternet()
 
-        out, err = self._interface.execute(command, timeout=10000)
+        out, err = self._interface.execute(command, mode=self.submitMode, timeout=10000)
         if err:
             return [], err
 
@@ -954,7 +956,7 @@
                 repr(country)
             )
 
-            out, err = self._interface.execute(command)
+            out, err = self._interface.execute(command, mode=self.submitMode)
             if err:
                 self.microPython.showError("rp2.country()", err)
 
--- a/src/eric7/MicroPython/MicroPythonDeviceInterface.py	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/MicroPython/MicroPythonDeviceInterface.py	Sat Feb 25 19:18:07 2023 +0100
@@ -35,6 +35,9 @@
     executeAsyncFinished = pyqtSignal()
     dataReceived = pyqtSignal(bytes)
 
+    PasteModePrompt = b"=== "
+    TracebackMarker = b"Traceback (most recent call last):"
+
     def __init__(self, parent=None):
         """
         Constructor
@@ -107,6 +110,56 @@
         """
         self.__serial.isConnected() and self.__serial.write(data)
 
+    def __pasteOn(self):
+        """
+        Private method to switch the connected device to 'paste' mode.
+
+        Note: switching to paste mode is done with synchronous writes.
+
+        @return flag indicating success
+        @rtype bool
+        """
+        if not self.__serial:
+            return False
+
+        pasteMessage = b"paste mode; Ctrl-C to cancel, Ctrl-D to finish\r\n=== "
+        self.__serial.write(b"\x02")  # end raw mode if required
+        written = self.__serial.waitForBytesWritten(500)
+        # time out after 500ms if device is not responding
+        if not written:
+            return False
+        for _i in range(3):
+            # CTRL-C three times to break out of loops
+            self.__serial.write(b"\r\x03")
+            written = self.__serial.waitForBytesWritten(500)
+            # time out after 500ms if device is not responding
+            if not written:
+                return False
+            QThread.msleep(10)
+        self.__serial.readAll()  # read all data and discard it
+        self.__serial.write(b"\r\x05")  # send CTRL-E to enter paste mode
+        self.__serial.readUntil(pasteMessage)
+
+        if self.__serial.hasTimedOut():
+            # it timed out; try it again and than fail
+            self.__serial.write(b"\r\x05")  # send CTRL-E again
+            self.__serial.readUntil(pasteMessage)
+            if self.__serial.hasTimedOut():
+                return False
+
+        QCoreApplication.processEvents(
+            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+        )
+        self.__serial.readAll()  # read all data and discard it
+        return True
+
+    def __pasteOff(self):
+        """
+        Private method to switch 'paste' mode off.
+        """
+        if self.__serial:
+            self.__serial.write(b"\x04")  # send CTRL-D to cancel paste mode
+
     def __rawOn(self):
         """
         Private method to switch the connected device to 'raw' mode.
@@ -114,7 +167,7 @@
         Note: switching to raw mode is done with synchronous writes.
 
         @return flag indicating success
-        @@rtype bool
+        @rtype bool
         """
         if not self.__serial:
             return False
@@ -189,7 +242,7 @@
 
         return True
 
-    def execute(self, commands, timeout=0):
+    def execute(self, commands, *, mode="raw", timeout=0):
         """
         Public method to send commands to the connected device and return the
         result.
@@ -198,6 +251,36 @@
 
         @param commands list of commands to be executed
         @type str or list of str
+        @keyparam mode submit mode to be used (one of 'raw' or 'paste') (defaults to
+            'raw')
+        @type str
+        @keyparam timeout per command timeout in milliseconds (0 for configured default)
+            (defaults to 0)
+        @type int (optional)
+        @return tuple containing stdout and stderr output of the device
+        @rtype tuple of (bytes, bytes)
+        @exception ValueError raised in case of an unsupported submit mode
+        """
+        if mode not in ("paste", "raw"):
+            raise ValueError("Unsupported submit mode given ('{0}').".format(mode))
+
+        if mode == "raw":
+            return self.__execute_raw(commands, timeout=timeout)
+        elif mode == "paste":
+            return self.__execute_paste(commands, timeout=timeout)
+        else:
+            # just in case
+            return b"", b""
+
+    def __execute_raw(self, commands, timeout=0):
+        """
+        Private method to send commands to the connected device using 'raw REPL' mode
+        and return the result.
+
+        If no serial connection is available, empty results will be returned.
+
+        @param commands list of commands to be executed
+        @type str or list of str
         @param timeout per command timeout in milliseconds (0 for configured default)
             (defaults to 0)
         @type int (optional)
@@ -234,6 +317,7 @@
                 )
                 ok = self.__serial.readUntil(b"OK")
                 if ok != b"OK":
+                    self.__blockReadyRead = False
                     return (
                         b"",
                         "Expected 'OK', got '{0}', followed by '{1}'".format(
@@ -263,6 +347,76 @@
 
         return bytes(result), err
 
+    def __execute_paste(self, commands, timeout=0):
+        """
+        Private method to send commands to the connected device using 'paste' mode
+        and return the result.
+
+        If no serial connection is available, empty results will be returned.
+
+        @param commands list of commands to be executed
+        @type str or list of str
+        @param timeout per command timeout in milliseconds (0 for configured default)
+            (defaults to 0)
+        @type int (optional)
+        @return tuple containing stdout and stderr output of the device
+        @rtype tuple of (bytes, bytes)
+        """
+        if not self.__serial:
+            return b"", b""
+
+        if not self.__serial.isConnected():
+            return b"", b"Device not connected or not switched on."
+
+        if isinstance(commands, list):
+            commands = "\n".join(commands)
+
+        # switch on raw mode
+        self.__blockReadyRead = True
+        ok = self.__pasteOn()
+        if not ok:
+            self.__blockReadyRead = False
+            return (b"", b"Could not switch to raw mode. Is the device switched on?")
+
+        # send commands
+        QThread.msleep(10)
+        for command in commands.splitlines(keepends=True):
+            # send the data as single lines
+            commandBytes = command.encode("utf-8")
+            self.__serial.write(commandBytes)
+            QCoreApplication.processEvents(
+                QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents
+            )
+            QThread.msleep(10)
+            ok = self.__serial.readUntil(commandBytes)
+            if ok != commandBytes:
+                self.__blockReadyRead = False
+                return (
+                    b"",
+                    "Expected '{0}', got '{1}', followed by '{2}'".format(
+                        commandBytes, ok, self.__serial.readAll()
+                    ).encode("utf-8"),
+                )
+
+        # switch off paste mode causing the commands to be executed
+        self.__pasteOff()
+        QThread.msleep(10)
+        result = self.__serial.readUntil(b">>> ", timeout=timeout).replace(b">>> ", b"")
+        # read until Python prompt
+        if self.__serial.hasTimedOut():
+            self.__blockReadyRead = False
+            return b"", b"Timeout while processing commands."
+
+        if self.TracebackMarker in result:
+            errorIndex = result.find(self.TracebackMarker)
+            out, err = result[:errorIndex], result[errorIndex:]
+        else:
+            out = result.strip()
+            err = b""
+
+        self.__blockReadyRead = False
+        return out, err
+
     def executeAsync(self, commandsList):
         """
         Public method to execute a series of commands over a period of time
@@ -277,3 +431,25 @@
             QTimer.singleShot(2, lambda: self.executeAsync(commandsList))
         else:
             self.executeAsyncFinished.emit()
+
+    def executeAsyncPaste(self, commandsList):
+        """
+        Public method to execute a series of commands over a period of time
+        without returning any result (asynchronous execution).
+
+        @param commandsList list of commands to be execute on the device
+        @type list of bytes
+        """
+        if commandsList:
+            self.__blockReadyRead = True
+            command = commandsList.pop(0)
+            if command == "@PasteOn@":
+                self.__pasteOn()
+            else:
+                self.__serial.write(command)
+                self.__serial.readUntil(command)
+            QTimer.singleShot(2, lambda: self.executeAsyncPaste(commandsList))
+        else:
+            self.__blockReadyRead = False
+            self.__pasteOff()
+            self.executeAsyncFinished.emit()
--- a/src/eric7/MicroPython/MicroPythonWidget.py	Fri Feb 24 18:36:43 2023 +0100
+++ b/src/eric7/MicroPython/MicroPythonWidget.py	Sat Feb 25 19:18:07 2023 +0100
@@ -750,9 +750,10 @@
             if pasteText:
                 pasteText = pasteText.replace("\n\r", "\r")
                 pasteText = pasteText.replace("\n", "\r")
-                self.__interface.isConnected() and self.__interface.write(
-                    pasteText.encode("utf-8")
-                )
+                if self.__interface.isConnected():
+                    self.__interface.write(b"\x05")
+                    self.__interface.write(pasteText.encode("utf-8"))
+                    self.__interface.write(b"\x04")
 
     def eventFilter(self, obj, evt):
         """

eric ide

mercurial