ESP8266 如何“宣传”它可以处理 Alexa“相对音量”命令

物联网 亚历克斯 ESP8266
2021-06-25 03:45:41

随着我了解更多,我将编辑这个问题。现在,我在猜测我需要什么。为了让人们更容易提供帮助,我会告诉你总体目的:

我已经编写了一个 ESP8266 来宣传它是电视并且它可以打开/关闭电视。ESP8266 实际上使用 IR 信号将绝对开/关代码传输到电视。我相信我已经为同一个 ESP8266 设备的另一个开/关功能添加了第二个“广告”。

但是,我真正想添加的是“相对音量”设备。我相信我需要通过使用 XML 来做到这一点。也就是说,我相信我需要修改传输到 Alexa 的 XML,不仅要宣传开/关设备,还要宣传相对音量的设备。

在哪里可以找到向 Alexa 宣传相对音量设备的示例?

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

如果我说

“Alexa,打开电视”

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

“Alexa,把电视音量调大”

Alexa 会回应

“电视不支持那个”

我首先使用这个 github.com 项目中的代码,并添加了额外的代码来处理将 IR 信号传输到电视。该项目似乎传输此 XML 以响应 Alex 询问 ESP8266 的功能:

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 中。但是,我一直无法找到如何做到这一点。

2个回答

我不相信你可以用本地设备来做到这一点。WeMo 支持是一种功能非常有限的传统方法。

您需要构建一个需要云组件Alexa 智能家居技能(使用 lambda 来触发它)。

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

这个问题引起了相当大的兴趣(在撰写本文时有 7 个)。所以我发布了一个只有本地解决方案的后续答案。

我已经接受了@hardillb 的回答,因为我还没有找到一种允许 Alexa 使用仅本地设备控制相对音量的方法。

但是,有一种方法可以使用仅限本地的设备来控制相对的电视声级。通过使用诸如“电视声音”之类的设备名称和“Alexa,调高电视声音”之类的短语,可以诱使 Alexa 认为它正在调高和调低名为“电视声音”的设备的亮度。在接受这种方法时,我们被迫使用 Alexa 的绝对亮度级别,同时尝试控制相对声级电视。我们注意到的第一件事是,在耗尽 Alexa 的亮度范围之前,我们只能将电视声音调低几次(Alexa 为每个调光命令跳动约 25%)。但是我们也可以告诉 Alexa 我们的设备在每个命令结束时设置的亮度。如果我们告诉 Alexa 亮度始终为 50%,那么当我们告诉 Alexa“