Skip to main content

An unofficial Python package for interacting with Etekcity ESF-551 Smart Fitness Scales using BLE. Not affiliated with Etekcity, VeSync Co., Ltd., or any of their subsidiaries.

Project description

Etekcity ESF-551 BLE

This package provides a basic unofficial interface for interacting with Etekcity ESF-551 Smart Fitness Scale using Bluetooth Low Energy (BLE). It allows you to easily connect to the scale, receive weight and impedance measurements, manage the display unit settings, and calculate various body metrics.

It has only been tested on the ESF-551 model. I have no idea whether it might also work with some other bluetooth bathroom scale models from Etekcity. If you try it with a different model, please let me know whether it works or not.

Disclaimer: This is an unofficial, community-developed library. It is not affiliated with, officially maintained by, or in any way officially connected with Etekcity, VeSync Co., Ltd. (the owner of the Etekcity brand), or any of their subsidiaries or affiliates. The official Etekcity website can be found at https://www.etekcity.com, and the official VeSync website at https://www.vesync.com. The names "Etekcity" and "VeSync" as well as related names, marks, emblems and images are registered trademarks of their respective owners.

Buy Me A Coffee

Installation

Install the package using pip:

pip install etekcity_esf551_ble

Quick Start

Here's a basic example of how to use the library:

import asyncio
from etekcity_esf551_ble import (
    IMPEDANCE_KEY,
    WEIGHT_KEY,
    EtekcitySmartFitnessScale,
    ScaleData,
    WeightUnit,
    BodyMetrics,
    Sex,
)

async def main():
    def notification_callback(data: ScaleData):
        print(f"Weight: {data.measurements[WEIGHT_KEY]} kg")
        print(f"Display Unit: {data.display_unit.name}")
        if IMPEDANCE_KEY in data.measurements:
            print(f"Impedance: {data.measurements[IMPEDANCE_KEY]} Ω")
            
            # Calculate body metrics
            # Note: Replace with your actual height, age and sex
            body_metrics = BodyMetrics(
                weight_kg=data.measurements[WEIGHT_KEY],
                height_m=1.75,  # Example height
                age=30,  # Example age
                sex=Sex.Male,  # Example sex
                impedance=data.measurements[IMPEDANCE_KEY]
            )
            print(f"Body Mass Index: {body_metrics.body_mass_index:.2f}")
            print(f"Body Fat Percentage: {body_metrics.body_fat_percentage:.1f}%")
            print(f"Fat-Free Weight: {body_metrics.fat_free_weight:.2f} kg")
            print(f"Subcutaneous Fat Percentage: {body_metrics.subcutaneous_fat_percentage:.1f}%")
            print(f"Visceral Fat Value: {body_metrics.visceral_fat_value}")
            print(f"Body Water Percentage: {body_metrics.body_water_percentage:.1f}%")
            print(f"Basal Metabolic Rate: {body_metrics.basal_metabolic_rate} calories")
            print(f"Skeletal Muscle Percentage: {body_metrics.skeletal_muscle_percentage:.1f}%")
            print(f"Muscle Mass: {body_metrics.muscle_mass:.2f} kg")
            print(f"Bone Mass: {body_metrics.bone_mass:.2f} kg")
            print(f"Protein Percentage: {body_metrics.protein_percentage:.1f}%")
            print(f"Metabolic Age: {body_metrics.metabolic_age} years")

    # Replace XX:XX:XX:XX:XX:XX with your scale's Bluetooth address
    scale = EtekcitySmartFitnessScale("XX:XX:XX:XX:XX:XX", notification_callback)
    scale.display_unit = WeightUnit.KG  # Set display unit to kilograms

    await scale.async_start()
    await asyncio.sleep(30)  # Wait for measurements
    await scale.async_stop()

asyncio.run(main())

For a real-life usage example of this library, check out the Etekcity Fitness Scale BLE Integration for Home Assistant.

API Reference

EtekcitySmartFitnessScale

The main class for interacting with the scale.

Methods:

  • __init__(self, address: str, notification_callback: Callable[[ScaleData], None], display_unit: WeightUnit = None)
  • async_start(): Start scanning for and connecting to the scale.
  • async_stop(): Stop the connection to the scale.

Properties:

  • display_unit: Get or set the display unit (WeightUnit.KG, WeightUnit.LB or WeightUnit.ST). Returns None if the display unit is currently unknown (not set by the user and not yet received from the scale together with a stable weight measurement).
  • hw_version: Get the hardware version of the scale (read-only).
  • sw_version: Get the software version of the scale (read-only).

EtekcitySmartFitnessScaleWithBodyMetrics

An extended version of EtekcitySmartFitnessScale that automatically calculates body metrics.

