Govee H5074、H5075、H5100、H5101、H5104、H5105、H5174、H5177 和 H5179 藍牙低功耗溫度和濕度記錄儀,以及 Govee H5181、H5182 和 H5183 智慧肉類溫度計
目前,這些設備在亞馬遜上的售價均低於 15 美元,並使用 BLE 進行通信,因此不需要設定製造商帳戶來追蹤數據。
GoveeBTTempLogger 最初使用 Microsoft Visual Studio 2017 構建,針對在 Linux 上運行的 ARM 處理器。我使用 Raspberry Pi 4 作為我的 Linux 主機。我已經驗證了相同的程式碼可以在 Raspbery Pi ZeroW、Raspberry Pi Zero2W、Raspberry Pi 3b 和 Raspberry Pi 5 上運行。
如果透過 -l 或 --log 選項指定,GoveeBTTempLogger 將使用與在 Microsoft Excel 中載入相容的簡單製表符分隔格式為其接收廣播資料的每個裝置建立一個記錄檔。日誌檔案中的每一行都包含日期(以 UTC 格式記錄)、溫度、相對濕度和電池百分比。日誌檔案命名格式包括唯一的 Govee 設備名稱、目前年份和月份。每月建立一個新的日誌檔案。
新增了選項 --index 以根據現有日誌檔案建立 html 索引檔案。此選項會建立索引檔案並退出而不運行任何藍牙程式碼。它可以在不影響監聽藍牙廣告的程式的運行實例的情況下運行。建立索引的範例命令:
sudo /usr/local/bin/goveebttemplogger --log /var/log/goveebttemplogger/ --index index.html
使用 BlueZ 透過 DBus 轉換為藍牙! DBus 是經過核准的藍牙通訊方法。它似乎比純 HCI 程式碼使用更多的 CPU。當我嘗試在運行 Raspbian GNU/Linux 10 (buster) 的計算機上構建此系統時,系統可以構建,但用於查找藍牙適配器的 BlueZ DBus 例程失敗。因此,我在程式碼中保留了舊的 HCI 命令,並在 DBus 失敗時回退到執行 HCI。
我新增了一個 --HCI 選項,以允許使用者強制它執行 HCI 命令,而不是使用 DBus 介面。
執行DBus時,沒有辦法以被動掃描模式運作。 --passive 選項被忽略。
運行 HCI 模式時,使用 --only 選項建立的白名單將發送到藍牙硬件,並且只有那些設備從硬體發送到軟體。在 DBus 模式下,白名單似乎不可用。在 DBus 模式下,我會根據白名單過濾輸出。
為了清晰起見,程式碼已稍微重新排列,將所有 HCI 存取程式碼移至 #ifdef 區塊中。 CMakeLists.txt 檔案定義 _BLUEZ_HCI_ 以將程式碼保留在應用程式中。刪除或註解掉 add_compile_definitions( BLUEZ_HCI ) 行將在沒有藍牙 HCI 函式庫的情況下進行編譯。我還應該能夠忽略文件 att-types.h、uuid.c 和 uuid.h。我已經精通 CMake 來做到這一點。
HCI 程式碼使用 Linux 上 BlueZ 的 libbluetooth 功能來開啟預設藍牙裝置並監聽來自 Govee 溫度計的低能耗廣告。
更新了 postinst debian 安裝腳本以新增使用者 goveebttemplogger 並相應地更改預設目錄的權限。更改了服務文件以指定以使用者 goveebttemplogger 身分執行程式。這是可能的,因為透過 DBus 存取 BlueZ 不需要 root 存取權。
新增SVG輸出功能,直接將指定目錄下的內部資料建立SVG圖形。這會導致程式需要更長的時間來啟動,因為它會在啟動時嘗試將所有舊的記錄資料讀入內部記憶體結構。一旦程式進入正常運作狀態,它每五分鐘就會將每個裝置的四個 SVG 檔案寫入指定目錄。
以下是檔案名稱範例:gvh-E35ECC215C0F-day.svg
最近的溫度和濕度顯示在左側的垂直刻度中。溫度標度顯示在圖表的左側,濕度標度顯示在右側。最近的時間數據顯示在右上角,標題位於圖表的左上角。
可以以圖表的粒度顯示最小和最大溫度和濕度資料。這在年度圖表中最有用,其中粒度為一天。以下是先前每日圖表對應的年度圖表:gvh-E35ECC215C0F-year.svg
如果目前資料報告的濕度為零,則濕度和右側的濕度刻度將自動省略。肉類溫度計報告其當前溫度和警報設定溫度,但不報告濕度測量。
將從 svg 輸出目錄中的檔案名稱 gvh-titlemap.txt 讀取將藍牙位址對應到標題的簡單文字檔案。文件中的每一行應包含藍牙位址(採用十六進位格式,八位元組之間使用 ( :
)、空格和標題。有關範例,請參閱 gvh-titlemap.txt。如果不存在標題映射,則藍牙位址將用作圖形標題。
如果 --svg 選項未新增至命令列中,程式應該繼續像以前一樣運行。
libbluetooth-dev
libdbus-1-dev
這似乎可以更好地建立具有正確安裝大小、依賴項和 md5sums 詳細資訊的 debian 軟體包。我仍在學習 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
安裝套件將建立一個 systemd 單元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
為了清楚起見,用於啟動服務的 systemd 單元檔案部分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)、濕度、電池。
由於增加了對肉類溫度計多個溫度讀數的支持,我稍微改變了格式,以便與大多數讀取現有日誌的程式向後相容。在現有的日期、溫度、濕度、電池列之後,我添加了型號、溫度、溫度、溫度的可選列
我將預設日誌檔案名稱更改為以gvh-
而不是gvh507x_
。程式碼仍將讀取舊的日誌文件,並將當前月份的日誌文件重新命名為新格式。我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 設備均廣播 UUID 88EC。不幸的是,5074 在與溫度相同的廣告中不包含 UUID。
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 設備有一個以 C 開頭的藍牙位址,H5105 設備以 D 開頭。我使用過的設備需要。如果藍牙過濾器配置為僅偵聽某些設備,這也會發揮作用。我不明白這個設置,因為根據我讀到的內容,如果 48 位藍牙地址的最高有效位設置為 1,則將地址定義為隨機,這意味著 C、D、E、地址前導數字中的F 或F 都應要求RANDOM。
我在識別廣告時遇到了問題。這就導致我們花了太多的時間嘗試掃描藍牙廣告的方法,主要是ScanWindow和ScanInterval的設置,還有主動掃描和被動掃描的差異。
在這種模式下,程式將完全按照您的預期進行操作,即監聽廣告。
在此模式下,藍牙堆疊本身將嘗試連接到從中接收廣告的裝置並檢索更多資訊。
最長的時間裡,我在程式碼中為掃描視窗和掃描間隔設定了固定值,很快就設定為 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)。當這樣設定時,我似乎收到廣告,但無法連接和下載。
我前段時間加入了一個與藍牙過濾相關的駭客攻擊,可以輕鬆過濾已記錄的設備。如果指定了過濾器並設定了所有位,則程式將在掃描開始時向堆疊提交已知位址的過濾器。這會停用新裝置發現,但在某些情況下可能會提高效能。
藍牙裝置上的連線都是基於句柄和UUID。每個藍牙設備都需要支援一些定義的 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是自訂 128 位元 UUID,所有 Govee 溫度計似乎都將其用於其主要服務。如果列印為 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 應用程式的 Google Nexus 7 裝置的藍牙 hci 監聽日誌。