Govee H5074, H5075, H5100, H5101, H5104, H5105, H5174, H5177, dan H5179 Bluetooth Pencatat Suhu dan Kelembapan Energi Rendah, dan Termometer Daging Cerdas Govee H5181, H5182 dan H5183
Masing-masing perangkat ini saat ini berharga kurang dari $15 di Amazon dan menggunakan BLE untuk komunikasi, jadi tidak perlu menyiapkan akun produsen untuk melacak data.
GoveeBTTempLogger awalnya dibangun menggunakan Microsoft Visual Studio 2017, menargetkan prosesor ARM yang berjalan di Linux. Saya menggunakan Raspberry Pi 4 sebagai host linux saya. Saya telah memverifikasi kode yang sama berfungsi pada Raspbery Pi ZeroW, Raspberry Pi Zero2W, Raspberry Pi 3b, dan Raspberry Pi 5.
GoveeBTTempLogger membuat file log, jika ditentukan oleh opsi -l atau --log, untuk setiap perangkat ia menerima data yang disiarkan menggunakan format sederhana yang dipisahkan tab yang kompatibel dengan pemuatan di Microsoft Excel. Setiap baris dalam file log memiliki Tanggal (dicatat dalam UTC), Suhu, kelembaban relatif, dan persen baterai. Format penamaan file log mencakup nama unik perangkat Govee, tahun berjalan, dan bulan. File log baru dibuat setiap bulan.
Menambahkan opsi --index untuk membuat file indeks html berdasarkan file log yang ada. Opsi ini membuat file indeks dan keluar tanpa menjalankan kode bluetooth apa pun. Ini dapat dijalankan tanpa mempengaruhi program yang sedang berjalan yang mendengarkan iklan Bluetooth. Contoh perintah untuk membuat indeks:
sudo /usr/local/bin/goveebttemplogger --log /var/log/goveebttemplogger/ --index index.html
Konversi ke Bluetooth menggunakan BlueZ melalui DBus! DBus adalah metode komunikasi Bluetooth yang disetujui. Tampaknya menggunakan lebih banyak CPU daripada kode HCI murni. Ketika saya mencoba membangun ini pada mesin yang menjalankan Raspbian GNU/Linux 10 (buster) sistem dibangun tetapi rutinitas BlueZ DBus untuk menemukan adaptor bluetooth gagal. Karena alasan ini, saya meninggalkan perintah HCI lama dalam kode dan kembali menjalankan HCI jika DBus gagal.
Saya telah menambahkan opsi --HCI untuk memungkinkan pengguna memaksanya menjalankan perintah HCI alih-alih menggunakan antarmuka DBus.
Saat menjalankan DBus, tidak ada cara untuk menjalankannya dalam mode pemindaian pasif. Opsi --passive diabaikan.
Saat menjalankan mode HCI, daftar putih yang dibuat dengan opsi --only dikirim ke perangkat keras bluetooth dan hanya perangkat tersebut yang dikirim dari perangkat keras ke perangkat lunak. Dalam mode DBus, daftar putih tampaknya tidak tersedia. Dalam mode DBus saya memfilter output berdasarkan daftar putih.
Kode telah diatur ulang sedikit untuk kejelasan, memindahkan semua kode akses HCI ke dalam blok #ifdef. File CMakeLists.txt mendefinisikan _BLUEZ_HCI_ untuk menyimpan kode dalam aplikasi. Menghapus atau mengomentari baris add_compile_definitions( BLUEZ_HCI ) akan dikompilasi tanpa perpustakaan Bluetooth HCI. Saya juga harus bisa mengabaikan file att-types.h, uuid.c, dan uuid.h. Saya belum mahir di CMake untuk melakukan ini.
Kode HCI menggunakan fungsionalitas libbluetooth dari BlueZ di linux untuk membuka perangkat Bluetooth default dan mendengarkan iklan berenergi rendah dari termometer Govee.
Memperbarui skrip instalasi debian postinst untuk menambahkan pengguna goveebttemplogger dan melakukan perubahan izin pada direktori default dengan tepat. Mengubah file layanan untuk menentukan menjalankan program sebagai goveebttemplogger pengguna. Hal ini dimungkinkan karena mengakses BlueZ melalui DBus tidak memerlukan akses root.
Menambahkan fungsi keluaran SVG, secara langsung membuat grafik SVG dari data internal di direktori tertentu. Hal ini menyebabkan program membutuhkan waktu lebih lama untuk memulai karena program akan mencoba membaca semua data log lama ke dalam struktur memori internal saat program dimulai. Setelah program memasuki kondisi berjalan normal, program ini menulis empat file SVG per perangkat ke direktori yang ditentukan setiap lima menit.
Berikut ini contoh nama file: gvh-E35ECC215C0F-day.svg
Suhu dan kelembapan terkini ditampilkan dalam skala vertikal di sebelah kiri. Skala suhu ditampilkan di sisi kiri grafik, skala kelembaban di sebelah kanan. Data waktu terkini ditampilkan di kanan atas, dengan judul di kiri atas grafik.
Data suhu dan kelembapan minimum dan maksimum, pada rincian grafik, dapat ditampilkan. Ini paling berguna dalam grafik tahunan, yang granularitasnya adalah satu hari. Berikut adalah grafik tahunan yang sesuai dengan grafik harian sebelumnya: gvh-E35ECC215C0F-year.svg
Kelembapan, dan skala kelembapan di sebelah kanan, secara otomatis dihilangkan jika data saat ini melaporkan kelembapan nol. Termometer daging melaporkan suhu saat ini dan suhu yang disetel alarm tetapi tidak ada pengukuran kelembapan.
File teks sederhana yang memetakan alamat Bluetooth ke judul akan dibaca dari nama file gvh-titlemap.txt di direktori keluaran svg. Setiap baris dalam file harus terdiri dari alamat bluetooth (dalam format heksadesimal dengan ( :
) di antara oktet), spasi, dan judul. Lihat gvh-titlemap.txt sebagai contoh. Jika tidak ada pemetaan judul, alamat Bluetooth digunakan untuk judul grafik.
Jika opsi --svg tidak ditambahkan ke baris perintah, program akan terus beroperasi sama seperti sebelumnya.
libbluetooth-dev
libdbus-1-dev
Tampaknya ini lebih baik membangun paket debian dengan ukuran terpasang, dependensi, dan detail md5sum yang benar. Saya masih mempelajari CMake jadi mungkin ada pembaruan rutin untuk sementara waktu.
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
Paket instalasi akan membuat unit systemd goveebttemplogger.service
yang secara otomatis akan memulai GoveeBTTempLogger. Layanan ini dapat dikonfigurasi melalui perintah systemctl edit goveebttemplogger.service
. Secara default, ia menulis log ke /var/log/goveebttemplogger
dan menulis file SVG ke /var/www/html/goveebttemplogger
.
Rutinitas instalasi postinst membuat pengguna dan tiga direktori. Ini juga akan mengubah izin pada direktori tersebut untuk dimiliki dan dapat ditulis oleh pengguna yang baru dibuat.
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
Bagian file unit systemd ExecStart
untuk memulai layanan telah dipecah menjadi beberapa baris untuk kejelasan.
[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
Sebagai contoh, untuk menonaktifkan file SVG, meningkatkan verbositas, dan mengubah direktori tempat file log ditulis, gunakan sudo systemctl edit --full goveebttemplogger.service
dan masukkan file berikut di editor:
[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
Kemudian gunakan sudo systemctl restart goveebttemplogger
untuk memulai ulang GoveeBTTempLogger.
Dua perintah pertama di bawah ini menyiapkan lingkungan yang diperlukan untuk Visual Studio 2022 untuk membangun proyek. Perintah ketiga menambahkan perpustakaan yang diperlukan untuk membangun proyek bluetooth.
sudo apt-get update
sudo apt install g++ gdb make ninja-build rsync zip -y
sudo apt install bluetooth bluez libbluetooth-dev -y
Format file log telah stabil untuk waktu yang lama sebagai file teks sederhana yang dipisahkan tab dengan sejumlah kolom: Tanggal (UTC), Suhu (C), Kelembaban, Baterai.
Dengan tambahan dukungan untuk beberapa pembacaan suhu termometer daging, saya telah mengubah sedikit format sedemikian rupa sehingga kompatibel dengan sebagian besar program yang membaca log yang ada. Setelah kolom Tanggal, Suhu, Kelembaban, Baterai yang ada saya telah menambahkan kolom opsional Model, Suhu, Suhu, Suhu
Saya mengubah nama file log default untuk memulai dengan gvh-
alih-alih gvh507x_
. Kode tersebut akan tetap membaca file log lama, dan akan mengganti nama file log bulan ini ke format baru. Saya menggunakan perintah shell linux for f in gvh507x_*.txt; do sudo mv "${f}" "${f//gvh507x_/gvh-}"; done
di direktori file log untuk mengganti nama semua file lama ke format baru di mesin saya.
Unit 5074, 5075, 5174, dan 5177 semuanya menyiarkan UUID 88EC. Sayangnya, 5074 tidak mencantumkan UUID dalam iklan yang sama dengan suhu.
Unit H5181, 5182 dan 5183 masing-masing menyiarkan UUID 5182 dan 5183 di setiap pesan siarannya termasuk suhu.
(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)
Butuh waktu lama bagi saya untuk mengunduh data dari perangkat secara langsung dibandingkan hanya mendengarkan iklan. Metode pengunduhan langsung bagus karena dapat mengambil data yang terkumpul saat pendengar sedang offline.
Tampaknya data siaran H5105 secara otomatis dikenali sebagai termometer Govee dan data disimpan, tetapi pengunduhan tidak berfungsi. H5105 memiliki tombol penyandingan di bagian atas perangkat. Saya perhatikan bahwa perangkat H5100 sepertinya juga tidak mengunduh data historis. Mereka mungkin menggunakan protokol yang sama, berbeda dari termometer lama.
Saya telah melakukan beberapa peretasan agar kedua perangkat yang saya miliki di lokasi saya berfungsi. Perangkat H5100 yang saya miliki memiliki alamat bluetooth yang dimulai dengan huruf C, perangkat H5105 dimulai dengan huruf D. Masalah besarnya adalah untuk berkomunikasi dengan perangkat tersebut, protokol harus menyatakan bahwa perangkat tersebut berbicara dengan LE_RANDOM_ADDRESS dan bukan LE_PUBLIC_ADDRESS yang lainnya perangkat yang saya gunakan memerlukan. Ini juga berperan jika filter bluetooth dikonfigurasi untuk hanya mendengarkan perangkat tertentu. Saya tidak memahami pengaturan ini sesuai dengan apa yang saya baca, jika bit paling signifikan dari alamat bluetooth 48 bit disetel ke satu, itu mendefinisikan alamat sebagai RANDOM, yang berarti C, D, E, atau F di digit depan alamat semuanya harus RANDOM.
Saya mengalami masalah dalam mengenali iklan. Hal ini menyebabkan terlalu banyak waktu untuk bereksperimen dengan metode pemindaian iklan bluetooth, terutama dengan pengaturan ScanWindow dan ScanInterval, tetapi juga dengan perbedaan antara pemindaian aktif dan pemindaian pasif.
Dalam mode ini program tersebut melakukan apa yang Anda harapkan, mendengarkan iklan.
Dalam mode ini tumpukan bluetooth itu sendiri akan mencoba menyambung ke perangkat yang menerima iklan dan mengambil lebih banyak informasi.
Untuk waktu yang lama saya telah menetapkan nilai tetap dalam kode saya untuk Scan Window dan Scan Interval dengan cepat disetel ke bt_ScanInterval(0x0012) bt_ScanWindow(0x0012) diikuti oleh bt_ScanInterval(0x1f40) bt_ScanWindow(0x1f40). Nilainya meningkat sebesar 0,625 mdetik. Nilai pertama adalah 11,25 mdetik, dan nilai kedua adalah (5000 mdetik). Saat banyak membaca, saya menemukan rekomendasi untuk menggunakan 40 mdetik dan 30 mdetik, jadi saya sudah mencoba bt_ScanInterval(64) dan bt_ScanWindow(48). Ketika diatur seperti ini, sepertinya saya mendapat iklan, tetapi saya tidak dapat terhubung dan mengunduh.
Saya menyertakan peretasan beberapa waktu lalu terkait pemfilteran bluetooth untuk memfilter dengan mudah pada perangkat yang sudah login. Jika filter ditentukan dengan semua bit yang disetel, program akan mengirimkan filter alamat yang diketahui ke tumpukan saat pemindaian dimulai. Tindakan ini menonaktifkan penemuan perangkat baru, namun dapat meningkatkan kinerja dalam beberapa situasi.
Koneksi pada perangkat bluetooth semuanya didasarkan pada pegangan dan UUID. Ada beberapa UUID tertentu yang harus didukung oleh setiap perangkat bluetooth, dan ada juga UUID khusus. Daftar ini berasal dari 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 adalah UUID 128 bit khusus yang tampaknya digunakan oleh semua termometer Govee untuk layanan utamanya. Jika dicetak sebagai string ascii, teks ini akan terlihat terbalik INTELLI_ROCKS_HW . ( WH_SKCOR_ILLETNI )
12205f53-4b43-4f52-5f49-4c4c45544e49 adalah UUID 128 bit dari karakteristik layanan yang saya tulis untuk memungkinkan pengunduhan data. Sepertinya UUID utama kecuali dua byte pertama berbeda. INTELLI_ROCKS_ . ( _SKCOR_ILLETNI )
Sebagian besar perangkat menyimpan riwayat selama 20 hari. Perangkat GVH5177 dan GVH5174 memiliki data setengah bulan.
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)
File btsnoop_hci.log adalah log snoop hci Bluetooth dari perangkat Google Nexus 7 yang menjalankan Android dan Aplikasi Govee Home.