Fehler im Smart Home beheben

1. Hinweis

Als Entwickler von IoT-Anwendungen (Internet der Dinge) können Sie Cloud-zu-Cloud-Integrationen erstellen, mit denen Nutzer ihre Geräte über Touchbedienung in der Google Home App und Sprachbefehle mit Google Assistant steuern können.

a4657871181b5ad2.gif

Die Debugging-Tools für Cloud-zu-Cloud-Integrationen sind ein wichtiger Schritt, um eine Integration in Produktionsqualität mit Google Assistant zu erstellen. Zur einfachen Überwachung und Fehlerbehebung stehen Google Cloud Platform (GCP)-Messwerte und Logging sowie die Test-Suite für Smart Home zur Verfügung, mit denen Sie Probleme bei Ihren Integrationen erkennen und beheben können.

Vorbereitung

Aufgaben

In diesem Codelab stellen Sie eine Cloud-zu-Cloud-Integration mit zwei Fehlern bereit und verbinden sie mit Assistant. Anschließend beheben Sie die Fehler der Integration mit der Test-Suite für Smart Home und Google Cloud Platform (GCP)-Messwerten und ‑Logging.

Lerninhalte

  • Verwendung von GCP-Messwerten und ‑Logging zur Erkennung und Behebung von Produktionsproblemen
  • Verwendung der Test-Suite für Smart Home zur Erkennung von Funktions- und API-Problemen

Voraussetzungen

2. Fehlerhafte App ausführen

Quellcode abrufen

Klicken Sie auf den folgenden Link, um das Beispiel für dieses Codelab auf Ihren Entwicklungscomputer herunterzuladen:

Alternativ können Sie das GitHub-Repository über die Befehlszeile klonen:

$ git clone https://github.com/google-home/smarthome-debug.git

Über das Projekt

Die Waschmaschinen-App enthält die folgenden Unterverzeichnisse:

Mit Firebase verknüpfen

Öffnen Sie das Terminal auf Ihrem Entwicklungscomputer. Wechseln Sie zum Verzeichnis washer-faulty und richten Sie dann die Firebase CLI mit Ihrem Integrationsprojekt ein, das im Codelab Smart-Home-Geräte mit Google Assistant verbinden erstellt wurde:

$ cd washer-faulty
$ firebase use <firebase-project-id>

In Firebase bereitstellen

Wechseln Sie zum functions Ordner und installieren Sie alle erforderlichen Abhängigkeiten mit npm.

$ cd functions
$ npm install

Hinweis:Wenn die folgende Meldung angezeigt wird, können Sie sie ignorieren und fortfahren. Die Warnung ist auf einige ältere Abhängigkeiten zurückzuführen. Weitere Informationen finden Sie hier.

found 5 high severity vulnerabilities
  run `npm audit fix` to fix them, or `npm audit` for details

Nachdem Sie die Abhängigkeiten installiert und Ihr Projekt konfiguriert haben, können Sie die fehlerhafte Waschmaschinen-App bereitstellen.

$ firebase deploy

Die Ausgabe der Konsole sollte so aussehen:

...

✔ Deploy complete!

Project Console: https://console.firebase.google.com/project/<Firebase-project-id>/overview
Hosting URL: https://<Firebase-project-id>.firebaseapp.com

HomeGraph aktualisieren

