diff --git a/docs/source/Plugin/P000_events.repl b/docs/source/Plugin/P000_events.repl index c76f996ef9..b23bac7025 100644 --- a/docs/source/Plugin/P000_events.repl +++ b/docs/source/Plugin/P000_events.repl @@ -196,6 +196,50 @@ Reboot endon + " + " + ``p2pNode#Connected`` + + Added: 2024-05-01 + + Triggered when a new ESPEasy p2p node has been seen. + N.B. Only for nodes with a valid unit ID (not 0) + + Eventvalues: + + - Unit ID + + - Node name + + - Build number/date + "," + + .. code-block:: none + + on p2pNode#Connected do + LogEntry,'ESPEasy p2p node %eventvalue1% added: %eventvalue2% with build %eventvalue3%' + endon + + " + " + ``p2pNode#Disconnected`` + + Added: 2024-05-01 + + Triggered when a ESPEasy p2p node has been removed from the nodes list. + N.B. Only for nodes with a valid unit ID (not 0) + + Eventvalues: + + - Unit ID + "," + + .. code-block:: none + + on p2pNode#Disconnected do + LogEntry,`ESPEasy p2p node %eventvalue1% not seen for a while` + endon + " " ``WiFi#Connected`` diff --git a/src/src/DataStructs/NodesHandler.cpp b/src/src/DataStructs/NodesHandler.cpp index 7766d205f1..1adc3bc978 100644 --- a/src/src/DataStructs/NodesHandler.cpp +++ b/src/src/DataStructs/NodesHandler.cpp @@ -10,6 +10,8 @@ #include "../Globals/ESPEasy_now_state.h" #endif +#include "../Globals/EventQueue.h" + #include "../DataTypes/NodeTypeID.h" #if FEATURE_MQTT @@ -28,6 +30,8 @@ #include "../Helpers/ESPEasy_time_calc.h" #include "../Helpers/Misc.h" #include "../Helpers/PeriodicalActions.h" +#include "../Helpers/StringConverter.h" +#include "../Helpers/StringGenerator_System.h" #define ESPEASY_NOW_ALLOWED_AGE_NO_TRACEROUTE 35000 @@ -99,6 +103,20 @@ bool NodesHandler::addNode(const NodeStruct& node) } } + if (isNewNode) { + if (Settings.UseRules && node.unit != 0) + { + // Generate event announcing new p2p node + // TODO TD-er: Maybe also add other info like ESP type, IP-address, etc? + eventQueue.addMove(strformat( + F("p2pNode#Connected=%d,'%s','%s'"), + node.unit, + node.getNodeName().c_str(), + formatSystemBuildNr(node.build).c_str() + )); + } + } + return isNewNode; } @@ -539,6 +557,11 @@ bool NodesHandler::refreshNodeList(unsigned long max_age_allowed, unsigned long& } #endif if (mustErase) { + if (Settings.UseRules && it->second.unit != 0) + { + // Add event about removing node from nodeslist. + eventQueue.addMove(strformat(F("p2pNode#Disconnected=%d"), it->second.unit)); + } { _nodes_mutex.lock(); it = _nodes.erase(it);