From 71725ab4c4861e21d505acfb0a1c1ac30c93836a Mon Sep 17 00:00:00 2001 From: oarcher Date: Fri, 26 Jul 2024 23:59:11 +0200 Subject: [PATCH] CMUX disabled by default --- esphome/components/modem/__init__.py | 35 +++++++++++++++----- esphome/components/modem/modem_component.cpp | 4 +-- esphome/components/modem/modem_component.h | 1 + tests/components/modem/test.esp32-idf.yaml | 1 + 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/esphome/components/modem/__init__.py b/esphome/components/modem/__init__.py index b2e893ee69..ee47af3477 100644 --- a/esphome/components/modem/__init__.py +++ b/esphome/components/modem/__init__.py @@ -1,3 +1,5 @@ +import logging + from esphome.const import ( CONF_ID, CONF_USE_ADDRESS, @@ -17,9 +19,11 @@ from esphome.core import coroutine_with_priority from esphome.components.esp32 import add_idf_component, add_idf_sdkconfig_option from esphome import pins, automation +_LOGGER = logging.getLogger(__name__) + CODEOWNERS = ["@oarcher"] DEPENDENCIES = ["esp32"] -AUTO_LOAD = ["network", "binary_sensor", "gpio"] +AUTO_LOAD = ["network"] # following should be removed if conflicts are resolved (so we can have a wifi ap using modem) CONFLICTS_WITH = ["wifi", "captive_portal", "ethernet"] @@ -30,6 +34,7 @@ CONF_STATUS_PIN = "status_pin" CONF_POWER_PIN = "power_pin" CONF_INIT_AT = "init_at" CONF_ON_NOT_RESPONDING = "on_not_responding" +CONF_ENABLE_CMUX = "enable_cmux" MODEM_MODELS = ["BG96", "SIM800", "SIM7000", "SIM7600", "GENERIC"] MODEM_MODELS_POWER = { @@ -70,6 +75,7 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_USE_ADDRESS): cv.string, cv.Optional(CONF_INIT_AT): cv.All(cv.ensure_list(cv.string)), cv.Optional(CONF_ENABLE_ON_BOOT, default=True): cv.boolean, + cv.Optional(CONF_ENABLE_CMUX, default=False): cv.boolean, cv.Optional(CONF_ON_NOT_RESPONDING): automation.validate_automation( { cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id( @@ -100,6 +106,12 @@ def _final_validate(config): # raise cv.Invalid( # f"'{CONF_STATUS_PIN}' must be declared if using '{CONF_POWER_PIN}'" # ) + if config.get(CONF_STATUS_PIN, None): + _LOGGER.warning("Using '%s' is experimental", CONF_STATUS_PIN) + if config[CONF_ENABLE_CMUX]: + _LOGGER.warning("Using '%s: True' is experimental", CONF_ENABLE_CMUX) + if not config[CONF_ENABLE_ON_BOOT]: + _LOGGER.warning("Using '%s: False' is experimental", CONF_ENABLE_ON_BOOT) if config.get(CONF_POWER_PIN, None): if config[CONF_MODEL] not in MODEM_MODELS_POWER: raise cv.Invalid( @@ -114,8 +126,8 @@ FINAL_VALIDATE_SCHEMA = _final_validate async def to_code(config): add_idf_component( name="esp_modem", - repo="https://github.com/oarcher/esp-protocols.git", - ref="dev", + repo="https://github.com/espressif/esp-protocols.git", + ref="modem-v1.1.0", path="components/esp_modem", ) @@ -124,18 +136,23 @@ async def to_code(config): add_idf_sdkconfig_option("CONFIG_LWIP_PPP_SUPPORT", True) add_idf_sdkconfig_option("CONFIG_PPP_PAP_SUPPORT", True) add_idf_sdkconfig_option("CONFIG_LWIP_PPP_PAP_SUPPORT", True) - add_idf_sdkconfig_option("CONFIG_ESP_MODEM_CMUX_DEFRAGMENT_PAYLOAD", True) - # ("ESP_MODEM_CMUX_USE_SHORT_PAYLOADS_ONLY", True) add_idf_sdkconfig_option("CONFIG_ESP_MODEM_CMUX_DELAY_AFTER_DLCI_SETUP", 0) add_idf_sdkconfig_option("CONFIG_PPP_SUPPORT", True) add_idf_sdkconfig_option("CONFIG_PPP_NOTIFY_PHASE_SUPPORT", True) add_idf_sdkconfig_option("CONFIG_PPP_CHAP_SUPPORT", True) add_idf_sdkconfig_option("CONFIG_LWIP_PPP_VJ_HEADER_COMPRESSION", True) add_idf_sdkconfig_option("CONFIG_LWIP_PPP_NOTIFY_PHASE_SUPPORT", True) + # commented because cause crash if another UART is defined in the yaml # If enabled, it should increase the reliability and the speed of the connection (TODO: test) # add_idf_sdkconfig_option("CONFIG_UART_ISR_IN_IRAM", True) + # If Uart queue full message ( A7672 ), those config option might be changed + # https://github.com/espressif/esp-protocols/issues/272#issuecomment-1558682967 + add_idf_sdkconfig_option("CONFIG_ESP_MODEM_CMUX_DEFRAGMENT_PAYLOAD", True) + add_idf_sdkconfig_option("ESP_MODEM_USE_INFLATABLE_BUFFER_IF_NEEDED", False) + add_idf_sdkconfig_option("ESP_MODEM_CMUX_USE_SHORT_PAYLOADS_ONLY", False) + cg.add_define("USE_MODEM") var = cg.new_Pvariable(config[CONF_ID]) @@ -151,9 +168,11 @@ async def to_code(config): if pin_code := config.get(CONF_PIN_CODE, None): cg.add(var.set_pin_code(pin_code)) - if enable_on_boot := config.get(CONF_ENABLE_ON_BOOT, None): - if enable_on_boot: - cg.add(var.enable()) + if config[CONF_ENABLE_ON_BOOT]: + cg.add(var.enable()) + + if config[CONF_ENABLE_CMUX]: + cg.add(var.enable_cmux()) if init_at := config.get(CONF_INIT_AT, None): for cmd in init_at: diff --git a/esphome/components/modem/modem_component.cpp b/esphome/components/modem/modem_component.cpp index e17801240b..e377436007 100644 --- a/esphome/components/modem/modem_component.cpp +++ b/esphome/components/modem/modem_component.cpp @@ -6,7 +6,6 @@ #include "esphome/core/application.h" #include "esphome/core/defines.h" #include "esphome/components/network/util.h" -// #include "esphome/components/gpio/binary_sensor/gpio_binary_sensor.h" #include #include @@ -112,6 +111,7 @@ void ModemComponent::setup() { ESP_LOGCONFIG(TAG, " Status pin: Not defined"); } ESP_LOGCONFIG(TAG, " Enabled : %s", this->enabled_ ? "Yes" : "No"); + ESP_LOGCONFIG(TAG, " Use CMUX : %s", this->cmux_ ? "Yes" : "No"); ESP_LOGV(TAG, "PPP netif setup"); esp_err_t err; @@ -272,7 +272,7 @@ void ModemComponent::start_connect_() { ESP_LOGD(TAG, "Modem has correctly entered multiplexed command/data mode"); } else { - ESP_LOGD(TAG, "Unable to enter CMUX mode"); + ESP_LOGE(TAG, "Unable to enter CMUX mode"); this->status_set_error("Unable to enter CMUX mode"); } assert(this->modem_ready()); diff --git a/esphome/components/modem/modem_component.h b/esphome/components/modem/modem_component.h index 32999281e4..191348aa8c 100644 --- a/esphome/components/modem/modem_component.h +++ b/esphome/components/modem/modem_component.h @@ -60,6 +60,7 @@ class ModemComponent : public Component { void set_pin_code(const std::string &pin_code) { this->pin_code_ = pin_code; } void set_apn(const std::string &apn) { this->apn_ = apn; } void set_not_responding_cb(Trigger<> *not_responding_cb) { this->not_responding_cb_ = not_responding_cb; } + void enable_cmux() { this->cmux_ = true; } void add_init_at_command(const std::string &cmd) { this->init_at_commands_.push_back(cmd); } std::string send_at(const std::string &cmd); bool get_imei(std::string &result); diff --git a/tests/components/modem/test.esp32-idf.yaml b/tests/components/modem/test.esp32-idf.yaml index 6f9a2bacc1..0a91c23724 100644 --- a/tests/components/modem/test.esp32-idf.yaml +++ b/tests/components/modem/test.esp32-idf.yaml @@ -12,6 +12,7 @@ modem: apn: orange pin_code: "0000" enable_on_boot: True + enable_cmux: False init_at: - AT on_not_responding: