mirror of
https://github.com/esphome/esphome.git
synced 2025-09-21 20:52:20 +01:00
Merge remote-tracking branch 'upstream/fold_ring_buffer_esp32_ble_tracker' into integration
This commit is contained in:
@@ -168,6 +168,8 @@ This document provides essential context for AI models interacting with this pro
|
|||||||
* `platformio.ini`: Configures the PlatformIO build environments for different microcontrollers.
|
* `platformio.ini`: Configures the PlatformIO build environments for different microcontrollers.
|
||||||
* `.pre-commit-config.yaml`: Configures the pre-commit hooks for linting and formatting.
|
* `.pre-commit-config.yaml`: Configures the pre-commit hooks for linting and formatting.
|
||||||
* **CI/CD Pipeline:** Defined in `.github/workflows`.
|
* **CI/CD Pipeline:** Defined in `.github/workflows`.
|
||||||
|
* **Static Analysis & Development:**
|
||||||
|
* `esphome/core/defines.h`: A comprehensive header file containing all `#define` directives that can be added by components using `cg.add_define()` in Python. This file is used exclusively for development, static analysis tools, and CI testing - it is not used during runtime compilation. When developing components that add new defines, they must be added to this file to ensure proper IDE support and static analysis coverage. The file includes feature flags, build configurations, and platform-specific defines that help static analyzers understand the complete codebase without needing to compile for specific platforms.
|
||||||
|
|
||||||
## 6. Development & Testing Workflow
|
## 6. Development & Testing Workflow
|
||||||
|
|
||||||
|
@@ -748,7 +748,7 @@ def _set_default_framework(config):
|
|||||||
config[CONF_FRAMEWORK][CONF_TYPE] = FRAMEWORK_ARDUINO
|
config[CONF_FRAMEWORK][CONF_TYPE] = FRAMEWORK_ARDUINO
|
||||||
# Show the migration message
|
# Show the migration message
|
||||||
_show_framework_migration_message(
|
_show_framework_migration_message(
|
||||||
config.get(CONF_NAME, "Your device"), variant
|
config.get(CONF_NAME, "This device"), variant
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
config[CONF_FRAMEWORK] = ESP_IDF_FRAMEWORK_SCHEMA({})
|
config[CONF_FRAMEWORK] = ESP_IDF_FRAMEWORK_SCHEMA({})
|
||||||
|
@@ -15,6 +15,7 @@ from freetype import (
|
|||||||
FT_LOAD_RENDER,
|
FT_LOAD_RENDER,
|
||||||
FT_LOAD_TARGET_MONO,
|
FT_LOAD_TARGET_MONO,
|
||||||
Face,
|
Face,
|
||||||
|
FT_Exception,
|
||||||
ft_pixel_mode_mono,
|
ft_pixel_mode_mono,
|
||||||
)
|
)
|
||||||
import requests
|
import requests
|
||||||
@@ -94,7 +95,14 @@ class FontCache(MutableMapping):
|
|||||||
return self.store[self._keytransform(item)]
|
return self.store[self._keytransform(item)]
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
def __setitem__(self, key, value):
|
||||||
self.store[self._keytransform(key)] = Face(str(value))
|
transformed = self._keytransform(key)
|
||||||
|
try:
|
||||||
|
self.store[transformed] = Face(str(value))
|
||||||
|
except FT_Exception as exc:
|
||||||
|
file = transformed.split(":", 1)
|
||||||
|
raise cv.Invalid(
|
||||||
|
f"{file[0].capitalize()} {file[1]} is not a valid font file"
|
||||||
|
) from exc
|
||||||
|
|
||||||
|
|
||||||
FONT_CACHE = FontCache()
|
FONT_CACHE = FontCache()
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
#include "binary_sensor.h"
|
#include "nfc_binary_sensor.h"
|
||||||
#include "../nfc_helpers.h"
|
#include "../nfc_helpers.h"
|
||||||
#include "esphome/core/log.h"
|
#include "esphome/core/log.h"
|
||||||
|
|
@@ -425,7 +425,7 @@ void AsyncEventSourceResponse::destroy(void *ptr) {
|
|||||||
void AsyncEventSourceResponse::deq_push_back_with_dedup_(void *source, message_generator_t *message_generator) {
|
void AsyncEventSourceResponse::deq_push_back_with_dedup_(void *source, message_generator_t *message_generator) {
|
||||||
DeferredEvent item(source, message_generator);
|
DeferredEvent item(source, message_generator);
|
||||||
|
|
||||||
// Replace std::find_if with simple loop to reduce binary size
|
// Use range-based for loop instead of std::find_if to reduce template instantiation overhead and binary size
|
||||||
for (auto &event : this->deferred_queue_) {
|
for (auto &event : this->deferred_queue_) {
|
||||||
if (event == item) {
|
if (event == item) {
|
||||||
event = item;
|
event = item;
|
||||||
|
@@ -87,7 +87,7 @@ from esphome.core import (
|
|||||||
TimePeriodNanoseconds,
|
TimePeriodNanoseconds,
|
||||||
TimePeriodSeconds,
|
TimePeriodSeconds,
|
||||||
)
|
)
|
||||||
from esphome.helpers import add_class_to_obj, list_starts_with
|
from esphome.helpers import add_class_to_obj, docs_url, list_starts_with
|
||||||
from esphome.schema_extractors import (
|
from esphome.schema_extractors import (
|
||||||
SCHEMA_EXTRACT,
|
SCHEMA_EXTRACT,
|
||||||
schema_extractor,
|
schema_extractor,
|
||||||
@@ -666,14 +666,6 @@ def only_with_framework(
|
|||||||
if suggestions is None:
|
if suggestions is None:
|
||||||
suggestions = {}
|
suggestions = {}
|
||||||
|
|
||||||
version = Version.parse(ESPHOME_VERSION)
|
|
||||||
if version.is_beta:
|
|
||||||
docs_format = "https://beta.esphome.io/components/{path}"
|
|
||||||
elif version.is_dev:
|
|
||||||
docs_format = "https://next.esphome.io/components/{path}"
|
|
||||||
else:
|
|
||||||
docs_format = "https://esphome.io/components/{path}"
|
|
||||||
|
|
||||||
def validator_(obj):
|
def validator_(obj):
|
||||||
if CORE.target_framework not in frameworks:
|
if CORE.target_framework not in frameworks:
|
||||||
err_str = f"This feature is only available with framework(s) {', '.join([framework.value for framework in frameworks])}"
|
err_str = f"This feature is only available with framework(s) {', '.join([framework.value for framework in frameworks])}"
|
||||||
@@ -681,7 +673,7 @@ def only_with_framework(
|
|||||||
(component, docs_path) = suggestion
|
(component, docs_path) = suggestion
|
||||||
err_str += f"\nPlease use '{component}'"
|
err_str += f"\nPlease use '{component}'"
|
||||||
if docs_path:
|
if docs_path:
|
||||||
err_str += f": {docs_format.format(path=docs_path)}"
|
err_str += f": {docs_url(path=f'components/{docs_path}')}"
|
||||||
raise Invalid(err_str)
|
raise Invalid(err_str)
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
@@ -9,6 +9,8 @@ import re
|
|||||||
import tempfile
|
import tempfile
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
|
from esphome.const import __version__ as ESPHOME_VERSION
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
IS_MACOS = platform.system() == "Darwin"
|
IS_MACOS = platform.system() == "Darwin"
|
||||||
@@ -503,3 +505,20 @@ _DISALLOWED_CHARS = re.compile(r"[^a-zA-Z0-9-_]")
|
|||||||
def sanitize(value):
|
def sanitize(value):
|
||||||
"""Same behaviour as `helpers.cpp` method `str_sanitize`."""
|
"""Same behaviour as `helpers.cpp` method `str_sanitize`."""
|
||||||
return _DISALLOWED_CHARS.sub("_", value)
|
return _DISALLOWED_CHARS.sub("_", value)
|
||||||
|
|
||||||
|
|
||||||
|
def docs_url(path: str) -> str:
|
||||||
|
"""Return the URL to the documentation for a given path."""
|
||||||
|
# Local import to avoid circular import
|
||||||
|
from esphome.config_validation import Version
|
||||||
|
|
||||||
|
version = Version.parse(ESPHOME_VERSION)
|
||||||
|
if version.is_beta:
|
||||||
|
docs_format = "https://beta.esphome.io/{path}"
|
||||||
|
elif version.is_dev:
|
||||||
|
docs_format = "https://next.esphome.io/{path}"
|
||||||
|
else:
|
||||||
|
docs_format = "https://esphome.io/{path}"
|
||||||
|
|
||||||
|
path = path.removeprefix("/")
|
||||||
|
return docs_format.format(path=path)
|
||||||
|
@@ -12,7 +12,7 @@ platformio==6.1.18 # When updating platformio, also update /docker/Dockerfile
|
|||||||
esptool==5.0.2
|
esptool==5.0.2
|
||||||
click==8.1.7
|
click==8.1.7
|
||||||
esphome-dashboard==20250514.0
|
esphome-dashboard==20250514.0
|
||||||
aioesphomeapi==37.2.3
|
aioesphomeapi==37.2.4
|
||||||
zeroconf==0.147.0
|
zeroconf==0.147.0
|
||||||
puremagic==1.30
|
puremagic==1.30
|
||||||
ruamel.yaml==0.18.14 # dashboard_import
|
ruamel.yaml==0.18.14 # dashboard_import
|
||||||
|
Reference in New Issue
Block a user