ESPHome  2024.12.2
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 
14 namespace esphome {
15 namespace sgp4x {
16 
18  int32_t state0;
19  int32_t state1;
20 } PACKED; // NOLINT
21 
22 enum SgpType { SGP40, SGP41 };
23 
24 struct GasTuning {
25  uint16_t index_offset;
29  uint16_t std_initial;
30  uint16_t gain_factor;
31 };
32 
33 // commands and constants
34 static const uint8_t SGP40_FEATURESET = 0x0020; // can measure VOC
35 static const uint8_t SGP41_FEATURESET = 0x0040; // can measure VOC and NOX
36 // Commands
37 static const uint16_t SGP4X_CMD_GET_SERIAL_ID = 0x3682;
38 static const uint16_t SGP4X_CMD_GET_FEATURESET = 0x202f;
39 static const uint16_t SGP4X_CMD_SELF_TEST = 0x280e;
40 static const uint16_t SGP40_CMD_MEASURE_RAW = 0x260F;
41 static const uint16_t SGP41_CMD_MEASURE_RAW = 0x2619;
42 static const uint16_t SGP41_CMD_NOX_CONDITIONING = 0x2612;
43 static const uint8_t SGP41_SUBCMD_NOX_CONDITIONING = 0x12;
44 
45 // Shortest time interval of 3H for storing baseline values.
46 // Prevents wear of the flash because of too many write operations
47 const uint32_t SHORTEST_BASELINE_STORE_INTERVAL = 10800;
48 static const uint16_t SPG40_SELFTEST_TIME = 250; // 250 ms for self test
49 static const uint16_t SPG41_SELFTEST_TIME = 320; // 320 ms for self test
50 static const uint16_t SGP40_MEASURE_TIME = 30;
51 static const uint16_t SGP41_MEASURE_TIME = 55;
52 // Store anyway if the baseline difference exceeds the max storage diff value
53 const float MAXIMUM_STORAGE_DIFF = 50.0f;
54 
55 class SGP4xComponent;
56 
59  enum ErrorCode {
62  INVALID_ID,
63  UNSUPPORTED_ID,
65  SELF_TEST_FAILED,
66  UNKNOWN
67  } error_code_{UNKNOWN};
68 
69  public:
70  // SGP4xComponent() {};
71  void set_humidity_sensor(sensor::Sensor *humidity) { humidity_sensor_ = humidity; }
73 
74  void setup() override;
75  void update() override;
76  void take_sample();
77  void dump_config() override;
78  float get_setup_priority() const override { return setup_priority::DATA; }
79  void set_store_baseline(bool store_baseline) { store_baseline_ = store_baseline; }
80  void set_voc_sensor(sensor::Sensor *voc_sensor) { voc_sensor_ = voc_sensor; }
81  void set_nox_sensor(sensor::Sensor *nox_sensor) { nox_sensor_ = nox_sensor; }
82  void set_voc_algorithm_tuning(uint16_t index_offset, uint16_t learning_time_offset_hours,
83  uint16_t learning_time_gain_hours, uint16_t gating_max_duration_minutes,
84  uint16_t std_initial, uint16_t gain_factor) {
85  voc_tuning_params_.value().index_offset = index_offset;
86  voc_tuning_params_.value().learning_time_offset_hours = learning_time_offset_hours;
87  voc_tuning_params_.value().learning_time_gain_hours = learning_time_gain_hours;
88  voc_tuning_params_.value().gating_max_duration_minutes = gating_max_duration_minutes;
89  voc_tuning_params_.value().std_initial = std_initial;
90  voc_tuning_params_.value().gain_factor = gain_factor;
91  }
92  void set_nox_algorithm_tuning(uint16_t index_offset, uint16_t learning_time_offset_hours,
93  uint16_t learning_time_gain_hours, uint16_t gating_max_duration_minutes,
94  uint16_t gain_factor) {
95  nox_tuning_params_.value().index_offset = index_offset;
96  nox_tuning_params_.value().learning_time_offset_hours = learning_time_offset_hours;
97  nox_tuning_params_.value().learning_time_gain_hours = learning_time_gain_hours;
98  nox_tuning_params_.value().gating_max_duration_minutes = gating_max_duration_minutes;
99  nox_tuning_params_.value().std_initial = 50;
100  nox_tuning_params_.value().gain_factor = gain_factor;
101  }
102 
103  protected:
104  void self_test_();
105 
107  sensor::Sensor *humidity_sensor_{nullptr};
108  sensor::Sensor *temperature_sensor_{nullptr};
109  int16_t sensirion_init_sensors_();
110 
111  void update_gas_indices_();
112  void measure_raw_();
113  uint16_t voc_sraw_;
114  uint16_t nox_sraw_;
115 
116  SgpType sgp_type_{SGP40};
117  uint64_t serial_number_;
118  uint16_t featureset_;
119 
121  uint16_t self_test_time_;
122 
123  sensor::Sensor *voc_sensor_{nullptr};
124  VOCGasIndexAlgorithm voc_algorithm_;
126  float voc_state0_;
127  float voc_state1_;
128  int32_t voc_index_ = 0;
129 
130  sensor::Sensor *nox_sensor_{nullptr};
131  int32_t nox_index_ = 0;
132  NOxGasIndexAlgorithm nox_algorithm_;
134 
135  uint16_t measure_time_;
136  uint8_t samples_read_ = 0;
137  uint8_t samples_to_stabilize_ = static_cast<int8_t>(GasIndexAlgorithm_INITIAL_BLACKOUT) * 2;
138 
143 };
144 } // namespace sgp4x
145 } // namespace esphome
void setup()
const float DATA
For components that import data from directly connected sensors like DHT.
Definition: component.cpp:19
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:92
void set_humidity_sensor(sensor::Sensor *humidity)
Definition: sgp4x.h:71
const float MAXIMUM_STORAGE_DIFF
Definition: sgp4x.h:53
This class implements support for the Sensirion sgp4x i2c GAS (VOC) sensors.
Definition: sgp4x.h:58
const uint32_t SHORTEST_BASELINE_STORE_INTERVAL
Definition: sgp4x.h:47
VOCGasIndexAlgorithm voc_algorithm_
Definition: sgp4x.h:124
optional< GasTuning > nox_tuning_params_
Definition: sgp4x.h:133
ESPPreferenceObject pref_
Definition: sgp4x.h:140
This class simplifies creating components that periodically check a state.
Definition: component.h:283
struct esphome::sgp4x::SGP4xBaselines PACKED
uint16_t std_initial
Definition: sgp4x.h:29
optional< GasTuning > voc_tuning_params_
Definition: sgp4x.h:125
float get_setup_priority() const override
Definition: sgp4x.h:78
uint16_t index_offset
Definition: sgp4x.h:25
uint16_t gating_max_duration_minutes
Definition: sgp4x.h:28
uint16_t learning_time_offset_hours
Definition: sgp4x.h:26
uint32_t seconds_since_last_store_
Definition: sgp4x.h:141
void set_store_baseline(bool store_baseline)
Definition: sgp4x.h:79
SGP4xBaselines voc_baselines_storage_
Definition: sgp4x.h:142
void set_nox_sensor(sensor::Sensor *nox_sensor)
Definition: sgp4x.h:81
uint16_t temperature
Definition: sun_gtil2.cpp:26
NOxGasIndexAlgorithm nox_algorithm_
Definition: sgp4x.h:132
void set_voc_sensor(sensor::Sensor *voc_sensor)
Definition: sgp4x.h:80
Implementation of a i2c functions for Sensirion sensors Sensirion data requires crc checking...
Definition: i2c_sensirion.h:17
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:82
void set_temperature_sensor(sensor::Sensor *temperature)
Definition: sgp4x.h:72
uint16_t learning_time_gain_hours
Definition: sgp4x.h:27
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
uint16_t gain_factor
Definition: sgp4x.h:30
Base-class for all sensors.
Definition: sensor.h:57