プロジェクト概要
このwikiでは、Seeed Studio XIAO nRF52840 の Bluetooth 5.0 BLE 機能を Seeed Studio Grove 温湿度センサー(DHT20)と組み合わせて使用し、BTHome プロトコルを使って温度と湿度の測定値を Home Assistant にブロードキャストする方法を紹介します。
コードには CircuitPython を使用します。
はじめに
このチュートリアルに従うには、以下のハードウェアが必要です
ハードウェア準備
Grove DHT20センサーは通信にI2Cを使用します。XIAO nRF52840 SenseのI2Cピンに接続する必要があります:
- XIAO Grove ShieldとUniversal 4 pin Unbuckledケーブルを使用できます
- 4 pin Female JumperからGrove 4 pin変換ケーブルを使用してDHT20センサーを直接XIAO nRF52840 Senseに接続します
XIAO nRF52840 SenseとXIAO Grove Shieldのピン配置
ハードウェアセットアップ
配線は簡単です。Shieldを使用する場合もしない場合も、以下のFritzingスケマティックでコンポーネントを接続する方法を示しています。
ソフトウェア準備
Thonny IDEソフトウェア(Linux)と関連するライブラリとファイルを使用します。以下の手順を実行します:
- XIAO nRF52840 SenseにCircuitPythonをインストール
- 必要なライブラリをインストール
- BTHomeプロトコルを使用してセンサーをコーディング
- Home Assistantを設定
ステップ1 - CircuitPythonのインストール
CircuitPythonをインストールしましょう。
CircuitPythonにアクセスして、XIAO nRF52840 Sense用のバージョンをダウンロードします。 Downloadsを選択し、検索フィールドでXIAO nRF52840と入力を開始すると、結果にセンサーが表示されます。
次に、ダウンロードボタンを押してデバイス用のファイルを取得します。
.uf2ファイルが取得できるはずです。インストールするにはブートローダーモードに入る必要があります。XIAO nRF52840 Senseをコンピューターに接続し、リセットボタンを2回押します。
コンピューターにXIAO-SENSEという新しいドライブが表示されるはずです。
次に、ダウンロードしたファイルをドライブにコピーします。
しばらくすると、CIRCUITPYという名前の新しいドライブが表示されます。マイクロコントローラーにCircuitPythonがインストールされました。
ステップ2 - ライブラリのインストール
Grove Temperature & Humidity sensor V2.0(DHT20)を使用するには、 AdafruitのAHT20ライブラリが必要です。
前述のウェブサイトにはライブラリのインストール方法が記載されています。
インストール後、以下のファイルが必要です(これらはDHT20センサーに必要なファイルです):
ステップ3 - コードのアップロード
コードに進む前に、BTHomeとは何かを理解する必要があります。
BTHome
BTHomeは、Bluetooth Low Energy(BLE)を介してセンサーデータとボタン押下をブロードキャストするためのオープンスタンダードです。エネルギー効率が良く、柔軟で安全になるように設計されています。BTHomeはHome Assistantなどの人気のあるホームオートメーションプラットフォームで標準サポートされています。
BTHomeの利点:
- オープンスタンダードなので、異なるメーカーのデバイスが連携できます。
- デバイスはエネルギー効率が良く設計されているため、単一のバッテリーで長時間動作できます。
- データは暗号化されているため、不正アクセスから安全です。
- 柔軟なフォーマットなので、さまざまなセンサーデータとボタン押下の送信に使用できます。
BTHomeは、BLEを介してセンサーデータとボタン押下をブロードキャストするための汎用性があり強力なスタンダードです。スマートホームにセンサーデータとボタン押下を追加したい人にとって良い選択肢です。
詳細とデータフォーマットについては公式サイトで学ぶことができます。
コード
以下がCircuitPythonコードです。
クリックしてCircuitPythonコードをコピー
# BTHome with DHT20
# This code is based on the excelent code by Koen Vervloesem
# https://github.com/koenvervloesem/BTHome-Inertial-Sensor-in-CircuitPython
# We don't use deep sleep because it just doesn't work
# on the XIAO nRF52840 Sense. It's a pitty.
from _bleio import adapter
from time import sleep
import board
# for the Grove sensor
import adafruit_ahtx0
# The size of the name is important.
DEVICE_NAME = "XIAO nRF52840 Sense"
INTERVAL = 0.1
# Because this is delaying just 0.1s - 100 milliseconds, we don't need to read the sensor
# values everytime. It's overkill - let's just read every 5 minutes.
# Let's create a timer that will add every INTERVAL
# when it reaches 30 - it will be 5 minutes passed
# then we read the sensor
# INTERVAL * 60 seconds * 5 minutes
# CONVERTING 0.1ms to seconds * 60s * minutes = 300
MINUTES_PER_READING = 5
readTimer = INTERVAL * 10 * 60 * MINUTES_PER_READING
# convert the measurement value to the BTHome format
def value_to_little_endian (measurement):
# Calculate the integer value by dividing the temperature by the factor
integer_value = int(measurement / 0.01)
# Extract the lower and upper bytes for little-endian representation
lower_byte = integer_value & 0xFF
upper_byte = (integer_value >> 8) & 0xFF
# Reverse the order of the bytes
little_endian_bytes = bytes([upper_byte, lower_byte])
return little_endian_bytes
class BTHomeAdvertisement:
_ADV_FLAGS = [0x02, 0x01, 0x06]
_ADV_SVC_DATA = [0x0a, 0x16, 0xd2, 0xfc, 0x40, 0x02, 0x00, 0x00, 0x03, 0xbf, 0x13]
def _name2adv(self, local_name):
adv_element = bytearray([len(local_name) + 1, 0x09])
adv_element.extend(bytes(local_name, "utf-8"))
return adv_element
def __init__(self, local_name=None):
if local_name:
self.adv_local_name = self._name2adv(local_name)
else:
self.adv_local_name = self._name2adv(adapter.name)
def adv_data(self, temperature, humidity):
adv_data = bytearray(self._ADV_FLAGS)
adv_svc_data = bytearray(self._ADV_SVC_DATA)
# temperature
# change values according -
temp = value_to_little_endian (temperature)
# returned value is list
adv_svc_data[6] = temp[1]
adv_svc_data[7]= temp[0]
# humidity
# change values according -
hum = value_to_little_endian (humidity)
# returned value is list
adv_svc_data[9] = hum[1]
adv_svc_data[10]= hum[0]
adv_data.extend(adv_svc_data)
adv_data.extend(self.adv_local_name)
return adv_data
# BTHome
bthome = BTHomeAdvertisement(DEVICE_NAME)
# Create sensor object
sensor = adafruit_ahtx0.AHTx0(board.I2C())
# because we want a initial reading
# let's initialize with the readTimer variable
# so we force the script to read the values
currentTimer = 0
# inital reading
temp = sensor.temperature
hum = sensor.relative_humidity
#DEBUG
#print("\nTemperature: %0.1f C" % temp)
#print("Humidity: %0.1f %%" % hum)
while True:
adv_data = bthome.adv_data(temp,hum)
adapter.start_advertising(
adv_data, scan_response=None, connectable=False, interval=INTERVAL * 2
)
sleep(INTERVAL)
adapter.stop_advertising()
# increase currentTimer
currentTimer += INTERVAL
#print (f"Current timer: {currentTimer}")
if (currentTimer >= readTimer):
#print (f'Read new values')
# Read new values
temp = sensor.temperature
hum = sensor.relative_humidity
#reset counter
currentTimer = 0
code.py
として保存し、起動時に実行されるようにしてください。
コードの説明
- コードには説明のためのコメントが豊富に含まれています。
- 基本的に、0.2秒ごとにDHT20センサーから取得した温度と湿度をブロードキャストしています。
- センサーに負荷をかけて0.2秒ごとに値を読み取ることを避けるため、タイマーを設置しました。5分ごとにのみ値を読み取ります。この時間は
MINUTES_PER_READING
変数で制御されます。
ステップ4 - Home Assistantでデータを表示
ステップ4.1 - Home AssistantにXIAO nRF52840 Senseを追加
Home Assistantは、ホームオートメーション用の無料でオープンソースのソフトウェアです。ローカル制御とプライバシーに重点を置いたスマートホームデバイスの中央制御システムとして設計されています。
Home Assistantは、異なるデバイスとサービスを一箇所に統合し、それらをエンティティとして統合することで、中央スマートホームコントローラーハブとして機能します。提供されるルールベースの自動化システムにより、トリガーイベント、条件、アクションに基づいたカスタムルーチンの作成が可能で、スクリプトも含まれます。これらにより、自動化の構築、ホームセキュリティシステムのセキュリティアラームとビデオ監視のアラーム管理、エネルギー測定デバイスの監視が可能になります。
詳細については、公式サイトをご覧ください。
要件
重要な要件の一つは、HA(Home Assistant)がBluetoothを持っていることです。Raspberry PI上でHAを実行している場合、おそらく持っているでしょう。すべてはRPiのバージョンに依存します。
設定
「ステップ3 - コードのアップロード」で、XIAO nRF52840をコーディングしました。次のステップでは、HAが検出できるように実行されている必要があります。
HAのインストールを開きます。設定 -> デバイスとサービスに移動します
統合ページが表示されます。Bluetoothを選択します
統合が表示されるはずです。
注意: 何かが動作しない場合は、パッシブスキャンが選択されていないことを確認してください
統合ページに入ると、XIAO nRF52840 Senseが接続されている場合、すでに検出されてページに表示されるはずです。
「設定」を押してこの新しい統合を設定します。送信を押します。
この新しいセンサーを配置するエリアを選択するだけで完了です。
次に、再び設定 -> 統合に移動し、新しいBTHome統合を選択します
統合ページに移動します。1つのデバイスと3つのエンティティがあることがわかります。 エンティティは温度、湿度、信号強度です
エンティティをクリックすると、すべてを表示できる新しいページが表示されます。
代わりにデバイスを押すと、すべてのオプションと現在の値を含むデバイスページが表示されます。このページを使用して、ダッシュボードに追加できます。
「ダッシュボードに追加」を押すと、配置するビューを選択できます。
その後、カードのビューが表示されます。「ダッシュボードに追加」を押してダッシュボードに追加します。
ダッシュボードに移動すると、XIAO nRF52840 Senseによってブロードキャストされた温度と湿度を含む新しく追加されたカードが表示されます。
What's More - Deep Sleep Function
私はこれを動作させることができませんでした。もし解決策をお持ちの方がいらっしゃいましたら、コメントを残してください。GitHubでご意見をお聞かせください。
✨ Contributor Project
- このプロジェクトは、Seeed Studio Contributor Projectによってサポートされています。
- Brunoの努力に感謝し、あなたの作品は展示されます。
Tech Support & Product Discussion
私たちの製品をお選びいただき、ありがとうございます!私たちは、お客様の製品体験が可能な限りスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、複数のコミュニケーションチャンネルを提供しています。