Wie kann ein ESP8266 mit Alexa-Befehlen für das relative Volumen „werben“?

7

Wenn ich mehr verstehe, werde ich diese Frage bearbeiten. Im Moment rate ich, was ich brauche. Um es den Menschen zu erleichtern, zu helfen, erkläre ich Ihnen den allgemeinen Zweck:

Ich habe einen ESP8266 so programmiert, dass er für das Fernsehgerät wirbt und das Fernsehgerät ein- und ausschalten kann. Der ESP8266 überträgt die absoluten Ein / Aus-Codes mithilfe von IR-Signalen an das Fernsehgerät. Ich glaube, ich habe dem gleichen ESP8266-Gerät eine zweite "Werbung" für eine weitere Ein / Aus-Funktion hinzugefügt.

Was ich jedoch wirklich hinzufügen möchte, ist ein Gerät mit "relativer Lautstärke". Ich glaube, ich muss dies mithilfe von XML tun. Das heißt, ich glaube, ich muss das an Alexa übertragene XML ändern, um nicht nur für das Ein / Aus-Gerät zu werben, sondern auch für ein Gerät mit relativem Volumen.

Wo finde ich Beispiele, bei denen Alexa für ein Gerät mit relativem Volumen geworben wird?

Lassen Sie mich zur Verdeutlichung meines Ziels ein Beispiel hinzufügen:

Wenn ich sage

"Alexa, mach den Fernseher an"

Der Fernseher schaltet sich ein. Aber wenn ich sage

"Alexa, dreh die Lautstärke am Fernseher auf"

Alexa wird antworten

"TV unterstützt das nicht"

Ich habe zunächst den Code hier in diesem github.com-Projekt verwendet und zusätzlichen Code hinzugefügt, um die Übertragung der IR-Signale zum Fernseher zu handhaben. Dieses Projekt scheint dieses XML als Antwort auf eine Frage von Alex zu übertragen, wozu der ESP8266 in der Lage ist:

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

Ich gehe davon aus, dass zur Unterstützung der relativen Lautstärkeregelung (bis zu Alexa) nur eine Beschreibung der Lautstärkeregelungsfunktion zum obigen XML hinzugefügt werden muss. Ich konnte jedoch nicht herausfinden, wie das geht.

st2000
quelle
1
Es könnte hilfreich sein, auf die Spezifikation für die Werbung zu verweisen, über die Sie sprechen
hardillb
Sind Sie sicher, dass Sie die WeMo uPnP / Soap-Nachrichten nicht verwenden, um sich als WeMo-Switch auszugeben? Wenn ja, können Sie Volumen /% nicht nur ein / aus
ändern
Ja, ich beginne mit einem WeMo-Beispiel. Gibt es ein besseres Beispiel für den Anfang? Ich habe das Wort "Werbung" verwendet, da ich nicht wirklich weiß, wie ich es nennen soll. Im WeMo-Beispiel sendet der ESP8266 eine Antwort auf eine Alexa-Entdeckung. Es scheint anzukündigen, was der ESP8266 steuern kann. Auf einer Amazon-Webseite (die mir momentan verloren gegangen ist) finden Sie eine Beschreibung aller möglichen Funktionen eines IoT-Geräts. Einschließlich Ein / Aus, relatives Volumen und absolutes Volumen.
st2000
Link zum Projekt github.com hinzugefügt, das die Grundlage für meine Arbeit bildete. Außerdem wurde XML hinzugefügt, wo Alexa, wenn die richtigen Zeilen hinzugefügt würden, die Lautstärke meines Fernsehgeräts mit diesem ESP8266-Gerät steuern könnte.
st2000
Vielen Dank - das sollte es anderen Menschen erleichtern, diese Frage bei einer Suche zu finden.
Sean Houlihane

Antworten:

3

Ich glaube nicht, dass Sie dies mit einem lokalen Gerät tun können. Die WeMo-Unterstützung ist ein Legacy-Ansatz mit sehr begrenzten Funktionen.

