YOGYUI

IKEA TRADFRI Motion Sensor 단독으로 홈킷 연동하기 (homebridge) 본문

Hardware/Sensor

IKEA TRADFRI Motion Sensor 단독으로 홈킷 연동하기 (homebridge)

요겨 2021. 1. 15. 00:44
반응형

얼마전 IKEA 기흥 전시장에 놀러갔다가 홈오토메이션 관련 제품 많이 팔길래 이것저것 사와봤다

(게이트웨이, 전동 블라인드, 스마트 플러그, 모션 센서)

 

이번 포스트는 모션 센서 TRADFRI E1745에 대한 이야기...

IKEA TRADFRI E1745 Motion Sensor

이리저리 만져보다가 알게되었는데, 모션 센서는 단독 디바이스로 등록이 안된다

(게이트웨이에 단독으로 등록안됨, 전구나 플러그같은 컨트롤 가능 디바이스랑 페어링해서 등록해야 함)

즉, 모션 센서에 감지가 되면 페어로 묶인 전구나 플러그가 켜지는 용도로 사용해야 한다

 

공식 어플리케이션(IKEA Home Smart)에서 등록 가능한 디바이스는 다음과 같다

IKEA Home Smart 디바이스 추가 인터페이스

 

하는김에 전구도 살까해서 찾아보니 내가 쓰고 있는 필립스 Hue 전구보다 기능이 많이 제한적인 것 같아 포기했다

(물론 Hue보다 가격은 훨씬 싸다, 나중에 독서용 스탠드를 IKEA로 하나 구매할 예정)

 

각설하고,

이왕 모션 센서 산 김에 다른 용도로 쓸 수 있게 단독 디바이스로 사용할 수 있는 방법을 찾다보니, IKEA 디바이스들은 Zigbee 기반으로 동작하며, Zigbee2mqtt가 공식적으로 지원하는 것을 확인!!

(zigbee2mqtt 지원 디바이스 목록은 www.zigbee2mqtt.io/information/supported_devices.html에서 확인)

 

라즈베리파이에 MQTT broker인 mosquitto랑 zigbee2mqtt도 설치했고(링크), zigbee sniffer 모듈 CC2531도 준비되었으니(링크) 페어링하고 homebridge랑 연동해보자

1. Zigbee2mqtt + CC2531 - TRADFRI 페어링하기

zigbee2mqtt 실행 (왠만하면 mosquitto 서비스도 실행해두자)

(중요: 장비를 페어링하려면 zigbee2mqtt/data/configuration.yaml의 permit_join속성을 true로 해둬야한다)

pi@raspberrypi:/opt/zigbee2mqtt $ npm start

실행 후 MQTT 브로커에 접속되면 'zigbee2mqtt/bridge/...' 토픽으로 zigbee2mqtt와 관련된 정보들을 브로커에 발행(publish)한다

zigbee2mqtt 최초 실행 화면

페어링 과정

1. 모션 센서를 CC2531 USB dongle 근처로 가져간다

2. 모션 센서의 페어링 버튼(후면 중앙)을 4번 연속 클릭

   센서 전면 하단에 적색 LED가 4번 점멸하게 된다 (페어링 초기화)

   그리고 잠시 기다리면 적색 LED가 계속 켜져있는 상태가 된다 (페어링 대기 상태)

페어링 과정

3. CC2531 근처에 두고 기다리면 (대략 1분 30초 정도 걸리는듯) 적색 LED가 사라진다

  zigbee2mqtt 터미널에서 디바이스가 추가되는 과정을 확인할 수 있다

