Cómo depurar la casa inteligente

1. Antes de comenzar

Como desarrollador de Internet de las cosas (IoT), puedes compilar integraciones de nube a nube que permitan a los usuarios controlar sus dispositivos mediante los controles de tacto de la app de Google Home y los comandos por voz de Asistente de Google.

a4657871181b5ad2.gif

Aprender a usar las herramientas de depuración para las integraciones de nube a nube es un paso importante para compilar una integración de calidad de producción con Asistente de Google. Para facilitar la supervisión y depuración, las métricas de Google Cloud Platform (GCP) y el registro, así como el Test Suite para la casa inteligente, están disponibles para ayudarte a identificar y resolver problemas en tus integraciones.

Requisitos previos

Qué compilarás

En este codelab, implementarás una integración de nube a nube con 2 defectos y la conectarás al Asistente. Luego, depurarás los defectos de la integración a través del paquete de pruebas para la casa inteligente y las métricas y el registro de Google Cloud Platform (GCP).

Qué aprenderás

  • Cómo usar las métricas y el registro de GCP para identificar y resolver problemas de producción
  • Cómo usar Test Suite para la casa inteligente para identificar problemas funcionales y de API

Requisitos

2. Ejecuta la app defectuosa

Obtén el código fuente

Haz clic en el siguiente vínculo para descargar la muestra de este codelab en tu máquina de desarrollo:

O bien, puedes clonar el repositorio de GitHub desde la línea de comandos.

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

Acerca del proyecto

La app de la lavadora contiene los siguientes subdirectorios:

Cómo conectarse a Firebase

Abre la terminal en tu máquina de desarrollo. Navega al directorio washer-faulty y configura Firebase CLI con tu proyecto de integración compilado en el codelab Conecta dispositivos de casa inteligente al código de Google Assistant:

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

Cómo implementar en Firebase

Ve a la carpeta functions y, luego, instala todas las dependencias necesarias mediante npm.

$ cd functions
$ npm install

Nota: Si ves el siguiente mensaje, puedes ignorarlo y continuar. La advertencia se debe a algunas dependencias anteriores. Puedes encontrar más detalles aquí.

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

Ahora que instalaste las dependencias y configuraste tu proyecto, tienes todo listo para implementar la app de la lavadora defectuosa.

$ firebase deploy

Este es el resultado que debería ver en la consola:

...

✔ Deploy complete!

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

Actualiza HomeGraph

