はじめに
この記事はInkbird IBS-TH1の値をRaspberryPiでロギングを参考に BeagleBone Black で動かした時の記録です。
使用機材
- Inkbird IBS-TH1PLUS( https://amzn.to/3P15mLc )
- PLANEX BT-Micro4 (BlueTooth USBアダプタ https://amzn.to/3Ox1EHB)
- BeagleBone Black rev.A5A
- BeagleBone Black OSイメージ(https://debian.beagle.cc/images/bone-eMMC-flasher-debian-10.3-console-armhf-2020-04-06-1gb.img.xz)
1.BeagleBone Black で Inkbird のセンサ値を取得
BeagleBone Blackにbluepyをインストール
bluepy を使うのでインストールします。
sudo apt-get install libglib2.0-dev python3-venv python3-pip
pip3 install bluepy
BLEの動作確認として、以下のコマンドを実行してエラーが出なければOK
sudo hcitool lescan
センサ値取得スクリプトの作成
参考記事からセンサ値取得のスクリプトを作成します。
from bluepy import btle
import struct
def get_ibsth1_data(macaddr):
peripheral = btle.Peripheral(macaddr)
characteristic = peripheral.readCharacteristic(0x2d)
(temp, humid, unknown1, unknown2, unknown3) = struct.unpack('<hhBBB', characteristic)
sensorValue = {
'Temperature': temp / 100,
'Humidity': humid / 100,
'unknown1': unknown1,
'unknown2': unknown2,
'unknown3': unknown3,
}
return sensorValue
参考記事のhandleは0x28ですが、Inkbird IBS-TH1PLUS のhandle は0x2dなので修正します。
メインスクリプトの作成
センサ値取得スクリプトを呼び出すため、メインスクリプトを作成します。
from bluepy import btle
import inkbird_ibsth1_connect
# InkBird MAC ADDRESS
PERIPHERAL_MAC_ADDRESS = '**:**:**:**:**:**'
sensorValue = inkbird_ibsth1_connect.get_ibsth1_data(PERIPHERAL_MAC_ADDRESS)
print(sensorValue['Temperature'])
MACアドレスはInkBirdの公式アプリで確認してスクリプトに入力したら、コンソールから実行します。
$ python3 inkbird_toSpreadSheet.py
27.07
InkBird の温度と同じであれば動作確認完了です。
2.BeagleBone Blackからスプレッドシートにセンサ値を書き込み
スプレッドシートにセンサ値を書き込むGASスクリプトをWebAppとして公開
参考記事を元にスプレッドシートのIDを入力しないように修正したものが以下になります。
var book = SpreadsheetApp.getActiveSpreadsheet();
//Postされたデータを受け取り
function doPost(e){
var data = [
e.parameter.Date_Master, // マスター日時
e.parameter.Date, // 測定日時
e.parameter.Temperature, // 気温
e.parameter.Humidity, // 湿度
e.parameter.Light, // 照度
e.parameter.UV, // UV
e.parameter.Pressure, // 圧力
e.parameter.Noise, // 騒音
e.parameter.BatteryVoltage, // 電池電圧
new Date(), // アップロード終了時刻
];
//取得したデータをログに記載
Logger.log(new Date());
//スプレッドシートへのデータ行書き込み
addData(e.parameter.DeviceName, data);
return ContentService.createTextOutput("ok");
}
//スプレッドシートへのデータ行書き込み
function addData(sheetName, data){
var sheet = book.getSheetByName(sheetName);
sheet.appendRow(data);
}
WebAppへPOSTするスクリプトの作成
BeagleBone BlackへRequestライブラリをインストールします。
pip3 install requests
参考記事を元に、持ってないセンサ値は無しに変更したものが以下になります。
from datetime import datetime, timedelta
from bluepy import btle
import inkbird_ibsth1_connect
import requests
# InkBird MAC ADDRESS
PERIPHERAL_MAC_ADDRESS = '**:**:**:**:**:**'
# GAS WebAPP URL
WEB_APP_URL = 'https://script.google.com/macros/s/******/exec'
# Google SpreadSheet Sheetname
deviceName = '*******'
# ----
#現在時刻を取得
date = datetime.today()
#現在時刻を分単位で丸める
masterDate = date.replace(second=0, microsecond=0)
if date.second >= 30:
masterDate += timedelta(minutes=1)
#センサ値取得
sensorValue = inkbird_ibsth1_connect.get_ibsth1_data(PERIPHERAL_MAC_ADDRESS)
#Googleスプレッドシートにアップロードする処理
data = {
'DeviceName': deviceName,
'Date_Master': str(masterDate),
'Date': str(date),
'SensorType': '',
'Temperature': str(sensorValue['Temperature']),
'Humidity': str(sensorValue['Humidity']),
'Light': '',
'UV': '',
'Pressure': '',
'Noise': '',
'BatteryVoltage': ''
}
response = requests.post( WEB_APP_URL, data=data)
PERIPHERAL_MAC_ADDRESS へ InkbirdのMACアドレスを、
WEB_APP_URL へ GASのWebAPPのUrl を、
deviceName へ Googleスプレッドシートのシート名を、それぞれ入力します。
その後、以下のコマンドを実行してスプレッドシートに値が書き込まれていたら動作確認完了です。
python3 omron_env_toSpreadSheet.py
3.BeagleBone Black でスケジュール実行
cronは有効になってるので、cronでスケジュール実行させるだけです。
cronで指定した時間がすぎて、スプレッドシートに値が書き込まれていたら動作確認完了です。
その他
BeagleBone BlackのLED、暗闇だとチカチカして寝れないので消しておきます。
echo none > /sys/class/leds/beaglebone:green:usr0/trigger