Obtener estado del dispositivo WeMo usando Alexa

7

Estoy usando un ESP8266 para emular un dispositivo WeMo con wemos y código arduino fauxmoESP que se encuentra en Internet. Ahora que entiendo la interacción básica de los comandos de encendido y apagado, me gustaría agregar una respuesta de estado para el estado de algunos pines en el dispositivo. Parece que "encender" y "apagar" son habilidades básicas de Alexa y funcionan. Pero no hay un comando verbal de "estado" o "estado".

He encontrado lugares en el código que manejan el eventserviceXML, por ejemplo: <binarystate>1</binarystate>para activarlo, pero no puedo encontrar ninguna documentación sobre cómo obtener el estado o <getdevicestate>. Ejemplo de uso: si no puedo ver una luz encendida en alguna parte, me gustaría consultar el dispositivo para ver si está encendido o apagado.

Como el dispositivo emula un interruptor de encendido / apagado belkin, el paquete setup.xml solo tiene:

<service>
    <serviceType>urn:Belkin:service:basicevent:1</serviceType>
    <serviceId>urn:Belkin:serviceId:basicevent1</serviceId>
    <controlURL>/upnp/control/basicevent1</controlURL>
    <eventSubURL>/upnp/event/basicevent1</eventSubURL>
    <SCPDURL>/eventservice.xml</SCPDURL>
</service>

y el evento básico no es suficiente para obtener el estado o la capacidad adicional.

Todo esto se hace sin escribir una habilidad de AWS y se maneja con un diálogo directo en la LAN local entre el servidor web ESP8266 y fauxmoESP desde y hacia el Echo Dot. Puedo ver los paquetes olfateando la LAN (inalámbrica) y creo que sería sencillo agregar más capacidades si pudiera encontrar la documentación en los paquetes XML de mensajes de control.

¿Dónde puedo encontrar estas plantillas de diálogo de control XML y, con suerte, ejemplos de cómo usarlas? Tengo la sensación de que esto solo se puede lograr mediante el uso de una habilidad de AWS, pero parece tan innecesario. ¿Alguien puede darme alguna orientación aquí?

Además, ¿cuál es el enunciado de Alexa para verificar el estado de un dispositivo? Podría ser que no hay una expresión incorporada para esto y tendré que escribir una habilidad de AWS (que no quiero hacer si es posible).

Beto
fuente
¿Tenía la intención de tener las marcas de voz en el XML? Inicialmente los edité, pero tú los vuelves a poner, ¿me estoy perdiendo algo?
Aurora0001

Respuestas:

6

Quizás el conjunto de características del software ha cambiado, pero he descubierto que lo siguiente funciona. Esto es de mi código de bricolaje para el módulo nodemcu / D1 mini ESP8266 que usa el servidor web esp8266 escuchando transmisiones UDP locales. Noté en las llamadas de Alexa a /upnp.control/basicevent1 que las solicitudes estaban cambiando sutilmente. Todo se reduce al mismo evento, pero el xml de la solicitud tiene<SetBinaryState> or <GetBinaryState>

Mientras mantenga el estado en su boceto, algo como esto funcionará ...

 void Switch::handleUpnpControl(){

  Serial.println("########## Responding to  /upnp/control/basicevent1 ... ##########");      

  String request = server->arg(0);      
  Serial.print("request:");
  Serial.println(request);

  if (request.indexOf("<u:SetBinaryState") > 0) {
    Serial.print("Got setState update...");
    if(request.indexOf("<BinaryState>1</BinaryState>") > 0) {
        Serial.println("Got Turn on request");
    state = 1;
    onCallback();
    }
    if(request.indexOf("<BinaryState>0</BinaryState>") > 0) {
        Serial.println("Got Turn off request");
        state = 0;
        offCallback();
    }
    server->send(200, "text/plain", "");
  }

  if (request.indexOf("<u:GetBinaryState") > 0) {
    Serial.println("Got inquiry for current state:");
     String statusResponse = 
     "<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"     s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
        "<s:Body>"
          "<u:GetBinaryStateResponse xmlns:u=\"urn:Belkin:service:basicevent:1\">"
            "<BinaryState>" + String(state) + "</BinaryState>"
          "</u:GetBinaryStateResponse>"
        "</s:Body>"
      "</s:Envelope>\r\n"
      "\r\n";
      Serial.print("Sending status response: ");
      Serial.println(statusResponse);
      server->send(200, "text/plain", statusResponse);
  }
}
usuario3772748
fuente
Esto realmente funcionó - ¡Gracias! Originalmente había usado Belkin XML para getBinaryState pero no pude verificar si la solicitud era get o set. No probé mi código original después de probar getBinaryState después de encontrar que este código funcionaba. Ahora solo necesito descubrir cómo pronunciar el comando en lugar de usar la aplicación Alexa. Gracias de nuevo.
bob
4

Actualmente, el estado de una luz no es parte de la API de Smart Home Skill que Wemo utiliza para los dispositivos domésticos inteligentes. Existen directivas de descubrimiento, control y consulta según su referencia .

Consultar dispositivos conectados para su estado actual Alexa.ConnectedHome.Query

  • GetLockStateRequest
  • GetLockStateResponse
  • GetTargetTemperatureRequest
  • GetTargetTemperatureResponse
  • GetTemperatureReadingRequest
  • GetTemperatureReadingResponse

Desafortunadamente, ninguno de esos te ayuda con tu luz. Tal vez puedas fingir ser una cerradura de la puerta. Pero es muy poco probable que funcione con la habilidad Wemo.

Por lo tanto, actualmente, parece que necesitarás escribir tu propia habilidad para obtener el estado de la luz.

Helmar
fuente
1
Gracias Helmar Dado que el ESP8266 controla esencialmente los pines a los relés, sería bueno obtener el estado de los pines para que pueda usarlos como entradas. Por lo tanto, sería bueno ver cómo se ve la solicitud real para el "bloqueo", ya que viene a través de la LAN / WiFi local para poder responder con el paquete XML que contiene el estado. En realidad estoy buscando ese contenido de paquetes XML de bajo nivel. Obviamente, Alexa no sabrá que tiene la habilidad de "bloqueo", así que estoy tratando de falsificarla sin AWS Skill desde la nube.
bob