Fehler im Smart Home beheben

1. Hinweis

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

a4657871181b5ad2.gif

Das Erlernen der Debugging-Tools für Cloud-zu-Cloud-Integrationen ist ein wichtiger Schritt, um eine Integration in Produktionsqualität mit Google Assistant zu erstellen. Um die Überwachung und das Debugging zu erleichtern, stehen Google Cloud Platform-Messwerte, Logging und die Testsuite 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 mithilfe der Test Suite für Smart Home sowie der GCP-Messwerte und des GCP-Loggings.

Lerninhalte

  • GCP-Messwerte und ‑Logging verwenden, um Produktionsprobleme zu identifizieren und zu beheben
  • Funktions- und API-Probleme mit der Test Suite für Smart Home erkennen

Voraussetzungen

2. Fehlerhafte App ausführen

Quellcode abrufen

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

… oder Sie können 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:

  • public: Eine Benutzeroberfläche, mit der sich der Status der smarten Waschmaschine einfach steuern und überwachen lässt.
  • functions: Ein vollständig implementierter Clouddienst, der die intelligente Waschmaschine mit Cloud Functions for Firebase und Firebase Realtime Database verwaltet.

Mit Firebase verknüpfen

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

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

In Firebase bereitstellen

Rufen Sie den Ordner functions auf und installieren Sie alle erforderlichen Abhängigkeiten mit npm..

$ cd functions
$ npm install

Hinweis:Wenn Sie die folgende Meldung sehen, können Sie sie ignorieren und fortfahren. Die Warnung wird aufgrund einiger älterer Abhängigkeiten angezeigt. Weitere Informationen

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 App für die defekte Waschmaschine 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 Web-App 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 Request Sync.

6f2b1344179977cf.png

Öffne die Google Home App und prüfe, ob du das Waschmaschinengerät mit dem Namen Defekte Waschmaschine siehst.

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

„Hey Google, schalte meine Waschmaschine ein.“

„Hey Google, starte meine Waschmaschine.“

„Hey Google, pausiere meine Waschmaschine.“

„Hey Google, setze die Waschmaschine fort.“

„Hey Google, stoppe meine Waschmaschine.“

Wenn Sie die Waschmaschine pausieren oder fortsetzen, werden Sie bemerken, dass Assistant per Sprachausgabe darauf hinweist, dass etwas nicht stimmt:

„Sorry, I couldn't reach <project display name >.“ (Leider konnte ich<Anzeigename des Projekts> nicht erreichen.)

Um dieses Problem zu beheben, benötigen Sie zuerst weitere Informationen zum Fehler, damit Sie die Ursache eingrenzen und identifizieren können.

Smarthome Analytics-Dashboard

Eine gute Möglichkeit, Fehler zu untersuchen, ist das Smarthome-Analyse-Dashboard, in dem Diagramme mit Messwerten zu Nutzung und Zustand für Ihre Cloud-Ausführung zusammengefasst werden:

  • Die Messwerte unter Nutzung spiegeln den Nutzungstrend Ihrer Cloud-zu-Cloud-Integration wider, einschließlich der Anzahl der täglich aktiven Nutzer und der Gesamtzahl der Anfragen an Ihre Ausführung.
  • Mit den Zustandsmesswerten können Sie das Auftreten von Anomalien in Ihrer Cloud-zu-Cloud-Integration überwachen. Dazu gehören die Anfrage-Latenz, der Prozentsatz der erfolgreichen Anfragen und die Aufschlüsselung von Fehlern.

Um die Ursache des Fehlers einzugrenzen, folgen Sie der Anleitung unten, um auf das Projektdashboard zuzugreifen.

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

b1735bbe11a7aff8.png

  1. Sie gelangen zu einer Liste der Dashboards für Ihr Projekt in Google Cloud. Wähle das Dashboard Google Home Analytics – Cloud-Integration aus.

