Блог

Подключение весов Yunmai SE к Home Assistant

Весами этого производителя пользуюсь давно. Изначально купил в только открывшемся на тот момент магазине JD модель Yunmai Mini. Функционал их соответствовал конкуренту от Xiaomi, то есть кроме веса измеряли еще жидкость, костный вес, висцеральный жир и т.д., но стоили в два раза дешевле. Да, верх весов был пластиковый. Проработали они у меня года 3 точно, год назад отказались передавать данные.

Вес они показывали точно, приложение не глючило, да и вообще нравились они мне. Новые весы решил купить этого же производителя, но модель попроще, так как кроме веса, мне по сути, другие показатели не нужны, я не врач, не профессиональный спортсмен и что делать с показателем висцелярного жира не знаю даже. И не уверен я, что девайс за 2 тысячи будет выдавать адекватные показатели.

Провел анализ цен и оказалось, что Yunmai уже продается в России, с гарантией и дешевле чем на алике или других торговых китайских площадках. Вот линк https://yunmairussia.ru/

В итогу куплена модель Yunmai SE за цену чуть более 1 тысячи рублей в ДНС.

С появлением в квартире Home Assistant есть непреодолимое желание подключить туда все. Ну а если есть интерфейс передачи данных, как в частности у этих весов, то тем более. Сказано, сделано. Основную информацию по общению с этими весами нашел здесь: https://mjdm.ru/forum/viewtopic.php?f=8&t=5459&start=50#p80641

Сервер у меня без синезуба, поэтому купил на алишечке usb донгл. Убунта его увидела сразу:

acidquest@mediaserver:~$ lsusb Bus 004 Device 003: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

Устанавливаем необходимый софт:

sudo apt-get install bluez

Смотрим в порядке ли usb свисток и сканируем эфир::

root@mediaserver:~# hciconfig hci0: Type: Primary Bus: USB BD Address: 00:1A:7D:DA:71:13 ACL MTU: 310:10 SCO MTU: 64:8 UP RUNNING RX bytes:134687 acl:4353 sco:0 events:7350 errors:0 TX bytes:62618 acl:1972 sco:0 commands:2747 errors:0 root@mediaserver:~# hcitool lescan LE Scan... 0C:B2:B7:19:22:A4 (unknown) 0C:B2:B7:19:22:A4 YUNMAI-ISSE-US

Как видно из вывода команды весы видны и их мак адрес мы получили.

Пробуем к ним подключиться и прочитать данные:

root@mediaserver:~# gatttool -I [ ][LE]> connect 0C:B2:B7:19:22:A4 Attempting to connect to 0C:B2:B7:19:22:A4 Connection successful [0C:B2:B7:19:22:A4][LE]> characteristics handle: 0x0002, char properties: 0x02, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb handle: 0x0006, char properties: 0x0a, char value handle: 0x0007, uuid: 00002a02-0000-1000-8000-00805f9b34fb handle: 0x0008, char properties: 0x08, char value handle: 0x0009, uuid: 00002a03-0000-1000-8000-00805f9b34fb handle: 0x000a, char properties: 0x02, char value handle: 0x000b, uuid: 00002a04-0000-1000-8000-00805f9b34fb handle: 0x000d, char properties: 0x20, char value handle: 0x000e, uuid: 00002a05-0000-1000-8000-00805f9b34fb handle: 0x0011, char properties: 0x10, char value handle: 0x0012, uuid: 0000ffe4-0000-1000-8000-00805f9b34fb handle: 0x0016, char properties: 0x08, char value handle: 0x0017, uuid: 0000ffe9-0000-1000-8000-00805f9b34fb [0C:B2:B7:19:22:A4][LE]> primary attr handle: 0x0001, end grp handle: 0x000b uuid: 00001800-0000-1000-8000-00805f9b34fb attr handle: 0x000c, end grp handle: 0x000f uuid: 00001801-0000-1000-8000-00805f9b34fb attr handle: 0x0010, end grp handle: 0x0014 uuid: 0000ffe0-0000-1000-8000-00805f9b34fb attr handle: 0x0015, end grp handle: 0xffff uuid: 0000ffe5-0000-1000-8000-00805f9b34fb [0C:B2:B7:19:22:A4][LE]>

Все удачно считывается.

Вот здесь описание протокола: https://gist.github.com/conoro/f0c1d96c450a8f5cce70e2846c3686c4

Следующая команда читает данные с весов во время взвешивания:

