3. OpenHAB Mosquito Broker 연동

0
1665

본 포스팅에서는 라즈베리파이에 MQTT Broker를 설치하고, 이를 OpenHAB과 연동하기 위한 방법에 대해 설명한다.

MQTT

MQTT는 경량의 Publish/Subscribe(Pub/Sub) 메시징 프로토콜이다. M2M(machine-to-machine)와 IoT(Internet of things)에서의 사용을 목적으로 만들었다. 이를 위해서 낮은 전력, 낮은 대역폭 환경에서도 사용할 수 있도록 설계됐다. MQTT는 저전력, 신뢰할 수 없는 네트워크, No TCP/IP 기반에서 운용할 수 있다는 장점이 있다. 소형기기의 제어와 센서정보 수집에 유리하다. 이런 특징들로 특히 IoT 영역에서 주목받고 있다.

MQTT Broker

MQTT 서버라고 하지 않고 중개인(브로커)라고 하는 이유는 MQTT가 발행인과 구독자가 메시지를 주고 받을 수 있도록 다리를 놔주는 역할만을 하기 때문이다. 다른 기능들은 중계를 도와주는 부가 기능일 뿐이다. 다양한 종류의 브로커들이 있는데, 여기에서 확인하자.

Mosquitto MQTT

모스키토(Mosquitto)는 (2014년 6월 현재)MQTT 프로토콜 3.1을 구현한 BSD 라이센스 기반의 오픈소스 메시지 브로커다. 본 포스팅에서는 Mosquitto MQTT를 이용해서 OpenHAB과 연동할 예정이다.

MQTT와 MQTT Broker에 대한 자세한 설명은 Joinc:MQTT소개를 참고하기 바란다.

Mosquitto Repository 추가

라즈베리파이에서 Mosquitto Broker를 사용하기 위해서는 Repository Package Signing Key를 추가 해야 한다. 아래와 같은 명령을 수행하면 Signing Key를 다운로드 한 후, apt에 Mosquitto Repository를 등록하는 과정을 수행한다.

(1) Repository Package Signing Key Download

$ cd ~
$ wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
$ sudo apt-key add mosquitto-repo.gpg.key

(2) Mosquitto Repository Package 등록

라즈비안-Jessie용 Mosquitto Package를 /etc/apt/sources.list.d/에 다운로드 한 후, (3)을 실행 한다.

$ cd /etc/apt/sources.list.d/
$ sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list

내가 사용하고 있는 Raspbian OS는 Jessie 버전이므로 위와 같은 명령을 사용하였고, Wheezy 버전을 사용하는 사람은 아래와 같은 명령을 이용하면 된다.

$ sudo wget http://repo.mosquitto.org/debian/mosquitto-wheezy.list

(3) Mosquitto Broker 설치

$ sudo apt-get update
$ sudo apt-cache search mosquitto
$ sudo apt-get install mosquitto mosquitto-clients

참고: Mosquitto Debian repository

sudo: apt-add-repository: command not found Error시 발생 시 해결법

라즈비안OS에서 apt-add-repository 명령을 수행하하면 Command not found Error가 발생하는 경우가 있다. 이런경우, 아래와 같이 software-properties-common과 python-software-properies를 설치하면 해결된다.

$ sudo apt-get install software-properties-common python-software-properties

Mosquitto 실행 및 Subscribe/Publish Test

앞 과정에서 Mosquitto Broker를 설치 하였으니, Broker가 정상적으로 동작하는지 확인하기 위한 방법을 설명한다. (1) 명령을 수행해서 Mosquitto를 실행한 다음, Putty 창(Putty2)을 하나 더 열고 mosquitto_sub -d -t hello/world 를 수행한다.

위 명령을 수행하면 mosquitto는 hello/world라는 Topic으로 수신되는 모든 메시지를 출력하게 된다.

나머지 Putty창(Putty1)에서, mosquitto_pub -d -t hello/world -m “Hello from MQTT”를 실행하면 Putty2에서 Hello from MQTT를 수신하는 것을 확인 할 수 있다.