Abre la URL de Hosting en tu navegador (https://<firebase-project-id>.firebaseapp.com) para ver la app web. En la IU web, haz clic en el botón Actualizar ae8d3b25777a5e30.png para actualizar HomeGraph a través de Solicitar sincronización con los metadatos de dispositivos más recientes de la app de la lavadora defectuosa:

6f2b1344179977cf.png

Abre la app de Google Home y verifica que puedas ver el dispositivo de la lavadora llamado Lavadora defectuosa.

e357de6a7faff925.png

3. Prueba tu integración

Después de implementar tu proyecto, prueba que tu integración controle la lavadora.

Prueba la lavadora

Verifica el cambio de valor cuando pruebes cualquiera de los siguientes comandos por voz en el teléfono:

"Hey Google, enciende la lavadora".

“Hey Google, inicia mi lavadora”.

"Hey Google, pausa la lavadora".

"Hey Google, reanuda la lavadora".

"Hey Google, detén la lavadora".

Notarás que Asistente responde que algo está mal por voz cuando pausas o reanudas la lavadora:

"Lo siento, no pude comunicarme con <nombre visible del proyecto>".

Para depurar este problema, primero debes obtener más información sobre el error para acotar y, luego, identificar la causa raíz.

Panel de Smarthome Analytics

Un buen lugar para inspeccionar los errores es el panel de Smarthome Analytics, que agrega gráficos de las métricas de uso y estado de tu entrega en la nube:

  • Las métricas de Uso reflejan la tendencia de uso de tu integración de nube a nube, incluida la cantidad de usuarios activos por día y el recuento total de solicitudes a tu entrega.
  • Las métricas de Estado te ayudan a supervisar la aparición de anomalías en tu integración de nube a nube, lo que abarca la latencia de las solicitudes, el porcentaje de éxito y el desglose de errores.

Para acotar la causa del error, sigue los pasos que se indican a continuación para acceder al panel del proyecto.

  1. En la Consola de Play, ve a la página Proyectos.
  2. Selecciona tu proyecto de casa inteligente.
  3. Haz clic en la pestaña Analytics en el menú de la izquierda.

b1735bbe11a7aff8.png

  1. Se te dirigirá a una lista de paneles de tu proyecto en Google Cloud. Selecciona el panel Google Home Analytics - Cloud Integration.

5edd3751323176dd.png

  1. Desplázate hacia abajo hasta el gráfico Errores de entrega de Cloud: Desglose de estado para ver los códigos de error del intervalo de tiempo destacado.

c468743c20a11c15.png

El código de error PARTNER_RESPONSE_MISSING_DEVICE proporciona una sugerencia sobre la causa raíz. A continuación, recupera los registros de eventos según el código de error para obtener más detalles.

Accede a los registros de eventos

Para obtener más detalles sobre el error, accede a los registros de eventos de tu integración de nube a nube a través de Cloud Logging.

Abre el menú de navegación en Google Cloud Platform y, en Operaciones, selecciona Registros > Explorador de registros para acceder a los registros de eventos de tu proyecto. Como alternativa, puedes buscar Explorador de registros en el cuadro de búsqueda.

En el campo de entrada Buscar en todos los campos, ingresa la consulta PARTNER_RESPONSE_MISSING_DEVICE y haz clic en Ejecutar consulta. Los registros que coinciden con la consulta se muestran en la sección Resultados.

747cca0f1249a5a.png

El registro de errores muestra un evento de casa inteligente con detalles de errores que indican lo siguiente:

  • La acción que realizó el usuario es "reanudar la lavadora" (actionType: "STARTSTOP_UNPAUSE"), que corresponde al comando por voz reciente que falló.
  • El mensaje de depuración asociado es "JSON response does not include device.".

En función del mensaje de depuración, debes verificar por qué la app de la lavadora no incluye el dispositivo correcto en la respuesta EXECUTE.

Identifica la causa raíz del error

En functions/index.js, busca el controlador EXECUTE (en el array onExecute) que muestra el estado de cada comando y el estado del dispositivo nuevo. La inserción de IDs de dispositivos en una respuesta EXECUTE depende de la resolución de la función updateDevice:

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

Verifica cómo la función updateDevice controla la pausa o la reanudación en la lavadora y verás que la cadena que coincide con el comando de pausa o reanudación es incorrecta:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpausePause':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

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

Cómo corregir el error

Ahora que identificaste la causa raíz del error, puedes corregir la cadena del comando de pausa / reanudación:

index.js

const updateDevice = async (execution, deviceId) => {
 const {params, command} = execution;
 let state; let ref;
 switch (command) {
   ...
   case 'action.devices.commands.PauseUnpause':
     state = {isPaused: params.pause};
     if (params.pause) state.isRunning = false;
     ref = firebaseRef.child(deviceId).child('StartStop');
     break;
 }

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

Cómo probar la corrección

Implementa el código actualizado usando Firebase CLI:

firebase deploy --only functions

Vuelve a intentar los siguientes comandos por voz y verás que Asistente responde correctamente cuando pausas o reanudas la lavadora.

"Hey Google, pausa la lavadora".

=>

"Por supuesto, pausaré la lavadora".

"Hey Google, reanuda la lavadora".

=>

"Entendido, reanudaré la lavadora".

También puedes hacer preguntas para probar el estado actual de la lavadora.

"Hey Google, ¿la lavadora está encendida?".

"Hey Google, ¿la lavadora está funcionando?".

"Hey Google, ¿en qué ciclo está la lavadora?".

4. Prueba tu integración con el paquete de pruebas

Además de realizar pruebas manuales, puedes usar el paquete de pruebas automatizado para la casa inteligente para validar los casos de uso en función de los tipos de dispositivos y las características asociadas con tu integración. El Test Suite ejecuta una serie de pruebas para detectar problemas en tu integración y muestra mensajes informativos para los casos de prueba que fallaron para acelerar la depuración antes de analizar los registros de eventos.

Ejecuta Test Suite para la casa inteligente

Sigue estas instrucciones para probar tu integración de nube a nube con Test Suite:

  1. En tu navegador web, abre Test Suite para casa inteligente.
  2. Accede a Google con el botón que se encuentra en la esquina superior derecha. Esto permite que el paquete de prueba envíe los comandos directamente a Asistente de Google.
  3. En el campo ID del proyecto, ingresa el ID del proyecto de tu integración de nube a nube. Luego, haz clic en SIGUIENTE (NEXT) para continuar.
  4. En el paso Configuración de la prueba, verás que el paquete de pruebas enumera el tipo de dispositivo y las características de la lavadora.

78ed6a1ebdb581bf.png

  1. Inhabilita la opción Test Request Sync, ya que la app de la lavadora de muestra no tiene una IU para agregar, quitar o cambiar el nombre de la lavadora. En un sistema de producción, debes activar Request Sync cada vez que el usuario agregue, quite o cambie el nombre de los dispositivos.
  2. Haz clic en NEXT para comenzar a ejecutar la prueba.

Una vez que se complete la ejecución de Test Suite, consulta los resultados de los casos de prueba. Notarás dos casos de prueba fallidos con el mensaje de error correspondiente:

5838d10631c98ed2.png

Para depurar la integración de nube a nube en busca de la falla, deberás identificar la causa raíz del error. Para ello, primero debes analizar el mensaje de error.

Cómo analizar el mensaje de error

Para ayudar a los desarrolladores a identificar la causa raíz, Test Suite muestra mensajes de error para cada caso de prueba que falló y que indican el motivo de la falla.

En el primer caso de prueba fallido anterior,

99e4e5d06965a8a7.png

Su mensaje de error indica que Test Suite espera "isPause": true en los estados informados desde tu integración de nube a nube, pero los estados reales solo incluyen "isPause": false.

Además, el mensaje de error del segundo caso de prueba que falló indica que los estados en la respuesta QUERY de tu integración de nube a nube incluyen "isPause": true, que difiere de "isPause": false en los estados informados por tu integración de nube a nube:

fdb5124102e3a37.png

Según ambos mensajes de error, debes verificar si tus informes de integración indican isPaused con el valor correcto.

Identifica la causa raíz del error

Abre functions/index.js, que contiene la función reportstate que publica cambios de estado en Home Graph a través del estado del informe. Inspecciona la carga útil de estado del informe y verás que le falta el estado isPaused, que es exactamente lo que el paquete de pruebas verificó en los casos de prueba que fallaron.

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: true,
                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,
      });
      ...
    });

