Feb 282017
 

이번 글은 우분투 12.04를 기준으로 OpenHAB2와 Mosquitto를 설치해서 MQTT 바인딩을 통해 가상의 스위치의 상태를 보고 제어하는 과정이다. 궁극적으로는 실제 센서나 원격제어 가능한 스위치에 사용할 수 있는 방법으로써 OpenHAB을 어떻게 사용할 수 있는지, MQTT를 가지고 어떻게 HW등과 연동하는지 알 수 있는 기회가 되었으면 한다. 추후 Kankun wifi plug를 위한 준비 과정이다. 참 길다 ㅠ.ㅠ

Zulu

다음은 OpenHAB2에서 권장하는 Open JDK계열의 Zulu를 설치하고 설정하는 과정이다.

Installation (http://zulu.org/zulu-community/zuludocs)
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 0x219BD9C9 
sudo apt-add-repository 'deb http://repos.azulsystems.com/ubuntu stable main' 
sudo apt-get update 
sudo apt-get install zulu-8
Additional setups

cd ~ 한 후 vi .profile해서 다음을 추가해준다.

 
export JAVA_HOME=/usr/lib/jvm/zulu-8-amd64/
export PATH=/$JAVA_HOME/bin:$PATH 

그 후 source .profile해주면 된다.

Choose JDK

혹시 이미 JDK가 설치되어있는 경우에는 sudo update-alternatives --config java해서 선택해줘야 한다.

OpenHAB2

설치(http://docs.openhab.org/installation/linux.html#package-repository-installation)
wget -qO - 'https://bintray.com/user/downloadSubjectPublicKey?username=openhab' | sudo apt-key add - echo 'deb http://dl.bintray.com/openhab/apt-repo2 stable main' | sudo tee /etc/apt/sources.list.d/openhab2.list 
sudo apt-get update 
sudo apt-get install openhab2 openhab2-addons
서비스 제어
  • sudo update-rc.d openhab2 defaults
  • sudo /etc/init.d/openhab2 start
  • sudo /etc/init.d/openhab2 stop
  • Restart 명령의 경우 서비스가 제대로 종료안되는 이슈가 있으므로 stop 후 start해야 함.
초기 설정
  • sudo /etc/init.d/openhab2 start
  • 웹브라우저에서 http://openhab_server_ip:8080 접속
  • Standard package setup 클릭해서 UI 설치
  • Paper UI 선택
  • 우측 상단 메뉴 –> Addons –> Bindings tab에서 MQTT binding 선택 후 설치

MQTT

가벼운 메시징 프로토콜로서 센서 등과 같은 HW에서 사용하기 좋은 통신 방법이다. HTTP바인딩과 달리, 메시징 서버(=브로커)가 외부접근 가능하면, 방화벽 등의 상관없이 통신이 가능하여 선택하였다. 사실 로컬네트워크안에 라즈베리파이를 가지고 MQTT 서버(=브로커)를 운영해도 괜찮지만, 이미 가지고 있는 $5 짜리 DigitalOcean 가상서버에 OpenHAB2와 MQTT서버를 운영함으로써, 방화벽 등의 문제도 피해갈 수 있으리라는 판단이었다. (사실 인터넷망이 공인 ip를 주지 않는 서비스라서… ㅠ.ㅠ)

설치
sudo apt-get install python-software-properties 
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa 
sudo apt-get update 
sudo apt-get install mosquitto mosquitto-clients
기본 테스트
  • 터미널 1: mosquitto_sub -h localhost -t /test_topic
  • 터미널 2: mosquitto_pub -h localhost -t /test_topic -m “Message from terminal 2”
  • Topic = 채팅방이라고 생각하면 됨

OpenHAB2 + MQTT기반 Switch 연동

현재 시점으로 MQTT binding의 경우 OpenHAB2의 UI에서 설정이 안되므로 1.x처럼 파일을 직접 편집해야 함

/etc/openhab2/services/mqtt.cfg
# mymqtt = MQTT broker name
mymqtt.url=tcp://localhost:1883
mymqtt.clientId=openHAB
mymqtt.qos=2
mymqtt.retain=true
mymqtt.async=true
/etc/openhab2/items/switch.items
# mqttsw1 : OpenHAB2내부에서 사용되는 id
# mqtt : mqtt type binding
# mymqtt : broker name
# /testsw/1/command : 제어용 MQTT 채널
# /testsw/1/state: 상태확인용 MQTT 채널

Switch mqttsw1 “Switch 1″ (all) {mqtt=”>[mymqtt:/testsw/1/command:command:ON:1],>[mymqtt:/testsw/1/command:command:OFF:0],<[mymqtt:/testsw/1/state:state:ON:1],<[mymqtt:/testsw/1/state:state:OFF:0]”}

/etc/openhab2/sitemaps/Test.sitemap
# Test : sitemap name, file name과 일치해야 함
# mqttsw1: OpenHAB2내부에서 사용되는 id
# “MQTT Switch 1”: UI에서 표시되는 레이블
sitemap Test label=”Menu”
{
  Frame label=”MQTT”
  {
    Switch item=mqttsw1 label=”MQTT Switch 1″
  }
}
안드로이드폰에 OpenHAB 설치 설치
  • 실행 후 처음 보는 선택창에서 _default 선택(의미없슴)
  • 우측 상단 버튼(…) 눌러서 Setting 진입 후 demo mode uncheck 한 후 openHAB URL에 http://openhab_server_ip:8080 입력 후 이전으로 돌아가기 버튼 누르면 지정해준 서버에 연결함
  • 우측 상단 버튼(…) 눌러서 Select default sitemap 선택해서 위에서 생성해준 Test를 선택하면 다음처럼 제어버튼 및 현재 상태를 볼 수 있슴
    openhab_android_app
안드로이드에서 테스트
  • OpenHAB서버에서 tail -f /var/log/openhab2/events.log 해서 상태변화를 감지함
  • Toggle 스위치를 선택할 때마다 다음과 같은 메시지가 나오면서 상태가 변화됨을 확인
2017-02-27 19:58:24.608 [ItemCommandEvent ] - Item 'mqttsw1' received command OFF 
2017-02-27 19:58:24.614 [ItemStateChangedEvent ] - mqttsw1 changed from ON to OFF
MQTT 메시지를 가지고 테스트(HW 스위치 시뮬레이션)
  • OpenHAB서버에서 tail -f /var/log/openhab2/events.log 해서 상태변화를 감지함
  • mosquitto_pub -h localhost -t /testsw/1/state -m 1 실행 후 상태가 ON으로 변하는 지 확인(참고로 1, 0, “1”, “0” 모두 가능함)
MQTT 사용자 인증 / 토픽 접근 제어
  • sudo vi /etc/mosquitto/mosquitto.users 해서 아이디:암호 형식으로 user_1:password_1처럼 1줄에 1개씩 기재
  • sudo mosquitto_passwd -U /etc/mosquitto/mosquitto.users
  • sudo vi /etc/mosquitto/mosquitto.conf 해서 다음을 추가
allow_anonymous false 
password_file /etc/mosquitto/mosquitto.users 
  • sudo service mosquitto restart해서 재시작
테스트 해보자.
  • 터미널 1: mosquitto_sub -h localhost -t /test_topic -u user_1 -P password_1
  • 터미널 2:
    • mosquitto_pub -h localhost -t /test_topic -m "Message from terminal 2" -u user_1 -P password_1 –> OK
    • mosquitto_pub -h localhost -t /test_topic -m "Message from terminal 2" –> Connection refused
  • sudo vi /etc/mosquitto/mosquitto.acl 해서 다음을 추가
user user_1 
topic /testsw/1/command 
topic /testsw/1/state

sudo service mosquitto restart

테스트 해보자.
  • 터미널 1: mosquitto_sub -h localhost -t /testsw/1/state -u user_1 -P password_1
  • 터미널 2: mosquitto_pub -h localhost -t /testsw/1/state -m "ON" -u user_1 -P password_1 –> OK
  • 터미널 1: mosquitto_sub -h localhost -t /testsw/**2**/state -u user_1 -P password_1
  • 터미널 2: mosquitto_pub -h localhost -t /testsw/**2**/state -m "ON" -u user_1 -P password_1  –> 메시지가 보내지지 않음
OpenHAB2의 mqtt.cfg 변경

설정한 아이디/암호를 /etc/openhab2/services/mqtt.cfg에 반영

mymqtt.user=user_1 
mymqtt.pwd=password_1
Feb 242017
 

작년 ADSL 모뎀을 자동으로 리부팅시켜주는 기기를 찾다가 우연히 발견한 제품이다. 당시 아마존에 인터넷 연결이 끊어지면 모뎀을 자동으로 리부팅시켜주는 Wifi Reset plug 제품이 있었는데, 거기에서 이 제품이 Kankun smart plug 제품과 동일하다는 글을 보게 되었다.

Aliexpress에서 보니 역시나 동일한 외양의 제품이 약 USD 13에 판매중이었다. 꼬리에 꼬리를 이은 검색 끝에, Kankun Smart Plug KK-SP3라는 제품이 OpenWRT기반의 AC outlet sw라는 결론에 도달했다. 무슨 얘기냐 하면, AC플러그 제어가 가능한 초저전력 USD 13짜리 리눅스 박스였다. 

AC outlet은 Free volt로 대략 10A / 90V-265V  / 50HZ-60HZ / 최대 2200W를 지원하므로 큰 전력을 필요로 하지 않는 기기에 사용가능하다. 제어용 안드로이드앱을 사용하면 Timer/Delayed timer/스마트폰 완충시 자동 차단/Wifi 신호 증폭 기능을 사용할 수 있다. 입력 단자는 US, AU, EU, UK형식이 있고 출력 단자는 유니버셜타입이여서 AU형식으로 3개를 주문했다. 작년 기준으로 일단 원격 제어만 해도 13불 정도면 쓸만한  수준(지금은 더 저렴한 녀석들도 많긴 하다)이었고, 추후 해킹을 통해 가지고 놀 수도 있을 거라는 생각(PushBullet연동, 인터넷 회선 감시, 출/퇴근시 자동 ON/OFF, OpenHAB연동 등등)에서 였다. 물론 인터넷 회선 감시해야 하는 필요성은 인터넷 회사를 바꿈으로서 사라지긴 했다.

kankun_appearance

받고나서 제어용 안드로이드앱을 깔아서 설정하면 되는데 이 과정이 작년에는 조금 잘 안되었고 기능도 없었는데 최근에 해보니 앱도 깔끔해지고 설정/기능도 훨씬 좋아졌다. 앱스토어에서 Kankun을 검색 후 나오는 중국어플을 깔면 된다. 물론 설치 후에는 영어로 표시된다.

kankun_app

  • 스마트폰: 집안 무선랜에 접속한다.

kankun_setup

  • 스마트폰: SmartPlug앱을 실행해서 Setting탭으로 간 후 접속한 무선랜 비번을 입력한다.
  • SW: 스위치를 콘센트에 꽂은 후 20초를 기다린다 –> 한쪽 끝에 있는 스위치를 5초간 누른 후 손을 뗀다 –> 다시 20초를 기다리면 파란색 LED가 점등한다.

kankun_setup

  • 스마트폰: 무선랜 목록에서 OK_SP3(스위치가 생성한 ad-hoc 무선랜)를 선택해서 연결한다.

kankun_setup

  • 스마트폰: SmartPlug앱에서 Configure버튼을 누른다. 100%까지 될 때까지 기다린다.

kankun_setup

  • 스마트폰: 다음과 같은 메시지가 나와도 별 이상없으니 무시한다.

kankun_setup

  • 스마트폰: SmartPlug라고 상단에 새로 잡힌 스위치가 Device List로 가면 보인다.

kankun_setup

  • 기기 목록에서 스위치를 선택하면 현재 상태를 보여준다.

kankun_setup

  • 가운데 버튼을 누르면 ON/OFF 조절이 가능하다.

kankun_setup

  • 오른쪽 하단 + 버튼을 누르면 추가 기능 메뉴가 나온다.

kankun_setup

  • 타이머 설정으로 특정 시간/요일 범위에서 ON/OFF를 조절할 수 있는데, 복수 타이머 설정도 가능하다.

kankun_setup

  • Delay timer는 일단 시간 후에 상태를 toggle해 주는 타이머다.

kankun_setup

  • 스마트 컨트롤에는 Wifi 신호 증폭 및 만충시 자동 차단 기능이 있다. 신호 증폭은 얼마나 되는 지 모르겠으나 스마트폰 만충시 자동차단을 쓸만한 거 같다. 다만 스위치를 계속 켜고 스마트폰의 무선랜도 계속 켜놔야 한다는 점에서 과연 얼마나 실효가 있을지는 모르겠다.

kankun_setup

이로써 기본적인 소개와 사용법은 끝났고 신나게 갖고 노는 방법은 다음에 알아보기로 하겠다.

May 192016
 

kk-sp3

공장초기화

전원을 넣고 20초 정도를 기다린 후 전면부 구석에 있는 스위치를 5초 이상 누른 후 손을 떼면 청색 LED가 켜진 상태로 있다가 공장초기화 후 재부팅 된다.

adhoc 모드로 기기에 연결

OK_SP3라는 SSID에 pc를 연결하면 된다.

ssh 접속

192.168.10.253로 ssh 접속(id: root, pw:p9z34c)하면 된다. 만약 이전에 다른 스위치로 이미 접속한 적이 있다면 host identification이 바뀌었다며 접속이 되지 않을 것이다. 이런 경우는 ~/.ssh/known_hosts를 지우면 된다. 윈도우의 경우라면…흠…잘 모르겠다.

펌웨어 버전

cat /etc/online.txt하면 VerInfo SW_VER3.4 HW_VER1.2 (null) (null) (null) (null)같이 출력된다. 펌웨어는 3.4(현재 3.5까지 나와있으나 구글커뮤니티를 보면 무슨 문제가 있는지 3.3으로 다운그레이드를 하는 듯 하다.)이고 하드웨어는 1.2이다. 별 다른 업그레이드 필요를 느끼지 못해서 그냥 넘어가지만 추후를 대비해서 펌웨어 업그레이드 방법을 남겨둔다.

# /tmp가 가장 여유용량이 많다.
cd /tmp
# https는 안됨
wget 펌웨어_다운로드_url(https는 안됨); 
sysupgrade -c 펌웨어파일명; 

password 변경

보안을 위해 passwd 실행 후 원하는 암호로 변경한다.

네트워크 설정

WIFI 설정

사용중인 무선랜에 접속하도록 SSID와 암호 등을 설정해준다. Wifi country code를 참조해서 Wifi country code를 골라서 설정해주면 좋다.

vi /etc/config/wireless

config wifi-device radio0
  option type mac80211
  option channel 11
  option hwmode 11ng
  option path 'platform/ar933x_wmac'
  option htmode HT20
    list ht_capab SHORT-GI-20
    list ht_capab SHORT-GI-40
    list ht_capab RX-STBC1
    list ht_capab DSSS_CCK-40
# REMOVE THIS LINE TO ENABLE WIFI:
  option disabled 0
  option country 'NZ'

config wifi-iface
  option device radio0
  option network wwan
  option mode sta
  option ssid 'YourWIFISSID'
  option key 'PasswordToYourWIFISSID'
  option encryption psk
네트워크 설정

무선랜 설정에서 지정한 wwan에 대한 항목을 추가해준다. 일단 DHCP로 IP를 받아오게 한 후, 인터넷 라우터에서 고정할당을 해주고, static으로 변경하여 고정된 ip를 사용하게 할 예정이다.

vi /etc/config/network

config interface 'loopback'
  option ifname 'lo'
  option proto 'static'
  option ipaddr '127.0.0.1'
  option netmask '255.0.0.0'

config globals 'globals'
  option ula_prefix 'fdab:ee91:1053::/48'

config interface 'lan'
  option ifname 'eth0'
  option type 'bridge'
  option proto 'static'
  option ipaddr '192.168.10.253'
  option netmask '255.255.255.0'
  option ip6assign '60'

config interface 'wwan'
  option proto 'dhcp'

변경을 마치고 reboot 명령어로 리부팅한 후 라우터로 가서 새로 등록된 DHCP 기기를 확인 후 IP고정할당을 해주면 된다.

NTP 설정과 시작시 Power on

여기를 참조해서 /etc/config/system파일과 /etc/TZ을 다음과 같이 수정 후 ntp 클라이언트를 실행(/etc/init.d/sysntpd enable; /etc/init.d/sysntpd start)해서 장치의 시간이 정확히 업데이트되고 부팅 직후 Relay를 on으로 만들 수 있었다.

vi /etc/config/system

config system
  option hostname 'MySwitch2'
  option zonename 'Pacific/Auckland'
  option timezone 'NZST-12NZDT,M9.5.0,M4.1.0/3'
  option conloglevel '8'
  option cronloglevel '8'

config timeserver 'ntp'
  list server '0.openwrt.pool.ntp.org'
  list server '1.openwrt.pool.ntp.org'
  list server '2.openwrt.pool.ntp.org'
  list server '3.openwrt.pool.ntp.org'
  option enable_server '0'

config restorefactory
  option button 'reset'
  option action 'pressed'
  option timeout '2'

config led
  option name 'flashing'
  option sysfs 'tp-link:blue:config'
  option trigger 'none'
  option default '1'

config led
  option name 'Relay'
  option sysfs 'tp-link:blue:relay'
  option trigger 'none'
  option default '1'

이후 /etc/init.d/sysntpd enable; /etc/init.d/sysntpd start해서 데몬을 재실행해주면 된다.

HTTP 서버

놀랍게도 이 작은 녀석이 http 서버 역할도 한다. 부팅 후 기본적으로 서버가 동작하는 데 document root는 /www이다. 보안상 디렉토리 구조를 보여주지 않는 것이 좋기도 하고, 추후 /www에 설정 파일을 생성할 예정이므로 index.html을 생성해 두기로 한다.

vi /www/index.html

MySwitchMy Switch Control

pc에서 웹브라우저를 열고 장치의 ip로 접근해보면 생성한 index.html이 열리는 걸 볼 수 있다.

opkg 설치 및 패키지 목록 업데이트

opkg는 ipkg의 fork 프로젝트인데 embedded linux용 패키지 관리자다. 추후 curl 설치를 위해 설치가 필요한데, 장치에서 바로 다운로드 후 설치하면 된다.

cd /root 
wget https://madforfamily.com/wp-content/uploads/2016/05/opkg-rc3.tar.gz 
tar xz -C / -f /root/opkg-rc3.tar.gz 
# 시간이 좀 걸린다.
opkg update
# 공간 절약을 위해 설치파일 삭제
rm opkg-rc3.tar.gz
Update

HTTPS 적용으로 인해 위의 wget이용한 다운로드가 불가능하다(설치된 wget는 https 지원안함). 따라서 해당 파일을 로컬 pc에 다운로드 후 scp 등을 통해 장치로 copy해넣어야 한다.

« 1 2