このページの本文へ

PepperをNode-Redでクラウド経由で制御してみよう (2/2)

2016年04月28日 11時00分更新

文●山下千尋/ウフル

  • この記事をはてなブックマークに追加
本文印刷

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ボックスの中身は以下の通りです。

eyesボックスの内容

PepperBluemix/eyeColorの文字列をSwitchCaseで判別し、対応する色に目のLEDを光らせます。今回はswitch caseを使っていますが、送られてきた文字列から色のRGBを生成するボックスを作成すればスッキリします。ビヘイビアに新しいALMemoryイベント「PepperBluemix/eyeColor」を追加し、eyesボックスのonStartと接続したらPepper側の作業は完了です。

いざ動作検証

Bluemixに戻り、色名ノード「Orange」をクリックします。

Bluemixで「Orange」ノードをクリックして動作検証を開始

Pepperの目がオレンジ色に光りました。

目がオレンジ、青、赤などに光るPepper

Choregrapheのログはこんな風に表示されます。

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アプリの制作まで幅広くものづくりに対応中。

前へ 1 2 次へ

この連載の記事

一覧へ

この記事の編集者は以下の記事をオススメしています