강좌/IoT

구글 홈 음성 명령으로 컴퓨터 켜기

acidpop 2020. 2. 6. 15:14
반응형

시놀로지 NAS 를 사용하면서 24시간 사용이 필요치 않기에 

필요시마다 WOL 을 이용하여 부팅을 하고 있다.

구글 홈 미니와 Sonoff 를 연동해서 조명을 켜고 끄는데 컴퓨터도 켤 수 있지 않을까? 해서 생각을 해보니

다음과 같은 방법으로 사용이 가능하다.

1. 준비물

- 구글 홈 또는 구글 홈 미니 기기

- 라즈베리 파이 (Web 요청을 받으면 자신의 네트워크에서 WOL 매직 패킷을 전달하기 위함)

- WOL 이 작동 하는 컴퓨터

 

2. 설계

작동 방식 구성은 다음 처럼..

 - 구글 홈에게 컴퓨터 켜 라고 말하면 IFTTT 에서 구글 홈 명령을 해석하여 특정 URL 을 호출

 - 라즈베리파이 웹 서버에서 해당 요청을 받으면 WOL 매직 패킷 보내기

 

3. 방법

 3-1. 구글 홈 앱에서 루틴 설정 하기.

다음을 말하면 조건에 "컴퓨터 켜", "컴퓨터 켜 줘" 문장을 등록 한다.

필요 하다면 다른 문장을 추가 해도 좋다.

 

"Google 어시스턴트가 할 행동" 에는 IFTTT 가 알아 들어야 할 문장을 등록해야 하는데 영어만 지원 되기 때문에

작업 추가를 클릭 -> "my desktop on" 이라고 등록 한다.

 

한번 더 작업 추가를 눌러-> 인기 있는 작업을 누르고

가장 아래에 말하기 기능에 톱니 모양을 누른다.

 

"내 컴퓨터를 켭니다" 라고 등록한다. (문장을 각자 알아서 수정)

 

3-2. 라즈베리파이에 Web 요청 처리 만들기

라즈베리파이는 WOL 로 켤 컴퓨터와 같은 네트워크상에 존재 해야 한다.

그리고 ngnix 또는 apache 와 같이 WAS 가 설치되어 있고 php 가 연동이 되어 있는 상태여야 한다. (was 및 php 구성은 구글 검색으로 설치)

필자는 nginx 와 php 7.0 이 연동되어 작동 중이므로 해당 환경으로 설명한다.

 

/var/www/html 경로에 wol 이라는 디렉토리를 생성하여 wol.php 코드를 작성 한다.

전체 경로 (/var/www/html/wol/wol.php)

<?php
function wol($broadcast, $mac)
{
    if (strstr($mac, "-"))
    {
        $mac_array = explode('-', $mac);
    }
    else
    {
        $mac_array = explode(':', $mac);
    }
    $hwaddr = '';
 
    foreach($mac_array AS $octet)
    {
        $hwaddr .= chr(hexdec($octet));
    }
 
    // Create Magic Packet
 
    $packet = '';
    for ($i = 1; $i <= 6; $i++)
    {
        $packet .= chr(255);
    }
 
    for ($i = 1; $i <= 16; $i++)
    {
        $packet .= $hwaddr;
    }
 
    $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
    if ($sock)
    {
        $options = socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, true);
 
        if ($options >=0) 
        {    
            $e = socket_sendto($sock, $packet, strlen($packet), 0, $broadcast, 7);
            socket_close($sock);
        }    
    }
}


$AUTH_KEY="";
$PC_TYPE="";

$broadcast_ip = "";
$mac_addr = "";


$WOL_KEY="RANDOMKEY";

if( isset($_GET['wolkey']) ){ $AUTH_KEY=$_GET['wolkey']; }

if( isset($_GET['wolpc']) ){
        $PC_TYPE=$_GET['wolpc'];
}
else{
        $res_data = ['result' => 'fail'];
        header('Content-type: application/json');
        echo json_encode($res_data);
        return;
}

if( strcmp($WOL_KEY, $AUTH_KEY) != 0 ) {
        $res_data = ['result' => 'fail'];
        header('Content-type: application/json');
        echo json_encode($res_data);
        return;
}

