ESPHome 2025.5.0
Loading...
Searching...
No Matches
grove_gas_mc_v2.cpp
Go to the documentation of this file.
1#include "grove_gas_mc_v2.h"
2#include "esphome/core/hal.h"
3#include "esphome/core/log.h"
4
5namespace esphome {
6namespace grove_gas_mc_v2 {
7
8static const char *const TAG = "grove_gas_mc_v2";
9
10// I2C Commands for Grove Gas Multichannel V2 Sensor
11// Taken from:
12// https://github.com/Seeed-Studio/Seeed_Arduino_MultiGas/blob/master/src/Multichannel_Gas_GroveGasMultichannelV2.h
13static const uint8_t GROVE_GAS_MC_V2_HEAT_ON = 0xFE;
14static const uint8_t GROVE_GAS_MC_V2_HEAT_OFF = 0xFF;
15static const uint8_t GROVE_GAS_MC_V2_READ_GM102B = 0x01;
16static const uint8_t GROVE_GAS_MC_V2_READ_GM302B = 0x03;
17static const uint8_t GROVE_GAS_MC_V2_READ_GM502B = 0x05;
18static const uint8_t GROVE_GAS_MC_V2_READ_GM702B = 0x07;
19
21 if (sensor == nullptr) {
22 return true;
23 }
24 uint32_t value = 0;
25 if (!this->read_bytes(address, (uint8_t *) &value, 4)) {
26 ESP_LOGW(TAG, "Reading Grove Gas Sensor data failed!");
27 this->error_code_ = COMMUNICATION_FAILED;
28 this->status_set_warning();
29 return false;
30 }
31 sensor->publish_state(value);
32 return true;
33}
34
36 ESP_LOGCONFIG(TAG, "Setting up Grove Multichannel Gas Sensor V2...");
37
38 // Before reading sensor values, must preheat sensor
39 if (!(this->write_bytes(GROVE_GAS_MC_V2_HEAT_ON, {}))) {
40 this->mark_failed();
41 this->error_code_ = APP_START_FAILED;
42 }
43}
44
45void GroveGasMultichannelV2Component::update() {
46 // Read from each of the gas sensors
47 if (!this->read_sensor_(GROVE_GAS_MC_V2_READ_GM102B, this->nitrogen_dioxide_sensor_))
48 return;
49 if (!this->read_sensor_(GROVE_GAS_MC_V2_READ_GM302B, this->ethanol_sensor_))
50 return;
51 if (!this->read_sensor_(GROVE_GAS_MC_V2_READ_GM502B, this->tvoc_sensor_))
52 return;
53 if (!this->read_sensor_(GROVE_GAS_MC_V2_READ_GM702B, this->carbon_monoxide_sensor_))
54 return;
55
57}
58
59void GroveGasMultichannelV2Component::dump_config() {
60 ESP_LOGCONFIG(TAG, "Grove Multichannel Gas Sensor V2");
61 LOG_I2C_DEVICE(this)
62 LOG_UPDATE_INTERVAL(this)
63 LOG_SENSOR(" ", "Nitrogen Dioxide", this->nitrogen_dioxide_sensor_)
64 LOG_SENSOR(" ", "Ethanol", this->ethanol_sensor_)
65 LOG_SENSOR(" ", "Carbon Monoxide", this->carbon_monoxide_sensor_)
66 LOG_SENSOR(" ", "TVOC", this->tvoc_sensor_)
67
68 if (this->is_failed()) {
69 switch (this->error_code_) {
71 ESP_LOGW(TAG, "Communication failed! Is the sensor connected?");
72 break;
73 case APP_INVALID:
74 ESP_LOGW(TAG, "Sensor reported invalid APP installed.");
75 break;
77 ESP_LOGW(TAG, "Sensor reported APP start failed.");
78 break;
79 case UNKNOWN:
80 default:
81 ESP_LOGW(TAG, "Unknown setup error!");
82 break;
83 }
84 }
85}
86
87} // namespace grove_gas_mc_v2
88} // namespace esphome
uint8_t address
Definition bl0906.h:4
virtual void mark_failed()
Mark this component as failed.
virtual void setup()
Where the component's initialization should happen.
Definition component.cpp:51
bool is_failed() const
void status_set_warning(const char *message="unspecified")
void status_clear_warning()
bool read_sensor_(uint8_t address, sensor::Sensor *sensor)
enum esphome::grove_gas_mc_v2::GroveGasMultichannelV2Component::ErrorCode UNKNOWN
bool write_bytes(uint8_t a_register, const uint8_t *data, uint8_t len, bool stop=true)
Definition i2c.h:252
bool read_bytes(uint8_t a_register, uint8_t *data, uint8_t len)
Compat APIs All methods below have been added for compatibility reasons.
Definition i2c.h:216
Base-class for all sensors.
Definition sensor.h:57
void publish_state(float state)
Publish a new state to the front-end.
Definition sensor.cpp:39
Providing packet encoding functions for exchanging data with a remote host.
Definition a01nyub.cpp:7