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

04 июня 2019, 09:51

Весами этого производителя пользуюсь давно. Изначально купил в только открывшемся на тот момент магазине 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 донгл: https://ru.aliexpress.com/item/32384484446.html.

Убунта его увидела сразу:

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=${text1:75:5}
   weight_hex=`echo $weight_hex | sed s/' '//g`
   weight=`echo $((16#$weight_hex))/100 | bc -l`
   weight=${weight:0:6}
   /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 наверное от весов, при сканировании она их видела, но коннекта не происходило. Приносил весы ближе, соединялись. То есть блютус в весах не очень сильный и расстояние между ними и приемником должно определяться опытным путем, но оно не очень большое.


Все новости мира умных домов - t.me/SprutAI_News

Остались вопросы? Мы в Telegram - t.me/soprut

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. (Brain)
    (Brain) 3 месяца назад

    Через некоторое время при определении веса жены и дочки начнут возникать проблемы ))

    Конечно же все замечательно, но постоянный обмен очень быстро убьет батарейки. Предвосхищаю постоянные замены, что со временем просто надоест.
    Нужно придумать признак активации весов. Самый простой и тупой - привязаться к датчику движения где-нибудь рядом с весами. Через минуту по статусу датчика (при отсутствии движения) отрубается обмен. Можно привязаться к состоянию умной лампы рядом... Все зависит от привычек или предпочтений семьи. даже если выбрать самый грубый вариант - трекить нахождения дома членов семьи, это уже ограничит передачу данных при отсутствии членов семьи неплохо так спасет энергетику батареек.

    • Ружинский Олег (acidquest)
      Ружинский Олег (acidquest) 3 месяца назад

      Да, про вес жены и дочки понимаю, что будут проблемы через некоторое время, думаю оно измеряется 2-4 годами, так что к тому моменту может и весы другие будут или придумаю что-нибудь.

      Про батарейку весов мониторю ситуацию, будет быстро уходить, значит сделаю триггер. Например, соединяться с весами только при включении света. Свет просто в ванной пока ещё обычный.

      • (Brain)
        (Brain) 3 месяца назад

        И надо будет еще поискать какие-нибудь более реальные типы графиков именно для веса. А то эти температурные контуры как-то неестественно смотрятся. 

        К примеру ваш график со сколькими замерами в день ? Уж больно курчаво все. Если я правильно понимаю взвешивание производится один раз в день, в одно и то же время. Этого достаточно для прогнозов суждение о весе скажем глядючи на месячный результат.

        • Ружинский Олег (acidquest)
          Ружинский Олег (acidquest) отредактировано 3 месяца назад

          У компоненты, который графики строит есть возможность в виде столбиков строить, соберётся побольше данных, посмотрю как выглядит. Через 2 недели график полностью заполнится и изменю отображение

  2. Антон Киселёв (Whilser)
    Антон Киселёв (Whilser) 3 месяца назад

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

  3. (klishchenkov)
    (klishchenkov) 3 месяца назад

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

  4. (gonczarov)
    (gonczarov) 3 месяца назад

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

    • Ружинский Олег (acidquest)
      Ружинский Олег (acidquest) 3 месяца назад

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

      https://community.home-assista...

    • (Brain)
      (Brain) 2 месяца назад

      И первая и вторая версия весов от Сяоми прекрасно подключаются. На гитхабе все хорошо описано. Первая только кГ показывает, вторая еще кучу всякой никчемной информации кроме веса. Я подключил первую версию, работает безукоризненно.

  5. (radinsky)
    (radinsky) отредактировано месяц назад

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

К списку блогов

Похожие записи

13 февраля 2019, 22:00
Подключение радио на Xiaomi Gateway к Home Assistant c дальнейшим использованием в автоматизациях
19 апреля 2019, 20:53
Требуется ваше мнение!
06 февраля 2019, 12:02
Автоматизированное открытие/закрытие окна
04 апреля 2019, 12:45
Самое важное из апдейта Home Assistant 0.91-0.91.4 от 03.04.19.
21 марта 2019, 11:59
Самое важное из апдейта Home Assistant 0.9 от 20.03.19.
21 февраля 2019, 21:12
Самое важное из апдейта Home Assistant 0.88 от 20.02.19.
07 февраля 2019, 21:12
Самое важное из апдейта Home Assistant 0.87 от 06.02.19.
19 января 2019, 20:49
Делюсь новостями по проекту.
20 мая 2019, 20:54
Добавляем Телевизор в Homekit c помощью новых возможностей Home Assistant версии 0.93 и кастом компонента SmartIR MediaPlayer.