BeebotteのメッセージをRaspberry Piで受信する


Raspberry Piと連携するAlexaスマートホームスキルの開発を検討しています。Alexa→Lambda関数→AWS IoT→Raspberry Piでも良いのですが、AWS IoTは従量料金制ということもあり、とりあえずはAWS IoTではなくBeebotteと使おうと思っています(2019年2月現在Beebotteはフリープランでも私の用途には十分すぎる量のメッセージが利用できます)。そこで、今後Lambda関数にのせるべくBeebotteにPublishするコードを作成してNode-REDのmqtt inノードで受信を行ってみました。BeebotteにPublish/Subscribeしようと思っている方はぜひお試しください。(ラズパイからBeebotteにPublishするのであれば、Node-REDのmqtt outノードを使ったほうが楽です。)

Beebotteの準備とNode-REDでのSubscribe

こちらに分かりやすくまとまっていますので、ここでは割愛します。

BeebotteへのPublish

こちらのNodejsのコードをほぼそのまま利用しています。異なる点としては、'Hello World'を渡すのではなく、家電操作を見据えて複数の要素を返していることくらいです。AWS LambdaはNodejsのサンプルが多そうでしたのでNodejsにしています。

test_publish.js
var bbt = require('beebotte');

var API_KEY = API Key;
var SECRET_KEY = Secret Key;
var CHANNEL = チャネル名;
var RESOURCE = リソース名;

var bclient = new bbt.Connector({apiKey: API_KEY, secretKey: SECRET_KEY});

bclient.publish(
  {channel: CHANNEL, resource: RESOURCE, data: {
    'resource': 'light', 'command': 'on', 'option': '30'
  }},
  function(err, res) {
});

※ 「API Key」「Secret Key」「チャネル名」「リソース名」を適宜置き換えてください。「API Key」と「Secret Key」は2019年2月現在BeebotteのWebページで『Account Settings』→『Access Management』タブから参照可能です。「チャネル名」と「リソース名」はご自身で設定したものです。
※ 今回はこれを受信するのみで家電操作は行いません。

これを実行するとNode-RED上のmqtt inノードで受信できるはずです。mqtt inノードの設定の注意点としては、トピックには「チャネル名/リソース名」を設定することくらいかと思います。また、mqtt inノードのすぐ次にjsonノードを配置することで、Subscribeしたdataを分解することができます。

先ほどのサンプルプログラムから送信した要素は、
- msg.payload.data.resource("light"が入る)
- msg.payload.data.command("on"が入る)
- msg.payload.data.option("30"が入る)
といった形で後続の処理で利用可能になります。

今後のスマートホームスキル作成でも当該トピックをSubscribeするmqtt inノードを1つ用意しておき、msg.payload.dataのresourceで操作対象を切り替え、commandとoptionで操作内容を切り替える予定です。

参考にしたサイト

Beebotte のメッセージを Node-RED で受ける
beebotte Quick Start Guide