Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

今回の投稿背景

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への送信をしないようにすると正常にガベージコレクションが動作し
強制リセットが発生しないのですが・・・
とりあえず放置かな・・・(笑)

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした