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

我在代码中找到了处理eventservice XML的地方,例如:<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技能,并且可以通过ESP Dot ESP8266 Web服务器与fauxmoESP之间在本地LAN之间进行直接对话来实现。我可以通过嗅探LAN(无线)来查看数据包,并且相信如果可以找到有关控制消息XML数据包的文档,添加更多功能将很容易。

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

此外,Alexa检查设备状态的话是什么?可能是没有内置的语音提示,我将需要编写AWS技能(如果可能的话,我不想这样做。)

评论

您是否打算在XML中使用语音标记?我最初是将它们编辑掉的,但是您又把它们放回了,我丢失了什么吗?

#1 楼

也许软件功能集已更改,但是我发现以下功能有效。这来自我使用esp8266网络服务器侦听本地UDP广播的nodemcu / D1 mini ESP8266模块的DIY代码。我在对/upnp.control/basicevent1的Alexa调用中注意到,请求正在微妙地更改。都归结为相同的事件,但是请求的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);
  }
}


评论


这确实有效-谢谢!我最初将Belkin XML用于getBinaryState,但是无法检查请求是get还是set。发现该代码有效后,我没有在测试getBinaryState之后尝试使用原始代码。现在,我只需要弄清楚如何说出命令,而不是使用Alexa App。再次感谢。

–鲍勃
18-10-25在0:53

#2 楼

当前,灯光状态不属于Wemo用于智能家居设备的智能家居技能API的一部分。根据参考,可以发现,控制和查询指令。


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


GetLockStateRequest
GetLockStateResponse
GetTargetTemperatureRequest
GetTargetTemperatureResponse
GetTemperatureReadingRequest
GetTemperatureReadingResponse




不幸的是,这些都不对您有帮助。也许您可以伪装成门锁。但是使用Wemo技能的可能性很小。

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

评论


谢谢Helmar。由于ESP8266本质上控制着继电器的引脚,因此最好了解引脚的状态,以便我将其用作输入。因此,很高兴看到对“锁定”的实际请求看起来像是通过本地LAN / WiFi发出的,因此我可以用包含状态的XML数据包进行响应。我实际上正在寻找底层XML数据包内容。显然,Alexa不会知道它具有“锁定”技能,因​​此我想在没有来自云的AWS Skill的情况下进行欺骗。

–鲍勃
17年6月6日在23:13