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」に必要な処理を追記します。以下に倣って、ファイルを更新してください。

注釈

①「/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