Подключение "умных" весов 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. Тут уж, кто во что гаразд.