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.

Aprender a usar las herramientas de depuración para las integraciones de nube a nube es un paso importante para crear integraciones de calidad de producción con el Asistente de Google. Para facilitar la supervisión y la depuración, Google Cloud Metrics, Logging y Test Suite para Casa Inteligente están disponibles para ayudarte a identificar y resolver problemas en tus integraciones.
Requisitos previos
- Lee la guía para desarrolladores Crea una integración de nube a nube
- Ejecuta el codelab Conecta dispositivos inteligentes para la casa a Asistente de Google
Qué compilarás
En este codelab, implementarás una integración de nube a nube con 2 defectos y la conectarás a Asistente. Luego, depurarás los defectos de la integración con Test Suite para 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 el paquete de pruebas para casas inteligentes y, así, identificar problemas funcionales y de la API
Requisitos
- Un navegador web, como Google Chrome
- Un dispositivo iOS o Android con la app de Google Home instalada
- Node.js versión 10.16 o posterior
- Una cuenta de facturación de Google Cloud
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:
public: Es una IU de frontend para controlar y supervisar el estado de la lavadora inteligente con facilidad.functions: Es un servicio de nube completamente implementado que administra la lavadora inteligente con Cloud Functions para Firebase y Firebase Realtime Database
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 creado en el codelab de Connect smart home devices to the 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 con npm.
$ cd functions $ npm install
Nota: Si ves el siguiente mensaje, puedes ignorarlo y continuar. La advertencia se debe a algunas dependencias anteriores, y 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 ya instalaste las dependencias y configuraste tu proyecto, tienes todo listo para implementar la app de 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
para actualizar HomeGraph con los metadatos del dispositivo más recientes de la app de la lavadora defectuosa con Request Sync.

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

3. Prueba tu integración
Después de implementar tu proyecto, prueba que la integració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 la lavadora".
"Hey Google, detén la lavadora".
Notarás que Asistente responde por voz que algo anda mal cuando pausas o reanudas el lavado:
"Lo siento, no pude acceder a <nombre visible del proyecto>".
Para depurar este problema, primero necesitas más información sobre el error para acotar y, luego, identificar la causa raíz.
Panel de estadísticas de Smarthome
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 para tu cumplimiento 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 diarios y el recuento total de solicitudes a tu cumplimiento.
- Las métricas de Estado te ayudan a supervisar la ocurrencia de anomalías en tu integración de nube a nube, lo que abarca la latencia de solicitudes, el porcentaje de éxito y el desglose de errores.
Para determinar la causa del error, sigue los pasos que se indican a continuación para acceder al panel del proyecto.
- En la consola para desarrolladores, ve a la página Proyectos.
- Selecciona tu proyecto de casa inteligente.
- Haz clic en la pestaña Analytics en el menú de la izquierda.

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

- Desplázate hacia abajo hasta el gráfico Errores de cumplimiento en la nube: desglose del estado para ver los códigos de error del período destacado.

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 Cloud a Cloud con Cloud Logging.
Abre el menú de navegación en 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 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.

El registro de errores muestra un evento de casa inteligente con detalles del error que indican lo siguiente:
- La acción del usuario es "reanudando el lavado" (
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.".
Según el 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 estado del dispositivo nuevo. 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)));
}
}
}
Si verificas más a fondo cómo la función updateDevice controla la pausa y la reanudación en la lavadora, 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':
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);
};
Corrige el error
Ahora que identificaste la causa raíz del error, puedes corregir la cadena del comando de pausa o reanudación:
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);
};
Prueba 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 responderá correctamente cuando pauses o reanudes el lavado.
"Hey Google, pausa la lavadora".
=>
"De acuerdo, 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 Test Suite
Además de realizar pruebas de forma manual, puedes usar el paquete de pruebas automatizado para casas inteligentes y validar casos de uso según los tipos y rasgos de dispositivos asociados con tu integración. Test Suite ejecuta una serie de pruebas para detectar problemas en tu integración y muestra mensajes informativos para los casos de prueba fallidos, lo que acelera la depuración antes de analizar los registros de eventos.
Ejecuta el paquete de pruebas para casas inteligentes
Sigue estas instrucciones para probar tu integración de nube a nube con el paquete de pruebas:
- En tu navegador web, abre el conjunto de pruebas para la casa inteligente.
- Accede a Google con el botón de la esquina superior derecha. Esto permite que Test Suite envíe los comandos directamente a Asistente de Google.
- En el campo ID del proyecto, ingresa el ID del proyecto de tu integración de Cloud a Cloud. Luego, haz clic en SIGUIENTE para continuar.
- En el paso Configuración de la prueba, verás que el conjunto de pruebas enumera el tipo de dispositivo y las características de la lavadora.

- Inhabilita la opción Test Request Sync, ya que la app de lavadora de ejemplo 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 dispositivos.
- Haz clic en SIGUIENTE 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 que se detectaron dos casos de prueba fallidos con sus respectivos mensajes de error:

Para depurar la integración de nube a nube en busca de la falla, 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, Test Suite muestra mensajes de error para cada caso de prueba fallido que indican el motivo del error.
En el primer caso de prueba fallido anterior,

Su mensaje de error indica que Test Suite espera "isPause": true en los estados que se informan desde tu integración de Cloud a Cloud, pero los estados reales solo incluyen "isPause": false.
Además, el mensaje de error del segundo caso de prueba fallido indica que los estados en la respuesta de QUERY de tu integración de nube a nube incluyen "isPause": true, que difiere de "isPause": false en los estados que se informan desde tu integración de nube a nube:

Según ambos mensajes de error, debes verificar si tu integración informa el estado isPaused con 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 con Report State. Inspecciona la carga útil de Report State y verás que falta el estado isPaused, que es exactamente lo que Test Suite verificó 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: 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,
});
...
});
Corrige el error
Ahora que identificaste la causa raíz del error, revisa functions/index.js agregando el estado isPaused a la carga útil de Report State:
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,
},
},
},
},
};
...
});
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 se aprobaron todos los casos de prueba.

5. Felicitaciones

¡Felicitaciones! Aprendiste correctamente a solucionar problemas de integración de nube a nube con el conjunto de pruebas para 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:
- Agrega más características compatibles a tu dispositivo y pruébalas con el paquete de pruebas.
- Crea paneles, configura alertas y accede a los datos de las métricas de forma programática para obtener métricas de uso útiles sobre tu integración.
- Explora la entrega local para la casa inteligente.
- Consulta nuestra muestra de GitHub para obtener más información.
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 poner tu integración a disposición de los usuarios.