Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
cc2ec06
[Fixes] %iswifi% report status value instead of boolean
tonhuisman Apr 22, 2026
6cc5143
[Docs] Fix typo
tonhuisman Apr 23, 2026
0ad3c6b
[Ni]otifications] Add usesTLS flag to attributes and show in PluginList
tonhuisman Apr 24, 2026
033a8ea
[Ni]otifications] Add usesTLS flag to attributes and show in PluginList
tonhuisman Apr 25, 2026
7ddd503
[Network] Add define to select factory-default network adapter
tonhuisman Apr 25, 2026
2f5eb4c
[Custom] Add some missing #define variables to Custom-sample.h
tonhuisman Apr 25, 2026
ad4abaf
[Network] Fix struct initialization
tonhuisman Apr 25, 2026
6a9a0a8
[Settings] Fix waring for VariousBits_2
tonhuisman Apr 25, 2026
f320145
[Network] Add size-check for NetworkDriverStruct
tonhuisman Apr 25, 2026
dd87863
[Custom] Add secure Cloudflare DNS entries
tonhuisman Apr 25, 2026
fbeef3f
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman Apr 30, 2026
9899648
[Docs] Fix missing column for LoopTimerSetAndRun
tonhuisman Apr 30, 2026
cb3b886
[Dist] Update Espressif Flash Download tool to v3.9.10
tonhuisman May 3, 2026
da616cd
[Network] Allow network interfaces to be enabled on factory reset
tonhuisman May 4, 2026
8cb3a3f
[Network] Fix small typo
tonhuisman May 5, 2026
d1777b7
[P180] Add documentation for TCA9554 I/O extender to control relays
tonhuisman May 6, 2026
f44e7fd
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman May 9, 2026
c7415c3
[P073] Fix build with P073_DEBUG and BUILD_NO_DEBUG enabled
tonhuisman May 9, 2026
7209813
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman May 10, 2026
c4dba7e
[Build] uv: Activate the PENV, then install missing requirements there
tonhuisman May 10, 2026
421678e
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman May 11, 2026
e52122e
[C016] Remove Experimental label, clean up initialization
tonhuisman May 11, 2026
0d942d0
[Network] Initially collapse the Statistics section of the page
tonhuisman May 11, 2026
3dc43a3
Merge branch 'mega' of https://github.com/letscontrolit/ESPEasy into …
tonhuisman May 13, 2026
f9c4b72
[Build] Fix comment
tonhuisman May 13, 2026
6ce70cd
[Network] Allow to not default-enable WiFi interface
tonhuisman May 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
32 changes: 0 additions & 32 deletions dist/flash_download_tool_3.9.8/release_note.txt

This file was deleted.

1 change: 1 addition & 0 deletions docs/source/Plugin/P000_commands.repl
Original file line number Diff line number Diff line change
Expand Up @@ -402,6 +402,7 @@
LoopTimerSetAndRun

LoopTimerSetAndRun_ms","
:green:`Rules`","
Set a Loop-Timer using ``LoopTimerSet`` or ``LoopTimerSet_ms`` and immediately run the first iteration.

If a ``<nr of loops>`` value > 0 is included in the command, that count is decremented by 1 for the first iteration, as expected.
Expand Down
2 changes: 1 addition & 1 deletion docs/source/Plugin/P075.rst
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ Configure your development station as follows:
At the bottom of the Debug screen enable User MCU input and select your ESP8266's USB port.
If the Nextion display board is connected it will be ignored. It does NOT need to be removed.

You can now use the Nextion IDE instead of an actual HMI display board to test out your EPSEasy application.
You can now use the Nextion IDE instead of an actual HMI display board to test out your ESPEasy application.



Expand Down
56 changes: 56 additions & 0 deletions docs/source/Plugin/P180.rst
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ Example device configurations
* :ref:`sensirion-sdp-810-differential-pressure-sensor`
* :ref:`tf-luna-lidar-distance-sensor`
* :ref:`qmc6310-3-axis-magnetic-sensor`
* :ref:`tca9554-io-extender`

