M5Stackの遠隔制御を、Azure IoT Central からやってみる

# はじめに
クラウドからのデバイス制御を試してみたかったので、**M5Stack** と **Azure IoT Central** を使って、サクッとM5Stackの遠隔制御をやってみました。
現状で、どの辺りまで簡単に実装できそうで、どこからがもっとガリガリ調べながらやらないといけないかが見えてきたので、ちょっと試してみるだけで、この辺りのお勉強はそれなりに出来ると思います。あとは、シンプルだけど遠隔からのデバイス制御の方法があるので、アイデア次第では十分に使える機能かと思います。

# 遠隔操作する手順
今回は、Azure IoT Central のサービス画面から操作することで、M5Stackの表示される情報をさせることをやってみます。採取的な操作手順自体は、以下のようになります。

**1. Azure IoT Central のサービス画面からコマンドを実行する**
**2. M5Stackのディスプレイに表示される文字が変化する**

尚、今回の例では、ディスプレイに表示されている文字を変更させるだけですが、デバイス側の処理をもっとちゃんと実装すれば、いろいろな使い方が出来ると思います。

# M5Stack側（UI Flow）

**画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/6cf80ec4-a2cb-fe61-3ccf-3bdb7797d42f.png)



**Blockly**
[scope id] [device id] [device key] は、各自の環境に合わせて記入して下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/e832fd42-01cf-e245-f19d-cb7d71d596ce.png)



**Python**

```python
from m5stack import *
from m5ui import *
from uiflow import *
from IoTcloud.Azure import IoT_Central
import time

setScreenColor(0x222222)

methodmsg = None

labelCommand = M5TextBox(58, 98, "command", lcd.FONT_DejaVu40, 0xFFFFFF, rotate=0)


def azure_direct_Hello(payload, rid):
  global methodmsg
  methodmsg = payload
  labelCommand.setText('Hello')

  azure.response_direct_method(0, rid, body='ok')


def azure_direct_Bye(payload, rid):
  global methodmsg
  methodmsg = payload
  labelCommand.setText('Bye')

  azure.response_direct_method(0, rid, body='ok')


azure = IoT_Central(scope_id='', device_id='', device_key='')
azure.subscribe_direct_method('Hello', azure_direct_Hello)
azure.subscribe_direct_method('Bye', azure_direct_Bye)
azure.start()
while True:
  wait(1)
  wait_ms(2)
```



# Azure IoT Central 側


**デバイステンプレート**
[Command]を追加します（今回は、HelloとByeというコマンドを追加）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/417eb39a-7cc9-2fd7-c97d-a857d67da51d.png)


**コマンド**
デバイスを作成すると、コマンドが表示されます。
それぞれのコマンドの[実行]をクリックすると、Azure側からコマンドが発行されて、M5Stack側の処理が実行されることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/5524617b-167d-6022-7265-5ddc2d116b0b.png)

尚、M5Stack側と連携できるように、接続は別途設定して下さい。
M5StackとAzure IoT Centralとの接続に不安がある人は以下の記事を参考にしてください。
[『M5StickCとAzure IoT Centralを連携してデータを可視化する③　～M5StickCとAzure IoT Centralの接続編～』](https://qiita.com/yukimatsu/items/c72ee84fb64cb4ba5118)



#コマンドを使う際の注意
短い時間で連続でコマンドを発行したら、以下のエラーが発生しました。
まぁ、そういった使い方をするものではないんでしょうね(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/e0219667-a37b-0af4-be3d-54a0c78f000e.png)



#関係がありそうな公式ドキュメント
関係がありそうな公式ドキュメントを纏めておきます。
Azure IoT Hub ≠ Azure IoT Central ではないので、その辺りは注意です。
以下の記事を読むことで、Azure IoT Centralとして、どの辺りまで対応しているのかが少し整理できました。

###Azure IoT Hub cloud-to-device オプション：Azure IoT Hub
* ダイレクト メソッド
* デバイスツインの必要なプロパティ
* cloud-to-device メッセージ

https://docs.microsoft.com/ja-jp/azure/iot-hub/iot-hub-devguide-c2d-guidance


###IoT アプリケーションからデバイスへのコマンド：Azure IoT Hub

* cloud-to-device メッセージ
* ダイレクト メソッド

https://docs.microsoft.com/ja-jp/azure/architecture/example-scenario/iot/cloud-to-device


###Azure IoT CentralでのREST APIを使用したデバイス管理：Azure IoT Central

https://docs.microsoft.com/ja-jp/azure/iot-central/core/howto-control-devices-with-rest-api



#参考資料
下り方向の通信に関しては、以下の資料が良く分かりました。

https://www.slideshare.net/TakashiMatsuoka2/azure-iot-central-250023400/12

# おまけ
本記事は、以下のキャンペーンに参加しています。

https://qiita.com/official-events/b7811ce1542be54e6efe