Coautora: Olga Staszek-Kornet LinkedIn

¿Alguna vez te has preguntado lo fácil que es en Power Automate conectarse a dispositivos externos?

En este artículo, comparto mi idea de un sistema para notificar visualmente el estado de disponibilidad de los participantes en Teams.

Con la pandemia global obligándonos a trabajar de forma remota, se volvió crucial establecer nuevas reglas no solo en nuestros lugares de trabajo, sino también en casa con otros miembros del hogar. Todos hemos visto videos virales de participantes interrumpiendo voluntariamente en reuniones importantes durante momentos menos convenientes. Esto me hizo pensar si había una manera de mostrar el estado de disponibilidad de los participantes a otros miembros del hogar o compañeros de trabajo que no tienen acceso al entorno de Microsoft 365 del empleado.

Mi investigación comenzó con algunas soluciones ya existentes en la misma línea: The Status Cube publicado por John Klimister, Ejemplo de bombilla Hue por Scott Hanselman, o la automatización basada en Raspberry Pi de Elio Struyf. Si bien son inspiradores, cada uno presenta escenarios más complejos y requiere habilidades avanzadas de programación. Mi objetivo era utilizar la menor cantidad de programación posible para que así más personas pudieran beneficiarse de la configuración personalizada en su propio entorno.

Tabla de contenidos

Presencia y suscripciones en MS Graph

La información sobre el estado de disponibilidad del usuario se incluye en los datos generales de este mismo y se puede capturar mediante MS Graph utilizando una suscripción. El tipo de recurso de suscripción se utiliza para recibir notificaciones cuando se crea, actualiza o elimina dicho recurso. Utilizaremos esta funcionalidad para monitorear cambios en la presencia de cualquier usuario de Teams y activar un flujo de Power Automate cada vez que cambie el estado.

Aquí tienes un ejemplo de carga útil de solicitud de suscripción para el tipo de recurso de presencia:

{
    "changeType": "updated",
    "notificationUrl": "<<FLOW URL>>",
    "resource": "/communications/presences/<<USER ID>>",
    "expirationDateTime": "2023-04-12T18:23:45.9356913Z",
    "clientState": "secretClientValue",
    "latestSupportedTlsVersion": "v1_2"
}

changeType: El tipo de cambio en el recurso suscrito que genera una notificación. Los valores admitidos son created, updated y deleted (creados, actualizados y eliminados)

notificationUrl: La URL del punto final que recibe las notificaciones. Reemplázala con tu URL de API (en este caso, el desencadenador HTTP de Power Automate del punto 2 en la sección de Power Automate).

resource: El recurso que la suscripción monitorea en busca de cambios. Este recurso se identifica mediante la ruta del recurso. Para un solo usuario, utiliza el endpoint /communications/presences/{id}, donde {id} representa el ID del usuario. Utilizando la API de Microsoft Graph, también puedes hacer un seguimiento de una lista de usuarios con el siguiente endpoint: /communications/presences?$filter=id in (‘{id}’, ‘{id}’, …).

expirationDateTime: La fecha y hora en que expira la suscripción. Ten en cuenta que el tiempo máximo de expiración para el endpoint de presencia es de 60 minutos, así que asegúrate de actualizar tu suscripción en consecuencia para garantizar que la funcionalidad persista. La fecha y la hora están en UTC y se representan en formato ISO 8601. Por ejemplo, la medianoche UTC del 1 de enero de 2024 se representa como 2024-01-01T00:00:00Z.

Power Automate

Power Automate fue una elección natural para una solución simple pero poderosa para diseñar un flujo de trabajo efectivo que se active por el cambio de disponibilidad del usuario y realice acciones consecuentes para cambiar el color de la bombilla en consecuencia. El siguiente gráfico presenta el diseño del flujo.

Flow

Desencadenador

  • El flujo se activa mediante una solicitud HTTP. Utiliza el desencadenador HTTP para inicializar la solicitud de suscripción desde la API de Microsoft Graph.

  • En última instancia, hay dos tipos de solicitudes que iniciarán el flujo. El primero tiene como objetivo confirmar el valor secreto a la API de Microsoft Graph al responder con un valor requerido. Este paso es esencial para establecer el proceso de autenticación y autorización con la API. La segunda solicitud implica manejar el valor de la presencia del usuario, lo que permite capturar y procesar el estado de disponibilidad del usuario.

  • Para comenzar tus pruebas y asegurarte de que la solicitud de suscripción sea válida en cualquier punto del desarrollo del flujo de trabajo, utiliza el MS Graph Explorer.

Graph Explorer

Acciones principales

  • Inicializa la variable de objeto utilizada para almacenar el conjunto de valores que se proporcionarán antes de la primera ejecución. Incluye los datos de la bombilla: tomarás las propiedades “did” (identificador), “region” (región) y “type” (tipo) de la consulta de prueba en el paso Descubrir que se describe a continuación.

