Govee H5074, H5075, H5100, H5101, H5104, H5105, H5174, H5177 и H5179 Bluetooth-регистратор температуры и влажности с низким энергопотреблением, а также интеллектуальные термометры для мяса Govee H5181, H5182 и H5183
Каждое из этих устройств в настоящее время стоит на Amazon менее 15 долларов и использует BLE для связи, поэтому не требуется создавать учетную запись производителя для отслеживания данных.
GoveeBTTempLogger изначально был создан с использованием Microsoft Visual Studio 2017 и ориентирован на процессор ARM, работающий под управлением Linux. Я использую Raspberry Pi 4 в качестве хоста Linux. Я проверил, что один и тот же код работает на Raspberry Pi ZeroW, Raspberry Pi Zero2W, Raspberry Pi 3b и Raspberry Pi 5.
GoveeBTTempLogger создает файл журнала, если он указан параметром -l или --log, для каждого из устройств, которые он получает широковещательные данные, используя простой формат, разделенный табуляцией, который совместим с загрузкой в Microsoft Excel. В каждой строке файла журнала указаны дата (записанная в формате UTC), температура, относительная влажность и процент заряда батареи. Формат именования файла журнала включает уникальное имя устройства Govee, текущий год и месяц. Новый файл журнала создается ежемесячно.
Добавлен параметр --index для создания индексного файла HTML на основе существующих файлов журналов. Эта опция создает индексный файл и завершает работу без запуска кода Bluetooth. Его можно запустить, не затрагивая работающий экземпляр программы, прослушивающей рекламу Bluetooth. Пример команды для создания индекса:
sudo /usr/local/bin/goveebttemplogger --log /var/log/goveebttemplogger/ --index index.html
Преобразование в Bluetooth с помощью BlueZ через DBus! DBus — это одобренный метод связи Bluetooth. Кажется, он использует больше процессора, чем чистый код HCI. Когда я попытался собрать это на машине под управлением Raspbian GNU/Linux 10 (buster), система собиралась, но процедуры BlueZ DBus по поиску адаптера Bluetooth терпели неудачу. По этой причине я оставил в коде старые команды HCI и вернулся к запуску HCI в случае сбоя DBus.
Я добавил опцию --HCI, позволяющую пользователю принудительно запускать команды HCI вместо использования интерфейса DBus.
При запуске DBus невозможно запустить режим пассивного сканирования. Опция --passive игнорируется.
При работе в режиме HCI белый список, созданный с помощью параметра --only, отправляется на оборудование Bluetooth, и только эти устройства передаются с оборудования на программное обеспечение. В режиме DBus белый список недоступен. В режиме DBus я фильтрую вывод на основе белого списка.
Код был немного переработан для ясности: весь код доступа HCI перемещен в блоки #ifdef. В файле CMakeLists.txt определено _BLUEZ_HCI_ для хранения кода в приложении. Удаление или закомментирование строки add_compile_definitions( BLUEZ_HCI ) приведет к компиляции без библиотек Bluetooth HCI. Я также должен иметь возможность игнорировать файлы att-types.h, uuid.c и uuid.h. Я уже владею CMake, чтобы сделать это.
Код HCI использует функциональность libbluetooth из BlueZ в Linux, чтобы открыть устройство Bluetooth по умолчанию и прослушивать рекламу о низком энергопотреблении от термометров Govee.
Обновлен сценарий установки Debian Postinst: добавлен пользователь goveebttemplogger и внесены соответствующие изменения в разрешения для каталогов по умолчанию. Изменен служебный файл, чтобы указать запуск программы от имени пользователя goveebttemplogger. Это возможно, поскольку для доступа к BlueZ через DBus не требуется root-доступ.
Добавлена функция вывода SVG, позволяющая напрямую создавать графики SVG из внутренних данных в указанном каталоге. Это приводит к тому, что запуск программы занимает больше времени, поскольку при запуске она пытается прочитать все старые зарегистрированные данные во внутреннюю структуру памяти. Как только программа перешла в нормальное рабочее состояние, она записывает четыре файла SVG для каждого устройства в указанный каталог каждые пять минут.
Вот пример имени файла: gvh-E35ECC215C0F-day.svg.
Самые последние значения температуры и влажности отображаются на вертикальной шкале слева. Шкала температуры отображается в левой части графика, шкала влажности – в правой. Самые последние данные о времени отображаются в правом верхнем углу, а заголовок — в левом верхнем углу графика.
Могут отображаться минимальные и максимальные данные о температуре и влажности с степенью детализации графика. Это наиболее полезно для годовых графиков, где детализация составляет один день. Вот соответствующий годовой график для предыдущего дневного графика: gvh-E35ECC215C0F-year.svg
Влажность и шкала влажности справа автоматически опускаются, если текущие данные показывают нулевую влажность. Термометр для мяса сообщает текущую температуру и заданную температуру сигнализации, но не измеряет влажность.
Простой текстовый файл, сопоставляющий адреса Bluetooth с заголовками, будет прочитан из файла с именем gvh-titlemap.txt в выходном каталоге svg. Каждая строка в файле должна состоять из адреса Bluetooth (в шестнадцатеричном формате с :
:) между октетами), пробелов и заголовка. Пример см. в gvh-titlemap.txt. Если сопоставление заголовков не существует, в качестве заголовка графика используется адрес Bluetooth.
Если опция --svg не добавлена в командную строку, программа должна продолжать работать точно так же, как и раньше.
libbluetooth-dev
libdbus-1-dev
Кажется, это позволяет лучше собрать пакет Debian с правильным установленным размером, зависимостями и деталями md5sums. Я все еще изучаю CMake, поэтому некоторое время могут выходить регулярные обновления.
sudo apt install build-essential cmake git libbluetooth-dev libdbus-1-dev
git clone https://github.com/wcbonner/GoveeBTTempLogger.git
cmake -S GoveeBTTempLogger -B GoveeBTTempLogger/build
cmake --build GoveeBTTempLogger/build
pushd GoveeBTTempLogger/build && cpack . && popd
Установочный пакет создаст системный модуль goveebttemplogger.service
, который автоматически запустит GoveeBTTempLogger. Службу можно настроить с помощью команды systemctl edit goveebttemplogger.service
. По умолчанию он записывает журналы в /var/log/goveebttemplogger
и файлы SVG в /var/www/html/goveebttemplogger
.
Процедура установки postinst создает пользователя и три каталога. Это также изменит разрешения для этих каталогов, которые будут принадлежать и доступны для записи вновь созданному пользователю.
adduser --system --ingroup www-data goveebttemplogger
mkdir --verbose --mode 0755 --parents /var/log/goveebttemplogger /var/cache/goveebttemplogger /var/www/html/goveebttemplogger
chown --changes --recursive goveebttemplogger:www-data /var/log/goveebttemplogger /var/cache/goveebttemplogger /var/www/html/goveebttemplogger
chmod --changes --recursive 0644 /var/log/goveebttemplogger/* /var/cache/goveebttemplogger/* /var/www/html/goveebttemplogger/*
sudo setcap 'cap_net_raw,cap_net_admin+eip' /usr/local/bin/goveebttemplogger
Раздел ExecStart
юнит-файла systemd для запуска службы разбит на несколько строк для ясности.
[Service]
Type=simple
Restart=always
RestartSec=30
User=goveebttemplogger
Group=www-data
ExecStart=/usr/local/bin/goveebttemplogger
--verbose 0
--log /var/log/goveebttemplogger
--time 60
--svg /var/www/html/goveebttemplogger --battery 8 --minmax 8
--cache /var/cache/goveebttemplogger
KillSignal=SIGINT
Например, чтобы отключить файлы SVG, повысить уровень детализации и изменить каталог, в который записываются файлы журналов, используйте sudo systemctl edit --full goveebttemplogger.service
и введите в редакторе следующий файл:
[Service]
Type=simple
Restart=always
RestartSec=5
ExecStartPre=/bin/mkdir -p /var/log/gvh
ExecStart=/usr/local/bin/goveebttemplogger
--verbose 1
--log /var/log/gvh
--time 60
--download
KillSignal=SIGINT
Затем используйте sudo systemctl restart goveebttemplogger
, чтобы перезапустить GoveeBTTempLogger.
Первые две команды ниже настраивают необходимую среду для Visual Studio 2022 для сборки проекта. Третья команда добавила необходимые библиотеки для создания проектов Bluetooth.
sudo apt-get update
sudo apt install g++ gdb make ninja-build rsync zip -y
sudo apt install bluetooth bluez libbluetooth-dev -y
Формат файла журнала долгое время оставался стабильным и представлял собой простой текстовый файл, разделенный табуляцией, с заданным количеством столбцов: Дата (UTC), Температура (C), Влажность, Батарея.
С добавлением поддержки нескольких показаний температуры мясных термометров я немного изменил формат таким образом, чтобы он был обратно совместим с большинством программ, читающих существующие журналы. После существующих столбцов «Дата», «Температура», «Влажность», «Батарея» я добавил дополнительные столбцы «Модель», «Температура», «Температура», «Температура».
Я изменил имя файла журнала по умолчанию, чтобы оно начиналось с gvh-
вместо gvh507x_
. Код по-прежнему будет читать старые файлы журнала и переименовывает файл журнала текущего месяца в новый формат. Я использовал команду оболочки Linux for f in gvh507x_*.txt; do sudo mv "${f}" "${f//gvh507x_/gvh-}"; done
в каталоге файлов журнала, чтобы переименовать все старые файлы в новый формат на моем компьютере.
Все устройства 5074, 5075, 5174 и 5177 передают UUID 88EC. К сожалению, UUID 5074 не указан в той же рекламе, что и температура.
Устройства H5181, 5182 и 5183 передают UUID 5182 и 5183 соответственно в каждом из своих широковещательных сообщений, включая температуру.
(Flags) 06 (UUID) 5182 (Manu) 3013270100010164018007D0FFFF860708FFFF (Temp) 20°C (Temp) -0.01°C (Temp) 18°C (Temp) -0.01°C (Battery) 0%
(UUID) 5183 (Flags) 05 (Manu) 5DA1B401000101E40186076C2F660000 (Temp) 19°C (Temp) 121.34°C (Battery) 0% (Other: 00) (Other: 00) (Other: 00) (Other: 00) (Other: 00) (Other: CB)
Мне потребовалось много времени, чтобы научиться загружать данные с устройств напрямую, а не просто слушать рекламу. Метод прямой загрузки удобен тем, что позволяет получить данные, накопленные, пока прослушиватель находился в автономном режиме.
Похоже, что транслируемые данные H5105 автоматически распознаются как термометр Govee и данные сохраняются, но загрузка не работает. H5105 имеет кнопку сопряжения в верхней части устройства. Я заметил, что устройство H5100 также не загружает исторические данные. Они могут использовать тот же протокол, отличный от старых термометров.
Я сделал пару хаков, чтобы заставить работать два устройства, которые есть у меня дома. У моего устройства H5100 адрес Bluetooth начинается с буквы C, а у устройства H5105 начинается с буквы D. Действительно большая проблема заключается в том, что для связи с ними протокол должен объявить, что он общается с LE_RANDOM_ADDRESS, а не с LE_PUBLIC_ADDRESS, который другой устройства, которые я использовал, требуют. Это также имеет значение, если фильтр Bluetooth настроен на прослушивание только определенных устройств. Я не понимаю эту настройку, поскольку, согласно тому, что я прочитал, если старшие биты 48-битного адреса Bluetooth установлены в единицу, это определяет адрес как СЛУЧАЙНЫЙ, что будет означать, что C, D, E, или F в первой цифре адреса должны требовать СЛУЧАЙНОГО значения.
У меня возникли проблемы с распознаванием рекламы. Это привело к тому, что слишком долго экспериментировали с методом сканирования рекламы Bluetooth, в первую очередь с настройками ScanWindow и ScanInterval, а также с разницей между активным сканированием и пассивным сканированием.
В этом режиме эта программа делает именно то, что вы ожидаете, прослушивая рекламу.
В этом режиме стек Bluetooth сам попытается подключиться к устройствам, с которых он получает рекламу, и получить дополнительную информацию.
В течение долгого времени в моем коде были установлены фиксированные значения для окна сканирования и интервала сканирования, которые быстро устанавливались на bt_ScanInterval(0x0012) bt_ScanWindow(0x0012), за которым следовал bt_ScanInterval(0x1f40) bt_ScanWindow(0x1f40). Значения указаны с шагом 0,625 мс. Первое значение составляло 11,25 мс, а второе значение — (5000 мс). Прочитав кучу книг, я наткнулся на рекомендации использовать 40 мс и 30 мс, поэтому попробовал bt_ScanInterval(64) и bt_ScanWindow(48). Когда он настроен таким образом, мне кажется, что я вижу рекламу, но я не могу подключиться и скачать.
Некоторое время назад я включил хак, связанный с фильтрацией Bluetooth, чтобы легко фильтровать устройства, которые уже вошли в систему. Если фильтр указан со всеми установленными битами, программа отправит в стек фильтр известных адресов при запуске сканирования. Это отключает обнаружение новых устройств, но в некоторых ситуациях может повысить производительность.
Все соединения на устройствах Bluetooth основаны на дескрипторах и UUID. Существует несколько определенных UUID, которые должно поддерживать каждое устройство Bluetooth, а также есть собственные UUID. Этот список взят из GVH5177.
[-------------------] Service Handles: 0x0001..0x0007 UUID: 1800 (Generic Access)
[ ] Characteristic Handles: 0x0002..0x0003 Properties: 0x12 UUID: 2a00 (Device Name)
[ ] Characteristic Handles: 0x0004..0x0005 Properties: 0x02 UUID: 2a01 (Appearance)
[ ] Characteristic Handles: 0x0006..0x0007 Properties: 0x02 UUID: 2a04 (Peripheral Preferred Connection Parameters)
[-------------------] Service Handles: 0x0008..0x000b UUID: 1801 (Generic Attribute)
[ ] Characteristic Handles: 0x0009..0x000a Properties: 0x20 UUID: 2a05 (Service Changed)
[-------------------] Service Handles: 0x000c..0x000e UUID: 180a (Device Information)
[ ] Characteristic Handles: 0x000d..0x000e Properties: 0x02 UUID: 2a50 (PnP ID)
[-------------------] Service Handles: 0x000f..0x001b UUID: 57485f53-4b43-4f52-5f49-4c4c45544e49
[ ] Characteristic Handles: 0x0010..0x0011 Properties: 0x1a UUID: 11205f53-4b43-4f52-5f49-4c4c45544e49
[ ] Characteristic Handles: 0x0014..0x0015 Properties: 0x1a UUID: 12205f53-4b43-4f52-5f49-4c4c45544e49
[ ] Characteristic Handles: 0x0018..0x0019 Properties: 0x12 UUID: 13205f53-4b43-4f52-5f49-4c4c45544e49
[-------------------] Service Handles: 0x001c..0x001f UUID: 12190d0c-0b0a-0908-0706-050403020100
[ ] Characteristic Handles: 0x001d..0x001e Properties: 0x06 UUID: 122b0d0c-0b0a-0908-0706-050403020100
57485f53-4b43-4f52-5f49-4c4c45544e49 — это специальный 128-битный UUID, который, похоже, используют все термометры Govee для своей основной службы. Если он напечатан как строка ascii, он будет выглядеть как этот текст наоборот INTELLI_ROCKS_HW . ( WH_SKCOR_ILLETNI )
12205f53-4b43-4f52-5f49-4c4c45544e49 — это 128-битный UUID характеристики службы, которую я пишу для включения загрузки данных. Он выглядит как основной UUID, за исключением того, что первые два байта различны. ИНТЕЛЛИ_РОКС_ . ( _SKCOR_ILLETNI )
Большинство устройств хранят 20-дневную историю. Устройства GVH5177 и GVH5174 хранят данные за месяц.
Download from device: [A4:C1:38:DC:CC:3D] 2023-02-03 13:52:00 2023-02-23 13:52:00 (28800)
Download from device: [A4:C1:38:EC:0B:03] 2023-02-03 13:51:00 2023-02-23 13:52:00 (28801)
Download from device: [E3:5E:CC:21:5C:0F] 2023-02-03 13:53:00 2023-02-23 13:53:00 (28800)
Download from device: [A4:C1:38:0D:3B:10] 2023-01-24 13:50:00 2023-02-23 13:53:00 (43203)
Download from device: [A4:C1:38:D5:A3:3B] 2023-02-03 13:54:00 2023-02-23 13:54:00 (28800)
Download from device: [A4:C1:38:65:A2:6A] 2023-02-03 13:52:00 2023-02-23 13:55:00 (28803)
Download from device: [A4:C1:38:05:C7:A1] 2023-02-03 13:53:00 2023-02-23 13:56:00 (28803)
Download from device: [A4:C1:38:13:AE:36] 2023-02-03 13:54:00 2023-02-23 13:57:00 (28803)
Download from device: [C2:35:33:30:25:50] 2024-01-15 22:19:00 2024-02-03 20:01:00 (27222)
Download from device: [D0:35:33:33:44:03] 2024-01-14 20:00:00 2024-02-03 20:00:00 (28800)
[2024-02-04T04:01:41] 46 [C2:35:33:30:25:50] (Flags) 06 (Name) GVH5100_2550 (UUID) 88EC (Manu) 010001010276EF55 (Temp) 16.1519°C (Humidity) 51.9% (Battery) 85% (GVH5100)
[-------------------] Service Handles: 0x0001..0x0009 UUID: 1800 (Generic Access)
[ ] Characteristic Handles: 0x0002..0x0003 Properties: 0x0a UUID: 2a00 (Device Name)
[ ] Characteristic Handles: 0x0004..0x0005 Properties: 0x0a UUID: 2a01 (Appearance)
[ ] Characteristic Handles: 0x0006..0x0007 Properties: 0x02 UUID: 2a04 (Peripheral Preferred Connection Parameters)
[ ] Characteristic Handles: 0x0008..0x0009 Properties: 0x02 UUID: 2ac9
[-------------------] Service Handles: 0x000a..0x000d UUID: 1801 (Generic Attribute)
[ ] Characteristic Handles: 0x000b..0x000c Properties: 0x22 UUID: 2a05 (Service Changed)
[-------------------] Service Handles: 0x000e..0x001a UUID: 57485f53-4b43-4f52-5f49-4c4c45544e49
[ ] Characteristic Handles: 0x000f..0x0010 Properties: 0x1a UUID: 11205f53-4b43-4f52-5f49-4c4c45544e49
[ ] Characteristic Handles: 0x0013..0x0014 Properties: 0x1a UUID: 12205f53-4b43-4f52-5f49-4c4c45544e49
[ ] Characteristic Handles: 0x0017..0x0018 Properties: 0x12 UUID: 13205f53-4b43-4f52-5f49-4c4c45544e49
[-------------------] Service Handles: 0x001b..0x0025 UUID: 00fe0000-0000-0000-0000-00000000f002
[ ] Characteristic Handles: 0x001c..0x001d Properties: 0x02 UUID: 03ff0000-0000-0000-0000-00000000f002
[ ] Characteristic Handles: 0x001e..0x001f Properties: 0x12 UUID: 02ff0000-0000-0000-0000-00000000f002
[ ] Characteristic Handles: 0x0022..0x0023 Properties: 0x02 UUID: 00ff0000-0000-0000-0000-00000000f002
[ ] Characteristic Handles: 0x0024..0x0025 Properties: 0x0c UUID: 01ff0000-0000-0000-0000-00000000f002
[2024-02-04T04:03:05] [C2:35:33:30:25:50] Download from device. 2024-01-15 22:19:00 2024-02-03 20:01:00 (27222)
[2024-02-04T04:00:25] 46 [D0:35:33:33:44:03] (Flags) 06 (Name) GVH5105_4403 (UUID) 88EC (Manu) 0100010102868262 (Temp) 16.5506°C (Humidity) 50.6% (Battery) 98% (GVH5105)
[-------------------] Service Handles: 0x0001..0x0009 UUID: 1800 (Generic Access)
[ ] Characteristic Handles: 0x0002..0x0003 Properties: 0x0a UUID: 2a00 (Device Name)
[ ] Characteristic Handles: 0x0004..0x0005 Properties: 0x0a UUID: 2a01 (Appearance)
[ ] Characteristic Handles: 0x0006..0x0007 Properties: 0x02 UUID: 2a04 (Peripheral Preferred Connection Parameters)
[ ] Characteristic Handles: 0x0008..0x0009 Properties: 0x02 UUID: 2ac9
[-------------------] Service Handles: 0x000a..0x000d UUID: 1801 (Generic Attribute)
[ ] Characteristic Handles: 0x000b..0x000c Properties: 0x22 UUID: 2a05 (Service Changed)
[-------------------] Service Handles: 0x000e..0x001a UUID: 57485f53-4b43-4f52-5f49-4c4c45544e49
[ ] Characteristic Handles: 0x000f..0x0010 Properties: 0x1a UUID: 11205f53-4b43-4f52-5f49-4c4c45544e49
[ ] Characteristic Handles: 0x0013..0x0014 Properties: 0x1a UUID: 12205f53-4b43-4f52-5f49-4c4c45544e49
[ ] Characteristic Handles: 0x0017..0x0018 Properties: 0x12 UUID: 13205f53-4b43-4f52-5f49-4c4c45544e49
[-------------------] Service Handles: 0x001b..0x0025 UUID: 00fe0000-0000-0000-0000-00000000f002
[ ] Characteristic Handles: 0x001c..0x001d Properties: 0x02 UUID: 03ff0000-0000-0000-0000-00000000f002
[ ] Characteristic Handles: 0x001e..0x001f Properties: 0x12 UUID: 02ff0000-0000-0000-0000-00000000f002
[ ] Characteristic Handles: 0x0022..0x0023 Properties: 0x02 UUID: 00ff0000-0000-0000-0000-00000000f002
[ ] Characteristic Handles: 0x0024..0x0025 Properties: 0x0c UUID: 01ff0000-0000-0000-0000-00000000f002
[2024-02-04T04:01:31] [D0:35:33:33:44:03] Download from device. 2024-01-14 20:00:00 2024-02-03 20:00:00 (28800)
Файл btsnoop_hci.log представляет собой журнал отслеживания Bluetooth hci с устройства Google Nexus 7 под управлением Android и приложения Govee Home.