※本記事は、アタラ合同会社 Official noteにて連載中のコラム『BIツールで、働き方改革を実践してみた!』を転載したものです。
目次
前回までのおさらい
第1回、第2回では、エネルギーコスト削減のためにBIツールを使ったダッシュボードが有効だということと、実際にBIツールを使ったダッシュボードを構築する際のフローについて紹介しましたが、途中番外編と称してBLEセンサーから直接データを取得するのがどれくらい手間であるのかを説明したく、少し横道に逸れてしまいました(笑)。
気を取り直して、今回(第3回)はデータの取得方法をプログラムに置き換えて、プログラムを構築していきたいと思います。
※参考リンク:第1回・第2回・番外編
今回のやりたいこと
以下の処理をPythonで作ります。
1. センサーのデータをセンシングし、CSVファイルに出力します。
2. SFTPクライアントからSFTPサーバーに転送します。
事前準備
前回の番外編で紹介した「前提」までは手順が同じなので、今回は省略します。まずは、プログラムに必要な準備をしていきます。
開発に必要なパッケージをインストール
以下のコマンドを実行してください。
sudo apt update
sudo apt install libglib2.0-dev
pi@raspberrypi:~ $ sudo apt install libglib2.0-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
libblkid-dev libffi-dev libglib2.0-dev-bin libmount-dev libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5 libselinux1-dev libsepol1-dev
提案パッケージ:
libglib2.0-doc libgdk-pixbuf2.0-bin | libgdk-pixbuf2.0-dev libxml2-utils
以下のパッケージが新たにインストールされます:
libblkid-dev libffi-dev libglib2.0-dev libglib2.0-dev-bin libmount-dev libpcre16-3 libpcre3-dev libpcre32-3 libpcrecpp0v5
libselinux1-dev libsepol1-dev
.../10-libglib2.0-dev_2.58.3-2+deb10u2_armhf.deb を展開する準備をしています ...
libglib2.0-dev:armhf (2.58.3-2+deb10u2) を展開しています...
libpcrecpp0v5:armhf (2:8.39-12) を設定しています ...
libglib2.0-dev-bin (2.58.3-2+deb10u2) を設定しています ...
libblkid-dev:armhf (2.33.1-0.1) を設定しています ...
libpcre16-3:armhf (2:8.39-12) を設定しています ...
libsepol1-dev:armhf (2.8-1) を設定しています ...
libffi-dev:armhf (3.2.1-9) を設定しています ...
libpcre32-3:armhf (2:8.39-12) を設定しています ...
libmount-dev:armhf (2.33.1-0.1) を設定しています ...
libpcre3-dev:armhf (2:8.39-12) を設定しています ...
libselinux1-dev:armhf (2.8-1+b1) を設定しています ...
libglib2.0-dev:armhf (2.58.3-2+deb10u2) を設定しています ...
libglib2.0-0:armhf (2.58.3-2+deb10u2) のトリガを処理しています ...
libc-bin (2.28-10+rpi1) のトリガを処理しています ...
man-db (2.8.5-2) のトリガを処理しています ...
install-info (6.5.0.dfsg.1-4+b1) のトリガを処理しています ...
BLEデバイスを制御するためのライブラリをインストール
次に、以下のコマンドを実行してください。
sudo pip3 install bluepy
pi@raspberrypi:~ $ sudo pip3 install bluepy
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting bluepy
Downloading https://www.piwheels.org/simple/bluepy/bluepy-1.3.0-cp37-cp37m-linux_armv7l.whl (560kB)
100% |████████████████████████████████| 563kB 503kB/s
Installing collected packages: bluepy
The scripts blescan, sensortag and thingy52 are installed in '/home/pi/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed bluepy-1.3.0
サンプルプログラムの作成(センシング~CSV出力)
次に、前回の番外編でBLEセンサーのデータを取得し、電卓で計算していた部分と最終的にCSVファイルに出力するまでのサンプルプログラムを作成します。この内容を任意のファイル名で保存してください。例) sample01.py
from bluepy import btle
from datetime import datetime, timedelta
import struct
import csv
def get_env_usb_data(macaddr):
peripheral = btle.Peripheral(macaddr, addrType=btle.ADDR_TYPE_RANDOM)
characteristic = peripheral.readCharacteristic(0x0059)
(seq, temp, humid, light, press, noise, eTVOC, eCO2) = struct.unpack('
PERIPHERAL_MAC_ADDRESS = 'CD:DE:AB:02:35:29'
sensorValue = get_env_usb_data(PERIPHERAL_MAC_ADDRESS)
# デバイス名
deviceName = 'device01'
with open("/home/pi/work/IoT/{*************}.csv", "w", encoding="UTF-8") as f:
# ヘッダー部
fieldnames = ['DeviceName', 'Date', 'SensorType', 'Temperature', 'Humidity', 'Light', 'Pressure', 'Noise', 'eTVOC', 'eCO2']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
# データ部
writer.writerow(
{'DeviceName': deviceName, 'Date': str(date), 'SensorType': str(sensorValue['SensorType']), 'Temperature': str(sensorValue['Temperature']), 'Humidity': str(sensorValue['Humidity']), 'Light': str(sensorValue['Light']), 'Pressure': str(sensorValue['Pressure']), 'Noise': str(sensorValue['Noise']), 'eTVOC': str(sensorValue['eTVOC']), 'eCO2': str(sensorValue['eCO2'])}
)
作成したら、以下のコマンドで実行してみます。
python3 sample01.py
実行したら、*************.csv の内容を確認してみましょう。
※ 今回は最終的にDomoにアップロードすることを想定しているため、その場合はDomoの DataSet ID と同じファイル名にする必要があります。
DeviceName,Date,SensorType,Temperature,Humidity,Light,Pressure,Noise,eTVOC,eCO2
device01,2021-05-18 14:16:55.778416,Omron_USB_Env,28.97,68.6,82,996.961,41.85,276,1633
サンプルプログラムの作成(CSVアップロード)
ここからはアップロード方法の一つであるSFTPの部分を構築します。別のプログラムファイルで作成していきます。
まず、pythonでssh接続するためのモジュールをインストールするために、以下のコマンドを実行してください。
sudo pip3 install paramiko
pi@raspberrypi:~/work/sftp $ sudo pip3 install paramiko
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting paramiko
Downloading https://files.pythonhosted.org/packages/95/19/124e9287b43e6ff3ebb9cdea3e5e8e88475a873c05ccdf8b7e20d2c4201e/paramiko-2.7.2-py2.py3-none-any.whl (206kB)
100% |████████████████████████████████| 215kB 785kB/s
Collecting pynacl>=1.0.1 (from paramiko)
Downloading https://www.piwheels.org/simple/pynacl/PyNaCl-1.4.0-cp37-cp37m-linux_armv7l.whl (605kB)
100% |████████████████████████████████| 614kB 285kB/s
Requirement already satisfied: cryptography>=2.5 in /usr/lib/python3/dist-packages (from paramiko) (2.6.1)
Collecting bcrypt>=3.1.3 (from paramiko)
Downloading https://www.piwheels.org/simple/bcrypt/bcrypt-3.2.0-cp37-cp37m-linux_armv7l.whl (57kB)
100% |████████████████████████████████| 61kB 238kB/s
Requirement already satisfied: six in /usr/lib/python3/dist-packages (from pynacl>=1.0.1->paramiko) (1.12.0)
Collecting cffi>=1.4.1 (from pynacl>=1.0.1->paramiko)
Downloading https://www.piwheels.org/simple/cffi/cffi-1.14.4-cp37-cp37m-linux_armv7l.whl (346kB)
100% |████████████████████████████████| 348kB 310kB/s
Collecting pycparser (from cffi>=1.4.1->pynacl>=1.0.1->paramiko)
Downloading https://files.pythonhosted.org/packages/ae/e7/d9c3a176ca4b02024debf82342dab36efadfc5776f9c8db077e8f6e71821/pycparser-2.20-py2.py3-none-any.whl (112kB)
100% |████████████████████████████████| 112kB 1.8MB/s
Installing collected packages: pycparser, cffi, pynacl, bcrypt, paramiko
Successfully installed bcrypt-3.2.0 cffi-1.14.4 paramiko-2.7.2 pycparser-2.20 pynacl-1.4.0
以下はSFTPでアップロードする部分のサンプルプログラムです。この内容を任意のファイル名で保存してください。例)sample02.py
import paramiko
import os
DIR = '/home/pi/work/IoT/'
CSV = '/{*************}.csv'
HOST = {'Domoのインポート用URL'}
PORT = {'ポート番号'}
USER = {'ユーザーID'}
KEY_FILE = DIR + '/.ssh/****.pem' # Domoで発行したキーファイルを指定する
rsa_key = paramiko.RSAKey.from_private_key_file(KEY_FILE)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(HOST, PORT, USER, pkey=rsa_key)
try:
sftp_connection = ssh.open_sftp()
sftp_connection.put(DIR + CSV, CSV)
finally:
sftp_connection.close()
ssh.close()
os.remove(DIR + CSV)
作成したら、以下のコマンドで実行してみます。
python3 sample02.py
実行完了したら、問題なくDomoに取り込まれていることを確認してください。あとは自動化することでセンサー側の構築は終了です。
次回はついに最終回となります。最終回(第4回)では、Domoでカード化する部分を簡単に紹介して締めくくりたいと思いますので、もう少しだけお付き合いください。