見出し画像

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

◇前回までのおさらい

第1回、第2回では、エネルギーコスト削減のためにダッシュボードが有効だということと、実際にダッシュボードを構築する際のフローについて紹介しましたが、途中番外編と称して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('<Bhhhlhhh', characteristic)
  
  sensorValue = {'SensorType': 'Omron_USB_Env', 'Temperature': temp / 100, 'Humidity': humid / 100, 'Light': light, 'Pressure': press / 1000, 'Noise': noise / 100, 'eTVOC': eTVOC, 'eCO2': eCO2 }
  return sensorValue
  
date = datetime.today()

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

画像1


▼アタラメンバーのプロフィールをチェックする▼

▼児玉さんがUnyoo.jpで書いた記事をチェックする▼



この記事が参加している募集

私の仕事

企業のデジタルマーケティングの自走化を支援するアタラ合同会社の公式noteです。アタラでの働き方やどんな社風なのか、デジタルマーケティングに関するTipsなどをご紹介します!