diff --git a/esphome/components/scd4x/sensor.py b/esphome/components/scd4x/sensor.py index 4b67319efb1..f1c7beaea8b 100644 --- a/esphome/components/scd4x/sensor.py +++ b/esphome/components/scd4x/sensor.py @@ -42,6 +42,15 @@ MEASUREMENT_MODE_OPTIONS = MeasurementMode.options( ) +def pressure_hpa(value: str | float) -> float: + """Pressure in hPa. A bare number is hPa, matching what the C++ sends to the sensor.""" + try: + return cv.float_(value) + except cv.Invalid: + pass + return cv.pressure(value) * 1000 # bar, mbar, mBar + + CONFIG_SCHEMA = ( cv.Schema( { @@ -72,7 +81,9 @@ CONFIG_SCHEMA = ( cv.float_with_unit("altitude", "(m|m a.s.l.|MAMSL|MASL)"), cv.int_range(min=0, max=0xFFFF, max_included=False), ), - cv.Optional(CONF_AMBIENT_PRESSURE_COMPENSATION): cv.pressure, + cv.Optional(CONF_AMBIENT_PRESSURE_COMPENSATION): cv.All( + pressure_hpa, cv.Any(cv.float_range(min=700, max=1200), 0) + ), cv.Optional(CONF_TEMPERATURE_OFFSET, default="4°C"): cv.temperature_delta, cv.Optional(CONF_AMBIENT_PRESSURE_COMPENSATION_SOURCE): cv.use_id( sensor.Sensor diff --git a/tests/components/scd4x/common.yaml b/tests/components/scd4x/common.yaml index cedb88977ea..e875cb0cc57 100644 --- a/tests/components/scd4x/common.yaml +++ b/tests/components/scd4x/common.yaml @@ -14,3 +14,19 @@ sensor: ambient_pressure_compensation: 961mBar temperature_offset: 4.2C update_interval: 15s + - platform: scd4x + i2c_id: i2c_bus + co2: + name: SCD4X CO2 (bare hPa) + ambient_pressure_compensation: 961 + - platform: scd4x + i2c_id: i2c_bus + co2: + name: SCD4X CO2 (bar) + ambient_pressure_compensation: 0.961bar + - platform: scd4x + i2c_id: i2c_bus + co2: + name: SCD4X CO2 (altitude only) + altitude_compensation: 500m + ambient_pressure_compensation: 0