이전 글과 연결되는 글입니다. [이동]

지난 번에 찾아낸 결과는 애플 홈에 Philips Hue Bridge 제품만 연결한 상태에서는 문제가 발생하지 않고, homebridge도 같이 등록한 상황에서 문제가 발생하는 것을 알게 되었다.

그래서 이것저것 알아보던 중, bonjour 서비스가 중요한 역할을 하고 있는 것을 알게되었다. linux에 homebridge를 설치하는 경우 bonjour 서비스의 linux 구현체인 avahi도 같이 설치한다.
bonjour 서비스 그 자체의 문제인가 해서 avahi가 실행되지 않는(?) homebridge 도커 이미지를 실행해보았다. 그래도 문제가 해결되지는 않았지만 어찌됐건 avahi가 실행되서 발생되는 문제는 아닌듯 싶었다. (뭔가 기존 버전이랑 다른게 없는 듯했다.)

위 방법으론 알 수가 없어 잘 사용했던 mac mini의 homebridge와 시놀로지의 homebridge를 비교해보기로 했다.

우선 bonjour를 문제의 원흉으로 보고 계속 이것만 살펴보았다.

필립스 휴 브릿지의 hap 맥 미니의 hap 시놀로지의 hap

Home Automation Protocol의 약자인 hap 서비스를 살펴보면 네트워크상에서 3개의 서비스가 있다. 좌측부터 Philips Hue Bridge, Mac mini의 homebridge, 시놀로지의 homebridge이다.

아래 tx recode 부분은 뭔지 모르니... 무시하도록 하고
네트워크에 advertise 하는 방식이 달라졌다. Mac mini는 Hue bridge와 비슷한 모양이지만, 시놀로지에 설치한 homebridge는 많은 ip와 호스트명도 맥주소로 이상하게 되어있다.

그래서 왜 다른가 살펴보기로 했다.

homebridge는 hap을 node로 구현한 KhaosT의 HAP-NodeJS를 베이스로 하여 구현되어 있다. homebridge를 네트워크에 advertise하는 부분은 이 HAP-NodeJS에서 하고 있다.
찾아보니 이 부분의 코드가 최근에 바꼈다. 5월 쯤에 ㅠㅠ

Mac mini에 마지막으로 세팅한 시점이 2월, 시놀로지는 6월이니 중간에 바뀐 부분에 영향을 받은 것이다.

homebridge의 18년 2월 기준 최종 버전은 0.4.38, 현재 버전은 0.4.44버전이다.
각각의 버전에서 사용하고 있는 HAP-NodeJS 버전은 0.4.41, 0.4.47 이다.

하아..
몇 달간 휴브릿지만 들고 씨름한 것이 너무 아깝다. 관련해서 바뀐 주요 부분은 이 부분이다.
 /**
   * The host name of the component is probably better to be
   * the username of the hosted accessory + '.local'.
   * By default 'bonjour' doesnt add '.local' at the end of the os.hostname
   * this causes to return 'raspberrypi' on raspberry pi / raspbian
   * then when the phone queryies for A/AAAA record it is being queried
   * on normal dns, not on mdns. By Adding the username of the accessory
   * probably the problem will also fix a possible problem 
   * of having multiple pi's on same network
   */
  var host = this.accessoryInfo.username.replace(/\:/ig, "_") + '.local';
  var advertiseName = this.accessoryInfo.displayName
    + "-"
    + crypto.createHash('sha512').update(this.accessoryInfo.username, 'utf8').digest('hex').slice(0, 4).toUpperCase();

  // create/recreate our advertisement
  this._advertisement = this._bonjourService.publish({
    name: advertiseName,
    type: "hap",
    port: port,
    txt: txtRecord,
    host: host
  });

네트워크에 advertise하는 방식이 accessory 이름 뒤 username을 해시한 값의 처음 4자리를 붙이고, host는 username으로 하고 있다.
이것 말고도 mdns를 사용하는 것으로 바뀌고 했지만, 정확히 어떤 영향이 있는지 모르겠다.
따라서 위의 이미지에서 homebridge의 username으로 쓰이는 mac주소가 host로 쓰이고, 악세서리의 이름도 뒤에 영문자/숫자 조합의 4자리가 붙게된 것이다.

최근에 생성된 oznu/homebridge 이미지도 (내가 시놀리지를 받고 사용한...)
1.7.8버전은 homebridge를 0.4.44버전을 1.7.7버전은 2월 기준 마지막 버전인 0.4.38 버전을 사용하고 있다.

그래서 oznu/homebridge 1.7.7버전을 사용하니 hue bridge와 homebridge를 문제 없이 사용이 가능했다.

폭풍 감동

이 것때문에 wifi와 zigbee의 채널 간섭때문은 아닌지, hue bridge의 고장은 아닌지 했던 내가 한심하다.