2017年1月31日火曜日

Hubot + Slack で自作の扇風機を制御してみた

概要

Hubot で自作の扇風機を制御してみました
具体的には Hubot に「扇風機の電源を入れろ」というと扇風機が回りだし「止まれ」というと扇風機が止まります

システム全体の概要図は以下の通りです
slack_with_fan_system_fig.png

環境

  • Slack 2016/07/04 時点
  • heroku-toolbelt 3.43.4
  • node 6.2.0
  • npm 3.8.9

iotbot のインストール

Hubot はすでにあるものを使います
Hubot を Heroku 上にデプロイして、それを Slack から呼び出せるようにします

まず iotbot を自分の Heroku アカウント配下にデプロイします
アクセスすると Heroku ボタンがあるのでこれをクリックすれば自分の Heroku アカウント配下にデプロイすることができます

Heroku へのデプロイが完了したら必要な環境変数を設定していきます
今回は Slack とも連携するので設定が必要な環境変数は以下となります

  • HUBOT_SLACK_TOKEN・・・Slack Integration から発行されたトークン
  • HUBOT_MQTT_PORT・・・MQTT ブローカのポート
  • HUBOT_MQTT_HOST・・・MQTT ブローカのホスト名
  • HUBOT_MQTT_USERNAME・・・MQTT ブローカにアクセスするためのユーザ名
  • HUBOT_MQTT_PASSWORD・・・MQTT ブローカにアクセスするためのパスワード
  • HUBOT_MQTT_PUBTOPIC・・・Publish するトピック
  • HUBOT_MQTT_SUBTOPIC・・・Subscribe するトピック

これらを Heroku 上にデプロイしたアプリに heroku コマンドを使って設定します

  • heroku config:set HUBOT_SLACK_TOKEN=xxxx-nnnnnnnnnnn-xxxxxxxxxxxxxxxxxxxxxxxx HUBOT_MQTT_PORT=1883 HUBOT_MQTT_HOST=”your.mqtt.broker” HUBOT_MQTT_USERNAME=username HUBOT_MQTT_PASSWORD=password HUBOT_MQTT_PUBTOPIC=put_t HUBOT_MQTT_SUBTOPIC=sub_t –app iotbot

「–app」の部分は Heroku にデプロイしたアプリ名を指定してください

Hubot と Slack 自体の連携方法がいまいちよくわからないという場合はこちらの記事を参考にしてみてください

自作扇風機の紹介

今回は ESPr を使ってモータを制御することで Wifi 付きの扇風機っぽいものを作って見ました
作成した扇風機の全体図は以下の通りです
slack_with_fan_circuit.jpg

ESPr は Arduino 化しています
ESPr で DC モータを制御する回路にタクトスイッチを組み合わせています
DC モータの制御に関してはこちらを御覧ください

作成したスケッチは以下の通りです

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "ssid";
const char* password = "ssid-password";
const char* mqtt_server = "your.mqtt.broker";
const int mqtt_port = 1883;
const char* mqtt_sub_topic = "topic";
const char* mqtt_username = "mqtt-user";
const char* mqtt_password = "mqtt-pass";

WiFiClient espClient;
PubSubClient client(espClient);
int ON = 4;
int OFF = 5;
int MOTOR = 2;

void setup() {
  pinMode(ON, INPUT);
  pinMode(OFF, INPUT);
  pinMode(MOTOR, OUTPUT);
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

void setup_wifi() {
  delay(10);
  WiFi.begin(ssid, password);
}

void callback(char* topic, byte* payload, unsigned int length) {
  if ((char)payload[0] == '3') {
    digitalWrite(MOTOR, HIGH);
  } else {
    digitalWrite(MOTOR, LOW);
  }
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP8266Client", mqtt_username, mqtt_password)) {
       client.publish(mqtt_sub_topic, "Start MQTT Motor");
       client.subscribe(mqtt_sub_topic);
    } else {
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();
  if (digitalRead(ON) == HIGH) {
    digitalWrite(MOTOR, HIGH);
  } else if (digitalRead(OFF) == HIGH) {
    digitalWrite(MOTOR, LOW);
  }
  delay(200);
}

Wifi に接続し MQTT ブローカに接続します
Slack から Publish するトピックを ESPr 側では Subscribe します
これにより Slack から扇風機の ON/OFF を実現します
具体的には Subscribe したペイロード情報がモータを制御するためのピン番号 (今回は 3 or 5) であれば、そのままピンを HIGH or LOW にします

また、今回は手元のスイッチでも扇風機を ON/OFF できるようにタクトスイッチを 2 つ (ON/OFF) 実装しました
タクトスイッチは ESPr の 4, 5 ピンで制御しています

スケッチが書き込めて問題なくモータが回ることが確認できたら Slack を絡めて動作確認してみましょう

動作確認

チャネルに iotbot の invite まで済んでいるのであれば Slack から

  • @iotbot: fan on

と実行してみましょう
すると扇風機を ON するための情報が Publish され扇風機が回り始めると思います

  • @iotbot: fan off

とすると扇風機が止まると思います
今度は、Slack から扇風機を ON にして手元のスイッチで OFF できることを確認してみてください

最後に

Slack からデバイスを制御してみました
バックエンドは MQTT を使っているだけなので非常に単純な構成になっています

実用性があるレベルまで作りこんでいないので何とも言えませんが、本当に使おうとしたらエビデンス的なものが必要になると思っています
具体的に言うと fan off したときにちゃんと扇風機が止まっているのか、というのを確認できる仕組みがないと実用レベルまでは行かないかなと思っています

0 件のコメント:

コメントを投稿