Raspberry Pi + AlibabaクラウドIoTプラットフォームを使用して温度を監視する

このチュートリアルでは、**Alibaba Cloud** IoT Platformを使用して、エンドデバイスからクラウドへのメッセージ配信の1way通信を確立する方法をデモします。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/temperature-monitoring-with-raspberry-pi-and-alibaba-cloud-iot-platform_594367)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

#概要
Alibaba Cloud [IoT Platform](https://www.alibabacloud.com/ja/product/iot)を使用すると、グローバルに配置された様々なタイプの電子機器からのデータを簡単かつ安全に接続、管理、インジェストすることができます。IoT Platformを他のクラウドサービス（[ApsaraDB](https://www.alibabacloud.com/ja/product/apsaradb-for-rds-mysql)、[Quick BI](https://www.alibabacloud.com/ja/product/quickbi)、[Message Queue](https://www.alibabacloud.com/ja/product/mq)など）と組み合わせて利用することで、IoTデータをリアルタイムに収集、処理、分析、可視化するための完全なソリューションを構築し、業務効率の向上をサポートすることができます。

通信チャネルは2種類あり、エンドデバイスとIoTクラウドの間に設定することができます。2way通信では同じデータチャネルを使ってデータの送受信を行うのに対し、1way通信ではIoTデバイスからIoTプラットフォームへのデータの送受信を行うことができます。以下に、1ウェイ通信チャネルを利用して実装できるプロジェクトの例をいくつか紹介します。

1、家庭の水槽の温度を監視。
2、ガス漏れ、火災、不正侵入などの安全警報を検知し、受信。
3、湿度を監視し、雨の滴の通知を受け取ることができます。
4、電化製品や電子機器の状態を監視します。

これらのプロジェクトは、双方向通信を使用して監視パラメータを制御するためにさらに拡張することができます。最良の例は、庭の土壌水分コントローラでしょう。土壌の湿度を監視し、湿度がある閾値を下回った場合、IoTデバイスに信号を送信して散水器のスイッチを入れ、湿度が許容レベルに戻るようにすることができます。

ただし、このチュートリアルでは、エンドデバイスからIoTクラウドにメッセージを送信する1ウェイ通信のみをデモします。Raspberry PIが60秒ごとに温度センサーを使って温度を計測し、その温度データを以下の形式でJSONシリアライズした文字列としてAlibaba IoTクラウドに公開します。

```
{ 'temperature': 12 }
```
ここで、12はセンサーで測定された温度になります。

公開された温度測定値は、Alibaba Cloud [Table Store](https://www.alibabacloud.com/ja/product/table-store)インスタンスのテーブルセットアップに保存されます。

以下の図に、例のシステムを介してデータがどのように流れるかを簡略化して示します。この図のすべてのイベントは非同期的に発生することに注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/4bc4b28e-c09a-48ff-01d2-094e6a968f48.png)
図1 データフローチャート

#前提条件
このチュートリアルは、以下の技術に精通していれば、簡単に理解して従うことができます。

1、プログラミング言語Python
2、ブレッドボードを使った電子回路の構築
3、アリババクラウド環境

**ハードウェアとソフトウェアの前提条件**
このプロジェクトに取り組む前に、以下の回路図の通りに電子回路を構築し、正しく動作していることを確認してください。また、以下のライブラリをRaspberry pi環境にダウンロードしてください。

1、w1thermsensor python ライブラリ (https://pypi.org/project/w1thermsensor/ )
2、Pythonのコードの例 (https://github.com/itexpertshire/AlibabaIoTCloudDemo )

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/44a2d3d9-fbfc-0f49-6460-7e8cb1e3951e.png)
図2 回路図

#Raspberry環境の設定
1、Raspberry Piにログインし、Raspberry Piの設定で1-Wireインターフェースを有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/74542bb5-0318-2574-7f6d-085ebb7a19fe.png)
図 3 Raspberry Pi 1-Wire の構成

2、Raspberry piでシェルターミナルを開き、以下のライブラリをインストールします。

```
sudo pip install aliyun-python-sdk-core
sudo pip install aliyun-python-sdk-iot
sudo pip install w1thermsensor
```

#アリババクラウドでIoTデバイスを設定する
1、IoTプラットフォームコンソールにログインして、リージョン中国（上海）リージョンを選択します。
2、ノードタイプをデバイスとして基本版製品を作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/4b953680-322b-ca6d-1ad3-e2725cf24c0a.png)
図 4 製品のセットアップ

3、前の手順で作成した製品の下にデバイスを追加します。 以下のようにデバイスの状態が有効になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/eef404ee-b16a-f285-dc6b-bb3633d82d10.png)
図 5 デバイスの設定