Öffnen Sie die Hosting-URL in Ihrem Browser (https://<firebase-project-id>.firebaseapp.com), um die Webanwendung aufzurufen. Klicken Sie in der Weboberfläche auf die Schaltfläche Aktualisierenae8d3b25777a5e30.png, um HomeGraph mit den neuesten Gerätemetadaten aus der fehlerhaften Waschmaschinen-App zu aktualisieren. Verwenden Sie dazu Synchronisierung anfordern.

6f2b1344179977cf.png

Öffnen Sie die Google Home App und prüfen Sie, ob die Waschmaschine mit dem Namen Faulty Washer angezeigt wird.

e357de6a7faff925.png

3. Integration testen

Nachdem Sie Ihr Projekt bereitgestellt haben, testen Sie, ob Ihre Integration die Waschmaschine steuert.

Waschmaschine testen

Prüfen Sie die Wertänderung, wenn Sie einen der folgenden Sprachbefehle über Ihr Smartphone ausführen:

„Hey Google, schalte meine Waschmaschine ein.“

„Hey Google, starte meine Waschmaschine.“

„Hey Google, pausiere meine Waschmaschine.“

„Hey Google, setze meine Waschmaschine fort.“

„Hey Google, halte meine Waschmaschine an.“

Wenn Sie die Waschmaschine pausieren oder fortsetzen, antwortet Assistant per Sprachbefehl, dass etwas nicht stimmt:

„Ich konnte <Anzeigename des Projekts> nicht erreichen.“

Um dieses Problem zu beheben, benötigen Sie zuerst weitere Informationen zum Fehler, um die Ursache einzugrenzen und zu ermitteln.

Dashboard für Smart-Home-Analysen

Eine gute Möglichkeit, Fehler zu untersuchen, ist das Dashboard für Smart-Home-Analysen. Dort werden Diagramme mit Nutzungs- und Statusmesswerten für Ihr Cloud-Fulfillment aggregiert:

  • Die Nutzungsmesswerte spiegeln den Nutzungstrend Ihrer Cloud-zu-Cloud-Integration wider, einschließlich der Anzahl der täglich aktiven Nutzer und der Gesamtzahl der Anfragen an Ihr Fulfillment.
  • Mit den Gesundheitsmesswerten können Sie Anomalien bei Ihrer Cloud-zu-Cloud-Integration überwachen, einschließlich Anfragelatenz, Erfolgsrate und Fehleraufschlüsselung.

Führen Sie die folgenden Schritte aus, um die Ursache des Fehlers einzugrenzen und auf das Projektdashboard zuzugreifen.

  1. Wechseln Sie in der Developer Console zur Seite „Projekte“.
  2. Wählen Sie Ihr Smart-Home-Projekt aus.
  3. Klicken Sie im Menü auf der linken Seite auf den Tab Analytics.

b1735bbe11a7aff8.png

  1. Sie werden zu einer Liste von Dashboards für Ihr Projekt in Google Cloud weitergeleitet. Wählen Sie das Dashboard Google Home Analytics – Cloud-Integration aus.

5edd3751323176dd.png

  1. Scrollen Sie nach unten zum Diagramm Cloud-Auftragsausführungsfehler – Statusaufschlüsselung , um die Fehlercodes für den hervorgehobenen Zeitraum aufzurufen.

c468743c20a11c15.png

Der Fehlercode PARTNER_RESPONSE_MISSING_DEVICE gibt einen Hinweis auf die Ursache. Rufen Sie als Nächstes Ereignislogs basierend auf dem Fehlercode ab, um weitere Informationen zu erhalten.

Auf Ereignislogs zugreifen

Um weitere Informationen zum Fehler zu erhalten, greifen Sie mit Cloud Logging auf Ereignislogs für Ihre Cloud-zu-Cloud-Integration zu.

Öffnen Sie in Google Cloud Platform das Navigationsmenü und wählen Sie unter Operations die Option Logging > Log-Explorer aus, um auf die Ereignislogs für Ihr Projekt zuzugreifen. Alternativ können Sie im Suchfeld nach Log-Explorer suchen.

Geben Sie im Eingabefeld Alle Felder durchsuchen die Abfrage PARTNER_RESPONSE_MISSING_DEVICE ein und klicken Sie auf Abfrage ausführen. Die Logs, die der Abfrage entsprechen, werden im Abschnitt Ergebnisse angezeigt.

747cca0f1249a5a.png

Das Fehlerlog zeigt ein Smart-Home-Ereignis mit Fehlerdetails an:

  • Die Nutzeraktion ist „Waschmaschine fortsetzen“ (actionType: "STARTSTOP_UNPAUSE"), was dem letzten fehlgeschlagenen Sprachbefehl entspricht.
  • Die zugehörige Debugging-Meldung lautet "JSON response does not include device.".

Anhand der Debugging-Meldung sollten Sie prüfen, warum die Waschmaschinen-App das richtige Gerät nicht in die EXECUTE-Antwort einbezieht.

Ursache des Fehlers ermitteln

Suchen Sie in functions/index.js nach dem EXECUTE-Handler (im Array onExecute), der den Status jedes Befehls und den neuen Gerätestatus zurückgibt. Das Einfügen von Geräte-IDs in eine EXECUTE-Antwort hängt von der Auflösung der Funktion updateDevice ab:

index.js

app.onExecute(async (body) => {
 ...

 for (const command of intent.payload.commands) {
   for (const device of command.devices) {
     for (const execution of command.execution) {
       executePromises.push(
           updateDevice(execution, device.id)
               .then((data) => {
                 result.ids.push(device.id);
                 Object.assign(result.states, data);
               })
               .catch((e) =>
                 functions.logger.error('EXECUTE',
                     device.id, e.message)));
     }
   }
 }

Prüfen Sie weiter, wie die updateDevice Funktion das Pausieren und Fortsetzen der Waschmaschine verarbeitet. Sie werden feststellen, dass der String für den Befehl zum Pausieren und Fortsetzen falsch ist:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpausePause':
      const data = await queryDevice(deviceId);
      state = (data.isPaused === false && data.isRunning === false)
        ? {isRunning: false, isPaused: false}
        : {isRunning: !params.pause, isPaused: params.pause};
      ref = getFirebaseRef().child(deviceId).child('StartStop');
      break;
 }

 return ref.update(state)
     .then(() => state);
};

Fehler beheben

Nachdem Sie die Ursache des Fehlers ermittelt haben, können Sie den String für den Befehl zum Pausieren und Fortsetzen korrigieren:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpause':
      const data = await queryDevice(deviceId);
      state = (data.isPaused === false && data.isRunning === false)
        ? {isRunning: false, isPaused: false}
        : {isRunning: !params.pause, isPaused: params.pause};
      ref = getFirebaseRef().child(deviceId).child('StartStop');
      break;
 }

 return ref.update(state)
     .then(() => state);
};

