Cómo depurar la casa inteligente

1. Antes de comenzar

Como desarrollador de Internet de las cosas (IoT), puedes compilar Acciones de casa inteligente que brinden a los usuarios la capacidad de controlar sus dispositivos mediante los controles de tacto en la app de Google Home y los comandos por voz con Asistente de Google.

a4657871181b5ad2.gif

Aprender a usar las herramientas de depuración para Acciones de casa inteligente es un paso importante a la hora de integrar la calidad de la producción con Asistente de Google. Para facilitar la supervisión y depuración, las métricas de Google Cloud Platform (GCP), Logging y el conjunto de pruebas para casa inteligente están disponibles para ayudarte a identificar y resolver los problemas de tus Actions.

Requisitos previos

Qué compilarás

En este codelab, implementarás una Acción de casa inteligente con 2 defectos y la conectarás al Asistente. Luego, depurarás los defectos de la Acción con el paquete de pruebas para casas inteligentes y Métricas y Logging de Google Cloud Platform (GCP).

Qué aprenderás

  • Cómo usar las métricas de GCP y Logging para identificar y resolver problemas de producción
  • Cómo usar el paquete de pruebas de una 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, luego, configura Firebase CLI con tu proyecto de acciones compilado en el codelab Cómo conectar dispositivos de casa inteligente al Asistente de Google:

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

Cómo implementar en Firebase

Navega a la carpeta functions y, luego, instala todas las dependencias necesarias con npm.

$ cd functions
$ npm install

Nota: Si ves el siguiente mensaje, puedes ignorarlo y continuar. La advertencia se debe a algunas dependencias más antiguas. 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 el proyecto, está 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/<project-id>/overview
Hosting URL: https://<project-id>.firebaseapp.com

Actualiza HomeGraph

Abre la URL de Hosting en tu navegador (https://<project-id>.firebaseapp.com) para ver la aplicación web. En la IU web, haz clic en el botón Refresh ae8d3b25777a5e30.png para actualizar HomeGraph a través de Request Sync con los metadatos más recientes del dispositivo 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 con el nombre Lavadora con fallas.

e357de6a7faff925.png

3. Prueba la Acción

Después de implementar el proyecto, prueba que la acción controle la lavadora.

Prueba la lavadora

Comprueba 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 mi lavadora".

"Hey Google, detén la lavadora".

Cuando detengas o reanudes la lavadora, verás que Asistente responde que hay un problema con la voz:

“Lo siento, no pude establecer conexión con <nombre visible del proyecto>”.

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

Panel de estadísticas de Smarthome

Un buen lugar para inspeccionar errores es el panel de estadísticas de Smarthome, que recopila gráficos de métricas de uso y estado para tu entrega en la nube:

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

Para acotar la causa del error, sigue estos pasos y accede al panel del proyecto.

  1. En la Consola de Actions, ve a la página Proyectos.
  2. Selecciona tu proyecto de casa inteligente.
  3. Elige la pestaña Estadísticas y haz clic en Ir a Google Cloud Platform.

b1735bbe11a7aff8.png

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

5edd3751323176dd.png

  1. Desplázate hacia abajo hasta el gráfico Cloud Fulfillment Errors - Status Breakdown 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 para la causa raíz. A continuación, recupera los registros de eventos basados en el código de error para obtener más detalles.

Accede a los registros de eventos

Si quieres obtener más detalles sobre el error, accede a los registros de eventos de tus Acciones de casa inteligente a través de Cloud Logging.

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

En la sección Consulta, 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 de la consulta.

747cca0f1249a5a.png

En el registro de errores, se muestra un evento de casa inteligente con detalles del error que indican lo siguiente:

  • La acción que realizó el usuario es "reanudando 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 de 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 nuevo estado del dispositivo. La inserción de IDs de dispositivos en una respuesta de 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 en más detalle cómo la función updateDevice controla las pausas y las reanudaciones en la lavadora. Descubrirás que la cadena que debe coincidir con el comando pause/Resume no es correcta:

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 pause / Resume:

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

Prueba la corrección

Implementa el código actualizado usando Firebase CLI:

firebase deploy --only functions

Vuelve a ejecutar los siguientes comandos por voz y verás que Asistente responderá correctamente ahora cuando detengas o reanudes la lavadora.

"Hey Google, pausa la lavadora".

=&gt;

"Por supuesto, pausaré la lavadora".

"Hey Google, reanuda mi lavadora".

=&gt;

"Entendido. Se 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 acción con el paquete de pruebas

Además de realizar pruebas manuales, puedes usar el Paquete de pruebas para casas inteligentes automatizado para validar los casos de uso según los tipos de dispositivo y las características asociadas con tu Acción. El paquete de pruebas ejecuta una serie de pruebas para detectar problemas en tu acción y muestra mensajes informativos sobre los casos de prueba fallidos para acelerar la depuración antes de sumergirte en los registros de eventos.

Ejecuta el Paquete de pruebas para la casa inteligente

Sigue estas instrucciones para probar la Acción de tu casa inteligente con el paquete de pruebas:

  1. En el navegador web, abre el Paquete de pruebas para casa inteligente.
  2. Accede a Google con el botón de la esquina superior derecha. Esto permite que el paquete de pruebas envíe los comandos directamente a Asistente de Google.
  3. En el campo ID del proyecto, ingresa el ID del proyecto de tu Acción de casa inteligente. Luego, haz clic en SIGUIENTE para continuar.
  4. En el paso Configuración de prueba, verás que el paquete de pruebas muestra 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 Solicitar sincronización cada vez que el usuario agregue, quite o cambie el nombre de los dispositivos.
  2. Haz clic en SIGUIENTE para comenzar a ejecutar la prueba.

Una vez que el paquete de pruebas termine de ejecutarse, consulta los resultados de los casos de prueba. Verás dos casos de prueba fallidos capturados con el mensaje de error correspondiente:

5838d10631c98ed2.png

Si quieres depurar tu Acción de casa inteligente debido al error, primero deberás analizar el mensaje de error para identificar la causa raíz del error.

Analiza el mensaje de error

Para ayudar a los desarrolladores a identificar la causa raíz, el paquete de pruebas muestra mensajes de error para cada caso de prueba fallido que indica el motivo.

Para el primer caso de prueba fallido anterior,

99e4e5d06965a8a7.png

El mensaje de error indica que el paquete de pruebas espera "isPause": true en los estados informados de tu Acción de casa inteligente, pero los estados reales solo incluyen "isPause": false.

Además, el mensaje de error del segundo caso de prueba fallido indica que los estados de la respuesta QUERY de tu Acción de casa inteligente incluyen "isPause": true, que difiere de "isPause": false en los estados informados de tu Acción de casa inteligente:

fdb5124102e3a37.png

Según ambos mensajes de error, debes verificar si los informes de Acción indican que isPaused tiene el valor correcto.

Identifica la causa raíz del error

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

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

Prueba 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 fueron aprobados.

148837f85d377dd6.png

5. Felicitaciones

17d485868a6771bc.png

¡Felicitaciones! Aprendiste a solucionar problemas con Acciones de casa inteligente mediante el paquete de pruebas para casas inteligentes y Métricas de GCP y Logging.

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 y enviar una Acción para su revisión, incluido el proceso de certificación para publicar tu Acción para los usuarios.