Alexaを使用してWeMoデバイスからステータスを取得する


7

ESP8266を使用して、インターネット上にあるwemosおよびfauxmoESP arduinoコードでWeMoデバイスをエミュレートしています。onコマンドとoffコマンドの基本的な相互作用を理解したところで、デバイスの一部のピンの状態に対するステータス応答を追加したいと思います。「オンにする」と「オフにする」は基本的なAlexaスキルであり、それらが機能するようです。ただし、「ステータス」または「状態」の口頭によるコマンドはありません。

eventserviceたとえば、XMLを処理するコード内の場所を見つけました。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スキルを書かずに行われ、ESP8266ウェブサーバーとエコードットとの間のfauxmoESP間のローカルLAN上の直接ダイアログで処理されます。LAN(ワイヤレス)をスニッフィングすることでパケットを確認でき、コントロールメッセージングXMLパケットに関するドキュメントが見つかれば、機能を追加するのは簡単だと思います。

これらのコントロールXMLダイアログテンプレートはどこにあり、できればそれらの使用方法の例はどこにありますか?これはAWSスキルを使用することによってのみ達成できるという感覚を得ていますが、それはそれほど必要ではないようです。誰かがここで私にいくつかのガイダンスを与えることはできますか?

また、Alexaがデバイスのステータスを確認するための発話は何ですか?これには組み込みの発話がない可能性があり、AWSスキルを書く必要があります(可能な場合は行いたくありません)。


XMLにスピーチマークを含めるつもりでしたか?私は最初にそれらを編集しましたが、あなたはそれらを元に戻しました-私は何かが足りないのですか?
Aurora0001

回答:


6

おそらくソフトウェアの機能セットは変更されましたが、次のように動作することがわかりました。これは、ローカルUDPブロードキャストをリッスンするesp8266ウェブサーバーを使用するnodemcu / D1 mini ESP8266モジュールの私のDIYコードからのものです。Alexaが/upnp.control/basicevent1を呼び出すときに、リクエストが微妙に変化していることに気付きました。すべては同じイベントに要約されますが、リクエストの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);
  }
}

これは本当にうまくいきました-ありがとうございます!最初はgetBinaryStateにBelkin XMLを使用していましたが、リクエストがgetまたはsetであるかどうかを確認できませんでした。このコードが機能することを確認した後、getBinaryStateをテストした後、元のコードを試しませんでした。Alexaアプリを使用する代わりに、コマンドの読み方を理解する必要があります。再度、感謝します。
ボブ2018年

4

現在、ライトの状態は、Wemoがスマートホームデバイスに使用するスマートホームスキルAPIの一部ではありません。それらのリファレンスによると、発見、制御、クエリのディレクティブがあります。

接続されているデバイスに現在の状態を問い合わせるAlexa.ConnectedHome.Query

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

残念ながらそれらのどれもあなたの光であなたを助けません。たぶん、あなたはドアロックであると偽ることができます。しかし、Wemoスキルで動作する可能性はほとんどありません。

したがって、現在、光の状態を取得するには、独自のスキルを書く必要があるようです。


1
ヘルマーありがとう。ESP8266は基本的にリレーへのピンを制御するため、ピンの状態を取得して入力として使用できると便利です。したがって、ローカルLAN / WiFiを介して来る「ロック」への実際のリクエストがどのように見えるかを確認して、状態を含むXMLパケットで応答できるようにするとよいでしょう。実際にその低レベルのXMLパケットの内容を探しています。明らかに、Alexaは「ロック」スキルがあることを知らないので、クラウドからAWSスキルなしでそれを偽装しようとしています。
ボブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.