Korrektur testen

Stellen Sie den aktualisierten Code mit der Firebase CLI bereit:

firebase deploy --only functions

Versuchen Sie es noch einmal mit den folgenden Sprachbefehlen. Assistant antwortet jetzt korrekt, wenn Sie die Waschmaschine pausieren oder fortsetzen.

„Hey Google, pausiere meine Waschmaschine.“

=>

„Okay, ich pausiere die Waschmaschine.“

„Hey Google, setze meine Waschmaschine fort.“

=>

„Okay, ich setze die Waschmaschine fort.“

Sie können auch den aktuellen Status Ihrer Waschmaschine testen, indem Sie Fragen stellen.

„Hey Google, ist meine Waschmaschine eingeschaltet?“

„Hey Google, läuft meine Waschmaschine?“

„Hey Google, in welchem Zyklus befindet sich meine Waschmaschine?“

4. Integration mit der Test-Suite testen

Neben dem manuellen Testen können Sie die automatisierte Test-Suite für Smart Home verwenden, um Anwendungsfälle basierend auf den Gerätetypen und Merkmalen zu validieren, die mit Ihrer Integration verknüpft sind. Die Test-Suite führt eine Reihe von Tests aus, um Probleme in Ihrer Integration zu erkennen. Außerdem werden informative Meldungen für fehlgeschlagene Testfälle angezeigt, damit Sie die Fehlerbehebung beschleunigen können, bevor Sie sich mit Ereignislogs befassen.

Test-Suite für Smart Home ausführen

Folgen Sie dieser Anleitung, um Ihre Cloud-zu-Cloud-Integration mit der Test-Suite zu testen:

  1. Öffnen Sie in Ihrem Webbrowser die Test-Suite für Smart Home.
  2. Melden Sie sich über die Schaltfläche rechts oben bei Google an. So kann die Test-Suite die Befehle direkt an Google Assistant senden.
  3. Geben Sie im Feld Projekt-ID die Projekt-ID Ihrer Cloud-zu-Cloud-Integration ein. Klicken Sie dann auf WEITER , um fortzufahren.
  4. Im Schritt Testeinstellungen werden in der Test-Suite der Gerätetyp und die Merkmale der Waschmaschine aufgeführt.

78ed6a1ebdb581bf.png

  1. Deaktivieren Sie die Option Synchronisierung anfordern testen , da die Beispiel-Waschmaschinen-App keine UI zum Hinzufügen, Entfernen oder Umbenennen der Waschmaschine hat. In einem Produktionssystem müssen Sie Synchronisierung anfordern auslösen, wenn der Nutzer Geräte hinzufügt, entfernt oder umbenennt.
  2. Klicken Sie auf WEITER , um den Test auszuführen.

