diff --git a/epicardium/ble/ess.c b/epicardium/ble/ess.c
index 5395503561e4a98b691db61da37713e759a9bfc8..4f880a7a0041dea90dc9a34b02d70080eb7a2c3a 100644
--- a/epicardium/ble/ess.c
+++ b/epicardium/ble/ess.c
@@ -88,11 +88,11 @@ static const attsAttr_t ESSSvcAttrList[] = {
 		.permissions = ATTS_PERMIT_READ,
 	},
 	{
-		.pUuid  = attTemperatureChUuid,
-		.pValue = initTemperatureValue,
-		.pLen   = &initTemperatureLen,
-		.maxLen = sizeof(initTemperatureValue),
-		//.settings    = ATTS_SET_READ_CBACK,
+		.pUuid       = attTemperatureChUuid,
+		.pValue      = initTemperatureValue,
+		.pLen        = &initTemperatureLen,
+		.maxLen      = sizeof(initTemperatureValue),
+		.settings    = ATTS_SET_READ_CBACK,
 		.permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_ENC |
 			       ATTS_PERMIT_READ_AUTH,
 	},
@@ -121,6 +121,7 @@ static const attsAttr_t ESSSvcAttrList[] = {
 		.pValue      = initHumidityValue,
 		.pLen        = &initHumidityLen,
 		.maxLen      = sizeof(initHumidityValue),
+		.settings    = ATTS_SET_READ_CBACK,
 		.permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_ENC |
 			       ATTS_PERMIT_READ_AUTH,
 	},
@@ -149,6 +150,7 @@ static const attsAttr_t ESSSvcAttrList[] = {
 		.pValue      = initPressureValue,
 		.pLen        = &initPressureLen,
 		.maxLen      = sizeof(initPressureValue),
+		.settings    = ATTS_SET_READ_CBACK,
 		.permissions = ATTS_PERMIT_READ | ATTS_PERMIT_READ_ENC |
 			       ATTS_PERMIT_READ_AUTH,
 	},
@@ -171,12 +173,9 @@ WSF_CT_ASSERT(
 	((sizeof(ESSSvcAttrList) / sizeof(ESSSvcAttrList[0])) ==
 	 ESS_END_HDL - ESS_START_HDL + 1));
 
-#if 0
 /*
  * BLE ESS read callback.
  *
- * Disabled at the moment as no dynamic handling of read requests
- * is needed and all fields are updated by bleESS_update()
  */
 static uint8_t readESSCB(
 	dmConnId_t connId,
@@ -185,25 +184,53 @@ static uint8_t readESSCB(
 	uint16_t offset,
 	attsAttr_t *pAttr
 ) {
-	uint16_t i16 = 0;
+	int16_t temperature;
+	uint16_t humidity;
+	uint32_t pressure;
+	struct bme680_sensor_data data;
+	int ret = epic_bme680_read_sensors(&data);
+	if (ret != 0) {
+		return ATT_ERR_UNDEFINED;
+	}
+
 	switch (handle) {
-	// Temperature
 	case ESS_TEMPERATURE_VAL_HDL:
-		//*((int16_t *)pAttr->pValue) = i16;
-		//APP_TRACE_INFO1("ble-ess: read temperature: %d\n", i16);
+		temperature = data.temperature * 100;
+		AttsSetAttr(
+			ESS_TEMPERATURE_VAL_HDL,
+			sizeof(temperature),
+			(uint8_t *)&temperature
+		);
+		APP_TRACE_INFO1("ble-ess: read temperature: %d\n", temperature);
+		return ATT_SUCCESS;
+	case ESS_HUMIDITY_VAL_HDL:
+		humidity = data.humidity * 100;
+		AttsSetAttr(
+			ESS_HUMIDITY_VAL_HDL,
+			sizeof(humidity),
+			(uint8_t *)&humidity
+		);
+		APP_TRACE_INFO1("ble-ess: read humidity: %u\n", humidity);
+		return ATT_SUCCESS;
+	case ESS_PRESSURE_VAL_HDL:
+		pressure = data.pressure * 1000;
+		AttsSetAttr(
+			ESS_PRESSURE_VAL_HDL,
+			sizeof(pressure),
+			(uint8_t *)&pressure
+		);
+		APP_TRACE_INFO1("ble-ess: read pressure: %u\n", pressure);
 		return ATT_SUCCESS;
 	default:
 		APP_TRACE_INFO0("ble-card10: read no handler found\n");
 		return ATT_ERR_HANDLE;
 	}
 }
-#endif
 
 static attsGroup_t svcESSGroup = {
-	.pNext     = NULL,
-	.pAttr     = (attsAttr_t *)ESSSvcAttrList,
-	.readCback = NULL,
-	//.readCback   = readESSCB,
+	.pNext       = NULL,
+	.pAttr       = (attsAttr_t *)ESSSvcAttrList,
+	.readCback   = readESSCB,
 	.writeCback  = NULL,
 	.startHandle = ESS_START_HDL,
 	.endHandle   = ESS_END_HDL,