Govee H5074, H5075, H5100, H5101, H5104, H5105, H5174, H5177 및 H5179 Bluetooth 저에너지 온도 및 습도 로거 및 Govee H5181, H5182 및 H5183 스마트 육류 온도계
이러한 각 장치는 현재 Amazon에서 15달러 미만의 가격으로 통신에 BLE를 사용하므로 데이터를 추적하기 위해 제조업체 계정을 설정할 필요가 없습니다.
GoveeBTTempLogger는 처음에 Linux에서 실행되는 ARM 프로세서를 대상으로 Microsoft Visual Studio 2017을 사용하여 구축되었습니다. 저는 Raspberry Pi 4를 Linux 호스트로 사용하고 있습니다. 동일한 코드가 Raspbery Pi ZeroW, Raspberry Pi Zero2W, Raspberry Pi 3b 및 Raspberry Pi 5에서 작동하는지 확인했습니다.
GoveeBTTempLogger는 -l 또는 --log 옵션으로 지정된 경우 Microsoft Excel 로드와 호환되는 간단한 탭 구분 형식을 사용하여 방송된 데이터를 수신하는 각 장치에 대해 로그 파일을 생성합니다. 로그 파일의 각 줄에는 날짜(UTC로 기록됨), 온도, 상대 습도 및 배터리 비율이 포함됩니다. 로그 파일 명명 형식에는 고유한 Govee 장치 이름, 현재 연도 및 월이 포함됩니다. 매달 새로운 로그 파일이 생성됩니다.
기존 로그 파일을 기반으로 html 인덱스 파일을 생성하는 --index 옵션이 추가되었습니다. 이 옵션은 인덱스 파일을 생성하고 블루투스 코드를 실행하지 않고 종료됩니다. Bluetooth 광고를 듣는 프로그램의 실행 인스턴스에 영향을 주지 않고 실행할 수 있습니다. 인덱스를 생성하는 명령 예:
sudo /usr/local/bin/goveebttemplogger --log /var/log/goveebttemplogger/ --index index.html
DBus를 통해 BlueZ를 사용하여 Bluetooth로 변환! DBus는 승인된 Bluetooth 통신 방법입니다. 순수 HCI 코드보다 CPU를 더 많이 사용하는 것 같습니다. Raspbian GNU/Linux 10(buster)을 실행하는 시스템에서 이것을 빌드하려고 시도했을 때 시스템이 빌드되었지만 Bluetooth 어댑터를 찾는 BlueZ DBus 루틴이 실패했습니다. 이러한 이유로 코드에 이전 HCI 명령을 남겨두고 DBus가 실패할 경우 HCI를 실행하도록 대체했습니다.
사용자가 DBus 인터페이스를 사용하는 대신 HCI 명령을 강제로 실행할 수 있도록 --HCI 옵션을 추가했습니다.
DBus를 실행할 때 패시브 스캐닝 모드로 실행할 수 있는 방법은 없습니다. --passive 옵션은 무시됩니다.
HCI 모드를 실행할 때 --only 옵션으로 생성된 화이트리스트는 블루투스 하드웨어로 전송되고 해당 장치만 하드웨어에서 소프트웨어로 전송됩니다. DBus 모드에서는 화이트리스트를 사용할 수 없는 것 같습니다. DBus 모드에서는 화이트리스트를 기반으로 출력을 필터링합니다.
명확성을 위해 코드를 약간 재정렬하여 모든 HCI 액세스 코드를 #ifdef 블록으로 이동했습니다. CMakeLists.txt 파일은 애플리케이션에 코드를 유지하기 위해 _BLUEZ_HCI_를 정의합니다. add_compile_definitions( BLUEZ_HCI ) 행을 제거하거나 주석 처리하면 Bluetooth HCI 라이브러리 없이 컴파일됩니다. 또한 att-types.h, uuid.c 및 uuid.h 파일을 무시할 수 있어야 합니다. 저는 아직 CMake에 능숙하여 이 작업을 수행할 수 있습니다.
HCI 코드는 Linux에서 BlueZ의 libbluetooth 기능을 사용하여 기본 Bluetooth 장치를 열고 Govee 온도계의 저에너지 광고를 듣습니다.
사용자 goveebttemplogger를 추가하고 기본 디렉터리에 대한 권한을 적절하게 변경하도록 postinst debian 설치 스크립트를 업데이트했습니다. 사용자 goveebttemplogger로 프로그램 실행을 지정하도록 서비스 파일을 변경했습니다. 이는 DBus를 통해 BlueZ에 액세스하는 데 루트 액세스가 필요하지 않기 때문에 가능합니다.
지정된 디렉터리의 내부 데이터에서 SVG 그래프를 직접 생성하는 SVG 출력 기능을 추가했습니다. 이로 인해 프로그램이 시작될 때 이전에 기록된 모든 데이터를 내부 메모리 구조로 읽으려고 시도하므로 시작하는 데 시간이 더 오래 걸립니다. 프로그램이 정상 실행 상태에 들어가면 5분마다 장치당 4개의 SVG 파일을 지정된 디렉터리에 씁니다.
다음은 파일 이름의 예입니다: gvh-E35ECC215C0F-day.svg
가장 최근의 온도와 습도가 왼쪽의 수직 눈금에 표시됩니다. 그래프의 왼쪽에는 온도 눈금이 표시되고 오른쪽에는 습도 눈금이 표시됩니다. 가장 최근 시간 데이터는 오른쪽 상단에 표시되며 제목은 그래프 왼쪽 상단에 표시됩니다.
그래프 단위로 최소 및 최대 온도와 습도 데이터가 표시될 수 있습니다. 이는 단위가 하루인 연간 그래프에서 가장 유용합니다. 이전 일일 그래프에 해당하는 연간 그래프는 다음과 같습니다. gvh-E35ECC215C0F-year.svg
현재 데이터에서 습도가 0으로 보고되면 습도와 오른쪽의 습도 눈금이 자동으로 생략됩니다. 고기 온도계는 현재 온도와 알람 설정 온도를 보고하지만 습도는 측정하지 않습니다.
Bluetooth 주소를 제목에 매핑하는 간단한 텍스트 파일은 svg 출력 디렉터리의 파일 이름 gvh-titlemap.txt에서 읽혀집니다. 파일의 각 줄은 블루투스 주소(옥텟 사이에 ( :
)가 있는 16진수 형식), 공백 및 제목으로 구성되어야 합니다. 예를 보려면 gvh-titlemap.txt를 참조하세요. 제목 매핑이 없으면 그래프 제목에 Bluetooth 주소가 사용됩니다.
--svg 옵션이 명령줄에 추가되지 않으면 프로그램은 이전과 동일하게 계속 작동해야 합니다.
libbluetooth-dev
libdbus-1-dev
이는 올바른 설치된 크기, 종속성 및 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를 자동으로 시작하는 시스템 장치 goveebttemplogger.service
생성합니다. 이 서비스는 systemctl edit goveebttemplogger.service
명령을 통해 구성할 수 있습니다. 기본적으로 /var/log/goveebttemplogger
에 로그를 쓰고 /var/www/html/goveebttemplogger
에 SVG 파일을 씁니다.
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
명확성을 위해 여러 줄로 구분되었습니다.
[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에서 프로젝트를 빌드하는 데 필요한 환경을 설정합니다. 세 번째 명령은 블루투스 프로젝트를 빌드하는 데 필요한 라이브러리를 추가했습니다.
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), 습도, 배터리 등 설정된 수의 열이 있는 간단한 탭으로 구분된 텍스트 파일로 오랫동안 안정적이었습니다.
육류 온도계의 다중 온도 판독에 대한 지원을 추가하여 기존 로그를 읽는 대부분의 프로그램과 역호환되는 방식으로 형식을 약간 변경했습니다. 날짜, 온도, 습도, 배터리의 기존 열 다음에 모델, 온도, 온도, 온도의 선택적 열을 추가했습니다.
gvh507x_
대신 gvh-
로 시작하도록 기본 로그 파일 이름을 변경했습니다. 코드는 여전히 이전 로그 파일을 읽고 현재 월 로그 파일의 이름을 새 형식으로 바꿉니다. 나는 for f in gvh507x_*.txt; do sudo mv "${f}" "${f//gvh507x_/gvh-}"; done
로그 파일 디렉토리에서 모든 이전 파일의 이름을 내 컴퓨터의 새 형식으로 for f in gvh507x_*.txt; do sudo mv "${f}" "${f//gvh507x_/gvh-}"; done
.
5074, 5075, 5174 및 5177 장치는 모두 88EC의 UUID를 브로드캐스트합니다. 불행하게도 5074는 온도와 동일한 광고에 UUID를 포함하지 않습니다.
H5181, 5182 및 5183 장치는 온도를 포함하여 각 방송 메시지에서 각각 5182 및 5183의 UUID를 방송합니다.
(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 장치에는 C로 시작하는 블루투스 주소가 있고, H5105 장치는 D로 시작하는 블루투스 주소가 있습니다. 실제로 큰 문제는 그들과 통신하려면 프로토콜이 LE_PUBLIC_ADDRESS가 아닌 LE_RANDOM_ADDRESS와 통신하고 있음을 선언해야 한다는 것입니다. 내가 사용한 장치에는 필요합니다. 이는 특정 장치만 수신하도록 블루투스 필터가 구성된 경우에도 적용됩니다. 내가 읽은 내용에 따르면 이 설정을 이해하지 못합니다. 48비트 Bluetooth 주소의 최상위 비트가 1로 설정되면 주소가 RANDOM으로 정의됩니다. 이는 C, D, E, 또는 주소 앞자리의 F에는 모두 RANDOM이 필요합니다.
광고를 인식하는 데 문제가 발생했습니다. 이로 인해 주로 ScanWindow 및 ScanInterval 설정을 사용하고 능동 검색과 수동 검색의 차이점을 사용하여 Bluetooth 광고 검색 방법을 실험하는 데 너무 많은 시간이 걸렸습니다.
이 모드에서 해당 프로그램은 광고를 듣는 등 사용자가 기대하는 대로 정확히 수행됩니다.
이 모드에서는 블루투스 스택 자체가 광고를 수신하는 장치에 연결을 시도하고 더 많은 정보를 검색합니다.
오랫동안 저는 스캔 창 및 스캔 간격에 대한 고정 값을 bt_ScanInterval(0x0012) bt_ScanWindow(0x0012) 다음에 bt_ScanInterval(0x1f40) bt_ScanWindow(0x1f40)로 빠르게 설정했습니다. 값은 0.625msec 단위로 증가합니다. 첫 번째 값은 11.25msec이고 두 번째 값은 (5000msec)입니다. 여러 책을 읽다가 40msec와 30msec를 사용하라는 권장 사항을 발견하여 bt_ScanInterval(64) 및 bt_ScanWindow(48)을 시도했습니다. 이렇게 설정하면 광고는 나오는 것 같은데 접속 및 다운로드가 안되네요.
이미 기록된 장치를 쉽게 필터링하기 위해 얼마 전에 블루투스 필터링과 관련된 해킹을 포함시켰습니다. 모든 비트가 설정된 필터가 지정되면 프로그램은 검색이 시작될 때 알려진 주소의 필터를 스택에 제출합니다. 이렇게 하면 새 장치 검색이 비활성화되지만 일부 상황에서는 성능이 향상될 수 있습니다.
블루투스 장치의 연결은 모두 핸들과 UUID를 기반으로 합니다. 모든 Bluetooth 장치가 지원해야 하는 정의된 UUID와 사용자 정의 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 는 모든 Govee 온도계가 기본 서비스에 사용하는 것으로 보이는 맞춤형 128비트 UUID입니다. ASCII 문자열로 인쇄하면 INTELLI_ROCKS_HW 거꾸로 보면 이 텍스트처럼 보입니다. ( WH_SKCOR_ILLETNI )
12205f53-4b43-4f52-5f49-4c4c45544e49 는 데이터 다운로드를 가능하게 하기 위해 작성한 서비스 특성의 128비트 UUID입니다. 처음 두 바이트가 다르다는 점을 제외하면 기본 UUID처럼 보입니다. INTELLI_ROCKS_ . ( _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 파일은 Android 및 Govee Home App을 실행하는 Google Nexus 7 기기의 Bluetooth hci 스누프 로그입니다.