Capítulo 3 – Diseño e Implementación
5. DomoAccess
5.5. Modelo
Todas las consultas, actualizaciones y privilegios de acceso toman lugar aquí. El modelo es el encargado de representar y organizar toda la información con la cual opera el sistema. Este envía a la vista lo que debe ser mostrado en cada momento que un usuario solicita información. Estas peticiones o modificaciones del usuario llegan a través del componente controlador.
En el caso de DomoAccess, la información es almacenada en una base de datos MySQL. Particularmente, se guardan los datos del usuario, y sus configuraciones personales asociadas a los dispositivos del sistema de domótica utilizado. Cabe destacar que no todo se encuentra en la base de datos, sino que cierta información como lecturas, estados o comandos de los dispositivos conectados, son obtenidas desde fuera de DomoAccess, mediante mensajes REST (ya referenciado en 3.4).
45
Para comenzar a explicar la solución propuesta cabe aclarar que se decidieron crear las clases componente y habitación, con el objetivo de facilitar la administración al usuario. La clase componente es la que se relaciona con cada dispositivo conectado al sistema domótico, mientras que la habitación actúa de contenedor virtual de los componentes.
Figura 18: Diagrama UML de las distintas clases del modelo
SistemaDomótico es la clase que representa a cualquier sistema domótico sobre el que esté ejecutándose DomoAccess, en el caso de esta tesis, se trata de Intellihome, pero podría ser otro.
Como única variable encontramos al $ID, este es el número único con el cual DomoAccess diferencia e identifica a qué sistema domótico se está conectando.
46
El método de la clase es getListaComponentes(), es un método abstracto que cada sistema domótico deberá tener implementado para obtener información sobre sus componentes conectados.
Intellihome es la clase particular en la cual instanciamos la solución de DomoAccess. Como dijimos anteriormente, en este nivel de abstracción se encuentran todos los sistemas de domótica que podrían conectarse, Intellihome es uno de ellos.
Las variables que encontramos son $dir_API, que es la dirección de la API de Intellihome, se hace el llamado a esta dirección para obtener información sobre los componentes; y
$componentes, un arreglo donde se listan todos los dispositivos conectados a Intellihome (independientemente de si estos han sido registrados en DomoAccess, o no) con sus respectivas capabilities.
Como métodos encontramos a getComponentes() que carga la variable componentes, mediante un llamado REST a la API de Intellihome; crearObjetos(), una función que crea e
47
instancia el objeto correspondiente, con sus características o capabilities mediante la llamada a la API y la obtención de las mismas; y execute() que ejecuta la acción del componente dependiendo del sistema domótico.
Pseudo-código de la función getComponentes, necesaria para cargar todos los componentes.
5.5.1. Componente
La clase Componente sirve para realizar la correspondencia virtual de un dispositivo real conectado a Intellihome. Provee al usuario las facilidades para diferenciarlo de otros, mediante etiquetas como descripción e ícono asociado.
La variable más importante es $Propiedades, la cual es un arreglo que funciona como hash gracias a las particularidades de PHP. De él se pueden obtener datos tales como:
● $IDfísico: el identificador que enlaza el componente virtual con el real. ● $Vista: el código particular para representar ese tipo de componente.
● $Descripción: es un texto ingresado por el usuario para diferenciar al componente. Puede ser un nombre.
● $Imagen: es el ícono asociado al componente. Hay 73 íconos distintos, cada uno representando a las distintas opciones (radio, TV, termómetro, etc). Utilizamos 73
48
íconos personalizados, que se agregan al toolkit FontAwesome, estando este último disponible aún para ser usado, aunque con glifos más sencillos.
● $CoordenadaX/$CoordenadaY: son enteros que van del 0 al 100, son utilizados internamente, por el administrador del sistema, para posicionar geográficamente en un mapa de la casa, cada componente. El valor de cada coordenada representa el porcentaje de alto o ancho con respecto a la imagen del plano, en el que se dibuja el pin asociado.
Cabe destacar que los items $IDfísico y $Vista son cargados cuando se crea el componente en nuestro sistema, luego de obtener los datos desde la API. Los demás items, excepto por las coordenadas, fueron ingresados por el usuario cuando registró el dispositivo en DomoAccess. Las coordenadas, como ya se mencionó anteriormente fueron ingresadas por el administrador del sistema.
En cuanto a los métodos, agregadoaBD() verifica si el componente que está conectado a Intellihome, ya fue registrado en DomoAccess, es decir, si el usuario lo ha agregado a alguna habitación. Por otro lado ejecutar() lleva a cabo la acción asociada al componente, mediante un llamado a la API. Esta puede ser actualizar el valor, prender, apagar, subir volumen, etc.
5.5.2 Capabilities
Las capabilities [22] son las capacidades que puede tener un componente conectado. Vienen identificadas por un número o ID, el cual DomoAccess reconoce gracias a un diccionario de datos que comparte con Intellihome o el sistema domótico en cuestión. Este diccionario de datos muestra por cada identificador de capability, qué funcionalidad y visual se le agregará al componente a crear.
49
Se implementaron cuatro capabilities distintas, pero es importante tomar en cuenta que se pueden agregar más sin mayor complejidad de desarrollo, para extender el sistema.
La primera capability es la de switch, es la más sencilla de todas y simplemente consiste en permitir que el dispositivo se prenda o apague mediante un interruptor binario.
Otra de las capabilities es la de medición, que dota al componente con la capacidad de leer un valor numérico acompañado de una unidad de medición (ºC, hPa, %, etc.).
Las capabilities control volumen y control canal sirven para un componente que se registra con capacidades de ser controlado remotamente, más específicamente su volumen o canal, tal como lo indican sus nombres. Inicialmente cada capability provee la funcionalidad de subir y bajar de canal, o de volumen, respectivamente.
La última capability que mencionaremos es la de termostato. Funciona de manera que el componente pueda definir una temperatura ambiente, y el termostato pueda tomar las acciones necesarias para alcanzar ese valor. Un componente que puede hacer uso de esta capability es por ejemplo Nest, propiedad de Nest Labs.
Cabe destacar que un componente puede tener más de una capability, y cada capability a su vez no es exclusiva de un solo componente. Por ejemplo, podemos encontrarnos con un aire acondicionado Hitachi que provea las capabilities 1, 2, 3 y 4 por un lado, y por el otro, un aire acondicionado Atma que provea las mismas capabilities agregando una quinta, que sea un módulo de conexión WiFi (no implementado en esta tesis).
50
Creación del componente con todas sus capabilities
5.5.3. Habitación
La clase Habitación es la representación lógica del equivalente en el mundo real. Sirve como contenedor de componentes, y da la opción al usuario de diferenciarla mediante un nombre, descripción e ícono asociado al tipo de habitación.
Las variables que encontramos son $Componentes, un arreglo de los dispositivos ya registrados y asociados a la habitación; $ID, el identificador de la habitación que es único para cada habitación de un usuario, aunque puede repetirse entre distintos usuarios (ya que el sistema, para identificar cada habitación, pregunta antes por el ID de usuario);
$Nombre que es el nombre del tipo de habitación (dormitorio, baño, cocina, etc.);
$Descripción, que es el nombre que el usuario le da a la habitación; e $Info, un texto opcional que el usuario ingresa para diferenciar dos habitaciones similares o simplemente para identificar.
51
Los métodos de la clase son agregarComponente(), una función encargada de agregar al objeto $habitación el componente creado y getDatos(), que obtiene desde la base de datos toda la información de las variables mencionadas anteriormente.
5.5.4. Usuario
En DomoAccess, las configuraciones realizadas, habitaciones creadas, y componentes registrados, con su respectiva organización en la casa, están todas asociadas a un usuario. Esto significa que si bien DomoAccess puede poseer varios usuarios, cada uno de ellos está asociado con una sola casa.
Con la intención de almacenar todos los datos y configuraciones que se mencionaron en el párrafo anterior, se creó la clase Usuario. Las variables que posee son $id, $email, $nombre
y $plano.
$id es una variable importante ya que es la que identifica a cada usuario/casa dentro de DomoAccess. Por lo tanto cuando se accede a la base de datos, se piden las habitaciones y componentes y el plano de la casa de ese usuario en particular y no de otro, realizando las comprobaciones pertinentes.
Si bien $email no es una variable que sirva para identificar al usuario, una vez dentro del sistema, es utilizada cuando este va a loguearse. Esta variable se carga cuando el usuario se registra, y también forma parte del token de sesión o cookie, que no expira hasta que este se desloguee.
$nombre es una variable sin funcionalidad para el sistema, pero sirve a modo de identificación del usuario.
En cuanto a $plano, es una variable que contiene una imagen de la casa. En el capítulo 4 se ampliará sobre los detalles del mismo, su funcionalidad y un caso de instanciación donde se podrá ver como se ubican los componentes conectados en él.
52
5.6. Vista
La vista es la encargada de dar al modelo un formato acorde para interactuar (en nuestro caso se trata de una interfaz de usuario o UI).
En el caso de DomoAccess se utilizó a Smarty para consolidar la separación entre lógica de negocios y lógica de presentación. Es un motor de plantillas para PHP que facilita la tarea de realizar cambios en el diseño de la web sin inmiscuirnos en los detalles de cómo se modelan los datos accedidos. DomoAccess utiliza seis vistas / clases que detallaremos a continuación.
Figura 19: Diagrama de clases de la vista
La vista representada por Index.php es la primera que se ve al ingresar al sistema, es la encargada de mostrar el formulario de login o registro.
53
Figura 20: Acceso a Intellihome
DomoAccess_View.php muestra todo el sistema en pantalla con sus respectivas pestañas de navegación, habitaciones y demás. Es la vista más completa y compleja ya que provee toda la información de las habitaciones registradas, sus componentes y el estado de estos últimos, entre otras secciones. Si bien es una sola clase, la misma es dinámica ya que puede refrescar solo una porción de sus elementos, sin necesidad de recargar toda la página, gracias a las bondades de AJAX, anteriormente descriptas.
54
Los componentes previamente cargados, tienen asociadas sus propias vistas según las capabilities de cada uno. Las vistas de las capabilities son Switch.php, Medicion.php, Termostato.php, ControlCh.php y ControlVol.php, y cada una muestra por pantalla su interfaz. No se verá por pantalla de la misma manera un switch binario de encendido/apagado, que un visor de valores de medición, o los botones de un control remoto. Como ya se describió, cada componente puede tener varias capabilities, por lo tanto esto se traduce en varias vistas asociadas al mismo.
A continuación se mostrará con ejemplos cuáles son las capabilities mencionadas, y cómo se traducen a las distintas vistas.
ControlCh
Switch apagado Switch encendido
55
ControlVol
Termostato
Figura 22 (compuesta): Vistas de capabilities
Como mencionamos anteriormente separamos la lógica de negocios (PHP) de la lógica de presentación (HTML) mediante Smarty. Es por eso que las seis vistas de las que hablamos, internamente son archivos PHP con llamados a archivos template (TPL) con los cuales se genera el HTML final. A modo de demostración veremos un ejemplo con la clase
DomoAccess_View y uno de los templates que utiliza, correspondiente a la sección del Panel, donde se cargan las habitaciones y sus componentes.
56
Como se puede ver, el archivo DomoAccess_View.php es relativamente sencillo, y en el método refrescarPanel() se hace un llamado a un template de Smarty denominado ‘panel.tpl’ que es el que posee el código más complejo, compuesto por HTML y etiquetas
Smarty.
El código anterior da como resultado que en una sola página web, desde una de sus pestañas, tengamos acceso a todas las habitaciones, con todos sus componentes completamente cargados (nombre, ID, descripción, ícono y elementos de la vista asociada según las capabilities).
57
Figura 23: Vista de Habitación con componentes
5.7. Controlador
El controlador, como vimos anteriormente, es quien recibe los mensajes de parte del usuario. Suelen ser eventos o acciones, que son convertidos a peticiones para el modelo (por ejemplo, cuando se pide la lista de dispositivos disponibles conectados al sistema domótico). Además puede enviar comandos a la vista asociada si el modelo sufre un cambio en la forma de cómo se presenta (por ejemplo, cambia la temperatura leída por un termostato). Tal como se ve en lo anteriormente expuesto, el controlador oficia de intermediario (o middleware) entre la vista y el modelo.
El controlador está representado por una única clase llamada de forma homónima, con varios métodos asociados a la funcionalidad que puede realizar el usuario, así como también con la generación y modificación del código HTML que se muestra.
En esta clase se encuentran variables privadas asociadas a las vistas generadas, y otras al modelo. $index_view y $habitaciones_view son vistas del MVC, mientras que
$habitacionesmodel y $componentesmodel son modelos, es decir representaciones lógicas de sus contrapartes reales, que trabajan en conjunto con la información almacenada en las
58
bases de datos. $habitaciones es una variable que posee todas las habitaciones registradas con sus respectivos componentes ya configurados, $sinconfigurar son los componentes que si bien están enchufados al sistema domótico aún no se agregaron a DomoAccess.
En cuanto a los métodos principales, encontramos a cargarSistema() que como se puede ver en el pseudo-código de abajo, es el encargado de obtener todos los componentes de los distintos sistemas domóticos y de cargar las habitaciones con ellos.
También en esta clase se encuentran otros métodos con la capacidad de operar con el modelo y reflejar los resultados en la vista. Algunos de estos son agregarHabitacion(), borrarHabitacion(), agregarComponente(), $borrarComponente(), refrascarVista() y
llamadoaAccion() entre los más importantes.
Los primeros pasos de estos métodos son similares entre si y consisten en obtener los datos de la acción a realizar asociada con el comando que el usuario ejecutó desde el navegador. Esto se realiza mediante AJAX.
La segunda parte varía según la acción a realizar, en el caso de agregar y eliminar componentes o habitaciones se modifica el modelo con los datos que el controlador ya posee y luego se actualiza la vista.
59
En el siguiente código se puede ver el método llamadoaAccion() que se diferencia de los anteriores en que este necesita buscar el componente en la variable $habitaciones para poder realizar la ejecución correspondiente.
60
Capítulo 4: Instanciación
1. Resumen
En este capítulo veremos cómo se realiza una instanciación de DomoAccess sobre un sistema domótico existente y las consideraciones que se deberán tener en cuenta a la hora de hacerlo.
Inicialmente tenemos la necesidad de decorar un sistema domótico ya existente, dotándolo de nuevas características y capacidades que le sean útil al usuario. Entre estas nuevas capacidades se encuentran la posibilidad de acceder a sus dispositivos conectados (controlarlos, leerlos, comandarlos, etc.), y organizar los mismos mediante una interfaz gráfica accesible via web.
Como caso de estudio, tomamos Intellihome, un sistema domótico creado como tesis de grado en el año 2014. De todas maneras cabe destacar que DomoAccess se pensó como una solución abstracta compatible con todos los sistemas domóticos, requiriendo adaptaciones mínimas de código fuente con cada nuevo agregado.