3.스마트홈 만들기

3.스마트홈 만들기

스마트홈을 구상한지 2년가까이 시간이 지났음에도.

이런저런 핑계 거리로 더이상 진행하지 않고 방치해 둔거 같다.


이전 포스팅

1. 스마트홈 만들기

2. 스마트홈 만들기


이전에 하려고 했던 rs485 시리얼 통신은 시간이좀 걸릴듯하여

잠시 접어두고 다른방식으로 접근 하기로 하였다.

rs485통신 패킷 캡쳐 시 월패드에서 무수히 많은 패킷을 보내는데

이 패킷들을 명령어 별로 분류하기가 쉽지 않은 문제

서버와 월패드와 동시에 연결할경우 월패드가 먹통되는 현상 등

아직 해결하지 못한 부분이 있어서.. 아무래도 실력이 부족한 탓이겠지요.


각설하고

다른 방식이기 때문에 구성이 살짝 바뀌었다.


간략하게 설명하자면

AI스피커에 명령을 하면 Google Firebase에 명령어를 요청을 하고

집에 있는 Linux Server에 신호를 보내어 제어 하는 방식이다.


1. 우선 Google Assistant로 원격제어를 하기위해선 아래 페이지를 참고한다.

Firebase 설정과 기기를 컨트롤하기위한 소스 수정이 조금 있다.
(5번정도까지만 하면 사용가능함)


2. 위에 5번에서 index.js를 수정해야 한다.

음성명령어로 거실큰불 켜/꺼 부분에 해당한다.

  1. app.onSync((body) => {
  2. // TODO: Implement full SYNC response
  3. return {
  4. requestId: body.requestId,
  5. payload: {
  6. agentUserId: '123',
  7. devices: [{
  8. id: 'living1',
  9. type: 'action.devices.types.OUTLET',
  10. traits: [
  11. 'action.devices.traits.OnOff',
  12. ],
  13. name: {
  14. defaultNames: ['living1'],
  15. name: '거실큰불',
  16. nicknames: ['거실큰불'],
  17. },
  18. deviceInfo: {
  19. manufacturer: 'hyunjo',
  20. model: 'hyunjo-living1',
  21. hwVersion: '1.0',
  22. swVersion: '1.0.1',
  23. },
  24. }],
  25. },
  26. };
  27. });

소스 아래쪽으로 내려오면 on/off시에 취할 액션부분이다.

  1. app.onExecute((body) => {
  2. // TODO: Implement EXECUTE response
  3. const {
  4. requestId
  5. } = body;
  6. const payload = {
  7. commands: [{
  8. ids: [],
  9. status: 'SUCCESS',
  10. states: {
  11. online: true,
  12. },
  13. }],
  14. };
  15. for (const input of body.inputs) {
  16. for (const command of input.payload.commands) {
  17. for (const device of command.devices) {
  18. const deviceId = device.id;
  19. payload.commands[0].ids.push(deviceId);
  20. for (const execution of command.execution) {
  21. const execCommand = execution.command;
  22. const {
  23. params
  24. } = execution;
  25. switch (execCommand) {
  26. case 'action.devices.commands.OnOff':
  27. firebaseRef.child(deviceId).child('OnOff').update({
  28. on: params.on,
  29. });
  30. payload.commands[0].states.on = params.on;
  31. //로그
  32. //console.log(deviceId + ': ' + params.on);
  33. //컨트롤
  34. if (deviceId == 'living1') {
  35. //거실큰불
  36. if (params.on == true) {
  37. http.get('http://내서버주소.kr/xxx/xxx/xxxOn.do');
  38. } else {
  39. http.get('http://내서버주소.kr/xxx/xxx/xxxOff.do');
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }
  46. }
  47. return {
  48. requestId: requestId,
  49. payload: payload,
  50. };
  51. });


3. Firebase 에서 위와 같이 외부 서비스를 호출하는 방식을 webhook이라고 한다.

webhook을사용하려면 Firebase요금제를 Blaze(종량제)로 바꿔야 한다.

1기가사용량당 0.12달러면 현재 달러 시세로 134.33원이다.

외부/내부에서 사용한다 해도 몇년이 지나야 1기가를 채울수 있을지??




4. 이제 Firebase deploy 한다.

5. 핸드폰에 구글홈이나 구글 어시스턴트 앱에  보면

[test] 테스트 앱 이라는 기기를 연결한다.




6. 자 이제 리모컨 처럼 눌러봐서 컨트롤 해보기도 하고

음성명령어로도 컨트롤 해보자.





Firebase 에서 webhook으로 리눅스 서버를 호출했을때  처리하는 부분을 적지 않았다.

이전에 테스트 자동화 CasperJS 글을 작성한적 있다.

이것을 이용하여 처리가 가능하다.

webhook으로 특정 url을 호출 했을경우 casperjs로 특정 페이지의 on/off버튼을 클릭

하도록 설정한것이다.

내가 살고 있는 아파트는 web/app으로 집안을 컨트롤 할 수 있게 되어 있어서

web으로 접근하여 개발하였다.

on/off 액션 호출시에 매번 로그인 -> 페이지 이동 -> on/off 버튼 클릭 이런 식이면 

한번 불키고 끄는데에 딜레이가 많이 걸릴것이다. 다행히 우리 단지에서 사용하는

web페이지에서는 꼼수(?)가 가능하도록 되어 있어서 계속적으로 로그인을 할 필요

가 없어 on/off시 딜레이를 줄일수 있었다.


※ 거실불 켜기, 끄기 시연 영상(목소리 이해좀.) 

시연은 구글 홈으로 시연하였다.