컴퓨터지식나누기

알렉사와 ESP8266 으로 전력기기와 스마트 멀티탭 Broadlink MP1 인터페이스

겨울아찌 2017. 8. 21. 13:42

알렉사와 ESP8266 으로 전력기기와 스마트 멀티탭 Broadlink MP1 인터페이스



앞에서의 포스팅을 통해 ESP8266 으로 릴레이를 동작시켜서, 전력기기를 구동하는 부분을 황건순님의 문건을 기반하여 조립을 했습니다. 그런데 중국제품인 BroadLink MP1 이라는 멀티탭이 와이파이로 구동이 되는데, 이것을 알렉사와 인터페이스 하는 것을 역시 황건순님이 라즈베리 파이로 인터페이스를 했습니다.


이 멀티탭은 와이파이로 스마트폰으로 제어가 가능한데, 가격이 3만원 안쪽으로 매우 저렴한 편입니다.




이미 ESP8266 을 사용중인데 (한 집안이라고 할지라도 장소적인 거리로 인해서 2개를 사용중) 별도의 라즈베리 파이를 구성한다는 것이 부담이 되어서, 황건순님에게 ESP8266 에 통합할 수 없을까 하고 제안을 드렸고, 황건순님이 작업하셔서, 다음과 같은 메시지와 함께 개발된 소오스를 https://github.com/sayzard/BroadLinkESP 올려 주셨습니다.


==============

BroadLinkESP 일단 올리기 시작

겨울아찌 님이 BroadLink MP1 어댑터를 구매하신 상황이라 일단 사용하실 수 있게 주요 기능만 라이브러리화해서 github에 올렸습니다.
Arduino 환경에서 ESP8266으로 BroadLink 제품과 간단하게 연동할 수 있는 것이고 fauxmo와 붙이시면 쉽게 아마존 에코와 로컬 네트워크 상에서 연동하실 수 있습니다.

오늘 가입하고 오늘 올린거라 분위기 파악은 못하고 있습니다. examples 디렉토리에 눈치껏 사용하시게 간단한 샘플도 넣었습니다.

참고로, 공유기에서 BroadLink MP1을 dhcp할당하실때, 고정된 ip를 주도록 dhcp 설정하시고, 해당 ip와 BroadLink MP1 MAC 값을 확인하셔서 코드에 써주셔야 합니다.

저녁에 와서 BroadLink RM 시리즈 리모콘 학습 패킷까지 코드는 만들고 테스트 했고 내일 간단한 예제 하나 만들어서 업데이트 할 예정입니다.

아직은 코드가 오류에 대한 처리 같은 것이 거의 없지만 쓰시는데는 큰 지장이 없지 않을까 싶어서 일단 올려두고 고쳐 가는 것으로 ^^

==================


해당 프로그램을 사용하기 위해서는 AES 라이브러리를 같이 사용해야 합니다. 


https://github.com/kakopappa/arduino-esp8266-aes-lib


황건순님이 올려주신 BroadLinkESP 는 ESP8266 에서 BroadLink 와 인터페이스가 되는 것을 확인하는 프로그램이고, 이것을 faxuxmo 와 병합하는 작업을 해야 합니다. 건순님이 지적하셨듯이 BroadLink 의 내부 ip 주소가 바뀌면 안되므로, 공유기의 기능을 이용해서 MAC 에 따른 IP 가 고정이 되도록 작업해주고, 그 IP 주소와 MAC 을 소오스에 투입해야 합니다.



저는 공유기가 D-LINK 제품입니다. 각 공유기에 맞는 설정 방법을 찾아보십시오.

ESP8266 기기는 기기명칭이 ESP + MAC 끝 3자리로 표현되는 군요. Broadlink 의 IP 를 고정하고  그 주소를 소오스에 사용합니다.


아래는 병합한 소오스 입니다.

패키지 명칭을 BroadLink-Alexa 로 명명했습니다.


=====================


#include <fauxmoESP.h>


#include <AESLib.h>

#include <ESP8266WiFi.h>

#include <WiFiUdp.h>

#include <BroadLinkESP.h>

#include "fauxmoESP.h"


AESLib aesLib;

BroadLinkESP besp(BROADLINK_DEV_MP1);


#define WIFI_SSID "WINCHILD-HOME 2.4"

#define WIFI_PASS "winchild6197"

#define TOADDR "192.168.0.111" //broadlink mp1 ip

#define SERIAL_BAUDRATE    115200 


byte g_mac[6]={0x34,0xEA,0x34,0xC6,0xE4,0xF8};//boardlink mp1 mac

fauxmoESP fauxmo;


/*

static const uint8_t D0 = 16;

static const uint8_t D1 = 5;

static const uint8_t D2 = 4;

static const uint8_t D3 = 0;

static const uint8_t D4 = 2;

static const uint8_t D5 = 14;

static const uint8_t D6 = 12;

static const uint8_t D7 = 13;

static const uint8_t D8 = 15;

static const uint8_t D9 = 3;

static const uint8_t D10 = 1;

*/