Cómo corregir el error

Ahora que identificaste la causa raíz del error, revisa functions/index.js agregando el estado isPaused a la carga útil de estado del informe:

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: true,
                on: snapshot.OnOff.on,
                isPaused: snapshot.StartStop.isPaused,
                isRunning: snapshot.StartStop.isRunning,
                currentRunCycle: [{
                  currentCycle: 'rinse',
                  nextCycle: 'spin',
                  lang: 'en',
                }],
                currentTotalRemainingTime: 1212,
                currentCycleRemainingTime: 301,
              },
            },
          },
        },
      };
      ...
    });

Cómo probar la corrección

Implementa el código actualizado usando Firebase CLI:

$ firebase deploy --only functions

Vuelve a ejecutar el paquete de pruebas para la casa inteligente y verás que todos los casos de prueba se aprobaron.

148837f85d377dd6.png

5. Felicitaciones

17d485868a6771bc.png

¡Felicitaciones! Aprendiste a solucionar problemas de integración de nube a nube a través del Test Suite para la casa inteligente y las métricas y el registro de GCP.

Más información

A partir de este Codelab, prueba los siguientes ejercicios y explora recursos adicionales:

También puedes obtener más información sobre cómo probar una integración y enviarla a revisión, incluido el proceso de certificación para publicar tu integración a los usuarios.