Configuration
-------------
Expand Down Expand Up @@ -610,6 +611,61 @@ To reduce the logging content, **Single event with all values** can be enabled,

|

.. _tca9554-io-extender:

TCA9554 8-port I/O extender
^^^^^^^^^^^^^^^^^^^^^^^^^^^

This I/O extender provides 8 input/output pins, as documented in the Texas Instruments `TCA9554 Datasheet <https://www.ti.com/lit/ds/symlink/tca9554.pdf>`_

Configuration below is intended to be used for a `Waveshare ESP32-S3-ETH-8DI-8RO <https://www.waveshare.com/wiki/ESP32-S3-ETH-8DI-8RO>`_ unit to control the relays.

The plugin should be configured with these settings:

* **I2C Address (Hex)**: ``0x20``

* **Output Data Type**: ``Double`` To activate this setting, the page must be submitted to show the extra input fields.

* **Values**: The names can be changed whatever is appropriate, they are not really used, though we need 2 cached command sequences.

* **I2C Init Commands**: ``write.u8.0x03.0x00;calc.1``: Initializes the extender for all pins as output (and return a non-zero value for successful initialization).

* **Cache-Name 1**: Use ``readout``, to match the rules, below, and the I2C Command sequence is cached for much improved execution-performance.

* **I2C Commands 1**: ``read.u8.0x01;eval;let.bits.%value%`` Read the current relay state, and store in rules variable ``bits`` (referenced as ``%v_bits%``).

* **Cache-Name 2**: Use ``writeout``, to match with the rules, below.

* **I2C Commands 2**: ``write.u8.0x01.%v_bits%`` Set then outputs as updated in ``%v_bits%``.

To reduce the logging content, **Single event with all values** can be enabled, to generate a single event ``<task-name>#All`` with all values as argument, and thus reduce the logging to a single line.

Rules to add
~~~~~~~~~~~~

As this is an output-only configuration, there must be some command(s) to control these outputs. These commands are handled by a single rule (event handler):

.. code-block:: none

On relay Do // Usage: event,"relay=1..8,0/1"
If %eventvalue1% > 0 And %eventvalue1% < 9 And (%eventvalue2|-1% = 0 Or %eventvalue2% = 1)
geni2c,exec,readout // Read all output bits into v_bits
Let,bits,{bitWrite:%eventvalue1%-1:%v_bits%:%eventvalue2%} // Update requested bit = relay
geni2c,exec,writeout // Write new state in v_bits to the outputs
// LogEntry,'Setting relay %eventvalue1% to state %eventvalue2%, bits: %v_bits%'
Endif
Endon

(The line with LogEntry can be uncommented to get some logging for test purposes)

To switch a relay on or off, this command syntax can be used:

``event,"relay=<1..8>,<1|0>"``

There are 8 relays on the device, so the matching number should be used, and the second argument ``1`` to set the relay to On, and ``0`` for Off.

|

Change log
----------

Expand Down
10 changes: 9 additions & 1 deletion docs/source/Reference/SystemVariable.rst
Original file line number Diff line number Diff line change
Expand Up @@ -241,9 +241,17 @@ More uses of these system variables can be seen in the rules section and formula

* ``0`` = disconnected
* ``1`` = Connected
* ``3`` = Got IP && Connected
* ``3`` = *Got IP && Connected (No longer reported since 2026-05-01)*
* ``7`` = Got IP && Connected && Completed to set all flags WiFi is initialized
- Yes
* - ``%iswifiap%``
- 1
- Status of WiFi AP mode
- Yes
* - ``%isppp%``
- 0
- Status of PPP Interface active (ESP32 only, with PPP Network Interface configured)
- Yes
* - ``%vcc%``
- 5.2
- VCC value, this is only available in the VCC builds of FW (with "VCC" in the file name).
Expand Down
30 changes: 30 additions & 0 deletions src/Custom-sample.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,15 @@
#define DEFAULT_AP_SUBNET 255, 255, 255, 0 // Enter IP address (comma separated) for AP (config) mode
#define DEFAULT_AP_KEY "configesp" // Enter network WPA key for AP (config) mode

