NodejsでInkbird IBS-TH1 (BLE温湿度センサー) から温度湿度情報を得る


はじめに

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ヶ月以上駆動しています。