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 summarizes scanner evidence for esphome/esphome, a C++ project with 11,805 GitHub stars. SynthScan examined 893,677 lines of code across 9298 source files, recording 9080 pattern matches distributed across 22 syntactic categories. The legacy adjusted pattern signal is 11.5 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 7855 finding(s).
Are imports declared and package/API names verified? 573 finding(s).
Are wrappers, guards, and repeated structures necessary? 6881 finding(s).
Which changes need focused human review? 9080 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 9080 distinct pattern matches across 22 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. 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 configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| 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_espidf_component_mirror.py | 153 | def test_parse_lock_keeps_only_default_registry_service_deps(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 159 | def test_parse_lock_missing_file(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 196 | def test_parse_lock_defaults_registry_url(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 202 | def test_parse_manifest_keeps_only_exact_registry_pins(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 208 | def test_parse_manifest_missing_file(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 212 | def test_parse_manifest_lowercases_mixed_case_keys(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 220 | def test_parse_manifest_ranged_specs(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 230 | def test_project_service_deps_merges_lock_and_manifest(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 242 | def test_project_service_deps_manifest_only(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 256 | def test_missing_deps_covered_and_not(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 332 | def test_publish_index_first_sync(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 343 | def test_publish_index_replaces_a_corrupt_live_index(tmp_path: Path, live: str) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 352 | def test_publish_index_merges_and_filters(tmp_path: Path) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 406 | def test_component_mirror_env_sets_file_url( | CODE |
| LOW⚡ | tests/unit_tests/test_espidf_component_mirror.py | 430 | def test_component_mirror_env_unwritable_cache( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 172 | def test_parse_lock_tolerates_bad_content(tmp_path: Path, text: str) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 176 | def test_parse_lock_unreadable_file_warns( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 288 | def test_missing_deps_damaged_mirror( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 299 | def test_missing_deps_deletes_a_torn_archive(tmp_path: Path) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 310 | def test_missing_deps_covered_without_checksums_field(tmp_path: Path) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 365 | def test_publish_index_unreadable_live_index_raises(tmp_path: Path) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 375 | def test_promote_moves_archives_before_indexes(tmp_path: Path) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 418 | def test_component_mirror_env_preserves_user_values( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 478 | def _assert_sync_lock_released() -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 484 | def test_sync_runs_the_manager_for_missing_deps( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 513 | def test_sync_skips_when_covered(tmp_path: Path) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 528 | def test_sync_failure_is_tolerated( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 539 | def test_sync_subprocess_errors_are_tolerated( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 549 | def test_sync_refreshes_ranged_specs_only_before_a_fresh_solve( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 565 | def test_sync_ranged_refresh_runs_with_everything_else_covered( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 580 | def test_sync_timeout_retries_ranged_specs_too(tmp_path: Path) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 597 | def test_sync_timeout_falls_back_to_one_component_at_a_time( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 627 | def test_sync_timeout_then_per_component_completes(tmp_path: Path) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 649 | def test_sync_timeout_then_component_error_stops( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 665 | def test_sync_unexpected_error_logs_a_traceback( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 677 | def test_sync_single_component_timeout_is_not_retried( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 692 | def test_sync_environment_resolution_failure_is_tolerated( | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 706 | def test_sync_skips_when_another_process_holds_the_lock(tmp_path: Path) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 720 | def test_sync_ignores_a_leftover_lock_file(tmp_path: Path) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_component_mirror.py | 730 | def test_sync_lock_oserror_is_a_failure( | CODE |
| 6166 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_espidf_component_mirror.py | 148 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_espidf_component_mirror.py | 150 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_espidf_component_mirror.py | 251 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_espidf_component_mirror.py | 253 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_espidf_component_mirror.py | 321 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_espidf_component_mirror.py | 323 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_espidf_component_mirror.py | 401 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_espidf_component_mirror.py | 403 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_espidf_component_mirror.py | 439 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_espidf_component_mirror.py | 441 | # --------------------------------------------------------------------------- | 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 | 768 | # ── 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 |
| 363 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit_tests/test_lazy_imports.py | 41 | "esphome.platformio.registry", | 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/uart_tcp/test_uart_tcp_host.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | tests/components/uart_tcp/test_disconnect_host.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | tests/components/snapshot/snapshot_test.cpp | 1 | #ifdef USE_HOST | 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 | tests/components/toshiba/benchmark.yaml | 1 | # Registers the climate platform so USE_CLIMATE is defined for the host unit test | 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/tcp_uart/test_buffers_host.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | tests/components/packet_transport/common.h | 1 | #pragma once | COMMENT |
| LOW | tests/components/exponential_moving_average/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/api/test_overflow_buffer.cpp | 1 | #include <gtest/gtest.h> | COMMENT |
| LOW | tests/components/api/test_wizard.cpp | 1 | #ifdef USE_HOST | 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/components/socket/test_tcp_client_link_host.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 | …t_tests/ln882h_ble_tracker/test_automations_codegen.py | 41 | # scan-control actions: templatable continuous lambda + stop_scan forwarded | 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/merge_component_configs.py | 161 | return data | COMMENT |
| LOW | script/determine-jobs.py | 201 | MEMORY_IMPACT_MAX_COMPONENTS = 40 # Max components before results become nonsensical | COMMENT |
| LOW | script/list-components.py | 61 | changed = changed_files(args.branch) | COMMENT |
| LOW | script/analyze_component_buses.py | 361 | components[component_name] = platform_buses | COMMENT |
| LOW | .github/workflows/sync-device-classes.yml | 61 | uv pip install --system -r requirements.txt -r requirements_test.txt | COMMENT |
| LOW | .github/workflows/sync-dependency-versions.yml | 1 | # Keeps pre-commit hook revs in sync with the requirements files. | 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 | 361 | key: ${{ runner.os }}-${{ steps.restore-python.outputs.python-version }}-venv-${{ needs.common.outputs.cache-k | COMMENT |
| LOW | .github/workflows/ci.yml | 1461 | - name: Install device-builder + esphome from PR | COMMENT |
| LOW | .github/workflows/ci.yml | 1801 | env: | 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/yaml_util.py | 781 | COMMENT | |
| LOW | esphome/config.py | 261 | # A list of voluptuous errors | COMMENT |
| LOW | esphome/util.py | 221 | # Add the terminator the line never got, so whatever ESPHome | COMMENT |
| LOW | esphome/framework_helpers.py | 1161 | # resume of this part file safe. | COMMENT |
| LOW | esphome/coroutine.py | 81 | # Network transport layer | COMMENT |
| LOW | esphome/coroutine.py | 121 | # Examples: web_server_ota (52) | COMMENT |
| LOW | esphome/loader.py | 341 | # ``esphome/component_aliases.py`` (CI and a unit test fail if the registry | COMMENT |
| 1050 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/unit_tests/test_api_client.py | 3 | CODE | |
| LOW | tests/unit_tests/test_espidf_component_mirror.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_arduino8266_toolchain.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_platformio_pch_script.py | 3 | CODE | |
| LOW | tests/unit_tests/test_yaml_edit.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_espota2_noise.py | 10 | 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_host_toolchain.py | 3 | CODE | |
| LOW | tests/unit_tests/test_web_server_helpers.py | 3 | CODE | |
| LOW | tests/unit_tests/cli/test_rename.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/components/test_esp32_write_idf_component_yml.py | 7 | CODE | |
| LOW | tests/unit_tests/components/host/test_init.py | 3 | CODE | |
| LOW | tests/unit_tests/components/udp/test_init.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 | tests/unit_tests/components/esp32/test_sdkconfig.py | 3 | CODE | |
| LOW | …_tests/components/esp8266/test_toolchain_validation.py | 3 | CODE | |
| LOW | …ts/unit_tests/components/esp8266/test_build_surgery.py | 3 | CODE | |
| LOW | tests/unit_tests/components/noise/test_noise_to_code.py | 7 | 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 | …it_tests/components/lvgl/test_theme_update_ordering.py | 14 | 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 | …it_tests/components/lvgl/test_list_trigger_ordering.py | 22 | CODE | |
| LOW | …mponents/lvgl/test_action_to_code_context_isolation.py | 6 | CODE | |
| LOW | …_tests/components/lvgl/test_get_part_state_selector.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_gen/test_host.py | 3 | CODE | |
| 481 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 | 885 | # Create a real file with markers | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 975 | # Create a file with begin marker but no end marker | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 997 | # Create a file with duplicate begin markers | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 1174 | # Create an absolute custom build path directory with contents | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 1272 | # Create a file in cwd that must NOT be cleaned | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 1637 | # Create a read-only file (simulating git pack files on Windows) | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 1671 | # Create a subdirectory with read-only files | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 2295 | # Create a source file | COMMENT |
| MEDIUM | tests/unit_tests/test_writer.py | 2416 | # 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 | 753 | # Create a real firmware file | COMMENT |
| MEDIUM | tests/unit_tests/test_espota2.py | 963 | # 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 | 748 | # Create the git repo directory structure | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 814 | # Create the git repo directory structure | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 863 | # Create the git repo directory structure | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 917 | # Create the git repo directory structure | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 996 | # Create the git repo directory structure | COMMENT |
| MEDIUM | tests/unit_tests/test_git.py | 824 | fetch_head.touch() # Create the file | CODE |
| MEDIUM | tests/unit_tests/test_git.py | 873 | fetch_head.touch() # Create the file | CODE |
| MEDIUM | tests/unit_tests/test_git.py | 1006 | 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 | 134 | # Create an empty secrets file | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_yaml_util.py | 144 | # Create a YAML file with a secret but no secrets.yaml | COMMENT |
| MEDIUM | tests/unit_tests/test_yaml_util.py | 122 | # Create a YAML file with a secret that doesn't exist | COMMENT |
| MEDIUM | tests/unit_tests/test_yaml_util.py | 165 | # Create a subdirectory with a YAML file that uses secrets | COMMENT |
| MEDIUM | tests/unit_tests/test_yaml_util.py | 369 | # Create a dict with unsorted keys | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_helpers.py | 798 | # Create a file | COMMENT |
| MEDIUM⚡ | tests/unit_tests/test_helpers.py | 809 | # Create a file where we want to create a directory | COMMENT |
| MEDIUM | tests/unit_tests/test_helpers.py | 903 | # Create a directory and make it read-only | COMMENT |
| MEDIUM | tests/unit_tests/test_main.py | 1626 | # Create the actual firmware files so they exist | COMMENT |
| MEDIUM | tests/unit_tests/test_main.py | 1734 | # Create a test firmware file | COMMENT |
| MEDIUM | tests/unit_tests/test_main.py | 4645 | # Create a mock OSError with a specific message | COMMENT |
| MEDIUM | tests/unit_tests/test_main.py | 4673 | # 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 | 944 | # Create a file (not a directory) | COMMENT |
| MEDIUM | tests/unit_tests/core/test_config.py | 947 | # Create a directory without __init__.py | COMMENT |
| MEDIUM | tests/integration/conftest.py | 635 | # Create a future to signal when connected | COMMENT |
| MEDIUM | tests/integration/conftest.py | 781 | # 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 |
| MEDIUM⚡ | tests/script/test_determine_jobs.py | 2789 | # Create a fake benchmarks directory with an 'api' component | COMMENT |
| 28 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/integration/test_loop_disable_enable.py | 85 | except (IndexError, ValueError): | CODE |
| HIGH | tests/integration/test_loop_disable_enable.py | 96 | except (IndexError, ValueError): | CODE |
| HIGH | tests/integration/test_snapshot_display.py | 53 | except (FileNotFoundError, UnidentifiedImageError, OSError, EOFError): | CODE |
| HIGH | script/helpers.py | 908 | except FileNotFoundError: | CODE |
| HIGH | script/helpers.py | 654 | except: # noqa: E722 | CODE |
| HIGH | script/helpers.py | 1350 | except (OSError, json.JSONDecodeError): | CODE |
| HIGH | script/helpers.py | 629 | except: # noqa: E722 | CODE |
| HIGH | script/api_protobuf/api_protobuf.py | 3735 | except ImportError: | CODE |
| HIGH | esphome/config_validation.py | 1442 | except Invalid: | CODE |
| HIGH | esphome/config_validation.py | 1448 | except Invalid: | CODE |
| HIGH | esphome/config_validation.py | 1463 | except Invalid: | CODE |
| HIGH | esphome/config_validation.py | 1469 | except Invalid: | CODE |
| HIGH | esphome/config_validation.py | 2469 | except Invalid: | CODE |
| HIGH | esphome/config_validation.py | 2838 | except Invalid: | CODE |
| HIGH | esphome/config_validation.py | 1400 | except Invalid: | CODE |
| HIGH | esphome/log.py | 72 | except UnicodeEncodeError: | CODE |
| HIGH | esphome/util.py | 97 | except UnicodeEncodeError: | CODE |
| HIGH | esphome/util.py | 114 | except UnicodeEncodeError: | CODE |
| HIGH | esphome/util.py | 88 | except UnicodeEncodeError: | CODE |
| HIGH | esphome/framework_helpers.py | 983 | except Timeout: | CODE |
| HIGH | esphome/mqtt.py | 83 | except OSError: | CODE |
| HIGH | esphome/writer.py | 380 | except AttributeError: | CODE |
| HIGH | esphome/writer.py | 642 | except ImportError: | CODE |
| HIGH | esphome/core/config.py | 232 | except cv.Invalid: | CODE |
| HIGH | esphome/core/config.py | 450 | except KeyError: | CODE |
| HIGH | esphome/core/config.py | 452 | except ImportError: | CODE |
| HIGH | esphome/platformio/runner.py | 98 | except Exception: # noqa: BLE001 | CODE |
| HIGH | esphome/platformio/toolchain.py | 417 | except ValueError: | CODE |
| HIGH | esphome/components/wifi/wpa2_eap.py | 118 | except ImportError: | CODE |
| HIGH | esphome/components/sun/__init__.py | 71 | except cv.Invalid: | CODE |
| HIGH | esphome/components/host/gpio.py | 40 | except ValueError: | CODE |
| HIGH | esphome/components/logger/__init__.py | 498 | except cv.Invalid: | CODE |
| HIGH | esphome/components/logger/__init__.py | 503 | except cv.Invalid: | CODE |
| HIGH | esphome/components/mipi_rgb/display.py | 117 | except cv.Invalid: | CODE |
| HIGH | esphome/components/micro_wake_word/__init__.py | 279 | except cv.Invalid: | CODE |
| HIGH | esphome/components/micro_wake_word/__init__.py | 284 | except cv.Invalid: | CODE |
| HIGH | esphome/components/micro_wake_word/__init__.py | 289 | except cv.Invalid: | CODE |
| HIGH | esphome/components/network/__init__.py | 140 | except (ValueError, TypeError): | CODE |
| HIGH | esphome/components/esp32/gpio.py | 94 | except ValueError: | CODE |
| HIGH | esphome/components/esp8266/gpio.py | 60 | except ValueError: | CODE |
| HIGH | esphome/components/light/automation.py | 69 | except cv.Invalid: | CODE |
| HIGH | esphome/components/rp2/gpio.py | 54 | except ValueError: | CODE |
| HIGH | esphome/components/substitutions/jinja.py | 116 | except (ValueError, SyntaxError, MemoryError, TypeError): | CODE |
| HIGH | esphome/components/nrf52/framework.py | 476 | except FileNotFoundError: | CODE |
| HIGH | esphome/components/nrf52/gpio.py | 31 | except ValueError: | CODE |
| HIGH | esphome/components/rpi_dpi_rgb/display.py | 69 | except cv.Invalid: | CODE |
| HIGH | esphome/components/st7701s/display.py | 74 | except cv.Invalid: | CODE |
| HIGH | esphome/components/libretiny/gpio.py | 112 | except ValueError: | CODE |
| HIGH | esphome/components/libretiny/gpio.py | 121 | except ValueError: | CODE |
| HIGH | esphome/components/uart/event/__init__.py | 41 | except cv.Invalid: | CODE |
| HIGH | esphome/components/uart/event/__init__.py | 49 | except cv.Invalid: | CODE |
| HIGH | esphome/components/lvgl/schemas.py | 187 | except ValueError: | CODE |
| HIGH | esphome/espidf/install_tool_archives.py | 84 | except FileNotFoundError: # pragma: no cover # failed before mkdir | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/build.py | 102 | CODE | |
| LOW | docker/generate_tags.py | 36 | 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 | 104 | 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 | 459 | CODE | |
| LOW | tests/integration/conftest.py | 772 | CODE | |
| LOW | tests/integration/conftest.py | 466 | 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 | 129 | 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 | 385 | 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 | |
| 200 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/unit_tests/test_host_toolchain.py | 0 | anchor the path: ninja runs from the build directory. | STRING |
| HIGH | tests/unit_tests/build_helpers/test_ccache.py | 0 | anchor the path: ninja runs from the build directory. | STRING |
| HIGH | tests/unit_tests/build_helpers/test_ninja.py | 0 | anchor the path: ninja runs from the build directory. | STRING |
| 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_resume_effect.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_repeat_effect.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/canbus/test_canbus_payload_tables.py | 0 | equal payloads share one table; lambdas stay templates. | STRING |
| HIGH | …s/component_tests/cc1101/test_cc1101_payload_tables.py | 0 | equal payloads share one table; lambdas stay templates. | STRING |
| HIGH | tests/component_tests/espnow/test_payload_tables.py | 0 | equal payloads share one table; lambdas stay templates. | 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 |
|---|---|---|---|---|
| HIGH⚡ | tests/unit_tests/test_espidf_component_mirror.py | 341 | "live", ["not json", '{"versions": null}', '{"versions": {"a": 1}}'] | CODE |
| HIGH⚡ | tests/unit_tests/test_substitutions.py | 655 | yaml_util.add_context(inner, {"a": "${undefined}"}) | CODE |
| HIGH⚡ | tests/unit_tests/test_yaml_util.py | 1019 | value = _located("${undefined}", "root.yaml", 5, 10) | CODE |
| HIGH⚡ | tests/unit_tests/test_yaml_util.py | 1755 | """An empty (null) frontmatter document is treated as no frontmatter.""" | STRING |
| HIGH | tests/unit_tests/test_cpp_generator.py | 14 | (cg.RawExpression("foo && bar"), "foo && bar"), | CODE |
| HIGH | tests/unit_tests/test_cpp_generator.py | 422 | (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 | tests/unit_tests/components/noise/test_noise_to_code.py | 155 | {"if": "$ESPHOME_ARDUINO_COMPONENT == 0 || idf_version >= 6.0.0"} | CODE |
| HIGH⚡ | …it_tests/components/api/test_api_protobuf_generator.py | 81 | assert get_varint64_ifdef(file_desc, guards) == (True, "USE_X || USE_Y") | CODE |
| HIGH⚡ | …it_tests/components/api/test_api_protobuf_generator.py | 87 | assert get_varint64_ifdef(file_desc, guards) == (True, "USE_X || USE_Y") | CODE |
| HIGH⚡ | …it_tests/components/api/test_api_protobuf_generator.py | 108 | assert _make_ifdef_line("USE_X || USE_Y") == "#if defined(USE_X) || defined(USE_Y)" | CODE |
| HIGH | tests/script/test_determine_jobs.py | 3446 | '{"tests/integration/test_a.py": 12.5, "tests/integration/test_b.py": null}' | 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 | 261 | # DEVICE_CLASS_MAX_LENGTH == MAX_DEVICE_CLASS_LENGTH - 1 (C++ includes the null) | COMMENT |
| HIGH | esphome/core/entity_helpers.py | 146 | lines.append(f" if (index == 0 || index > {count}) return {empty_var};") | CODE |
| HIGH | esphome/core/entity_helpers.py | 156 | f' if (index == 0 || index > {count}) return "";\n' | CODE |
| HIGH | esphome/core/entity_helpers.py | 348 | - 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/improv_ble/__init__.py | 81 | "state == improv::STATE_AUTHORIZED || state == improv::STATE_AWAITING_AUTHORIZATION", | CODE |
| HIGH | esphome/components/zigbee/zigbee_ep_esp32.py | 275 | "if (x < 0.0f || std::isnan(x)) return 0xFFFF;" # NaN | CODE |
| HIGH⚡ | esphome/components/uart/__init__.py | 414 | # - Serial (UART0): TX=1 or null, RX=3 or null | COMMENT |
| HIGH⚡ | esphome/components/uart/__init__.py | 415 | # - Serial (UART0 swap): TX=15 or null, RX=13 or null | COMMENT |
| HIGH⚡ | esphome/components/uart/__init__.py | 416 | # - Serial1: TX=2 or null, RX=8 or null | COMMENT |
| 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 | 877 | # 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 | 108 | # 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 | 306 | # 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 | 91 | # Check if the variant is valid | COMMENT |
| LOW | tests/component_tests/sntp/test_init.py | 141 | # Check if merging occurred | COMMENT |
| LOW | script/determine-jobs.py | 858 | # Check if benchmark infrastructure changed | COMMENT |
| LOW | script/determine-jobs.py | 865 | # Check if any directly changed component has benchmarks | COMMENT |
| LOW | script/determine-jobs.py | 1146 | # Check if this is a platform-specific file | COMMENT |
| LOW | script/analyze_component_buses.py | 241 | # Check if buses are defined directly (not via packages) | COMMENT |
| LOW⚡ | script/analyze_component_buses.py | 366 | # Check if component is explicitly isolated | COMMENT |
| LOW⚡ | script/analyze_component_buses.py | 371 | # Check if component is a base bus component | COMMENT |
| LOW⚡ | script/analyze_component_buses.py | 377 | # Check if component uses !extend or !remove directives | COMMENT |
| LOW⚡ | script/analyze_component_buses.py | 384 | # Check if component defines buses directly in test files | COMMENT |
| LOW | script/analyze_component_buses.py | 514 | # Check if buses are compatible | COMMENT |
| LOW | script/analyze_component_buses.py | 648 | # Output results | COMMENT |
| LOW | script/test_build_components.py | 181 | # Check if last part is a number (version) | COMMENT |
| LOW | script/helpers.py | 701 | # Check if any core C++ or header files changed first | COMMENT |
| LOW | script/helpers.py | 1033 | # Check if we found any new components | STRING |
| LOW | script/split_components_for_ci.py | 512 | # Check if this is a merged signature (contains +) | COMMENT |
| LOW⚡ | script/api_protobuf/api_protobuf.py | 550 | # Check if this is a packed_buffer field (zero-copy packed repeated) | COMMENT |
| LOW⚡ | script/api_protobuf/api_protobuf.py | 553 | # Check if this repeated field has fixed_array_with_length_define option | COMMENT |
| LOW⚡ | script/api_protobuf/api_protobuf.py | 558 | # Check if this repeated field has fixed_array_size option | COMMENT |
| LOW⚡ | script/api_protobuf/api_protobuf.py | 561 | # Check if this repeated field has fixed_array_size_define option | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 922 | # Check if this is being called from a repeated field context | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 1704 | # Check if underlying type can use dump_field | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 1818 | # Check if we should skip encoding when all elements are zero | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2025 | # Check if underlying type can use dump_field | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2066 | # Check if this is a pointer field by looking for container_pointer option | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2075 | # Check if this should use FixedVector instead of std::vector | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2173 | # Check if this is const char* elements | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2215 | # Check if this is a fixed-size type | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2224 | # Check if inner type produces a constant size (doesn't depend on value) | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2365 | # Check if this message is used by other messages | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2551 | # Check if this message has a base class | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2725 | # Check if this message uses inline_encode — if so, skip generating standalone | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2734 | # Check if this message wants speed-optimized encode/calculate_size. | COMMENT |
| LOW | script/api_protobuf/api_protobuf.py | 2807 | # Check if message has any non-deprecated fields | COMMENT |
| LOW | .github/workflows/ci.yml | 1140 | # Check if /mnt has more free space than / before bind mounting | COMMENT |
| LOW | .github/workflows/ci.yml | 1498 | # Check if memory impact extraction script exists on target branch | COMMENT |
| LOW | esphome/yaml_util.py | 726 | # Check if key is hashable | COMMENT |
| LOW | esphome/yaml_util.py | 739 | # Check if it is a duplicate key | COMMENT |
| LOW | esphome/config_helpers.py | 188 | # Check if logger config exists | COMMENT |
| LOW | esphome/config.py | 698 | # Check if component exists | COMMENT |
| LOW | esphome/config.py | 721 | # Check if platform already exists | COMMENT |
| LOW | esphome/wizard.py | 255 | # Check if file already exists to prevent overwriting | COMMENT |
| 38 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/unit_tests/test_espota2_noise.py | 89 | def run(self) -> None: | CODE |
| LOW | tests/unit_tests/test_espota2_noise.py | 96 | except Exception as err: # noqa: BLE001 - surfaced via join_and_check | CODE |
| LOW | tests/unit_tests/test_framework_helpers.py | 1223 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-exception-caught | CODE |
| MEDIUM | tests/integration/conftest.py | 829 | print(f"Error reading from PTY: {result[0]}", file=sys.stderr) | CODE |
| LOW | tests/integration/test_syslog.py | 124 | 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/state_utils.py | 74 | except Exception as exc: # noqa: BLE001 the wait re-raises it, the callback must not die | 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/build_helpers.py | 116 | except Exception: # noqa: BLE001 | CODE |
| MEDIUM⚡ | script/build_helpers.py | 401 | print(f"Error compiling {label} for {', '.join(components)}") | CODE |
| LOW⚡ | script/build_helpers.py | 403 | except Exception as e: # noqa: BLE001 | CODE |
| MEDIUM⚡ | script/build_helpers.py | 404 | print(f"Error compiling {label} for {', '.join(components)}: {e}") | CODE |
| MEDIUM | script/build_helpers.py | 494 | 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 | 130 | except Exception: | CODE |
| LOW | script/analyze_component_buses.py | 141 | except Exception: # noqa: BLE001 # pylint: disable=broad-exception-caught | CODE |
| LOW | script/analyze_component_buses.py | 177 | except Exception: # noqa: BLE001 # pylint: disable=broad-exception-caught | CODE |
| LOW | script/analyze_component_buses.py | 235 | except Exception: # noqa: BLE001 # pylint: disable=broad-exception-caught | CODE |
| MEDIUM | script/analyze_component_buses.py | 344 | 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 | 522 | except Exception as e: # pylint: disable=broad-exception-caught | CODE |
| MEDIUM | script/test_build_components.py | 523 | print(f"Error merging configs for {components}: {e}") | CODE |
| LOW | script/helpers.py | 311 | except Exception: # noqa: BLE001 - never let a bad test config crash grouping | CODE |
| LOW | script/helpers.py | 605 | except Exception as e: | CODE |
| MEDIUM | script/split_components_for_ci.py | 451 | print(f"Error parsing components JSON: {e}", file=sys.stderr) | CODE |
| MEDIUM | script/split_components_for_ci.py | 464 | 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 | 775 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/config.py | 819 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/config.py | 852 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/config.py | 1537 | 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 | 326 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/util.py | 393 | 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 | 145 | except Exception as err: # noqa: BLE001 # pylint: disable=broad-except | CODE |
| LOW | esphome/vscode.py | 154 | 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 | 344 | 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 |
| 30 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 | 146 | Find an entity or raise AssertionError if not found. Args: entities: List of entity info objects from the A | STRING |
| HIGH | tests/integration/bmp_utils.py | 73 | Wait for a complete BMP file to appear at ``path`` and return it. The file is created before any of its contents ar | STRING |
| HIGH | tests/integration/bmp_utils.py | 126 | Ask for snapshots until one has something drawn on it, and return it and where it went. A display holds one flat co | 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 | 340 | 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 | 1095 | Determine memory impact analysis configuration. Always runs memory impact analysis when there are changed component | STRING |
| HIGH | script/analyze_component_buses.py | 150 | 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 | 550 | 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 | 87 | Remove a directory and its contents recursively if it exists. Args: directory: Path to the directory t | STRING |
| HIGH | esphome/framework_helpers.py | 247 | Create a Python virtual environment. Args: root: Path to the virtual environment directory msg | STRING |
| HIGH | esphome/framework_helpers.py | 1329 | 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 | 382 | 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 | 419 | 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 | 1147 | # 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 |
| MEDIUM | tests/components/toshiba/__init__.py | 6 | # The harness walks dependencies from the component manifest, not from the | COMMENT |
| LOW | script/merge_component_configs.py | 232 | # No ID, just add it | COMMENT |
| MEDIUM | script/determine-jobs.py | 557 | # Shared by every toolchain smoke-test job: the harness it invokes and the | 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 | 1050 | # (no --all-headers; the comprehensive esp32-idf pass covers the shared tree). | COMMENT |
| MEDIUM | esphome/host/toolchain.py | 36 | # and the integration-test harness resolve it by this name | 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 | 61 | # 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 | 75 | # 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 | 576 | # Static value - just set it directly without action infrastructure | COMMENT |
| LOW | esphome/components/mipi/__init__.py | 451 | # Explicit dimensions, just use as is | COMMENT |
| LOW | esphome/components/substitutions/__init__.py | 347 | # 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_arduino8266_toolchain.py | 38 | def _setup_core(tmp_path: Path) -> None: | STRING |
| 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_nrf52_toolchain.py | 22 | def _set_sdk_version(version: cv.Version) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_config_validation.py | 1439 | def _set_core_target(platform: str, framework: str) -> None: | CODE |
| LOW⚡ | tests/unit_tests/test_config_validation.py | 1447 | def _set_framework_version(platform: str, framework: str, version: cv.Version) -> None: | CODE |
| LOW | tests/unit_tests/test_config_validation.py | 615 | def _setup_core_for_framework(platform: str, framework: str) -> None: | CODE |
| LOW | tests/unit_tests/test_espidf_clang_tidy.py | 283 | def _set_idf_version(version: cv.Version, framework: str = "arduino") -> None: | CODE |
| LOW | …tests/components/test_esp32_write_idf_component_yml.py | 29 | def _setup_core(tmp_path: Path) -> None: | CODE |
| LOW | tests/unit_tests/components/esp32/test_sdkconfig.py | 19 | def _setup_core(tmp_path: Path, toolchain: Toolchain | None) -> None: | CODE |
| LOW | tests/unit_tests/build_gen/test_arduino8266.py | 69 | def _set_flags(*flags: str) -> None: | CODE |
| LOW | tests/component_tests/cdc_acm_uart/test_init.py | 17 | def _set_esp32_s3(set_core_config: SetCoreConfigCallable, **kwargs) -> None: | CODE |
| LOW | tests/component_tests/mipi_rgb/test_mipi_rgb_config.py | 63 | 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_ksz8851snl.py | 76 | def _set_esp32_s3(set_core_config: SetCoreConfigCallable) -> None: | CODE |
| LOW | tests/component_tests/ethernet/test_ethernet.py | 91 | def _set_esp32_core(set_core_config: SetCoreConfigCallable) -> 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 | tests/component_tests/uart_mux/test_init.py | 14 | def _set_esp32_s3(set_core_config: SetCoreConfigCallable) -> 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 | 516 | def update_submodules(repo_dir: Path, key: str) -> None: | CODE |
| LOW | esphome/yaml_util.py | 201 | def set_context(self, vars: dict[str, Any]) -> None: | CODE |
| LOW | esphome/cpp_helpers.py | 230 | 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 | 835 | def set_cpp_standard(standard: str) -> None: | CODE |
| LOW | esphome/core/entity_helpers.py | 423 | async def _setup_entity_impl(var: MockObj, config: ConfigType, platform: str) -> None: | CODE |
| LOW | esphome/components/openthread/__init__.py | 102 | def set_sdkconfig_options(config: ConfigType) -> None: | CODE |
| LOW | esphome/components/lock/__init__.py | 103 | 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 | 827 | def set_idf_sdkconfig_default(name: str, value: SdkconfigValueType) -> None: | CODE |
| LOW | esphome/components/esp32/__init__.py | 2587 | 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 | 184 | def _setup_core(work_dir: Path) -> None: | CODE |
| LOW | esphome/components/esp32_ble/__init__.py | 286 | __all__ = [ | CODE |
| LOW | esphome/components/lvgl/widgets/__init__.py | 208 | async def update_to_code(self, w: "Widget", config: dict) -> None: | CODE |
| LOW | esphome/components/lvgl/widgets/__init__.py | 555 | def _set_layout_options(w: Widget, layout: dict, base_name: str | None) -> None: | CODE |
| LOW | esphome/components/lvgl/widgets/table.py | 146 | async def set_selected_cell(w: Widget, config: ConfigType) -> None: | CODE |
| LOW | esphome/components/lvgl/widgets/keyboard.py | 57 | async def update_to_code(self, w: "Widget", config: dict) -> 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 | 626 | # Step 1: Device flat — gravity in enclosure frame is [0, 0, 1] | COMMENT |
| LOW⚡ | tests/component_tests/motion/test_motion.py | 636 | # 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 | 81 | // Step 1: Read serial number (~25ms with I2C delay) | COMMENT |
| LOW⚡ | esphome/components/sen6x/sen6x.cpp | 91 | // Step 2: Read product name in next loop iteration | COMMENT |
| LOW | esphome/components/sen6x/sen6x.cpp | 138 | // Step 3: Read firmware version and start measurements in next loop iteration | COMMENT |
| LOW | esphome/components/sen6x/sen6x.cpp | 150 | // Step 4: write configuration commands one at a time, then start measurements. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/component_tests/motion/test_motion.py | 626 | # Step 1: Device flat — gravity in enclosure frame is [0, 0, 1] | COMMENT |
| LOW⚡ | tests/component_tests/motion/test_motion.py | 636 | # 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 | 81 | // Step 1: Read serial number (~25ms with I2C delay) | COMMENT |
| LOW⚡ | esphome/components/sen6x/sen6x.cpp | 91 | // Step 2: Read product name in next loop iteration | COMMENT |
| LOW | esphome/components/sen6x/sen6x.cpp | 138 | // Step 3: Read firmware version and start measurements in next loop iteration | COMMENT |
| LOW | esphome/components/sen6x/sen6x.cpp | 150 | // Step 4: write configuration commands one at a time, then start measurements. | 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 | …component_tests/esp32/config/mbedtls_tls_wifi_eap.yaml | 12 | identity: "user@example.org" | CODE |
| LOW | esphome/components/runtime_image/__init__.py | 22 | 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 | 270 | CODE | |
| LOW | esphome/coroutine.py | 190 | CODE | |
| LOW | esphome/components/sensor/__init__.py | 380 | 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 | 99 | // TODO: implement | COMMENT |