// #define DEFAULT_AP_DNS 1,1,1,1 // Used by PPP/NAPT feature (mind the comma-separated parts!),
// Cloudflare DNS: 1.1.1.1 and 1.0.0.1 and 1.1.1.2 (secure) and 1.1.1.3 (censored)
// Alternatives
// Cleanbrowsing: 185.228.168.9 and 185.228.169.9
// Google Public DNS: 8.8.8.8 and 8.8.4.4
// Quad9: 9.9.9.9 and 149.112.112.112
// OpenDNS: 208.67.222.222 and 208.67.220.220
// Comodo Secure DNS: 8.26.56.26 and 8.20.247.20

// --- Wifi Client Mode -----------------------------------------------------------------------------
#define DEFAULT_SSID "MyHomeSSID" // Enter your network SSID
#define DEFAULT_KEY "MySuperSecretPassword" // Enter your network WPA key
Expand Down Expand Up @@ -295,6 +304,27 @@
// #define DEFAULT_PROVISIONING_PASS ""
#endif

/*
#######################################################################################################
Defining Ethernet & GPIO
#######################################################################################################
*/
// Actual values can be obtained from product documentation and ESPEasyDefaults.h
// #define DEFAULT_ETH_PHY_ADDR 0
// #define DEFAULT_ETH_PHY_TYPE 0 // See EthernetParameters.h enum EthPhyType_t
// #define DEFAULT_ETH_PIN_MDC -1
// #define DEFAULT_ETH_PIN_MDIO -1
// #define DEFAULT_ETH_PIN_POWER -1
// #define DEFAULT_ETH_CLOCK_MODE (0) // See EthernetParameters.h enum EthClockMode_t

// #define DEFAULT_NETWORK_MEDIUM ESPEasy::net::NetworkMedium_t::WIFI

// #define DEFAULT_ENABLED_NW001 1 // Enable NWPLUGIN_001, on factory reset/initial setup
// #define DEFAULT_ENABLED_NW002 1 // Enable NWPLUGIN_002, on factory reset/initial setup
// #define DEFAULT_ENABLED_NW003 1 // Enable NWPLUGIN_003, on factory reset/initial setup
// #define DEFAULT_ENABLED_NW004 1 // Enable NWPLUGIN_004, on factory reset/initial setup
// #define DEFAULT_ENABLED_NW005 1 // Enable NWPLUGIN_005, on factory reset/initial setup
// This list should be updated when adding new Network Interface plugins



