ESPHome 2026.8.0-dev
Loading...
Searching...
No Matches
sgp4x.h
Go to the documentation of this file.
1#pragma once
2
3#include <cinttypes>
4#include <cmath>
5
11#include <VOCGasIndexAlgorithm.h>
12#include <NOxGasIndexAlgorithm.h>
13
14namespace esphome::sgp4x {
15
17 float state0;
18 float state1;
19};
20
22
31
32// commands and constants
33static const uint8_t SGP40_FEATURESET = 0x0020; // can measure VOC
34static const uint8_t SGP41_FEATURESET = 0x0040; // can measure VOC and NOX
35// Commands
36static const uint16_t SGP4X_CMD_GET_SERIAL_ID = 0x3682;
37static const uint16_t SGP4X_CMD_GET_FEATURESET = 0x202f;
38static const uint16_t SGP4X_CMD_SELF_TEST = 0x280e;
39static const uint16_t SGP40_CMD_MEASURE_RAW = 0x260F;
40static const uint16_t SGP41_CMD_MEASURE_RAW = 0x2619;
41static const uint16_t SGP41_CMD_NOX_CONDITIONING = 0x2612;
42static const uint8_t SGP41_SUBCMD_NOX_CONDITIONING = 0x12;
43
44// Shortest time interval of 3H for storing baseline values.
45// Prevents wear of the flash because of too many write operations
47static const uint16_t SPG40_SELFTEST_TIME = 250; // 250 ms for self test
48static const uint16_t SPG41_SELFTEST_TIME = 320; // 320 ms for self test
49static const uint16_t SGP40_MEASURE_TIME = 30;
50static const uint16_t SGP41_MEASURE_TIME = 55;
51// Store anyway if the baseline difference exceeds the max storage diff value
52// state0 is mean of variance estimator, hence can have larger absolute values and a larger diff threshold
53const float MAXIMUM_STORAGE_DIFF_STATE0 = 50.0f;
54// state1 is std of variance estimator, so it typically has smaller absolute values than state0, hence we use a smaller
55// diff threshold
56const float MAXIMUM_STORAGE_DIFF_STATE1 = 5.0f;
57
58class SGP4xComponent;
59
61class SGP4xComponent final : public PollingComponent,
62 public sensor::Sensor,
64 enum ErrorCode {
65 COMMUNICATION_FAILED,
66 MEASUREMENT_INIT_FAILED,
67 INVALID_ID,
68 UNSUPPORTED_ID,
69 SERIAL_NUMBER_IDENTIFICATION_FAILED,
70 SELF_TEST_FAILED,
71 UNKNOWN
72 } error_code_{UNKNOWN};
73
74 public:
75 // SGP4xComponent() {};
76 void set_humidity_sensor(sensor::Sensor *humidity) { humidity_sensor_ = humidity; }
78
79 void setup() override;
80 void update() override;
81 void take_sample();
82 void dump_config() override;
83 void set_store_baseline(bool store_baseline) { store_baseline_ = store_baseline; }
84 void set_voc_sensor(sensor::Sensor *voc_sensor) { voc_sensor_ = voc_sensor; }
85 void set_nox_sensor(sensor::Sensor *nox_sensor) { nox_sensor_ = nox_sensor; }
86 void set_voc_algorithm_tuning(uint16_t index_offset, uint16_t learning_time_offset_hours,
87 uint16_t learning_time_gain_hours, uint16_t gating_max_duration_minutes,
88 uint16_t std_initial, uint16_t gain_factor) {
90 index_offset, learning_time_offset_hours, learning_time_gain_hours, gating_max_duration_minutes, std_initial,
91 gain_factor};
92 }
93 void set_nox_algorithm_tuning(uint16_t index_offset, uint16_t learning_time_offset_hours,
94 uint16_t learning_time_gain_hours, uint16_t gating_max_duration_minutes,
95 uint16_t gain_factor) {
96 this->nox_tuning_params_ =
97 GasTuning{index_offset, learning_time_offset_hours, learning_time_gain_hours, gating_max_duration_minutes, 50,
98 gain_factor};
99 }
100
101 protected:
102 void self_test_();
103
108
109 void update_gas_indices_();
110 void measure_raw_();
111 uint16_t voc_sraw_;
112 uint16_t nox_sraw_;
113
116
119
121 VOCGasIndexAlgorithm voc_algorithm_;
122 optional<GasTuning> voc_tuning_params_;
125 int32_t voc_index_ = 0;
126
128 int32_t nox_index_ = 0;
129 NOxGasIndexAlgorithm nox_algorithm_;
130 optional<GasTuning> nox_tuning_params_;
131
133 uint8_t samples_read_ = 0;
134 uint8_t samples_to_stabilize_ = static_cast<int8_t>(GasIndexAlgorithm_INITIAL_BLACKOUT) * 2;
136
137 optional<uint32_t> nox_conditioning_start_{};
141};
142} // namespace esphome::sgp4x
This class simplifies creating components that periodically check a state.
Definition component.h:510
Base-class for all sensors.
Definition sensor.h:47
This class implements support for the Sensirion sgp4x i2c GAS (VOC) sensors.
Definition sgp4x.h:63
void set_temperature_sensor(sensor::Sensor *temperature)
Definition sgp4x.h:77
SGP4xBaselines voc_baselines_storage_
Definition sgp4x.h:140
void set_nox_sensor(sensor::Sensor *nox_sensor)
Definition sgp4x.h:85
void set_humidity_sensor(sensor::Sensor *humidity)
Definition sgp4x.h:76
optional< uint32_t > nox_conditioning_start_
Definition sgp4x.h:137
ESPPreferenceObject pref_
Definition sgp4x.h:138
void dump_config() override
Definition sgp4x.cpp:257
sensor::Sensor * humidity_sensor_
Input sensor for humidity and temperature compensation.
Definition sgp4x.h:105
void set_voc_sensor(sensor::Sensor *voc_sensor)
Definition sgp4x.h:84
sensor::Sensor * voc_sensor_
Definition sgp4x.h:120
void set_nox_algorithm_tuning(uint16_t index_offset, uint16_t learning_time_offset_hours, uint16_t learning_time_gain_hours, uint16_t gating_max_duration_minutes, uint16_t gain_factor)
Definition sgp4x.h:93
VOCGasIndexAlgorithm voc_algorithm_
Definition sgp4x.h:121
void set_store_baseline(bool store_baseline)
Definition sgp4x.h:83
sensor::Sensor * temperature_sensor_
Definition sgp4x.h:106
optional< GasTuning > voc_tuning_params_
Definition sgp4x.h:122
NOxGasIndexAlgorithm nox_algorithm_
Definition sgp4x.h:129
optional< GasTuning > nox_tuning_params_
Definition sgp4x.h:130
sensor::Sensor * nox_sensor_
Definition sgp4x.h:127
void set_voc_algorithm_tuning(uint16_t index_offset, uint16_t learning_time_offset_hours, uint16_t learning_time_gain_hours, uint16_t gating_max_duration_minutes, uint16_t std_initial, uint16_t gain_factor)
Definition sgp4x.h:86
const float MAXIMUM_STORAGE_DIFF_STATE0
Definition sgp4x.h:53
const float MAXIMUM_STORAGE_DIFF_STATE1
Definition sgp4x.h:56
const uint32_t SHORTEST_BASELINE_STORE_INTERVAL
Definition sgp4x.h:46
static void uint32_t
uint16_t gating_max_duration_minutes
Definition sgp4x.h:27
uint16_t learning_time_gain_hours
Definition sgp4x.h:26
uint16_t learning_time_offset_hours
Definition sgp4x.h:25
uint16_t temperature
Definition sun_gtil2.cpp:12