mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-04 09:01:49 +00:00 
			
		
		
		
	Compare commits
	
		
			54 Commits
		
	
	
		
			jesserockz
			...
			2022.12.2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					a75da54455 | ||
| 
						 | 
					de7f6c3f5f | ||
| 
						 | 
					4245480656 | ||
| 
						 | 
					1824c8131e | ||
| 
						 | 
					4e9606d2e0 | ||
| 
						 | 
					78500fa933 | ||
| 
						 | 
					9c69b98a49 | ||
| 
						 | 
					e6d8ef98d3 | ||
| 
						 | 
					3f1af1690b | ||
| 
						 | 
					84374b6b1e | ||
| 
						 | 
					391316c9b5 | ||
| 
						 | 
					705c62ebd7 | ||
| 
						 | 
					cb520c00a5 | ||
| 
						 | 
					2f24138345 | ||
| 
						 | 
					96512b80cc | ||
| 
						 | 
					fcb9b51978 | ||
| 
						 | 
					f408f1a368 | ||
| 
						 | 
					7d8d563c62 | ||
| 
						 | 
					0a1f705fda | ||
| 
						 | 
					1952c1880b | ||
| 
						 | 
					b03967dac1 | ||
| 
						 | 
					bcae2596a6 | ||
| 
						 | 
					fc0347c86c | ||
| 
						 | 
					d9563d4de1 | ||
| 
						 | 
					cc7e2bf8db | ||
| 
						 | 
					5d98e2923b | ||
| 
						 | 
					07197d12f6 | ||
| 
						 | 
					7b0a298497 | ||
| 
						 | 
					21679cf2ba | ||
| 
						 | 
					4be7cd12a1 | ||
| 
						 | 
					dee4d0ccb7 | ||
| 
						 | 
					7209dd8bae | ||
| 
						 | 
					ab736c89bb | ||
| 
						 | 
					6911639617 | ||
| 
						 | 
					b9720d0715 | ||
| 
						 | 
					47b3267ed4 | ||
| 
						 | 
					e16ba2adb5 | ||
| 
						 | 
					0a19b1e32c | ||
| 
						 | 
					bae9a950c0 | ||
| 
						 | 
					72b2943332 | ||
| 
						 | 
					4ec0ef7548 | ||
| 
						 | 
					25bc6761f6 | ||
| 
						 | 
					81b6562c25 | ||
| 
						 | 
					ae74189fc2 | ||
| 
						 | 
					9e516efe10 | ||
| 
						 | 
					366e29439e | ||
| 
						 | 
					1c9c700d7f | ||
| 
						 | 
					b2e6b9d31f | ||
| 
						 | 
					7623f63846 | ||
| 
						 | 
					2bfaf9dce3 | ||
| 
						 | 
					5c2c1560bb | ||
| 
						 | 
					f7096ab78e | ||
| 
						 | 
					98f8feb625 | ||
| 
						 | 
					9944ca414e | 
@@ -12,6 +12,9 @@ FROM debian:bullseye-20221024-slim AS base-docker
 | 
			
		||||
 | 
			
		||||
FROM base-${BASEIMGTYPE} AS base
 | 
			
		||||
 | 
			
		||||
ARG TARGETARCH
 | 
			
		||||
ARG TARGETVARIANT
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
    apt-get update \
 | 
			
		||||
    # Use pinned versions so that we get updates with build caching
 | 
			
		||||
@@ -36,6 +39,14 @@ ENV \
 | 
			
		||||
  # Store globally installed pio libs in /piolibs
 | 
			
		||||
  PLATFORMIO_GLOBALLIB_DIR=/piolibs
 | 
			
		||||
 | 
			
		||||
# Support legacy binaries on Debian multiarch system. There is no "correct" way
 | 
			
		||||
# to do this, other than using properly built toolchains...
 | 
			
		||||
# See: https://unix.stackexchange.com/questions/553743/correct-way-to-add-lib-ld-linux-so-3-in-debian
 | 
			
		||||
