Oct 042017
 

Docker

  • apt-get install lsb-release
  • curl -sSL https://get.docker.com | sh
  • docker run –rm armv7/armhf-ubuntu_core /bin/echo ‘Hello world’

Docker-compose

  • git clone https://github.com/docker/compose.git
  • cd compose
  • docker build -t docker-compose:armhf -f Dockerfile.armhf .
  • docker run –rm –entrypoint=”script/build/linux-entrypoint” -v $(pwd)/dist:/code/dist -v $(pwd)/.git:/code/.git “docker-compose:armhf”
  • ls -l dist/
  • cp dist/docker-compose-Linux-armv7l /usr/local/bin/docker-compose
  • chown root:root /usr/local/bin/docker-compose
  • chmod 0755 /usr/local/bin/docker-compose
  • docker-compose version

Dockerized HASS(Home ASSistant)

  • apt-get install jq socat wget
  • wget https://raw.githubusercontent.com/home-assistant/hassio-build/master/install/hassio_install
  • chmod +x hassio_install
  • ./hassio_install -m raspberrypi3
  • http://rpi_ip_address:8123 접속하면 됨(최초 접속시 처리에 시간이 조금 소요됨)
  • 기본적으로 부팅시 자동실행되도록 설정되어 있슴

Dcokerized Node-Red

  • cd /root/node-red
  • wget https://github.com/pointbre/nodered-dietpi/blob/master/Dockerfile
  • docker build -t nodered-rpi:0.1 .
  • docker run -dit -p 1880:1880 –name nodered –privileged -v /root/node-red:/data nodered-rpi:0.1
  • 이제 http://rip_ip_address:1880 접속하면 됨
  • 한번 run한 이후로는 docker start nodered 혹은 docker stop nodered만 해주면 된다.
  • 부팅 후 자동 실행을 위해서는 /etc/systemd/system nodered.service 파일을 복사해넣은 후 cd /etc/systemd/system && systemctl enable nodered.service 하면 된다. 재부팅 후 HASS(port 8123, 실행이 시간이 약간 소요됨)와 Node-Red(port 1880)에 접속하면 두 서비스가 모두 살아있음을 확인할 수 있다.
  • 참고로, docker container안에서 백그라운드 서비스만 실행하는 경우, 실행 후 바로 docker container가 종료되는 현상이 있다. 이를 방지하기 위해서 bash 프로세스를 하나 더 실행하는 방식으로 node-red docker container가 계속 실행되도록 하는 트릭이 필요했다. 자세한 내용은 github을 참고하면 된다.
Oct 042017
 

둘째가 벌써 만 8개월이 되었다. 그동안 이것저것 시작했다가 방치해 놓았던 것들이 눈에 들어오기 시작하는 걸 보니 육아의 난이도가 조금은 낮춰진 거 같다. 가구 배치도 바꾸고, 가든 정리도 다시 시작하고, 그에 걸맞게 내 서재방도 깔끔하게 정리했다. 방이 정돈되고 나니, 뭔가를 다시 시작하거나 시작했던 것을 진행해야 할 것 같은 느낌이 들었다. 조그만한 노트를 꺼내고 뭘할까 고민하다가, 와이프에게 필요한 무선 프린터 서버를 해보기로 했다.

DietPi on RPi3

예전에 사두었던 라즈베리파이3를 꺼내들었다. 알리익스프레스에서 깔끔하게 생긴 알루미늄 케이스를 같이 주문했는데, 케이스안에 넣으니 안 그래도 성능 안 좋은 내장 와이파이가, 더욱 더 엉망이 되어서 라즈베리파이3에 잘 붙는 USB 무선랜카드 EDUP EP-N8531을 구매했었다. OS는 DietPi로 하기로 했다. 귀찮은 세팅작업 없이 바로 서버용으로 쓰기에 편하고, 인기있는 어플리케이션들을 한방에 설치할 수도 있기도 하고 괜찮은 녀석이다.

