7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

BME280 のデータをM5Stackを使ってPower BI ストリーミングデータセットに投げてみる

Posted at

今回の投稿背景

IoT関連がおざなりになってたので
最近Power BIのストリーミングデータセットにはまってたのもあって
冬休みの宿題して試してみました。

BME280とは?

温度・湿度・気圧データを取得する環境センサーです。
amazonさんなどで購入できます。

これをつかってどうしたの?

M5Stackに繋げて Power BI ストリーミングデータセットに送信しました。

作り方

Power BI

センサーデータを格納するためのストリーミングデータセット及び
データ表示用のダッシュボードを作成します。
ここでは手順のみを記載しています。
詳しく知りたい方は
@yugoes1021 さんのこちらの記事をぜひご確認ください。
Power BI で動くグラフを表示するには?~ストリーミングデータセット~

  1. ダッシュボードを作成する
    image.png
    image.png
  2. ストリーミングデータセットを作成する

・タイルの追加をクリックする
image.png
・カスタムストリーミングデータをクリックし次へをクリックする
image.png
・ストリーミングデータセットの追加をクリックする
image.png
・APIを選択して次へをクリックする
image.png
・新しいストリーミングデータセットの画面が出てくる
image.png
 ↓センサーデータを格納するために以下のように設定し作成をクリックする
image.png
※履歴データの解析をオンにすることで、Power BIレポートで使用可能になる。
・作成したストリーミングデータセットに送信するURLが出力されるので控えておく
image.png
3. ダッシュボードにタイルを追加する

・タイルの追加をクリックする
image.png
・カスタムストリーミングデータをクリックし次へをクリックする
image.png
・先ほど作ったストリーミングデータセットを選択し、次へをクリックする
image.png
・カスタムストリーミングデータタイルの追加画面が出てくるので、表示させたいタイルに合わせて視覚化タイプとフィールドを設定してタイルを追加する
 ↓視覚化タイプ(カード)の場合
image.png
 ↓視覚化タイプ(折れ線グラフ)の場合
image.png
・ダッシュボード例
image.png

M5Stack

M5Stackには以下リンク先のファームウェアが入っていることが前提です。
GitHub:0x1abin:M5Stack/M5Cloud

インストールの仕方は、@inachi さんのこちらの記事を参照ください。
M5stackでMicroPythonを使えるようにする

配線図

このような構成にします。
image.png

BME280のドライバ

こちらのドライバを使用します。
GitHub:dragomirecky:mpy_bme280_esp8266/bme280.py

実行用スクリプト

私が作成した以下のスクリプトを使用します。
GitHubにも公開していますので是非ご利用ください。
GitHub:rnakamuramartiny:M5Stack_Python/BMP280_Post_PowerBI_StreamDataSet.py

main.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上にデータが送信されるようになります。

ダッシュボードを確認してみる

こんな感じでデータがリアルタイムで更新されていればうまく動作しています
image.png

しかし・・・

実はこのスクリプト
Micropythonのメモリが枯渇し、ガベージコレクションが行われるタイミングで
M5Stackの強制リブートが発生してしまいます。

いろいろスクリプトを改修してみたのですが、うまくいかず・・・
Power BIへの送信をしないようにすると正常にガベージコレクションが動作し
強制リセットが発生しないのですが・・・
とりあえず放置かな・・・(笑)

ちょっと消化不良ですが今日はこの辺で!

7
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?