44 char addr_buf[MAC_ADDRESS_PRETTY_BUFFER_SIZE];
47 ESP_LOGVV(TAG,
"parse_device(): MAC address %s found.", addr_str);
52 if (service_uuids.size() != 1) {
55 const auto &service_uuid = service_uuids[0];
56 if (service_uuid != esp32_ble_tracker::ESPBTUUID::from_uint16(SERVICE_UUID)) {
63 if (manu_datas.size() != 1) {
64 ESP_LOGE(TAG,
"[%s] Unexpected manu_datas size (%d)", addr_str, manu_datas.size());
68 const auto &manu_data = manu_datas[0];
70#if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERY_VERBOSE
73 ESP_LOGVV(TAG,
"[%s] Manufacturer data: %s", addr_str,
76 if (manu_data.data.size() != MANUFACTURER_DATA_LENGTH) {
77 ESP_LOGE(TAG,
"[%s] Unexpected manu_data size (%d)", addr_str, manu_data.data.size());
84 const u_int8_t hardware_id = mopeka_data->data_1 & 0xCF;
87 ESP_LOGE(TAG,
"[%s] Unsupported Sensor Type (0x%X)", addr_str, hardware_id);
91 ESP_LOGVV(TAG,
"[%s] Sensor slow update rate: %d", addr_str, mopeka_data->slow_update_rate);
92 ESP_LOGVV(TAG,
"[%s] Sensor sync pressed: %d", addr_str, mopeka_data->sync_pressed);
93 for (u_int8_t i = 0; i < 3; i++) {
94 ESP_LOGVV(TAG,
"[%s] %u. Sensor data %u time %u.", addr_str, (i * 4) + 1, mopeka_data->val[i].value_0,
95 mopeka_data->val[i].time_0);
96 ESP_LOGVV(TAG,
"[%s] %u. Sensor data %u time %u.", addr_str, (i * 4) + 2, mopeka_data->val[i].value_1,
97 mopeka_data->val[i].time_1);
98 ESP_LOGVV(TAG,
"[%s] %u. Sensor data %u time %u.", addr_str, (i * 4) + 3, mopeka_data->val[i].value_2,
99 mopeka_data->val[i].time_2);
100 ESP_LOGVV(TAG,
"[%s] %u. Sensor data %u time %u.", addr_str, (i * 4) + 4, mopeka_data->val[i].value_3,
101 mopeka_data->val[i].time_3);
124 std::array<u_int8_t, 12> measurements_time = {};
125 std::array<u_int8_t, 12> measurements_value = {};
128 u_int8_t measurements_index = 0;
129 for (u_int8_t i = 0; i < 3; i++) {
130 measurements_time[measurements_index] = mopeka_data->val[i].time_0 + 1;
131 measurements_value[measurements_index] = mopeka_data->val[i].value_0;
132 measurements_index++;
133 measurements_time[measurements_index] = mopeka_data->val[i].time_1 + 1;
134 measurements_value[measurements_index] = mopeka_data->val[i].value_1;
135 measurements_index++;
136 measurements_time[measurements_index] = mopeka_data->val[i].time_2 + 1;
137 measurements_value[measurements_index] = mopeka_data->val[i].value_2;
138 measurements_index++;
139 measurements_time[measurements_index] = mopeka_data->val[i].time_3 + 1;
140 measurements_value[measurements_index] = mopeka_data->val[i].value_3;
141 measurements_index++;
146 u_int8_t number_of_usable_values = 0;
147 u_int16_t best_value = 0;
148 u_int16_t best_time = 0;
150 u_int16_t measurement_time = 0;
151 for (u_int8_t i = 0; i < 12; i++) {
153 measurement_time += measurements_time[i];
154 if (measurements_value[i] != 0) {
156 number_of_usable_values++;
157 if (measurements_value[i] > best_value) {
159 best_value = measurements_value[i];
160 best_time = measurement_time;
163 measurement_time = 0;
168 ESP_LOGV(TAG,
"[%s] Found %u values with best data %u time %u.", addr_str, number_of_usable_values, best_value,
171 if (number_of_usable_values < 1 || best_value < 2 || best_time < 2) {
173 ESP_LOGW(TAG,
"[%s] Poor read quality. Setting distance to 0.", addr_str);
177 if (this->
level_ !=
nullptr) {
182 ESP_LOGV(TAG,
"[%s] Speed of sound in current fluid %f m/s", addr_str, lpg_speed_of_sound);
184 uint32_t distance_value = lpg_speed_of_sound * best_time / 100.0f;
192 if (this->
level_ !=
nullptr) {
193 uint8_t tank_level = 0;
194 if (distance_value >= this->
full_mm_) {
196 }
else if (distance_value > this->
empty_mm_) {