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

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

# BME280とは？
温度・湿度・気圧データを取得する環境センサーです。
amazonさんなどで購入できます。
<div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B01M98R905/rtanm-22/ref=nosim/" name="amazletlink" target="_blank"><img src="https://images-fe.ssl-images-amazon.com/images/I/41DWIpl2nSL._SL160_.jpg" alt="HiLetgo® BME280 温度 センサー 湿度 センサー 気圧 センサー Arduino センサー 大気圧センサ 温湿度センサー ブレイクアウト Arduinoに対応 [並行輸入品]" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B01M98R905/rtanm-22/ref=nosim/" name="amazletlink" target="_blank">HiLetgo® BME280 温度 センサー 湿度 センサー 気圧 センサー Arduino センサー 大気圧センサ 温湿度センサー ブレイクアウト Arduinoに対応 [並行輸入品]</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/" title="amazlet" target="_blank">amazlet</a> at 19.01.08</div></div><div class="amazlet-detail">HiLetgo <br />売り上げランキング: 830<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/B01M98R905/rtanm-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jpで詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div>

# これをつかってどうしたの？
M5Stackに繋げて　Power BI ストリーミングデータセットに送信しました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">センサーデータを<a href="https://twitter.com/hashtag/PowerBI?src=hash&amp;ref_src=twsrc%5Etfw">#PowerBI</a> に投げてみたぞ！<br>ストリーミングデータセット<br>ホント楽しい（笑） <a href="https://t.co/qEDMondnAH">pic.twitter.com/qEDMondnAH</a></p>&mdash; りなたむ@steed400 (@R_t_A_n_M) <a href="https://twitter.com/R_t_A_n_M/status/1081491828464005120?ref_src=twsrc%5Etfw">January 5, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

# 作り方
## Power BI
センサーデータを格納するためのストリーミングデータセット及び
データ表示用のダッシュボードを作成します。
ここでは手順のみを記載しています。
詳しく知りたい方は
@yugoes1021 さんのこちらの記事をぜひご確認ください。
[Power BI で動くグラフを表示するには？～ストリーミングデータセット～](https://qiita.com/yugoes1021/items/1b87a7205e6c659a9604)

1. ダッシュボードを作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/9f95daba-4898-1d8a-fd01-7a5f71cebef0.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/2618067e-816e-41fb-1f16-1abc05a46f58.png)
2. ストリーミングデータセットを作成する

・タイルの追加をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/b40a3750-d499-0bc3-a8e0-7f2acd406ba1.png)
・カスタムストリーミングデータをクリックし次へをクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/f3f268c7-05d9-1726-6f96-525885f976ab.png)
・ストリーミングデータセットの追加をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/7e0e3272-cb00-d5f5-ac22-a491990330ca.png)
・APIを選択して次へをクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/34f6fc7c-6f00-0ed3-981e-4a522e4526aa.png)
・新しいストリーミングデータセットの画面が出てくる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/3bb26930-95fa-252b-f5f5-bc2244b1184b.png)
　↓センサーデータを格納するために以下のように設定し作成をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/6093718f-1310-a055-b077-cd168f8ac0a2.png)
※履歴データの解析をオンにすることで、Power BIレポートで使用可能になる。
・作成したストリーミングデータセットに送信するURLが出力されるので控えておく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/23b3f552-3afc-6914-aad3-cf46eefa2599.png)
3. ダッシュボードにタイルを追加する

・タイルの追加をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/96638aaf-15d0-797b-cef9-369433ccd5cf.png)
・カスタムストリーミングデータをクリックし次へをクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/11967c9e-929f-d792-aaba-a8accb7d4d95.png)
・先ほど作ったストリーミングデータセットを選択し、次へをクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/cd01705d-0355-ac8c-f98a-e6d829c78e02.png)
・カスタムストリーミングデータタイルの追加画面が出てくるので、表示させたいタイルに合わせて視覚化タイプとフィールドを設定してタイルを追加する
　↓視覚化タイプ（カード）の場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/fbdf69f5-dc29-90e0-64ea-312cf0c73f06.png)
　↓視覚化タイプ（折れ線グラフ）の場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/d5424077-9418-73b8-809a-f9970afbf5cc.png)
・ダッシュボード例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/0f82942b-fbe4-f757-453d-bc54894e256b.png)

## M5Stack
M5Stackには以下リンク先のファームウェアが入っていることが前提です。
[GitHub:0x1abin:M5Stack/M5Cloud](https://github.com/m5stack/M5Cloud/tree/master/firmwares)

インストールの仕方は、@inachi さんのこちらの記事を参照ください。
[M5stackでMicroPythonを使えるようにする](https://qiita.com/inachi/items/d23b9e39551836cddb09)

### 配線図
このような構成にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269159/d2fa9123-84bd-896c-8492-58b05cb59fe2.png)

### BME280のドライバ
こちらのドライバを使用します。
[GitHub:dragomirecky:mpy_bme280_esp8266/bme280.py](https://github.com/catdog2/mpy_bme280_esp8266/blob/master/bme280.py)

### 実行用スクリプト
私が作成した以下のスクリプトを使用します。
GitHubにも公開していますので是非ご利用ください。
[GitHub:rnakamuramartiny:M5Stack_Python/BMP280_Post_PowerBI_StreamDataSet.py](https://github.com/rnakamuramartiny/M5Stack_Python/blob/master/BMP280_Post_PowerBI_StreamDataSet)

```Python: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](https://qiita-image-store.s3.amazonaws.com/0/269159/042ef665-27f0-d237-a92a-fe14fda48fec.png)

# しかし・・・
実はこのスクリプト
Micropythonのメモリが枯渇し、ガベージコレクションが行われるタイミングで
M5Stackの強制リブートが発生してしまいます。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">うーん。。。<br>urequests でデータを <a href="https://twitter.com/hashtag/PowerBI?src=hash&amp;ref_src=twsrc%5Etfw">#PowerBI</a> に投げるとヒープメモリ食い尽くして強制リセットされるなぁ。。。<br>なんでやろ。。。 <a href="https://t.co/pVnPztMl1B">pic.twitter.com/pVnPztMl1B</a></p>&mdash; りなたむ@steed400 (@R_t_A_n_M) <a href="https://twitter.com/R_t_A_n_M/status/1081580493882089472?ref_src=twsrc%5Etfw">January 5, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

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

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