IoT 랜이

똑똑한 IoT를 추구합니다.

IT Info/IoT

[HA] Zigbee2MQTT를 이용하여 고퀄스위치(헤이홈) 연동하기

Rangee 2019. 5. 27. 16:25

준비물

Hass.io

헤이홈, 고퀄스위치(본인 기준 1구,3구,4구)

CC2531+Zigbee2MQTT


 

안녕하세요. 랜이입니다.

 

기존에 고퀄스위치를 ST(스마트싱스)에 연결하여 HA-ST 콤포넌트로 이용하였는데요

 

아무래도 ST 클라우드서버를 거치다보니 딜레이가 생깁니다.

 

그래서 라즈베리파이에 CC2531을 장착하여 HA에 직결 시켰습니다.

 

직결하고나니 아주 즉각적으로 반응합니다. 

 

 

 

1. 고퀄 스위치 페어링하기

- zigbee2mqtt 에서 pairing모드 켜기

- 고퀄 스위치 제일 마지막버튼 2~5초이상 눌렀다가 때기.(불빛이 반짝거립니다)

- zigbee2mqtt 의 log를 확인하여 기기가 추가되었는지 확인.

 

 

2. zigbee2mqtt 에서 고퀄스위치 설정

저는 이렇게 설정하였습니다.

 

*파일 수정 전에 zigbee2mqtt를 중지하여야 합니다.*

 

devices.yaml

'0x00158d0001987f60':

  friendly_name: 'goqual_bedroom_toilet'

  qos: 1

  retain: true

database.db

