我在代码中找到了处理
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技能(如果可能的话,我不想这样做。)
#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
评论
您是否打算在XML中使用语音标记?我最初是将它们编辑掉的,但是您又把它们放回了,我丢失了什么吗?