Abrufen des Status vom WeMo-Gerät mithilfe von Alexa

7

Ich verwende einen ESP8266, um ein WeMo-Gerät mit im Internet gefundenem wemos- und fauxmoESP-Arduino-Code zu emulieren. Nachdem ich die grundlegende Interaktion von Ein- und Ausschaltbefehlen verstanden habe, möchte ich eine Statusantwort für den Status einiger Pins auf dem Gerät hinzufügen. Es scheint, dass "Einschalten" und "Ausschalten" grundlegende Alexa-Fähigkeiten sind und diese funktionieren. Es gibt jedoch keinen verbalen Befehl "Status" oder "Status".

Ich habe Stellen im Code gefunden, die das eventserviceXML verarbeiten, zum Beispiel: <binarystate>1</binarystate>um es zu aktivieren, aber ich kann keine Dokumentation zum Abrufen des Status oder finden <getdevicestate>. Anwendungsbeispiel: Wenn irgendwo kein Licht leuchtet, möchte ich das Gerät abfragen, um festzustellen, ob es ein- oder ausgeschaltet ist.

Da das Gerät einen Belkin-Ein / Aus-Schalter emuliert, enthält das Paket setup.xml nur:

<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>

und das Basisereignis reicht nicht aus, um Status oder weitere Fähigkeiten zu erhalten.

Dies alles geschieht ohne das Schreiben einer AWS-Fähigkeit und erfolgt über einen direkten Dialog im lokalen LAN zwischen dem ESP8266-Webserver und fauxmoESP zum und vom Echo Dot. Ich kann die Pakete sehen, indem ich am LAN (drahtlos) schnüffle, und glaube, es wäre unkompliziert, weitere Funktionen hinzuzufügen, wenn ich die Dokumentation zu den XML-Paketen für Steuerungsnachrichten finden könnte.

Wo finde ich diese Steuerelement-XML-Dialogvorlagen und hoffentlich Beispiele für deren Verwendung? Ich habe das Gefühl, dass dies nur mit einer AWS-Fähigkeit erreicht werden kann, aber es scheint so unnötig. Kann mir hier jemand eine Anleitung geben?

Was ist die Äußerung von Alexa, um den Status eines Geräts zu überprüfen? Es könnte sein, dass es dafür keine eingebaute Äußerung gibt und ich eine AWS-Fähigkeit schreiben muss (was ich, wenn möglich, nicht tun möchte).

Bob
quelle
Wollten Sie die Sprachmarken im XML haben? Ich habe sie anfangs bearbeitet, aber Sie haben sie zurückgesetzt - fehlt mir etwas?
Aurora0001

Antworten:

6

Möglicherweise hat sich das Software-Feature-Set geändert, aber ich habe festgestellt, dass Folgendes funktioniert. Dies ist aus meinem DIY-Code für das nodemcu / D1 mini ESP8266-Modul mit dem esp8266-Webserver, der auf lokale UDP-Sendungen wartet. Bei den Alexa-Aufrufen von /upnp.control/basicevent1 habe ich festgestellt, dass sich die Anforderungen geringfügig geändert haben. Es läuft alles auf dasselbe Ereignis hinaus, aber die XML-Datei der Anforderung hat beides<SetBinaryState> or <GetBinaryState>

Solange Sie den Status in Ihrer Skizze halten, funktioniert so etwas ...

 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);
  }
}
user3772748
quelle
Das hat in der Tat funktioniert - Danke! Ich hatte ursprünglich Belkin XML für getBinaryState verwendet, konnte jedoch nicht überprüfen, ob die Anforderung get oder set war. Ich habe meinen ursprünglichen Code nach dem Testen auf getBinaryState nicht ausprobiert, nachdem ich festgestellt hatte, dass dieser Code funktioniert. Jetzt muss ich nur noch herausfinden, wie man den Befehl spricht, anstatt die Alexa App zu verwenden. Danke noch einmal.
Bob
4

Derzeit ist der Status eines Lichts nicht Teil der Smart Home Skill-API, die Wemo für die Smart Home-Geräte verwendet. Es gibt Erkennungs-, Steuerungs- und Abfragerichtlinien entsprechend ihrer Referenz .

Fragen Sie verbundene Geräte nach ihrem aktuellen Status ab. Alexa.ConnectedHome.Query

  • GetLockStateRequest
  • GetLockStateResponse
  • GetTargetTemperatureRequest
  • GetTargetTemperatureResponse
  • GetTemperatureReadingRequest
  • GetTemperatureReadingResponse

Leider hilft dir keiner von denen mit deinem Licht. Vielleicht können Sie vortäuschen, ein Türschloss zu sein. Es ist jedoch sehr unwahrscheinlich, dass dies mit der Wemo-Fertigkeit funktioniert.

Daher sieht es derzeit so aus, als müssten Sie Ihre eigenen Fähigkeiten schreiben, um den Zustand des Lichts zu erhalten.

Helmar
quelle
1
Danke Helmar. Da der ESP8266 im Wesentlichen Pins zu Relais steuert, wäre es schön, den Status der Pins zu erhalten, damit ich sie als Eingänge verwenden kann. Es wäre also schön zu sehen, wie die eigentliche Anfrage an die "Sperre" aussieht, wenn sie über das lokale LAN / WiFi kommt, damit ich mit dem XML-Paket antworten kann, das den Status enthält. Ich suche tatsächlich nach Low-Level-XML-Paketinhalten. Offensichtlich wird Alexa nicht wissen, dass es die Fähigkeit "Sperren" hat, also versuche ich, es ohne AWS-Fähigkeit aus der Cloud zu fälschen.
Bob