참고로 -d 옵션은 debug, -t 옵션은 topic, -m 옵션은 message이다.

(1) Mosquitto 실행

$ sudo /etc/init.d/mosquitto start

20151216_140905

(2) MQTT Subscribe & Publish Test

$ mosquitto_sub -d -t hello/world
$ mosquitto_pub -d -t hello/world -m “Hello from MQTT”

위 명령을 복사해서 사용하는 경우, 터미널에서 “를 제대로 인식하지 못해 명령이 수행되지 않는 경우가 있다. 이런 경우, 키보드로 타이핑해서 수행하길 바란다.

20151216_141210

MQTT Binding을 위한 OpenHAB 설정

(1) openhab.cfg 생성

$ sudo cp /etc/openhab/configurations/openhab_default.cfg /etc/openhab/configurations/openhab.cfg

(2) openhab.cfg에 MQTT Broker 정의

$ sudo vi /etc/openhab/configurations/openhab.cfg

약 423라인과 427라인에 아래 구문을 추가 한다.

mqtt:broker.url=tcp://192.168.0.100:1883
mqtt:broker.clientId=openhab

아래 명령은 openHAB에 sitemap을 추가하기 위한 명령이다. sitemap이란,OpenHAB의 Element들을 만들기 위해 사용된다.(Element는 OpenHAB의 Item을 제어하기 위해 사용됨)

$ sudo vi /etc/openhab/configurations/sitemaps/kaizen.sitemap

$ sudo vi /etc/openhab/configurations/items/kaizen.items

$ sudo /etc/init.d/openhab restart

위 과정을 모두 수행 한 후, PC에서 http://192.168.0.100:8080/openhab.app?sitemap=kaizen 주소로 접속하면 아래와 같은 화면을 볼 수 있다. 위 과정을 통해 라즈베리파이에 OpenHAB을 구동하고 원하는 메뉴 버튼을 만들 수 있다. 본 예제에서는 원격지에 있는 Device의 LED를 제어하기 위한 Switch 1/2/3과 원격지에 있는 Device에서 검출한 온/습도 값을 모니터링 하기 위한 Temperature/Humidity 메뉴를 만들었다.

20151229_161607

Remote Device 만들기

1.Material

(1) WIZwiki-W7500 wizwiki-w7500_main

Features

  • WIZnet W7500
    • ARM Cortex-M0 Core
    • 48MHz, 128KB Flash
    • 16KB RAM
    • 32KB RAM for TCP/IP – Can be extended to system RAM
    • Hardwired TCP/IP Core
    • MII Interface
    • ADC (8)
    • GPIO (53)
    • SWD (Serial Wire Debug)
    • Timer/PWM
    • UART (3)
    • SPI (2)
    • I2C (2)
  • External Ethernet PHY
    • IC+ IP101GA
    • Single Port 10/100 MII/RMII/TP/Fiber Fast Ethernet Transceiver
    • Auto MDI/MDIX function
    • Supports MDC and MDIO to communicate with the MAC

(2) Sensor Shield

TB2wSGHaFXXXXcLXXXXXXXXXXXX_!!33841454

2. mbed Code

아래 주소를 이용하면 W7500 기반의 MQTT Client 예제 코드를 다운로드 할 수 있다.
Download(openHAB_mqtt_W7500)
다운로드 한 예제의 main 코드는 아래와 같으며 크게 MQTT 초기화, MQTT Subscribe, MQTT Publish로 나눌 수 있다. 

3. Code 설명

위는 W7500에서 MQTT를 사용하기 위한 코드이다.

  • 1 : W7500의 Ethernet을 사용하기 위한 초기화
  • 3 : MQTT Client 초기화 ( 1번에서 생성한 Ethernet Interface를 파라미터로 사용 )
  • 5~6 : MQTT Broker의 IP주소와 Port 정보를 입력
    • 앞에서 설정한 MQTT Broker(Mosquitto)의 정보 사용
  • 18~30 : MQTT 설정 및 Broker에 접속
    • 주의 : MQTT ClientID는 중복되면 안됨. 중복 되면 Broker에서 무시 혹은 거절 할 수 있음