홈페이지에서 라즈베리용 이미지를 다운받은 후 SD카드에 구우면 되는데, OS X에서는 무료 어플리케이션인 Etcher로 하면 된다. 구운 후에는 SD카드에 있는 설치 설정 파일은 dietpi.txt를 수정해서 바로 wifi 접속(Wifi_Enabled=1, Wifi_SSID=???, Wifi_KEY=???)을 하고 무인 설치(AUTO_Install_Enable=1)도 하고 이것 저것 지정할 수 있다. 설정을 입맛에 바꾼 후 저장한 다음에는, SD카드를 넣고 라즈베리파이3를 켜면 알아서 부팅하고 설치하고 할 것이다. 더 자세한 것은 가이드 문서를 보면 된다.

기나 긴 설치와 업데이트가 끝나면 DietPi는 콘솔모드를 부팅이 되었을 것이다. 모니터에 연결되어 있다면 IP주소를 확인할 수 있고, 아니면 공유기에서 라즈베리파이3에 할당된 IP를 찾아서 ssh 접속할 수 있다. 이후 dietpi-config의 Network Options: Adapters 에서 내장 wifi를 비활성화한 후 usb wifi 어댑터를 끼운 다음 재부팅하면 된다.

라즈베리파이3에 Printer driver 설치

  • 사용중인 HP LaserJet P1102 드라이버는 불행히도 기본 포함되어 있지 않기 때문에 다음처럼 드라이버를 별도로 설치해줘야 한다.
  • apt-get install printer-driver-foo2zjs
  • 이제 dietpi-software를 가지고 Google cloud printer를 한방에 설치하면 된다.

CUPS에 프린터 등록 + 테스트

  • 이제 프린터를 라즈베리파이에 연결 후 https://라즈베리파이3의_ip:631 로 가면 CUPS관리자 페이지에서 Add printer를 한 후 설치한 프린터 드라이버(HP LaserJet Pro P1102 Foomatic/foo2zjs-z2 (recommended))를 선택해서 프린터 추가를 하면 된다. 추가시 Sharing을 선택해줘야 한다.
  • 이후 Administration페이지에서 Share printers connected to this system과 Allow printing from the Internet 옵션도 체크해줘야 한다.
  • 추가한 프린터는 Printers메뉴에서 프린터 선택 후 Maintenance 메뉴에서 Print Test Page를 선택해서 테스트할 수 있다.

OS X Sierra 10.12.5

프린터 추가해서 Bonjour 통해서(Google cloud print 설치시 Bonjour지원하는 avahi-daemon이 같이 설치되었슴) 자동으로 잡힌 프린터를 추가해주면 되는데 주의할 점은 자동으로 드라이버가 잡혀서 HP LaserJet Pro P1102 Foomatic/foo2zjs-z2 (recommended)가 선택될 때까지 기다려야 한다. 이 드라이버는 라즈베리파이3에서 실행되고 있는 CUPS를 통해서 다운로드 된 것이다.

윈도우 10

