Skip to content

Body composition ​

BLE Scale Sync computes body composition from the weight, the impedance the scale measures through your feet, and the user's height, age and sex. Scales that compute their own values are used as they are, under the conditions on their scale pages.

Exported metrics ​

MetricUnitDescription
WeightkgScale reading
BMI(none)Body mass index
Body fat%From impedance (BIA), from the scale, or estimated from BMI
Water%Total body water
Bone masskgEstimated bone mineral content
Muscle masskgFat-free mass minus bone, or the scale's own value
Visceral fat1-59Internal organ fat rating
BMRkcalBasal metabolic rate
Metabolic ageyearsAge whose BMR matches yours
Physique rating1-9Body type from body fat and muscle ratio
Skeletal muscle%Only from a scale that reports it

Formulas ​

Body fat (BIA) ​

With a usable impedance, body fat comes from Bioelectrical Impedance Analysis, with height in cm and impedance in ohm:

text
LBM = c1 * (height^2 / impedance) + c2 * weight + c3 * age + c4
Body Fat % = (weight - LBM) / weight * 100
c1c2c3c4
Male0.5030.165-0.15817.8
Male (athlete)0.6370.205-0.18012.5
Female0.4900.150-0.13011.5
Female (athlete)0.5500.180-0.1508.5

The result is kept between 3 and 60 %.

When an impedance is ignored ​

An impedance below 150 ohm or above 1200 ohm is not a body measurement. It is exported as 0, and the weigh-in gets the scale's own body fat where the scale sends one, or the estimate below. Such a value would not fail visibly. It would pin body fat to the 3 or 60 % limit. The log names the value:

text
Impedance 4317 Ohm is not a usable measurement (150-1200 Ohm), so it is not used.

If your scale measures impedance and your body fat still looks like an estimate, look for that line and report the number with what your vendor app shows.

Body fat fallback (Deurenberg) ​

Without a usable impedance (a weight-only scale, socks, or a value outside 150 to 1200 ohm) and without a body fat from the scale, body fat is estimated from BMI, with sex 1 for male and 0 for female:

text
Adults:          Body Fat % = 1.20 * BMI + 0.23 * age - 10.8 * sex - 5.4
Age 15 and under: Body Fat % = 1.51 * BMI - 0.70 * age -  3.6 * sex + 1.4

For athletes the result is multiplied by 0.85. It is kept between 3 and 60 %. Water, bone mass, muscle mass, visceral fat and physique rating then follow from this estimate with the formulas below, so a weigh-in without impedance still exports every metric.

Without the estimate ​

With estimate_body_composition: false for a user, a weigh-in without measured body fat gets no estimate: body fat, water, bone mass, muscle mass, visceral fat and physique rating are left empty, while weight, BMI, BMR and metabolic age are exported. See Configuration.

Other metrics ​

LBM is lean body mass, weight * (1 - Body Fat % / 100).

MetricFormula
BMIweight / height_m^2
WaterLBM * 0.73 / weight * 100 (athlete: 0.74)
Bone massLBM * 0.042
Muscle massLBM - Bone Mass
Visceral fatBody Fat % * 0.55 - 4 + age * 0.08, kept between 1 and 59; 1 at 10 % body fat or less
BMRMifflin-St Jeor: 10*W + 6.25*H - 5*A + s, s = +5 male, -161 female
Metabolic ageage + (BMR at age 25 - BMR) / 15, at least 12
Physique rating1 to 9 from body fat (below 18, 18 to 25, above 25 %) and a skeletal muscle estimate of LBM * 0.54 (athlete: 0.60)

A scale's own BMR and body age replace the last two when it sends them with its body fat and they are plausible (500 to 5000 kcal, 12 to 120 years).

Athlete mode ​

is_athlete: true in a user's profile adjusts the formulas for people who train regularly.

The setup wizard asks for it. What changes:

  • Lean body mass: the athlete BIA coefficients in the table above.
  • Water: 74 % of lean body mass instead of 73 %.
  • Physique rating: its skeletal muscle input is 60 % of lean body mass instead of 54 %.
  • BMR: 5 % higher.
  • Metabolic age: actual age minus 5 when it would otherwise come out above actual age.
  • Deurenberg estimate: multiplied by 0.85.

Values a scale computed itself are used as they are.

Scale-specific algorithms ​

A scale's own values are used only with a body fat value and only when every value it sends is in range. Otherwise the whole set is discarded and computed as above.

Xiaomi Mi Scale 2 and S400 ​

Both broadcast weight and impedance (the S400 its 50 kHz value). Body fat, water, bone mass and visceral fat come from the Xiaomi formulas ported from openScale. muscle mass, BMR and the rest come from the formulas above. A frame without impedance gets the Deurenberg estimate. The S400 app uses a proprietary dual-frequency model, so expect small, consistent offsets from it.

Yunmai ​

On firmware that sends it, the scale's own body fat is used, and water, muscle, bone mass and visceral fat are derived from it with the Yunmai formulas ported from openScale. Otherwise body fat comes from the Yunmai formula, which works mostly from BMI and age. The generic BIA formula is not used. The scale computes for the profile its vendor app stored.

Scales that compute their own composition ​

These scales compute body composition themselves for a profile ble-scale-sync sends them:

  • Arboleaf and other 19-byte QN scales
  • Arboleaf CS10K (Experimental, with ble.qn_user_key)
  • Arboleaf CS10E on the 20-byte QN dialect (Experimental, with ble.qn_algorithm)
  • Renpho R-MSC04
  • Huawei CH100 / AH100 (body fat only)

Their values are used only when that profile matches the user the weigh-in goes to. See QN scales, Renpho scales and Huawei CH100 / AH100.

References ​

  • BIA: Lukaski H.C. et al. (1986), "Assessment of fat-free mass using bioelectrical impedance measurements of the human body", American Journal of Clinical Nutrition
  • Mifflin-St Jeor: Mifflin M.D., St Jeor S.T. et al. (1990), "A new predictive equation for resting energy expenditure in healthy individuals", American Journal of Clinical Nutrition
  • Deurenberg: Deurenberg P., Weststrate J.A., Seidell J.C. (1991), "Body mass index as a measure of body fatness: age- and sex-specific prediction formulas", British Journal of Nutrition

Released under the GPL-3.0 License.
Software made in Europe