Methods:

  • __init__(self, address: str, notification_callback: Callable[[ScaleData], None], sex: Sex, birthdate: date, height_m: float, display_unit: WeightUnit = None)
  • async_start(): Start scanning for and connecting to the scale.
  • async_stop(): Stop the connection to the scale.

Properties:

  • display_unit: Get or set the display unit (WeightUnit.KG, WeightUnit.LB or WeightUnit.ST). Returns None if the display unit is currently unknown (not set by the user and not yet received from the scale together with a stable weight measurement).
  • hw_version: Get the hardware version of the scale (read-only).
  • sw_version: Get the software version of the scale (read-only).

WeightUnit

An enum representing the possible display units:

  • WeightUnit.KG: Kilograms
  • WeightUnit.LB: Pounds
  • WeightUnit.ST: Stones

ScaleData

A dataclass containing scale measurement data:

  • name: Scale name
  • address: Scale Bluetooth address
  • hw_version: Hardware version
  • sw_version: Software version
  • display_unit: Current display unit (concerns only the weight as displayed on the scale, the measurement itself is always provided by the API in kilograms)
  • measurements: Dictionary of measurements (currently supports: weight in kilograms and impedance in ohms)

BodyMetrics

A class for calculating various body composition metrics based on height, age, sex, and the weight and impedance as measured by the scale, similar to the metrics calculated and shown in the VeSync app. Note that currently "Athlete Mode" is not supported.

Methods:

  • __init__(self, weight_kg: float, height_m: float, age: int, sex: Sex, impedance: int)

Properties:

  • body_mass_index: Body Mass Index (BMI)
  • body_fat_percentage: Estimated body fat percentage
  • fat_free_weight: Weight of non-fat body mass in kg
  • subcutaneous_fat_percentage: Estimated subcutaneous fat percentage
  • visceral_fat_value: Estimated visceral fat level (unitless)
  • body_water_percentage: Estimated body water percentage
  • basal_metabolic_rate: Estimated basal metabolic rate in calories
  • skeletal_muscle_percentage: Estimated skeletal muscle percentage
  • muscle_mass: Estimated muscle mass in kg
  • bone_mass: Estimated bone mass in kg
  • protein_percentage: Estimated protein percentage
  • weight_score: Calculated weight score (0-100)
  • fat_score: Calculated fat score (0-100)
  • bmi_score: Calculated BMI score (0-100)
  • health_score: Overall health score based on other metrics (0-100)
  • metabolic_age: Estimated metabolic age in years

Sex

An enum representing biological sex for body composition calculations:

  • Sex.Male
  • Sex.Female

Compatibility

  • Tested on Mac (Apple Silicon) and Raspberry Pi 4
  • Compatibility with Windows is unknown

Troubleshooting

On Raspberry Pi 4 (and possibly other Linux machines using BlueZ), if you encounter a org.bluez.Error.InProgress error, try the following in bluetoothctl:

power off
power on
scan on

(See https://github.com/home-assistant/core/issues/76186#issuecomment-1204954485)

Support the Project

If you find this unofficial project helpful, consider buying me a coffee! Your support helps maintain and improve this library.

Buy Me A Coffee

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This is an independent project developed by the community. It is not endorsed by, directly affiliated with, maintained, authorized, or sponsored by Etekcity, VeSync Co., Ltd., or any of their affiliates or subsidiaries. All product and company names are the registered trademarks of their original owners. The use of any trade name or trademark is for identification and reference purposes only and does not imply any association with the trademark holder of their product brand.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

etekcity_esf551_ble-0.3.11.tar.gz (13.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

etekcity_esf551_ble-0.3.11-py3-none-any.whl (14.2 kB view details)

Uploaded Python 3

File details

Details for the file etekcity_esf551_ble-0.3.11.tar.gz.

File metadata

  • Download URL: etekcity_esf551_ble-0.3.11.tar.gz
  • Upload date:
  • Size: 13.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for etekcity_esf551_ble-0.3.11.tar.gz
Algorithm Hash digest
SHA256 e8a82b1504baf7c1a352c089a24a7a2934d739d74db2e71914a36c931cfb9e56
MD5 c22cbcd76bdeae7117ac8c2a4f92463b
BLAKE2b-256 be2cc86afe6b64746ee5114acb6b0589b7742e009d56b7c5eca36d084b8e5072

See more details on using hashes here.

File details

Details for the file etekcity_esf551_ble-0.3.11-py3-none-any.whl.

File metadata

File hashes

Hashes for etekcity_esf551_ble-0.3.11-py3-none-any.whl
Algorithm Hash digest
SHA256 d0bc9725088298bbf63035d1c4aff44a6bcaa6a282db721f0aa5c7b1b7d75f72
MD5 ff84d2ca5db3e646644cd8134e9e00bc
BLAKE2b-256 788b577fe5a1facad7f49b632ac7c75b3a7880b1f59671343283f024704b16d6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page