Obtendo status do dispositivo WeMo usando Alexa

7

Estou usando um ESP8266 para emular um dispositivo WeMo com o wemos e o código do arduino do fauxmoESP encontrados na Internet. Agora que entendo a interação básica dos comandos liga e desliga, gostaria de adicionar uma resposta de status para o estado de alguns pinos no dispositivo. Parece que "ligar" e "desligar" são habilidades básicas do Alexa e funcionam. Mas não há comando verbal "status" ou "state".

Encontrei lugares no código que manipulam o eventserviceXML, por exemplo: <binarystate>1</binarystate>para ativá-lo, mas não consigo encontrar nenhuma documentação sobre como obter status ou <getdevicestate>. Exemplo de uso: se não conseguir ver uma luz acesa em algum lugar, gostaria de consultar o dispositivo para ver se está ligado ou desligado.

Como o dispositivo emula um botão liga / desliga belkin, o pacote setup.xml possui apenas:

<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>

e o evento básico não é suficiente para obter status ou capacidade adicional.

Isso tudo é feito sem a necessidade de escrever uma habilidade da AWS e é tratado com diálogo direto na LAN local entre o servidor da Web ESP8266 e o ​​fauxmoESP de e para o Echo Dot. Posso ver os pacotes farejando a LAN (sem fio) e acredito que seria fácil adicionar mais recursos se eu encontrasse a documentação nos pacotes XML de controle de mensagens.

Onde posso encontrar esses modelos de diálogo XML de controle e, esperançosamente, exemplos de como usá-los? Estou sentindo que isso só pode ser realizado usando uma habilidade da AWS, mas parece tão desnecessário. Alguém pode me dar alguma orientação aqui?

Além disso, qual é o enunciado para o Alexa verificar o status de um dispositivo? Pode ser que não haja um enunciado incorporado para isso e precisarei escrever uma habilidade da AWS (o que não desejo, se possível).

prumo
fonte
Você pretendia ter as marcas de fala no XML? Inicialmente, editei-os, mas você os colocou de volta - estou perdendo alguma coisa?
Aurora0001

Respostas:

6

Talvez o conjunto de recursos do software tenha mudado, mas descobri que o seguinte funciona. Isto é do meu código DIY para o módulo nodemcu / D1 mini ESP8266 usando o servidor da web esp8266 que escuta transmissões UDP locais. Notei nas chamadas do Alexa para /upnp.control/basicevent1 que os pedidos estavam mudando sutilmente. Tudo se resume ao mesmo evento, mas o xml da solicitação tem<SetBinaryState> or <GetBinaryState>

Contanto que você mantenha o estado em seu esboço, algo assim 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);
  }
}
user3772748
fonte
Isso realmente funcionou - Obrigado! Originalmente, eu usei o Belkin XML para getBinaryState, mas não verifiquei se a solicitação era um get ou set. Não tentei meu código original após testar o getBinaryState depois de descobrir que esse código funcionava. Agora só preciso descobrir como falar o comando em vez de usar o Alexa App. Obrigado novamente.
bob
4

Atualmente, o estado da luz não faz parte da API do Smart Home Skill que o Wemo usa para os dispositivos domésticos inteligentes. Existem diretivas de descoberta, controle e consulta de acordo com suas referências .

Consultar dispositivos conectados para seu estado atual Alexa.ConnectedHome.Query

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

Infelizmente, nada disso ajuda você com sua luz. Talvez você possa fingir ser uma fechadura. Mas é muito improvável que funcione com a habilidade Wemo.

Assim, atualmente, parece que você precisará escrever sua própria habilidade para obter o estado da luz.

Helmar
fonte
11
Obrigado Helmar. Como o ESP8266 controla essencialmente os pinos dos relés, seria bom obter o estado dos pinos para que eu possa usá-los como entradas. Portanto, seria bom ver como é a solicitação real para o "bloqueio", como se trata da LAN / WiFi local, para que eu pudesse responder com o pacote XML que contém o estado. Na verdade, estou procurando pelo conteúdo de pacotes XML de baixo nível. Obviamente, o Alexa não saberá que possui a habilidade "bloquear", então estou tentando falsificá-la sem o AWS Skill da nuvem.
bob