mirror of
				https://github.com/esphome/esphome.git
				synced 2025-11-04 09:01:49 +00:00 
			
		
		
		
	Merge branch 'integration' into memory_api
This commit is contained in:
		@@ -11,7 +11,7 @@ from esphome.const import (
 | 
			
		||||
    CONF_SERVICES,
 | 
			
		||||
    PlatformFramework,
 | 
			
		||||
)
 | 
			
		||||
from esphome.core import CORE, coroutine_with_priority
 | 
			
		||||
from esphome.core import CORE, Lambda, coroutine_with_priority
 | 
			
		||||
from esphome.coroutine import CoroPriority
 | 
			
		||||
 | 
			
		||||
CODEOWNERS = ["@esphome/core"]
 | 
			
		||||
@@ -58,9 +58,64 @@ CONFIG_SCHEMA = cv.All(
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def mdns_txt_record(key: str, value: str) -> cg.RawExpression:
 | 
			
		||||
    """Create a mDNS TXT record.
 | 
			
		||||
 | 
			
		||||
    Public API for external components. Do not remove.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
        key: The TXT record key
 | 
			
		||||
        value: The TXT record value (static string only)
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
        A RawExpression representing a MDNSTXTRecord struct
 | 
			
		||||
    """
 | 
			
		||||
    return cg.RawExpression(
 | 
			
		||||
        f"{{MDNS_STR({cg.safe_exp(key)}), MDNS_STR({cg.safe_exp(value)})}}"
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async def _mdns_txt_record_templated(
 | 
			
		||||
    mdns_comp: cg.Pvariable, key: str, value: Lambda | str
 | 
			
		||||
) -> cg.RawExpression:
 | 
			
		||||
    """Create a mDNS TXT record with support for templated values.
 | 
			
		||||
 | 
			
		||||
    Internal helper function.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
        mdns_comp: The MDNSComponent instance (from cg.get_variable())
 | 
			
		||||
        key: The TXT record key
 | 
			
		||||
        value: The TXT record value (can be a static string or a lambda template)
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
        A RawExpression representing a MDNSTXTRecord struct
 | 
			
		||||
    """
 | 
			
		||||
    if not cg.is_template(value):
 | 
			
		||||
        # It's a static string - use directly in flash, no need to store in vector
 | 
			
		||||
        return mdns_txt_record(key, value)
 | 
			
		||||
    # It's a lambda - evaluate and store using helper
 | 
			
		||||
    templated_value = await cg.templatable(value, [], cg.std_string)
 | 
			
		||||
    safe_key = cg.safe_exp(key)
 | 
			
		||||
    dynamic_call = f"{mdns_comp}->add_dynamic_txt_value(({templated_value})())"
 | 
			
		||||
    return cg.RawExpression(f"{{MDNS_STR({safe_key}), MDNS_STR({dynamic_call})}}")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def mdns_service(
 | 
			
		||||
    service: str, proto: str, port: int, txt_records: list[dict[str, str]]
 | 
			
		||||
):
 | 
			
		||||
) -> cg.StructInitializer:
 | 
			
		||||
    """Create a mDNS service.
 | 
			
		||||
 | 
			
		||||
    Public API for external components. Do not remove.
 | 
			
		||||
 | 
			
		||||
    Args:
 | 
			
		||||
        service: Service name (e.g., "_http")
 | 
			
		||||
        proto: Protocol (e.g., "_tcp" or "_udp")
 | 
			
		||||
        port: Port number
 | 
			
		||||
        txt_records: List of MDNSTXTRecord expressions
 | 
			
		||||
 | 
			
		||||
    Returns:
 | 
			
		||||
        A StructInitializer representing a MDNSService struct
 | 
			
		||||
    """
 | 
			
		||||
    return cg.StructInitializer(
 | 
			
		||||
        MDNSService,
 | 
			
		||||
        ("service_type", cg.RawExpression(f"MDNS_STR({cg.safe_exp(service)})")),
 | 
			
		||||
@@ -120,26 +175,10 @@ async def to_code(config):
 | 
			
		||||
    await cg.register_component(var, config)
 | 
			
		||||
 | 
			
		||||
    for service in config[CONF_SERVICES]:
 | 
			
		||||
        # Build the txt records list for the service
 | 
			
		||||
        txt_records = []
 | 
			
		||||
        for txt_key, txt_value in service[CONF_TXT].items():
 | 
			
		||||
            if cg.is_template(txt_value):
 | 
			
		||||
                # It's a lambda - evaluate and store using helper
 | 
			
		||||
                templated_value = await cg.templatable(txt_value, [], cg.std_string)
 | 
			
		||||
                safe_key = cg.safe_exp(txt_key)
 | 
			
		||||
                dynamic_call = f"{var}->add_dynamic_txt_value(({templated_value})())"
 | 
			
		||||
                txt_records.append(
 | 
			
		||||
                    cg.RawExpression(
 | 
			
		||||
                        f"{{MDNS_STR({safe_key}), MDNS_STR({dynamic_call})}}"
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
            else:
 | 
			
		||||
                # It's a static string - use directly in flash, no need to store in vector
 | 
			
		||||
                txt_records.append(
 | 
			
		||||
                    cg.RawExpression(
 | 
			
		||||
                        f"{{MDNS_STR({cg.safe_exp(txt_key)}), MDNS_STR({cg.safe_exp(txt_value)})}}"
 | 
			
		||||
                    )
 | 
			
		||||
                )
 | 
			
		||||
        txt_records = [
 | 
			
		||||
            await _mdns_txt_record_templated(var, txt_key, txt_value)
 | 
			
		||||
            for txt_key, txt_value in service[CONF_TXT].items()
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        exp = mdns_service(
 | 
			
		||||
            service[CONF_SERVICE],
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
#include "opentherm.h"
 | 
			
		||||
#include "esphome/core/helpers.h"
 | 
			
		||||
#if defined(ESP32) || defined(USE_ESP_IDF)
 | 
			
		||||
#ifdef USE_ESP32
 | 
			
		||||
#include "driver/timer.h"
 | 
			
		||||
#include "esp_err.h"
 | 
			
		||||
#endif
 | 
			
		||||
@@ -31,7 +31,7 @@ OpenTherm *OpenTherm::instance = nullptr;
 | 
			
		||||
OpenTherm::OpenTherm(InternalGPIOPin *in_pin, InternalGPIOPin *out_pin, int32_t device_timeout)
 | 
			
		||||
    : in_pin_(in_pin),
 | 
			
		||||
      out_pin_(out_pin),
 | 
			
		||||
#if defined(ESP32) || defined(USE_ESP_IDF)
 | 
			
		||||
#ifdef USE_ESP32
 | 
			
		||||
      timer_group_(TIMER_GROUP_0),
 | 
			
		||||
      timer_idx_(TIMER_0),
 | 
			
		||||
#endif
 | 
			
		||||
@@ -57,7 +57,7 @@ bool OpenTherm::initialize() {
 | 
			
		||||
  this->out_pin_->setup();
 | 
			
		||||
  this->out_pin_->digital_write(true);
 | 
			
		||||
 | 
			
		||||
#if defined(ESP32) || defined(USE_ESP_IDF)
 | 
			
		||||
#ifdef USE_ESP32
 | 
			
		||||
  return this->init_esp32_timer_();
 | 
			
		||||
#else
 | 
			
		||||
  return true;
 | 
			
		||||
@@ -238,7 +238,7 @@ void IRAM_ATTR OpenTherm::write_bit_(uint8_t high, uint8_t clock) {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(ESP32) || defined(USE_ESP_IDF)
 | 
			
		||||
#ifdef USE_ESP32
 | 
			
		||||
 | 
			
		||||
bool OpenTherm::init_esp32_timer_() {
 | 
			
		||||
  // Search for a free timer. Maybe unstable, we'll see.
 | 
			
		||||
@@ -365,7 +365,7 @@ void IRAM_ATTR OpenTherm::stop_timer_() {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif  // END ESP32
 | 
			
		||||
#endif  // USE_ESP32
 | 
			
		||||
 | 
			
		||||
#ifdef ESP8266
 | 
			
		||||
// 5 kHz timer_
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
#include "esphome/core/helpers.h"
 | 
			
		||||
#include "esphome/core/log.h"
 | 
			
		||||
 | 
			
		||||
#if defined(ESP32) || defined(USE_ESP_IDF)
 | 
			
		||||
#ifdef USE_ESP32
 | 
			
		||||
#include "driver/timer.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@@ -356,7 +356,7 @@ class OpenTherm {
 | 
			
		||||
  ISRInternalGPIOPin isr_in_pin_;
 | 
			
		||||
  ISRInternalGPIOPin isr_out_pin_;
 | 
			
		||||
 | 
			
		||||
#if defined(ESP32) || defined(USE_ESP_IDF)
 | 
			
		||||
#ifdef USE_ESP32
 | 
			
		||||
  timer_group_t timer_group_;
 | 
			
		||||
  timer_idx_t timer_idx_;
 | 
			
		||||
#endif
 | 
			
		||||
@@ -370,7 +370,7 @@ class OpenTherm {
 | 
			
		||||
  int32_t timeout_counter_;  // <0 no timeout
 | 
			
		||||
  int32_t device_timeout_;
 | 
			
		||||
 | 
			
		||||
#if defined(ESP32) || defined(USE_ESP_IDF)
 | 
			
		||||
#ifdef USE_ESP32
 | 
			
		||||
  esp_err_t timer_error_ = ESP_OK;
 | 
			
		||||
  TimerErrorType timer_error_type_ = TimerErrorType::NO_TIMER_ERROR;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +0,0 @@
 | 
			
		||||
substitutions:
 | 
			
		||||
  gate_pin: GPIO5
 | 
			
		||||
  zero_cross_pin: GPIO4
 | 
			
		||||
 | 
			
		||||
<<: !include common.yaml
 | 
			
		||||
@@ -1,6 +0,0 @@
 | 
			
		||||
substitutions:
 | 
			
		||||
  tx_pin: GPIO4
 | 
			
		||||
  rx_pin: GPIO5
 | 
			
		||||
  request_pin: GPIO6
 | 
			
		||||
 | 
			
		||||
<<: !include common.yaml
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
substitutions:
 | 
			
		||||
  pin: GPIO2
 | 
			
		||||
 | 
			
		||||
<<: !include common.yaml
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
substitutions:
 | 
			
		||||
  verify_ssl: "false"
 | 
			
		||||
 | 
			
		||||
<<: !include common.yaml
 | 
			
		||||
@@ -1,5 +0,0 @@
 | 
			
		||||
substitutions:
 | 
			
		||||
  scl_pin: GPIO5
 | 
			
		||||
  sda_pin: GPIO4
 | 
			
		||||
 | 
			
		||||
<<: !include common.yaml
 | 
			
		||||
@@ -1,6 +0,0 @@
 | 
			
		||||
substitutions:
 | 
			
		||||
  tx_pin: GPIO4
 | 
			
		||||
  rx_pin: GPIO5
 | 
			
		||||
  pin: GPIO2
 | 
			
		||||
 | 
			
		||||
<<: !include common.yaml
 | 
			
		||||
@@ -1,19 +0,0 @@
 | 
			
		||||
light:
 | 
			
		||||
  - platform: neopixelbus
 | 
			
		||||
    id: addr3
 | 
			
		||||
    name: Neopixelbus Light
 | 
			
		||||
    gamma_correct: 2.8
 | 
			
		||||
    color_correct: [0.0, 0.0, 0.0, 0.0]
 | 
			
		||||
    default_transition_length: 10s
 | 
			
		||||
    effects:
 | 
			
		||||
      - addressable_flicker:
 | 
			
		||||
          name: Flicker Effect With Custom Values
 | 
			
		||||
          update_interval: 16ms
 | 
			
		||||
          intensity: 5%
 | 
			
		||||
    type: GRBW
 | 
			
		||||
    variant: SK6812
 | 
			
		||||
    method:
 | 
			
		||||
      type: esp32_rmt
 | 
			
		||||
      channel: 0
 | 
			
		||||
    num_leds: 5
 | 
			
		||||
    pin: 4
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
substitutions:
 | 
			
		||||
  tx_pin: GPIO4
 | 
			
		||||
  rx_pin: GPIO5
 | 
			
		||||
 | 
			
		||||
packages:
 | 
			
		||||
  base: !include common.yaml
 | 
			
		||||
 | 
			
		||||
display:
 | 
			
		||||
  - id: !extend main_lcd
 | 
			
		||||
    tft_url: http://esphome.io/default35.tft
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
<<: !include common.yaml
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
substitutions:
 | 
			
		||||
  scl_pin: GPIO5
 | 
			
		||||
  sda_pin: GPIO4
 | 
			
		||||
  i2s_bclk_pin: GPIO7
 | 
			
		||||
  i2s_lrclk_pin: GPIO6
 | 
			
		||||
  i2s_mclk_pin: GPIO9
 | 
			
		||||
  i2s_dout_pin: GPIO8
 | 
			
		||||
 | 
			
		||||
<<: !include common-audio_dac.yaml
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
substitutions:
 | 
			
		||||
  scl_pin: GPIO5
 | 
			
		||||
  sda_pin: GPIO4
 | 
			
		||||
  i2s_bclk_pin: GPIO7
 | 
			
		||||
  i2s_lrclk_pin: GPIO6
 | 
			
		||||
  i2s_mclk_pin: GPIO9
 | 
			
		||||
  i2s_dout_pin: GPIO8
 | 
			
		||||
 | 
			
		||||
<<: !include common.yaml
 | 
			
		||||
@@ -1,6 +0,0 @@
 | 
			
		||||
substitutions:
 | 
			
		||||
  clk_pin: GPIO6
 | 
			
		||||
  mosi_pin: GPIO7
 | 
			
		||||
  miso_pin: GPIO5
 | 
			
		||||
 | 
			
		||||
<<: !include common.yaml
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
<<: !include common_v2.yaml
 | 
			
		||||
@@ -1,16 +0,0 @@
 | 
			
		||||
wifi:
 | 
			
		||||
  ssid: MySSID
 | 
			
		||||
  password: password1
 | 
			
		||||
 | 
			
		||||
wled:
 | 
			
		||||
 | 
			
		||||
light:
 | 
			
		||||
  - platform: esp32_rmt_led_strip
 | 
			
		||||
    id: led_matrix_32x8
 | 
			
		||||
    default_transition_length: 500ms
 | 
			
		||||
    chipset: ws2812
 | 
			
		||||
    rgb_order: GRB
 | 
			
		||||
    num_leds: 256
 | 
			
		||||
    pin: 2
 | 
			
		||||
    effects:
 | 
			
		||||
      - wled:
 | 
			
		||||
		Reference in New Issue
	
	Block a user