윈도우에서는 조금 복잡하다. 일단 프린터 드라이버를 다운로드 후 프린터 케이블을 꽂아서 드라이버를 설치해야 한다. 아마 CUPS서버에 윈도우용 드라이버가 없어서 일듯 하다. 만약 이미 윈도우용 드라이버가 지원되는 모델이라면그 이후 프린터를 다시 라즈베리파이3에 꽂은 후 프린터 추가를 해야 하는데, 목록에 없슴을 선택하고 이름으로 추가를 고른 후 CUPS의 Printers메뉴에서 프린터 선택하면 가는 url(https://ip:631/printers/HP_LaserJet_Professional_P1102)을 복사해 넣으면 끝이다.

구글 클라우드 프린트

라즈베리파이3에서 cps-auth를 실행하면 url이 출력되는데 해당 url로 가서 구글 계정 로그인 후 등록을 해야 한다. 이후 dietpi-service restart를 실행하고 나서 systemctl status cloudprintd -l을 실행하면 상태를 확인할 수 있다. 잘 등록이 되었다면 이제 폰에서 찾아서 등록 후 사용하면 되는데, 설정에 인쇄라는 메뉴가 안 보이면 google cloud print를 플레이스토어에서 찾아서 설치해야 하는 거 같다.

Mar 172017
 

Let’s Encrypt 무료 인증서 자동갱신 및 Apache2에 TLS/SSL 적용

언제나 그렇듯 클리앙 팁&강좌 게시판과 사용기게시판을 보다가 우연히 acme.sh을 이용한 무료 SSL 자동 갱신에 대한 글을 보았다. 안 그래도 최근 SSL/TLS 적용해야 할 일이 있기도 했기에 바로 착수했다. 우선 목표는 acme.sh를 이용해서 인증서 자동 갱신 및 갱신 후 아파치 자동 재시작하는 것이다.

acme.sh

Let’s Encrypt 무료 인증서를 자동갱신해주는 쉘스크립트이다. Ubuntu 12.04에서 권한때문에 문제 생기는 게 귀찮아서 acme.sh 실행시 sudo를 사용할 예정인데, crontab에 등록해야 하므로 비밀번호 입력을 생략하기 위해 vi /etc/sudoer한 후 아이디 ALL=(ALL:ALL) NOPASSWD:ALL`처럼 수정해준다. 이제 암호를 다시 입력하지 않고도 sudo를 사용할 수 있게 되었다. 만약 권한 문제가 없으리라 생각되면 이 과정은 생략해도 될듯 하다. 이제 acme.sh를 다운받아서 이제 인증서 생성 및 적용하면 되는데, 무슨 이유에서인지 sudo사용시 절대경로를 지정해야만 실행이 되었다.

sudo ~/.acme.sh/acme.sh --issue -d abc.com -w /var/www/wp_abc_com 
[Wed Mar 15 13:40:27 EDT 2017] Single domain='abc.com' 
[Wed Mar 15 13:40:27 EDT 2017] Getting domain auth token for each domain 
[Wed Mar 15 13:40:27 EDT 2017] Getting webroot for domain='abc.com' 
[Wed Mar 15 13:40:27 EDT 2017] Getting new-authz for domain='abc.com' 
[Wed Mar 15 13:40:28 EDT 2017] The new-authz request is ok. 
... 
[Wed Mar 15 13:40:29 EDT 2017] Cert success. 
-----BEGIN CERTIFICATE----- 
... 
-----END CERTIFICATE----- 
[Wed Mar 15 13:40:29 EDT 2017] Your cert is in  /home/아이디/.acme.sh/abc.com/abc.com.cer 
[Wed Mar 15 13:40:29 EDT 2017] Your cert key is in  /home/아이디/.acme.sh/abc.com/abc.com.key 
[Wed Mar 15 13:40:29 EDT 2017] The intermediate CA cert is in  /home/아이디/.acme.sh/abc.com/ca.cer 
[Wed Mar 15 13:40:29 EDT 2017] And the full chain certs is there:  /home/아이디/.acme.sh/abc.com/fullchain.cer

마지막 부분에 인증서가 저장된 위치를 보여주면 인증서 생성이 성공된 것이다. crontab -e 해서 보면 acme.sh에 대한 항목이 이미 생성되어 있는 것을 볼 수 있다. 개인 취향상 자동 지정된 시간을 매일 자정에 맞추었고 sudo지정 및 절대경로로 변경했다.

0 0 * * * sudo "/home/아이디/.acme.sh"/acme.sh --cron --home "/home/아이디/.acme.sh" > /dev/null

Apache

아파치에 인증서 갱신 적용하기 이제 아파치에 적용해야 할 시간이다. 그런데 이 부분이 조금 어려웠다. 최초 적용시에는 아무래도 수동으로 직접 인증서를 복사해줘야 하는 것으로 보인다. 복사하지 않고 했더니 자꾸 에러가 났다.

# 먼저 인증서를 저장할 디렉토리를 생성하자 
sudo mkdir /etc/apache2/ssl

# 이제 생성된 인증서를 복사해넣자. 
sudo cp /home/아이디/.acme.sh/abc.com/abc.com.cer /etc/apache2/ssl 
sudo cp /home/아이디/.acme.sh/abc.com/abc.com.key /etc/apache2/ssl 
sudo cp /home/아이디/.acme.sh/abc.com/fullchain.cer /etc/apache2/ssl 

이제는 httpd.conf를 수정해서 https가 사용가능하게 하고, http로 접속시 자동으로 https로 변경되도록 해보자. sudo vi /etc/apache2/httpd.conf해서 다음을 추가/수정한다.

# Load SSL module
LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so

# 기존 VirtualHost를 수정해서 https로 자동 이동되도록 함 

ServerName      abc.com
ServerAlias        www.abc.com
DocumentRoot    /var/www/wp_abc_com
#  외부링크방지
SetEnvIfNoCase Referer abc\.com link_allow
SetEnvIfNoCase Referer www\.abc\.com link_allow
SetEnvIfNoCase Referer clien\.net link_allow
SetEnvIfNoCase Referer m\.clien\.net link_allow
SetEnvIfNoCase Referer ^$ link_allow

Order Deny,Allow
Allow from env=link_allow
Deny from all
ErrorDocument 403 /error_page.php

CustomLog /var/log/apache2/abc.com.access.log combined
LogLevel Error
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://abc.com%{REQUEST_URI} [L,R=301]


# 위의 설정을 카피한 후 아래 부분을 변경처리

ServerName      abc.com:443
DocumentRoot    /var/www/wp_abc_com
#  외부링크방지
SetEnvIfNoCase Referer abc\.com link_allow
SetEnvIfNoCase Referer www\.abc\.com link_allow
SetEnvIfNoCase Referer clien\.net link_allow
SetEnvIfNoCase Referer m\.clien\.net link_allow
SetEnvIfNoCase Referer ^$ link_allow

Order Deny,Allow
Allow from env=link_allow
Deny from all
ErrorDocument 403 /error_page.php

CustomLog /var/log/apache2/abc.com.access.log combined
LogLevel Error
# 인증서 설정
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/apache2/ssl/abc.com.cer
SSLCertificateKeyFile /etc/apache2/ssl/abc.com.key
SSLCertificateChainFile /etc/apache2/ssl/abc.com.key
# Disable SSL V2 and V3
SSLProtocol all -SSLv2 -SSLv3

이제는 https 접속을 위해 포트 443이 막혀있다면, sudo ufw allow 443해서 방화벽에서 열어줘야 한다. 이제 sudo service apache restart하고 http://abc.com 접속해서 https://abc.com 으로 자동 이동되고 안전한 사이트로 표시되는 지 확인해보자. 다 잘 되었다면 이제 acme.sh가 인증서 갱신 후 아까 생성해둔 디렉토리로 인증서를 복사해넣고 아파치를 재기동하게 해주면 끝이다. 이에 앞서 아까 수동으로 복사해둔 인증서들을 삭제하고 다음 명령을 실행해서 인증서들이 잘 복사되는 지 확인하면 된다.

sudo “/home/아이디/.acme.sh”/acme.sh –install-cert -d abc.com \
–home “/home/아이디/.acme.sh” \
–certpath      /etc/apache2/ssl/abc.com.cer \
–keypath      /etc/apache2/ssl/abc.com.key \
–fullchainpath /etc/apache2/ssl/fullchain.cer \
–reloadcmd    “sudo service apache2 force-reload”

이제 acme.sh가 생성한 설정을 확인해보자. 다음 갱신이 언제인지, 어디로 인증서를 복사해넣을지 등에 대한 설정이 저장되어 있는 것을 볼 수 있을 것이다. vi /home/아이디/.acme.sh/abc.com/abc.com.conf하면 다음처럼 나올 것이다.

Le_Domain=’abc.com’
Le_Alt=’no’
Le_Webroot=’/var/www/wp_abc_com’
Le_PreHook=”
Le_PostHook=”
Le_RenewHook=”
Le_API=’https://acme-v01.api.letsencrypt.org’
Le_Keylength=”
Le_LinkCert=’https://acme-v01.api.letsencrypt.org/acme/cert/…’
Le_LinkIssuer=’https://acme-v01.api.letsencrypt.org/acme/issuer-cert’
Le_CertCreateTime=’1489601638′
Le_CertCreateTimeStr=’Wed Mar 15 18:13:58 UTC 2017′
Le_NextRenewTimeStr=’Sun May 14 18:13:58 UTC 2017′
Le_NextRenewTime=’1494699238′
Le_RealCertPath=’/etc/apache2/ssl/abc.com.cer’
Le_RealCACertPath=”
Le_RealKeyPath=’/etc/apache2/ssl/abc.com.key’
Le_ReloadCmd=’sudo service apache2 force-reload’
Le_RealFullChainPath=’/etc/apache2/ssl/fullchain.cer’

이제 Let’s Encrypt 인증서 자동 갱신 적용이 끝났다.

Updated

PC 브라우저에서는 문제가 없었는데 안드로이드 크롬에서 보니 insecure로 나와서 다시 확인을 해보았다. certificate chain 파일이 잘못된 듯 했다. acme.sh에서 생성해준 fullchain.cer을 지정해봤으나 타임아웃이 걸릴 정도로 뭔가 문제가 있었고… 구글 검색을 통해https://whatsmychaincert.com 에 가서 사이트명 넣고 chain cert파일을 다운로드 받은 후 SSLCertificateChainFile /etc/apache2/ssl/abc.com.chain.crt처럼 http.conf에 적용했다. 아파치 재부팅 후 테스트해보니 pc와 안드로이드 모두 제대로 나온다.

Mar 042017
 

Rule작성법을 연습하기 위해 PushBullet 연동을 해보았다. Kankun wifi plug의 상태가 변할 때마다 push notification을 받을 수 있도록 OpenHAB2 rule을 작성하면 된다.

PushBullet api token 준비

Pushbullet에서 Account setting페이지를 가보면 Access token을 생성할 수 있다.

Rule 작성

sudo -u openhab vi /etc/openhab2/rules/switch.rules 해서 다음을 입력

rule "switchOn" 
when Item mqttsw1 changed from OFF to ON 
then executeCommandLine("curl@@-k@@-H@@Access-Token: 토큰키@@-XPOST@@https://api.pushbullet.com/v2/pushes@@-H@@Content-Type: application/json@@--data-binary@@{\"type\": \"note\", \"title\": \"스위치1 상태", \"body\": \"현재 On입니다.\"}@@") 
end 

rule "switchOff" 
when Item mqttsw1 changed from ON to OFF 
then executeCommandLine("curl@@-k@@-H@@Access-Token: 토큰키@@-XPOST@@https://api.pushbullet.com/v2/pushes@@-H@@Content-Type: application/json@@--data-binary@@{\"type\": \"note\", \"title\": \"스위치1 상태\", \"body\": \"현재 Off입니다."}@@") 
end 

이제 스위치를 On/Off하면 이제 푸쉬메시지가 온다.

Mar 042017
 

이상하게 들리겠지만, 기본적으로 OpenHAB2는 UI(관리 페이지)에 대해 사용자 인증이 없다. 이 얘기는 관리자 페이지를 외부 접속이 되게 하면, 무방비로 노출이 된다는 얘기다. 이것에 대해 여러 보완책이 있는데 OpenHAB cloud connector를 사용해보기로 했다.

overrides.propertie파일로 인한 에러를 막기 위해 빈 파일 생성

sudo -u openhab touch /var/lib/openhab2/etc/overrides.properties

Paper UI의 Add-on메뉴에서 Misc항목에 있는 OpenHAB cloud connector를 설치

이상하게 Installing이 멈추지 않는데, 그래도 괜찮은듯 하다

uuid와 secret

다음 파일의 내용을 적어둔다 /var/lib/openhab2/uuid /var/lib/openhab2/openhabcloud/secret

myopenhab.org에서 위에서 생성한 uuid와 secret을 가지고 회원 가입

가입시 사용한 이메일 확인하면 인증메일이 와 있다. 메일내의 링크를 클릭해서 인증 완료

openhab2 재시작

sudo /etc/init.d/openhab2 stop 
sudo /etc/init.d/openhab2 start

myopenhab.org에 로그인하면 다음과 같은 메시지가 나오고 링크를 클릭하면 관리자 페이지 접근이 가능함

You are using openHAB 2.x. Click here to access your openHAB's dashboard

안드로이드 OpenHAB 앱의 Settings에 Remote URL = https://myopenhab.org와 가입한 id/pw를 입력하고 URL에 적었던 url/ip를 삭제 후 제어/모니터링 되는지 확인

이제 myopenhab.org를 통해 접근이 되므로 Paper UI를 외부 접근이 안되도록 만들면 된다.

sudo -u openhab vi /var/lib/openhab2/etc/org.ops4j.pax.web.cfg 후 다음처럼 변경 후 openhab2 재시작 org.ops4j.pax.web.listening.addresses = 127.0.0.1` 
sudo /etc/init.d/openhab2 stop 
sudo /etc/init.d/openhab2 start

주의

관리페이지에 대해 방화벽을 열어놔야 한다. 방화벽을 열어도 OpenHAB2가 127.0.0.1에 대해서만 응답하므로 걱정하지 않아도 된다.

Mar 012017
 

Mosquitto client(No-SSL 버전) 설치

다음의 두 명령어를 Kankun wifi plug에 SSH 접속 후 실행하면 MQTT client 중 하나인 mosquitto_pub과 mosquito_sub가 설치된다.

opkg update
opkg install mosquitto-client-nossl

메시지 송수신 테스트

Kankun –> MQTT
  • MQTT 서버쪽에서 mosquitto_sub -h localhost -t /testsw/1/state -u user_1  -P password_1 실행해서 메시지 수신 대기
  • Kankun 기기에서 mosquitto_pub -h mqtt_server_ip -t /testsw/1/state -m 1 -u user_1  -P password_1 실행해서 메시지 송신해서 MQTT서버측에 잘 송신되는지 확인

MQTT –> Kankun

  • Kankun 기기에서 mosquitto_sub -h mqtt_server_ip -t /testsw/1/state -u user_1  -P password_1 실행해서 메시지 수신 대기
  • MQTT 서버쪽에서 mosquitto_pub -h localhost -t /testsw/1/state -m 1 -u user_1  -P password_1 실행해서 메시지 송신해서 Kankun 스위치쪽으로 잘 송신되는지 확인

2번의 테스트를 통해 망이나 방화벽 상관없이 외부 MQTT 서버를 통해 메시지가 문제없이 송수신 됨을 확인했다. 즉, 스위치가 어떤 환경에 있던지 상관없이 외부망에 있는 브로커를 통해 어디서든 통신이 가능하다는 점을 확인한 것이다.

Kankun 스위치에서 현재 상태 publish

Kankun 기기에서 주기적으로 기기 상태를 MQTT로 푸쉬해보자. * mkdir /root/scripts * vi /root/scripts/mqtt_publish.sh 해서 다음을 입력

# !/bin/sh

while true 
do 
  CURR_STATUS="\`cat /sys/class/leds/tp-link:blue:relay/brightness\`"
  mosquitto_pub -h mptt_server_ip -t /testsw/1/state -u user_1 -P password_1 -m $CURR_STATUS 
  sleep 5 
done
  • chmod 755 /root/scripts/mqtt_publish.sh

자동 시작되도록 vi /etc/profile 해서 /root/scripts/mqtt_publish.sh &을 추가한다.

이제 reboot 실행해서 재부팅하고 접속 후에 테스트해보자. * echo "1" > /sys/class/leds/tp-link:blue:relay/brightness 해서 안드로이드앱의 스위치 상태가 ON으로 변경되는지 확인 * echo “0” > /sys/class/leds/tp-link:blue:relay/brightness` 해서 안드로이드앱의 스위치 상태가 OFF으로 변경되는지 확인

MQTT 서버에서 Kankun 스위치 제어

MQTT를 통해 상태를 알 수 있게 되었으니 이제는 제어해보자.

Kankun 기기에서 mkdir /root/work 한 후 vi /root/scripts/mqtt_subscribe.sh 해서 다음을 입력한다.

#!/bin/sh 
mosquitto_sub -h mqtt_server_ip-t /testsw/1/command -u user_1-P password_1 >> /root/work/mqtt.dat 2>/dev/null

chmod 755 /root/scripts/mqtt_subscribe.sh 한 다음 vi /etc/profile 해서 /root/scripts/mqtt_subscribe.sh & 을 추가해준다.

제어를 위해서 vi /root/scripts/mqtt_command.sh 해서 다음을 입력한다.

#!/bin/sh 
while true 
do 
  if [ -e /root/work/mqtt.dat ]; then 
    COMMAND="\`tail -1 /root/work/mqtt.dat\`"    
  fi 

  if [ "$COMMAND" = "1" ]; then 
    echo "1" > /sys/class/leds/tp-link:blue:relay/brightness 
  elif [ "$COMMAND" = "0" ]; then 
    echo "0" > /sys/class/leds/tp-link:blue:relay/brightness 
  fi 
  echo "" > /root/work/mqtt.dat 
  sleep 5 
done

chmod 755 /root/scripts/mqtt_command.shvi /etc/profile 해서 /root/scripts/mqtt_command.sh & 을 추가해주면 준비가 끝이 난다. reboot 실행해서 재부팅 한 후 기기에 접속해서 테스트해보자.

OpenHAB앱에서 스위치 ON해보니 대략 5초가 소요된 후 Kankun 기기의 /sys/class/leds/tp-link:blue:relay/brightness가 1로 변경되고 스위치가 ON되었다.

스위치를 추가할 때 변경해야 하는 부분들

  • /etc/openhab2/item/switch.items에 스위치별 topic(제어용/모니터링용) 선정 후 스위치 추가
  • /etc/openhab2/sitemap/Test.sitemap에 추가된 스위치 추가
  • /etc/mosquitto/mosquitto.acl에 추가된 topic을 사용자별로 추가

이제 …

Kankun 스위치에 위의 스크립트를 복사해 넣고 topic을 변경 기나긴 설정과 테스트의 끝에 드디어 Kankun wifi plug를 OpenHAB2 + MQTT 기반으로 제어 및 모니터링에 성공했다. 전용앱으로 쉽게 갈 수 있는 길을 어렵게 간 듯 하지만, 나중에 구현할 Follow Me 기능(특정 스마트폰이 집안 인터넷에 무선랜 접속시 뭔가를 하거나, 무선랜에서 접속이 사라지면 뭔가를 하거나 하는 등의 기능)을 위해서는 OpenHAB과 MQTT가 꼭 필요했다. 언제 다시 할 수 있을지는 모르겠지만…

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

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

Aug 222016
 

DR-BT22 블루투쓰 헤드셋을 우분투에 물려 쓰려고 블루투쓰 usb아답터를 구매해서 사용하기 시작했다. 그런데 자동연결은 되는데, 소리가 헤드셋으로 나오질 않아서 수동으로 전환해야 했다. 찾아보니 다음의 설정을 통해 가능했다.

  • sudo vi /etc/pulse/default.pa 해서 load-module module-switch-on-connect를 추가
  • sudo service pulseaudio restart

이제 헤드셋을 켜고, 플레이버튼만 누르면 자동 연결 후 사운드 장치 전환도 한번에 된다.

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이다. 별 다른 업그레이드 필요를 느끼지 못해서 그냥 넘어가지만 추후를 대비해서 펌웨어 업그레이드 방법을 남겨둔다.
cd /tmp (tmp가 가장 여유용량이 많다);
wget 펌웨어_다운로드_url(https는 안됨);
sysupgrade -c 펌웨어파일명;

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

네트워크 설정
(1) WIFI 설정
사용중인 무선랜에 접속하도록 SSID와 암호 등을 설정해준다. http://www.cisco.com/c/en/us/td/docs/wireless/wcs/3-2/configuration/guide/wcscfg32/wcscod.html를 참조해서 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

(2) 네트워크 설정
무선랜 설정에서 지정한 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
<html><head>MySwitch</head><body>My Switch Control</body></html>
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 3 4 5 »