RUN \
 | 
			
		||||
    if [ "$TARGETARCH$TARGETVARIANT" = "armv7" ]; then \
 | 
			
		||||
        ln -s /lib/arm-linux-gnueabihf/ld-linux.so.3 /lib/ld-linux.so.3; \
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
RUN \
 | 
			
		||||
    # Ubuntu python3-pip is missing wheel
 | 
			
		||||
    pip3 install --no-cache-dir \
 | 
			
		||||
 
 | 
			
		||||
@@ -2,11 +2,13 @@ from esphome.components import esp32_ble_tracker, esp32_ble_client
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
import esphome.codegen as cg
 | 
			
		||||
from esphome.const import CONF_ACTIVE, CONF_ID
 | 
			
		||||
from esphome.components.esp32 import add_idf_sdkconfig_option
 | 
			
		||||
 | 
			
		||||
AUTO_LOAD = ["esp32_ble_client", "esp32_ble_tracker"]
 | 
			
		||||
DEPENDENCIES = ["api", "esp32"]
 | 
			
		||||
CODEOWNERS = ["@jesserockz"]
 | 
			
		||||
 | 
			
		||||
CONF_CACHE_SERVICES = "cache_services"
 | 
			
		||||
CONF_CONNECTIONS = "connections"
 | 
			
		||||
MAX_CONNECTIONS = 3
 | 
			
		||||
 | 
			
		||||
