From 791590c8a34cd3b8f7a0d3f4d7007fd04ea78474 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 25 Aug 2026 00:24:20 -0500 Subject: [PATCH] [uptime] Skip the timestamp sensor source unless a timestamp sensor is configured (#18746) --- esphome/components/uptime/sensor/__init__.py | 3 ++- .../uptime/sensor/uptime_timestamp_sensor.cpp | 4 +-- .../uptime/sensor/uptime_timestamp_sensor.h | 4 +-- esphome/core/defines.h | 1 + tests/component_tests/uptime/__init__.py | 0 .../uptime/config/seconds.yaml | 20 ++++++++++++++ .../uptime/config/timestamp.yaml | 20 ++++++++++++++ tests/component_tests/uptime/test_uptime.py | 27 +++++++++++++++++++ 8 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 tests/component_tests/uptime/__init__.py create mode 100644 tests/component_tests/uptime/config/seconds.yaml create mode 100644 tests/component_tests/uptime/config/timestamp.yaml create mode 100644 tests/component_tests/uptime/test_uptime.py diff --git a/esphome/components/uptime/sensor/__init__.py b/esphome/components/uptime/sensor/__init__.py index 4b611ffff3..a13d6cd7fd 100644 --- a/esphome/components/uptime/sensor/__init__.py +++ b/esphome/components/uptime/sensor/__init__.py @@ -61,8 +61,9 @@ async def to_code(config: ConfigType) -> None: if time_id_config := config.get(CONF_TIME_ID): time_id = await cg.get_variable(time_id_config) cg.add(var.set_time(time_id)) + cg.add_define("USE_UPTIME_TIMESTAMP") FILTER_SOURCE_FILES = filter_source_files_from_defines( - {"uptime_timestamp_sensor.cpp": "USE_TIME"} + {"uptime_timestamp_sensor.cpp": "USE_UPTIME_TIMESTAMP"} ) diff --git a/esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp b/esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp index 4e0f06be1c..e8b8a21562 100644 --- a/esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp +++ b/esphome/components/uptime/sensor/uptime_timestamp_sensor.cpp @@ -1,6 +1,6 @@ #include "uptime_timestamp_sensor.h" -#ifdef USE_TIME +#ifdef USE_UPTIME_TIMESTAMP #include "esphome/core/hal.h" #include "esphome/core/helpers.h" @@ -34,4 +34,4 @@ void UptimeTimestampSensor::dump_config() { } // namespace esphome::uptime -#endif // USE_TIME +#endif // USE_UPTIME_TIMESTAMP diff --git a/esphome/components/uptime/sensor/uptime_timestamp_sensor.h b/esphome/components/uptime/sensor/uptime_timestamp_sensor.h index 5b837cbce1..c0e00a14fe 100644 --- a/esphome/components/uptime/sensor/uptime_timestamp_sensor.h +++ b/esphome/components/uptime/sensor/uptime_timestamp_sensor.h @@ -2,7 +2,7 @@ #include "esphome/core/defines.h" -#ifdef USE_TIME +#ifdef USE_UPTIME_TIMESTAMP #include "esphome/components/sensor/sensor.h" #include "esphome/components/time/real_time_clock.h" @@ -25,4 +25,4 @@ class UptimeTimestampSensor final : public sensor::Sensor, public Component { } // namespace esphome::uptime -#endif // USE_TIME +#endif // USE_UPTIME_TIMESTAMP diff --git a/esphome/core/defines.h b/esphome/core/defines.h index a8aab65d4a..115ef2145d 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -192,6 +192,7 @@ #define USE_UART_DEBUGGER #define USE_UART_WAKE_LOOP_ON_RX #define USE_UPDATE +#define USE_UPTIME_TIMESTAMP #define USE_VALVE #define USE_WATER_HEATER #define USE_WATER_HEATER_VISUAL_OVERRIDES diff --git a/tests/component_tests/uptime/__init__.py b/tests/component_tests/uptime/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/component_tests/uptime/config/seconds.yaml b/tests/component_tests/uptime/config/seconds.yaml new file mode 100644 index 0000000000..4d81a28011 --- /dev/null +++ b/tests/component_tests/uptime/config/seconds.yaml @@ -0,0 +1,20 @@ +esphome: + name: test + +esp32: + board: esp32dev + framework: + type: esp-idf + +wifi: + ssid: "test_ssid" + password: "test_password" + +time: + - platform: sntp + id: sntp_time + +sensor: + - platform: uptime + name: Uptime Seconds + type: seconds diff --git a/tests/component_tests/uptime/config/timestamp.yaml b/tests/component_tests/uptime/config/timestamp.yaml new file mode 100644 index 0000000000..e2eea374bb --- /dev/null +++ b/tests/component_tests/uptime/config/timestamp.yaml @@ -0,0 +1,20 @@ +esphome: + name: test + +esp32: + board: esp32dev + framework: + type: esp-idf + +wifi: + ssid: "test_ssid" + password: "test_password" + +time: + - platform: sntp + id: sntp_time + +sensor: + - platform: uptime + name: Uptime Timestamp + type: timestamp diff --git a/tests/component_tests/uptime/test_uptime.py b/tests/component_tests/uptime/test_uptime.py new file mode 100644 index 0000000000..d77f510659 --- /dev/null +++ b/tests/component_tests/uptime/test_uptime.py @@ -0,0 +1,27 @@ +"""The timestamp uptime sensor source is only compiled when that type is used, +so the define must follow the configured sensor type rather than time: alone.""" + +from collections.abc import Callable +from pathlib import Path + +import pytest + +from esphome.core import CORE + + +@pytest.mark.parametrize( + ("fixture", "emits"), + [ + ("seconds.yaml", False), + ("timestamp.yaml", True), + ], +) +def test_timestamp_define_follows_sensor_type( + fixture: str, + emits: bool, + generate_main: Callable[[str | Path], str], + component_config_path: Callable[[str], Path], +) -> None: + generate_main(component_config_path(fixture)) + defines = {define.name for define in CORE.defines} + assert ("USE_UPTIME_TIMESTAMP" in defines) is emits