acidquest@mediaserver:~$ gatttool --device=0C:B2:B7:19:22:A4 --char-write-req --handle=0x0017 --value=0d05130016 --adapter=hci0 --listen Characteristic value was written successfully Notification handle = 0x0012 value: 0d 1e 05 05 1e Notification handle = 0x0012 value: 0d 1e 0b 01 00 0c 7a ff 1d ad 2d Notification handle = 0x0012 value: 0d 1e 0b 01 00 0c 7a ff 1e 03 80 Notification handle = 0x0012 value: 0d 1e 0b 01 00 0c 7a ff 1d f0 70 Notification handle = 0x0012 value: 0d 1e 0b 01 00 0c 7a ff 1e 08 8b Notification handle = 0x0012 value: 0d 1e 0b 01 00 0c 7a ff 1d e9 69 Notification handle = 0x0012 value: 0d 1e 0b 01 00 0c 7b 00 1d fe 80 Notification handle = 0x0012 value: 0d 1e 0b 01 00 0c 7b 00 1d f5 8b Notification handle = 0x0012 value: 0d 1e 0b 01 00 0c 7b 00 1d f0 8e Notification handle = 0x0012 value: 0d 1e 14 02 00 00 0c 7b 00 23 c4 1a f8 1d f0 00 00 00 00 97 Notification handle = 0x0012 value: 0d 1e 14 02 00 00 0c 7b 00 23 c4 1a f8 1d f0 00 00 00 00 97

Короткие строки - вес не стабилизирован. 0b - длина посылки. 01 - вес не стабилен, 00 0c 7b 00 Unix-время взвешивания,1d f0, 1d f5 и т.д. меняющийся вес.

Длинные строки - вес стабилизировался. 14 - длина посылки. 02 - вес стабилен, 00 00 0c 7b Unix-время взвешивания,23 c4 1a f8 ID-пользователя, я его не назначал через приложение, 1d f0- вес, остальные нули - проводимость и жир. В данной модели весов не измеряются.

1DF0 переводим из HEX в десятичную систему, получаем 7664. И делим на 100, получаем 76,64 кг.

Отлично, все получается.

Сделаны 2 скрипта.

Первый запускает прослушивание весов уже знакомой нам командой и сброс данных в файл:

#!/bin/bash /usr/bin/killall gatttool /usr/bin/gatttool --device=0C:B2:B7:19:22:A4 --char-write-req --handle=0x0017 --value=0d05130016 --adapter=hci0 --listen >> /tmp/yunmai.log & /usr/bin/logger Gatttool restart via cron script

Второй вычленяет из файла вес и раскладывает их по MQTT топикам:

#!/bin/bash if [ -f /tmp/yunmai.log ] then text1=`/bin/cat /tmp/yunmai.log | /bin/grep "Notification handle = 0x0012 value: 0d 1e 14 02"` count=`/bin/cat /tmp/yunmai.log | /bin/grep "Notification handle = 0x0012 value: 0d 1e 14 02" -c` if [[ $count > 0 ]] then weight_hex=$ weight_hex=`echo $weight_hex | sed s/' '//g` weight=`echo $((16#$weight_hex))/100 | bc -l` weight=$ /bin/rm -f /tmp/yunmai.log /usr/bin/logger Yunmai Scale take new weight - $weight if [[ $weight > 70 && $weight < 80 ]]; then /usr/bin/curl -X POST -H "Authorization: Bearer ************************" -H "Content-Type: application/json" -d '{"state": "on"}' https://ha.*********.ru/api/states/automation.yunmai_scale_oleg_weight /usr/bin/mosquitto_pub -h 10.5.254.100 -r -u homeassistant -P ******** -m $weight -t yunmai/weight/oleg elif [[ $weight > 51 && $weight < 60 ]]; then /usr/bin/curl -X POST -H "Authorization: Bearer ************************" -H "Content-Type: application/json" -d '{"state": "on"}' https://ha.*********.ru/api/states/automation.yunmai_scale_irina_weight /usr/bin/mosquitto_pub -h 10.5.254.100 -r -u homeassistant -P ******** -m $weight -t yunmai/weight/irina elif [[ $weight > 40 && $weight < 49 ]]; then /usr/bin/mosquitto_pub -h 10.5.254.100 -r -u homeassistant -P ******** -m $weight -t yunmai/weight/kira else weight=0 fi else /usr/bin/logger Not found new weight in yunmai.log weight=0 fi else /usr/bin/logger Not found yunmai.log file exit 0 fi exit 0

