
Producto Mínimo Viable
Anteriormente, habíamos hablado de hacer un producto mínimo viable, este concepto viene de metodologías Ágiles donde el proceso de desarrollo se divide en pequeñas metas para que el cliente final pueda ver avances funcionales del desarrollo y dar su retroalimentación en tiempo real, en este caso no tenemos un cliente final, pero el proceso de desarrollo podemos igualmente realizarlo de esta forma, ya que estas mismas pequeñas metas ayudan a focalizar la atención en el proceso de desarrollo sin abrumarnos pensando en lo siguiente que debemos desarrollar.
En este caso, el primer producto mínimo viable será realizar una consulta API desde Ignition a las luces Philips Hue, y con el recurso de la guía rápida encontramos que la consulta API más sencilla que podemos hacer es la de obtener la información de las luces.
Para ello primero debemos entender que es la API y como funciona, esto nos requerirá un poco más de investigación, pero esta investigación irá enfocada directamente a lo que ya descubrimos que necesitamos para este desarrollo.
API
API es una Interfaz de Programación de Aplicaciones, tanto software como hardware pueden tener API's para controlar u obtener información desde otra aplicación, las API's pueden verse como enlaces de comunicación entre varias aplicaciones o programas.
Según el programa, las API's pueden tener funciones distintas y también distintas formas de acceso o de programación por lo que siempre es importante dirigirse a la información del fabricante sobre su API, en este caso esta información la obtuvimos en nuestro proceso de investigación en el siguiente recurso: https://developers.meethue.com/develop/get-started-2/ en este recurso aprendimos también que la API que utiliza Philips Hue es del tipo REST, hay distintos tipos de API's, pero nos enfocaremos en este tipo.
Este recurso es una guía de inicio rápido para utilizar la API REST, muchas veces puede ser que se encuentre información en forma de un manual y de hecho si existe un manual para la API REST de Philips Hue, pero por facilidad utilizaremos este recurso, ya que nos da la información resumida.
Para los usos de API REST hay dos cosas importantes a tomar en cuenta, la primera es que la forma de uso se da mediante el envío de solicitudes web, esto quiere decir que podemos hacer solicitudes API REST desde el navegador web, y la segunda es que las API REST se encuentran normalmente bloqueadas y requieren de un token, o un usuario para acceder a estas funcionalidades como medida de seguridad, esto normalmente requiere de unos pasos extra para obtener este token o este usuario, pero la documentación de la API siempre nos guía para obtenerlo.
API's en Ignition
En Ignition para utilizar las API REST de otros fabricantes es necesaria programación (si no existe un módulo de Ignition para esto) y aquí es donde ahora utilizamos nuestro segundo recurso importante que es el recurso del foro: https://forum.inductiveautomation.com/t/apis-for-common-household-smart-things-nest-google-home-ring-etc/35953/16 de este recurso ya anteriormente habíamos sacado palabras clave que eran las funciones que vimos se utilizaron en el código de los usuarios, estas eran:
- system.net.httpClient()
- .get()
- .put()
Ahora estas funciones podemos buscarlas en el manual de Ignition para ver como funcionan y cómo podemos ajustarlas a nuestro proyecto.
Buscando en el manual encontramos la siguiente información:
La instrucción system.net.httpClient() nos crea un objeto que se puede utilizar para enviar las solicitudes HTTP por lo que esta instrucción se utiliza únicamente como una asignación de una variable de esta forma:
client = system.net.httpClient()
A esta función se le pueden dar parámetros, y el manual siempre nos muestra los parámetros que podemos asignarle, sin embargo, no será necesario para nuestro proyecto utilizar estos parámetros, esto lo podemos ver en el código encontrado en el foro.
En este mismo recurso encontramos información para .get() y .put() ya que son métodos asociados al objeto creado con la función system.net.httpClient() y estos métodos están asociados también a la API REST por lo que esto nos indica que estamos en el camino correcto para la implementación de nuestra solución.
Programación
Como ya tenemos nuestra primera meta dada ahora si iremos a programar en Ignition para alcanzarla. Sabemos que en Ignition hay varios lugares donde podemos programar como lo son los componentes, las librerías y los eventos de gateway, cliente o sesión, pero iniciaremos programando en el Script Console porque así podemos rápidamente probar y limpiar pulgas de nuestro código antes de implementarlo directamente ya en Ignition.
De nuestros recursos sabemos que necesitamos una URL inicialmente para realizar una consulta API, esta URL está dada de la siguiente forma:
https://<Dirección IP>/api/<Usuario>/lights
Lo que se encuentra entre los símbolos <> es lo que debemos de ingresar, el primero siendo la dirección IP del puente y el segundo nuestro usuario, el resto debe mantenerse siempre de la misma forma, entonces crearemos variables para ingresar estos valores y los introduciremos al string de nuestro URL, esto en nuestro ejemplo se vería de la siguiente forma:
Ahora este URL debemos de enviarlo para hacer nuestra solicitud HTTP, en este caso esta solicitud es del tipo get, ya que solo entrega información, aquí es donde entran en juego las funciones que vimos anteriormente, esto sería de la siguiente forma:
Como podemos ver en el código las variables ip y username las estoy insertando en el string del url, esto para que el usuario pueda cambiarlas fácilmente luego. Ahora, como estamos en el script console puedo mandar a imprimir la variable response para ver la respuesta del código.
Esta respuesta como vemos no es muy informativa, realmente hay poco que puedo entender de esta respuesta, entonces para probar, iremos a nuestro navegador a ejecutar la solicitud API y obtenemos la siguiente respuesta.
Esta respuesta todavía cuesta un poco entenderla, pero vemos que si tiene información sobre nuestras luces, que es lo que queremos, al contraste de la respuesta del Ignition, esto puede ser un poco desalentador, pero el Ignition realmente no nos dio ningún tipo de código de error, por lo que es bueno volver al manual a revisar la información sobre la respuesta del método get.
El manual nos dice que la respuesta es un objeto y este objeto, al igual que el objeto de las solicitudes, tiene sus métodos que puedo utilizar, uno de esos métodos es el método .getJson() este nos da el contenido de la respuesta como un diccionario, entonces vamos a probarlo.
Esta respuesta ahora si parece ser lo mismo que nos devuelve el navegador, y vemos que tenemos información sobre nuestras luces, esto quiere decir que ya tenemos nuestro primer producto mínimo viable listo, con esto ya podemos realizarle un avance al "cliente" con un ejemplo funcional de que la interconexión entre Ignition y las luces funciona sin problema y ahora este código puedo llevarlo a mi biblioteca de códigos de Ignition para convertirlo en una función y continuar editándolo así sea necesario en el desarrollo de nuestro proyecto.