아두이노 Wifi 스위치 - 주말 프로젝트 3주차

주중에 회사일로 코드를 들여다 보다가 주말에 개인작업으로 또 코딩을 하는게 쉬운건 아닌가보다. 귀찮음을 무릅쓰고 마무리를 해애 한다는 일념으로 오늘 일부 수정해 봤다.

서버 - 디바이스 상태 확인하기

지난주까지 작업은 On/Off가 되는것을 우선 하느라 앱을 동작 시키면 디바이스 스위치의 상태와 관계없이 OFF 로 나타나고 있었다. 그래서 오늘은 앱을 시작하면 서버에 디바이스 리스트를 요청(GET - ‘/sw-lists’)할때 서버에서 각 디바이스에 상태를 확인해서 결과를 앱에 돌려주고 앱에서 상태를 표시 하도록 수정 했다.

수정된 코드는 아래와 같다.

function getSwitchLists(req, res) {

    // 현재 접속 되어 있는 모든 디바이스를 가져와 확인하고 앱에 정보를 보내 준다.
    let select_sql = 'SELECT * FROM switches ORDER BY number';
    pool.query(select_sql, [], function(err, results) {

        // 각 디바이스 IP 의 Status 를 받아온다.        
        async.each(results, function(sw, callback){
            var requestUrl = 'http://'+sw.ip+'/status';
            axios.get(requestUrl)
                .then(function(resp){
                    sw.status = resp.data;
                    callback();
                });
        }, function(err){
            // 결과를 전송
            res.send({ switches: results });
        });

    });

};

데이터베이스에서 스위치 리스트를 가져온 다음 각 스위치의 IP에 ‘/status’를 요청해서 결과값을 JSON에 추가 해서 앱에 전달해 준다.

이번에 async module이 추가 되었는데 async는 Node.js에서 동기/비동기/순차 등의 프로세스를 쉽게 처리할 수 있도록 구성된 module이다. async.each(…) 코드에서 쿼리 결과 리스트를 순서대로 돌아서 상태를 확인하고 결과를 저장한다.

앱 - 수정내용

UI가 계속 발목을 잡고 있어서 지난주간에 몇가지 UI 컴포넌트 들을 테스트 해봤다. 그중 Native Base라는 컴포넌트가 그중 사용성이 좋고 https://github.com/GeekyAnts/NativeBase UI가 깔끔해서 몇가지 테스트를 해보고 코드에 넣어 봤다.

아래 그림과 같이 두개의 스위치를 화면에서 조회 하고 컨트롤 할 수 있다. 하지만 여젼히 UI는 구리다. 두번째 스위치는 아직 릴레이가 도착하지 않아서 보드만 Wifi에 연결된 상태지만 아두이노 소프트웨어는 잘 동작하고 있다.

다음에 할일

아두이노 최초 셋팅 할때 AP 모드로 기동해서 웹서버를 띄우고 스위치의 번호와 이름을 입력해서 아두이노 내부에 저장하는 기능을 추가 해야 합니다. 현재는 소스코드에 박아놔서 스위치 하나 만들때마다 코드를 수정하고 다시 컴파일 해서 디바이스에 다운로드 하고 있는데 이것도 자동화를 해야만 진정한(?) 자동화가 아닌가.. ^^;

더 장기적으로는 스케쥴 시스템이 필요한데.. 일단 적어만 놓는다.

소스 리파지토리

소스 리파지토리는 아래와 같다. https://github.com/bipark/home-control

Written on July 8, 2017