Zigbee2MQTT:info  2021-01-15 00:57:37: Device '0xbc33acfffebac287' joined
Zigbee2MQTT:info  2021-01-15 00:57:37: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0xbc33acfffebac287","ieee_address":"0xbc33acfffebac287"},"type":"device_joined"}'
Zigbee2MQTT:info  2021-01-15 00:57:37: Starting interview of '0xbc33acfffebac287'
Zigbee2MQTT:info  2021-01-15 00:57:37: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0xbc33acfffebac287","ieee_address":"0xbc33acfffebac287","status":"started"},"type":"device_interview"}'
Zigbee2MQTT:info  2021-01-15 00:57:37: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"message":{"friendly_name":"0xbc33acfffebac287"},"type":"device_connected"}'
Zigbee2MQTT:info  2021-01-15 00:57:37: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"message":"interview_started","meta":{"friendly_name":"0xbc33acfffebac287"},"type":"pairing"}'
Zigbee2MQTT:info  2021-01-15 00:58:00: MQTT publish: topic 'zigbee2mqtt/bridge/event', payload '{"data":{"friendly_name":"0xbc33acfffebac287","ieee_address":"0xbc33acfffebac287"},"type":"device_announce"}'
Zigbee2MQTT:info  2021-01-15 00:58:00: MQTT publish: topic 'zigbee2mqtt/bridge/log', payload '{"message":"announce","meta":{"friendly_name":"0xbc33acfffebac287"},"type":"device_announced"}'
Zigbee2MQTT:info  2021-01-15 00:58:59: Successfully interviewed '0xbc33acfffebac287', device has successfully been paired
Zigbee2MQTT:info  2021-01-15 00:59:34: Device '0xbc33acfffebac287' is supported, identified as: IKEA TRADFRI motion sensor (E1525/E1745)

Device Join - Interview - Paired 순으로 진행된다

'0xbc33acfffebac287' 디바이스가 최종적으로 추가되었으며, IKEA TRADRI motion sensor (E1525/E1745) 기기로 인식되었다

 

로그에서 Motion Sensor 관련 Device 속성 dictionary만 추출해보면 다음과 같다

{
  "date_code":"20190308",
  "definition":
  {
    "description":"TRADFRI motion sensor",
    "exposes":
    [
      {
        "access":1,
        "description":"Remaining battery in %",
        "name":"battery",
        "property":"battery",
        "type":"numeric",
        "unit":"%",
        "value_max":100,
        "value_min":0
      },
      {
         "access":1,
         "description":"Indicates whether the device detected occupancy",
         "name":"occupancy",
         "property":"occupancy",
         "type":"binary",
         "value_off":false,
         "value_on":true
      },
      {
        "access":1,
        "name":"requested_brightness_level",
        "property":"requested_brightness_level",
        "type":"numeric",
        "value_max":254,
        "value_min":76
      },
      {
        "access":1,
        "name":"requested_brightness_percent",
        "property":"requested_brightness_percent",
        "type":"numeric",
        "value_max":100,
        "value_min":30
      },
      {
        "access":1,
        "description":"Link quality (signal strength)",
        "name":"linkquality",
        "property":"linkquality",
        "type":"numeric",
        "unit":"lqi",
        "value_max":255,
        "value_min":0
      }
    ],
    "model":"E1525/E1745",
    "vendor":"IKEA"
  },
  "endpoints":
  {
    "1":
    {
      "bindings":
        [
          {
            "cluster":"genPowerCfg",
            "target":
            {
              "endpoint":1,
              "ieee_address":"0x00124b001cce25af",
              "type":"endpoint"
            }
          }
        ],
        "clusters":
        {
          "input":
            [
              "genBasic",
              "genPowerCfg",
              "genIdentify",
              "genAlarms",
              "genPollCtrl",
              "touchlink"
            ],
          "output":
            [
              "genIdentify",
              "genGroups",
              "genOnOff",
              "genLevelCtrl",
              "genOta",
              "touchlink"
            ]
        },
        "configured_reportings":
          [
            {
              "attribute":"batteryPercentageRemaining",
              "cluster":"genPowerCfg",
              "maximum_report_interval":62000,
              "minimum_report_interval":3600,
              "reportable_change":0
            }
          ]
      }
  },
  "friendly_name":"0xbc33acfffebac287",
  "ieee_address":"0xbc33acfffebac287",
  "interview_completed":true,
  "interviewing":false,
  "model_id":"TRADFRI motion sensor",
  "network_address":31476,
  "power_source":"Battery",
  "software_build_id":"2.0.022",
  "supported":true,
  "type":"EndDevice"
}

