OpenHAB: 엔터프라이즈급 오픈소스 홈 오토메이션 플랫폼




벤더와 기술에 구애받지 않는 자바 기반 스마트홈 자동화 시스템


개요

OpenHAB(open Home Automation Bus)은 2010년 독일 개발자 Kai Kreuzer가 시작한 오픈소스 홈 오토메이션 플랫폼입니다. Java와 OSGi 기반으로 구축되어 엔터프라이즈급 안정성을 제공하며, 다양한 벤더의 스마트 기기를 하나의 시스템으로 통합할 수 있습니다.

항목내용
공식 사이트https://www.openhab.org
GitHubhttps://github.com/openhab
라이선스Eclipse Public License 2.0
최신 버전5.1 (2026년 1월 기준)
Docker 이미지openhab/openhab:5.1.1
기반 기술Java 21, Apache Karaf, OSGi

OpenHAB의 특징

1. 벤더 중립성 (Vendor Agnostic)

특정 제조사에 종속되지 않습니다. Z-Wave, Zigbee, KNX, Modbus, MQTT 등 수백 가지 프로토콜과 기기를 하나의 플랫폼에서 통합 관리할 수 있습니다.

2. 엔터프라이즈급 아키텍처

Java와 OSGi 기반으로 모듈화된 구조를 가집니다. 각 바인딩(Binding)이 독립적으로 로드/언로드되어 시스템 안정성이 높습니다.

3. 텍스트 기반 설정 지원

UI 설정 외에도 .items, .things, .rules 등 텍스트 파일로 전체 시스템을 구성할 수 있어 버전 관리(Git)와 백업이 용이합니다.

4. 강력한 규칙 엔진

JavaScript, Groovy, Python(GraalPy), Blockly 등 다양한 언어로 자동화 규칙을 작성할 수 있습니다.

5. 로컬 우선 (On-Premises)

모든 데이터가 로컬에 저장되고 처리됩니다. 클라우드 의존성이 없어 프라이버시가 보장됩니다.


OpenHAB 5.0 주요 업데이트

Matter 지원 (클라이언트 + 브릿지)

OpenHAB 5.0의 가장 큰 변화는 Matter 프로토콜의 완벽한 지원입니다.

Matter 클라이언트 모드

  • Matter 인증 기기(조명, 스위치, 온도조절기 등)를 OpenHAB에 직접 연결
  • 30개 이상의 디바이스 타입 지원
  • Thread Border Router와 연동하여 Thread 기기도 통합

Matter 브릿지 모드

  • OpenHAB에 연결된 기기를 Apple Home, Google Home, Amazon Alexa, Samsung SmartThings에 노출
  • 기존 Zigbee/Z-Wave 기기도 Matter 생태계로 확장 가능
┌─────────────────────────────────────────────────┐
│                   OpenHAB 5                      │
├─────────────────────────────────────────────────┤
│  Matter Client          │  Matter Bridge        │
│  (Matter 기기 제어)      │  (외부 생태계 노출)    │
│                         │                       │
│  ┌─────────────┐        │  ┌─────────────┐     │
│  │ Matter 조명  │        │  │ Apple Home  │     │
│  │ Matter 스위치│        │  │ Google Home │     │
│  │ Thread 센서  │        │  │ Alexa       │     │
│  └─────────────┘        │  └─────────────┘     │
└─────────────────────────────────────────────────┘

Python 스크립팅 (GraalPy)

기존 Jython 대신 GraalPy 기반 Python 3.11을 지원합니다.

# Python 규칙 예제
from openhab import rule, when, get_item

@rule("모션 감지 조명")
@when("Item Motion_Sensor changed to ON")
def motion_light(event):
    light = get_item("Living_Room_Light")
    if light.state != "ON":
        light.send_command("ON")

Java 21 및 64비트 전용

  • Java 21로 업그레이드 (가상 스레드 등 최신 기능 활용)
  • 32비트 지원 종료 (보안 및 유지보수 이유)
  • 의존성 업데이트로 보안 취약점 해결

OpenHAB vs Home Assistant

항목OpenHABHome Assistant
개발 언어Java (OSGi)Python
시작 연도20102013
설정 방식UI + 텍스트 파일UI + YAML
플러그인Bindings (~300개)Integrations (~3000개)
학습 곡선높음중간
안정성매우 높음높음
커뮤니티 규모중간매우 큼
Matter 지원5.0부터 완벽 지원2023년부터 지원
추천 대상엔터프라이즈, 고급 사용자일반 사용자, 빠른 시작

