概要
- AWSにはIoT機器と接続、管理するためのAWS IoT Coreというサービスがある
- 公式にもハンズオンがあるが、最小限の手順、構成で動作を確かめてみる
https://aws-iot-core-for-beginners.workshop.aws/phase2/step2.html - 前回に引き続き温湿度センサーDHT22のデータを送信することを試みる
前回の記事
https://qiita.com/cami_oshimo/items/8e9c45230fccfac4ff4c
Raspberry Piの操作
ライブラリseeed-python-dhtをインストールする
# pip3 install seeed-python-dht
まずセンサー、ライブラリの動作を確認するコードを書いてみる
dht22.py
import RPi.GPIO as GPIO
import seeed_dht
GPIO.setup(4, GPIO.IN)
sensor = seeed_dht.DHT("22", 4)
humi, temp = sensor.read()
humidity = '{:.1f}'.format(humi)
temperature = '{:.1f}'.format(temp)
print(humidity)
print(temp)
動作を確認してみる(温度、湿度が順番に表示される)
# python3 dht22.py
26.3
78.1
前回使用したサンプルプログラムに組み込んでみる
basicPubSub.py
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
import logging
import time
import argparse
import json
import RPi.GPIO as GPIO // 追加
import seeed_dht // 追加
GPIO.setup(4, GPIO.IN) // 追加
sensor = seeed_dht.DHT("22", 4) // 追加
AllowedActions = ['both', 'publish', 'subscribe']
basicPubSub.py
while True:
if args.mode == 'both' or args.mode == 'publish':
humi, temp = sensor.read() // 追加
humidity = '{:.1f}'.format(humi) // 追加
temperature = '{:.1f}'.format(temp) // 追加
message = {}
message['message'] = args.message
message['sequence'] = loopCount
message['temp'] = temp // 追加
message['humi'] = humi // 追加
messageJson = json.dumps(message)
myAWSIoTMQTTClient.publish(topic, messageJson, 1)
if args.mode == 'publish':
print('Published topic %s: %s\n' % (topic, messageJson))
loopCount += 1
time.sleep(1)
修正したサンプルプログラムのbasicPubSub.pyを実行する
pi@raspberrypi:~/aws-iot-device-sdk-python/samples/basicPubSub $ python3 basicPubSub.py --endpoint abc123abc123abc123-ats.iot.ap-northeast-1.amazonaws.com --rootCA ../certs/AmazonRootCA1.pem --cert ../certs/abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123-certificate.pem.crt --key ../certs/abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc123-private.pem.key
トピック sdk/test/Python にPublishされていることを確認する
AWS IoT Coreの操作
テスト→MQTTクライアントでJSON形式のデータが到着していることを確認する
課題
- seeed-python-dht から読みだした値を小数点以下1桁で送信したかったが、
Pythonで '{:.1f}'.format(temp) としても反映されない。
テスト用のコードでは再現しない。原因不明。時間のある際に調査する。