Expand Down
27 changes: 22 additions & 5 deletions src/ESPEasy/net/DataStructs/NetworkDriverStruct.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,30 @@ namespace net {
\*********************************************************************************************/
struct NetworkDriverStruct
{
NetworkDriverStruct() = default;
NetworkDriverStruct() {
onlySingleInstance = 1;
}

bool onlySingleInstance = true;
bool alwaysPresent = false;
bool enabledOnFactoryReset = false;
networkIndex_t fixedNetworkIndex = INVALID_NETWORK_INDEX;
union {
struct {
uint8_t onlySingleInstance : 1; // Default true
uint8_t alwaysPresent : 1;
uint8_t enabledOnFactoryReset : 1;
uint8_t _unusedNetworkDriverStructBits0_03 : 1;
uint8_t _unusedNetworkDriverStructBits0_04 : 1;
uint8_t _unusedNetworkDriverStructBits0_05 : 1;
uint8_t _unusedNetworkDriverStructBits0_06 : 1;
uint8_t _unusedNetworkDriverStructBits0_07 : 1;

};

uint8_t _networkDriverStructBits0{};

};

networkIndex_t fixedNetworkIndex = INVALID_NETWORK_INDEX;

uint16_t _networkDriverStructPadding{};

};

Expand Down
27 changes: 15 additions & 12 deletions src/ESPEasy/net/_NW001_WiFi_STA.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@
# include "../net/Helpers/_NWPlugin_init.h"
# include "../net/NWPluginStructs/NW001_data_struct_WiFi_STA.h"
# include "../net/wifi/ESPEasyWifi.h"
#ifdef ESP8266
# include "../net/ESPEasyNetwork.h"
#endif
# ifdef ESP8266
# include "../net/ESPEasyNetwork.h"
# endif

#if FEATURE_TASKVALUE_UNIT_OF_MEASURE
# include "../../src/Helpers/ESPEasy_UnitOfMeasure.h"
#endif
# if FEATURE_TASKVALUE_UNIT_OF_MEASURE
# include "../../src/Helpers/ESPEasy_UnitOfMeasure.h"
# endif


# if FEATURE_STORE_CREDENTIALS_SEPARATE_FILE
Expand Down Expand Up @@ -57,11 +57,13 @@ bool NWPlugin_001(NWPlugin::Function function, EventStruct *event, String& strin
{
case NWPlugin::Function::NWPLUGIN_DRIVER_ADD:
{
NetworkDriverStruct& nw = getNetworkDriverStruct(networkDriverIndex_t::toNetworkDriverIndex(event->idx));
nw.onlySingleInstance = true;
nw.alwaysPresent = true;
NetworkDriverStruct& nw = getNetworkDriverStruct(networkDriverIndex_t::toNetworkDriverIndex(event->idx));
nw.onlySingleInstance = true;
nw.alwaysPresent = true;
# if DEFAULT_ENABLED_NW001
nw.enabledOnFactoryReset = true;
nw.fixedNetworkIndex = NWPLUGIN_ID_001 - 1; // Start counting at 0
# endif
nw.fixedNetworkIndex = NWPLUGIN_ID_001 - 1; // Start counting at 0
break;
}

Expand Down Expand Up @@ -94,7 +96,7 @@ bool NWPlugin_001(NWPlugin::Function function, EventStruct *event, String& strin

case NWPlugin::Function::NWPLUGIN_CREDENTIALS_CHANGED:
{
// ESPEasy::net::wifi::WiFi_AP_Candidates.force_reload(); // Force reload of the credentials and found APs from the last scan
// ESPEasy::net::wifi::WiFi_AP_Candidates.force_reload(); // Force reload of the credentials and found APs from the last scan

break;
}
Expand All @@ -106,6 +108,7 @@ bool NWPlugin_001(NWPlugin::Function function, EventStruct *event, String& strin

if (NW_data) {
auto runtime_data = NW_data->getNWPluginData_static_runtime();

if (runtime_data) {
success = runtime_data->connected();
}
Expand Down Expand Up @@ -482,7 +485,7 @@ bool NWPlugin_001(NWPlugin::Function function, EventStruct *event, String& strin

addFormNumericBox(LabelType::WIFI_NR_RECONNECT_ATTEMPTS, 0, 255);
{
LabelType::Enum labels[]{
LabelType::Enum labels[]{
LabelType::RESTART_WIFI_LOST_CONN
, LabelType::WIFI_USE_LAST_CONN_FROM_RTC
# ifndef ESP32
Expand Down
10 changes: 6 additions & 4 deletions src/ESPEasy/net/_NW002_WiFi_AP.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,12 @@ bool NWPlugin_002(NWPlugin::Function function, EventStruct *event, String& strin
case NWPlugin::Function::NWPLUGIN_DRIVER_ADD:
{
NetworkDriverStruct& nw = getNetworkDriverStruct(networkDriverIndex_t::toNetworkDriverIndex(event->idx));
nw.onlySingleInstance = true;
nw.alwaysPresent = true;
nw.onlySingleInstance = true;
nw.alwaysPresent = true;
# if DEFAULT_ENABLED_NW002
nw.enabledOnFactoryReset = true;
nw.fixedNetworkIndex = NWPLUGIN_ID_002 - 1; // Start counting at 0
# endif
nw.fixedNetworkIndex = NWPLUGIN_ID_002 - 1; // Start counting at 0
break;
}

Expand Down Expand Up @@ -288,7 +290,7 @@ bool NWPlugin_002(NWPlugin::Function function, EventStruct *event, String& strin
,169 // 5 GHz U-NII-3/4
,173, 177 // 5 GHz U-NII-4
};
// *INDENT-ON*
// *INDENT-ON*
constexpr int nrwifiChannels = NR_ELEMENTS(wifiChannels);
const FormSelectorOptions selector(
nrwifiChannels,
Expand Down
5 changes: 4 additions & 1 deletion src/ESPEasy/net/_NW003_ETH_RMII.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ bool NWPlugin_003(NWPlugin::Function function, EventStruct *event, String& strin
nw.enabledOnFactoryReset = true;
nw.fixedNetworkIndex = NWPLUGIN_ID_003 - 1; // Start counting at 0
# else // ifdef ESP32P4
# if DEFAULT_ENABLED_NW003
nw.enabledOnFactoryReset = true;
# endif
nw.alwaysPresent = false;
# endif // ifdef ESP32P4
break;
Expand All @@ -46,7 +49,7 @@ bool NWPlugin_003(NWPlugin::Function function, EventStruct *event, String& strin
{
// Make sure the first listed Eth device is default set to have the highest route prio
Settings.setRoutePrio_for_network(
event->NetworkIndex,
event->NetworkIndex,
DEFAULT_ETH_ROUTE_PRIO - (5 * event->NetworkIndex));
Settings.setNetworkInterfaceSubnetBlockClientIP(event->NetworkIndex, false);
Settings.setNetworkInterfaceStartupDelay(event->NetworkIndex, 500 * event->NetworkIndex);
Expand Down
3 changes: 3 additions & 0 deletions src/ESPEasy/net/_NW004_ETH_SPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ bool NWPlugin_004(NWPlugin::Function function, EventStruct *event, String& strin
NetworkDriverStruct& nw = getNetworkDriverStruct(networkDriverIndex_t::toNetworkDriverIndex(event->idx));
nw.onlySingleInstance = true;
nw.alwaysPresent = false;
# if DEFAULT_ENABLED_NW004
nw.enabledOnFactoryReset = true;
# endif
break;
}

Expand Down
3 changes: 3 additions & 0 deletions src/ESPEasy/net/_NW005_PPP_modem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ bool NWPlugin_005(NWPlugin::Function function, EventStruct *event, String& strin
NetworkDriverStruct& nw = getNetworkDriverStruct(networkDriverIndex_t::toNetworkDriverIndex(event->idx));
nw.onlySingleInstance = true;
nw.alwaysPresent = false;
# if DEFAULT_ENABLED_NW005
nw.enabledOnFactoryReset = true;
# endif
break;
}

Expand Down
15 changes: 5 additions & 10 deletions src/_C016.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@

# define CPLUGIN_016
# define CPLUGIN_ID_016 16
# define CPLUGIN_NAME_016 "Cache Controller [Experimental]"
# define CPLUGIN_NAME_016 "Cache Controller"

// #include <ArduinoJson.h>

Expand All @@ -46,19 +46,12 @@ bool CPlugin_016(CPlugin::Function function, struct EventStruct *event, String&
case CPlugin::Function::CPLUGIN_PROTOCOL_ADD:
{
ProtocolStruct& proto = getProtocolStruct(event->idx); // = CPLUGIN_ID_016;
proto.usesMQTT = false;
proto.usesTemplate = false;
proto.usesAccount = false;
proto.usesPassword = false;
proto.usesExtCreds = false;
proto.defaultPort = 80;
proto.usesID = false;
proto.usesHost = false;
proto.usesPort = false;
proto.usesQueue = false;
proto.usesCheckReply = false;
proto.usesTimeout = false;
proto.usesSampleSets = false;
proto.needsNetwork = false;
proto.allowsExpire = false;
proto.allowLocalSystemTime = true;
Expand Down Expand Up @@ -115,10 +108,12 @@ bool CPlugin_016(CPlugin::Function function, struct EventStruct *event, String&
uint8_t valueCount = getValueCountForTask(event->TaskIndex);

if (event->timestamp_sec == 0) {
if (C016_allowLocalSystemTime)
if (C016_allowLocalSystemTime) {
event->setLocalTimeTimestamp();
else
}
else {
event->setUnixTimeTimestamp();
}
}
const C016_queue_element element(
event,
Expand Down
Loading