Govee H5074、H5075、H5100、H5101、H5104、H5105、H5174、H5177、および H5179 Bluetooth Low Energy 温度および湿度ロガー、および Govee H5181、H5182、および H5183 スマート肉用温度計
これらのデバイスは現在 Amazon で 15 ドル未満で販売されており、通信に BLE を使用しているため、データを追跡するためにメーカー アカウントを設定する必要はありません。
GoveeBTTempLogger は当初、Linux 上で実行される ARM プロセッサをターゲットとして、Microsoft Visual Studio 2017 を使用して構築されました。 Linux ホストとして Raspberry Pi 4 を使用しています。同じコードが Raspberry Pi ZeroW、Raspberry Pi Zero2W、Raspberry Pi 3b、および Raspberry Pi 5 で動作することを確認しました。
GoveeBTTempLogger は、-l または --log オプションで指定されている場合、Microsoft Excel での読み込みと互換性のある単純なタブ区切り形式を使用して、ブロードキャスト データを受信するデバイスごとにログ ファイルを作成します。ログ ファイルの各行には、日付 (UTC で記録)、温度、相対湿度、およびバッテリーのパーセントが含まれます。ログ ファイルの命名形式には、一意の Govee デバイス名、現在の年、月が含まれます。新しいログ ファイルは毎月作成されます。
既存のログ ファイルに基づいて HTML インデックス ファイルを作成するオプション --index を追加しました。このオプションはインデックス ファイルを作成し、Bluetooth コードを何も実行せずに終了します。 Bluetooth アドバタイズメントをリッスンしているプログラムの実行中のインスタンスに影響を与えることなく実行できます。インデックスを作成するコマンドの例:
sudo /usr/local/bin/goveebttemplogger --log /var/log/goveebttemplogger/ --index index.html
DBus経由でBlueZを使用してBluetoothに変換! DBus は、Bluetooth 通信の承認された方式です。純粋な HCI コードよりも多くの CPU を使用するようです。 Raspbian GNU/Linux 10 (バスター) を実行しているマシン上でこれをビルドしようとすると、システムはビルドされますが、Bluetooth アダプターを見つけるための BlueZ DBus ルーチンが失敗します。このため、コード内に古い HCI コマンドを残して、DBus に障害が発生した場合は HCI を実行するようにフォールバックしました。
--HCI オプションを追加して、ユーザーが DBus インターフェイスを使用する代わりに HCI コマンドを強制的に実行できるようにしました。
DBus を実行する場合、パッシブ スキャン モードで実行する方法はありません。 --passive オプションは無視されます。
HCI モードを実行すると、--only オプションを使用して作成されたホワイトリストが Bluetooth ハードウェアに送信され、それらのデバイスのみがハードウェアからソフトウェアに送信されます。 DBus モードでは、ホワイトリストは利用できないようです。 DBus モードでは、ホワイトリストに基づいて出力をフィルタリングします。
わかりやすくするためにコードはわずかに再配置され、すべての HCI アクセス コードが #ifdef ブロックに移動されました。 CMakeLists.txt ファイルは、アプリケーション内にコードを保持するための _BLUEZ_HCI_ を定義します。 add_compile_settings( BLUEZ_HCI ) の行を削除またはコメントアウトすると、Bluetooth HCI ライブラリなしでコンパイルされます。ファイル att-types.h、uuid.c、および uuid.h も無視できるはずです。私はこれを行うにはまだ CMake に習熟しています。
HCI コードは、Linux 上の BlueZ の libbluetooth 機能を使用して、デフォルトの Bluetooth デバイスを開き、Govee 温度計からの低エネルギー アドバタイズメントをリッスンします。
postinst debian インストール スクリプトを更新して、ユーザー goveebttemplogger を追加し、デフォルト ディレクトリの権限を適切に変更しました。ユーザー goveebttemplogger としてプログラムを実行するように指定するようにサービス ファイルを変更しました。 DBus 経由で BlueZ にアクセスするには root アクセスが必要ないため、これが可能になります。
指定ディレクトリ内の内部データから直接SVGグラフを作成するSVG出力機能を追加しました。これにより、プログラムは起動時に古いログデータをすべて内部メモリ構造に読み取ろうとするため、起動に時間がかかります。プログラムが通常の実行状態に入ると、デバイスごとに 4 つの SVG ファイルが指定されたディレクトリに 5 分ごとに書き込まれます。
ファイル名の例は次のとおりです: gvh-E35ECC215C0F-day.svg
最新の温度と湿度が左側の縦軸に表示されます。温度目盛はグラフの左側に表示され、湿度目盛は右側に表示されます。最新の時間データが右上に表示され、グラフの左上にタイトルが表示されます。
最小および最大の温度と湿度のデータをグラフの粒度で表示できます。これは、粒度が 1 日である年次グラフで最も役立ちます。以前の日別グラフに対応する年別グラフは次のとおりです: gvh-E35ECC215C0F-year.svg
現在のデータが湿度 0 を報告する場合、湿度と右側の湿度スケールは自動的に省略されます。肉用温度計は、現在の温度とアラーム設定温度を報告しますが、湿度の測定は行いません。
Bluetooth アドレスをタイトルにマッピングする単純なテキスト ファイルは、svg 出力ディレクトリ内のファイル名 gvh-titlemap.txt から読み取られます。ファイルの各行は、Bluetooth アドレス (オクテット間に ( :
を挟んだ 16 進形式)、空白、およびタイトルで構成されている必要があります。例については、gvh-titlemap.txt を参照してください。タイトル マッピングが存在しない場合は、Bluetooth アドレスがグラフ タイトルに使用されます。
--svg オプションをコマンド ラインに追加しない場合、プログラムは以前とまったく同じように動作し続けるはずです。
libbluetooth-dev
libdbus-1-dev
これにより、正しいインストール サイズ、依存関係、および md5sum の詳細を使用して 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
インストール パッケージは、GoveeBTTempLogger を自動的に開始する systemd ユニットgoveebttemplogger.service
を作成します。このサービスはsystemctl edit goveebttemplogger.service
コマンドを使用して構成できます。デフォルトでは、ログは/var/log/goveebttemplogger
に書き込まれ、SVG ファイルは/var/www/html/goveebttemplogger
に書き込まれます。
postinst インストール ルーチンは、ユーザーと 3 つのディレクトリを作成します。また、これらのディレクトリに対するアクセス許可が、新しく作成されたユーザーによって所有され、書き込み可能になるように変更されます。
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 を再起動します。
以下の最初の 2 つのコマンドは、Visual Studio 2022 がプロジェクトをビルドするために必要な環境をセットアップします。 3 番目のコマンドは、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)、湿度、バッテリーなどの設定された数の列を備えた単純なタブ区切りのテキスト ファイルとして、長い間安定しています。
肉用温度計の複数の温度読み取り値のサポートが追加されたため、既存のログを読み取るほとんどのプログラムと下位互換性があるように形式を少し変更しました。日付、温度、湿度、バッテリーの既存の列の後に、モデル、温度、温度、温度のオプションの列を追加しました。
デフォルトのログ ファイル名を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 デバイスも履歴データをダウンロードしていないようです。古い体温計とは異なり、同じプロトコルを使用する場合があります。
私の場所にある 2 つのデバイスを動作させるために、いくつかのハックを行いました。私が所有している H5100 デバイスの Bluetooth アドレスは C で始まり、H5105 デバイスは D で始まります。本当に大きな問題は、それらと通信するには、プロトコルが、相手の LE_PUBLIC_ADDRESS ではなく LE_RANDOM_ADDRESS と通信していることを宣言する必要があることです。私が使用したデバイスには必要があります。これは、Bluetooth フィルターが特定のデバイスのみをリッスンするように構成されている場合にも影響します。私が読んだ内容によると、この設定が理解できません。48 ビット Bluetooth アドレスの最上位ビットが 1 に設定されている場合、アドレスはランダムとして定義されます。つまり、C、D、E、アドレスの先頭の数字の F はすべて RANDOM を必要とする必要があります。
広告を認識する際に問題が発生しました。このため、主に ScanWindow と ScanInterval の設定だけでなく、アクティブ スキャンとパッシブ スキャンの違いなど、Bluetooth 広告のスキャン方法を実験するのに非常に多くの時間がかかりました。
このモードでは、プログラムは広告をリッスンして、期待どおりの動作を行います。
このモードでは、Bluetooth スタック自体が、広告を受信するデバイスに接続して、より多くの情報を取得しようとします。
長い間、コード内でスキャン ウィンドウとスキャン間隔の値を bt_ScanInterval(0x0012) bt_ScanWindow(0x0012) に設定し、続いて bt_ScanInterval(0x1f40) bt_ScanWindow(0x1f40) に設定する固定値を設定してきました。値は 0.625 ミリ秒単位で増加します。最初の値は 11.25 ミリ秒、2 番目の値は (5000 ミリ秒) でした。いろいろ読んでいると、40 ミリ秒と 30 ミリ秒を使用するという推奨事項を見つけたので、bt_ScanInterval(64) と bt_ScanWindow(48) を試してみました。このように設定すると、広告が表示されるようですが、接続もダウンロードもできません。
私は少し前に、既にログに記録されているデバイスを簡単にフィルタリングするための Bluetooth フィルタリングに関連するハックを組み込みました。すべてのビットを設定してフィルターが指定されている場合、プログラムはスキャンの開始時に既知のアドレスのフィルターをスタックに送信します。これにより、新しいデバイスの検出が無効になりますが、状況によってはパフォーマンスが向上する可能性があります。
Bluetooth デバイス上の接続はすべてハンドルと 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 です。最初の 2 バイトが異なることを除けば、プライマリ UUID と似ています。インテリ_ロックス_ 。 ( _SKCOR_ILLETNI )
ほとんどのデバイスには 20 日間の履歴が保持されます。 GVH5177 および GVH5174 デバイスは 1 か月分のデータを保持します。
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 デバイスからの Bluetooth hci スヌープ ログです。