Скрипты стартуют по крону. Первый скрипт перезапускаю каждые 10 минут, так как соединение с весами рвется при долгом простое. Второй скрипт каждую минуту. Если в течении одной минуты взвесятся 2 и более человек, то в скрипт отправит в топик только первое измерение. Но у меня в очередь на взвешивание не стоят.

acidquest@mediaserver:~$ crontab -l */10 * * * * /home/acidquest/yunmai_polling */1 * * * * /home/acidquest/extract_weight

Пояснения по второму скрипту:

У меня дома 3 человека взвешиваются, пока что вес у всех разный. Скрипт кладет вес по трем топикам, если он попадает в весовой коридор. На самом коридор слишком широкий, так сильно вес не изменяется. Так же скрипт включает автоматизацию, которая шлет вес в телеграмм. По умолчанию она выключена, потому что я записываю данные в топик с ключом -r (retain). Это значит что они находятся в топике, до тех пор пока не запишутся новые данные. В этом случае автоматизация срабатывает при перезапуске Home Assistant или при перечитке конфига с автоматизациями. Если писать в топик без опции retain, то при перезапуске Home Assistant в сенсоре нет значения и в интерфейс выдается значение - неизвестно, до взвешивания, а мне так не нравится.

Далее на стороне Home Assistant:

sensors.yaml - platform: mqtt name: "oleg_weight" state_topic: "yunmai/weight/oleg" unit_of_measurement: 'kg' icon: mdi:weight-kilogram - platform: mqtt name: "irina_weight" state_topic: "yunmai/weight/irina" unit_of_measurement: 'kg' icon: mdi:weight-kilogram - platform: mqtt name: "kira_weight" state_topic: "yunmai/weight/kira" unit_of_measurement: 'kg' icon: mdi:weight-kilogram

automations.yaml - alias: Yunmai Scale - Oleg weight initial_state: 'off' trigger: platform: mqtt topic: 'yunmai/weight/oleg' action: service: notify.telegram_oleg data: message: 'Ваш вес {{ states.sensor.oleg_weight.state}} кг' - alias: Yunmai Scale - Irina weight initial_state: 'off' trigger: platform: mqtt topic: 'yunmai/weight/irina' action: service: notify.telegram_irina data: message: 'Ваш вес {{ states.sensor.irina_weight.state}} кг'

В интерфейсе рисую график с помощью кастомного компонента: https://github.com/kalkih/mini-graph-card и вывожу данные о последнем взвешивании.

ui-lovelace.yaml - type: entities title: Последний вес show_header_toggle: false entities: - entity: sensor.oleg_weight name: Олег icon: mdi:weight-kilogram - entity: sensor.irina_weight name: Ирина - entity: sensor.kira_weight name: Кира - type: custom:mini-graph-card entities: - sensor.oleg_weight name: Олег icon: mdi:weight-kilogram hours_to_show: 720 points_per_hour: 0.1 hour24: true - type: custom:mini-graph-card entities: - sensor.irina_weight name: Ирина hours_to_show: 720 points_per_hour: 0.1 hour24: true - type: custom:mini-graph-card entities: - sensor.kira_weight name: Кира hours_to_show: 720 points_per_hour: 0.1 hour24: true

Сделал 2 недели назад, все работает, не виснет, не отваливается. Не знаю, как это скажется на батарейках в весах, по идее они постоянно держат соединение. Посмотрим.

Весы находятся примерно в 4-5 метрах от сервера, за перегородкой и деревянной дверью в ванной. Первоначально, до покупки донгла тестировал на малине зеро, она находится в дальней комнате, метров 12 наверное от весов, при сканировании она их видела, но коннекта не происходило. Приносил весы ближе, соединялись. То есть блютус в весах не очень сильный и расстояние между ними и приемником должно определяться опытным путем, но оно не очень большое.


Неплохие весы, сам задумываюсь о покупке. 

А весы от xiaomi второй версии кто-нибудь пробовал к HA подключать?

А первой версии? Те xiaomi smart scale? Можно?

По поводу весов от xiaomi смотри здесь, изначально хотел питоновый код отсюда переделать, но bash мне понятнее и проще:

https://community.home-assistant.io/t/integrating-xiaomi-mi-scale/9972/22">https://community.home-assista...

есть идеи что можно делать, gatttool отлкючается в течении нескольких секунд..?


Вернуться назад
Вернуться назад