70 uint16_t collected = 0;
72 for (
const int32_t timing : timings) {
76 const uint64_t bit = timing > 0 ? 1 : 0;
77 for (
uint32_t i = 0; i < cells; i++) {
78 stream = (stream << 1) | bit;
80 if ((stream & SYNC_AND_HEADER_MASK) != SYNC_AND_HEADER) {
83 payload[0] = uint8_t(SYNC_AND_HEADER >> 8);
84 payload[1] = uint8_t(SYNC_AND_HEADER);
85 collected = HEADER_SIZE * 8;
88 payload[collected / 8] = uint8_t((payload[collected / 8] << 1) | bit);
97 ESP_LOGV(TAG,
"Rejected frame: sum 0x%02X received 0x%02X, counter %u followed by %u",
107 const uint16_t sensor_id =
encode_uint16(payload[2], payload[3]);
109 ESP_LOGV(TAG,
"Ignoring station 0x%04X", sensor_id);
113 const uint8_t humidity = payload[7];
114 const float wind_speed = float(offset_word(payload[8], payload[9])) * WIND_SPEED_MS_PER_RAW;
115 const float wind_gust = float(payload[10]) * WIND_GUST_MS_PER_RAW;
116 const float wind_direction = float(offset_word(payload[11], payload[12]) & 0x0FFF);
117 const float rain = float(offset_word(payload[13], payload[14])) * RAIN_MM_PER_RAW;
118 const int8_t uv_index = int8_t(payload[15] & 0x1F) - 1;
120 const uint16_t lux_raw = offset_word(payload[16], payload[17]);
121 const float illuminance = (lux_raw & 0x8000) != 0 ?
float(lux_raw & 0x7FFF) * 10.0f : float(lux_raw);
122 const uint8_t tx_counter = payload[18];
125 "Vevor DTX id=0x%04X status=0x%02X temp=%.1fC hum=%u%% wind=%.1fm/s gust=%.1fm/s dir=%.0f "
126 "rain=%.1f uv=%d raw=0x%02X lux=%.0f raw=0x%04X tx=%u",
127 sensor_id, payload[4],
temperature, humidity, wind_speed, wind_gust, wind_direction, rain, uv_index,
128 payload[15], illuminance, lux_raw, tx_counter);
132 if (sensor !=
nullptr)
136 publish(this->humidity_sensor_, humidity);
137 publish(this->wind_speed_sensor_, wind_speed);
138 publish(this->wind_gust_sensor_, wind_gust);
139 publish(this->wind_direction_sensor_, wind_direction);
140 publish(this->rain_sensor_, rain);
141 publish(this->uv_index_sensor_, uv_index);
142 publish(this->illuminance_sensor_, illuminance);
143 publish(this->tx_counter_sensor_, tx_counter);
145#ifdef USE_TEXT_SENSOR
146 if (this->sensor_id_text_sensor_ !=
nullptr) {
148 snprintf(text,
sizeof(text),
"0x%04X", sensor_id);
149 this->sensor_id_text_sensor_->publish_state(text);
152#ifdef USE_BINARY_SENSOR
153 if (this->low_battery_binary_sensor_ !=
nullptr)
154 this->low_battery_binary_sensor_->publish_state((payload[4] & 0x80) != 0);