IoT에서 아보카도의 발아 촉진과 곰팡이 방지 - Part3: Hubot이 MQTT에서 기온을 표시하거나 LED 조명

Hubot과 Slack의 Docker 이미지을 사용하여 MQTT Publish 및 Subscribe를 구현해보십시오. Hubot 스크립트는 npm 패키지를 require하여 프로그램을 작성할 수 있습니다. 재사용성을 고려하면 명령은 외부 패키지로 만드는 것이 좋지만 캐주얼에 scripts 디렉토리에 배포하여 사용할 수도 있습니다. MQTT 브로커에 환경 데이터를 게시하는 Raspberry Pi 2와 MQTT 브로커에서 메시지를 subscribe하여 LED 라이트의 전원을 제어하는 ​​BeagleBone Black에 대해서는 다음에 정리하겠습니다.

사용 사례



지금의 기온을 알고 싶다 (Subscribe)



Slack에서 bot에 "지금의 온도는?"나 "지금의 온도는?"에 질문하면 MQTT 브로커에서 subscribe하는 환경 데이터의 최신 값을 알려줍니다.

LED 라이트를 on/off 하고 싶다 (Publish)



Slack에서 bot에 "라이트 붙여"나 "라이트 끄고"라고 지시하면 MQTT 브로커에 publish하여 식물 육성 LED 라이트를 붙이거나 지워줍니다.

프로젝트



마지막으로 만든 프로젝트에 몇 가지 설정을 추가했습니다. 리포지토리는 여기입니다.
$ cd ~/node_apps/docker-hubot-slack
$ tree
├── Dockerfile
├── README.md
├── docker-compose.yml
├── docker-compose.yml.default
├── redis
└── scripts
    ├── hello.coffee
    └── mqtt_meshblu.coffee

Dockerfile



Dockerfile은 Docker 이미지의 글로벌 hubot 패키지를 설치합니다. Yeoman을 사용하여 /app 디렉토리에 Hubot 프로젝트를 만듭니다. Docker 호스트의 작업 사용자와 동일한 uid docker 사용자로 전환합니다. Yeoman 생성기가 만든 /app/package.json에 이번에 사용할 hubot-slackmqtt 패키지를 추가하여 설치합니다.

~/node_apps/docker-hubot-slack/Dockerfile
FROM iojs:2.3
MAINTAINER Masato Shimizu <[email protected]>

RUN mkdir -p /app
WORKDIR /app

RUN adduser --disabled-password --gecos '' --uid 1000 docker && \
    chown -R docker:docker /app

RUN npm install -g hubot coffee-script yo generator-hubot

USER docker
RUN yes | yo hubot --defaults && \
    npm install --save hubot-slack mqtt

scripts/mqtt_meshblu.coffee



MQTT 클라이언트는 MQTT.js을 사용합니다. 이번에 작성한 정규식robot.respond에서 bot은 최소한의 명령만 이해할 수 있습니다. 라쿠텐 의 형태소 해석을 사용해도 조금 현명하게 응답할 수 있도록(듯이) 하고 싶습니다.

~/node_apps/docker-hubot-slack/scripts/mqtt_meshblu.coffee
# -*- coding: utf-8 -*-

mqtt = require 'mqtt'

opts =
    host: process.env.MQTT_HOST
    username: process.env.ACTION_1_UUID
    password: process.env.ACTION_1_TOKEN
    protocolId: 'MQIsdp'
    protocolVersion: 3

client = mqtt.connect opts
client.subscribe process.env.ACTION_1_UUID

sensor_data = ''

client.on 'message', (topic, message) ->
    payload = JSON.parse message
    sensor_data = payload.data

commands =
    '気温': 'temperature'
    '湿度': 'humidity'
    '気圧': 'pressure'

units =
    '気温': '℃'
    '湿度': '%'
    '気圧': 'hPa'

module.exports = (robot) ->
    robot.respond  /(気温|湿度|気圧)を(おしえて|教えて)$/i, (res) ->
        sensor = res.match[1]
        answer = if sensor_data
            retval = sensor_data[commands[sensor]] + ' ' + units[sensor]
            sensor + 'は ' + retval + ' です。'
        else
            'データが取れません。:imp:'
        res.send answer

    robot.respond /ライトを(つけて|付けて|けして|消して)$/i, (res) ->
        on_off = switch res.match[1]
            when 'つけて', '付けて' then 'led-on'
            when 'けして', '消して' then 'led-off'
            else 'led-on'
        answer = if on_off == 'led-on' then 'ピカッ。' else 'カチッ。'

        message =
            devices: process.env.ACTION_3_UUID
            payload: on_off
        client.publish 'message', JSON.stringify(message)

        res.send answer + ':flashlight:'

Subscribe한 환경 데이터 보기


robot.respond /ライトを(つけて|付けて|けして|消して)$/i, (res) ->

Raspberry Pi는 BME280에서 측정한 환경 데이터를 JSON 형식으로 MQTT 브로커에 게시합니다. 이 bot에서 subscribe하여 메시지를 받을 때마다 전역sensor_data을 업데이트합니다. bot가 온도 또는 습도 질문을 받으면 수신 중인 메시지를 반환합니다.



Publish하여 LED 조명을 켜고 끄는 지시


robot.respond /ライト(つけて|付けて|けして|消して)$/i, (res) ->

'켜기'의 경우 'on', '해결'의 경우 'off' 값을 payload에 넣고 메시지를 MQTT 브로커에 게시합니다. 이 메시지는 BeagleBone Black이 subscribe합니다. on/off에 따라 USB 전원 연동 탭을 연결하고 있는 USB 허브의 포트 전원을 제어합니다. 이것이라고 리모트로부터 정말로 식물 육성 LED 라이트가 점등했는지 모르는 것이 과제입니다. Web 카메라라든지 붙이면 좋을지도.

좋은 웹페이지 즐겨찾기