2015-01-17

Rapiroで遊ぶ【Chatterで操作編】

前回はRapiroをカスタマイズして無線LAN対応させたので

今回は実際にWebと接続して任意のクライアントからRapiroを操作できるようにします!

 

方法としてはRapiro(Raspberry Pi)を起点にPush型にするか(RapiroをWebサーバ化する)

Pull型でRapiro側からWebにデータを取りに行くかの2パターンがありますが、

今回はPull型でデータ取得先にコマンド入力のデータがあれば

シリアル経由でRapiroを操作するフローで構築してみます。

 

cron使えば言語/フレームワーク問わないのですが

入出力がプラガブルで拡張性の高いhubot使えば色々便利そうだったので今回はコレを使います。

 

hubotと言えば以前にhubot-chatterを作ったのでChatter使ってRapiroを操作してみます!

Chatterに命令文書いたらrapiroが動く感じです。

1. Node.jsをRaspberry Piにインストール

Raspberry Piでapt-getでパッケージインストールしたら、yaomanインストールあたりの

エラーでハマったのでPi用のバイナリを使ってインストールします。

$ curl -O http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-arm-pi.tar.gz
$ sudo tar --strip-components 1 -xzvf node-v0.10.28-linux-arm-pi.tar.gz -C /usr/local

2. hubotのインストール&ボット作成

まずはhubotのインストール
$ sudo npm install -g yo generator-hubot

hubotの作成

$ mkdir hubot
$ cd hubot
$ yo hubot
$ npm install hubot-chatter

3. hubotスクリプトの作成

こんな感じのスクリプトをscripts/test.coffeeに設置
SerialPort = require("serialport").SerialPort
serialPort = new SerialPort("/dev/ttyAMA0", {
  baudrate: 57600
}, false)

serialPort.open (error)->
  if error
    console.log('failed to open: #{error}')
  else
    console.log('open')

module.exports = (robot) ->
  robot.respond /RAPIRO (.*)$/i, (msg) ->
    command = msg.match[1]
    switch command
      when "stop"
        serialPort.write("#M0")
      when "forward"
        serialPort.write("#M1")
      when "back"
        serialPort.write("#M2")
      when "right"
        serialPort.write("#M3")
      when "left"
        serialPort.write("#M4")
      when "green"
        serialPort.write("#M5")
      when "yellow"
        serialPort.write("#M6")
      when "blue"
        serialPort.write("#M7")
      when "red"
        serialPort.write("#M8")
      when "push"
        serialPort.write("#M9")
      else
        serialPort.write("#M0")

さらに起動用のシェルファイルも作成

#!/bin/bash
export HUBOT_SFDC_USERNAME="test@example.com"
export HUBOT_SFDC_PASSWORD="hogefuga"
export HUBOT_SFDC_TOPIC="AllMessages"
export HUBOT_SFDC_POLLING_TYPE="streaming"

bin/hubot -a chatter

serialportもインストール

$ npm install serialport

4. Salesforce側の設定を行う

Rapiroを動かすということで即時性が求められる為、StreamingAPIを使う方式にしました。

FeedItemは相変わらずStreamingAPIに対応していないので

FeedItemのInsertのDMLでカスタムオブジェクト(Message__c)を作成するようなトリガを組みました。

trigger FeedItem on FeedItem (before insert, after insert) {
    if (Trigger.isAfter && Trigger.isInsert) {
        List<Message__c> messages = new List<Message__c>();
        for (FeedItem fi : Trigger.new) {
            Message__c message = new Message__c();
            message.ParentID__c = fi.ParentId;
            message.Body__c = fi.Body;
            message.User__c = UserInfo.getUserId();
            message.FeedItemId__c = fi.id;
            messages.add(message);
        }
        if (!messages.isEmpty()) {
            insert messages;
        }
    }
}

この作成先であるMessage__cをPushTopicに登録してあげればStreamingAPIへの準備はOKです。

PushTopic pushTopic = new PushTopic();
pushTopic.ApiVersion = 31.0;
pushTopic.Name = 'AllMessages';
pushTopic.Description = 'All records for the Message__c object';
pushtopic.Query = 'SELECT Id, Name, ParentId__c, Body__c, User__c, FeedItemId__c FROM Message__c';
insert pushTopic;

ChatterとStreamingAPIの連携に関しては以下の記事が詳しいです↓

Force.com Streaming APIでChatterへの投稿を通知 - Appirio Japan

5. 実行

Rapiroに通電して、Raspberry Piにsshでログインし、3で作成したシェルファイルを起動します。

その後、"hubot rapiro green"とFeedに投稿すると、こんな感じでhubotが動き出します!

http://youtu.be/EwJQc4oOvco

"hubot rapiro stop"で止まります。

http://youtu.be/l21n3tW9euo

余談

hubotじゃなくてCylon.jsを使っても面白いかも
このエントリーをはてなブックマークに追加