4、データ型がJSONのルールを作成し、管理ボタンをクリックして以下のオプションを設定します。
5、Raspberryから公開されているJSONデータで利用可能な温度属性値を選択するためのSQL式を書く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/708ff772-a53c-dc98-6e07-62e46322ff05.png)
図 6 SQL クエリ式

6、データ転送ルールを定義します。IoTメッセージから抽出されたデータは、Alibaba Table Storeインスタンスに作成されたmyIOTというテーブルに格納されます。テーブルストアのテーブルには最低1つの主キーがあります。現在の時刻は、主キーに使用するためにJSONメッセージに含まれています。
公開されたメッセージから時刻の値を取得するには、以下の構文${JSONメッセージ属性}を使用する必要があります。
残りのJSON属性は、Table Storeテーブルの別の属性として自動的に格納されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/7f70a362-58d3-833f-98ce-3c3bc79948af.png)
図 7 データ転送ルール

#Pythonアプリケーションウォークスルー
1、githubリポジトリからpythonのサンプルコードをダウンロード/クローンします。
https://github.com/itexpertshire/AlibabaIoTCloudDemo
2、IoT python SDK、W1TermSensor、base64ライブラリをインポートします。

```
from aliyunsdkcore import client
from aliyunsdkiot.request.v20170420 import RegistDeviceRequest
from aliyunsdkiot.request.v20170420 import PubRequest
import time
import base64
from w1thermsensor import W1ThermSensor
```

3、クラウドアカウントの認証情報とIoTデバイスのキーで次の変数を初期化します。

```
accessKeyId='<This will be found in your account security management page>'
accessKeySecret='<This will be found in account security management page>'
clt = client.AcsClient(accessKeyId, accessKeySecret, '<IoT Region>')
productKey ='< This is available in ProductKey field of the product configured >'
deviceName = '<Name of the device created>'
```

4、メッセージを発行するために、IoTクラウドはデフォルトのトピックを/${productKey}/${deviceName}/updateに設定します。そのため、以下のような公開トピック名の文字列を用意します。

```
topicName = '/'+productKey+'/'+deviceName+'/update'
```

5、メッセージオブジェクト "request "をトピック名とプロダクトキーで初期化する

```
request = PubRequest.PubRequest()
request.set_accept_format('json') # Set the response format as json.
request.set_ProductKey(productKey)
request.set_TopicFullName(topicName) #Full name of the topic to which the messages are sent.
```

6、センサーから温度を読み取る前に、温度センサーの方法を初期化する

```
sensor = W1ThermSensor()

```
7、無限ループで、`sensor.get_temperature`を使って温度を読み取り、`clt.do_action_with_exception`関数を使って60秒ごとにIoTデバイスにメッセージを発行する。

```
while True:
    temperature = sensor.get_temperature()
    timevalue = time.time()
    print("The temperature is %s celsius" % temperature)    
    message = "{ 'temperature': %s, 'time': %s }" % (temperature,timevalue)
    print (base64.urlsafe_b64encode(message)) 
    request.set_MessageContent(base64.urlsafe_b64encode(message)) #JSON message in Base64 String
    request.set_Qos(0)
    result = clt.do_action_with_exception(request)
    print 'result : ' + result
    time.sleep(60)
```

#実行とテスト
それではpythonのコードを実行してみましょう。センサーがRaspberry GPIOピンに正しく接続されていることを確認してください。

Raspberry Unixのターミナルで、アプリケーションコードのディレクトリに移動し、pythonコマンドを使ってコードを実行します。

```
pi@raspberrypi:~/iot/AlibabaIoTCloudDemo $ python tempMonitor.py
```
ターミナルには以下のようなメッセージが出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/ea21872d-763c-c451-e3ee-8ffd255de0c7.png)
図 8 Raspberry Pi の出力
温度の測定値は、以下のようにテーブルストアのテーブルに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/01068c38-5429-a0fa-8f63-2f6ff4abfed9.png)
図 9 テーブルストアデータ

#トラブルシューティング
1、**以下のエラーを返すPythonコード**
w1thermsensor.errors.NoSensorFoundError。ID '' を持つ未知の温度センサーが見つかりません。

以下のコマンドを実行して、cat w1_slave ができるかどうかを確認してください。

```
cd /sys/bus/w1/devices
ls
cd 28-XXXXXXXXXXXX (change the X's to your own address)
cat w1_slave
```
28 で始まるデバイスが表示されない場合は、DS18B20 が正しく接続されていないか、配線の不良、またはセンサーの不良のいずれかです。接続については、上記の図に正確に従ってください。

2、**メッセージがテーブルストアに保存されない**
メッセージが受信され、デバイスログセクションのテーブルストアにプッシュされていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/cf19fc1b-53ed-ba6f-ea6f-d1fff242d5ba.png)
図 10 デバイスログ

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*