ALMemoryにイベントを発生する処理を追加します。今回はALMemoryイベント名を「PepperBluemix/eyeColor」としました。
▼ALMemoryにイベントを実行する処理を追加
def onLoad(self):
.....
self.memory = ALProxy("ALMemory")
def onUnload(self):
.....
self.memory = None
def onInput_onStart(self):
.....
self.memory = self.session().service('ALMemory')
def on_message(self, client, userdata, msg):
.....
# json.loadsでpayloadを処理
import json
data = json.loads(msg.payload)
self.logger.info("Raise Event to PepperBluemix/eyeColor "+str(data["d"]["eyes"]))
self.memory.raiseEvent("PepperBluemix/eyeColor", data["d"]["eyes"])
最終的なSubscriber IoT Foundationボックスは以下のようになります。
▼Subscriber IoT Foundationボックスコード
class MyClass(GeneratedClass):
def __init__(self):
GeneratedClass.__init__(self)
def onLoad(self):
self.framemanager = ALProxy("ALFrameManager")
self.folderName = None
self.memory = ALProxy("ALMemory")
def onUnload(self):
import sys
self.client.unsubscribe(self.topic)
self.client.disconnect()
if self.folderName and self.folderName in sys.path:
sys.path.remove(self.folderName)
self.folderName = None
self.memory = None
def onInput_onStart(self):
import sys, os
self.folderName = os.path.join(
self.framemanager.getBehaviorPath(self.behaviorId), "../lib")
if self.folderName not in sys.path:
sys.path.append(self.folderName)
self.memory = self.session().service('ALMemory')
# Pahoのインポート
import paho.mqtt.client as mqtt
self.topic = self.getParameter('Topic')
self.endpoint = self.getParameter('Endpoint')
self.client_id = self.getParameter('Client ID')
self.api_key = self.getParameter('API Key')
self.api_token = self.getParameter('API Token')
self.client = mqtt.Client(self.client_id)
self.client.username_pw_set(self.api_key, self.api_token)
self.client.on_connect = self.on_connect
self.client.on_message = self.on_message
self.client.connect(self.endpoint, 1883)
self.client.loop_forever()
def on_connect(self, client, userdata, flags, rc):
self.logger.info("Connected with result code "+str(rc))
self.client.subscribe(self.topic)
def on_message(self, client, userdata, msg):
import json
data = json.loads(msg.payload)
self.logger.info("Raise Event to PepperBluemix/eyeColor "+str(data["d"]["eyes"]))
self.memory.raiseEvent("PepperBluemix/eyeColor", data["d"]["eyes"])
def onInput_onStop(self):
self.onUnload()
self.onStopped()
以上でSubscriber IoT Foudationボックスが完成しました。
eyesボックスの作成
eyesボックスは既存ボックスのSwitch Case、Color Edit、Eyes LEDsをまとめて1つのボックスに変換したものです。
eyesボックスの中身は以下の通りです。
PepperBluemix/eyeColorの文字列をSwitchCaseで判別し、対応する色に目のLEDを光らせます。今回はswitch caseを使っていますが、送られてきた文字列から色のRGBを生成するボックスを作成すればスッキリします。ビヘイビアに新しいALMemoryイベント「PepperBluemix/eyeColor」を追加し、eyesボックスのonStartと接続したらPepper側の作業は完了です。
いざ動作検証
Bluemixに戻り、色名ノード「Orange」をクリックします。
Pepperの目がオレンジ色に光りました。
Choregrapheのログはこんな風に表示されます。
各色のノードをクリックして、目の色が変われば、動作検証は終了です。
Pepperが受付で人を検知してBluemixへPublishし、Bluemixからライトを点灯して来客を知らせるのは、PepperとBluemixの連携で可能になる典型的なIoTアプリです。
※ ※ ※
Bluemixを使ったIoTアプリの開発をWebアプリの開発方法から始め、デバイスの制御までを4回に分けてお送りしました。プログラミング不要のNode-REDを使ったプログラム作成は、簡単・便利です。Node-REDをもっと学習するには、Node-REDユーザー会が主催する勉強会、IBMが開催しているハンズオンに参加する方法があります。QiitaにもNode-REDに関する情報が多数掲載されており、参考になるので、一度、のぞいてみるとよいでしょう。
著者:山下千尋(やました・ちひろ)
1985年生まれ。芸術学科を卒業するも、アパレル販売・事務員・プログラマーと、どんどん美術と関係のない仕事に流れ流れて2014年に株式会社ウフルに入社。理系でも文系でもないエンジニアとして、コスプレ用武器制作からWebアプリやPepperアプリの制作まで幅広くものづくりに対応中。