使用 Alexa 从 WeMo 设备获取状态

物联网 亚历克斯 ESP8266 微摩
2021-06-25 03:21:22

我正在使用 ESP8266 来模拟 WeMo 设备,其中包含在互联网上找到的 wemos 和 fauxmoESP arduino 代码。现在我了解了开和关命令的基本交互,我想为设备上的某些引脚的状态添加一个状态响应。似乎“打开”和“关闭”是基本的 Alexa 技能和这些工作。但是没有“状态”或“状态”的口头命令。

我在代码中找到了处理eventserviceXML 的位置,例如:<binarystate>1</binarystate>打开它,但我找不到任何关于获取状态或<getdevicestate>. 使用示例:如果我在某处看不到灯,我想查询设备以查看它是打开还是关闭。

由于设备模拟 belkin 开/关开关,因此 setup.xml 数据包只有:

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

并且基本事件不足以获得状态或进一步的能力。

这一切都是在没有编写 AWS 技能的情况下完成的,并且通过 ESP8266 网络服务器和 fauxmoESP 与 Echo Dot 之间的本地 LAN 上的直接对话进行处理。我可以通过嗅探 LAN(无线)来查看数据包,并相信如果我能找到有关控制消息传递 XML 数据包的文档,添加更多功能会很简单。

我在哪里可以找到这些控件 XML 对话框模板以及如何使用它们的示例?我觉得这只能通过使用 AWS 技能来完成,但这似乎没有必要。有人可以在这里给我一些指导吗?

另外,Alexa 检查设备状态的语句是什么?可能没有内置的表达方式,我需要编写 AWS 技能(如果可能的话,我不想这样做。)

2个回答

也许软件功能集已更改,但我发现以下方法有效。这是我使用 esp8266 网络服务器侦听本地 UDP 广播的 nodemcu/D1 迷你 ESP8266 模块的 DIY 代码。我注意到在 Alexa 对 /upnp.control/basicevent1 的调用中,请求发生了微妙的变化。这一切都归结为同一个事件,但请求的 xml 有<SetBinaryState> or <GetBinaryState>

只要你在草图中保持状态,这样的事情就会起作用......

 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);
  }
}

目前,灯的状态不是 Wemo 用于智能家居设备的智能家居技能 API 的一部分。根据它们的引用,有发现、控制和查询指令

查询已连接设备的当前状态 Alexa.ConnectedHome.Query

  • 获取锁定状态请求
  • 获取锁定状态响应
  • 获取目标温度请求
  • 获取目标温度响应
  • 获取温度读取请求
  • 获取温度读取响应

不幸的是,这些都没有帮助你处理你的光。也许你可以假装是门锁。但它不太可能与 WeMo 技能一起使用。

因此,目前,您似乎需要编写自己的技能来获取光的状态。