(이걸 토대로 homebridge mqtt 액세서리 설정해줘야된다)

 

configuration.yaml 파일을 열어보면 'devices' 항목이 추가된 것을 확인할 수 있다

homeassistant: false
permit_join: true
mqtt:
  base_topic: zigbee2mqtt
  server: 'mqtt://localhost'
  user: yogyui
  password: 12345678
serial:
  port: /dev/ttyACM0
  disable_led: false
devices:
  '0xbc33acfffebac287':
    friendly_name: '0xbc33acfffebac287'

 

모션 센서 앞에서 손을 움직일 때 zigbee2mqtt 로그를 보면 다음과 같이 MQTT가 발행된다

Zigbee2MQTT:info  2021-01-15 01:14:52: MQTT publish: topic 'zigbee2mqtt/0xbc33acfffebac287', payload '{"linkquality":52,"occupancy":true,"requested_brightness_level":76,"requested_brightness_percent":30,"update":{"state":"idle"},"update_available":false}'
Zigbee2MQTT:info  2021-01-15 01:14:52: MQTT publish: topic 'zigbee2mqtt/0xbc33acfffebac287', payload '{"linkquality":52,"occupancy":true,"requested_brightness_level":76,"requested_brightness_percent":30,"update":{"state":"idle"},"update_available":false}'

topic 이름이 zigbee2mqtt/0xbc33acfffebac287 인데, 이 값은 device의 friendly_name으로 저장되어 있는 값이다. 다른 디바이스에서 구독(subscribe)시 topic 경로를 정확히 알아야하므로, 이 값을 개인적으로 알아볼 수 있는 쉬운 문자열로 바꾸던가, 아니면 메모장에 복사해두자

 

발행되는 MQTT payload의 key 값은 5종류 (자세한 설명은 링크 참조)

  • linkquality - Zigbee 연결 강도 (0 ~ 255), 단위는 lqi
  • occupancy - (사람) 움직임 감지되었음 여부, true or false 
  • requested_brightness_level - 움직임 감지 threshold 광량 레벨 (값은 76 혹은 254)
  • requested_brightness_percent -움직임 감지시 ON시킬 페어링된 전구 밝기 레벨 (값은 30 혹은 100)
  • battery - 배터리 잔량 (0 ~ 100), 단위는 %

'battery'는 항상 발행되는게 아니라, 배터리 잔량의 변화가 있을때만 발행되는 것 같다

 

움직임 감지 시 광량 조건을 지정할 수 있다 (밝은 상태에서는 움직임이 감지가 안되게 하는 기능)

'requested_brightness_level', 'requested_brightness_percent'는 하드웨어에서 수동으로 변경 가능하다
매뉴얼에는 다음과 같이 그려져있다 (이케아 갬성...)

전구 밝기 설정
감지 시 밝기 레벨 설정

 

버튼을 클릭하면 설정값이 변경되면서 LED가 바뀐다

모션 센서 뒷면 설정부
움직임 감지 광량 설정

 

쉽게 말해 '낮에도 감지가 되게 할 것인가', '밤에만 감지가 되게 할 것인가'를 결정하는 옵션이다

분명히 조도 센서도 들어있다는 말일텐데, 조도 센서 threshold를 세밀하게 조정할 수 없는 부분은 아쉽다

 

그리고, 충격적이게도 모션 감지 쿨다운 시간이 꽤나 긴데, 쿨탐을 줄이거나 늘릴 수 있는 방법이 없다...

배터리 소모량 최소화를 위해서일까...?

TRADFRI Detection Cooldown

정리하자면, 움직임이 계속 감지되는 상황에서는 약 1분 37초마다 'occupancy: true' mqtt를 발행하고, 더 이상 움직임이 없으면 움직임이 끝난 시점으로부터 3분이 지난 뒤 'occupancy: false' mqtt를 발행한다

(aqara 9천원짜리 모션센서도 쿨다운 변경이 가능한데...)

 