OpenHAB 선택이 좋은 경우:

  • 텍스트 기반 설정으로 버전 관리가 필요할 때
  • 엔터프라이즈급 안정성이 필요할 때
  • KNX, Modbus 등 산업용 프로토콜을 사용할 때
  • Java 기반 커스터마이징이 필요할 때

Docker Compose로 설치하기

기본 설치

services:
  openhab:
    container_name: openhab
    image: openhab/openhab:5.1.1
    restart: unless-stopped
    network_mode: host
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./openhab_addons:/openhab/addons
      - ./openhab_conf:/openhab/conf
      - ./openhab_userdata:/openhab/userdata
    environment:
      OPENHAB_HTTP_PORT: "8080"
      OPENHAB_HTTPS_PORT: "8443"
      EXTRA_JAVA_OPTS: "-Duser.timezone=Asia/Seoul"

확장 스택 (InfluxDB, Grafana 포함)

services:
  openhab:
    container_name: openhab
    image: openhab/openhab:5.1.1
    restart: unless-stopped
    network_mode: host
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      - ./openhab_addons:/openhab/addons
      - ./openhab_conf:/openhab/conf
      - ./openhab_userdata:/openhab/userdata
    environment:
      OPENHAB_HTTP_PORT: "8080"
      OPENHAB_HTTPS_PORT: "8443"
      EXTRA_JAVA_OPTS: "-Duser.timezone=Asia/Seoul"

  mosquitto:
    container_name: mosquitto
    image: eclipse-mosquitto:latest
    volumes:
      - ./mosquitto/config:/mosquitto/config
      - ./mosquitto/data:/mosquitto/data
      - ./mosquitto/log:/mosquitto/log
    ports:
      - "1883:1883"
      - "9001:9001"
    restart: unless-stopped

  influxdb:
    container_name: influxdb
    image: influxdb:2
    volumes:
      - ./influxdb-data:/var/lib/influxdb2
    ports:
      - "8086:8086"
    restart: unless-stopped
    environment:
      - DOCKER_INFLUXDB_INIT_MODE=setup
      - DOCKER_INFLUXDB_INIT_USERNAME=admin
      - DOCKER_INFLUXDB_INIT_PASSWORD=your_password
      - DOCKER_INFLUXDB_INIT_ORG=openhab
      - DOCKER_INFLUXDB_INIT_BUCKET=openhab

  grafana:
    container_name: grafana
    image: grafana/grafana:latest
    volumes:
      - ./grafana-data:/var/lib/grafana
    ports:
      - "3000:3000"
    restart: unless-stopped
    depends_on:
      - influxdb

설치 및 실행

# 디렉토리 생성
mkdir -p ~/openhab && cd ~/openhab
mkdir -p openhab_addons openhab_conf openhab_userdata

# 권한 설정 (openhab 사용자 ID: 9001)
sudo chown -R 9001:9001 openhab_addons openhab_conf openhab_userdata

# docker-compose.yml 파일 생성 후
docker compose up -d

# 로그 확인
docker logs -f openhab

브라우저에서 http://<서버IP>:8080으로 접속합니다.


핵심 개념

Things (씽)

물리적 기기나 서비스와의 연결 지점입니다. 예를 들어 Zigbee 코디네이터, MQTT 브로커, HTTP 엔드포인트 등이 Thing입니다.

Thing mqtt:broker:mosquitto "Mosquitto Broker" [
    host="localhost",
    port=1883
]

Channels (채널)

Thing 내의 개별 기능입니다. 조명 Thing에는 on/off 채널, 밝기 채널, 색상 채널 등이 있을 수 있습니다.

Items (아이템)

사용자가 상호작용하는 논리적 엔티티입니다. Channel과 연결(링크)되어 실제 기기를 제어합니다.

// items 파일 예제
Switch Living_Room_Light "거실 조명" <light> (gLiving) ["Lighting"]
Dimmer Living_Room_Light_Brightness "거실 조명 밝기 [%d%%]" <slider>
Number:Temperature Outdoor_Temp "실외 온도 [%.1f °C]" <temperature>

Rules (규칙)

자동화 로직을 정의합니다. UI, JavaScript, Blockly, Python 등으로 작성 가능합니다.

