Hacking BLE Kitchen Scale
Tags: hacking, javascript, bluetooth, node
Published: 2020-09-04 16:13:57

# TL;DR: Result
{% github hertzg/etekcity no-readme %}


# Backstory
Recently I have been gaining weight and blaming it all on the  COV-19 (jira issue).
So I thought I have to manage my food intake and count calories therefore I did what I do best, procrastinate and try to do other stuff while still thinking about the task at hand.
All of this + Amazon and my interest in IoT somehow convinced me to buy [Etekcity Smart Nutrition Food Calorie Kitchen Digital Scale](https://www.amazon.de/gp/product/B07RJV9QPF).

Having hard time waking next day after late night impulse buying, I tried the device, played a bit with the (meh) app and realized that this is just an overpriced kitchen scale with app function whose sole reason is data mining. After installing in VeSync app and skipping as much of the registration as possible and playing enough with it, I decided to try and somehow gain control of the device without having to use the (meh) app.

# Disclaimer
Before I go into technical details I would like to mention that I have never worked with BLE devices before. Being armed with 0 technical knowledge of Bluetooth Low energy I was (not) equipped with all the knowledge I need and (definitely not)  ready to start hacking.

# Step 1: Take it apart 🛠
Having dabbled in some other IoT devices (ESP) my first instinct was to disassemble the device and try to find how this thing worked. I was hoping I could find the microcontroller name and model or some debug ports exposed and labeled but I was disappointed to see this.

![Photograph of PCB inside with blobbed microcontroller](https://github.com/hertzg/etekcity/raw/master/research/hardware/esn00/photo_2020-09-04_01-17-35.jpg)

PCB was labeled here and there but it was not too helpful as they were just "component ids" to pick and place. The communications device had some information for me.

![Photograph of BLE communication module with IC](https://github.com/hertzg/etekcity/raw/master/research/hardware/esn00/photo_2020-09-04_01-17-34.jpg)

The communications module is for Bluetooth 4 which is something that I can start investigating. 

# Step 2: Maybe there's a lib for it? 🥺
Next step was to try to somehow find how to communicate to this and maybe someone else has already done some hacking :broken_heart: on this but I was not able to find information for this device :broken_heart: . The one of the projects that was relatable to this was oliexdev/openScale

{% github oliexdev/openScale %} 

But it was only targeted towards body weight scales :broken_heart:. 

I was also able to find a github issue asking about this particular device and model and it was rejected for obvious reason :broken_heart:.

{%github https://github.com/oliexdev/openScale/issues/509 %}


# Step 3: Down the rabbit hole :rabbit:
I love JS and Node.JS and I felt confident (for some weird reason) in worst case scenario I could use some linux tools with `child_process` or even hack something in `C` to communicate using BLE (via USB). It was already getting late and I was getting delirious :D . 

Now I'm here and I want to be able to at least get the measurements read. I quickly googled up a module for node which was a good start.

{%github noble/noble %}


And starting hacking away and logging output. With some luck and more luck I was able to guess the correct service, characteristic and ended up with some notes where I could start looking at the protocol.

{%gist https://gist.github.com/hertzg/33f759c3dc49a3e9398df541ff5fabaf %}

And around 4 am in the morning finished writing the README and finally tired enough to just go to bed and rest.

{% github hertzg/etekcity %}

# Next steps
I would like to write (at least half-) decent library to listen and possibly control the big display with nutritional information from outside the app. For now I need an Android device to sniff the packets and analyze the result.

I actually do not know which device to choose so maybe one late night I will pick a random cheap Android phone and invest more in my procrastination or maybe someone will tell me in comments which one to go for ¯\\\_(ツ)\_/¯ .

The end goal would (probably) be to have it integrate with homebridge or home-assistant and have it comfortably enable the nutritional value display based on voice commands.