Страница 6 из 8

Re: умные bluetooth весы

Добавлено: Пт май 11, 2018 10:10 pm
smart_g
Вот еще ссылочка, может будет полезна https://github.com/zewelor/bt-mqtt-gateway

Re: умные bluetooth весы

Добавлено: Пт май 18, 2018 1:12 pm
smart_g
Подключение "умных" весов Yunmai SE.


Это младшая модель в линейке, выдает только вес.
Данная инструкция годится для всей линейки Yunmai.
Самая полезная ссылка: https://gist.github.com/conoro/f0c1d96c ... 846c3686c4
Описан протокол, главные команды.
Для связи с весами использовался USB 4.0BT dongle.

Для настройки понадобится пакет BlueZ, утилиты hcitool и gatttool.
https://github.com/pcborenstein/bluezDo ... ol-example
Определяем mac адрес весов:
$ sudo hcitool lescan
LE Scan ...

0C:B2:B7:02:3C:3F YUNMAI-ISSE-US
Это mac адрес моих весов. У вас будет другой.

Далее надо согласно протокола добавить пользователей.
$ gatttool -I
[ ][LE]>
Вводим команду connect 0C:B2:B7:02:3C:3F
Attempting to connect to 0C:B2:B7:02:3C:3F
Connection successful
[0C:B2:B7:02:3C:3F][LE]>
конект произошел.
Можно проверить что выдают весы
[0C:B2:B7:02:3C:3F][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:02:3C:3F][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

Видим, что uuid ffe9 (упоминается в протоколе) соответствует handle 0x0017
По этому handle и будем писать команды.
вводим команды добавления пользователя
первого char-write-req 0x0017 0d12100100000001a50235555a17fa010370

второго char-write-req 0x0017 0d12100100000002b80136555a21020103a0
Корректируем команды под свой вес, рост, пол согласно описанию в протоколе.
Вес берем как можно ближе к истинному. Далее по этому весу весы будут отличать пользователя и передавать его ID.
Отключаемся от весов. Вводим команду disconnect.

Теперь весы при взвешивании будут отдавать вместе с ID пользователя в зависимости от модели его вес, % жира, проводимость тела.
Данные о взвешивании передаются при спаривании весов и донгла и когда кто-то находится на весах.
Помните, что зона конекта небольшая. Нет конекта нет данных.
Пока нет информации, что удалось вычитать с весов раннее полученные данные. Протокол описан кратко и возможно есть команды,
которые позволяют это делать.
Для автоматического получения данных включаем полинг весов:
$gatttool --device=0C:B2:B7:02:3C:3F --char-write-req --handle=0x0017 --value=0d05130016 --adapter=hci0 --listen >> /var/www/yunmai.log &
Подставляем свой mac адрес весов. Теперь при каждом взвешивании в файл yunmai.log будет записываться приблизительно следующее:

Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 10 13 86 85
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 10 20 1c 2c
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 11 1f d2 dc
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 11 20 ad 9c
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 11 20 d7 e6
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 11 21 19 29
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 11 21 01 31
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 12 20 f5 c7
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 12 20 f6 c4
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 12 20 ee dc
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 12 20 f9 cb
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 12 20 f9 cb
Notification handle = 0x0012 value: 0d 1e 0b 01 5a f1 bf 13 21 01 33
Notification handle = 0x0012 value: 0d 1e 14 02 00 5a f1 bf 13 00 00 00 02 20 f4 00 00 00 00 d9
Notification handle = 0x0012 value: 0d 1e 14 02 00 5a f1 bf 13 00 00 00 02 20 f4 00 00 00 00 d9

Видим, что ответ приходит по handle = 0x0012 соответствует uuid: ffe4, как и упоминалось в описании протокола.

Короткие строки - вес не застабилизирован. 0b - длина посылки. 01 - вес не стабилен, 5af1bf12 Unix-время взвешивания,
20f5 20f6 20ee 20f9 меняющийся вес.

Длинные строки - вес застабилизировался. 14 - длина посылки. 02 - вес стабилен, 5af1bf13 Unix-время взвешивания,
00000002 ID-пользователя, 20f4 - вес, остальные нули - проводимость и жир. В данной модели весов не измеряются.
Ввод данных в Majordomo.
В MDM создаем класс Yunmai_scale со свойтвами weight, fat, resistance и объектами соответствующими ID-пользователя.
Для обработки данных из файла yunmai.log в MDM создан скрипт, который парсит файл и заносит данные по ID в соответствующие
свойства объекта. Данный скрипт добавляем в цикл OneMinute.
СпойлерПоказать
if (file_exists("/var/www/yunmai.log"))
{
echo 'Файл существует<br>';
$fp = fopen("/var/www/yunmai.log", 'rt'); // Текстовый режим
$ffp = file ("/var/www/yunmai.log");
$num = count($ffp);
$your_text = $ffp[$num-1];
$form = substr($your_text, 46, 1); // стабильны показания или нет

if ($form == "2")
{echo 'Есть стабильные показания: '.$form.'<br>';


$form1 = substr($your_text, 75, 5); // показания веса
echo $form1.'<br>';
$weight = hexdec($form1)/100;
echo 'Вес: '.$weight.' кг '.'<br>';
$form12 = substr($your_text, 81, 5); // показания проводимости
echo $form12.'<br>';
$resistance = hexdec($form12);
echo 'Проводимость: '.$resistance.'<br>';
$form13 = substr($your_text, 87, 5); // показания жира
echo $form13.'<br>';
$fat = hexdec($form13)/100;
echo 'Жир: '.$fat.' % '.'<br>';


$form3 = substr($your_text, 63, 11); // индекс профиля
echo $form3.'<br>';
$w2 = hexdec($form3);
echo 'Индекс профиля: '.$w2.'<br>';




sg($w2.".weight",$weight); //вносим показания в базу
sg($w2.".resistance",$resistance); //вносим показания в базу
sg($w2.".fat",$fat); //вносим показания в базу

fclose($fp); // Закрытие файла

if (file_exists("var/www/yunmai.log"))
{
$deleted = unlink("var/www/yunmai.log"); // Удаление файла

if ($deleted)
{
echo "The file has been successfully deleted";
}
else
{
echo "The file has not been successfully deleted";
}
}
else
{
echo "The original file that you want to delete doesn't exist";
}

}
else
{
fclose($fp); // Закрытие файла
}

}






else
{echo "Файла с данными пользователя не существует ";

}
Дальнейшая автоматизация и обработка данных делается через методы класса Yunmai_scale. Тут уж, кто во что гаразд.

Re: умные bluetooth весы

Добавлено: Пт май 18, 2018 3:06 pm
directman66
Круто. Добавляй в конект новое устройство со ссылкой на эту тему.

Какое расстояние между долглом и весами в итоге фиксируется?

Re: умные bluetooth весы

Добавлено: Пт май 18, 2018 3:19 pm
smart_g
directman66 писал(а):
Пт май 18, 2018 3:06 pm
Какое расстояние между долглом и весами в итоге фиксируется?
Точно не замерял. Но уже писал, что меньше чем у датчика miflower. Проведу опыты и отпишусь.
Еще заметил, что при потере связи надо перезапустить gatttool.

Re: умные bluetooth весы

Добавлено: Пт май 18, 2018 3:26 pm
directman66
А одновременно gatttool может работать с весами и mi band?
Или несколько экземпляров приложения?

Re: умные bluetooth весы

Добавлено: Пт май 18, 2018 6:31 pm
smart_g
directman66 писал(а):
Пт май 18, 2018 3:26 pm
А одновременно gatttool может работать с весами и mi band?
Или несколько экземпляров приложения?
Судя по всему вызывается несколько экземпляров. Постоянно работает полинг весов( gatttool запущен) а питоновский скрипт, который опрашивает датчики miflora запускает свой процесс gatttool (видно в скрипте). Все это работает через один донгл и друг другу не мешает.

Re: умные bluetooth весы

Добавлено: Вт май 22, 2018 10:26 pm
directman66
это на убунте

Код: Выделить всё

A4:C1:38:C7:0C:A3: команда не найдена
pi@dmsserver:~$ gatttool -I
[                 ][LE]> connect A4:C1:38:C7:0C:A3
Attempting to connect to A4:C1:38:C7:0C:A3
Error: connect error: Connection refused (111)
[A4:C1:38:C7:0C:A3][LE]> connect A4:C1:38:C7:0C:A3
Attempting to connect to A4:C1:38:C7:0C:A3
Error: connect error: Function not implemented (38)
[A4:C1:38:C7:0C:A3][LE]>
это на orange pi plus 2 (armbian)

Код: Выделить всё

[A4:C1:38:C7:0C:A3][LE]> connect A4:C1:38:C7:0C:A3
Attempting to connect to A4:C1:38:C7:0C:A3
Connection successful
[A4:C1:38:C7:0C:A3][LE]>
(gatttool:4831): GLib-WARNING **: Invalid file descriptor.

[A4:C1:38:C7:0C:A3][LE]> primary
Command Failed: Disconnected
[A4:C1:38:C7:0C:A3][LE]> (gatttool:4831): GLib-WARNING **: Invalid file descriptor.
Error: (gatttool:4831):: command not found
[A4:C1:38:C7:0C:A3][LE]>

Re: умные bluetooth весы

Добавлено: Ср май 23, 2018 12:10 am
directman66
Похоже нужно ставить библиотеку https://github.com/labapart/gattlib/

Re: умные bluetooth весы

Добавлено: Ср май 23, 2018 9:52 am
smart_g
На сколько я помню в пакете BlueZ gatttool не шел. Я его доустанавливал потом, но вроде стандартно sudo apt-get install gatttool

Re: умные bluetooth весы

Добавлено: Пт май 25, 2018 9:00 am
Eraser
У меня работает скрипт отсюда
https://github.com/UCSD-SEELab/YunmaiDataCapture
Скрипт передает данные по MQTT