MicroPythonなM5StackからSORACOM HarvestのPublish APIでデータを入れる最小手順

[M5Stack](https://www.switch-science.com/catalog/3647/) を手に入れました。手っ取り早くデータの可視化を行うサービスとして SORACOM Harvest を使ってみた記録です。

Wi-Fi経由で入れられるので便利でした。

![42369947_10214984468458262_5279742085098897408_o.jpg](https://qiita-image-store.s3.amazonaws.com/0/22754/a15a9c41-b94b-c0bf-af20-4d691702c234.jpeg)

## 論よりコード

コード上の `SORACOM_INVENTORY_DEVICE_ID` と `SORACOM_INVENTORY_SECRET_KEY` の入手方法は [SORACOM Harvest の Publish API](#h) を見てください。

```python
SORACOM_INVENTORY_DEVICE_ID = ''
SORACOM_INVENTORY_SECRET_KEY = ''

import urequests
data = '{"dummy": 10}'
headers = {'x-device-secret': SORACOM_INVENTORY_SECRET_KEY, 'content-type', 'application/json'}
url = 'https://api.soracom.io/v1/devices/%s/publish' % SORACOM_INVENTORY_DEVICE_ID
resp = urequests.post(url, data=data, headers=headers)

from m5stack import lcd
lcd.clear()
lcd.setCursor(0, 0)
lcd.println(str(resp.status_code))
lcd.println(resp.text)
lcd.println("_END_")
```

### 解説

* urequest を使って HTTP(S) POST を SORACOM Harvest の Publish API に向かって行っています
* 結果が `resp` に格納されているので M5Stack の LCD に表示しています

## 手順

* M5Cloud (M5Stack Web IDE) を利用できるファームウェアを M5Stack に書き込む
* SORACOM Harvest Publish API を利用できるように SORACOM Inventory で仮想デバイスを作成し、デバイスIDとシークレットキーを払い出す
* 仮想デバイスで SORACOM Harvest が使えるように設定する
* コードを書いて実行

## M5Cloud を利用できるファームウェアを M5Stack に書き込む

以下が参考になります。
Windows におけるハマりポイントは書込みアドレスとなる `0x1000` を自分でセットする必要があるという事くらいです。

* [M5Stack Web IDE](https://github.com/m5stack/M5Cloud/blob/master/README_JP.md)
* [M5StackにMicroPythonを焼く](https://qiita.com/michan06/items/3f9fa580ccdddcf960ce)

## MicroPython で HTTP リクエスト

`urequest` ライブラリを利用します。M5Stack 上にもありますので `import` すればOKです。
コーディング例は [ESP32 / ESP8266 MicroPython: HTTP GET Requests](https://techtutorialsx.com/2017/06/11/esp32-esp8266-micropython-http-get-requests/) が参考になりました。

### ちなみに; JSON 形式の HTTP REST API のモックサービス

urequest 等をとにかく手軽に試したいときに API サービスがあると便利です。
[JSONPlaceholder](https://jsonplaceholder.typicode.com/) は、ともかく JSON を返してくれるサービスです。

<h2 id="h">SORACOM Harvest の Publish API</h2>

SORACOM のアカウントを取得した後、 [デバイスIDとデバイスシークレットを使用してHarvestにデータを送信する](https://dev.soracom.io/jp/start/inventory_harvest_with_keys/) に沿って行えば完了します。

この時にコードに書いてある `SORACOM_INVENTORY_DEVICE_ID` と `SORACOM_INVENTORY_SECRET_KEY` が手に入ります。

SORACOM Inventory のデバイス登録費用の他、SORACOM Harvest の利用料金がかかりますのでご注意を。無料枠もあります。詳しくは下記のページをご覧ください。

* [SORACOM Inventory のご利用料金](https://soracom.jp/services/inventory/price/)
* [SORACOM Harvest のご利用料金](https://soracom.jp/services/harvest/price/)

### ちなみに; SORACOM Harvest の細かい解説をすこしだけ。

[SORACOM Harvest](https://soracom.jp/services/harvest) とは [IoT 向けデータ通信を提供している SORACOM](https://soracom.jp) の「**IoT データ向け データ蓄積・可視化サービス**」です。
このサービスは `harvest.soracom.io` というアドレスにデータを送信すれば蓄積＆可視化してくれるサービスなのですが、このアドレスは SORACOM が提供するセルラーや LPWA 回線からのみアクセス可能だったのですが、インターネット経由で SORACOM Harvest が利用できるようになったのが **Publish API** です。

詳しくは[ソラコムブログ: インターネット経由でSORACOM Harvestにデータが入れられるようになりました。](https://blog.soracom.jp/blog/2018/07/04/inventory-update/) をご覧ください。

## あとがき

SORACOM Harvest が Wi-Fi などの回線でも手軽に使えるようになったので、簡易的な可視化ツールとして使うことができるようになりました。
また SORACOM Harvest に蓄積されたデータをデータソースとしてダッシュボードや通知を作ることができる [SORACOM Lagoon](https://soracom.jp/services/lagoon/) も使えるようになります。

ただし、コード上にキーを埋め込む必要があるため、キーの盗難や台数が増えたときの個別設定の手間が増えてしまうところが難点ですので、検証目的くらいにお使いください。
（SORACOM 的になんかできないかなーと思っているので、アイデアがあればぜひ）

EoT