BIツール Domo & IoTでエネルギーコスト削減・センシング環境の構築編

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

アタラ BIツール導入コンサルティングサービス
※本記事は、アタラ合同会社 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('= 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でカード化する部分を簡単に紹介して締めくくりたいと思いますので、もう少しだけお付き合いください。


【BIツールで広告レポート作成をもっとラクに、簡単にしませんか?】

✓広告レポートのダッシュボードをBIツールで作りたい 
✓Googleアナリティクス 4(GA4)のダッシュボードをBIツールで作りたい 
✓広告、GA4、その他マーケティングデータをなかなかBIツールでに集められない 
✓KPIの設定やBIツールを使った効果的な可視化の方法について相談したい 
✓社内の知識を醸成するため、BIツールのトレーニングをしてほしい 
という方は、まずはライトな相談から
支援内容とお問い合わせはこちらをクリック

Related posts

Top