@@ -47,6 +49,9 @@ CONFIG_SCHEMA = cv.All(
 | 
			
		||||
        {
 | 
			
		||||
            cv.GenerateID(): cv.declare_id(BluetoothProxy),
 | 
			
		||||
            cv.Optional(CONF_ACTIVE, default=False): cv.boolean,
 | 
			
		||||
            cv.SplitDefault(CONF_CACHE_SERVICES, esp32_idf=True): cv.All(
 | 
			
		||||
                cv.only_with_esp_idf, cv.boolean
 | 
			
		||||
            ),
 | 
			
		||||
            cv.Optional(CONF_CONNECTIONS): cv.All(
 | 
			
		||||
                cv.ensure_list(CONNECTION_SCHEMA),
 | 
			
		||||
                cv.Length(min=1, max=MAX_CONNECTIONS),
 | 
			
		||||
@@ -72,4 +77,7 @@ async def to_code(config):
 | 
			
		||||
        cg.add(var.register_connection(connection_var))
 | 
			
		||||
        await esp32_ble_tracker.register_client(connection_var, connection_conf)
 | 
			
		||||
 | 
			
		||||
    if config.get(CONF_CACHE_SERVICES):
 | 
			
		||||
        add_idf_sdkconfig_option("CONFIG_BT_GATTC_CACHE_NVS_FLASH", True)
 | 
			
		||||
 | 
			
		||||
    cg.add_define("USE_BLUETOOTH_PROXY")
 | 
			
		||||
 
 | 
			
		||||
@@ -27,10 +27,10 @@ DEFAULT_DELAY = "2ms"
 | 
			
		||||
CONFIG_SCHEMA = cv.Schema(
 | 
			
		||||
    {
 | 
			
		||||
        cv.GenerateID(): cv.declare_id(CD74HC4067Component),
 | 
			
		||||
        cv.Required(CONF_PIN_S0): pins.internal_gpio_output_pin_schema,
 | 
			
		||||
        cv.Required(CONF_PIN_S1): pins.internal_gpio_output_pin_schema,
 | 
			
		||||
        cv.Required(CONF_PIN_S2): pins.internal_gpio_output_pin_schema,
 | 
			
		||||
        cv.Required(CONF_PIN_S3): pins.internal_gpio_output_pin_schema,
 | 
			
		||||
        cv.Required(CONF_PIN_S0): pins.gpio_output_pin_schema,
 | 
			
		||||
        cv.Required(CONF_PIN_S1): pins.gpio_output_pin_schema,
 | 
			
		||||
        cv.Required(CONF_PIN_S2): pins.gpio_output_pin_schema,
 | 
			
		||||
        cv.Required(CONF_PIN_S3): pins.gpio_output_pin_schema,
 | 
			
		||||
        cv.Optional(
 | 
			
		||||
            CONF_DELAY, default=DEFAULT_DELAY
 | 
			
		||||
        ): cv.positive_time_period_milliseconds,
 | 
			
		||||
 
 | 
			
		||||
@@ -19,22 +19,22 @@ class CD74HC4067Component : public Component {
 | 
			
		||||
  void activate_pin(uint8_t pin);
 | 
			
		||||
 | 
			
		||||
  /// set the pin connected to multiplexer control pin 0
 | 
			
		||||
  void set_pin_s0(InternalGPIOPin *pin) { this->pin_s0_ = pin; }
 | 
			
		||||
  void set_pin_s0(GPIOPin *pin) { this->pin_s0_ = pin; }
 | 
			
		||||
  /// set the pin connected to multiplexer control pin 1
 | 
			
		||||
  void set_pin_s1(InternalGPIOPin *pin) { this->pin_s1_ = pin; }
 | 
			
		||||
  void set_pin_s1(GPIOPin *pin) { this->pin_s1_ = pin; }
 | 
			
		||||
  /// set the pin connected to multiplexer control pin 2
 | 
			
		||||
  void set_pin_s2(InternalGPIOPin *pin) { this->pin_s2_ = pin; }
 | 
			
		||||
  void set_pin_s2(GPIOPin *pin) { this->pin_s2_ = pin; }
 | 
			
		||||
  /// set the pin connected to multiplexer control pin 3
 | 
			
		||||
  void set_pin_s3(InternalGPIOPin *pin) { this->pin_s3_ = pin; }
 | 
			
		||||
  void set_pin_s3(GPIOPin *pin) { this->pin_s3_ = pin; }
 | 
			
		||||
 | 
			
		||||
  /// set the delay needed after an input switch
 | 
			
		||||
  void set_switch_delay(uint32_t switch_delay) { this->switch_delay_ = switch_delay; }
 | 
			
		||||
 | 
			
		||||
 private:
 | 
			
		||||
  InternalGPIOPin *pin_s0_;
 | 
			
		||||
  InternalGPIOPin *pin_s1_;
 | 
			
		||||
  InternalGPIOPin *pin_s2_;
 | 
			
		||||
  InternalGPIOPin *pin_s3_;
 | 
			
		||||
  GPIOPin *pin_s0_;
 | 
			
		||||
  GPIOPin *pin_s1_;
 | 
			
		||||
  GPIOPin *pin_s2_;
 | 
			
		||||
  GPIOPin *pin_s3_;
 | 
			
		||||
  /// the currently active pin
 | 
			
		||||
  uint8_t active_pin_;
 | 
			
		||||
  uint32_t switch_delay_;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ import requests
 | 
			
		||||
import esphome.codegen as cg
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
from esphome.components.packages import validate_source_shorthand
 | 
			
		||||
from esphome.const import CONF_WIFI
 | 
			
		||||
from esphome.const import CONF_WIFI, CONF_REF
 | 
			
		||||
from esphome.wizard import wizard_file
 | 
			
		||||
from esphome.yaml_util import dump
 | 
			
		||||
from esphome import git
 | 
			
		||||
@@ -21,19 +21,32 @@ CODEOWNERS = ["@esphome/core"]
 | 
			
		||||
def validate_import_url(value):
 | 
			
		||||
    value = cv.string_strict(value)
 | 
			
		||||
    value = cv.Length(max=255)(value)
 | 
			
		||||
    # ignore result, only check if it's a valid shorthand
 | 
			
		||||
    validate_source_shorthand(value)
 | 
			
		||||
    return value
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def validate_full_url(config):
 | 
			
		||||
    if not config[CONF_IMPORT_FULL_CONFIG]:
 | 
			
		||||
        return config
 | 
			
		||||
    source = validate_source_shorthand(config[CONF_PACKAGE_IMPORT_URL])
 | 
			
		||||
    if CONF_REF not in source:
 | 
			
		||||
        raise cv.Invalid(
 | 
			
		||||
            "Must specify a ref (branch or tag) to import from when importing full config"
 | 
			
		||||
        )
 | 
			
		||||
    return config
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CONF_PACKAGE_IMPORT_URL = "package_import_url"
 | 
			
		||||
CONF_IMPORT_FULL_CONFIG = "import_full_config"
 | 
			
		||||
 | 
			
		||||
CONFIG_SCHEMA = cv.Schema(
 | 
			
		||||
    {
 | 
			
		||||
        cv.Required(CONF_PACKAGE_IMPORT_URL): validate_import_url,
 | 
			
		||||
        cv.Optional(CONF_IMPORT_FULL_CONFIG, default=False): cv.boolean,
 | 
			
		||||
    }
 | 
			
		||||
CONFIG_SCHEMA = cv.All(
 | 
			
		||||
    cv.Schema(
 | 
			
		||||
        {
 | 
			
		||||
            cv.Required(CONF_PACKAGE_IMPORT_URL): validate_import_url,
 | 
			
		||||
            cv.Optional(CONF_IMPORT_FULL_CONFIG, default=False): cv.boolean,
 | 
			
		||||
        }
 | 
			
		||||
    ),
 | 
			
		||||
    validate_full_url,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
WIFI_CONFIG = """
 | 
			
		||||
@@ -49,7 +62,7 @@ async def to_code(config):
 | 
			
		||||
    url = config[CONF_PACKAGE_IMPORT_URL]
 | 
			
		||||
    if config[CONF_IMPORT_FULL_CONFIG]:
 | 
			
		||||
        url += "?full_config"
 | 
			
		||||
    cg.add(dashboard_import_ns.set_package_import_url(config[CONF_PACKAGE_IMPORT_URL]))
 | 
			
		||||
    cg.add(dashboard_import_ns.set_package_import_url(url))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def import_config(
 | 
			
		||||
 
 | 
			
		||||
@@ -398,11 +398,11 @@ spiffs,   data, spiffs,  0x391000, 0x00F000
 | 
			
		||||
 | 
			
		||||
IDF_PARTITIONS_CSV = """\
 | 
			
		||||
# Name,   Type, SubType, Offset,   Size, Flags
 | 
			
		||||
nvs,      data, nvs,     ,        0x4000,
 | 
			
		||||
otadata,  data, ota,     ,        0x2000,
 | 
			
		||||
phy_init, data, phy,     ,        0x1000,
 | 
			
		||||
app0,     app,  ota_0,   ,      0x1C0000,
 | 
			
		||||
app1,     app,  ota_1,   ,      0x1C0000,
 | 
			
		||||
nvs,      data, nvs,     ,       0x6d000,
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,12 +2,14 @@ import esphome.codegen as cg
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
from esphome.const import CONF_ID
 | 
			
		||||
from esphome.core import CORE
 | 
			
		||||
from esphome.components.esp32 import add_idf_sdkconfig_option
 | 
			
		||||
from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant, const
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES = ["esp32"]
 | 
			
		||||
CODEOWNERS = ["@jesserockz"]
 | 
			
		||||
CONFLICTS_WITH = ["esp32_ble_tracker", "esp32_ble_beacon"]
 | 
			
		||||
 | 
			
		||||
NO_BLUTOOTH_VARIANTS = [const.VARIANT_ESP32S2]
 | 
			
		||||
 | 
			
		||||
esp32_ble_ns = cg.esphome_ns.namespace("esp32_ble")
 | 
			
		||||
ESP32BLE = esp32_ble_ns.class_("ESP32BLE", cg.Component)
 | 
			
		||||
 | 
			
		||||
@@ -19,6 +21,15 @@ CONFIG_SCHEMA = cv.Schema(
 | 
			
		||||
).extend(cv.COMPONENT_SCHEMA)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def validate_variant(_):
 | 
			
		||||
    variant = get_esp32_variant()
 | 
			
		||||
    if variant in NO_BLUTOOTH_VARIANTS:
 | 
			
		||||
        raise cv.Invalid(f"{variant} does not support Bluetooth")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
FINAL_VALIDATE_SCHEMA = validate_variant
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def to_code(config):
 | 
			
		||||
    var = cg.new_Pvariable(config[CONF_ID])
 | 
			
		||||
    await cg.register_component(var, config)
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@ import esphome.config_validation as cv
 | 
			
		||||
from esphome.const import CONF_ID, CONF_TYPE, CONF_UUID, CONF_TX_POWER
 | 
			
		||||
from esphome.core import CORE, TimePeriod
 | 
			
		||||
from esphome.components.esp32 import add_idf_sdkconfig_option
 | 
			
		||||
from esphome.components import esp32_ble
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES = ["esp32"]
 | 
			
		||||
CONFLICTS_WITH = ["esp32_ble_tracker"]
 | 
			
		||||
@@ -54,6 +55,8 @@ CONFIG_SCHEMA = cv.All(
 | 
			
		||||
    validate_config,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
FINAL_VALIDATE_SCHEMA = esp32_ble.validate_variant
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def to_code(config):
 | 
			
		||||
    uuid = config[CONF_UUID].hex
 | 
			
		||||
 
 | 
			
		||||
@@ -95,7 +95,9 @@ void BLEClientBase::release_services() {
 | 
			
		||||
  for (auto &svc : this->services_)
 | 
			
		||||
    delete svc;  // NOLINT(cppcoreguidelines-owning-memory)
 | 
			
		||||
  this->services_.clear();
 | 
			
		||||
#ifndef CONFIG_BT_GATTC_CACHE_NVS_FLASH
 | 
			
		||||
  esp_ble_gattc_cache_clean(this->remote_bda_);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t esp_gattc_if,
 | 
			
		||||
@@ -288,14 +290,17 @@ float BLEClientBase::parse_char_value(uint8_t *value, uint16_t length) {
 | 
			
		||||
      if (length > 2) {
 | 
			
		||||
        return (float) encode_uint16(value[1], value[2]);
 | 
			
		||||
      }
 | 
			
		||||
      // fall through
 | 
			
		||||
    case 0x7:  // uint24.
 | 
			
		||||
      if (length > 3) {
 | 
			
		||||
        return (float) encode_uint24(value[1], value[2], value[3]);
 | 
			
		||||
      }
 | 
			
		||||
      // fall through
 | 
			
		||||
    case 0x8:  // uint32.
 | 
			
		||||
      if (length > 4) {
 | 
			
		||||
        return (float) encode_uint32(value[1], value[2], value[3], value[4]);
 | 
			
		||||
      }
 | 
			
		||||
      // fall through
 | 
			
		||||
    case 0xC:  // int8.
 | 
			
		||||
      return (float) ((int8_t) value[1]);
 | 
			
		||||
    case 0xD:  // int12.
 | 
			
		||||
@@ -303,10 +308,12 @@ float BLEClientBase::parse_char_value(uint8_t *value, uint16_t length) {
 | 
			
		||||
      if (length > 2) {
 | 
			
		||||
        return (float) ((int16_t)(value[1] << 8) + (int16_t) value[2]);
 | 
			
		||||
      }
 | 
			
		||||
      // fall through
 | 
			
		||||
    case 0xF:  // int24.
 | 
			
		||||
      if (length > 3) {
 | 
			
		||||
        return (float) ((int32_t)(value[1] << 16) + (int32_t)(value[2] << 8) + (int32_t)(value[3]));
 | 
			
		||||
      }
 | 
			
		||||
      // fall through
 | 
			
		||||
    case 0x10:  // int32.
 | 
			
		||||
      if (length > 4) {
 | 
			
		||||
        return (float) ((int32_t)(value[1] << 24) + (int32_t)(value[2] << 16) + (int32_t)(value[3] << 8) +
 | 
			
		||||
 
 | 
			
		||||
@@ -17,6 +17,7 @@ from esphome.const import (
 | 
			
		||||
)
 | 
			
		||||
from esphome.core import CORE
 | 
			
		||||
from esphome.components.esp32 import add_idf_sdkconfig_option
 | 
			
		||||
from esphome.components import esp32_ble
 | 
			
		||||
 | 
			
		||||
DEPENDENCIES = ["esp32"]
 | 
			
		||||
 | 
			
		||||
@@ -187,6 +188,8 @@ CONFIG_SCHEMA = cv.Schema(
 | 
			
		||||
    }
 | 
			
		||||
).extend(cv.COMPONENT_SCHEMA)
 | 
			
		||||
 | 
			
		||||
FINAL_VALIDATE_SCHEMA = esp32_ble.validate_variant
 | 
			
		||||
 | 
			
		||||
ESP_BLE_DEVICE_SCHEMA = cv.Schema(
 | 
			
		||||
    {
 | 
			
		||||
        cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_id(ESP32BLETracker),
 | 
			
		||||
 
 | 
			
		||||
@@ -705,8 +705,9 @@ void ESPBTDevice::parse_adv_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_p
 | 
			
		||||
 | 
			
		||||
  while (offset + 2 < len) {
 | 
			
		||||
    const uint8_t field_length = payload[offset++];  // First byte is length of adv record
 | 
			
		||||
    if (field_length == 0)
 | 
			
		||||
      break;
 | 
			
		||||
    if (field_length == 0) {
 | 
			
		||||
      continue;  // Possible zero padded advertisement data
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // first byte of adv record is adv record type
 | 
			
		||||
    const uint8_t record_type = payload[offset++];
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,11 @@ void ESP32Camera::dump_config() {
 | 
			
		||||
  ESP_LOGCONFIG(TAG, "  HREF Pin: %d", conf.pin_href);
 | 
			
		||||
  ESP_LOGCONFIG(TAG, "  Pixel Clock Pin: %d", conf.pin_pclk);
 | 
			
		||||
  ESP_LOGCONFIG(TAG, "  External Clock: Pin:%d Frequency:%u", conf.pin_xclk, conf.xclk_freq_hz);
 | 
			
		||||
#ifdef USE_ESP_IDF  // Temporary until the espressif/esp32-camera library is updated
 | 
			
		||||
  ESP_LOGCONFIG(TAG, "  I2C Pins: SDA:%d SCL:%d", conf.pin_sscb_sda, conf.pin_sscb_scl);
 | 
			
		||||
#else
 | 
			
		||||
  ESP_LOGCONFIG(TAG, "  I2C Pins: SDA:%d SCL:%d", conf.pin_sccb_sda, conf.pin_sccb_scl);
 | 
			
		||||
#endif
 | 
			
		||||
  ESP_LOGCONFIG(TAG, "  Reset Pin: %d", conf.pin_reset);
 | 
			
		||||
  switch (this->config_.frame_size) {
 | 
			
		||||
    case FRAMESIZE_QQVGA:
 | 
			
		||||
@@ -209,8 +213,13 @@ void ESP32Camera::set_external_clock(uint8_t pin, uint32_t frequency) {
 | 
			
		||||
  this->config_.xclk_freq_hz = frequency;
 | 
			
		||||
}
 | 
			
		||||
void ESP32Camera::set_i2c_pins(uint8_t sda, uint8_t scl) {
 | 
			
		||||
#ifdef USE_ESP_IDF  // Temporary until the espressif/esp32-camera library is updated
 | 
			
		||||
  this->config_.pin_sscb_sda = sda;
 | 
			
		||||
  this->config_.pin_sscb_scl = scl;
 | 
			
		||||
#else
 | 
			
		||||
  this->config_.pin_sccb_sda = sda;
 | 
			
		||||
  this->config_.pin_sccb_scl = scl;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
void ESP32Camera::set_reset_pin(uint8_t pin) { this->config_.pin_reset = pin; }
 | 
			
		||||
void ESP32Camera::set_power_down_pin(uint8_t pin) { this->config_.pin_pwdn = pin; }
 | 
			
		||||
 
 | 
			
		||||
@@ -103,9 +103,11 @@ void I2SAudioMediaPlayer::stop_() {
 | 
			
		||||
 | 
			
		||||
void I2SAudioMediaPlayer::setup() {
 | 
			
		||||
  ESP_LOGCONFIG(TAG, "Setting up Audio...");
 | 
			
		||||
#if SOC_I2S_SUPPORTS_DAC
 | 
			
		||||
  if (this->internal_dac_mode_ != I2S_DAC_CHANNEL_DISABLE) {
 | 
			
		||||
    this->audio_ = make_unique<Audio>(true, this->internal_dac_mode_);
 | 
			
		||||
  } else {
 | 
			
		||||
#endif
 | 
			
		||||
    this->audio_ = make_unique<Audio>(false);
 | 
			
		||||
    this->audio_->setPinout(this->bclk_pin_, this->lrclk_pin_, this->dout_pin_);
 | 
			
		||||
    this->audio_->forceMono(this->external_dac_channels_ == 1);
 | 
			
		||||
@@ -113,7 +115,9 @@ void I2SAudioMediaPlayer::setup() {
 | 
			
		||||
      this->mute_pin_->setup();
 | 
			
		||||
      this->mute_pin_->digital_write(false);
 | 
			
		||||
    }
 | 
			
		||||
#if SOC_I2S_SUPPORTS_DAC
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
  this->state = media_player::MEDIA_PLAYER_STATE_IDLE;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -137,6 +141,7 @@ void I2SAudioMediaPlayer::dump_config() {
 | 
			
		||||
    ESP_LOGCONFIG(TAG, "Audio failed to initialize!");
 | 
			
		||||
    return;
 | 
			
		||||
  }
 | 
			
		||||
#if SOC_I2S_SUPPORTS_DAC
 | 
			
		||||
  if (this->internal_dac_mode_ != I2S_DAC_CHANNEL_DISABLE) {
 | 
			
		||||
    switch (this->internal_dac_mode_) {
 | 
			
		||||
      case I2S_DAC_CHANNEL_LEFT_EN:
 | 
			
		||||
@@ -152,6 +157,7 @@ void I2SAudioMediaPlayer::dump_config() {
 | 
			
		||||
        break;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
}  // namespace i2s_audio
 | 
			
		||||
 
 | 
			
		||||
@@ -25,7 +25,9 @@ class I2SAudioMediaPlayer : public Component, public media_player::MediaPlayer {
 | 
			
		||||
  void set_bclk_pin(uint8_t pin) { this->bclk_pin_ = pin; }
 | 
			
		||||
  void set_lrclk_pin(uint8_t pin) { this->lrclk_pin_ = pin; }
 | 
			
		||||
  void set_mute_pin(GPIOPin *mute_pin) { this->mute_pin_ = mute_pin; }
 | 
			
		||||
#if SOC_I2S_SUPPORTS_DAC
 | 
			
		||||
  void set_internal_dac_mode(i2s_dac_mode_t mode) { this->internal_dac_mode_ = mode; }
 | 
			
		||||
#endif
 | 
			
		||||
  void set_external_dac_channels(uint8_t channels) { this->external_dac_channels_ = channels; }
 | 
			
		||||
 | 
			
		||||
  media_player::MediaPlayerTraits get_traits() override;
 | 
			
		||||
@@ -51,7 +53,9 @@ class I2SAudioMediaPlayer : public Component, public media_player::MediaPlayer {
 | 
			
		||||
  bool muted_{false};
 | 
			
		||||
  float unmuted_volume_{0};
 | 
			
		||||
 | 
			
		||||
#if SOC_I2S_SUPPORTS_DAC
 | 
			
		||||
  i2s_dac_mode_t internal_dac_mode_{I2S_DAC_CHANNEL_DISABLE};
 | 
			
		||||
#endif
 | 
			
		||||
  uint8_t external_dac_channels_;
 | 
			
		||||
 | 
			
		||||
  HighFrequencyLoopRequester high_freq_;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
import esphome.codegen as cg
 | 
			
		||||
from esphome.components import media_player
 | 
			
		||||
from esphome.components import media_player, esp32
 | 
			
		||||
import esphome.config_validation as cv
 | 
			
		||||
 | 
			
		||||
from esphome import pins
 | 
			
		||||
@@ -33,6 +33,18 @@ INTERNAL_DAC_OPTIONS = {
 | 
			
		||||
 | 
			
		||||
EXTERNAL_DAC_OPTIONS = ["mono", "stereo"]
 | 
			
		||||
 | 
			
		||||
NO_INTERNAL_DAC_VARIANTS = [esp32.const.VARIANT_ESP32S2]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def validate_esp32_variant(config):
 | 
			
		||||
    if config[CONF_DAC_TYPE] != "internal":
 | 
			
		||||
        return config
 | 
			
		||||
    variant = esp32.get_esp32_variant()
 | 
			
		||||
    if variant in NO_INTERNAL_DAC_VARIANTS:
 | 
			
		||||
        raise cv.Invalid(f"{variant} does not have an internal DAC")
 | 
			
		||||
    return config
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CONFIG_SCHEMA = cv.All(
 | 
			
		||||
    cv.typed_schema(
 | 
			
		||||
        {
 | 
			
		||||
@@ -68,6 +80,7 @@ CONFIG_SCHEMA = cv.All(
 | 
			
		||||
        key=CONF_DAC_TYPE,
 | 
			
		||||
    ),
 | 
			
		||||
    cv.only_with_arduino,
 | 
			
		||||
    validate_esp32_variant,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
#include "esphome/core/defines.h"
 | 
			
		||||
#ifdef USE_ESP_IDF
 | 
			
		||||
 | 
			
		||||
#include <esp_task_wdt.h>
 | 
			
		||||
 | 
			
		||||
#include "ota_backend_esp_idf.h"
 | 
			
		||||
#include "ota_component.h"
 | 
			
		||||
#include <esp_ota_ops.h>
 | 
			
		||||
@@ -14,7 +16,9 @@ OTAResponseTypes IDFOTABackend::begin(size_t image_size) {
 | 
			
		||||
  if (this->partition_ == nullptr) {
 | 
			
		||||
    return OTA_RESPONSE_ERROR_NO_UPDATE_PARTITION;
 | 
			
		||||
  }
 | 
			
		||||
  esp_task_wdt_init(15, false);  // The following function takes longer than the 5 seconds timeout of WDT
 | 
			
		||||
  esp_err_t err = esp_ota_begin(this->partition_, image_size, &this->update_handle_);
 | 
			
		||||
  esp_task_wdt_init(CONFIG_ESP_TASK_WDT_TIMEOUT_S, false);  // Set the WDT back to the configured timeout
 | 
			
		||||
  if (err != ESP_OK) {
 | 
			
		||||
    esp_ota_abort(this->update_handle_);
 | 
			
		||||
    this->update_handle_ = 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
"""Constants used by esphome."""
 | 
			
		||||
 | 
			
		||||
__version__ = "2022.12.0-dev"
 | 
			
		||||
__version__ = "2022.12.2"
 | 
			
		||||
 | 
			
		||||
ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -129,9 +129,9 @@ class GitFile:
 | 
			
		||||
    def raw_url(self) -> str:
 | 
			
		||||
        if self.ref is None:
 | 
			
		||||
            raise ValueError("URL has no ref")
 | 
			
		||||
        if self.domain == "github":
 | 
			
		||||
        if self.domain == "github.com":
 | 
			
		||||
            return f"https://raw.githubusercontent.com/{self.owner}/{self.repo}/{self.ref}/{self.filename}"
 | 
			
		||||
        if self.domain == "gitlab":
 | 
			
		||||
        if self.domain == "gitlab.com":
 | 
			
		||||
            return f"https://gitlab.com/{self.owner}/{self.repo}/-/raw/{self.ref}/{self.filename}"
 | 
			
		||||
        raise NotImplementedError(f"Git domain {self.domain} not supported")
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,7 @@ pyserial==3.5
 | 
			
		||||
platformio==6.1.5  # When updating platformio, also update Dockerfile
 | 
			
		||||
esptool==4.4
 | 
			
		||||
click==8.1.3
 | 
			
		||||
esphome-dashboard==20221207.0
 | 
			
		||||
esphome-dashboard==20221213.0
 | 
			
		||||
aioesphomeapi==13.0.1
 | 
			
		||||
zeroconf==0.39.4
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user