{"id":41,"type":"Router","ieeeAddr":"0x00158d0001987f60","nwkAddr":27653,"manufId":4404,"manufName":"","powerSource":"Mains (single phase)","modelId":"gq.switch_4gang","epList":[1,2,3,4],"status":"offline",~~~~~~~

 여기서는 modeId가 중요합니다.

ieeeAddr 인 "0x00158d0001987f60" 로 검색하면 2개가 나와야합니다.

만약 2개가 아니면 zigbee2mqtt를 재시작한 후 중지하고 다시 확인해보세요.

 

devices.js

검색 : const devices = 

내용추가

    // Goqual

    {

        zigbeeModel: ['gq.switch_1gang'],

        model: 'GQSWITCH_1',

        vendor: 'Goqual',

        description: 'Goqual Switch',

        supports: 'on/off',

        fromZigbee: [fz.state, fz.ignore_onoff_change],

        toZigbee: [tz.on_off],

    },

    {

        zigbeeModel: ['gq.switch_2gang'],

        model: 'GQSWITCH_2',

        vendor: 'Goqual',

        description: 'Goqual Switch',

        supports: 'on/off',

        fromZigbee: [fz.generic_state_multi_ep, fz.ignore_onoff_change],

        toZigbee: [tz.on_off],

        ep: (device) => {

            return {'top': 1, 'bottom': 2};

        },

        configure: (ieeeAddr, shepherd, coordinator, callback) => {

            const ep1 = shepherd.find(ieeeAddr, 1);

            execute(ep1, [(cb) => ep1.bind('genOnOff', coordinator, cb)], () => {

                const ep2 = shepherd.find(ieeeAddr, 2);

                execute(ep2, [(cb) => ep2.bind('genOnOff', coordinator, cb)], callback);

            });

        },

    },

    {

        zigbeeModel: ['gq.switch_3gang'],

        model: 'GQSWITCH_3',

        vendor: 'Goqual',

        description: 'Goqual Switch',

        supports: 'on/off',

        fromZigbee: [fz.generic_state_multi_ep, fz.ignore_onoff_change],

        toZigbee: [tz.on_off],

        ep: (device) => {

            return {'top': 1, 'center': 2, 'bottom': 3};

        },

        configure: (ieeeAddr, shepherd, coordinator, callback) => {

            const ep1 = shepherd.find(ieeeAddr, 1);

            execute(ep1, [(cb) => ep1.bind('genOnOff', coordinator, cb)], () => {

                const ep2 = shepherd.find(ieeeAddr, 2);

                execute(ep2, [(cb) => ep2.bind('genOnOff', coordinator, cb)], () => {

                    const ep3 = shepherd.find(ieeeAddr, 3);

                    execute(ep3, [(cb) => ep3.bind('genOnOff', coordinator, cb)], callback);

                });

            });

        },

    },

    {

        zigbeeModel: ['gq.switch_4gang'],

        model: 'GQSWITCH_4',

        vendor: 'Goqual',

        description: 'Goqual Switch',

        supports: 'on/off',

        fromZigbee: [fz.generic_state_multi_ep, fz.ignore_onoff_change],

        toZigbee: [tz.on_off],

        ep: (device) => {

            return {'top_left': 1, 'bottom_left': 2, 'top_right': 3, 'bottom_right': 4};

        },

        configure: (ieeeAddr, shepherd, coordinator, callback) => {

            const ep1 = shepherd.find(ieeeAddr, 1);

            execute(ep1, [(cb) => ep1.bind('genOnOff', coordinator, cb)], () => {

                const ep2 = shepherd.find(ieeeAddr, 2);

                execute(ep2, [(cb) => ep2.bind('genOnOff', coordinator, cb)], () => {

                    const ep3 = shepherd.find(ieeeAddr, 3);

                    execute(ep3, [(cb) => ep3.bind('genOnOff', coordinator, cb)], () => {

                        const ep4 = shepherd.find(ieeeAddr, 4);

                        execute(ep4, [(cb) => ep4.bind('genOnOff', coordinator, cb)], callback);

                    });

                });

            });

        },

    },

    {

        zigbeeModel: ['gq.switch_5gang'],

        model: 'GQSWITCH_5',

        vendor: 'Goqual',

        description: 'Goqual Switch',

        supports: 'on/off',

        fromZigbee: [fz.generic_state_multi_ep, fz.ignore_onoff_change],

        toZigbee: [tz.on_off],

        ep: (device) => {

            return {'top_left': 1, 'center_left': 2, 'bottom_left': 3, 'top_right': 4, 'bottom_right': 5};

        },

        configure: (ieeeAddr, shepherd, coordinator, callback) => {

            const ep1 = shepherd.find(ieeeAddr, 1);

            execute(ep1, [(cb) => ep1.bind('genOnOff', coordinator, cb)], () => {

                const ep2 = shepherd.find(ieeeAddr, 2);

                execute(ep2, [(cb) => ep2.bind('genOnOff', coordinator, cb)], () => {

                    const ep3 = shepherd.find(ieeeAddr, 3);

                    execute(ep3, [(cb) => ep3.bind('genOnOff', coordinator, cb)], () => {

                        const ep4 = shepherd.find(ieeeAddr, 4);

                        execute(ep4, [(cb) => ep4.bind('genOnOff', coordinator, cb)], () => {

                            const ep5 = shepherd.find(ieeeAddr, 5);

                            execute(ep5, [(cb) => ep5.bind('genOnOff', coordinator, cb)], callback);

                        });

                    });

                });

            });

        },

    },

    {

        zigbeeModel: ['gq.switch_6gang'],

        model: 'GQSWITCH_6',

        vendor: 'Goqual',

        description: 'Goqual Switch',

        supports: 'on/off',

        fromZigbee: [fz.generic_state_multi_ep, fz.ignore_onoff_change],

        toZigbee: [tz.on_off],

        ep: (device) => {

            return {'top_left': 1, 'center_left': 2, 'bottom_left': 3, 'top_right': 4, 'center_right': 5, 'bottom_right': 6};

        },

        configure: (ieeeAddr, shepherd, coordinator, callback) => {

            const ep1 = shepherd.find(ieeeAddr, 1);

            execute(ep1, [(cb) => ep1.bind('genOnOff', coordinator, cb)], () => {

                const ep2 = shepherd.find(ieeeAddr, 2);

                execute(ep2, [(cb) => ep2.bind('genOnOff', coordinator, cb)], () => {

                    const ep3 = shepherd.find(ieeeAddr, 3);

                    execute(ep3, [(cb) => ep3.bind('genOnOff', coordinator, cb)], () => {

                        const ep4 = shepherd.find(ieeeAddr, 4);

                        execute(ep4, [(cb) => ep4.bind('genOnOff', coordinator, cb)], () => {

                            const ep5 = shepherd.find(ieeeAddr, 5);

                            execute(ep5, [(cb) => ep5.bind('genOnOff', coordinator, cb)], () => {

                                const ep6 = shepherd.find(ieeeAddr, 6);

                                execute(ep6, [(cb) => ep6.bind('genOnOff', coordinator, cb)], callback);

                            });

                        });

                    });

                });

            });

        },

    },

 

3. zigbee2mqtt 재시작

재시작한 후 고퀄스위치를 수동으로 작동해보세요.

Log가 정상적으로 올라오면 성공입니다.

 

4. zigbee2mqtt - HA 연동

mapping 이라고 합니다.

lib/extension/homeassistant.js  해당 경로의 파일을 찾아야합니다.

 

검색 : const mapping =

내용추가

    'GQSWITCH_1': [configurations.switch],

    'GQSWITCH_2': [switchWithPostfix('top'),switchWithPostfix('bottom')],

    'GQSWITCH_3': [switchWithPostfix('top'),switchWithPostfix('center'),switchWithPostfix('bottom')],

    'GQSWITCH_4': [switchWithPostfix('top_left'),switchWithPostfix('bottom_left'),switchWithPostfix('top_right'),switchWithPostfix('bottom_right')],

    'GQSWITCH_5': [switchWithPostfix('top_left'),switchWithPostfix('center_left'),switchWithPostfix('bottom_left'),switchWithPostfix('top_right'),switchWithPostfix('bottom_right')],

    'GQSWITCH_6': [switchWithPostfix('top_left'),switchWithPostfix('center_left'),switchWithPostfix('bottom_left'),switchWithPostfix('top_right'),switchWithPostfix('center_right'),switchWithPostfix('bottom_right')],

 

1~5구 까지는 위의 내용으로 문제없고 6구 스위치는 하나 더 수정해야합니다.

/lib/util/utils.js 파일에서 bottom_ 로 검색하고 center_left, center_right를 추가

 

5. zigbee2mqtt 재시작

 

완료입니다. 이제 HA에 정상적으로 스위치가 등록됨을 볼수있습니다.

 

헤이홈(고퀄) 3구 스위치 Log