위는 W7500에서 MQTT Message를 Subscribe 하기 위한 코드이다.

  • 1~7 : /wiznet/sw1 으로 들어오는 Message를 구독함
    • /wiznet/sw1 message를 수신하면 sw1_messageArrived 함수를 호출
  • 9~15 : /wiznet/sw2 으로 들어오는 Message를 구독함
    • /wiznet/sw2 message를 수신하면 sw2_messageArrived 함수를 호출
  • 17~23 : /wiznet/sw3으로 들어오는 Message를 구독함
    • /wiznet/sw3 message를 수신하면 sw3_messageArrived 함수를 호출

sw1/sw2/sw3_messageArrived 함수는 아래와 같이 특정 LED를 On/Off 하는 기능을 수행한다.

위 코드는 W7500이 측정한 온도/습도 정보를 MQTT Publish 하기 위한 코드이다.

  • 18~22 : /wiznet/humidity/xxxx 라는 포맷으로 Publish
  • 24~28 : /wiznet/temperature/xxx 라는 포맷으로 Publish

앞에서 설정한 MQTT Broker(Mosquitto)에서는 위에서 Publish 하는 Topic(/wiznet/humidity 등)을 모니터링하고 있다. MQTT Broker에서 해당 Topic를 수신하면 OpenHAB에 Message를 전달하며 OpenHAB에서는 전달 받은 메시지를 이용하여 Webpage로 보여 주는 구조로 동작한다.

4. 실행 후 LogMessage

20151229_161639

기타

sitemap에 정의할 수 있는 Element들은 아래와 같다.

Element
Colorpicker Allows the user to choose a color from a color wheel.
Chart Adds a time-series chart object for displaying logged data.
Frame Area with either various other sitemap elements or further nested frames
Group Renders all elements of a given group defined in an items definiton file
Image Renders an image
List
Selection Gives access to a new page where the user can choose among values defined in the mappings parameter.
Setpoint Shows a value and allows the user to modify it. Optionally, it is possible to specify maximum and minimum allowed values, as well as a step.
Slider Renders a slider
Switch Renders a switch item
Text Renders a text element
Video Displays a video
Webview

Sitemap에 대한 자세한 설명은 아래 주소를 참고 하기 바란다.

https://github.com/openhab/openhab/wiki/Explanation-of-Sitemaps

Sitemap이 정의되었으면, Sitemap에서 사용하는 Item들을 정의해야 한다. 여기에서 Item들이란, 어떤 이벤트로 인해 정보를 Read 하거나 Write 할 수 있는 Object를 의미하며 Itemtype과 Item에 대한 Command Type들은 아래와 같다.

Itemtype Description Command Types
Call Telephone call by origin and destination Call
Color Color information (RGB) OnOff, IncreaseDecrease, Percent, HSB
Contact Item storing status of e.g. door/window contacts OpenClosed
DateTime Stores date and time (see NTP binding for details)
Dimmer Item carrying a percentage value for dimmers OnOff, IncreaseDecrease, Percent
Group Item to nest other items / collect them in groups
Location GPS related information by latitude, longitude and altitude Point
Number Stores values in number format Decimal
Rollershutter Typically used for blinds UpDown,StopMove,Percent
String Stores texts String
Switch Typically used for lights OnOff

Item을 사용하기 위한 Example과 자세한 내용은 아래 주소를 참고 하기 바란다.

https://github.com/openhab/openhab/wiki/Explanation-of-items

아래는 Sitemap에서 만들어진 Swich와 Number Item을 Mqtt를 통해 데이터를 송/수신 하는 예제이다. ( mqttsw1은 데이터를 송신, Office_temp는 수신하는 역할을 한다.)

Topic : /wiznet/

Field : sw1, temperature

Item Command Query Topic Field
mqttsw1 /wiznet/sw1/1 /wiznet sw1
/wiznet/sw1/0
Office_temp /wiznet/temperature/38.5 /wiznet temperature
/wiznet/temperature/40.0

NO COMMENTS