ESPHome 2026.11.0-dev
Loading...
Searching...
No Matches
sen6x.h
Go to the documentation of this file.
1#pragma once
2
7#ifdef SEN6X_STATUS_SENSOR_COUNT
10#endif
11
12namespace esphome::sen6x {
13
14#ifdef SEN6X_STATUS_SENSOR_COUNT
15// Bits of the device status register (datasheet section 4.3) a binary sensor can watch
25
29 uint8_t bit; // of the status register, set at setup once the variant is known
30};
31#endif
32
33// The NOx algorithm requires std_initial to stay at 50 (Sensirion datasheet)
34static constexpr uint16_t NOX_STD_INITIAL = 50;
35
36// Raw parameter block for the VOC/NOx algorithm tuning commands
45
46// Raw values in the device's fixed-point encoding (offset x200, slope x10000)
52
53// Raw values in the device's fixed-point encoding (all x10)
55 uint16_t k;
56 uint16_t p;
57 uint16_t t1;
58 uint16_t t2;
59};
60
61// The CO2 settings a config may leave out: altitude is 0 to 3000 m, pressure 700 to 1200 hPa
62inline constexpr uint16_t ALTITUDE_UNSET = 0xFFFF;
63inline constexpr uint16_t PRESSURE_UNSET = 0;
64
66 SUB_SENSOR(pm_1_0)
67 SUB_SENSOR(pm_2_5)
68 SUB_SENSOR(pm_4_0)
69 SUB_SENSOR(pm_10_0)
70#ifdef USE_SEN6X_NUMBER_CONCENTRATION
71 SUB_SENSOR(pmc_0_5)
72 SUB_SENSOR(pmc_1_0)
73 SUB_SENSOR(pmc_2_5)
74 SUB_SENSOR(pmc_4_0)
75 SUB_SENSOR(pmc_10_0)
76#endif
77 SUB_SENSOR(temperature)
78 SUB_SENSOR(humidity)
79 SUB_SENSOR(voc)
80 SUB_SENSOR(nox)
81 SUB_SENSOR(co2)
82 SUB_SENSOR(hcho)
83
84 public:
85 void setup() override;
86 void dump_config() override;
87 void update() override;
88
89 enum Sen6xType { SEN62, SEN63C, SEN65, SEN66, SEN68, SEN69C, UNKNOWN };
90
91 void set_type(const std::string &type) { sen6x_type_ = infer_type_from_product_name_(type); }
92 void set_voc_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 std_initial, uint16_t gain_factor) {
96 index_offset, learning_time_offset_hours, learning_time_gain_hours, gating_max_duration_minutes, std_initial,
97 gain_factor};
98 }
99 void set_nox_algorithm_tuning(uint16_t index_offset, uint16_t learning_time_offset_hours,
100 uint16_t learning_time_gain_hours, uint16_t gating_max_duration_minutes,
101 uint16_t gain_factor) {
102 this->nox_tuning_params_ = GasTuning{index_offset,
103 learning_time_offset_hours,
104 learning_time_gain_hours,
105 gating_max_duration_minutes,
106 NOX_STD_INITIAL,
107 gain_factor};
108 }
109 void set_startup_delay(uint32_t delay_ms) { this->startup_delay_ms_ = delay_ms; }
110 void set_temperature_compensation(int16_t offset, int16_t normalized_offset_slope, uint16_t time_constant) {
111 this->temperature_compensation_ = TemperatureCompensation{offset, normalized_offset_slope, time_constant};
112 }
113 void set_temperature_acceleration(uint16_t k, uint16_t p, uint16_t t1, uint16_t t2) {
115 }
116#ifdef SEN6X_STATUS_SENSOR_COUNT
117 void add_status_binary_sensor(binary_sensor::BinarySensor *sensor, Sen6xStatus status) {
118 this->status_sensors_.push_back({sensor, status, 0});
119 }
120#endif
121 void set_automatic_self_calibration(bool enabled) { this->co2_asc_ = enabled; }
122 void set_altitude_compensation(uint16_t altitude) { this->altitude_compensation_ = altitude; }
123 void set_ambient_pressure_compensation(uint16_t pressure_hpa) { this->ambient_pressure_ = pressure_hpa; }
124 void set_ambient_pressure_source(sensor::Sensor *pressure) { this->ambient_pressure_source_ = pressure; }
125 void start_measurement();
126 void stop_measurement();
127 void start_fan_cleaning();
128 void activate_sht_heater();
129
130 protected:
141
142 Sen6xType infer_type_from_product_name_(const std::string &product_name);
144 bool write_setup_step_(SetupStep step);
145 void finish_setup_();
146 bool write_config_words_(uint16_t i2c_command, const uint16_t *data, uint8_t len);
147 bool write_tuning_parameters_(uint16_t i2c_command, const GasTuning &tuning);
148 bool write_setup_register_(uint16_t i2c_command, uint16_t value);
151 void write_ambient_pressure_(uint16_t pressure_hpa);
152 void update_ambient_pressure_compensation_(float pressure_hpa);
154 bool command_blocked_() const;
155 void set_command_wait_(uint32_t wait_ms);
157 void poll_data_ready_();
158 void read_measurements_();
160 void read_device_status_();
161#ifdef SEN6X_STATUS_SENSOR_COUNT
163#endif
164#ifdef USE_SEN6X_NUMBER_CONCENTRATION
168#endif
169
170 std::string product_name_;
171 std::string serial_number_;
172#ifdef SEN6X_STATUS_SENSOR_COUNT
174#endif
175 optional<GasTuning> voc_tuning_params_;
176 optional<GasTuning> nox_tuning_params_;
177 optional<TemperatureAcceleration> temperature_acceleration_;
178 optional<TemperatureCompensation> temperature_compensation_;
179 uint16_t read_cmd_{0};
182 Sen6xType sen6x_type_{UNKNOWN};
183 // Post-command wait windows, stored as start time plus duration so elapsed-time checks survive millis() wrap
190 // Last pressure written to the device, used to skip redundant writes
192 optional<bool> co2_asc_;
197 uint8_t read_words_{0};
198 bool initialized_{false};
200 bool measuring_{false};
201 bool startup_complete_{false};
202};
203
204} // namespace esphome::sen6x
uint8_t status
Definition bl0942.h:8
virtual void setup()
Where the component's initialization should happen.
Definition component.cpp:84
This class simplifies creating components that periodically check a state.
Definition component.h:519
Minimal static vector - saves memory by avoiding std::vector overhead.
Definition helpers.h:303
Base class for all binary_sensor-type classes.
void parse_and_publish_number_concentration_()
Definition sen6x.cpp:676
bool write_temperature_compensation_(const TemperatureCompensation &compensation)
Definition sen6x.cpp:279
optional< GasTuning > voc_tuning_params_
Definition sen6x.h:175
bool has_number_concentration_sensor_() const
Definition sen6x.cpp:661
StaticVector< StatusSensor, SEN6X_STATUS_SENSOR_COUNT > status_sensors_
Definition sen6x.h:173
optional< TemperatureAcceleration > temperature_acceleration_
Definition sen6x.h:177
void set_command_wait_(uint32_t wait_ms)
Definition sen6x.cpp:723
uint32_t command_wait_remaining_() const
Definition sen6x.cpp:716
bool write_setup_register_(uint16_t i2c_command, uint16_t value)
Definition sen6x.cpp:291
sensor::Sensor * ambient_pressure_source_
Definition sen6x.h:180
bool write_temperature_acceleration_(const TemperatureAcceleration &acceleration)
Definition sen6x.cpp:286
Sen6xType infer_type_from_product_name_(const std::string &product_name)
Definition sen6x.cpp:815
bool write_config_words_(uint16_t i2c_command, const uint16_t *data, uint8_t len)
Definition sen6x.cpp:309
bool write_setup_step_(SetupStep step)
Definition sen6x.cpp:237
optional< TemperatureCompensation > temperature_compensation_
Definition sen6x.h:178
optional< GasTuning > nox_tuning_params_
Definition sen6x.h:176
optional< bool > co2_asc_
Definition sen6x.h:192
bool write_tuning_parameters_(uint16_t i2c_command, const GasTuning &tuning)
Definition sen6x.cpp:319
void write_ambient_pressure_(uint16_t pressure_hpa)
Definition sen6x.cpp:693
void update_ambient_pressure_compensation_(float pressure_hpa)
Definition sen6x.cpp:698
Base-class for all sensors.
Definition sensor.h:47
uint8_t type
constexpr uint16_t ALTITUDE_UNSET
Definition sen6x.h:62
constexpr uint16_t PRESSURE_UNSET
Definition sen6x.h:63
const void size_t len
Definition hal.h:68
static void uint32_t
uint16_t learning_time_gain_hours
Definition sen6x.h:40
uint16_t learning_time_offset_hours
Definition sen6x.h:39
uint16_t gating_max_duration_minutes
Definition sen6x.h:41
binary_sensor::BinarySensor * sensor
Definition sen6x.h:27
uint16_t temperature
Definition sun_gtil2.cpp:12
uint8_t pressure
Definition tt21100.cpp:7