Sie müssen eine Alexa Smart Home-Fähigkeit erstellen, für die eine Cloud-Komponente erforderlich ist (mit einem Lambda, um sie auszulösen).

Die Fertigkeit gibt die Funktionen des Geräts an. ( https://developer.amazon.com/docs/smarthome/smart-home-skill-api-message-reference.html#discovery-messages )

hardillb
quelle
Wenn Sie ein "nur lokales Gerät" sagen, können Sie erklären, was Sie meinen? Und aus Vermächtnis deuten Sie an, dass dieser Ansatz nicht mehr verwendet wird?
st2000
Lokal bedeutet nur genau das, keine Cloud-Beteiligung. Und mit Legacy meine ich, dass es einen Vorschlag gab, dass die Unterstützung für die Erkennung lokaler IP-basierter (nicht ZigBee) Geräte irgendwann eingestellt wird. Um zu tun, was Sie wollen, müssen Sie eine richtige Smart Home-Fähigkeit schreiben
hardillb
Ich möchte unbedingt die Kontrolle über meine IOT-Elemente außerhalb der Cloud behalten. Ich glaube, ich habe meine Projekte sorgfältig ausgewählt, um dies zu tun. (dh die Verwendung von ha-bridge in einem RPI ermöglicht die Alexa-Steuerung, sollte aber die angeschlossenen IOT-Geräte vom Internet fernhalten.) Ich mag Ihre Antwort - aber ich finde Hinweise, dass ich die Lautstärkeregelung durchführen kann, wenn ich nur wüsste, wofür ich "werben" soll Alexa während einer Entdeckung. Siehe das XML "Beispiel für ein Unterhaltungsgerät" auf dieser Amazon-Seite .
st2000
Sie haben die Kontrolle aufgegeben, sobald Sie die Alexa hinzugefügt haben. Dieser Link zeigt die JSON-Antwort vom Cloud-Lambda an Alexa, nicht etwas Lokales. Es kann nicht ohne ein Lambda gemacht werden, es gibt nichts, was Sie davon abhält, Ihr eigenes zu schreiben (ich habe die
knotenrote
Nur um zu verdeutlichen, wenn ich sage, dass alexaich das gesamte Alexa-System, das Gerät und den Cloud-Backing-Service meine. Die Fähigkeit spricht mit dem Alexa Cloud-Dienst nicht direkt mit dem Gerät
Hardillb
2

Diese Frage stieß auf großes Interesse (7 zum Zeitpunkt dieses Schreibens). Daher poste ich eine Antwort mit einer Lösung nur vor Ort.

Ich habe die Antwort von @hardillb akzeptiert, da ich noch keine Methode gefunden habe, mit der Alexa die relative Lautstärke mit einem lokalen Gerät steuern kann.

Es gibt jedoch eine Möglichkeit, die relativen TV-Schallpegel mit einem lokalen Gerät zu steuern. Durch die Verwendung eines Gerätenamens wie "TV-Sound" und von Sätzen wie "Alexa, drehen Sie den TV-Sound auf" kann Alexa dazu gebracht werden, zu glauben, dass die Helligkeit eines Geräts namens "TV-Sound" auf und ab geht. Wenn wir diesen Ansatz akzeptieren, müssen wir die absoluten Helligkeitsstufen von Alexa verwenden, während wir versuchen, einen Fernseher mit relativem Schallpegel zu steuern. Das erste, was wir bemerken, ist, dass wir den TV-Ton nur einige Male leiser stellen können, bevor wir den Helligkeitsbereich von Alexa ausschöpfen (Alexa springt für jeden Dimmbefehl um etwa 25%). Wir können Alexa aber auch mitteilen, auf welche Helligkeit unser Gerät am Ende jedes Befehls eingestellt ist. Wenn wir Alexa sagen, dass die Helligkeit immer 50% beträgt, antwortet Alexa immer mit mehr als 50%, wenn wir Alexa sagen, dass "

st2000
quelle