From d23346165e1baefd337ed805d3a211e5bead53af Mon Sep 17 00:00:00 2001 From: NP v/d Spek Date: Sat, 23 Nov 2024 15:54:52 +0100 Subject: [PATCH] rework peer mac_address opdate. adding static peer option. --- esphome/components/espnow/__init__.py | 161 ++++++++++++-------------- esphome/components/espnow/espnow.cpp | 67 ++++------- esphome/components/espnow/espnow.h | 63 +++++----- esphome/components/espnow/test1.yaml | 12 +- esphome/components/espnow/test2.yaml | 40 +++++-- 5 files changed, 171 insertions(+), 172 deletions(-) diff --git a/esphome/components/espnow/__init__.py b/esphome/components/espnow/__init__.py index 97788f0a0a..c6490fa1e1 100644 --- a/esphome/components/espnow/__init__.py +++ b/esphome/components/espnow/__init__.py @@ -1,8 +1,13 @@ -from esphome import automation +from esphome import automation, core import esphome.codegen as cg import esphome.config_validation as cv -from esphome.const import CONF_COMMAND, CONF_ID, CONF_PAYLOAD, CONF_TRIGGER_ID -from esphome.core import CORE +from esphome.const import ( + CONF_COMMAND, + CONF_ID, + CONF_MAC_ADDRESS, + CONF_PAYLOAD, + CONF_TRIGGER_ID, +) CODEOWNERS = ["@nielsnl68", "@jesserockz"] @@ -13,7 +18,7 @@ ESPNowProtocol = espnow_ns.class_("ESPNowProtocol") ESPNowListener = espnow_ns.class_("ESPNowListener") ESPNowPacket = espnow_ns.class_("ESPNowPacket") -ESPNowPeer = espnow_ns.class_("Peer") +ESPNowPeer = cg.uint64 ESPNowPacketConst = ESPNowPacket.operator("const") @@ -36,7 +41,7 @@ SendAction = espnow_ns.class_("SendAction", automation.Action) NewPeerAction = espnow_ns.class_("NewPeerAction", automation.Action) DelPeerAction = espnow_ns.class_("DelPeerAction", automation.Action) SetKeeperAction = espnow_ns.class_("SetKeeperAction", automation.Action) - +SetStaticPeerAction = espnow_ns.class_("SetStaticPeerAction", automation.Action) CONF_AUTO_ADD_PEER = "auto_add_peer" CONF_CONFORMATION_TIMEOUT = "conformation_timeout" @@ -47,21 +52,19 @@ CONF_ON_BROADCAST = "on_broadcast" CONF_ON_SENT = "on_sent" CONF_ON_NEW_PEER = "on_new_peer" CONF_PEER = "peer" -CONF_PEERS = "peers" +CONF_PEER_ID = "peer_id" +CONF_PREDEFINED_PEERS = "predefined_peers" CONF_USE_SENT_CHECK = "use_sent_check" CONF_WIFI_CHANNEL = "wifi_channel" CONF_PROTOCOL_MODE = "protocol_mode" -CONF_KEEPER = "keeper" - -CONF_MAC_CHARS = "0123456789-AbCdEfGhIjKlMnOpQrStUvWxYz+aBcDeFgHiJkLmNoPqRsTuVwXyZ" validate_command = cv.Range(min=1, max=250) ESPNowProtocol_mode = espnow_ns.enum("ESPNowProtocol_mode") ENUM_MODE = { - "universal": ESPNowProtocol_mode.universal, - "keeper": ESPNowProtocol_mode.keeper, - "drudge": ESPNowProtocol_mode.drudge, + "universal": ESPNowProtocol_mode.pm_universal, + "keeper": ESPNowProtocol_mode.pm_keeper, + "drudge": ESPNowProtocol_mode.pm_drudge, } @@ -75,48 +78,19 @@ def validate_raw_data(value): ) -def convert_mac_address(value): - parts = value.split(":") - if len(parts) != 6: - raise cv.Invalid("MAC Address must consist of 6 : (colon) separated parts") - parts_int = 0 - if any(len(part) != 2 for part in parts): - raise cv.Invalid("MAC Address must be format XX:XX:XX:XX:XX:XX") - for part in parts: - try: - parts_int = (parts_int << 8) + int(part, 16) - except ValueError: - # pylint: disable=raise-missing-from - raise cv.Invalid( - "MAC Address parts must be hexadecimal values from 00 to FF" - ) - return parts_int +def espnow_hex(mac_address): + it = reversed(mac_address.parts) + num = "".join(f"{part:02X}" for part in it) + return cg.RawExpression(f"0x{num}ULL") -def validate_peer(value): - if isinstance(value, (int)): - return value - - value = cv.string_strict(value) - - if value.lower() == CONF_KEEPER: - return 0x0 - - if value.find(":") != -1: - return convert_mac_address(value) - - if len(value) == 8: - mac = 0 - for x in range(8, 0, -1): - n = CONF_MAC_CHARS.find(value[x - 1]) - if n == -1: - raise cv.Invalid(f"peer code is invalid. ({value}|{x})") - mac = (mac << 6) + n - return mac - - raise cv.Invalid( - f"peer code '{value}' needs to be 8 characters width, or a valid Mac address or a hexidacimal value of 12 chars width starting with '0x'" - ) +DEFINE_PEER_CONFIG = cv.maybe_simple_value( + { + cv.Optional(CONF_PEER_ID): cv.declare_id(ESPNowPeer), + cv.Required(CONF_MAC_ADDRESS): cv.mac_address, + }, + key=CONF_MAC_ADDRESS, +) CONFIG_SCHEMA = cv.Schema( @@ -126,10 +100,10 @@ CONFIG_SCHEMA = cv.Schema( cv.Optional(CONF_AUTO_ADD_PEER, default=False): cv.boolean, cv.Optional(CONF_USE_SENT_CHECK, default=True): cv.boolean, cv.Optional( - CONF_CONFORMATION_TIMEOUT, default="5000ms" + CONF_CONFORMATION_TIMEOUT, default="5s" ): cv.positive_time_period_milliseconds, cv.Optional(CONF_RETRIES, default=5): cv.int_range(min=1, max=10), - cv.Optional(CONF_KEEPER): cv.templatable(validate_peer), + cv.Optional(CONF_PREDEFINED_PEERS): cv.ensure_list(DEFINE_PEER_CONFIG), cv.Optional(CONF_ON_RECEIVE): automation.validate_automation( { cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ESPNowReceiveTrigger), @@ -154,7 +128,6 @@ CONFIG_SCHEMA = cv.Schema( cv.Optional(CONF_COMMAND): validate_command, } ), - cv.Optional(CONF_PEERS): cv.ensure_list(validate_peer), }, cv.only_on_esp32, ).extend(cv.COMPONENT_SCHEMA) @@ -164,7 +137,7 @@ async def to_code(config): var = cg.new_Pvariable(config[CONF_ID]) await cg.register_component(var, config) - if CORE.using_arduino: + if core.CORE.using_arduino: cg.add_library("WiFi", None) cg.add_define("USE_ESPNOW") @@ -175,12 +148,11 @@ async def to_code(config): cg.add(var.set_conformation_timeout(config[CONF_CONFORMATION_TIMEOUT])) cg.add(var.set_retries(config[CONF_RETRIES])) - if CONF_KEEPER in config: - template_ = await cg.templatable(config[CONF_KEEPER], [], cg.uint64) - cg.add(var.set_keeper(template_)) - - for conf in config.get(CONF_PEERS, []): - cg.add(var.add_peer(conf)) + for conf in config.get(CONF_PREDEFINED_PEERS, []): + mac = espnow_hex(conf.get(CONF_MAC_ADDRESS)) + if CONF_PEER_ID in conf: + cg.new_variable(conf[CONF_PEER_ID], mac) + cg.add(var.add_peer(mac)) for conf in config.get(CONF_ON_SENT, []): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) @@ -233,6 +205,25 @@ async def register_protocol(var, config): cg.add(var.set_protocol_mode(config[CONF_PROTOCOL_MODE])) +def validate_peer(value): + if isinstance(value, cv.Lambda): + return cv.returning_lambda(value) + if value.find(":") != -1: + return cv.mac_address(value) + return cv.use_id(ESPNowPeer)(value) + + +async def register_peer(var, config, args): + peer = config.get(CONF_MAC_ADDRESS, 0xFFFFFFFFFFFF) + if isinstance(peer, core.MACAddress): + peer = espnow_hex(peer) + if isinstance(peer, core.ID): + peer = await cg.get_variable(peer) + + template_ = await cg.templatable(peer, args, cg.uint64) + cg.add(var.set_mac_address(template_)) + + @automation.register_action( "espnow.broadcast", SendAction, @@ -240,7 +231,7 @@ async def register_protocol(var, config): { cv.GenerateID(): cv.use_id(ESPNowComponent), cv.Required(CONF_PAYLOAD): cv.templatable(validate_raw_data), - cv.Optional(CONF_COMMAND, default=0): cv.templatable(validate_command), + cv.Optional(CONF_COMMAND): cv.templatable(validate_command), }, key=CONF_PAYLOAD, ), @@ -251,9 +242,9 @@ async def register_protocol(var, config): cv.Schema( { cv.GenerateID(): cv.use_id(ESPNowComponent), - cv.Required(CONF_PEER): cv.templatable(validate_peer), + cv.Required(CONF_MAC_ADDRESS): validate_peer, cv.Required(CONF_PAYLOAD): cv.templatable(validate_raw_data), - cv.Optional(CONF_COMMAND, default=0): cv.templatable(validate_command), + cv.Optional(CONF_COMMAND): cv.templatable(validate_command), } ), ) @@ -261,13 +252,11 @@ async def send_action(config, action_id, template_arg, args): var = cg.new_Pvariable(action_id, template_arg) await cg.register_parented(var, config[CONF_ID]) - peer = config.get(CONF_PEER, 0xFFFFFFFFFFFF) - template_ = await cg.templatable(peer, args, cg.uint64) - cg.add(var.set_peer(template_)) + await register_peer(var, config, args) - command = config.get(CONF_COMMAND, 0) - template_ = await cg.templatable(command, args, cg.uint8) - cg.add(var.set_command(template_)) + if command := config.get(CONF_COMMAND): + template_ = await cg.templatable(command, args, cg.uint8) + cg.add(var.set_command(template_)) data = config.get(CONF_PAYLOAD, []) if isinstance(data, bytes): @@ -281,14 +270,14 @@ async def send_action(config, action_id, template_arg, args): @automation.register_action( - "espnow.peer.new", + "espnow.peer.add", NewPeerAction, cv.maybe_simple_value( { cv.GenerateID(): cv.use_id(ESPNowComponent), - cv.Required(CONF_PEER): cv.templatable(validate_peer), + cv.Required(CONF_MAC_ADDRESS): validate_peer, }, - key=CONF_PEER, + key=CONF_MAC_ADDRESS, ), ) @automation.register_action( @@ -297,25 +286,29 @@ async def send_action(config, action_id, template_arg, args): cv.maybe_simple_value( { cv.GenerateID(): cv.use_id(ESPNowComponent), - cv.Required(CONF_PEER): cv.templatable(validate_peer), + cv.Required(CONF_MAC_ADDRESS): validate_peer, }, - key=CONF_PEER, + key=CONF_MAC_ADDRESS, ), ) @automation.register_action( - "espnow.keeper.set", - SetKeeperAction, - cv.maybe_simple_value( + "espnow.static.peer", + SetStaticPeerAction, + cv.Schema( { cv.GenerateID(): cv.use_id(ESPNowComponent), - cv.Required(CONF_PEER): cv.templatable(validate_peer), - }, - key=CONF_PEER, + cv.Required(CONF_PEER_ID): cv.use_id(ESPNowPeer), + cv.Required(CONF_MAC_ADDRESS): validate_peer, + } ), ) async def peer_action(config, action_id, template_arg, args): var = cg.new_Pvariable(action_id, template_arg) await cg.register_parented(var, config[CONF_ID]) - template_ = await cg.templatable(config[CONF_PEER], args, cg.uint64) - cg.add(var.set_peer(template_)) + if peer_id := config.get(CONF_PEER_ID): + peer = await cg.get_variable(peer_id) + cg.add(var.set_peer_id(peer)) + + await register_peer(var, config, args) + return var diff --git a/esphome/components/espnow/espnow.cpp b/esphome/components/espnow/espnow.cpp index d5e95eecf9..d988cc997b 100644 --- a/esphome/components/espnow/espnow.cpp +++ b/esphome/components/espnow/espnow.cpp @@ -29,34 +29,23 @@ static const size_t SEND_BUFFER_SIZE = 200; ESPNowComponent *ESPNowComponent::static_{nullptr}; // NOLINT -std::string espnow_encode_peer(uint64_t peer) { - if (peer == FAILED) { +void show_packet(const std::string &title, const ESPNowPacket &packet) { + ESP_LOGV(TAG, "%s packet. Peer: '%s', Protocol:%c%c%c-%02x, Sequents: %d.%d, Size: %d, Valid: %s", title.c_str(), + packet.get_peer_code().c_str(), packet.at(3), packet.at(4), packet.at(5), packet.at(6), packet.at(7), + packet.attempts, packet.content_size(), packet.is_valid() ? "Yes" : "No"); +} + +std::string peer_str(const uint64_t peer) { + char mac[24]; + if (peer == 0) return "[Not Set]"; - } else if (peer == ESPNOW_BROADCAST_ADDR) - return "[BroadCast]"; - - std::string str1 = ""; - str1.reserve(8); - do { - str1.push_back(chars[peer & 63]); // Add on the left - peer = peer >> 6; - } while (peer != 0); - return str1; -}; - -uint64_t espnow_decode_peer(std::string peer) { - uint64_t mac = 0; - if (peer.size() != 8) - return FAILED; - - for (int pos = peer.size(); pos > 0; pos--) { - char *p = strchr(chars, peer[pos - 1]); - if (p == nullptr) - return FAILED; - mac = (mac << 6) + (p - chars); - } + if (peer == ESPNOW_BROADCAST_ADDR) + return "[Broadcast]"; + uint8_t *peer_ = (uint8_t *) &peer; + snprintf(mac, sizeof(mac), "%02X:%02X:%02X:%02X:%02X:%02X", peer_[0], peer_[1], peer_[2], peer_[3], peer_[4], + peer_[5]); return mac; -}; +} /* ESPNowComponent ********************************************************************** */ @@ -65,8 +54,7 @@ ESPNowComponent::ESPNowComponent() { ESPNowComponent::static_ = this; } // NOLI void ESPNowComponent::dump_config() { ESP_LOGCONFIG(TAG, "esp_now:"); - ESP_LOGCONFIG(TAG, " Own Peer code: %s.", espnow_encode_peer(this->own_peer_address_).c_str()); - ESP_LOGCONFIG(TAG, " Keeper Peer code: %s.", espnow_encode_peer(this->get_keeper()).c_str()); + ESP_LOGCONFIG(TAG, " Own Peer code: %s.", peer_str(this->own_peer_address_).c_str()); ESP_LOGCONFIG(TAG, " Wifi channel: %d.", this->wifi_channel_); ESP_LOGCONFIG(TAG, " Auto add new peers: %s.", this->auto_add_peer_ ? "Yes" : "No"); ESP_LOGCONFIG(TAG, " Use sent status: %s.", this->use_sent_check_ ? "Yes" : "No"); @@ -74,13 +62,6 @@ void ESPNowComponent::dump_config() { ESP_LOGCONFIG(TAG, " Send retries: %d.", this->retries_); } -void ESPNowComponent::show_packet(const std::string &title, const ESPNowPacket &packet) { - ESP_LOGV(TAG, "%s packet. Peer: '%s', Header: %c%c%c, Protocol:%c%c%c-%02x, Sequents: %d.%d, Size: %d, Valid: %s", - title.c_str(), packet.get_peer_code().c_str(), packet.at(0), packet.at(1), packet.at(2), packet.at(3), - packet.at(4), packet.at(5), packet.at(6), packet.at(7), packet.attempts, packet.content_size(), - packet.is_valid() ? "Yes" : "No"); -} - bool ESPNowComponent::validate_channel_(uint8_t channel) { wifi_country_t g_self_country; esp_wifi_get_country(&g_self_country); @@ -146,9 +127,6 @@ void ESPNowComponent::setup() { for (auto id : this->peers_) { this->add_peer(id); } - if (this->get_keeper() != 0) { - this->add_peer(this->get_keeper()); - } this->send_queue_ = xQueueCreate(SEND_BUFFER_SIZE, sizeof(ESPNowPacket)); if (this->send_queue_ == nullptr) { @@ -362,7 +340,8 @@ void ESPNowComponent::on_data_received(const uint8_t *addr, const uint8_t *data, } else { packet.timestamp = millis(); } - ESPNowComponent::static_->show_packet("Receive", packet); + + show_packet("Receive", packet); if (packet.is_valid()) { xQueueSendToBack(ESPNowComponent::static_->receive_queue_, (void *) &packet, 10); @@ -407,7 +386,7 @@ void ESPNowComponent::on_data_sent(const uint8_t *mac_addr, esp_now_send_status_ if (xQueuePeek(ESPNowComponent::static_->send_queue_, (void *) &packet, 10 / portTICK_PERIOD_MS) == pdTRUE) { if (packet.peer != peer) { ESP_LOGE(TAG, " Invalid mac address. Expected: %s (%d.%d); got: %s", packet.get_peer_code().c_str(), - packet.get_sequents(), packet.attempts, espnow_encode_peer(peer).c_str()); + packet.get_sequents(), packet.attempts, peer_str(peer).c_str()); return; } else if (status != ESP_OK) { ESP_LOGE(TAG, "Sent packet failed for %s (%d.%d)", packet.get_peer_code().c_str(), packet.get_sequents(), @@ -425,12 +404,10 @@ void ESPNowComponent::on_data_sent(const uint8_t *mac_addr, esp_now_send_status_ /* ESPNowProtocol ********************************************************************** */ bool ESPNowProtocol::send(uint64_t peer, const uint8_t *data, uint8_t len, uint8_t command) { - if (peer == 0x0 && this->parent_ != nullptr) { - peer = this->parent_->get_keeper(); - } - + if (peer == 0ULL) + return false; ESPNowPacket packet(peer, data, len, this->get_protocol_id(), command); // NOLINT - packet.set_sequents(this->get_next_sequents(packet.peer)); + packet.set_sequents(this->get_next_sequents(peer)); return this->parent_->send(packet); } diff --git a/esphome/components/espnow/espnow.h b/esphome/components/espnow/espnow.h index 403b7fcb24..72833cb55a 100644 --- a/esphome/components/espnow/espnow.h +++ b/esphome/components/espnow/espnow.h @@ -7,6 +7,7 @@ #include "esphome/core/helpers.h" #include "esphome/core/log.h" +#include "esp_mac.h" #include #include @@ -32,15 +33,17 @@ static const uint8_t ESPNOW_COMMAND_ACK = 0x06; static const uint8_t ESPNOW_COMMAND_NAK = 0x15; static const uint8_t ESPNOW_COMMAND_RESEND = 0x05; -static const char chars[] = "0123456789-AbCdEfGhIjKlMnOpQrStUvWxYz+aBcDeFgHiJkLmNoPqRsTuVwXyZ"; static const uint64_t FAILED = 0; +struct ESPNowPacket; + template std::string espnow_i2h(T i) { return sprintf("%04x", i); } std::string espnow_rdm(std::string::size_type length); -std::string espnow_encode_peer(uint64_t peer); -uint64_t espnow_decode_peer(std::string peer); +std::string peer_str(const uint64_t peer); + +void show_packet(const std::string &title, const ESPNowPacket &packet); struct ESPNowPacket { uint64_t peer{0}; @@ -107,7 +110,7 @@ struct ESPNowPacket { inline bool is_peer(const uint8_t *peer) const { return memcmp(peer, this->get_peer(), 6) == 0; } inline uint8_t *get_peer() const { return (uint8_t *) &(this->peer); } - inline std::string get_peer_code() const { return espnow_encode_peer(this->peer); } + inline std::string get_peer_code() const { return peer_str(this->peer); } inline uint32_t get_protocol() const { return this->content.prefix.protocol & 0x00FFFFFF; } inline void set_protocol(uint32_t protocol) { @@ -140,7 +143,7 @@ struct ESPNowPacket { class ESPNowComponent; -enum ESPNowProtocol_mode { universal, keeper, drudge }; +enum ESPNowProtocol_mode { pm_universal, pm_keeper, pm_drudge }; class ESPNowProtocol : public Parented { public: @@ -148,7 +151,7 @@ class ESPNowProtocol : public Parented { ESPNowProtocol_mode get_protocol_mode() { return this->protocol_mode_; } protected: - ESPNowProtocol_mode protocol_mode_{universal}; + ESPNowProtocol_mode protocol_mode_{pm_universal}; public: virtual uint32_t get_protocol_id() = 0; @@ -189,11 +192,11 @@ class ESPNowProtocol : public Parented { std::map next_sequents_{}; std::string get_mode_name_() { switch (this->protocol_mode_) { - case universal: + case pm_universal: return "Universal"; - case keeper: + case pm_keeper: return "Keeper"; - case drudge: + case pm_drudge: return "Drudge"; } } @@ -259,8 +262,7 @@ class ESPNowComponent : public Component { void set_conformation_timeout(uint32_t timeout) { this->conformation_timeout_ = timeout; } void set_retries(uint8_t value) { this->retries_ = value; } void set_pairing_protocol(ESPNowProtocol *pairing_protocol) { this->pairing_protocol_ = pairing_protocol; } - void set_keeper(uint64_t keeper) { this->keeper_ = keeper; } - uint64_t get_keeper() { return this->keeper_; } + uint64_t get_own_peer_address() { return this->own_peer_address_; } void setup() override; @@ -290,8 +292,6 @@ class ESPNowComponent : public Component { ESPNowDefaultProtocol *get_default_protocol(); - void show_packet(const std::string &title, const ESPNowPacket &packet); - static void espnow_task(void *params); protected: @@ -302,7 +302,6 @@ class ESPNowComponent : public Component { uint8_t wifi_channel_{0}; uint32_t conformation_timeout_{5000}; uint8_t retries_{5}; - uint64_t keeper_{0}; bool auto_add_peer_{false}; bool use_sent_check_{true}; @@ -326,49 +325,55 @@ class ESPNowComponent : public Component { static ESPNowComponent *static_; // NOLINT }; +/********************************* Actions **************************************/ template class SendAction : public Action, public Parented { - public: - TEMPLATABLE_VALUE(uint64_t, peer); + TEMPLATABLE_VALUE(uint64_t, mac_address); TEMPLATABLE_VALUE(uint8_t, command); TEMPLATABLE_VALUE(std::vector, payload); + public: void play(Ts... x) override { - uint64_t peer = this->peer_.value(x...); + uint64_t peer = this->mac_address_.value(x...); uint8_t command = this->command_.value(x...); std::vector payload = this->payload_.value(x...); - ESP_LOGVV("SendAction", "send to 0x%12llx, command %d, payload size: %d", peer, command, payload.size()); - this->parent_->get_default_protocol()->send(peer, payload.data(), payload.size(), command); } }; template class NewPeerAction : public Action, public Parented { public: - TEMPLATABLE_VALUE(uint64_t, peer); + TEMPLATABLE_VALUE(uint64_t, mac_address); void play(Ts... x) override { - auto peer = this->peer_.value(x...); - parent_->add_peer(peer); + uint64_t mac_address = this->mac_address_.value(x...); + parent_->add_peer(mac_address); } }; template class DelPeerAction : public Action, public Parented { public: - TEMPLATABLE_VALUE(uint64_t, peer); + TEMPLATABLE_VALUE(uint64_t, mac_address); void play(Ts... x) override { - auto peer = this->peer_.value(x...); - parent_->del_peer(peer); + uint64_t mac_address = this->mac_address_.value(x...); + parent_->del_peer(mac_address); } }; -template class SetKeeperAction : public Action, public Parented { +template class SetStaticPeerAction : public Action, public Parented { public: - TEMPLATABLE_VALUE(uint64_t, peer); + TEMPLATABLE_VALUE(uint64_t, mac_address); + void set_peer_id(uint64_t &peer_id) { this->peer_id_ = &peer_id; } void play(Ts... x) override { - auto peer = this->peer_.value(x...); - parent_->set_keeper(peer); + uint64_t mac_address = this->mac_address_.value(x...); + *(this->peer_id_) = mac_address; + if (mac_address != 0) + parent_->add_peer(mac_address); } + + protected: + uint64_t *peer_id_; }; +/********************************* triggers **************************************/ class ESPNowSentTrigger : public Trigger { public: explicit ESPNowSentTrigger(ESPNowComponent *parent) { diff --git a/esphome/components/espnow/test1.yaml b/esphome/components/espnow/test1.yaml index 1b7301b69a..7aa6526b74 100644 --- a/esphome/components/espnow/test1.yaml +++ b/esphome/components/espnow/test1.yaml @@ -7,7 +7,8 @@ esp32: board: esp32dev framework: type: esp-idf - # version: 5.1.5 + # version: 5.2.1 + # platform_version: 6.6.0 esphome: name: "${name}" @@ -28,11 +29,7 @@ logger: level: verbose espnow: - auto_add_peer: false - peers: - - FF:FF:FF:FF:FF:FF - - flW1QA3k - + auto_add_peer: true on_receive: - logger.log: format: "Received: '%s' from '%s' command: %d RSSI: %d" @@ -44,11 +41,12 @@ espnow: packet.rssi, ] + # this works only when esp_idf v5.1.5+ is being used. on_broadcast: - command: 123 then: - logger.log: - format: "Broadcast Received from: '%s' RSSI: %d: %s" + format: "Broadcast from: '%s' RSSI: %d: %s" args: [ packet.get_peer_code().c_str(), diff --git a/esphome/components/espnow/test2.yaml b/esphome/components/espnow/test2.yaml index 78018b1946..e0be87cdc3 100644 --- a/esphome/components/espnow/test2.yaml +++ b/esphome/components/espnow/test2.yaml @@ -7,7 +7,8 @@ esp32: board: esp32dev framework: type: esp-idf - # version: 5.1.5 + # version: 5.2.1 + # platform_version: 6.6.0 esphome: name: "${name}" @@ -27,11 +28,18 @@ esphome: logger: level: verbose +globals: + - id: hub_address + type: uint64_t + initial_value: "0xE86BEA23CD98" + restore_value: yes + espnow: auto_add_peer: true - peers: - - FF:FF:FF:FF:FF:FF - keeper: rmT7YF9o + predefined_peers: + - peer_id: keeper + mac_address: E8:6B:EA:23:CD:98 + on_receive: - logger.log: format: "Received: '%s' from '%s' command: %d RSSI: %d" @@ -65,12 +73,30 @@ interval: - interval: 5sec then: - espnow.send: - peer: keeper - payload: "tesing the test" + mac_address: keeper + payload: "Used static keeper value" + command: 222 + - espnow.send: + mac_address: E8:6B:EA:23:CD:98 + payload: "used fixed mac address" + command: 123 + - espnow.send: + # dynamic peer address + mac_address: !lambda return keeper; + payload: "use keeper dynamicly " + command: 62 + - espnow.send: + mac_address: !lambda return id(hub_address); + payload: "Using a global numberic value dynamicly" + command: 132 binary_sensor: - platform: gpio pin: GPIO39 name: Button on_click: - - espnow.peer.del: rmT7YF9o + - espnow.static.peer: + peer_id: keeper + mac_address: 80:6B:EA:23:CD:87 + - espnow.peer.add: 80:6B:EA:23:AA:BB + - espnow.peer.del: 80:6B:EA:23:AA:BB