Raspberry piとThingWorxをつないで簡易なIoTを作ってみた

いま流行りのIoTを、Raspberry piとThingWorxをつないで作ってみました。ごく基本的なところしか作ってませんが、いろいろ応用ききそうです。

##ThingWorx
ThingWorxはPTCが提供する産業用IoT（IIoT）用のプラットフォームです。PTCは代表的な3DCADであるCreo（旧Pro/E）を開発しているベンダーなので、製造業の方は今後関わることがあるかもしれません。

公式ホームページ：[ThingWorx 産業イノベーション プラットフォーム](https://www.ptc.com/ja/products/iot/thingworx-platform)

###IoTプラットフォーム
IoTプラットフォームについては[IoTプラットフォームとは何か？ 正しい選択をするためのたった1枚のスライド](https://www.sbbit.jp/article/cont1/33530#head3)がわかりやすいと思います。
個人向けのIoTプラットフォームとしてはMicrosoftの[Azure IoT](https://azure.microsoft.com/ja-jp/overview/iot/)とかのほうが身近かもしれません。

##無料でThingWorxを使ってみる
ThingWorxは法人向けサービスですが、ありがたいことに個人で勉強できるオンラインコースがUdemyに存在します。
[Fundamentals of IoT Development with ThingWorx](https://www.udemy.com/share/10042GB0MZcVlSQXg=/)
IoTの基礎を勉強できて、ThingWorxの使い方まで教えてくれて、しかも**無料!!**。IoT始めたいと思っている人には神のような講座です。まずはこちらに登録して一通り勉強してみました。登録するとAcademic版のThingWorxが利用できます。

##Raspberry piでセンサの値をとれるようにする
IoTをはじめる前に、当たり前ですがRaspberry piでセンサの値を取れるようにしておく必要があります。ここでは詳しい説明は省きます。

###使用機材
- Raspberry pi 3 model B+
- 12ch ADコンバータ MCP3208
- フォトレジスタ
- Windows PCとChrome（ThingWorx編集用）

###配線図
![image.png](https://qiita-image-store.s3.amazonaws.com/0/346401/26510973-df82-fd13-15a2-01ad8ad3d30a.png)
 

##ThingWorxでデータを受け取る準備
ThingWorxの基本的な操作方法は、先に紹介した講座で紹介されているので省きます。

まずはThingWorx Composerで新しくThingを追加します。ここではRoomLightという名前にしてみました。
さらにRaspberry piからデータを受け取るためのNumber型のプロパティを作ります。ここではRoomBrightnessという名前にしてみました。
![thingworx1.PNG](https://qiita-image-store.s3.amazonaws.com/0/346401/4bce3a9c-4d56-871f-d75c-33188dc79c14.png)


![thingworx2.PNG](https://qiita-image-store.s3.amazonaws.com/0/346401/98ec4830-d0d1-ddc9-9cfd-4a8812e5c5a5.png)
他にもいろいろできることはあるのですが、今回はここまで。


##ThingWorxにデータを送るPythonコード

たぶんいろんな方法があると思うのですが、先の講座で紹介されていたRESTを使う方法以外知らないので、それを使ってみます。
講座ではPostmanでコードを作る方法が紹介されていますが、そのままではどうもうまく行かず、あれこれ試してみて下記の方法に行き着きました。

```python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import spidev
import requests
import json


#ThingWorxでデータを受け取るプロパティを指定
url1 = "https://利用しているThingWorxのURL/Things/RoomLight_ユーザー名/Properties/RoomBrightness"

#ThingWorxへの接続情報
headers = {
    'appKey': "アクセス用のセキュリティコード",
    'Accept': "application/json",
    }


#ThingWorxにデータを送る
def task(BrValue):
    payload1 = {"RoomBrightness":BrValue}
    response1 = requests.request("PUT", url1, json=payload1, headers=headers)


# MCP3208からSPI通信で12ビットのデジタル値を取得。0から7の8チャンネル使用可
def readadc_spidev(adcnum):
    if ((adcnum > 7) or (adcnum < 0)):
        return -1
    command1 = 0x6 | (adcnum & 0x4)>>2
    command2 = (adcnum & 0x3)<<6
    ret=spi.xfer2([command1,command2,0])
    adcout = (ret[1]&0xf)<<8 | ret[2]
    return adcout


GPIO.setmode(GPIO.BCM)
spi=spidev.SpiDev()
spi.open(0, 0) # bus0, CE0
spi.max_speed_hz = 1000000 # 1MHz


try:
    while True:
        inputVal0 = readadc_spidev(0)  #センサーからデータを取得
        print(inputVal0)
        task(inputVal0)   #ThingWorxにデータを送る
        time.sleep(10)


except KeyboardInterrupt:
    pass


spi.close()
```

ここではフォトレジスタから得た値を加工せずにそのまま送っています。

Raspberry piでこのコードを実行すると（無事にいけば）ThingWorxのプロパティの値が変わっていく様子を確認できるはずです。


##ThingWorxでMashupしてみる

せっかくなので、ThingWorxで取得したデータをダッシュボードで見れるようにしてみます。
こちらも操作方法は先の講座で紹介されてますので省きます。ここでは、プロパティの値をデジタル表示とゲージ表示してみました。
![thingworx3.PNG](https://qiita-image-store.s3.amazonaws.com/0/346401/65356d5b-1063-80f3-4e45-cb5c961790de.png)

無事に動けばこんな表示になるはず。
![thingworx4.PNG](https://qiita-image-store.s3.amazonaws.com/0/346401/e46913cf-02bc-ef09-be46-23f3c8aebf41.png)


ごく基本的なところしか作ってませんが、別のセンサーに入れ替えても仕組みは同じなので、いろいろ応用はきくと思います。


##さらなる応用の可能性

今回は省略しましたが、RESTでThingWorxのプロパティの値をGETすることもできます。また、ThingWorx側でも簡単なコードを書いたり、条件を指定してイベントを発生させることもできます。（これらも講座で学べます）
工夫すればいろんな使いみちがありそうです。

##参考

[Fundamentals of IoT Development with ThingWorx](https://www.udemy.com/share/10042GB0MZcVlSQXg=/)