// JavaScript 규칙 예제
rules.when()
    .item("Motion_Sensor")
    .changed()
    .to("ON")
    .then(event => {
        items.getItem("Living_Room_Light").sendCommand("ON");
    })
    .build("모션 감지 조명 켜기");

Sitemaps (사이트맵)

Basic UI에서 기기를 어떻게 표시할지 정의합니다.

sitemap home label="우리 집" {
    Frame label="거실" {
        Switch item=Living_Room_Light
        Slider item=Living_Room_Light_Brightness
        Text item=Living_Room_Temp
    }
    Frame label="보안" {
        Switch item=Alarm_System
        Text item=Front_Door_Status
    }
}

주요 Bindings

통신 프로토콜

Binding설명
MQTTIoT 표준 메시지 프로토콜
HTTPREST API 연동
Modbus산업용 통신 프로토콜
KNX빌딩 자동화 표준
Serial시리얼 포트 통신

스마트홈 프로토콜

Binding설명
Matter차세대 스마트홈 표준 (5.0 신규)
Z-Wave저전력 무선 프로토콜
Zigbee메시 네트워크 프로토콜
Bluetooth블루투스 기기 연결
ThreadIPv6 기반 저전력 메시

제조사별 Bindings

Binding설명
HuePhilips Hue 조명
ShellyShelly 스마트 기기
TasmotaTasmota 펌웨어 기기
IKEA TRÅDFRIIKEA 스마트홈
Samsung SmartThings삼성 스마트싱스
Xiaomi Mi샤오미 기기

유틸리티

Binding설명
Astro일출/일몰 계산
Network네트워크 기기 감지
Exec외부 명령 실행
Mail이메일 알림
Telegram텔레그램 봇

자동화 규칙 예제

1. 일출/일몰 기반 조명 제어

// JavaScript (ECMAScript) 규칙
rules.when()
    .channel("astro:sun:home:set#event")
    .triggered("START")
    .then(event => {
        items.getItem("Outdoor_Lights").sendCommand("ON");
        console.log("일몰 - 외부 조명 켜짐");
    })
    .build("일몰 시 외부 조명");

rules.when()
    .channel("astro:sun:home:rise#event")
    .triggered("START")
    .then(event => {
        items.getItem("Outdoor_Lights").sendCommand("OFF");
    })
    .build("일출 시 외부 조명 끄기");

2. 온도 기반 에어컨 제어

rules.when()
    .item("Living_Room_Temp")
    .changed()
    .then(event => {
        const temp = parseFloat(event.itemState.toString());
        const ac = items.getItem("AC_Power");
        
        if (temp > 26 && ac.state === "OFF") {
            ac.sendCommand("ON");
            items.getItem("AC_Temp").sendCommand(24);
        } else if (temp < 23 && ac.state === "ON") {
            ac.sendCommand("OFF");
        }
    })
    .build("온도 기반 에어컨 제어");

3. 재실 감지 (Presence Detection)

rules.when()
    .item("Phone_Network_Status")
    .changed()
    .to("OFFLINE")
    .for("PT10M") // 10분 동안 오프라인
    .then(event => {
        items.getItem("Home_Mode").postUpdate("AWAY");
        items.getItem("All_Lights").sendCommand("OFF");
        items.getItem("Thermostat").sendCommand(18);
    })
    .build("외출 감지");

rules.when()
    .item("Phone_Network_Status")
    .changed()
    .to("ONLINE")
    .then(event => {
        items.getItem("Home_Mode").postUpdate("HOME");
        items.getItem("Entrance_Light").sendCommand("ON");
    })
    .build("귀가 감지");

4. Python 규칙 (GraalPy)

from openhab import rule, when, run
from openhab.items import get_item

@rule("문 열림 알림")
@when("Item Front_Door changed to OPEN")
def door_alert(event):
    telegram = get_item("Telegram_Message")
    telegram.send_command("현관문이 열렸습니다!")
    
    # 밤에는 조명도 켜기
    astro = get_item("Astro_Sun_Phase")
    if astro.state == "NIGHT":
        get_item("Entrance_Light").send_command("ON")

Matter 브릿지 설정

OpenHAB 5.0에서 Matter 브릿지를 설정하면 기존 기기를 Apple Home, Google Home 등에서 사용할 수 있습니다.

1. Matter Binding 설치

Settings → Add-ons → Bindings → Matter 설치

2. Matter 브릿지 Thing 생성

Thing matter:bridge:home "Matter Bridge" [
    // 자동으로 QR 코드 생성
]

3. 기기 노출 설정

