【連載】BIツールで、働き方改革を実践してみた! 第3回:Domo&IoTで、エネルギーコスト削減・センシング環境の構築編

※本記事は、アタラ合同会社 Official noteにて連載中のコラム『BIツールで、働き方改革を実践してみた!』を転載したものです。

目次

・前回までのおさらい
・今回のやりたいこと
・事前準備
・サンプルプログラムの作成(センシング~CSV出力)
・サンプルプログラムの作成(CSVアップロード)




前回までのおさらい

第1回、第2回では、エネルギーコスト削減のためにダッシュボードが有効だということと、実際にダッシュボードを構築する際のフローについて紹介しましたが、途中番外編と称してBLEセンサーから直接データを取得するのがどれくらい手間であるのかを説明したく、少し横道に逸れてしまいました(笑)。


気を取り直して、今回(第3回)はデータの取得方法をプログラムに置き換えて、プログラムを構築していきたいと思います。


※参考リンク:第1回・第2回・番外編

※本記事は、アタラ合同会社 Official noteにて連載中のコラム『BIツールで、働き方改革を実践してみた!』を転載したものです。目次・働き方改革で注目されるスマートオ...

※本記事は、アタラ合同会社 Official noteにて連載中のコラム『BIツールで、働き方改革を実践してみた!』を転載したものです。目次・前回のおさらい・実際に環境を作っ...

※本記事は、アタラ合同会社 Official noteにて連載中のコラム『BIツールで、働き方改革を実践してみた!』を転載したものです。目次・今回は番外編で、センサーの中を覗...




今回のやりたいこと

以下の処理を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('= 30:

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でカード化する部分を簡単に紹介して締めくくりたいと思いますので、もう少しだけお付き合いください。




著者

Related posts

Top