티스토리 뷰

반응형

2019/07/26 - [행복한소식까치's Story/생활속 DIY] - 왕초보의 Home IOT - 1탄 (HA 설치 및 월패드 통신)

 

왕초보의 Home IOT - 1탄 (HA 설치 및 월패드 통신)

얼마전 살던곳에서 이사를 했습니다. 이사한곳은 기존집과 다르게 월패드에서 조명, 가스 , 엘베, 보일러 제어가 가능했습니다. 그래서 이걸 이용해서 기존 사용하는 IOT 확장할 방법을 연구하다 알게된 방법을 공..

kindmaster.tistory.com

위내용에 어어서 읽어야 이해가 빠릅니다.

 

월패드 RS485 통신 패킷 캡처 방법

선행사항
1. 라즈베리 파이에 nodejs 설치
    1) sudo apt-get update
    2) sudo apt-get dist-upgrade
    3) sudo apt-get install -y nodejs

2. Serialport 플러그인 설치
    npm install serialport
   PS.serialport에 대한 더 많은 내용은 아래 참조
   https://github.com/serialport/node-serialport

 

serialport/node-serialport

Access serial ports with JavaScript. Linux, OSX and Windows. Welcome your robotic JavaScript overlords. Better yet, program them! - serialport/node-serialport

github.com

캡처 방법

아래 소스를 작성후 명령어 실행

ggateway.js

const SerialPort = require('serialport');
const port = new SerialPort('/dev/ttyUSB0', {            // <--- 위에서 파악한 USB0 번호로 수정할것
  baudRate: 9600,
  dataBits: 8,
  parity: 'none',
  stopBits: 1,
  autoOpen: true,
  encoding: 'hex'
});


 const Ready = require('@serialport/parser-ready')
 const parser = port.pipe(new Ready({ delimiter: 'READY' }))
 parser.on('ready', () => console.log('the ready byte sequence has been received'))

var packets = {};
port.on('readable', function () {
   var packet = port.read();

// if 구문은 받은적이 있는 같은 패킷은 중복하여 출력하지 않게합니다.
   if(packets[packet])
   {
      packets[packet] = packets[packet] + 1;
   }else
   {
    	packets[packet] =1;
	console.log('Data:', packet);
   }

   
});

명령어 실행 후 월패드에서 전등/가스/엘베등을 조작하여 패킷정보를 캡처하면됩니다.
 node ggateway.js

 

해당 패킷을 씨리얼몬나 아래소스를 사용해서 H/W(전등/가스등)가 작동하지는 확인하여

패킷정보를 입수 합니다.
전체 소스중 바로 아래 소스의 3103010000000035 부분이 패킷 입니다 캡처한 팻킷에서 스페이스를 제외하고
입력하여 테스트 하면됩니다.

port.write(Buffer.alloc(8,'3103010000000035','hex'), (err) => {if(err)  return log('[Serial] Send Error: ', err.message); });

const util = require('util');
const SerialPort = require('serialport');

// SerialPort 모듈 초기화
const port = new SerialPort("/dev/ttyUSB0", {
    baudRate: 9600,
    dataBits: 8,
    parity: 'none',
    stopBits: 1,
    autoOpen: false,
    encoding: 'hex'
});

port.on('open', () => log('Success open port:', "/dev/ttyUSB0"));
port.open((err) => {
    if (err) {
        return log('Error opening port:', err.message)
    }
});

//////////////////////////////////////////////////////////////////////////////////////

port.on('data', function (data) {
  //  console.log(data.toString('hex'));
// 패킷 정보 발송
port.write(Buffer.alloc(8,'3103010000000035','hex'), (err) => {if(err)  return log('[Serial] Send Error: ', err.message); });
});
    lastReceive = new Date().getTime();
var log = (...args) => console.log('[' + new Date().toLocaleString('ko-KR', {timeZone: 'Asia/Seoul'}) + ']', args.join(' '));

 

 

전 ST 카페의 그레고리하우스란 분이 미리캡처 한 패킷이 있어서 쉽게 알아냈습니다.

가스 부분 빼고는 패킷이 동일했습니다.
저의집 Commax월패드의 경우 
전등 켜기 명령어가 
3101010000000033 이라면 맨마자막 두자리 체크섬을 제외 하고는 첫 두자리에 +80을 한값이 ACK로 넘어왔습니다

즉 ACK 값은 B1010100000000B3 됩니다.

참고 하세요.

 

다음시간은 Homeassistant 와 연동하는 방법에 대해서 적어 볼 까 합니다.

 

관련정보
https://cafe.naver.com/stsmarthome/9424
https://cafe.naver.com/stsmarthome/7580

반응형
댓글