ESPHome is a system to control your ESP32, ESP8266, BK72xx, RP2040 by simple yet powerful configuration files and control them remotely through Home Automation systems.
This report presents the forensic synthetic code analysis of esphome/esphome, a C++ project with 11,613 GitHub stars. SynthScan v2.0 examined 812,057 lines of code across 8407 source files, recording 7471 pattern matches distributed across 21 syntactic categories. The overall adjusted score of 10.4 places this repository in the Low AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 7471 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit_tests/test_api_client.py | 21 | def test_component_shim_reexports_runtime_client() -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 32 | async def test_async_run_logs_full_flow(caplog) -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 89 | async def test_async_run_logs_never_resolves_without_crash_lines() -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 123 | def test_run_logs_suppresses_keyboard_interrupt() -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 142 | async def test_async_run_logs_passes_deep_sleep( | CODE |
| LOW | tests/unit_tests/test_api_client.py | 169 | async def test_async_run_logs_mqtt_resolver_feeds_addresses(caplog) -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 205 | async def test_async_run_logs_mqtt_resolver_no_addresses_keeps_running() -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 239 | async def test_async_run_logs_mqtt_resolver_stopped_on_teardown() -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 276 | async def test_async_run_logs_mqtt_resolver_crash_still_stops_cleanly(caplog) -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 309 | async def test_async_run_logs_connect_cancels_mqtt_discovery() -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 353 | async def test_async_run_logs_connect_before_discovery_skips_lookup() -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 384 | async def test_async_run_logs_mqtt_resolver_duplicate_addresses_logged(caplog) -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 421 | async def test_async_run_logs_base_exception_escape_logged_at_teardown(caplog) -> None: | CODE |
| LOW | tests/unit_tests/test_api_client.py | 456 | async def test_async_run_logs_stubborn_worker_cancelled_at_teardown() -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_upload_targets.py | 19 | def test_get_port_type_serial(port: str) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_upload_targets.py | 24 | def test_get_port_type_bootsel() -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_upload_targets.py | 34 | def test_get_port_type_mqttip() -> None: | CODE |
| LOW | tests/unit_tests/test_upload_targets.py | 48 | def test_get_port_type_network(port: str) -> None: | CODE |
| LOW | tests/unit_tests/test_upload_targets.py | 53 | def test_port_type_values_are_stable() -> None: | CODE |
| LOW | tests/unit_tests/test_upload_targets.py | 67 | def test_main_re_exports_for_backwards_compat() -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_web_server_logs.py | 140 | def test_consume_emits_only_log_frames( | CODE |
| LOW⚡ | tests/unit_tests/test_web_server_logs.py | 173 | def test_stream_returns_false_when_connect_fails( | CODE |
| LOW⚡ | tests/unit_tests/test_web_server_logs.py | 223 | def test_run_logs_streams_then_reconnects_until_interrupt( | CODE |
| LOW | tests/unit_tests/test_web_server_logs.py | 114 | def test_build_urls_dedups_and_skips_unresolvable( | CODE |
| LOW | tests/unit_tests/test_web_server_logs.py | 156 | def test_consume_ignores_unterminated_trailing_frame( | CODE |
| LOW | tests/unit_tests/test_web_server_logs.py | 192 | def test_stream_returns_true_when_established_then_dropped( | CODE |
| LOW | tests/unit_tests/test_web_server_logs.py | 251 | def test_run_logs_passes_basic_auth(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/unit_tests/test_web_server_logs.py | 281 | def test_run_logs_no_auth_when_credentials_missing( | CODE |
| LOW | tests/unit_tests/test_web_server_logs.py | 308 | def test_run_logs_raises_on_auth_failure(monkeypatch: pytest.MonkeyPatch) -> None: | CODE |
| LOW | tests/unit_tests/test_web_server_logs.py | 321 | def test_run_logs_retries_on_transient_status( | CODE |
| LOW | tests/unit_tests/test_web_server_logs.py | 343 | def test_run_logs_raises_on_permanent_status( | CODE |
| LOW | tests/unit_tests/test_web_server_logs.py | 358 | def test_run_logs_backs_off_on_repeated_failure( | CODE |
| LOW | tests/unit_tests/test_web_server_logs.py | 377 | def test_run_logs_reports_unresolvable( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 44 | def test_sanitize_quotes_replaces_with_escaped_char(): | CODE |
| LOW | tests/unit_tests/test_wizard.py | 58 | def test_config_file_fallback_ap_includes_descriptive_name( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 91 | def test_config_file_should_include_ota(default_config: dict[str, Any]): | CODE |
| LOW | tests/unit_tests/test_wizard.py | 104 | def test_config_file_should_include_ota_when_password_set( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 121 | def test_config_file_should_include_api_encryption_key( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 139 | def test_wizard_write_sets_platform( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 178 | def test_wizard_upload_config(tmp_path: Path, monkeypatch: MonkeyPatch): | CODE |
| LOW | tests/unit_tests/test_wizard.py | 329 | def test_safe_print_step_prints_step_number_and_description(monkeypatch: MonkeyPatch): | CODE |
| LOW | tests/unit_tests/test_wizard.py | 353 | def test_default_input_uses_default_if_no_input_supplied(monkeypatch: MonkeyPatch): | CODE |
| LOW | tests/unit_tests/test_wizard.py | 369 | def test_default_input_uses_user_supplied_value(monkeypatch: MonkeyPatch): | CODE |
| LOW | tests/unit_tests/test_wizard.py | 386 | def test_strip_accents_removes_diacritics(): | CODE |
| LOW | tests/unit_tests/test_wizard.py | 402 | def test_wizard_rejects_path_with_invalid_extension(): | CODE |
| LOW | tests/unit_tests/test_wizard.py | 417 | def test_wizard_rejects_existing_files(tmp_path): | CODE |
| LOW | tests/unit_tests/test_wizard.py | 507 | def test_wizard_offers_better_node_name( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 540 | def test_wizard_requires_correct_platform( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 564 | def test_wizard_requires_correct_board( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 588 | def test_wizard_requires_valid_ssid( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 612 | def test_wizard_write_protects_existing_config( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 633 | def test_wizard_accepts_ota_password( | CODE |
| LOW | tests/unit_tests/test_wizard.py | 660 | def test_wizard_accepts_rpipico_board(tmp_path: Path, monkeypatch: MonkeyPatch): | CODE |
| LOW | tests/unit_tests/test_wizard.py | 691 | def test_fallback_psk_uses_secrets_choice( | CODE |
| LOW⚡ | tests/unit_tests/test_address_cache.py | 13 | def test_normalize_simple_hostname() -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_address_cache.py | 20 | def test_normalize_removes_trailing_dots() -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_address_cache.py | 28 | def test_normalize_converts_to_lowercase() -> None: | CODE |
| LOW | tests/unit_tests/test_address_cache.py | 102 | def test_get_addresses_auto_detection() -> None: | CODE |
| LOW | tests/unit_tests/test_address_cache.py | 124 | def test_add_mdns_addresses_stores_and_normalizes() -> None: | CODE |
| LOW | tests/unit_tests/test_address_cache.py | 137 | def test_add_mdns_addresses_empty_is_noop() -> None: | CODE |
| 4857 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ker/ha-addon-rootfs/etc/cont-init.d/30-esphome-fork.sh | 2 | # ============================================================================== | COMMENT |
| MEDIUM | …ker/ha-addon-rootfs/etc/cont-init.d/30-esphome-fork.sh | 7 | # ============================================================================== | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_web_server_logs.py | 135 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_web_server_logs.py | 137 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_web_server_logs.py | 168 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_web_server_logs.py | 170 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_web_server_logs.py | 218 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_web_server_logs.py | 220 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_web_server_logs.py | 85 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_web_server_logs.py | 87 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_preference_hash_stability.py | 27 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_preference_hash_stability.py | 29 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_preference_hash_stability.py | 35 | # ===================================================================== | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_preference_hash_stability.py | 37 | # ===================================================================== | COMMENT |
| MEDIUM | tests/unit_tests/test_preference_hash_stability.py | 73 | # ===================================================================== | COMMENT |
| MEDIUM | tests/unit_tests/test_preference_hash_stability.py | 75 | # ===================================================================== | COMMENT |
| MEDIUM | tests/unit_tests/test_preference_hash_stability.py | 96 | # ===================================================================== | COMMENT |
| MEDIUM | tests/unit_tests/test_preference_hash_stability.py | 98 | # ===================================================================== | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_preference_hash_stability.py | 138 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_preference_hash_stability.py | 140 | # ============================================================================= | COMMENT |
| MEDIUM | tests/unit_tests/test_preference_hash_stability.py | 194 | # ============================================================================= | COMMENT |
| MEDIUM | tests/unit_tests/test_preference_hash_stability.py | 196 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_loader.py | 563 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_loader.py | 565 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_loader.py | 24 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_loader.py | 26 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_loader.py | 179 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_loader.py | 183 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_loader.py | 343 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_loader.py | 345 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_substitutions.py | 709 | # ── IncludeFile / package loading tests ──────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_config_normalization.py | 202 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_config_normalization.py | 205 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_config_normalization.py | 120 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/unit_tests/test_config_normalization.py | 123 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_web_server_ota.py | 53 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_web_server_ota.py | 55 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_web_server_ota.py | 167 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_web_server_ota.py | 169 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 102 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 104 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 119 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 121 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 173 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 175 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 213 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 215 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 300 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 302 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 446 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 448 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 509 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 511 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 759 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 761 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 846 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 848 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 1563 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 1565 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_bundle.py | 1597 | # --------------------------------------------------------------------------- | COMMENT |
| 347 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit_tests/test_lazy_imports.py | 41 | API_HEAVY_MODULES = ("aioesphomeapi",) | COMMENT |
| LOW | tests/unit_tests/components/test_rp2_generate_boards.py | 21 | #define PIN_SERIAL1_RX (1u) | COMMENT |
| LOW | tests/integration/test_status_flags.py | 141 | COMMENT | |
| LOW | tests/components/core/test_component_iterator.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | tests/components/core/test_lock_free_queue_single.cpp | 1 | // Exercises the LockFreeQueue PlainAtomic path under ESPHOME_THREAD_SINGLE — | COMMENT |
| LOW | tests/components/psram/validate.esp32-idf.yaml | 1 | # Config-only: with no options the single-mode ESP32 resolves mode -> quad and | COMMENT |
| LOW | tests/components/psram/validate.esp32-p4-idf.yaml | 1 | # Config-only: the ESP32-P4 has a distinct value set (hex mode, 20/100/200MHz). | COMMENT |
| LOW | tests/components/mitsubishi_cn105/common.h | 1 | #pragma once | COMMENT |
| LOW | …ts/mitsubishi_cn105/climate/mitsubishi_cn105_tests.cpp | 201 | // Partial frame (declares payload len=5, but we cut it short) | COMMENT |
| LOW | …ts/mitsubishi_cn105/climate/mitsubishi_cn105_tests.cpp | 221 | // ───────────────────────────── | COMMENT |
| LOW | …omponents/epaper_spi/display/test_t133a01_transfer.cpp | 21 | COMMENT | |
| LOW | tests/components/camera/common.yaml | 1 | # Camera is a base component auto-loaded by esp32_camera | COMMENT |
| LOW | tests/components/bluetooth_proxy/test.rp2040-ard.yaml | 1 | # Full proxy on the rp2 BLE hub: active defaults to true here (esp32 parity), | COMMENT |
| LOW | …mponents/ble_device_base/test_scan_response_merger.cpp | 1 | // The host test build gets this from the manifest override; clang-tidy does not. | COMMENT |
| LOW | tests/components/ble_device_base/test_raw_callback.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | tests/components/packet_transport/common.h | 1 | #pragma once | COMMENT |
| LOW | tests/components/time/is_valid.cpp | 1 | // Regression tests for ESPTime::is_valid() optional checks. | COMMENT |
| LOW | tests/components/time/posix_tz.cpp | 1 | // Tests for time conversion functions, DST detection, and ESPTime::strptime. | COMMENT |
| LOW | …/components/modbus_controller/command_payload_test.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | tests/components/modbus_client/common.yaml | 1 | # The modbus_client actions are self-contained hub devices: each takes the hub (auto-resolved when there | COMMENT |
| LOW | tests/components/modbus/heap_probe_test.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | tests/components/modbus/modbus_client_hub_test.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | tests/benchmarks/core/bench_scheduler.cpp | 1 | #include <benchmark/benchmark.h> | COMMENT |
| LOW | tests/benchmarks/components/api/bench_helpers.h | 1 | #pragma once | COMMENT |
| LOW | …uild_components/common/uart_bridge_2/esp32-s3-idf.yaml | 1 | # Common configuration for 2-channel UART bridge/expander chips | COMMENT |
| LOW | …t_build_components/common/uart_bridge_2/esp32-idf.yaml | 1 | # Common configuration for 2-channel UART bridge/expander chips | COMMENT |
| LOW | …uild_components/common/uart_bridge_4/esp32-s3-idf.yaml | 1 | # Common configuration for 4-channel UART bridge/expander chips | COMMENT |
| LOW | …t_build_components/common/uart_bridge_4/esp32-idf.yaml | 1 | # Common configuration for 4-channel UART bridge/expander chips | COMMENT |
| LOW | …build_components/common/test_display/test_display.yaml | 1 | # Shared "test display" package for component tests. | COMMENT |
| LOW | script/build_language_schema.py | 1161 | if isinstance(k, vol.Marker) and callable(k.schema): | COMMENT |
| LOW | script/merge_component_configs.py | 161 | return data | COMMENT |
| LOW | script/determine-jobs.py | 721 | benchmarked_components = { | COMMENT |
| LOW | script/list-components.py | 61 | changed = changed_files(args.branch) | COMMENT |
| LOW | script/analyze_component_buses.py | 361 | # Note: Components using $component_dir are now groupable because the merge | COMMENT |
| LOW | script/split_components_for_ci.py | 101 | COMMENT | |
| LOW | script/split_components_for_ci.py | 161 | # Components with the same signature stay in the same batches | COMMENT |
| LOW | .github/workflows/sync-device-classes.yml | 61 | uv pip install --system -r requirements.txt -r requirements_test.txt | COMMENT |
| LOW | .github/workflows/codeql.yml | 1 | # For most projects, this workflow file will not need changing; you simply need | COMMENT |
| LOW | .github/workflows/codeql.yml | 41 | # - language: c-cpp | COMMENT |
| LOW | .github/workflows/codeql.yml | 61 | languages: ${{ matrix.language }} | COMMENT |
| LOW | .github/workflows/ci.yml | 321 | runs-on: ubuntu-24.04 | COMMENT |
| LOW | .github/workflows/ci.yml | 1181 | version: "0.11.15" | COMMENT |
| LOW | esphome/git.py | 41 | # entry lock so that recovery cannot hang forever behind another process. | COMMENT |
| LOW | esphome/git.py | 221 | COMMENT | |
| LOW | esphome/git.py | 781 | # can tell a quiescent complete entry from one mid-rewrite, | COMMENT |
| LOW | esphome/yaml_util.py | 721 | "While constructing a mapping", | COMMENT |
| LOW | esphome/util.py | 221 | # real result is already on its way out; raising here would | COMMENT |
| LOW | esphome/framework_helpers.py | 1081 | # No sha, no size, and the server sent no usable | COMMENT |
| LOW | esphome/coroutine.py | 81 | # Examples: async_tcp (200) | COMMENT |
| LOW | esphome/coroutine.py | 121 | WEB_SERVER_OTA = 52 | COMMENT |
| LOW | esphome/loader.py | 341 | # ``esphome/component_aliases.py`` (CI and a unit test fail if the registry | COMMENT |
| LOW | esphome/loader.py | 541 | try: | COMMENT |
| LOW | esphome/api_client.py | 121 | # safe_print handles the dashboard \033 escaping and falls back | COMMENT |
| LOW | esphome/__main__.py | 2581 | parser_bundle.add_argument( | COMMENT |
| LOW | esphome/core/time.h | 1 | #pragma once | COMMENT |
| LOW | esphome/core/helpers.cpp | 1 | #include "esphome/core/helpers.h" | COMMENT |
| LOW | esphome/core/progmem.h | 1 | #pragma once | COMMENT |
| LOW | esphome/core/progmem.h | 21 | #define ESPHOME_snprintf_P snprintf_P | COMMENT |
| LOW | esphome/core/progmem.h | 41 | #define ESPHOME_PSTR(s) (s) | COMMENT |
| LOW | esphome/core/version.h | 1 | #pragma once | COMMENT |
| 967 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit_tests/test_api_client.py | 3 | CODE | |
| LOW | tests/unit_tests/test_web_server_logs.py | 3 | CODE | |
| LOW | tests/unit_tests/test_address_cache.py | 3 | CODE | |
| LOW | tests/unit_tests/test_async_thread.py | 3 | CODE | |
| LOW | tests/unit_tests/test_arduino_library.py | 3 | CODE | |
| LOW | tests/unit_tests/test_lazy_imports.py | 15 | CODE | |
| LOW | tests/unit_tests/test_platformio_runner.py | 3 | CODE | |
| LOW | tests/unit_tests/test_compiled_config.py | 3 | CODE | |
| LOW | tests/unit_tests/test_config_prefetch.py | 3 | CODE | |
| LOW | tests/unit_tests/test_platformio_extra_script.py | 3 | CODE | |
| LOW | tests/unit_tests/test_dashboard_import.py | 10 | CODE | |
| LOW | tests/unit_tests/test_platformio_registry.py | 3 | CODE | |
| LOW | tests/unit_tests/test_size_summary.py | 3 | CODE | |
| LOW | tests/unit_tests/test_mqtt.py | 3 | CODE | |
| LOW | tests/unit_tests/test_espota2.py | 3 | CODE | |
| LOW | tests/unit_tests/test_util.py | 3 | CODE | |
| LOW | tests/unit_tests/test_happy_eyeballs.py | 3 | CODE | |
| LOW | tests/unit_tests/test_web_server_ota.py | 3 | CODE | |
| LOW | tests/unit_tests/test_bundle.py | 3 | CODE | |
| LOW | tests/unit_tests/test_download_types.py | 8 | CODE | |
| LOW | tests/unit_tests/test_platform_hooks.py | 9 | CODE | |
| LOW | tests/unit_tests/test_espidf_runner.py | 3 | CODE | |
| LOW | tests/unit_tests/test_stacktrace.py | 3 | CODE | |
| LOW | tests/unit_tests/test_zeroconf.py | 11 | CODE | |
| LOW | tests/unit_tests/test_main.py | 3 | CODE | |
| LOW | tests/unit_tests/test_resolver.py | 3 | CODE | |
| LOW | tests/unit_tests/test_arduino8266_framework.py | 3 | CODE | |
| LOW | tests/unit_tests/test_web_server_helpers.py | 3 | CODE | |
| LOW | tests/unit_tests/components/test_esp8266.py | 3 | CODE | |
| LOW | tests/unit_tests/components/test_rp2_generate_boards.py | 3 | CODE | |
| LOW | tests/unit_tests/components/file/test_image.py | 3 | CODE | |
| LOW | tests/unit_tests/components/shelly_dimmer/test_light.py | 3 | CODE | |
| LOW | …ts/unit_tests/components/esp8266/test_build_surgery.py | 3 | CODE | |
| LOW | tests/unit_tests/components/api/test_api_proto.py | 31 | CODE | |
| LOW | …it_tests/components/api/test_api_protobuf_generator.py | 9 | CODE | |
| LOW | tests/unit_tests/components/gsl3670/test_touchscreen.py | 3 | CODE | |
| LOW | tests/unit_tests/components/font/test_init.py | 3 | CODE | |
| LOW | tests/unit_tests/components/bme68x_bsec2/test_init.py | 3 | CODE | |
| LOW | tests/unit_tests/components/lvgl/test_table_codegen.py | 3 | CODE | |
| LOW | tests/unit_tests/components/lvgl/test_table_config.py | 3 | CODE | |
| LOW | tests/unit_tests/build_gen/test_build_tool.py | 3 | CODE | |
| LOW | tests/unit_tests/build_gen/test_platformio.py | 3 | CODE | |
| LOW | tests/unit_tests/build_gen/test_espidf.py | 3 | CODE | |
| LOW | tests/unit_tests/build_helpers/test_size_summary.py | 3 | CODE | |
| LOW | tests/unit_tests/build_helpers/test_ccache.py | 3 | CODE | |
| LOW | tests/unit_tests/build_helpers/test_ninja.py | 3 | CODE | |
| LOW | tests/integration/test_large_message_batching.py | 3 | CODE | |
| LOW | tests/integration/test_host_mode_many_entities.py | 3 | CODE | |
| LOW | tests/integration/test_wait_until_ordering.py | 10 | CODE | |
| LOW | tests/integration/test_select_stringref_trigger.py | 3 | CODE | |
| LOW | …sts/integration/test_binary_sensor_invalidate_state.py | 10 | CODE | |
| LOW | tests/integration/test_gpio_expander_cache.py | 3 | CODE | |
| LOW | tests/integration/test_text_command.py | 8 | CODE | |
| LOW | tests/integration/test_api_action_responses.py | 6 | CODE | |
| LOW | tests/integration/test_host_mode_basic.py | 3 | CODE | |
| LOW | tests/integration/test_script_array_params.py | 10 | CODE | |
| LOW | …ts/integration/test_logger_buffered_recursion_guard.py | 24 | CODE | |
| LOW | tests/integration/test_addressable_light_transition.py | 19 | CODE | |
| LOW | tests/integration/test_uart_mock_modbus.py | 18 | CODE | |
| LOW | tests/integration/conftest.py | 3 | CODE | |
| 373 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/unit_tests/test_loader.py | 123 | # Create a mock module with FILTER_SOURCE_FILES function | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 852 | # Create a real file with markers | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 942 | # Create a file with begin marker but no end marker | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 964 | # Create a file with duplicate begin markers | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 1119 | # Create an absolute custom build path directory with contents | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 1217 | # Create a file in cwd that must NOT be cleaned | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 1582 | # Create a read-only file (simulating git pack files on Windows) | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 1616 | # Create a subdirectory with read-only files | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 2240 | # Create a source file | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 2361 | # Create an existing source file in the build tree | COMMENT |
| MEDIUM | tests/unit_tests/test_substitutions.py | 209 | # Create an OrderedDict config with substitutions | COMMENT |
| MEDIUM | tests/unit_tests/test_substitutions.py | 299 | # Create a minimal valid config | COMMENT |
| MEDIUM | tests/unit_tests/test_substitutions.py | 329 | # Create a minimal valid config | COMMENT |
| MEDIUM | tests/unit_tests/test_espota2.py | 744 | # Create a real firmware file | COMMENT |
| MEDIUM | tests/unit_tests/test_espota2.py | 954 | # Create a real firmware file | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_git.py | 122 | # Create a simple git repo to test with | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 729 | # Create the git repo directory structure | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 795 | # Create the git repo directory structure | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 844 | # Create the git repo directory structure | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 898 | # Create the git repo directory structure | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 977 | # Create the git repo directory structure | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 805 | fetch_head.touch() # Create the file | CODE |
| MEDIUM | tests/unit_tests/test_git.py | 854 | fetch_head.touch() # Create the file | CODE |
| MEDIUM | tests/unit_tests/test_git.py | 987 | fetch_head.touch() # Create the file | CODE |
| MEDIUM | tests/unit_tests/test_util.py | 917 | # Create the expected directory structure | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_yaml_util.py | 135 | # Create an empty secrets file | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_yaml_util.py | 145 | # Create a YAML file with a secret but no secrets.yaml | COMMENT |
| MEDIUM | tests/unit_tests/test_yaml_util.py | 123 | # Create a YAML file with a secret that doesn't exist | COMMENT |
| MEDIUM | tests/unit_tests/test_yaml_util.py | 166 | # Create a subdirectory with a YAML file that uses secrets | COMMENT |
| MEDIUM | tests/unit_tests/test_yaml_util.py | 370 | # Create a dict with unsorted keys | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_helpers.py | 783 | # Create a file | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_helpers.py | 794 | # Create a file where we want to create a directory | COMMENT |
| MEDIUM | tests/unit_tests/test_helpers.py | 888 | # Create a directory and make it read-only | COMMENT |
| MEDIUM | tests/unit_tests/test_main.py | 1623 | # Create the actual firmware files so they exist | COMMENT |
| MEDIUM | tests/unit_tests/test_main.py | 1731 | # Create a test firmware file | COMMENT |
| MEDIUM | tests/unit_tests/test_main.py | 4998 | # Create a mock OSError with a specific message | COMMENT |
| MEDIUM | tests/unit_tests/test_main.py | 5026 | # Create a mock OSError without a message | COMMENT |
| MEDIUM | tests/unit_tests/test_config_helpers.py | 43 | # Create the filter function | COMMENT |
| MEDIUM | tests/unit_tests/test_config_helpers.py | 82 | # Create the filter function | COMMENT |
| MEDIUM | tests/unit_tests/test_config_helpers.py | 111 | # Create the filter function | COMMENT |
| MEDIUM | tests/unit_tests/core/test_config.py | 722 | # Create a file (not a directory) | COMMENT |
| MEDIUM | tests/unit_tests/core/test_config.py | 725 | # Create a directory without __init__.py | COMMENT |
| MEDIUM | tests/integration/conftest.py | 97 | # Create the test cache directory if it doesn't exist | COMMENT |
| MEDIUM | tests/integration/conftest.py | 380 | # Create a future to signal when connected | COMMENT |
| MEDIUM | tests/integration/conftest.py | 526 | # Create a pseudo-terminal to make the binary think it's running interactively | COMMENT |
| MEDIUM | tests/integration/test_oversized_payloads.py | 42 | # Create an oversized payload (>32768 bytes which is our new limit) | COMMENT |
| MEDIUM | tests/integration/test_oversized_payloads.py | 47 | # Create a message with oversized payload | COMMENT |
| MEDIUM | tests/integration/test_oversized_payloads.py | 170 | # Create an oversized payload (>32768 bytes which is our new limit) | COMMENT |
| MEDIUM | tests/integration/test_host_mode_entity_fields.py | 25 | # Create a map of entity names to entity info | COMMENT |
| MEDIUM | tests/integration/test_object_id_api_verification.py | 98 | # Create a map of entity names to entity info | COMMENT |
| MEDIUM | tests/integration/test_scheduler_rapid_cancellation.py | 31 | # Create a future to signal test completion | COMMENT |
| MEDIUM | tests/integration/test_scheduler_recursive_timeout.py | 30 | # Create a future to signal test completion | COMMENT |
| MEDIUM | tests/integration/test_scheduler_heap_stress.py | 31 | # Create a future to signal test completion | COMMENT |
| MEDIUM | …s/integration/test_scheduler_simultaneous_callbacks.py | 31 | # Create a future to signal test completion | COMMENT |
| MEDIUM | tests/integration/test_device_id_in_state.py | 108 | # Create a mapping of entity key to expected device_id | COMMENT |
| MEDIUM | tests/integration/test_entity_icon.py | 25 | # Create a map of entity names to entity info | COMMENT |
| MEDIUM | tests/integration/test_scheduler_bulk_cleanup.py | 31 | # Create a future to signal test completion | COMMENT |
| MEDIUM | tests/integration/test_scheduler_defer_stress.py | 31 | # Create a future to signal test completion | COMMENT |
| MEDIUM | tests/integration/test_host_mode_fan_preset.py | 28 | # Create a map of fan names to entity info | COMMENT |
| MEDIUM | …sts/integration/test_scheduler_defer_cancel_regular.py | 19 | # Create a future to signal test completion | COMMENT |
| 31 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/build.py | 102 | CODE | |
| LOW | docker/generate_tags.py | 35 | CODE | |
| LOW | tests/unit_tests/test_compiled_config.py | 200 | CODE | |
| LOW | tests/unit_tests/test_substitutions.py | 44 | CODE | |
| LOW | tests/unit_tests/test_stacktrace.py | 121 | CODE | |
| LOW | tests/unit_tests/components/api/test_api_proto.py | 99 | CODE | |
| LOW | tests/integration/test_scheduler_defer_cancel.py | 12 | CODE | |
| LOW | tests/integration/test_scheduler_self_keyed.py | 19 | CODE | |
| LOW | tests/integration/test_scheduler_self_keyed.py | 36 | CODE | |
| LOW | tests/integration/test_api_action_responses.py | 19 | CODE | |
| LOW | tests/integration/test_api_action_responses.py | 49 | CODE | |
| LOW | tests/integration/test_scheduler_string_test.py | 12 | CODE | |
| LOW | tests/integration/test_scheduler_string_test.py | 41 | CODE | |
| LOW | tests/integration/conftest.py | 517 | CODE | |
| LOW | tests/integration/test_api_custom_services.py | 16 | CODE | |
| LOW | tests/integration/test_api_custom_services.py | 58 | CODE | |
| LOW | …integration/test_scheduler_internal_id_no_collision.py | 18 | CODE | |
| LOW | …integration/test_scheduler_internal_id_no_collision.py | 47 | CODE | |
| LOW | tests/integration/test_scheduler_numeric_id_test.py | 12 | CODE | |
| LOW | tests/integration/test_scheduler_numeric_id_test.py | 42 | CODE | |
| LOW | tests/integration/test_scheduler_pool.py | 14 | CODE | |
| LOW | tests/integration/test_scheduler_pool.py | 54 | CODE | |
| LOW | tests/integration/test_api_message_size_batching.py | 14 | CODE | |
| LOW | tests/integration/test_crc8_helper.py | 14 | CODE | |
| LOW | tests/integration/test_crc8_helper.py | 44 | CODE | |
| LOW | tests/integration/test_api_homeassistant.py | 23 | CODE | |
| LOW | tests/integration/test_api_homeassistant.py | 116 | CODE | |
| LOW | tests/integration/test_loop_disable_enable.py | 15 | CODE | |
| LOW | tests/integration/test_loop_disable_enable.py | 61 | CODE | |
| LOW | tests/integration/test_sensor_filters_sliding_window.py | 15 | CODE | |
| LOW | tests/integration/test_sensor_filters_sliding_window.py | 39 | CODE | |
| LOW | tests/integration/test_scheduler_rapid_cancellation.py | 14 | CODE | |
| LOW | tests/integration/test_scheduler_rapid_cancellation.py | 45 | CODE | |
| LOW | tests/integration/test_sensor_timeout_filter.py | 15 | CODE | |
| LOW | tests/integration/test_sensor_timeout_filter.py | 35 | CODE | |
| LOW | tests/integration/test_scheduler_recursive_timeout.py | 13 | CODE | |
| LOW | tests/integration/test_scheduler_recursive_timeout.py | 43 | CODE | |
| LOW | tests/integration/state_utils.py | 333 | CODE | |
| LOW | tests/integration/test_script_wait_on_boot.py | 31 | CODE | |
| LOW | tests/integration/test_script_wait_on_boot.py | 61 | CODE | |
| LOW | tests/integration/test_script_queued_idle_loop.py | 14 | CODE | |
| LOW | tests/integration/test_script_queued_idle_loop.py | 38 | CODE | |
| LOW | tests/integration/test_wait_until_reentrant_restart.py | 22 | CODE | |
| LOW | tests/integration/test_wait_until_reentrant_restart.py | 37 | CODE | |
| LOW | tests/integration/test_light_automations.py | 15 | CODE | |
| LOW | tests/integration/test_light_automations.py | 36 | CODE | |
| LOW | tests/integration/test_scheduler_defer_fifo_simple.py | 12 | CODE | |
| LOW | tests/integration/test_api_conditional_memory.py | 15 | CODE | |
| LOW | tests/integration/test_api_conditional_memory.py | 39 | CODE | |
| LOW | tests/integration/test_sensor_filters_value_list.py | 16 | CODE | |
| LOW | tests/integration/test_sensor_filters_value_list.py | 44 | CODE | |
| LOW | …egration/test_alarm_control_panel_state_transitions.py | 23 | CODE | |
| LOW | tests/integration/test_script_delay_params.py | 27 | CODE | |
| LOW | tests/integration/test_script_delay_params.py | 55 | CODE | |
| LOW | tests/integration/test_action_concurrent_reentry.py | 15 | CODE | |
| LOW | tests/integration/test_action_concurrent_reentry.py | 42 | CODE | |
| LOW | tests/integration/test_api_action_timeout.py | 20 | CODE | |
| LOW | tests/integration/test_api_action_timeout.py | 54 | CODE | |
| LOW | tests/integration/test_automations.py | 14 | CODE | |
| LOW | tests/integration/test_automations.py | 38 | CODE | |
| 185 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/integration/test_light_effect_zero_brightness.py | 0 | send a light command and wait for the state response. | STRING |
| HIGH | tests/integration/test_light_binary_effect_off_phase.py | 0 | send a light command and wait for the state response. | STRING |
| HIGH | tests/integration/test_light_constant_brightness.py | 0 | send a light command and wait for the state response. | STRING |
| HIGH | …ts/component_tests/binary_sensor/test_binary_sensor.py | 0 | when the gpio binary sensor is set in the yaml file, it should be registered in main | STRING |
| HIGH | tests/component_tests/text/test_text.py | 0 | when the gpio binary sensor is set in the yaml file, it should be registered in main | STRING |
| HIGH | tests/component_tests/gpio/test_gpio_binary_sensor.py | 0 | when the gpio binary sensor is set in the yaml file, it should be registered in main | STRING |
| HIGH | …ts/component_tests/binary_sensor/test_binary_sensor.py | 0 | when the mandatory fields are set in the yaml, they should be set in main | STRING |
| HIGH | tests/component_tests/text_sensor/test_text_sensor.py | 0 | when the mandatory fields are set in the yaml, they should be set in main | STRING |
| HIGH | tests/component_tests/button/test_button.py | 0 | when the mandatory fields are set in the yaml, they should be set in main | STRING |
| HIGH | tests/component_tests/text/test_text.py | 0 | when the mandatory fields are set in the yaml, they should be set in main | STRING |
| HIGH | …ts/component_tests/binary_sensor/test_binary_sensor.py | 0 | test that the "internal" config value is correctly set | STRING |
| HIGH | tests/component_tests/text_sensor/test_text_sensor.py | 0 | test that the "internal" config value is correctly set | STRING |
| HIGH | tests/component_tests/button/test_button.py | 0 | test that the "internal" config value is correctly set | STRING |
| HIGH | tests/component_tests/text/test_text.py | 0 | test that the "internal" config value is correctly set | STRING |
| HIGH | …s/component_tests/mipi_spi/test_padding_and_offsets.py | 0 | run schema + final validation and return the validated config. | STRING |
| HIGH | tests/component_tests/mipi_spi/test_page_selection.py | 0 | run schema + final validation and return the validated config. | STRING |
| HIGH | tests/component_tests/mipi_spi/test_display_metadata.py | 0 | run schema + final validation and return the validated config. | STRING |
| HIGH | esphome/components/qspi_dbi/__init__.py | 0 | the 'ili9xxx' component is deprecated and no new models will be added to it. new model prs should target the newer and m | STRING |
| HIGH | esphome/components/st7735/__init__.py | 0 | the 'ili9xxx' component is deprecated and no new models will be added to it. new model prs should target the newer and m | STRING |
| HIGH | esphome/components/ili9xxx/__init__.py | 0 | the 'ili9xxx' component is deprecated and no new models will be added to it. new model prs should target the newer and m | STRING |
| HIGH | esphome/components/mipi_rgb/display.py | 0 | it is safe to use strapping pins as rgb output data bits, as they are outputs only, and not initialised until after boot | STRING |
| HIGH | esphome/components/rpi_dpi_rgb/display.py | 0 | it is safe to use strapping pins as rgb output data bits, as they are outputs only, and not initialised until after boot | STRING |
| HIGH | esphome/components/st7701s/display.py | 0 | it is safe to use strapping pins as rgb output data bits, as they are outputs only, and not initialised until after boot | STRING |
| HIGH | esphome/components/ln882x/__init__.py | 0 | ██╗ ██╗ █████╗ ██████╗ ███╗ ██╗██╗███╗ ██╗ ██████╗ ██║ ██║██╔══██╗██╔══██╗████╗ ██║██║████╗ ██║██╔════╝ ██║ █╗ ██║██████ | STRING |
| HIGH | esphome/components/bk72xx/__init__.py | 0 | ██╗ ██╗ █████╗ ██████╗ ███╗ ██╗██╗███╗ ██╗ ██████╗ ██║ ██║██╔══██╗██╔══██╗████╗ ██║██║████╗ ██║██╔════╝ ██║ █╗ ██║██████ | STRING |
| HIGH | esphome/components/rtl87xx/__init__.py | 0 | ██╗ ██╗ █████╗ ██████╗ ███╗ ██╗██╗███╗ ██╗ ██████╗ ██║ ██║██╔══██╗██╔══██╗████╗ ██║██║████╗ ██║██╔════╝ ██║ █╗ ██║██████ | STRING |
| HIGH | esphome/components/ln882x/boards.py | 0 | ██╗ ██╗ █████╗ ██████╗ ███╗ ██╗██╗███╗ ██╗ ██████╗ ██║ ██║██╔══██╗██╔══██╗████╗ ██║██║████╗ ██║██╔════╝ ██║ █╗ ██║██████ | STRING |
| HIGH | esphome/components/bk72xx/boards.py | 0 | ██╗ ██╗ █████╗ ██████╗ ███╗ ██╗██╗███╗ ██╗ ██████╗ ██║ ██║██╔══██╗██╔══██╗████╗ ██║██║████╗ ██║██╔════╝ ██║ █╗ ██║██████ | STRING |
| HIGH | esphome/components/rtl87xx/boards.py | 0 | ██╗ ██╗ █████╗ ██████╗ ███╗ ██╗██╗███╗ ██╗ ██████╗ ██║ ██║██╔══██╗██╔══██╗████╗ ██║██║████╗ ██║██╔════╝ ██║ █╗ ██║██████ | STRING |
| HIGH | esphome/components/esp32/__init__.py | 0 | binary-download entries for a built libretiny firmware. used by device-builder (esphome/device-builder), via ``importlib | STRING |
| HIGH | esphome/components/esp8266/__init__.py | 0 | binary-download entries for a built libretiny firmware. used by device-builder (esphome/device-builder), via ``importlib | STRING |
| HIGH | esphome/components/rp2/__init__.py | 0 | binary-download entries for a built libretiny firmware. used by device-builder (esphome/device-builder), via ``importlib | STRING |
| HIGH | esphome/components/libretiny/__init__.py | 0 | binary-download entries for a built libretiny firmware. used by device-builder (esphome/device-builder), via ``importlib | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit_tests/core/test_entity_helpers.py | 843 | # Set friendly_name to a specific value | COMMENT |
| LOW | tests/unit_tests/core/test_entity_helpers.py | 873 | # Set friendly_name to empty | COMMENT |
| LOW | tests/integration/test_host_mode_many_entities.py | 42 | # Check if we have received minimum expected states | COMMENT |
| LOW | tests/integration/test_gpio_expander_cache.py | 100 | # Check if this line contains a read operation we're tracking | COMMENT |
| LOW | tests/integration/conftest.py | 94 | # Check if the native platform is installed (the actual indicator of a populated cache) | COMMENT |
| LOW | tests/integration/conftest.py | 622 | # Check if process died | COMMENT |
| LOW | tests/integration/test_api_message_size_batching.py | 174 | # Check if we've received states from all expected entities | COMMENT |
| LOW | tests/integration/test_api_homeassistant.py | 99 | # Check if this service call is one we're waiting for | COMMENT |
| LOW | tests/integration/test_loop_disable_enable.py | 82 | # Check if component was re-enabled (count > 10) | COMMENT |
| LOW | tests/integration/test_sensor_filters_sliding_window.py | 55 | # Check if we received the expected final value | COMMENT |
| LOW | tests/integration/test_sensor_filters_sliding_window.py | 230 | # Check if both have received their final values | COMMENT |
| LOW | tests/integration/test_sensor_filters_ring_buffer.py | 50 | # Check if we've received enough updates from all sensors | COMMENT |
| LOW | tests/integration/state_utils.py | 254 | # Check if we've now seen all entities | COMMENT |
| LOW | tests/integration/test_scheduler_heap_stress.py | 72 | # Check if we've executed all 1000 callbacks (0-999) | COMMENT |
| LOW | tests/integration/test_areas_and_devices.py | 100 | # Check if we have all initial states | COMMENT |
| LOW | tests/integration/test_scheduler_defer_stress.py | 67 | # Check if we've executed all 1000 defers (0-999) | COMMENT |
| LOW | tests/integration/test_automations.py | 123 | # Check if we have all 3 completions | COMMENT |
| LOW | tests/component_tests/conftest.py | 41 | # Check if config directory exists, if not use parent directory | COMMENT |
| LOW | tests/component_tests/conftest.py | 43 | # Set config_path to a dummy yaml file in the config directory | COMMENT |
| LOW | tests/component_tests/esp32/test_esp32.py | 63 | # Check if the variant is valid | COMMENT |
| LOW | tests/component_tests/sntp/test_init.py | 140 | # Check if merging occurred | COMMENT |
| LOW | script/determine-jobs.py | 710 | # Check if benchmark infrastructure changed | COMMENT |
| LOW | script/determine-jobs.py | 717 | # Check if any directly changed component has benchmarks | COMMENT |
| LOW | script/determine-jobs.py | 998 | # Check if this is a platform-specific file | COMMENT |
| LOW | script/analyze_component_buses.py | 239 | # Check if buses are defined directly (not via packages) | COMMENT |
| LOW⚡ | script/analyze_component_buses.py | 364 | # Check if component is explicitly isolated | COMMENT |
| LOW⚡ | script/analyze_component_buses.py | 369 | # Check if component is a base bus component | COMMENT |
| LOW⚡ | script/analyze_component_buses.py | 375 | # Check if component uses !extend or !remove directives | COMMENT |
| LOW⚡ | script/analyze_component_buses.py | 382 | # Check if component defines buses directly in test files | COMMENT |
| LOW | script/analyze_component_buses.py | 512 | # Check if buses are compatible | COMMENT |
| LOW | script/analyze_component_buses.py | 646 | # Output results | COMMENT |
| LOW | script/test_build_components.py | 178 | # Check if last part is a number (version) | COMMENT |
| LOW | script/helpers.py | 656 | # Check if any core C++ or header files changed first | COMMENT |
| LOW | script/helpers.py | 991 | # Check if we found any new components | STRING |
| LOW | script/split_components_for_ci.py | 191 | # Check if adding this component would exceed the batch size | COMMENT |
| LOW | script/split_components_for_ci.py | 312 | # Check if this is a merged signature (contains +) | COMMENT |
| LOW⚡ | script/api_protobuf/api_protobuf.py | 524 | # Check if this is a packed_buffer field (zero-copy packed repeated) | COMMENT |
| LOW⚡ | script/api_protobuf/api_protobuf.py | 527 | # Check if this repeated field has fixed_array_with_length_define option | COMMENT |
| LOW⚡ | script/api_protobuf/api_protobuf.py | 532 | # Check if this repeated field has fixed_array_size option | COMMENT |
| LOW⚡ | script/api_protobuf/api_protobuf.py | 535 | # Check if this repeated field has fixed_array_size_define option | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 901 | # Check if this is being called from a repeated field context | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 1652 | # Check if underlying type can use dump_field | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 1766 | # Check if we should skip encoding when all elements are zero | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 1980 | # Check if underlying type can use dump_field | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2021 | # Check if this is a pointer field by looking for container_pointer option | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2030 | # Check if this should use FixedVector instead of std::vector | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2168 | # Check if this is const char* elements | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2210 | # Check if this is a fixed-size type | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2219 | # Check if inner type produces a constant size (doesn't depend on value) | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2360 | # Check if this message is used by other messages | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2549 | # Check if this message has a base class | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2759 | # Check if this message uses inline_encode — if so, skip generating standalone | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2768 | # Check if this message wants speed-optimized encode/calculate_size. | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2834 | # Check if message has any non-deprecated fields | COMMENT |
| LOW | .github/workflows/ci.yml | 999 | # Check if /mnt has more free space than / before bind mounting | COMMENT |
| LOW | .github/workflows/ci.yml | 1219 | # Check if memory impact extraction script exists on target branch | COMMENT |
| LOW | .github/workflows/ci.yml | 1231 | # Check if test files exist on the target branch for the requested | COMMENT |
| LOW | esphome/yaml_util.py | 671 | # Check if key is hashable | COMMENT |
| LOW | esphome/yaml_util.py | 684 | # Check if it is a duplicate key | COMMENT |
| LOW | esphome/config_helpers.py | 188 | # Check if logger config exists | COMMENT |
| 42 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | tests/unit_tests/test_substitutions.py | 596 | yaml_util.add_context(inner, {"a": "${undefined}"}) | CODE |
| HIGH⚡ | tests/unit_tests/test_yaml_util.py | 887 | value = _located("${undefined}", "root.yaml", 5, 10) | CODE |
| HIGH⚡ | tests/unit_tests/test_yaml_util.py | 1623 | """An empty (null) frontmatter document is treated as no frontmatter.""" | STRING |
| HIGH | tests/unit_tests/test_cpp_generator.py | 13 | (cg.RawExpression("foo && bar"), "foo && bar"), | CODE |
| HIGH | tests/unit_tests/test_cpp_generator.py | 324 | (cg.RawStatement("foo && bar"), "foo && bar"), | CODE |
| HIGH⚡ | tests/unit_tests/test_storage_json.py | 980 | """Unset build/firmware paths serialize as JSON null, not str(None).""" | STRING |
| HIGH | tests/unit_tests/components/test_esp_stacktrace.py | 159 | # EXCVADDR pointing at data (heap/null) is not a code address, must be ignored | COMMENT |
| HIGH⚡ | …it_tests/components/api/test_api_protobuf_generator.py | 65 | assert get_varint64_ifdef(file_desc, guards) == (True, "USE_X || USE_Y") | CODE |
| HIGH⚡ | …it_tests/components/api/test_api_protobuf_generator.py | 71 | assert get_varint64_ifdef(file_desc, guards) == (True, "USE_X || USE_Y") | CODE |
| HIGH⚡ | …it_tests/components/api/test_api_protobuf_generator.py | 92 | assert _make_ifdef_line("USE_X || USE_Y") == "#if defined(USE_X) || defined(USE_Y)" | CODE |
| HIGH | esphome/mqtt.py | 307 | _LOGGER.error("MQTT log topic set to null, can't start MQTT logs") | CODE |
| HIGH | esphome/cpp_helpers.py | 117 | cond = "index == 0" if count >= 255 else f"index == 0 || index > {count}" | CODE |
| HIGH | esphome/core/config.py | 221 | # DEVICE_CLASS_MAX_LENGTH == MAX_DEVICE_CLASS_LENGTH - 1 (C++ includes the null) | COMMENT |
| HIGH | esphome/core/entity_helpers.py | 145 | lines.append(f" if (index == 0 || index > {count}) return {empty_var};") | CODE |
| HIGH | esphome/core/entity_helpers.py | 155 | f' if (index == 0 || index > {count}) return "";\n' | CODE |
| HIGH | esphome/core/entity_helpers.py | 347 | - If !has_own_name && is_name_add_mac_suffix_enabled(): | STRING |
| HIGH | esphome/components/rp2040_pio_led_strip/light.py | 92 | ; out null, 24 ; discard the byte lane replication of the FIFO since we only need 8 bits (not needed????) | CODE |
| HIGH⚡ | esphome/components/uart/__init__.py | 356 | # - Serial (UART0): TX=1 or null, RX=3 or null | COMMENT |
| HIGH⚡ | esphome/components/uart/__init__.py | 357 | # - Serial (UART0 swap): TX=15 or null, RX=13 or null | COMMENT |
| HIGH⚡ | esphome/components/uart/__init__.py | 358 | # - Serial1: TX=2 or null, RX=8 or null | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit_tests/test_framework_helpers.py | 1212 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-exception-caught | CODE |
| MEDIUM | tests/integration/conftest.py | 574 | print(f"Error reading from PTY: {result[0]}", file=sys.stderr) | CODE |
| LOW | tests/integration/test_syslog.py | 113 | except Exception: # noqa: BLE001 | CODE |
| LOW | tests/integration/online_image_utils.py | 91 | except Exception as exc: | CODE |
| LOW | tests/integration/online_image_utils.py | 146 | except Exception as exc: | CODE |
| MEDIUM | tests/integration/online_image_utils.py | 61 | def handler(reader, writer): | CODE |
| MEDIUM | tests/integration/online_image_utils.py | 106 | def handler(reader, writer): | CODE |
| LOW | tests/integration/raw_api_client.py | 105 | except Exception: | CODE |
| LOW | tests/integration/test_udp.py | 83 | except Exception: # noqa: BLE001 | CODE |
| LOW | script/merge_component_configs.py | 485 | except Exception as e: # noqa: BLE001 | CODE |
| MEDIUM | script/merge_component_configs.py | 486 | print(f"Error merging configs: {e}", file=sys.stderr) | CODE |
| MEDIUM⚡ | script/ci_add_metadata_to_json.py | 43 | print(f"Error: JSON file not found: {args.json_file}", file=sys.stderr) | CODE |
| MEDIUM⚡ | script/ci_add_metadata_to_json.py | 50 | print(f"Error loading JSON: {e}", file=sys.stderr) | CODE |
| MEDIUM⚡ | script/ci_add_metadata_to_json.py | 57 | print("Error: --components must be a JSON array", file=sys.stderr) | CODE |
| MEDIUM | script/ci_add_metadata_to_json.py | 68 | print(f"Error parsing components: {e}", file=sys.stderr) | CODE |
| MEDIUM | script/ci_add_metadata_to_json.py | 81 | print(f"Error writing JSON: {e}", file=sys.stderr) | CODE |
| LOW | script/platformio_install_deps.py | 144 | except Exception as err: # noqa: BLE001 | CODE |
| LOW | script/platformio_install_deps.py | 248 | except Exception as err: # noqa: BLE001 | CODE |
| LOW | script/platformio_install_deps.py | 281 | except Exception as unlock_err: # noqa: BLE001 | CODE |
| LOW | script/build_helpers.py | 114 | except Exception: # noqa: BLE001 | CODE |
| MEDIUM⚡ | script/build_helpers.py | 399 | print(f"Error compiling {label} for {', '.join(components)}") | CODE |
| LOW⚡ | script/build_helpers.py | 401 | except Exception as e: # noqa: BLE001 | CODE |
| MEDIUM⚡ | script/build_helpers.py | 402 | print(f"Error compiling {label} for {', '.join(components)}: {e}") | CODE |
| MEDIUM | script/build_helpers.py | 482 | print(f"Error obtaining platform components: {e}") | CODE |
| LOW | script/stress_test_connect.py | 24 | except Exception as e: # noqa: BLE001 | CODE |
| LOW | script/ci-custom.py | 128 | except Exception: | CODE |
| LOW | script/analyze_component_buses.py | 139 | except Exception: # noqa: BLE001 # pylint: disable=broad-exception-caught | CODE |
| LOW | script/analyze_component_buses.py | 175 | except Exception: # noqa: BLE001 # pylint: disable=broad-exception-caught | CODE |
| LOW | script/analyze_component_buses.py | 233 | except Exception: # noqa: BLE001 # pylint: disable=broad-exception-caught | CODE |
| MEDIUM | script/analyze_component_buses.py | 342 | print(f"Error: {tests_dir} does not exist", file=sys.stderr) | CODE |
| MEDIUM | script/ci_memory_impact_comment.py | 657 | print("Error: Failed to load PR analysis JSON", file=sys.stderr) | CODE |
| LOW | script/test_build_components.py | 509 | except Exception as e: # pylint: disable=broad-exception-caught | CODE |
| MEDIUM | script/test_build_components.py | 510 | print(f"Error merging configs for {components}: {e}") | CODE |
| LOW | script/helpers.py | 264 | except Exception: # noqa: BLE001 - never let a bad test config crash grouping | CODE |
| LOW | script/helpers.py | 560 | except Exception as e: | CODE |
| MEDIUM | script/split_components_for_ci.py | 251 | print(f"Error parsing components JSON: {e}", file=sys.stderr) | CODE |
| MEDIUM | script/split_components_for_ci.py | 264 | print(f"Error parsing directly-changed JSON: {e}", file=sys.stderr) | CODE |
| LOW | script/test_component_grouping.py | 66 | except Exception as e: # noqa: BLE001 | CODE |
| MEDIUM | script/test_component_grouping.py | 67 | print(f"Error running test: {e}") | CODE |
| LOW | esphome/stacktrace.py | 78 | except Exception as exc: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/stacktrace.py | 99 | except Exception as exc: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| MEDIUM | esphome/stacktrace.py | 75 | def _resolve_handler(self) -> bool: | CODE |
| LOW | esphome/config.py | 777 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/config.py | 821 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/config.py | 854 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/config.py | 1501 | except Exception: | CODE |
| LOW | esphome/storage_json.py | 326 | except Exception: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/storage_json.py | 427 | except Exception: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/storage_json.py | 456 | except Exception: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/util.py | 320 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/util.py | 383 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/mqtt.py | 286 | except Exception: # pylint: disable=broad-except | CODE |
| LOW | esphome/vscode.py | 151 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/vscode.py | 160 | except Exception: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/compiled_config.py | 67 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/compiled_config.py | 94 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/compiled_config.py | 141 | except Exception: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/zeroconf.py | 339 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/loader.py | 299 | except Exception: # pylint: disable=broad-except | CODE |
| LOW | esphome/async_thread.py | 133 | except Exception: # pylint: disable=broad-except | CODE |
| 29 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/integration/state_utils.py | 30 | Subscribe to states and wait for one matching ``predicate``. Resolves with the first :class:`EntityState` for which | STRING |
| HIGH | tests/integration/state_utils.py | 94 | Find an entity or raise AssertionError if not found. Args: entities: List of entity info objects from the A | STRING |
| HIGH | script/merge_component_configs.py | 184 | Deduplicate list items with the same ID. Identical items sharing an ID (e.g. a shared bus from a common package pul | STRING |
| HIGH | script/determine-jobs.py | 304 | Determine if clang-tidy should run based on changed files. This function is used by the CI workflow to intelligentl | STRING |
| HIGH | script/determine-jobs.py | 947 | Determine memory impact analysis configuration. Always runs memory impact analysis when there are changed component | STRING |
| HIGH | script/analyze_component_buses.py | 148 | Check if a component is a platform component (abstract base class). Platform components have IS_PLATFORM_COMPONENT | STRING |
| HIGH | script/ci_memory_impact_comment.py | 32 | Run a gh CLI command with retries and error reporting. Args: args: Command arguments (including 'gh') | STRING |
| HIGH | script/ci_memory_impact_comment.py | 460 | Find existing memory impact comment on the PR. Args: pr_number: PR number Returns: Comment num | STRING |
| HIGH | script/helpers.py | 505 | Run a gh CLI command, retrying transient network and server failures. Args: args: Full command line, includ | STRING |
| HIGH | esphome/bundle.py | 589 | Extract a bundle archive and return the path to the config YAML. Sanity checks reject path traversal, symlinks, abs | STRING |
| HIGH | esphome/bundle.py | 640 | Read and validate the manifest from a bundle without full extraction. Args: bundle_path: Path to the .tar.g | STRING |
| HIGH | esphome/framework_helpers.py | 86 | Remove a directory and its contents recursively if it exists. Args: directory: Path to the directory t | STRING |
| HIGH | esphome/framework_helpers.py | 246 | Create a Python virtual environment. Args: root: Path to the virtual environment directory msg | STRING |
| HIGH | esphome/framework_helpers.py | 1233 | Download file from multiple mirrors with substitution support. Args: mirrors: list of mirror URLs | STRING |
| HIGH | esphome/analyze_memory/__init__.py | 609 | Build mapping from heuristic pattern categories to discovered libraries. Heuristic categories like ``mdns_lib`` | STRING |
| HIGH | esphome/espidf/framework.py | 325 | Get the ESP-IDF version from the specified framework root. Args: idf_framework_root: Path to the ESP-I | STRING |
| HIGH | esphome/espidf/framework.py | 352 | Get ESP-IDF tool paths and environment variables needed for building. Args: idf_framework_root: Path t | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit_tests/core/test_entity_helpers.py | 166 | # Empty name is handled specially - it doesn't just use sanitize(snake_case("")) | COMMENT |
| MEDIUM | tests/integration/test_script_queued.py | 19 | """Test comprehensive queued script functionality.""" | STRING |
| MEDIUM | tests/script/test_determine_jobs.py | 987 | # Workflow / harness files | COMMENT |
| MEDIUM | tests/components/aqi/benchmark.yaml | 3 | # the test harness; this only pulls the sensor + aqi source/include paths in. | COMMENT |
| LOW | script/merge_component_configs.py | 232 | # No ID, just add it | COMMENT |
| MEDIUM | script/determine-jobs.py | 504 | # - script/test_build_components.py -- the harness the job invokes | COMMENT |
| MEDIUM | script/list-components.py | 64 | # BUT only for --changed (used by clang-tidy for comprehensive checking) | COMMENT |
| MEDIUM | script/list-components.py | 90 | # This is for --changed (clang-tidy) which needs comprehensive checking | COMMENT |
| MEDIUM | .github/workflows/ci.yml | 918 | # (no --all-headers; the comprehensive esp32-idf pass covers the shared tree). | COMMENT |
| MEDIUM | esphome/components/opentherm/opentherm_macros.h | 156 | // These macros utilize the structure of *_LIST macros in order | COMMENT |
| MEDIUM | esphome/components/epaper_spi/models/jd79660.py | 59 | # Device may have specific factory provisioned MTP content to facilitate vendor register features like fast init. | COMMENT |
| LOW | esphome/components/epaper_spi/models/__init__.py | 63 | # Explicit dimensions, just use as is | COMMENT |
| MEDIUM | esphome/components/shelly_dimmer/shelly_dimmer.cpp | 54 | // Essentially std::size() for pre c++17 | COMMENT |
| LOW | esphome/components/esp32_ble_server/__init__.py | 577 | # Static value - just set it directly without action infrastructure | COMMENT |
| LOW | esphome/components/mipi/__init__.py | 449 | # Explicit dimensions, just use as is | COMMENT |
| LOW | esphome/components/substitutions/__init__.py | 345 | # This node does not define any vars itself, so just return parent context | COMMENT |
| LOW | esphome/components/mipi_spi/display.py | 132 | # No exact divisor, just use the closest. | COMMENT |
| MEDIUM | esphome/components/lvgl/animation.py | 59 | # It would be better to have a more robust way of passing arguments to the timing classes. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/testing_helpers.py | 57 | def set_testing_manifest(domain: str, manifest: ComponentManifestOverride) -> None: | CODE |
| LOW | tests/unit_tests/test_preferences.py | 26 | def _set_platform(platform: str) -> None: | CODE |
| LOW | tests/unit_tests/test_preferences.py | 30 | def _set_esp32(variant: str) -> None: | CODE |
| LOW | tests/unit_tests/test_compiled_config.py | 104 | def _set_cache_mtime(cache_path: Path, yaml_path: Path, *, offset: int) -> None: | CODE |
| LOW | tests/unit_tests/test_git.py | 38 | def _setup_old_repo(repo_dir: Path, days_old: int = 2) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_config_validation.py | 1402 | def _set_core_target(platform: str, framework: str) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_config_validation.py | 1410 | def _set_framework_version(platform: str, framework: str, version: cv.Version) -> None: | CODE |
| LOW | tests/unit_tests/test_config_validation.py | 607 | def _setup_core_for_framework(platform: str, framework: str) -> None: | CODE |
| LOW | tests/component_tests/mipi_rgb/test_mipi_rgb_config.py | 41 | def _set_s3(set_core_config: SetCoreConfigCallable) -> None: | CODE |
| LOW | …component_tests/bluetooth_proxy/test_platform_gates.py | 52 | def _set_platform(platform: str | None) -> None: | CODE |
| LOW | …ts/component_tests/ble_device_base/test_hub_binding.py | 37 | def _set_platform(platform: str | None) -> None: | CODE |
| LOW | tests/component_tests/ethernet/test_spi_id.py | 52 | def _set_esp32_s3(set_core_config: SetCoreConfigCallable) -> None: | CODE |
| LOW | tests/component_tests/ethernet/test_spi_id.py | 143 | def _set_spi_buses(*buses: dict) -> None: | CODE |
| LOW⚡ | tests/component_tests/time/test_init.py | 43 | def _set_platform(platform: Platform) -> None: | CODE |
| LOW | script/ci_memory_impact_comment.py | 525 | def update_existing_comment(comment_id: str, comment_body: str) -> None: | CODE |
| LOW | esphome/git.py | 507 | def update_submodules(repo_dir: Path, key: str) -> None: | CODE |
| LOW | esphome/yaml_util.py | 195 | def set_context(self, vars: dict[str, Any]) -> None: | CODE |
| LOW | esphome/cpp_helpers.py | 216 | def set_setup_priority(var, priority: float) -> None: | CODE |
| LOW⚡ | esphome/writer.py | 135 | def update_storage_json() -> None: | CODE |
| LOW | esphome/cpp_generator.py | 721 | def set_cpp_standard(standard: str) -> None: | CODE |
| LOW | esphome/core/entity_helpers.py | 422 | async def _setup_entity_impl(var: MockObj, config: ConfigType, platform: str) -> None: | CODE |
| LOW | esphome/components/openthread/__init__.py | 97 | def set_sdkconfig_options(config: ConfigType) -> None: | CODE |
| LOW | esphome/components/lock/__init__.py | 106 | async def _setup_lock_core(var: MockObj, config: ConfigType) -> None: | CODE |
| LOW | esphome/components/image/__init__.py | 127 | def set_big_endian(self, big_endian: bool) -> None: | CODE |
| LOW⚡ | esphome/components/esp32/__init__.py | 671 | def set_idf_sdkconfig_default(name: str, value: SdkconfigValueType) -> None: | CODE |
| LOW | esphome/components/esp32/__init__.py | 2254 | async def _set_libc_picolibc_newlib_compat() -> None: | CODE |
| LOW | esphome/components/audio/__init__.py | 214 | def set_limits_in_config(config: ConfigType) -> None: | CODE |
| LOW | esphome/components/api/client.py | 10 | __all__ = ["async_run_logs", "run_logs"] | CODE |
| LOW | esphome/components/nrf52/clang_tidy.py | 154 | def _setup_core(work_dir: Path) -> None: | CODE |
| LOW | esphome/components/esp32_ble/__init__.py | 285 | __all__ = [ | CODE |
| LOW | esphome/components/lvgl/defines.py | 144 | def set_widgets_completed(value: bool) -> None: | CODE |
| LOW | esphome/components/lvgl/widgets/__init__.py | 556 | def _set_layout_options(w: Widget, layout: dict, base_name: str | None) -> None: | CODE |
| LOW | esphome/components/lvgl/widgets/table.py | 147 | async def set_selected_cell(w: Widget, config: ConfigType) -> None: | CODE |
| LOW | esphome/espidf/clang_tidy.py | 148 | def _setup_core(work_dir: Path, settings: _Settings) -> None: | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/component_tests/motion/test_motion.py | 611 | # Step 1: Device flat — gravity in enclosure frame is [0, 0, 1] | COMMENT |
| LOW⚡ | tests/component_tests/motion/test_motion.py | 621 | # Step 2: Tilt enclosure around Y by 20° | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 33 | # Step 1: Software Reset (0x12) - REQUIRED per SSD1680, but works without it as well, so it's commented out | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 35 | # Step 2: Wait 10ms after SWRESET (?) not sure how to implement wht waiting for 10ms after SWRESET, so it's | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 36 | # Step 3: DRV_OUT_CTL - driver output control (height-dependent) | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 39 | # Step 4: DATA_ENTRY - data entry mode (0x03 = decrement Y, increment X) | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 41 | # Step 5: BORDER_FULL - border waveform control | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 43 | # Step 6: TEMP_SENS - internal temperature sensor | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 45 | # Step 7: DISPLAY_UPDATE - display update control | COMMENT |
| LOW | esphome/components/async_tcp/async_tcp_socket.h | 17 | /// NOTE: This class is NOT thread-safe. All methods must be called from the main loop. | COMMENT |
| LOW⚡ | esphome/components/sen6x/sen6x.cpp | 77 | // Step 1: Read serial number (~25ms with I2C delay) | COMMENT |
| LOW⚡ | esphome/components/sen6x/sen6x.cpp | 87 | // Step 2: Read product name in next loop iteration | COMMENT |
| LOW | esphome/components/sen6x/sen6x.cpp | 134 | // Step 3: Read firmware version and start measurements in next loop iteration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/component_tests/motion/test_motion.py | 611 | # Step 1: Device flat — gravity in enclosure frame is [0, 0, 1] | COMMENT |
| LOW⚡ | tests/component_tests/motion/test_motion.py | 621 | # Step 2: Tilt enclosure around Y by 20° | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 33 | # Step 1: Software Reset (0x12) - REQUIRED per SSD1680, but works without it as well, so it's commented out | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 35 | # Step 2: Wait 10ms after SWRESET (?) not sure how to implement wht waiting for 10ms after SWRESET, so it's | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 36 | # Step 3: DRV_OUT_CTL - driver output control (height-dependent) | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 39 | # Step 4: DATA_ENTRY - data entry mode (0x03 = decrement Y, increment X) | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 41 | # Step 5: BORDER_FULL - border waveform control | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 43 | # Step 6: TEMP_SENS - internal temperature sensor | COMMENT |
| LOW⚡ | esphome/components/epaper_spi/models/weact_bwr.py | 45 | # Step 7: DISPLAY_UPDATE - display update control | COMMENT |
| LOW⚡ | esphome/components/sen6x/sen6x.cpp | 77 | // Step 1: Read serial number (~25ms with I2C delay) | COMMENT |
| LOW⚡ | esphome/components/sen6x/sen6x.cpp | 87 | // Step 2: Read product name in next loop iteration | COMMENT |
| LOW | esphome/components/sen6x/sen6x.cpp | 134 | // Step 3: Read firmware version and start measurements in next loop iteration | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | esphome/components/weikai/weikai.h | 56 | /// problem by asking users to rewrite their code, I have implemented this ring buffer that store the bytes received | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/unit_tests/components/test_rp2_generate_boards.py | 436 | _add_board(arduino_pico, "placeholder", pins_header=header) | STRING |
| LOW⚡ | tests/unit_tests/components/test_rp2_generate_boards.py | 440 | assert "SDA1" not in board_pins["placeholder"] | STRING |
| LOW⚡ | tests/unit_tests/components/test_rp2_generate_boards.py | 441 | assert "SCL1" not in board_pins["placeholder"] | STRING |
| LOW⚡ | tests/unit_tests/components/test_rp2_generate_boards.py | 442 | assert board_pins["placeholder"]["LED"] == 25 | STRING |
| LOW⚡ | tests/unit_tests/components/test_rp2_generate_boards.py | 443 | assert "max_virtual_pin" not in boards["placeholder"] | STRING |
| LOW | esphome/components/runtime_image/__init__.py | 21 | CONF_PLACEHOLDER = "placeholder" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/codeql.yml | 51 | # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize h | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | esphome/coroutine.py | 269 | CODE | |
| LOW | esphome/coroutine.py | 189 | CODE | |
| LOW | esphome/components/sensor/__init__.py | 366 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | esphome/components/sha256/sha256.h | 46 | /// Example usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | esphome/components/rp2/gpio.cpp | 96 | // TODO: implement | COMMENT |