움직임 감지 후 false로 리셋되는 쿨다운 과정을 zigbee2mqtt 로그로 확인할 수 있다

Zigbee2MQTT:info  2021-01-15 17:30:01: MQTT publish: topic 'zigbee2mqtt/0xbc33acfffebac287', payload '{"battery":87,"linkquality":0,"occupancy":true,"requested_brightness_level":76,"requested_brightness_percent":30,"update":{"state":"idle"},"update_available":false}'
Zigbee2MQTT:info  2021-01-15 17:33:01: MQTT publish: topic 'zigbee2mqtt/0xbc33acfffebac287', payload '{"battery":87,"linkquality":0,"occupancy":false,"requested_brightness_level":76,"requested_brightness_percent":30,"update":{"state":"idle"},"update_available":false}'

단 1초의 오차도 없이 딱 3분 걸린다...

 

TRADFRI의 장단점을 한 번 정리해봤다

장점 단점
광량 Threshold 기능이 있는데도 나름 저렴하다
페어링이나 디바이스 설정이 직관적이다
한국 정발 제품이라 구하기가 쉽다
변경 가능 설정 포인트가 거의 없다 (그마저도 수동)
감지 쿨다운이 긴데다, 변경할 수도 없다
CR2032 배터리가 2개나 필요하다

센서의 성능 자체는 아쉽지만, 어떻게든 유용하게 써먹어야만 하는게 공돌이의 숙명이다..

(14,900원짜리 디바이스에 많은걸 기대하는 것도 욕심이다)

2. Homebridge 플러그인 설치 및 Configuration

플러그인 이름은 Mqttthing 

MQTT 관련 플러그인중에 가장 충실한 도큐먼트와 사용 예시를 제시하는 것 같아서 선택

homebridge-mqttthing

액세서리 설정은 꽤나 직관적이다

- 구독 시 유효한 key는 'occupancy'와 'battery' 뿐이다 (linkquality같은 건 홈킷에서 볼 수 없다)

{
    "accessory": "mqttthing",
    "type": "occupancySensor",
    "name": "Ikea TRADFRI Motion Sensor",
    "url": "mqtt:://localhost",
    "username": "yogyui",
    "password": "12345678",
    "caption": "Ikea Motion Sensor Caption",
    "topics": {
        "getOccupancyDetected": {
            "topic": "zigbee2mqtt/0xbc33acfffebac287",
            "apply": "return JSON.parse(message).occupancy;"
         },
         "getBatteryLevel": {
             "topic": "zigbee2mqtt/0xbc33acfffebac287",
             "apply": "return JSON.parse(message).battery;"
         }
    },
    "integerValue": false,
    "logMqtt": true
}

homebridge 재시작하면 홈 앱에 제대로 추가된 것을 확인할 수 있다

모션 센서 액세서리 등록 완료

3. 자동화 추가 및 동작 확인

컴퓨터방이 어두울 때 사람이 감지되면 전등이 켜지도록 자동화를 추가해보았다

(전등 추가 포스트: yogyui.tistory.com/entry/광교아이파크-조명-홈킷-연동-1)

컴퓨터방 입구 설치
홈 앱 자동화 추가

자동화 동작 확인

4. 정리

상태가 토글 (occupancy true -> false)되기까지의 쿨탐이 3분이라 자주 들락날락할 때 감지해야 되는 케이스에서는 사용하기가 힘들 것 같다

 

IKEA 제품을 게이트웨이 거치지 않고 단독으로 homebridge와 연동할 수 있다는 점을 발견했다는데 의의를 둬야겠다..

 

P.S) 개인적으로 써본 모션 센서 중에 제일 좋은 제품은 필립스 휴 제품이다 (강추)

움직임 감지, 조도 센서(lux), 온도 센서가 통합되어 있고, 모든 값을 설정할 수 있어서 자동화가 유용하다

대신 가격이 2배 넘게 차이난다...

필립스 HUE 모션센서 (주방에서 사용중)

 

반응형
Comments