3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Raspberry Pi+RubyでSwitchBotから温度湿度を受信する

Last updated at Posted at 2021-02-14

実装例

SwitchBot 温湿度計の測定値を BLE Advertisement パケットから直接読み取るを参考に実装。

scan_beacon01.rb
require 'scan_beacon'
scanner = ScanBeacon::DefaultScanner.new

scanner.each_advertisement{|ad_data,mac,rssi,ad_type|
  if mac == "xx:xx:xx:xx:xx:xx" and ad_type == 213 # MACアドレスを事前に調べておく
    t2 = ad_data[16].unpack("C*")[0] & 0b00001111
    t1 = ad_data[17].unpack("C*")[0] & 0b01111111
    temperature = t1 + t2/10.0
    humidity = ad_data[18].unpack("C*")[0]& 0b01111111
    puts [temperature,humidity].join("\t")
  end
}

事前準備

  • SwitchBotの温湿度計のMACアドレスを調べる
    MACアドレスはスマホのアプリの設定画面で確認できる。
  • hciuartサービスを起動する
sudo systemctl start hciuart

実行

$ sudo ruby scan_beacon01.ruby
21.8    58
21.8    58

補足

方式の検討

SwitchBotの温湿度計から温度/湿度を受信するには、Pythonだと公式ライブラリが使えるがRubyだとそれが無い。
SwitchBotの温湿度計は仕組み的にはBLEのAdvertisingが使われており、一昔前に少し流行ったBeacon関連の先駆者の実装や記事が参考にできる。

方式 実現性 コスト 補足
scan_beacon gem
hcidumpをパース
Bluez API × Ruby以外に低レイヤの実装が必要そう
D-Bus 実現性が不明。D-BusでBLEのAdvertiingを扱えるのか不明
rfcommでBluetoothをdevにマッピングさせる 実現性が不明。rfcommとBLE Advertisingが合わない?

今回は、scan_beacon gem を利用した。

Raspberry Pi zeroでBluetoothのscanをするとWifiが切れる事が有るので注意

Raspberry Pi zeroのwifiは5GHzに対応しておらず2.4GHzしか使えない。
またBluetoothのscanは強い電波を発するためWifiの2.4GHzと干渉し繋がらなくなる場合が有る。
Raspberry Pi zeroでBluetoothのscanをする際には、PCからRaspberryPiへの接続にはGPIO等のwifi以外の接続方法を利用するのが望ましい。
ただし今回の記事の範囲ではscan動作は行わないので2.4GHzのWifiでのRaspberry Pi zeroの利用に問題は無い。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?