5edd3751323176dd.png

  1. Scrollen Sie nach unten zum Diagramm Cloud Fulfillment Errors – Status Breakdown (Cloud-Fulfillment-Fehler – 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 anhand des Fehlercodes Ereignisprotokolle ab, um weitere Informationen zu erhalten.

Auf Ereignisprotokolle zugreifen

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

Öffnen Sie das Navigationsmenü in der Google Cloud Console und wählen Sie unter Vorgänge die Option Logging > Log-Explorer aus, um auf die Ereignisprotokolle 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 Fehlerprotokoll enthält ein Smart-Home-Ereignis mit Fehlerdetails, die Folgendes angeben:

  • Die ergriffene 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 solltest du prüfen, warum die Waschmaschinen-App nicht das richtige Gerät in der EXECUTE-Antwort enthält.

Grundursache des Fehlers ermitteln

Suchen Sie in functions/index.js nach dem EXECUTE-Handler (im onExecute-Array), 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 updateDevice-Funktion 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üfe außerdem, wie die Funktion updateDevice das Pausieren und Fortsetzen der Waschmaschine verarbeitet. Du wirst 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 / 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

Versuche es noch einmal mit den folgenden Sprachbefehlen. Assistant sollte jetzt korrekt reagieren, wenn du die Waschmaschine pausierst oder fortsetzt.

„Hey Google, pausiere meine Waschmaschine.“

=>

„Okay, ich pausiere die Waschmaschine.“

„Hey Google, setze den Waschvorgang fort.“

=>

„Okay, ich setze den Waschvorgang fort.“

Sie können auch Fragen stellen, um den aktuellen Status Ihrer Waschmaschine zu erfahren.

„Hey Google, ist meine Waschmaschine an?“

„Hey Google, läuft meine Waschmaschine?“

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

4. Integration mit der Test-Suite testen

Zusätzlich zu manuellen Tests können Sie die automatisierte Test Suite for Smart Home verwenden, um Anwendungsfälle basierend auf den Gerätetypen und Attributen zu validieren, die mit Ihrer Integration verknüpft sind. In der Testsuite werden eine Reihe von Tests ausgeführt, um Probleme in Ihrer Integration zu erkennen. Außerdem werden informative Meldungen für fehlgeschlagene Testläufe angezeigt, damit Sie die Fehlerbehebung beschleunigen können, bevor Sie sich die Ereignisprotokolle ansehen.

Test-Suite für Smart Home ausführen

Folge dieser Anleitung, um deine Cloud-to-Cloud-Integration mit der Test-Suite zu testen:

  1. Öffnen Sie in Ihrem Webbrowser die Test Suite for Smart Home.
  2. Melden Sie sich über die Schaltfläche oben rechts bei Google an. Dadurch 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 wird in der Testsuite der Gerätetyp und die Merkmale der Waschmaschine aufgeführt.

78ed6a1ebdb581bf.png

  1. Deaktiviere die Option Test Request Sync, da die Beispiel-Waschmaschinen-App keine Benutzeroberfläche zum Hinzufügen, Entfernen oder Umbenennen der Waschmaschine hat. In einem Produktionssystem müssen Sie Request Sync auslösen, wenn der Nutzer Geräte hinzufügt, entfernt oder umbenennt.
  2. Klicken Sie auf WEITER, um den Test zu starten.

Sehen Sie sich nach Abschluss der Testsuite die Ergebnisse der Testläufe an. Sie sehen zwei fehlgeschlagene Testläufe mit der entsprechenden Fehlermeldung:

5838d10631c98ed2.png

Um die Cloud-zu-Cloud-Integration auf den Fehler hin zu debuggen, müssen Sie die Ursache des Fehlers ermitteln, indem Sie zuerst die Fehlermeldung analysieren.

Fehlermeldung analysieren

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

Für den ersten fehlgeschlagenen Testlauf oben gilt:

99e4e5d06965a8a7.png

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

Außerdem gibt die Fehlermeldung des zweiten fehlgeschlagenen Testlaufs an, dass die Status in der QUERY-Antwort 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 dann prüfen, ob in Ihrer Integration der Status isPaused mit dem richtigen Wert gemeldet wird.

Grundursache des Fehlers ermitteln

Öffnen Sie functions/index.js, das die Funktion reportstate enthält, mit der Statusänderungen über „Status melden“ an Home Graph gesendet werden. Wenn Sie die Nutzlast des Berichtsstatus prüfen, werden Sie feststellen, dass der Status isPaused fehlt. Genau das hat die Test-Suite in den fehlgeschlagenen Testläufen 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, können Sie functions/index.js überarbeiten, indem Sie der Nutzlast „Report State“ 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

Wenn Sie die Test-Suite für Smart Home noch einmal ausführen, werden Sie feststellen, dass alle Testläufe bestanden wurden.

148837f85d377dd6.png

5. Glückwunsch

17d485868a6771bc.png

Glückwunsch! Sie haben gelernt, wie Sie Probleme bei der Cloud-zu-Cloud-Integration mithilfe der Test Suite für Smart Home sowie GCP-Messwerte und -Logging beheben.

Weitere Informationen

Aufbauend auf diesem Codelab können Sie die folgenden Übungen ausprobieren und zusätzliche 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