見出し画像

twBlueScan v2.3.0でSwitchBotの人感センサーに対応した

今朝は5時から開発開始です。助手の猫さんは後から起きてきました。ご飯を食べたあと、また、やってきて少しあまえてから寝ました。

12月に買ったSwitchBotの人感センサー

の情報を取得する方法がようやくわかりました。
Bluetooth通信の仕様は

https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/motionsensor.md

のページの

です。1ヶ月前からBluetooth通信のデータをログに出力して探していたのですが見つかられないままでした。仕様をよく見直してSCAN_RSPのデータだけ詳しく見られるようにログの出力を変更して、やっと見つけることができました。

2024-01-29T11:51:06.062 new scan rsp=&{Type:Scan response Address:d7:bb:ea:e7:cf:58 Rssi:-48 
Data:[Service Data : 0x3dfd 73 00 e4 0622 02]}

見つけた時は、かなり嬉しかったです。Service Dataのところにちゃんとありました。73がSという文字で、仕様書のByte0です。動作を検知した場合は、その次のデータのbit6が変化するはずです。試しに動いてみると検知しました。

		case hci.AdServiceData:
			if len(a.Data) == 8 && a.Data[0] == 0 && a.Data[1] == 0x0d && a.Data[2] == 0x54 {
				d.EnvData = a.Data[:]
			} else if r.Type == hci.ScanRsp && len(a.Data) == 8 && a.Data[0] == 0x3d &&
				a.Data[1] == 0xfd && a.Data[2] == 0x73 {
				// Motion Sensor Broadcast
				// Data:[Service Data : 0x3dfd7300e4062202]}
				// https://github.com/OpenWonderLabs/SwitchBotAPI-BLE/blob/latest/devicetypes/motionsensor.md#motion-sensor-broadcast-message
				t := int64(a.Data[5])*256 + int64(a.Data[6])
				if a.Data[7]&0x80 == 0x80 {
					t += 0x10000
				}
				m := a.Data[3]&0x40 == 0x40
				l := a.Data[7]&0x02 == 0x02
				addr := r.Address.String()
				if v, ok := motionSensorMap.Load(addr); ok {
					if ms, ok := v.(*MotionSensorEnt); ok {
						send := ms.Moving != m
						ms.Battery = int(a.Data[4])
						ms.LastMove = time.Now().Unix() - t
						ms.Light = l
						ms.Moving = m
						ms.LastMoveDiff = t
						if send {
							sendMotionSensor(ms, "change")
						}
					}
				} else {
					ms := &MotionSensorEnt{
						Address:  addr,
						Moving:   m,
						LastMove: time.Now().Unix() - t,
						Light:    l,
						Battery:  int(a.Data[4]),
					}
					motionSensorMap.Store(addr, ms)
					sendMotionSensor(ms, "new")
				}
			} else {

のように対応して、syslog

2024/01/31 06:00:12.428 info:local5 twBlueScan type=SwitchBotMotionSensor,address=d7:bb:ea:e7:cf:58,moving=true,event=change,lastMoveDiff=0,lastMove=2024-01-31T06:00:12+09:00,battery=228,light=true

のようなログを送信するようにしました。動くものの検知、検知してした時刻、電池の残量、明暗の情報が取得できます。
昨日から動かしてみると

8時過ぎの寝る前に開発部屋に入ったのが緑の矢印、5時頃起きて開発開始したのが、黄色の矢印です。2時ぐらいに謎の赤い矢印があります。明暗のセンサーで明るい時の条件で検索すると

です。2時ぐらいは暗いままです。ログを詳しく調べると

2024/01/31 02:12:06.307 info:local5 twBlueScan type=SwitchBotMotionSensor,address=d7:bb:ea:e7:cf:58,moving=true,event=change,lastMoveDiff=0,lastMove=2024-01-31T02:12:06+09:00,battery=228,light=false

たしかに、暗い中、何者かが私の開発部屋で動いたようです。
たぶん、助手の猫さんが夜中の見回りでもしたのでしょう

これまで、SwitchBotシリーズの

に対応しました。いずれも、電池をいれるか、接続するだけで検知できるはずです。
twBlueScanの実行ファイルは、TWSNMP FCのLinux版を次回リリースする時に更新します。
ソースコードは

です。

明日に続く



開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。