UI에서 노출할 Items에 메타데이터 추가:

Switch Living_Room_Light "거실 조명" {
    matter="Light" [type="OnOffLight"]
}

Dimmer Kitchen_Light "주방 조명" {
    matter="Light" [type="DimmableLight"]
}

4. 외부 플랫폼에 페어링

  1. OpenHAB UI에서 Matter Bridge의 QR 코드 확인
  2. Apple Home / Google Home / Alexa 앱에서 “기기 추가”
  3. QR 코드 스캔하여 페어링

클라우드 연동

myopenhab.org

무료 클라우드 서비스로 원격 접속과 음성 어시스턴트 연동을 지원합니다.

  1. https://myopenhab.org 에서 계정 생성
  2. openHAB Cloud Connector 애드온 설치
  3. UUID와 Secret 입력 (userdata/uuid, userdata/openhabcloud/secret)

Google Assistant / Amazon Alexa

myopenhab.org 연동 후 Google Home 또는 Alexa 앱에서 openHAB 스킬을 활성화하면 됩니다.


백업 및 복구

자동 백업 스크립트

#!/bin/bash
# openhab-backup.sh

BACKUP_DIR="/backup/openhab"
DATE=$(date +%Y%m%d_%H%M%S)
OPENHAB_DIR="/home/docker/openhab"

# 컨테이너 정지 (선택사항)
# docker stop openhab

# 설정 백업
tar -czvf "$BACKUP_DIR/openhab_conf_$DATE.tar.gz" \
    "$OPENHAB_DIR/openhab_conf"

# userdata 백업
tar -czvf "$BACKUP_DIR/openhab_userdata_$DATE.tar.gz" \
    "$OPENHAB_DIR/openhab_userdata"

# 컨테이너 재시작
# docker start openhab

# 30일 이상 된 백업 삭제
find "$BACKUP_DIR" -name "openhab_*.tar.gz" -mtime +30 -delete

echo "백업 완료: $DATE"

복구

# 컨테이너 정지
docker stop openhab

# 기존 데이터 이동
mv openhab_conf openhab_conf.old
mv openhab_userdata openhab_userdata.old

# 백업 복원
tar -xzvf openhab_conf_20260120.tar.gz
tar -xzvf openhab_userdata_20260120.tar.gz

# 권한 재설정
sudo chown -R 9001:9001 openhab_conf openhab_userdata

# 컨테이너 시작
docker start openhab

openHABian

Raspberry Pi에서 openHAB을 가장 쉽게 시작하는 방법입니다.

  1. https://www.openhab.org/docs/installation/openhabian.html 에서 이미지 다운로드
  2. SD 카드에 굽기 (Raspberry Pi Imager 사용)
  3. 부팅 후 자동 설정 완료 대기 (약 45분)
  4. http://openhabian:8080 접속

openHABian은 다음을 자동으로 설정합니다:

  • openHAB 최신 버전
  • Frontail (로그 뷰어)
  • Samba (파일 공유)
  • 자동 백업
  • 보안 설정

성능 최적화

JVM 메모리 설정

docker-compose.yml에서:

environment:
  EXTRA_JAVA_OPTS: "-Xms512m -Xmx2g -Duser.timezone=Asia/Seoul"

지속성(Persistence) 최적화

모든 아이템을 저장하지 말고 필요한 것만 저장:

// persistence/influxdb.persist
Strategies {
    everyMinute : "0 * * * * ?"
    everyHour : "0 0 * * * ?"
}

Items {
    // 온도, 습도만 분당 저장
    gTemperature*, gHumidity* : strategy = everyMinute
    
    // 스위치 상태는 변경 시에만
    gSwitches* : strategy = everyChange
}

마무리

OpenHAB은 15년 이상의 역사를 가진 검증된 홈 오토메이션 플랫폼입니다. Home Assistant에 비해 학습 곡선이 높지만, 텍스트 기반 설정, 엔터프라이즈급 안정성, 산업용 프로토콜 지원 등 독보적인 장점이 있습니다.

특히 OpenHAB 5.0에서 추가된 Matter 지원으로, 기존 Zigbee/Z-Wave 기기를 Apple Home, Google Home, Alexa에 쉽게 연결할 수 있게 되었습니다. 스마트홈을 장기적으로 운영하고, 버전 관리가 필요하며, 안정성을 최우선으로 생각한다면 OpenHAB이 좋은 선택입니다.




댓글 남기기