今回の投稿背景
IoT関連がおざなりになってたので
最近Power BIのストリーミングデータセットにはまってたのもあって
冬休みの宿題して試してみました。
BME280とは?
温度・湿度・気圧データを取得する環境センサーです。
amazonさんなどで購入できます。
売り上げランキング: 830
これをつかってどうしたの?
M5Stackに繋げて Power BI ストリーミングデータセットに送信しました。
センサーデータを#PowerBI に投げてみたぞ!
— りなたむ@steed400 (@R_t_A_n_M) January 5, 2019
ストリーミングデータセット
ホント楽しい(笑) pic.twitter.com/qEDMondnAH
作り方
Power BI
センサーデータを格納するためのストリーミングデータセット及び
データ表示用のダッシュボードを作成します。
ここでは手順のみを記載しています。
詳しく知りたい方は
@yugoes1021 さんのこちらの記事をぜひご確認ください。
Power BI で動くグラフを表示するには?~ストリーミングデータセット~
・タイルの追加をクリックする
・カスタムストリーミングデータをクリックし次へをクリックする
・ストリーミングデータセットの追加をクリックする
・APIを選択して次へをクリックする
・新しいストリーミングデータセットの画面が出てくる
↓センサーデータを格納するために以下のように設定し作成をクリックする
※履歴データの解析をオンにすることで、Power BIレポートで使用可能になる。
・作成したストリーミングデータセットに送信するURLが出力されるので控えておく
3. ダッシュボードにタイルを追加する
・タイルの追加をクリックする
・カスタムストリーミングデータをクリックし次へをクリックする
・先ほど作ったストリーミングデータセットを選択し、次へをクリックする
・カスタムストリーミングデータタイルの追加画面が出てくるので、表示させたいタイルに合わせて視覚化タイプとフィールドを設定してタイルを追加する
↓視覚化タイプ(カード)の場合
↓視覚化タイプ(折れ線グラフ)の場合
・ダッシュボード例
M5Stack
M5Stackには以下リンク先のファームウェアが入っていることが前提です。
GitHub:0x1abin:M5Stack/M5Cloud
インストールの仕方は、@inachi さんのこちらの記事を参照ください。
M5stackでMicroPythonを使えるようにする
配線図
BME280のドライバ
こちらのドライバを使用します。
GitHub:dragomirecky:mpy_bme280_esp8266/bme280.py
実行用スクリプト
私が作成した以下のスクリプトを使用します。
GitHubにも公開していますので是非ご利用ください。
GitHub:rnakamuramartiny:M5Stack_Python/BMP280_Post_PowerBI_StreamDataSet.py
from m5stack import *
import machine
import bme280
import time
import ujson
import urequests
import sys
lcd.setCursor(0, 0)
lcd.setColor(lcd.WHITE)
lcd.font(lcd.FONT_DejaVu24)
lcd.clear()
i2c = machine.I2C(scl=machine.Pin(2), sda=machine.Pin(5),freq=10000)
rtc = machine.RTC()
sys.tz ('UTC')
rtc.ntp_sync('ntp.nict.jp', update_period=3600)
for i in range(100):
if rtc.synced():
print('ntp synced.')
lcd.print('ntp synced.',10,10)
lcd.clear()
break
print(i, end=' ')
time.sleep_ms(10)
class sensordata:
def __init__(self):
# Power BI ストリーミングデータセットのURLを入れる
self.posturl = ''
def timeset(self):
timedata = rtc.now()
prm_year = '{:0=4}'.format(timedata[0])
prm_month = '{:0=2}'.format(timedata[1])
prm_day = '{:0=2}'.format(timedata[2])
prm_hour = '{:0=2}'.format(timedata[3])
prm_minute = '{:0=2}'.format(timedata[4])
prm_second = '{:0=2}'.format(timedata[5])
self.datetime = prm_year + "-" \
+ prm_month + "-" \
+ prm_day + "T" \
+ prm_hour + ":" \
+ prm_minute + ":" \
+ prm_second + "Z"
def bme280(self):
bme280sensor = bme280.BME280(i2c=i2c)
sensordata = bme280sensor.values
self.temp = sensordata[0]
self.humi = sensordata[2]
self.pres = sensordata[1]
def display(self):
lcd.print(self.temp,10,10)
lcd.print(self.humi,10,30)
lcd.print(self.pres,10,50)
lcd.print(self.datetime,10,90)
def postpowerbi(self):
pbheaders = {
'Content-Type' :'application/json'
}
body = [
{
"datetime" : self.datetime,
"temp" : float(self.temp),
"humi" : float(self.humi),
"pres" : float(self.pres)
}
]
body_json = ujson.dumps(body).encode("utf-8")
res = urequests.post(
self.posturl,
data=body_json,
headers=pbheaders
)
res.close()
del res
del body
del body_json
del pbheaders
sensor = sensordata()
while True:
sensor.timeset()
sensor.bme280()
sensor.display()
sensor.postpowerbi()
time.sleep(10)
これとドライバをM5StackにインストールすることでPower BI上にデータが送信されるようになります。
ダッシュボードを確認してみる
こんな感じでデータがリアルタイムで更新されていればうまく動作しています
しかし・・・
実はこのスクリプト
Micropythonのメモリが枯渇し、ガベージコレクションが行われるタイミングで
M5Stackの強制リブートが発生してしまいます。
うーん。。。
— りなたむ@steed400 (@R_t_A_n_M) January 5, 2019
urequests でデータを #PowerBI に投げるとヒープメモリ食い尽くして強制リセットされるなぁ。。。
なんでやろ。。。 pic.twitter.com/pVnPztMl1B
いろいろスクリプトを改修してみたのですが、うまくいかず・・・
Power BIへの送信をしないようにすると正常にガベージコレクションが動作し
強制リセットが発生しないのですが・・・
とりあえず放置かな・・・(笑)
ちょっと消化不良ですが今日はこの辺で!