diff --git a/CODEOWNERS b/CODEOWNERS index a7d5c137c1..772debab5c 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -97,6 +97,7 @@ esphome/components/esp32_ble/* @Rapsssito @jesserockz esphome/components/esp32_ble_client/* @jesserockz esphome/components/esp32_ble_server/* @Rapsssito @clydebarrow @jesserockz esphome/components/esp32_bt_classic/* @RoboMagus +esphome/components/esp32_bt_common/* @RoboMagus esphome/components/esp32_camera_web_server/* @ayufan esphome/components/esp32_can/* @Sympatron esphome/components/esp32_improv/* @jesserockz diff --git a/esphome/components/bt_classic_presence/binary_sensor.py b/esphome/components/bt_classic_presence/binary_sensor.py index 21febda624..53c96c1e27 100644 --- a/esphome/components/bt_classic_presence/binary_sensor.py +++ b/esphome/components/bt_classic_presence/binary_sensor.py @@ -1,12 +1,10 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import binary_sensor -from esphome.const import CONF_MAC_ADDRESS +from esphome.const import CONF_MAC_ADDRESS, CONF_NUM_SCANS from esphome.components.esp32_bt_classic import ESP32BtClassic -from esphome.components.esp32_bt_classic.const import ( - CONF_ESP32_BTCLASSIC_ID, - CONF_NUM_SCANS, -) +from esphome.components.esp32_bt_classic.const import CONF_ESP32_BTCLASSIC_ID + DEPENDENCIES = ["esp32_bt_classic"] diff --git a/esphome/components/esp32_ble/__init__.py b/esphome/components/esp32_ble/__init__.py index 57a7341505..f9bf3fe236 100644 --- a/esphome/components/esp32_ble/__init__.py +++ b/esphome/components/esp32_ble/__init__.py @@ -5,6 +5,7 @@ from esphome.const import CONF_ID from esphome.core import CORE from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant, const +AUTO_LOAD = ["esp32_bt_common"] DEPENDENCIES = ["esp32"] CODEOWNERS = ["@jesserockz", "@Rapsssito"] CONFLICTS_WITH = ["esp32_ble_beacon"] diff --git a/esphome/components/esp32_ble/ble.cpp b/esphome/components/esp32_ble/ble.cpp index 3797f3221e..0a1a5ca71c 100644 --- a/esphome/components/esp32_ble/ble.cpp +++ b/esphome/components/esp32_ble/ble.cpp @@ -13,9 +13,7 @@ #include #include -#ifdef USE_ARDUINO -#include -#endif +#include "esphome/components/esp32_bt_common/bt_defs.h" namespace esphome { namespace esp32_ble { @@ -124,7 +122,7 @@ bool ESP32BLE::ble_setup_() { ; } if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED) { - err = esp_bt_controller_enable(ESP_BT_MODE_BLE); + err = esp_bt_controller_enable(BT_MODE); if (err != ESP_OK) { ESP_LOGE(TAG, "esp_bt_controller_enable failed: %s", esp_err_to_name(err)); return false; diff --git a/esphome/components/esp32_ble/ble.h b/esphome/components/esp32_ble/ble.h index 023960d6e4..c0470eacd4 100644 --- a/esphome/components/esp32_ble/ble.h +++ b/esphome/components/esp32_ble/ble.h @@ -9,7 +9,7 @@ #include "esphome/core/helpers.h" #include "ble_event.h" -#include "queue.h" +#include "esphome/components/esp32_bt_common/queue.h" #ifdef USE_ESP32 @@ -118,7 +118,7 @@ class ESP32BLE : public Component { std::vector ble_status_event_handlers_; BLEComponentState state_{BLE_COMPONENT_STATE_OFF}; - Queue ble_events_; + esp32_bt_common::Queue ble_events_; BLEAdvertising *advertising_; esp_ble_io_cap_t io_cap_{ESP_IO_CAP_NONE}; bool enable_on_boot_; diff --git a/esphome/components/esp32_ble_beacon/__init__.py b/esphome/components/esp32_ble_beacon/__init__.py index 9aac48cbb2..a764cb3885 100644 --- a/esphome/components/esp32_ble_beacon/__init__.py +++ b/esphome/components/esp32_ble_beacon/__init__.py @@ -5,6 +5,7 @@ from esphome.core import CORE, TimePeriod from esphome.components.esp32 import add_idf_sdkconfig_option from esphome.components import esp32_ble +AUTO_LOAD = ["esp32_bt_common"] DEPENDENCIES = ["esp32"] CONFLICTS_WITH = ["esp32_ble_tracker"] diff --git a/esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp b/esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp index 589fcc1e82..67f1b323bd 100644 --- a/esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp +++ b/esphome/components/esp32_ble_beacon/esp32_ble_beacon.cpp @@ -12,9 +12,7 @@ #include #include "esphome/core/hal.h" -#ifdef USE_ARDUINO -#include -#endif +#include "esphome/components/esp32_bt_common/bt_defs.h" namespace esphome { namespace esp32_ble_beacon { @@ -109,7 +107,7 @@ void ESP32BLEBeacon::ble_setup() { ; } if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED) { - err = esp_bt_controller_enable(ESP_BT_MODE_BLE); + err = esp_bt_controller_enable(BT_MODE); if (err != ESP_OK) { ESP_LOGE(TAG, "esp_bt_controller_enable failed: %s", esp_err_to_name(err)); return; diff --git a/esphome/components/esp32_ble_server/ble_server.h b/esphome/components/esp32_ble_server/ble_server.h index e379e67296..96e789fcdb 100644 --- a/esphome/components/esp32_ble_server/ble_server.h +++ b/esphome/components/esp32_ble_server/ble_server.h @@ -6,7 +6,6 @@ #include "esphome/components/esp32_ble/ble.h" #include "esphome/components/esp32_ble/ble_advertising.h" #include "esphome/components/esp32_ble/ble_uuid.h" -#include "esphome/components/esp32_ble/queue.h" #include "esphome/core/component.h" #include "esphome/core/helpers.h" #include "esphome/core/preferences.h" diff --git a/esphome/components/esp32_bt_classic/__init__.py b/esphome/components/esp32_bt_classic/__init__.py index 1bb3dfdbe7..9ddbfd1488 100644 --- a/esphome/components/esp32_bt_classic/__init__.py +++ b/esphome/components/esp32_bt_classic/__init__.py @@ -24,7 +24,7 @@ from .const import ( _LOGGER = logging.getLogger(__name__) -AUTO_LOAD = ["esp32_ble"] +AUTO_LOAD = ["esp32_bt_common"] DEPENDENCIES = ["esp32"] CODEOWNERS = ["@RoboMagus"] @@ -161,3 +161,5 @@ async def to_code(config): if CORE.using_esp_idf: add_idf_sdkconfig_option("CONFIG_BT_ENABLED", True) + add_idf_sdkconfig_option("CONFIG_BTDM_CTRL_MODE_BTDM", True) + add_idf_sdkconfig_option("CONFIG_BT_CLASSIC_ENABLED", True) diff --git a/esphome/components/esp32_bt_classic/bt_classic.cpp b/esphome/components/esp32_bt_classic/bt_classic.cpp index d858f1cacb..c7701bc5b1 100644 --- a/esphome/components/esp32_bt_classic/bt_classic.cpp +++ b/esphome/components/esp32_bt_classic/bt_classic.cpp @@ -12,9 +12,7 @@ #include #include -#ifdef USE_ARDUINO -#include -#endif +#include "esphome/components/esp32_bt_common/bt_defs.h" namespace esphome { namespace esp32_bt_classic { @@ -63,7 +61,7 @@ bool ESP32BtClassic::bt_setup_() { ; } if (esp_bt_controller_get_status() == ESP_BT_CONTROLLER_STATUS_INITED) { - err = esp_bt_controller_enable(ESP_BT_MODE_BLE); + err = esp_bt_controller_enable(BT_MODE); if (err != ESP_OK) { ESP_LOGE(TAG, "esp_bt_controller_enable failed: %s", esp_err_to_name(err)); return false; diff --git a/esphome/components/esp32_bt_classic/bt_classic.h b/esphome/components/esp32_bt_classic/bt_classic.h index deeb377417..b0b1f788c8 100644 --- a/esphome/components/esp32_bt_classic/bt_classic.h +++ b/esphome/components/esp32_bt_classic/bt_classic.h @@ -7,12 +7,12 @@ #ifdef USE_ESP32 +#include "esphome/components/esp32_bt_common/queue.h" + // IDF headers #include #include -#include "esphome/components/esp32_ble/queue.h" - #include "utils.h" namespace esphome { @@ -139,7 +139,7 @@ class ESP32BtClassic : public Component, public BtClassicItf { std::vector scan_result_listners_; // Ble-Queue which thread safety precautions: - esp32_ble::Queue bt_events_; + esp32_bt_common::Queue bt_events_; const uint32_t scan_delay_{100}; // (ms) minimal time between consecutive scans }; diff --git a/esphome/components/esp32_bt_common/__init__.py b/esphome/components/esp32_bt_common/__init__.py new file mode 100644 index 0000000000..4cced78d5a --- /dev/null +++ b/esphome/components/esp32_bt_common/__init__.py @@ -0,0 +1,6 @@ +import esphome.codegen as cg + +DEPENDENCIES = ["esp32"] +CODEOWNERS = ["@RoboMagus"] + +esp32_bt_common_ns = cg.esphome_ns.namespace("esp32_bt_common") diff --git a/esphome/components/esp32_bt_common/bt_defs.h b/esphome/components/esp32_bt_common/bt_defs.h new file mode 100644 index 0000000000..85ea75b8e4 --- /dev/null +++ b/esphome/components/esp32_bt_common/bt_defs.h @@ -0,0 +1,26 @@ +#pragma once + +#ifdef USE_ESP32 + +#include + +// Define the configured BT operation mode: +#ifdef USE_ARDUINO +#include +#else +#ifdef CONFIG_BTDM_CONTROLLER_MODE_BTDM +#define BT_MODE ESP_BT_MODE_BTDM +#elif defined(CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY) +#define BT_MODE ESP_BT_MODE_CLASSIC_BT +#else +#define BT_MODE ESP_BT_MODE_BLE +#endif +#endif + +namespace esphome { +namespace esp32_bt_common { + +} // namespace esp32_bt_common +} // namespace esphome + +#endif diff --git a/esphome/components/esp32_ble/queue.h b/esphome/components/esp32_bt_common/queue.h similarity index 87% rename from esphome/components/esp32_ble/queue.h rename to esphome/components/esp32_bt_common/queue.h index 5b31b97ae2..7d3ee1456a 100644 --- a/esphome/components/esp32_ble/queue.h +++ b/esphome/components/esp32_bt_common/queue.h @@ -9,7 +9,7 @@ #include /* - * BLE events come in from a separate Task (thread) in the ESP32 stack. Rather + * Bluetooth events come in from a separate Task (thread) in the ESP32 stack. Rather * than trying to deal with various locking strategies, all incoming GAP and GATT * events will simply be placed on a semaphore guarded queue. The next time the * component runs loop(), these events are popped off the queue and handed at @@ -17,7 +17,7 @@ */ namespace esphome { -namespace esp32_ble { +namespace esp32_bt_common { template class Queue { public: @@ -50,7 +50,7 @@ template class Queue { SemaphoreHandle_t m_; }; -} // namespace esp32_ble +} // namespace esp32_bt_common } // namespace esphome #endif diff --git a/tests/test5.yaml b/tests/test5.yaml index bf4247fb92..68499381d9 100644 --- a/tests/test5.yaml +++ b/tests/test5.yaml @@ -89,6 +89,8 @@ mqtt: vbus: - uart_id: uart_2 +esp32_bt_classic: + binary_sensor: - platform: gpio pin: GPIO0 @@ -223,6 +225,10 @@ binary_sensor: name: VBus Custom Binary Sensor lambda: return x[0] & 1; + - platform: bt_classic_presence + name: BT Classic Presence T0 + mac_address: 1a:2b:3c:4d:5e:6f + tlc5947: data_pin: number: GPIO12