DiscoverAction

did: Esta propiedad se refiere al identificador único de la bombilla Yeelight Colorful.

region: Tu región.

type: Se refiere al tipo o modelo de la bombilla Yeelight Colorful.

El valor “tenantId” almacena el número de identificación de tu inquilino. Agrego los siguientes valores a la variable de objeto para indicar los códigos de color para opciones particulares:

{
  "redColor": "16711680",
  "greenColor": "65280",
  "yellowColor": "16776960",
  "whiteColor": "16777215",
}

InitVariable

  • Las variables enteras resultan útiles para almacenar la información sobre los colores de luz objetivo y actual.

  • Verifica si la solicitud es una confirmación de suscripción con la siguiente condición.

Condition

contains(triggerOutputs(),'queries') is equal to true

Si se cumple la condición, el flujo responderá con el valor requerido a la Microsoft Graph API para confirmar la suscripción. De lo contrario, pasará a los siguientes pasos.

  • Verifica si la solicitud se dirige al inquilino actual: para asegurar el proceso, validamos el valor secreto que proviene de la solicitud. En un caso estándar, podemos utilizar un método descrito en esta publicación de blog. Como no controlamos el cuerpo de la solicitud, en su lugar, podemos verificar si la solicitud proviene del inquilino especificado en la propiedad tenantId de la variable de objeto con los datos de la bombilla. De lo contrario, se cancelará el flujo de trabajo.

Tenant

triggerOutputs()?['body']?['value'][0]?['tenantId']  is equal to  '<<TENANT ID>>'

Check Tenant Id

Para este proyecto en particular, incorporé el dispositivo Yeelight Colorful Bulb, que es una bombilla inteligente asequible controlada de forma remota a través de una conexión Wi-Fi. Para obtener más información sobre el dispositivo, puedes utilizar las acciones de Descubrir (Discover) y Consultar (Query) del servicio Yeelight proporcionado por Xiaomi. La salida de la consulta contiene la propiedad “spectrumRGB” que debe establecerse en una variable para su uso en la siguiente acción.

Discovery action

Para configurar la integración, necesitarás registrar una cuenta con Xiaomi y conectar la Yeelight Colorful Bulb. Debido a preocupaciones de seguridad, utilizo una conexión separada establecida exclusivamente para productos de Xiaomi. Una vez que la bombilla esté conectada a tu cuenta de Xiaomi, debes iniciar sesión en la misma cuenta para establecer la conexión dentro de cada acción basada en Xiaomi en la vista del creador de Power Automate.

  • Verifica si el parámetro “value” no está vacío: en etapas posteriores, utilizamos el primer elemento del array value. Para evitar errores, comprobamos si value no está vacío.
length(triggerOutputs()?['body']?['value']) is not equal to 0
  • Establece el color de la bombilla en función de la actividad del usuario identificada: utiliza la acción “Switch” para sobrescribir la variable “varNewBulbColor” con el indicador de actividad del usuario.

switch

triggerOutputs()?['body']?['value'][0]?['resourceData']?['activity']

Aquí tienes los valores que se deben utilizar en la declaración Switch:

OffWork - whiteColor
Offline - whiteColor
Available - greenColor
Busy - redColor
DoNotDisturb - redColor
BeRightBack - yellowColor
Away - yellowColor
  • Verificar si el color objetivo es diferente al actual: la condición verifica si el color actual de la bombilla es diferente al color objetivo. Si la condición es falsa, el flujo se terminará.

Color change condition

Para cambiar el color de la bombilla usando Power Automate, es esencial completar las siguientes propiedades en todas las acciones finales de Color:

Color action

La actualización de la suscripción

Tratamos el proceso descrito anteriormente en términos de Prueba de Concepto. Para mantener tu suscripción válida, cada 60 minutos se debe activar otro flujo para realizar la misma solicitud que en MS Graph Explorer, actualizando así la suscripción.

Subscription Update Flow

El proceso de creación de un Conector Personalizado para MS Graph se describe aquí.

El efecto final

La bombilla cambia de color según el estado de disponibilidad del usuario. Cuando el usuario está desconectado o no está trabajando, funciona como una bombilla normal. Cuando el usuario está disponible, la bombilla se vuelve verde. Cuando el usuario está ocupado o ausente, la bombilla se vuelve roja. Cuando el usuario está ausente, la bombilla se vuelve amarilla. Effect

Problemas conocidos

  • Por razones desconocidas, la suscripción tiende a activar el flujo varias veces. He probado algunas soluciones alternativas, pero hasta ahora ninguna de ellas ha tenido éxito. Si alguien tiene alguna idea, por favor házmela saber.

TooManyRequests

  • Al cambiar el color de la bombilla muestra el siguiente error. Sin embargo, el color cambia correctamente y no se observan otros problemas.

Error