ESP8266 WiFi Amazon Alexa Voice control Loxone

Hlasové ovládanie cez Amazon


Popis funkčnosti:

  • Amazon Alexa Dot a NodeMCU fungujú v jednej LAN sieti, kde sa dokážu "vidieť".
  • NodeMCU drží keep-alive server na rôznych virtuálnych portoch UDP, kde funguje ovládanie jednotlivých výstupov. Maximálne je možné použiť 4 on/off callbacky (4 pre ON, 4 pre OFF).
  • Jeden port obsluhuje jeden výstup, ktorý je možné ovládať zapnutím a vypnutím.
  • Amazon Alexa Dot vie v sieti vyhĺadať dostupné zariadenia na UDP portoch a následne vie vydať i príkaz pre ich ovládanie na základe príkazu od používateľa v angličtine s príslušným paramterom
  • Pre nájdenie zariadení je potrebné vysloviť príkaz: "Alexa, Find devices"
  • Alexa po chvíli odpovie: "The Discovery is complete, I found one smart device." - týmto si overíme, či je NodeMCU (ESP8266) viditeľné v LAN sieti.
  • Pre ovládanie relé treba použiť jeden z týchto demo príkazov: "Alexa, Turn relay one on", "Alexa, Turn relay one off" a obdobne pre ďalšie výstupy
  • Použitý hardvér:

  • Amazon Alexa Dot (verzie 1 a 2 sú kompatibilné) Amazon Alexa Dot
  • ESP8266 / NodeMCU (v1/v2/v3) ESP8266
  • 1+ kanálové relé elmg/ssr Elmg. relé
  • Využitie:

  • Ovládanie svetiel a výstupov priamo z callbacku
  • Ovládanie iných systémov (Loxone a iné, ktoré podporujú HTTP autentizáciu a GET/POST request)
  • Request na webovú službu
  • Knižnice k projektu: Github
  • Vzorové DEMO programy pre ESP8266 dokážu ovládať jeden výstup podľa hlasového povelu vyššie.
  • ESP8266 sketch - NodeMCU + Loxone HTTP request - ON/OFF

    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>
    #include <WiFiUdp.h>
    #include <functional>
    #include "Switch.h"
    #include "UpnpBroadcastResponder.h"
    #include "CallbackFunction.h"
    #include <ESP8266HTTPClient.h>
    const char *ssid =  "meno_wifi";
    const char *password =  "heslo_wifi";
    boolean connectWifi();
    void Relay1On();
    void Relay1Off();
    boolean wifiConnected = false;
    int httpCode = 0;
    UpnpBroadcastResponder upnpBroadcastResponder;
    Switch *relay1 = NULL;
    HTTPClient http;
    void setup()
    {
      Serial.begin(9600);
      wifiConnected = connectWifi();
      if (wifiConnected) {
        upnpBroadcastResponder.beginUdpMulticast();
        relay1 = new Switch("Relay 1", 80, Relay1On, Relay1Off);
        Serial.println("Adding switches upnp broadcast responder");
        upnpBroadcastResponder.addDevice(*relay1);
      }
    }
    void loop()
    {
      if (wifiConnected) {
        upnpBroadcastResponder.serverLoop();
        relay1->serverLoop();
      }
    }
    
    void Relay1On() {
      Serial.println("Zapinam switch 1 na povel od Alexa Dot");
      String url = "http://192.168.1.13:83/dev/sps/io/0f7d5586-039c-3ba2-fffffe345eb0bf31/on";
      http.begin(url);
      http.setAuthorization("admin", "0285");
      httpCode = http.GET();
      if (httpCode == HTTP_CODE_OK) {
    
      }
      http.end();
    }
    
    void Relay1Off() {
      Serial.println("Vypinam switch 1 na povel od Alexa Dot");
      String url = "http://192.168.1.13:83/dev/sps/io/0f7d5586-039c-3ba2-fffffe345eb0bf31/off";
      http.begin(url);
      http.setAuthorization("admin", "0285");
      httpCode = http.GET();
      if (httpCode == HTTP_CODE_OK) {
    
      }
      http.end();
    }
    
    boolean connectWifi() {
      boolean state = true;
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
      Serial.println("");
      Serial.println("Pripajanie na wifi");
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      if (state) {
        Serial.println("");
        Serial.print("Connected to ");
        Serial.println(ssid);
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
      }
      else {
        Serial.println("");
        Serial.println("Connection failed.");
      }
      return state;
    }
          

    ESP8266 sketch - NodeMCU + Web HTTP request - ON/OFF

    #include <ESP8266WiFi.h>
    #include <ESP8266WebServer.h>
    #include <WiFiUdp.h>
    #include <functional>
    #include "Switch.h"
    #include "UpnpBroadcastResponder.h"
    #include "CallbackFunction.h"
    #include <ESP8266HTTPClient.h>
    const char *ssid =  "meno_wifi";
    const char *password =  "heslo_wifi";
    boolean connectWifi();
    void Relay1On();
    void Relay1Off();
    boolean wifiConnected = false;
    int httpCode = 0;
    UpnpBroadcastResponder upnpBroadcastResponder;
    Switch *relay1 = NULL;
    HTTPClient http;
    void setup()
    {
      Serial.begin(9600);
      wifiConnected = connectWifi();
      if (wifiConnected) {
        upnpBroadcastResponder.beginUdpMulticast();
        relay1 = new Switch("Relay 1", 80, Relay1On, Relay1Off);
        Serial.println("Adding switches upnp broadcast responder");
        upnpBroadcastResponder.addDevice(*relay1);
      }
    }
    void loop()
    {
      if (wifiConnected) {
        upnpBroadcastResponder.serverLoop();
        relay1->serverLoop();
      }
    }
    
    void Relay1On() {
      Serial.println("Zapinam switch 1 na povel od Alexa Dot");
      String url = "http:/web.sk/zapnirele.php";
      http.begin(url);
      httpCode = http.GET();
      if (httpCode == HTTP_CODE_OK) {
    
      }
      http.end();
    }
    
    void Relay1Off() {
      Serial.println("Vypinam switch 1 na povel od Alexa Dot");
      String url = "http:/web.sk/vypnirele.php";
      http.begin(url);
      httpCode = http.GET();
      if (httpCode == HTTP_CODE_OK) {
    
      }
      http.end();
    }
    
    boolean connectWifi() {
      boolean state = true;
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
      Serial.println("");
      Serial.println("Pripajanie na wifi");
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      if (state) {
        Serial.println("");
        Serial.print("Connected to ");
        Serial.println(ssid);
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
      }
      else {
        Serial.println("");
        Serial.println("Connection failed.");
      }
      return state;
    }