8static const char *
const TAG =
"mhz19";
9static const uint8_t MHZ19_REQUEST_LENGTH = 8;
10static const uint8_t MHZ19_RESPONSE_LENGTH = 9;
11static const uint8_t MHZ19_COMMAND_GET_PPM[] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00};
12static const uint8_t MHZ19_COMMAND_ABC_ENABLE[] = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00};
13static const uint8_t MHZ19_COMMAND_ABC_DISABLE[] = {0xFF, 0x01, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00};
14static const uint8_t MHZ19_COMMAND_CALIBRATE_ZERO[] = {0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00};
15static const uint8_t MHZ19_COMMAND_DETECTION_RANGE_0_2000PPM[] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x07, 0xD0};
16static const uint8_t MHZ19_COMMAND_DETECTION_RANGE_0_5000PPM[] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x13, 0x88};
17static const uint8_t MHZ19_COMMAND_DETECTION_RANGE_0_10000PPM[] = {0xFF, 0x01, 0x99, 0x00, 0x00, 0x00, 0x27, 0x10};
19#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG
23 return LOG_STR(
"0-2000 ppm");
25 return LOG_STR(
"0-5000 ppm");
27 return LOG_STR(
"0-10000 ppm");
29 return LOG_STR(
"default");
36 for (uint8_t i = 1; i < MHZ19_REQUEST_LENGTH; i++) {
39 return 0xFF - sum + 0x01;
55 if (now_ms < warmup_ms) {
56 ESP_LOGW(TAG,
"MHZ19 warming up, %" PRIu32
" s left", (warmup_ms - now_ms) / 1000);
61 uint8_t response[MHZ19_RESPONSE_LENGTH];
63 ESP_LOGW(TAG,
"Reading data from MHZ19 failed!");
68 if (response[0] != 0xFF || response[1] != 0x86) {
69 ESP_LOGW(TAG,
"Invalid preamble from MHZ19!");
76 ESP_LOGW(TAG,
"MHZ19 Checksum doesn't match: 0x%02X!=0x%02X", response[8],
checksum);
82 const uint16_t ppm = (uint16_t(response[2]) << 8) | response[3];
83 const int temp = int(response[4]) - 40;
84 const uint8_t
status = response[5];
86 ESP_LOGD(TAG,
"MHZ19 Received CO₂=%uppm Temperature=%d°C Status=0x%02X", ppm, temp,
status);
94 ESP_LOGD(TAG,
"MHZ19 Calibrating zero point");
99 ESP_LOGD(TAG,
"MHZ19 Enabling automatic baseline calibration");
104 ESP_LOGD(TAG,
"MHZ19 Disabling automatic baseline calibration");
109 const uint8_t *command;
110 switch (detection_range) {
112 command = MHZ19_COMMAND_DETECTION_RANGE_0_2000PPM;
115 command = MHZ19_COMMAND_DETECTION_RANGE_0_5000PPM;
118 command = MHZ19_COMMAND_DETECTION_RANGE_0_10000PPM;
121 ESP_LOGV(TAG,
"Using previously set detection range (no change)");
124 ESP_LOGD(TAG,
"Setting detection range to %s", LOG_STR_ARG(detection_range_to_log_string(detection_range)));
136 if (response ==
nullptr)
139 return this->
read_array(response, MHZ19_RESPONSE_LENGTH);
143 ESP_LOGCONFIG(TAG,
"MH-Z19:");
149 ESP_LOGCONFIG(TAG,
" Automatic baseline calibration enabled on boot");
151 ESP_LOGCONFIG(TAG,
" Automatic baseline calibration disabled on boot");
154 ESP_LOGCONFIG(TAG,
" Warmup time: %" PRIu32
" s", this->
warmup_seconds_);
155 ESP_LOGCONFIG(TAG,
" Detection range: %s", LOG_STR_ARG(detection_range_to_log_string(this->
detection_range_)));
void check_uart_settings(uint32_t baud_rate, uint8_t stop_bits=1, UARTParityOptions parity=UART_CONFIG_PARITY_NONE, uint8_t data_bits=8)
Check that the configuration of the UART bus matches the provided values and otherwise print a warnin...