// PC Type is NAS or PC
if( strcmp($PC_TYPE, "NAS") == 0 ){
    $broadcast_ip = "192.168.0.2";
    $mac_addr = "00-11-22-33-44-55";
    $res_data = ['result' => 'success', 'pctype' => 'NAS'];
}else if( strcmp($PC_TYPE, "PC") == 0){
    $broadcast_ip = "192.168.0.3";
    $mac_addr = "AA-BB-CC-DD-EE-FF";
    $res_data = ['result' => 'success', 'pctype' => 'PC'];
}else{
        $res_data = ['result' => 'fail'];
        header('Content-type: application/json');
        echo json_encode($res_data);
        return;
}

wol($broadcast_ip, $mac_addr);


header('Content-type: application/json');
echo json_encode($res_data);
 
?>

 

위 코드 중$WOL_KEY 에 있는 값은 적당하게 긴 문자열로 만들어 준다. (WOL Url 에 최소한의 보안을 위함)

// PC Type is NAS or PC 주석 아래에 WOL 컴퓨터의 IP 와 MAC 주소 값을 입력해 준다.

필요한 컴퓨터가 많다면 $PC_TYPE 의 문자열과 else if 부분을 복사/붙여넣기 하여 추가 하면 된다.

 

php 가 작성이 완료 되었다면 라즈베리 파이에서 다음 명령으로 시험을 해본다.

curl "http://127.0.0.1/wol/wol.php?wolkey=RANDOMKEY&wolpc=NAS"

RANDOMKEY 와 NAS 는 각자 세팅에 맞게 변경 한다.

 

위 테스트로 WOL 이 작동 하면 이제 외부에서 url 호출만으로 WOL 을 사용 할수 있게 된다.

 

※ IFTTT 와 연동 해야 하므로 공유기를 사용 한다면 라즈베리파이의 WAS 포트를 포트 포워딩 해야 한다.

라즈베리파이의 WAS 포트는 80 이고 포트 포워딩은

외부 포트는 8080 , 내부 포트는 80으로 포트 포워딩을 설정 하였다면

WOL 작동 주소는 다음과 같이 된다.

http://공인IP:8080/wol/wol.php?wolkey=RANDOMKEY&wolpc=NAS

 

 


3-3. IFTTT 에서 구글 홈 문장을 분석하는 애플릿 만들기

IFTTT 에 접속하여 Explore 를 클릭

+ 버튼을 눌러 애플릿 생성으로 들어 간다.

 

+ This 를 클릭한다.

google 을 검색하여 Google Assistant 를 클릭

(Google Assistant 가 나오지 않거나 say a simple phrase 항목이 나오지 않는 다면 IFTTT 와 구글 계정 연동이 먼저 되어 있야 나오게 된다.)

 

Say a simple phrase 를 클릭

 

What do you want to say? 항목에 루틴에서 설정 하였던 "my desktop on" 을 입력

What do you want the Assistant to say in response? 항목에는 해당 애플릿 수행 후 구글 홈에서 말 할 TTS 문장을 입력한다. (TTS 재생이 필요 없다면 굳이 하지 않아도 되며 한국어는 지원하지 않는다.)

 

아래로 내려서 "Create trigger" 버튼을 클릭

 

 

+ That 을 클릭

webhook 을 검색하여 Webhooks 선택

Make a web request 선택

URL 항목에 라즈베리파이의 WOL URL 을 작성하고 Create Action 버튼을 눌러 애플릿 작성을 완료 한다.

 

 

구글 홈에서 "컴퓨터 켜" 라고 명령 하게 되면 다음과 같은 순서로 작동을 한다.

 

구글 홈 -> IFTTT -> 라즈베리 파이 PHP 호출 -> WOL 패킷 송신.

 

 

잘 되지 않는 경우 IFTTT 의 로그에서 구글 홈 명령이 전달이 되었는지, 라즈베리파이의 URL 은 정상적으로 호출 되는지 등을 확인 하면 된다.

반응형

'강좌 > IoT' 카테고리의 다른 글

구글 홈 - 네스트 미니, 네스트 허브 출시  (0) 2020.06.30