// Set Relay Pins

#define LED      2 // D4 for indicate

#define PIN14_D5 14

#define PIN15_d6 12


void setup() 

{

  pinMode(LED, OUTPUT);    // for indicate

  digitalWrite(LED, HIGH);

  

  Serial.begin(SERIAL_BAUDRATE);

  Serial.println("\nBooting...");  


  WiFi.mode(WIFI_STA);


  // Connect

  Serial.printf("[WIFI] Connecting to %s ", WIFI_SSID);

  WiFi.begin(WIFI_SSID, WIFI_PASS);


  // Wait

  while (WiFi.status() != WL_CONNECTED) 

  {

    Serial.print(".");

    delay(200);

  }

  // Connected!

  Serial.printf("[WIFI] STATION Mode, SSID: %s, IP address: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());


  besp.setDebug(1);

  besp.setDestIP(TOADDR);

  //Serial.printf("after setDestIP\n");

  besp.setDestMAC(g_mac);

  //Serial.printf("after setDestMAC\n");

  besp.preparePacketAuth();

  //Serial.printf("after preparePacketAuth\n");

  besp.sendPacket();

  //Serial.printf("after sendPacket\n");


  pinMode(PIN14_D5, OUTPUT);    // assinged to 'small room light'

  digitalWrite(PIN14_D5, HIGH);

  pinMode(PIN15_d6, OUTPUT);    // assigned to 'outlet 1'

  digitalWrite(PIN15_d6, HIGH); 


  fauxmo.addDevice("broadlink s1");  // device #0

  fauxmo.addDevice("broadlink s2");  // device #1

  fauxmo.addDevice("broadlink s3");  // device #2

  fauxmo.addDevice("broadlink s4");  // device #3

  fauxmo.addDevice("small room light");  // device #4

  fauxmo.addDevice("outlet 1");  // device #5


  fauxmo.onMessage([](unsigned char device_id, const char * device_name, bool state) {

    Serial.printf("[MAIN] Device #%d (%s) state: %s\n", device_id, device_name, state ? "ON" : "OFF");


    if (device_id == 4) {

          digitalWrite(PIN14_D5, !state);

    }

    else if (device_id == 5) {

          digitalWrite(PIN15_d6, !state);

    } 

    else {

      if(besp.isReady())

      {

        Serial.printf("SWITCH %s (%d) on %d\n", device_name, device_id+1, state);

        besp.preparePacketSetPower(device_id+1, state);

        besp.sendPacket();

      }

    }

  });

}


void loop() 

{

  int packetSize;

  static int led_stat = 0;

  

  packetSize=besp.checkReadPacket();

  if(packetSize>0)

  {

    besp.readPacket(packetSize);

    Serial.printf("readPacket: %d bytes\n", packetSize);

  }


  // Since fauxmoESP 2.0 the library uses the "compatibility" mode by

  // default, this means that it uses WiFiUdp class instead of AsyncUDP.

  // The later requires the Arduino Core for ESP8266 staging version

  // whilst the former works fine with current stable 2.3.0 version.

  // But, since it's not "async" anymore we have to manually poll for UDP

  // packets

  fauxmo.handle();


  static unsigned long last = millis();

  if (millis() - last > 5000) {

      last = millis();

      Serial.printf("[MAIN] Free heap: %d bytes, LED=%d\n", ESP.getFreeHeap(), led_stat);

      digitalWrite(LED, led_stat);

      led_stat = 1 - led_stat;

  }


/*  

  if(Serial.available())

  {

    byte c;

    c=Serial.read();

    if((c>='1') && (c<='4'))

    {

      if(besp.isReady())

      {

        Serial.printf("SWITCH %d %d\n",c,ionoff);

        besp.preparePacketSetPower(c-0x30,ionoff);

        besp.sendPacket();

      }

    }

    else if(c=='a')

      ionoff=1-ionoff;    

  }

*/


}


=========================


조립해서, 벽에 매달아 놓은 키트 입니다.

2개의 릴레이가 보이는데 한개는 전등제어, 한개는 벽전원 제어 입니다.



프로그램을 설치한후에 알렉사에게 탐색해 보라고 했더니. 잡혔습니다.





명령을 내렸더니, 동작을 합니다.



그런데 "BroadLink" 발음을 알렉사가 잘 인식하지 못하네요. 3번에 1번 비율로 밖에 못알아 들음. 발음을 고치던지, 알렉사가 찰떡같이 알아듣던지... ㅠ.ㅠ 


벽전원 이 동작된 상태.



기술적인 작업은 모두 황건순님이 하셨고, 저는 조립작업만.... ^^);

그런데도 시작하고 하루 꼬박 걸렸네요. ㅡㅡ;;


- 겨울아찌 -