Nachdem die Test-Suite ausgeführt wurde, sehen Sie sich die Ergebnisse der Testfälle an. Es werden zwei fehlgeschlagene Testfälle mit der entsprechenden Fehlermeldung angezeigt:

5838d10631c98ed2.png

Um die Fehlerbehebung für Ihre Cloud-zu-Cloud-Integration durchzuführen, müssen Sie die Ursache des Fehlers ermitteln, indem Sie zuerst die Fehlermeldung analysieren.

Fehlermeldung analysieren

Damit Entwickler die Ursache ermitteln können, werden in der Test-Suite Fehlermeldungen für jeden fehlgeschlagenen Testfall angezeigt, die den Grund für den Fehler angeben.

Für den ersten fehlgeschlagenen Testfall oben

99e4e5d06965a8a7.png

gibt die Fehlermeldung an, dass die Test-Suite "isPause": true in den von Ihrer Cloud-zu-Cloud-Integration gemeldeten Status erwartet, die tatsächlichen Status jedoch nur "isPause": false enthalten.

Außerdem gibt die Fehlermeldung des zweiten fehlgeschlagenen Testfalls an, dass die Status in der QUERY-Antwort von Ihrer Cloud-zu-Cloud-Integration "isPause": true enthalten, was sich von "isPause": false in den von Ihrer Cloud-zu-Cloud-Integration gemeldeten Status unterscheidet:

fdb5124102e3a37.png

Gemäß beiden Fehlermeldungen sollten Sie prüfen, ob Ihre Integration den Status isPaused mit dem richtigen Wert meldet.

Ursache des Fehlers ermitteln

Öffnen Sie functions/index.js, die die Funktion reportstate enthält, mit der Statusänderungen mit „Status melden“ an HomeGraph gesendet werden. Prüfen Sie die Nutzlast von „Status melden“. Sie werden feststellen, dass die Nutzlast den Status isPaused nicht enthält. Genau das wurde in den fehlgeschlagenen Testfällen von der Test-Suite geprüft.

index.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      ...

      const requestBody = {
        requestId: 'ff36a3cc', /* Any unique ID */
        agentUserId: USER_ID,
        payload: {
          devices: {
            states: {
              /* Report the current state of our washer */
             [context.params.deviceId]: {
                online: snapshot.online,
                on: snapshot.OnOff.on,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };

      const res = await homegraph.devices.reportStateAndNotification({
        requestBody,
      });
      ...
    });

Fehler beheben

Nachdem Sie die Ursache des Fehlers ermittelt haben, überarbeiten Sie functions/index.js, indem Sie der Nutzlast von „Status melden“ den Status isPaused hinzufügen:

index.js

exports.reportstate = functions.database.ref('{deviceId}').onWrite(
    async (change, context) => {
      ...

      const requestBody = {
        requestId: 'ff36a3cc', /* Any unique ID */
        agentUserId: USER_ID,
        payload: {
          devices: {
            states: {
              /* Report the current state of our washer */
             [context.params.deviceId]: {
                online: snapshot.online,
                on: snapshot.OnOff.on,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };
      ...
    });

Korrektur testen

Stellen Sie den aktualisierten Code mit der Firebase CLI bereit:

$ firebase deploy --only functions

Führen Sie die Test-Suite für Smart Home noch einmal aus. Alle Testfälle sollten jetzt erfolgreich sein.

148837f85d377dd6.png

5. Glückwunsch

17d485868a6771bc.png

Glückwunsch! Sie haben erfolgreich gelernt, wie Sie Probleme mit Cloud-zu-Cloud-Integrationen mit der Test-Suite für Smart Home und GCP-Messwerten und ‑Logging beheben.

Weitere Informationen

Aufbauend auf diesem Codelab können Sie die folgenden Übungen ausprobieren und weitere Ressourcen nutzen:

Weitere Informationen zum Testen und Einreichen einer Integration zur Überprüfung, einschließlich des Zertifizierungsprozesses zum Veröffentlichen Ihrer Integration für Nutzer