はじめに
Bluetooth(BLE)で飛ばせる温度計としてAmazonで売ってるInkbird IBS-TH1 mini のデータを、RasberryPIからnodejsを使って読み取ってみました。
開発環境
- Central: Rasberry Pi3 B+ (Raspbian)
- Peripheral: Inkbird IBS-TH1 mini
- nodejs: v8.15.0 + noble
データフォーマット
こちら参照しました。9バイトのデータが送られてきており、1,2バイトが温度、3,4バイトが湿度データ、8バイト目がバッテリー残量のようです。
コード
inkbird.js
const INKBIRD_ADDR = 'xx:xx:xx:xx:xx:xx'; //IBS-TH1のアドレス
const INTERVAL = 5 * 60 * 1000; //5分おきにスキャン
var noble = require('noble');
noble.on('stateChange', function(state) {
if (state === 'poweredOn') {
noble.startScanning();
} else {
noble.stopScanning();
}
});
noble.on('scanStart', function() {
console.log('scanStart');
});
noble.on('scanStop', function() {
console.log('scanStop');
});
noble.on('discover', function(peripheral) {
var buf = peripheral.advertisement.manufacturerData;
if( peripheral.address == INKBIRD_ADDR){
var t = buf.readInt16LE(0) / 100;
var h = buf.readInt16LE(2) / 100;
var b = buf[7];
console.log('[discover IBS-TH1] temp:' + t + ' degree, humidity:' + h + '%, battery:' + b + '%\n');
noble.stopScanning();
}
});
setInterval(function() {
console.log('Start scanning..');
noble.startScanning();
}, INTERVAL);
実行
$ sudo node inkbird.js
scanStart
[discover IBS-TH1] temp:16.47 degree, humidity:45.78%, battery:14%
scanStop
現在は冷蔵庫内の温度記録に使っています。冷蔵庫内からRaspberryPIまで10mほどありますが、問題なく受信できています。
終わりに
本体内蔵のデータロガーを使うとバッテリー消耗が早いようなので、あらかじめスマホアプリでデータログ間隔を最長の30分に設定しておくとよいようです。CR2032で1ヶ月以上駆動しています。