the first (initialized) Eddystone (e)TLM frame have vbatt unset. I am using SDK 15.3. I suggest the following changes, it simply busy wait until ADC reading is finished before filling in the advertisement frames:
--- a/components/ble/ble_services/eddystone/nrf_ble_es.c
+++ b/components/ble/ble_services/eddystone/nrf_ble_es.c
@@ -51,6 +51,7 @@
#include "es_stopwatch.h"
#include "escs_defs.h"
#include "nrf_sdh_ble.h"
+#include "nrf_drv_saadc.h"
static uint16_t m_conn_handle = BLE_CONN_HANDLE_INVALID; //!< Connection handle.
static nrf_ble_escs_t m_ble_ecs; //!< Struct identifying the Eddystone Config Service.
@@ -441,6 +442,10 @@ void nrf_ble_es_init(nrf_ble_es_evt_handler_t evt_handler)
ble_escs_init();
adv_slots_init();
es_battery_voltage_init();
+ while (nrf_drv_saadc_is_busy())
+ {
+ ; // busy wait until ADC reading is finished
+ }
adv_init();
es_adv_start_non_connctable_adv();
}