1.1.6.4. IoT機器設定・コード例を確認する¶
本項では、以下の実装において必要なIoT機器での設定手順の説明およびPythonコード例を記載しています。
- 実装3: IoT機器からThings Cloudへの各種測定値送信
本書においては、温湿度センサーから取得する温湿度データ、およびGPSセンサーから取得する位置情報データを例として記載しています。
なお、本書中の設定値の「< >」の表記については、ご利用の環境により各自入力いただく箇所となります("<"から">"までを設定値に置き換えてください)。
温湿度データを取得・送信する¶
温湿度センサーで温湿度データを取得し、Things Cloudへ送信するためのコードを記載します。
あらかじめ、前項までに記載の処理が完了していることを確認してください。
構成ファイル「pi.properties」¶
c8yエージェントの構成ファイルである「pi.properties」を本パターン用に編集します。以下の内容をファイルの末尾に追記してください。
/usr/local/sdpf-iot/pi.properties
sendinterval3 = <温湿度データの取得・送信間隔(秒)>
Pythonコード「piAgent.py」¶
c8yエージェントの実行プログラムである「piAgent.py」に必要な処理を追記します。以下に倣って、ファイルを更新してください。
注釈
- 17行目「c8y.publish("s/uc/th", tempString)」の「th」部分には、「1.1.6.3. Things Cloudを設定する - SmartRESTテンプレートを作成する」で作成したテンプレートIDが入ります。
- SmartRESTテンプレート作成にて異なる設定を入れた際は、記載する値にご注意ください。
①「/usr/local/sdpf-iot/piAgent.py」のヘッダーに以下の内容を追記
from sendTemp_Hum import sendTemp_Hum
②「/usr/local/sdpf-iot/piAgent.py」の「def on_message_default(client, obj, msg):」の前に以下の内容を追記
def send_Temp_Hum(stopEvent, interval):
c8y.logger.info("Start Thread 3...")
c8y.logger.info('Starting send_Temp_Hum with interval: ' + str(interval))
try:
while True:
c8y.logger.info('send_Temp_Hum called')
try:
sense.send()
except Exception:
c8y.logger.info('No sense hat found omitting.')
tempString = sendTemp_Hum()
c8y.logger.debug("Sending Temperature and Humidity: " + str(tempString))
c8y.publish("s/uc/th", tempString)
if stopEvent.wait(timeout=interval):
c8y.logger.info('send_Temp_Hum was stopped..')
break
except (KeyboardInterrupt, SystemExit):
c8y.logger.info('Exiting send_Temp_Hum...')
sys.exit()
c8y.logger.info("End Thread 3...")
③「/usr/local/sdpf-iot/piAgent.py」の「def runAgent():」内の末尾に以下の内容を追記
c8y.logger.info('Starting send Temperature and Humidity.')
sendThread3 = Thread(target=send_Temp_Hum, args=(stopEvent, int(config.get('device', 'sendinterval3'))))
sendThread3.start()
完成形は以下のとおりです。
/usr/local/sdpf-iot/piAgent.py
#(略)
from requests.auth import HTTPBasicAuth
from zipfile import ZipFile
from device_proxy import DeviceProxy
import concurrent.futures
##### ①追加ここから↓ #####
from sendTemp_Hum import sendTemp_Hum
##### ①追加ここまで↑ #####
def sendConfiguration():
#(略)
except (KeyboardInterrupt, SystemExit):
c8y.logger.info('Exiting sendMeasurement...')
sys.exit()
##### ②追加ここから↓ #####
def send_Temp_Hum(stopEvent, interval):
c8y.logger.info("Start Thread 3...")
c8y.logger.info('Starting send_Temp_Hum with interval: ' + str(interval))
try:
while True:
c8y.logger.info('send_Temp_Hum called')
try:
sense.send()
except Exception:
c8y.logger.info('No sense hat found omitting.')
tempString = sendTemp_Hum()
c8y.logger.debug("Sending Temperature and Humidity: " + str(tempString))
c8y.publish("s/uc/th", tempString)
if stopEvent.wait(timeout=interval):
c8y.logger.info('send_Temp_Hum was stopped..')
break
except (KeyboardInterrupt, SystemExit):
c8y.logger.info('Exiting send_Temp_Hum...')
sys.exit()
c8y.logger.info("End Thread 3...")
##### ②追加ここまで↑ #####
def on_message_default(client, obj, msg):
message = msg.payload.decode('utf-8')
c8y.logger.info("Message Received: " + msg.topic + " " + str(msg.qos) + " " + message)
#(略)
def runAgent():
#(略)
c8y.connect(on_message_default,config.get('device', 'subscribe'))
c8y.logger.info('Starting sendMeasurements.')
sendThread = Thread(target=sendMeasurements, args=(stopEvent, int(config.get('device','sendinterval'))))
sendThread.start()
##### ③追加ここから↓ #####
c8y.logger.info('Starting send Temperature and Humidity.')
sendThread3 = Thread(target=send_Temp_Hum, args=(stopEvent, int(config.get('device', 'sendinterval3'))))
sendThread3.start()
##### ③追加ここまで↑ #####
stopEvent = threading.Event()
#(略)
Pythonコード「sendTemp_Hum.py」¶
「piAgent.py」から呼び出される、温湿度データを取得してMQTTメッセージを生成するPythonコードを以下のとおり作成します。
/usr/local/sdpf-iot/sendTemp_Hum.py
import RPi.GPIO as GPIO
from DHT11_Python import dht11
def sendTemp_Hum():
# initialize GPIO
GPIO.setwarnings(True)
GPIO.setmode(GPIO.BCM)
# read data using pin 14
temp_sensor = dht11.DHT11(pin=14)
result = temp_sensor.read()
if result.is_valid():
# MQTTメッセージ(温湿度データ)生成
tempString = "992,," + str(result.temperature) + "," + str(result.humidity)
return tempString
位置情報データを取得・送信する¶
GPSセンサーで位置情報データを取得し、Things Cloudへ送信するためのコードを記載します。
あらかじめ、前項までに記載の処理が完了していることを確認してください。
構成ファイル「pi.properties」¶
c8yエージェントの構成ファイルである「pi.properties」を本パターン用に編集します。以下の内容をファイルの末尾に追記してください。
/usr/local/sdpf-iot/pi.properties
sendinterval4 = <位置情報データの取得・送信間隔(秒)>
Pythonコード「piAgent.py」¶
c8yエージェントの実行プログラムである「piAgent.py」に必要な処理を追記します。以下に倣って、ファイルを更新してください。
①「/usr/local/sdpf-iot/piAgent.py」のヘッダーに以下の内容を追記
from sendGPS import sendGPS
②「/usr/local/sdpf-iot/piAgent.py」の「def on_message_default(client, obj, msg):」の前に以下の内容を追記
def send_GPS(stopEvent, interval):
c8y.logger.info("Start Thread 4...")
c8y.logger.info('Starting send_GPS with interval: ' + str(interval))
try:
while True:
c8y.logger.info('send_GPS called')
try:
sense.send()
except Exception:
c8y.logger.info('No sense hat found omitting.')
tempString = sendGPS()
c8y.logger.debug("Sending GPS Data: " + str(tempString))
c8y.publish("s/us", tempString)
if stopEvent.wait(timeout=interval):
c8y.logger.info('send_GPS was stopped..')
break
except (KeyboardInterrupt, SystemExit):
c8y.logger.info('Exiting send_GPS...')
sys.exit()
c8y.logger.info("End Thread 4...")
③「/usr/local/sdpf-iot/piAgent.py」の「def runAgent():」内の末尾に以下の内容を追記
c8y.logger.info('Starting send GPS Data.')
sendThread4 = Thread(target=send_GPS, args=(stopEvent, int(config.get('device', 'sendinterval4'))))
sendThread4.start()
完成形は以下のとおりです。
/usr/local/sdpf-iot/piAgent.py
#(略)
from requests.auth import HTTPBasicAuth
from zipfile import ZipFile
from device_proxy import DeviceProxy
import concurrent.futures
##### ①追加ここから↓ #####
from sendGPS import sendGPS
##### ①追加ここまで↑ #####
def sendConfiguration():
#(略)
except (KeyboardInterrupt, SystemExit):
c8y.logger.info('Exiting sendMeasurement...')
sys.exit()
##### ②追加ここから↓ #####
def send_GPS(stopEvent, interval):
c8y.logger.info("Start Thread 4...")
c8y.logger.info('Starting send_GPS with interval: ' + str(interval))
try:
while True:
c8y.logger.info('send_GPS called')
try:
sense.send()
except Exception:
c8y.logger.info('No sense hat found omitting.')
tempString = sendGPS()
c8y.logger.debug("Sending GPS Data: " + str(tempString))
c8y.publish("s/us", tempString)
if stopEvent.wait(timeout=interval):
c8y.logger.info('send_GPS was stopped..')
break
except (KeyboardInterrupt, SystemExit):
c8y.logger.info('Exiting send_GPS...')
sys.exit()
c8y.logger.info("End Thread 4...")
##### ②追加ここまで↑ #####
def on_message_default(client, obj, msg):
message = msg.payload.decode('utf-8')
c8y.logger.info("Message Received: " + msg.topic + " " + str(msg.qos) + " " + message)
#(略)
def runAgent():
#(略)
c8y.connect(on_message_default,config.get('device', 'subscribe'))
c8y.logger.info('Starting sendMeasurements.')
sendThread = Thread(target=sendMeasurements, args=(stopEvent, int(config.get('device','sendinterval'))))
sendThread.start()
##### ③追加ここから↓ #####
c8y.logger.info('Starting send GPS Data.')
sendThread4 = Thread(target=send_GPS, args=(stopEvent, int(config.get('device', 'sendinterval4'))))
sendThread4.start()
##### ③追加ここまで↑ #####
stopEvent = threading.Event()
#(略)
Pythonコード「sendGPS.py」¶
「piAgent.py」から呼び出される、位置情報データを取得してMQTTメッセージを生成するPythonコードを以下のとおり作成します。
/usr/local/sdpf-iot/sendGPS.py
from gps3 import gps3
socket = gps3.GPSDSocket()
data_stream = gps3.DataStream()
socket.connect()
socket.watch()
def sendGPS():
for gps_data in socket:
if gps_data:
data_stream.unpack(gps_data)
lat = data_stream.TPV['lat']
lon = data_stream.TPV['lon']
if (lat != 'n/a' and lon != 'n/a'):
# MQTTメッセージ(位置情報データ)生成
tempString = "402," + str(lat) + "," + str(lon)
return tempString