据我了解,我将编辑此问题。现在,我正在猜测我需要什么。为了使人们更容易获得帮助,我将向您介绍所有目的:

我已对ESP8266进行了编程,以宣传它是电视,并且它可以打开/关闭电视。 ESP8266实际上使用IR信号将绝对开/关代码发送到电视。我相信我已经为同一ESP8266设备添加了另一个“广告”,以提供另一个开/关功能。

但是,我真正要添加的是“相对体积”设备。我相信我需要通过使用XML来做到这一点。也就是说,我相信我需要修改传输给Alexa的XML,以不仅通告打开/关闭的设备,而且还要通告相对的卷设备。

在哪里可以找到有关相对卷设备的示例

为了阐明我的目标,让我添加一个示例:

如果我说


“ Alexa,打开电视”


电视将打开。但是,如果我说


“ Alexa,请调高电视上的音量”


Alexa将响应


“电视不支持”


我从这个github.com项目中的代码开始,并添加了其他代码来处理将IR信号传输到电视的过程。这个项目似乎是为了响应Alex询问ESP8266的功能而传输此XML:

     HTTP.on("/eventservice.xml", HTTP_GET, [](){
      Serial.println(" ########## Responding to eventservice.xml ... ########\n");

      String eventservice_xml = "<scpd xmlns=\"urn:Belkin:service-1-0\">"
        "<actionList>"
          "<action>"
            "<name>SetBinaryState</name>"
            "<argumentList>"
              "<argument>"
                "<retval/>"
                "<name>BinaryState</name>"
                "<relatedStateVariable>BinaryState</relatedStateVariable>"
                "<direction>in</direction>"
                "</argument>"
            "</argumentList>"
          "</action>"
          "<action>"
            "<name>GetBinaryState</name>"
            "<argumentList>"
              "<argument>"
                "<retval/>"
                "<name>BinaryState</name>"
                "<relatedStateVariable>BinaryState</relatedStateVariable>"
                "<direction>out</direction>"
                "</argument>"
            "</argumentList>"
          "</action>"
      "</actionList>"
        "<serviceStateTable>"
          "<stateVariable sendEvents=\"yes\">"
            "<name>BinaryState</name>"
            "<dataType>Boolean</dataType>"
            "<defaultValue>0</defaultValue>"
           "</stateVariable>"
           "<stateVariable sendEvents=\"yes\">"
              "<name>level</name>"
              "<dataType>string</dataType>"
              "<defaultValue>0</defaultValue>"
           "</stateVariable>"
        "</serviceStateTable>"
        "</scpd>\r\n"
        "\r\n";

      HTTP.send(200, "text/plain", eventservice_xml.c_str());
});


我想,为了支持(提供Alexa)相对音量控制,所有要做的就是在上述XML中添加对音量控制功能的描述。但是,我还没找到解决方法。

评论

指向您正在谈论的广告的规格可能会有所帮助

您确定不使用WeMo uPnP / Soap消息假装为WeMo交换机吗?如果是这样,您将无法仅打开/关闭音量/%更改

是的,我以WeMo为例。有一个更好的例子开始吗?我使用“广告”一词是因为我真的不知道该怎么称呼。在WeMo示例中,ESP8266发送一个Alexa发现的答案。它似乎在宣传ESP8266可以控制的功能。在亚马逊网页上(此刻现在我不知道),其中描述了物联网设备可以执行的所有操作。包括开/关,相对体积和绝对体积。

添加了指向github.com项目的链接,该项目构成了我正在从事的工作的基础。我还添加了XML,我相信,如果添加了正确的行,它将允许Alexa使用此ESP8266设备控制电视的音量。

谢谢-这样可以使其他人更容易通过搜索找到此问题。

#1 楼

我不相信您可以使用仅限本地的设备执行此操作。 WeMo支持是一种功能有限的传统方法。

您需要构建Alexa智能家居技能,该技能需要云组件(带有lambda才能触发它)。

该技能报告了设备的功能。 (https://developer.amazon.com/docs/smarthome/smart-home-skill-api-message-reference.html#discovery-messages)

评论


当您说“仅限本地设备”时,您可以解释您的意思吗?从旧的意义上,您暗示这种方法不再使用了吗?

–st2000
18-09-29在2:47

本地仅意味着没有云的参与。从传统上讲,我的意思是有人建议在某个时候将不再支持发现基于本地IP(而非ZigBee)的设备。若要做您想做的事情,您将需要编写适当的智能家居技能

– hardillb
18-09-29在6:22

我非常想将我的物联网项目的控制权移出云。我相信我已经仔细选择了我的项目来做到这一点。 (即,在RPI上使用ha-bridge可以进行Alexa控制,但应使连接的IOT设备远离互联网。)我喜欢您的回答-但我发现有提示,如果仅知道要“播发”的内容,则可以进行音量控制。发现期间的Alexa。请参阅此Amazon页面上的“娱乐设备示例” XML。

–st2000
18/09/29在15:56

添加Alexa后,您就放弃了控制权。该链接显示了从云lambda到Alexa的JSON响应,而不是本地的。没有lambda,这是无法完成的,没有什么可以阻止您编写自己的(我具有节点红色的智能家居技能)并自己托管其中的大部分功能,但是lambda需要在AWS上生活

– hardillb
18-09-29在16:01

只是为了澄清,当我说alexa时,我是指整个Alexa系统,设备及其云支持服务。该技能直接与Alexa云服务对话而不是与设备对话

– hardillb
'18 -10-1在12:58

#2 楼

这个问题引起了极大的兴趣(在撰写本文时为7)。因此,我要发布一个仅提供本地解决方案的后续答案。

我已经接受@hardillb答案,因为我还没有找到允许Alexa使用仅本地设备控制相对音量的方法。 >
但是,有一种方法可以使用仅本地设备来控制相对的电视声音级别。通过使用设备名称(例如“电视声音”)和短语(例如“ Alexa,调高电视声音”),可以哄骗Alexa认为它正在调高和调低称为“电视声音”的设备的亮度。在接受这种方法时,我们被迫使用Alexa的绝对亮度级别,同时尝试控制相对声音级别的电视。我们注意到的第一件事是,在耗尽Alexa的亮度范围之前,我们只能将电视声音调低几次(每个调光命令Alexa会跳25%左右)。但是我们还可以在每个命令的结尾告诉Alexa我们设备的亮度。如果我们告诉Alexa亮度始终为50%,那么当我们告诉Alexa“调高电视声音”时,Alexa的响应总是会超过50%,而当我们告诉Alexa“调低电视声音”时的响应会不到50%。