2006/02/21
Manejar aparatos eléctricos desde el PC: domótica (2/5)
Para poder controlar el módulo por software se me planteaba una duda, ¿cómo hacer para que varios programas accediesen a este?. Todos tenían que ser ejecutables y ser lanzados con el Port Talk, sin embargo no era lo más optimo porque no había manera de saber que aparatos estaban encendidos y cuales no, además de que mi interés era controlar los aparatos no solo desde el propio ordenador donde estaba conectado el módulo, sino también a través de otros dispositivos.
La solución se mostraba por sí sola: solo un programa accedería al módulo y los demás deberían comunicarse con este para lanzarle las peticiones y recibir el estado actual en que se encontraban los aparatos. De ahí salió el programa Luces, el cual era un simple servidor tcp que escuchaba por el puerto 1976 (mi año de nacimiento) y se comunicaba con sus clientes mediante un sencillo protocolo basado en números (al estilo del protocolo simple de transferencia de correo - SMTP). Los códigos que devuelve el servidor son los siguientes:
Por su parte el cliente envia los siguientes comandos (en mayúsculas o en minúsculas):
En primer lugar el orden que se debe seguir es:
Servidor: Mensaje de Saludo.
Cliente: Enviar USER: y el nombre de usuario.
Servidor: Mensaje de Usuario Introducido.
Cliente: Enviar PASS: y la contraseña del usuario.
Servidor: Mensaje de Contraseña Introducida.
En segundo lugar cuando el usuario ya esta validado puede introducir o bién los comandos OPEN, CLOSE, QUIT y BYE; o bién un número de 0 a 15 que actuaría como máscara para encender o apagar los aparatos (si el número es mayor que 15 se usa el módulo de 16).
Haciendo un telnet, lo anterior comentado se vería de la siguiente forma:

Y en la aplicación Luces se vería así:

Si ahora cometemos un error (por ejemplo metemos mal el usuario) el resultado quedaría así:


Como se puede observar, la segunda conexión la he hecho a través de otro ordenador. Gracias a que se usa el protocolo el tcp/ip se puede conectar desde cualquier programa (independientemente del sistema operativo, arquitectura de ordenador, etc).
Por otro lado el sistema se basa en una base de datos para gestionar los usuarios, los eventos y los aparatos:

En mi caso usé una base de datos access, pero como es lógico pensar, se puede usar cualquier tipo de base de datos relacional. Las tablas son sólo 4 y se detallan a continuación:
Manejar aparatos eléctricos desde el PC: domótica (1/5) Manejar aparatos eléctricos desde el PC: domótica (3/5)
La solución se mostraba por sí sola: solo un programa accedería al módulo y los demás deberían comunicarse con este para lanzarle las peticiones y recibir el estado actual en que se encontraban los aparatos. De ahí salió el programa Luces, el cual era un simple servidor tcp que escuchaba por el puerto 1976 (mi año de nacimiento) y se comunicaba con sus clientes mediante un sencillo protocolo basado en números (al estilo del protocolo simple de transferencia de correo - SMTP). Los códigos que devuelve el servidor son los siguientes:
| 100 | Saludo al nuevo cliente conectado |
| 101 | Estado en que se encuentran los aparatos (máscara) |
| 200 | Usuario introducido |
| 201 | Contraseña introducida |
| 202 | Permitir o denegar peticiones, cerrar programa o apagar equipo |
| 300 | Estado no identificado |
| 301 | Comando no reconocido |
| 302 | Fallo en la autentificación |
Por su parte el cliente envia los siguientes comandos (en mayúsculas o en minúsculas):
| USER:<usuario> | Usuario a validar |
| PASS:<contraseña> | Contraseña a validar |
| <Número> | Estado que se quiere aplicar a los aparatos (máscara) |
| OPEN | Permite a los usuarios no administradores manejar los aparatos |
| CLOSE | Deniega a los usuarios no administradores manejar los aparatos |
| QUIT | Cierra la aplicación |
| BYE | Apaga el equipo |
En primer lugar el orden que se debe seguir es:
Servidor: Mensaje de Saludo.
Cliente: Enviar USER: y el nombre de usuario.
Servidor: Mensaje de Usuario Introducido.
Cliente: Enviar PASS: y la contraseña del usuario.
Servidor: Mensaje de Contraseña Introducida.
- Si el usuario introduce una contraseña incorrecta el servidor le mostrará un fallo en la autentificación (302) y cerrará la conexión.
- Si el usuario introduce un comando no reconocido cuando se está validando el servidor le mostrará un comando no reconocido (301) y le cerrará la conexión, en cambio cuando este validado solo le mostrará el estado de los aparatos (101).
- Si el usuario introduce antes el comando PASS que el USER el servidor le mostrará estado no identificado (300) y le cerrará la conexión.
En segundo lugar cuando el usuario ya esta validado puede introducir o bién los comandos OPEN, CLOSE, QUIT y BYE; o bién un número de 0 a 15 que actuaría como máscara para encender o apagar los aparatos (si el número es mayor que 15 se usa el módulo de 16).
Haciendo un telnet, lo anterior comentado se vería de la siguiente forma:

Y en la aplicación Luces se vería así:

Si ahora cometemos un error (por ejemplo metemos mal el usuario) el resultado quedaría así:


Como se puede observar, la segunda conexión la he hecho a través de otro ordenador. Gracias a que se usa el protocolo el tcp/ip se puede conectar desde cualquier programa (independientemente del sistema operativo, arquitectura de ordenador, etc).
Por otro lado el sistema se basa en una base de datos para gestionar los usuarios, los eventos y los aparatos:

En mi caso usé una base de datos access, pero como es lógico pensar, se puede usar cualquier tipo de base de datos relacional. Las tablas son sólo 4 y se detallan a continuación:
| tblUsuarios | Donde se almacenan los usuarios del sistema y sus permisos |
| intID | Autonúmerico (o secuencia) que identifica al usuario inequivocamente |
| strNombre | Nombre del usuario |
| strApellidos | Apellido o apellidos del usuario |
| strLogin | Identificador del usuario para validarse en el sistema |
| strPassword | Contraseña del usuario para validarse en el sistema |
| blnActivo | Bandera que indica si un usuario puede validarse en el sistema o no |
| bytNivel | Nivel del usuario (100 administrador, 50 usuario normal, 0 visitante) |
| bytMascara | Máscara de permiso para aparatos: Si el usuario tiene por ejemplo 10 (1010 en binario) sólo puede utilizar los aparatos 2 y 4, en cambio los aparatos 1 y 3 únicamente puede ver su estado |
| tblAcciones | Donde se almacenan las distintas acciones del usuario |
| bytID | Autonúmerico (o secuencia) que identifica la acción inequivocamente |
| strAccion | Nombre de la acción (Usuario Validado, Usuario Desconectado, Orden y Comando) |
| tblLog | Donde se almacena la actividad que lleva a cabo el usuario |
| intID | Autonúmerico (o secuencia) que identifica la acción del usuario |
| intUsuario | Campo relacionado con el intID de la tabla tblUsuarios |
| bytAccion | Campo relacionado con el bytID de la tabla tblAcciones |
| datFecha | Fecha y hora de la acción |
| strIP | IP de la máquina donde se ordenó la acción |
| strDescripcion | Descripción de la acción |
| tblAparatos | Donde se almacenan los nombres de los aparatos a manejar |
| intID | Autonúmerico (o secuencia) que identifica el aparato inequivocamente |
| strNombre | Nombre del aparato |
Manejar aparatos eléctricos desde el PC: domótica (1/5) Manejar aparatos eléctricos desde el PC: domótica (3/5)
2006/02/12
Manejar aparatos eléctricos desde el PC: domótica (1/5)
Continuando la serie de artículos sobre aparatos que tengo, introduzco el último y más importante del sistema casero de domótica que he creado.

El kit o módulo que aparece en la fotografía pertenece a la familia de módulos a relé de la empresa CEBEK, cuyo código es T-1. Es un módulo que puede manejar hasta 4 relés a través de unos bornes de entrada. Tiene muchas ventajas, como que aisla la señal de entrada del resto del circuito con optoacopladores o como que usa un puente rectificador para la alimentación del circuito. El módulo se alimenta con una tensión de 12 voltios e intensidad de 200 mA (muchos transformadores pequeños de móvil u otros aparatos los proporcionan de sobra).
La idea es que con este circuito se puedan manejar aparatos eléctricos (incluidos electrodomesticos) desde el ordenador. Para ello, por una parte se usan los relés a modo de interruptor de un cable normal (en mi caso uso alargadores para no tener que pelar los de los aparatos eléctricos), por lo que en el circuito que uso podría manejar hasta cuatro aparatos distintos; por otra parte los cuatro bornes de entrada van conectados a cuatro de los ocho cables de datos de un cable paralelo.
Aprovechando que es muy sencillo acceder al puerto paralelo del ordenador y que las señales son de 5 voltios (más que suficiente para activar los optoacopladores) es posible mandar un byte al puerto de datos del paralelo (0x378) para que llegue a los bornes del circuito y posteriormente active los relés. ¿Como funciona la lógica de encender y apagar relés? pues cuando se manda un byte a través del puerto paralelo, los bits que esten a 1 hacen que los correspondientes pines del puerto paralelo se activen a 5 voltios, lo que en el circuito provoca finalmente que se activen los relés asociados. Asi por ejemplo si enviamos un 3, en binario es 0011, activándose los dos primeros relés. Con este sistema se pueden encender lámparas, calefacciones, microondas, lavadoras, persianas eléctricas, sistemas de riego, etc.
En windows 95, 98 y Millenium se puede acceder directamente al puerto paralelo, sin embargo en windows nt, 2000 y xp se necesita crear un driver que se ejecute en el nivel (ring) privilegiado 0, porque en el nivel 3 no se permite hacer directamente. Como tampoco quise perder tiempo en crear mi propio driver, usé un programa que ya hace todo eso de una forma muy sencilla: Port Talk, el cual, una vez instalado, da permiso a una aplicación (proceso) para que acceda a un puerto determinado (o a todos) desde la linea de comandos. Finalmente solo basta usar el método _outp en C para enviar datos al puerto paralelo:
Manejar aparatos eléctricos desde el PC: domótica (2/5)

El kit o módulo que aparece en la fotografía pertenece a la familia de módulos a relé de la empresa CEBEK, cuyo código es T-1. Es un módulo que puede manejar hasta 4 relés a través de unos bornes de entrada. Tiene muchas ventajas, como que aisla la señal de entrada del resto del circuito con optoacopladores o como que usa un puente rectificador para la alimentación del circuito. El módulo se alimenta con una tensión de 12 voltios e intensidad de 200 mA (muchos transformadores pequeños de móvil u otros aparatos los proporcionan de sobra).
La idea es que con este circuito se puedan manejar aparatos eléctricos (incluidos electrodomesticos) desde el ordenador. Para ello, por una parte se usan los relés a modo de interruptor de un cable normal (en mi caso uso alargadores para no tener que pelar los de los aparatos eléctricos), por lo que en el circuito que uso podría manejar hasta cuatro aparatos distintos; por otra parte los cuatro bornes de entrada van conectados a cuatro de los ocho cables de datos de un cable paralelo.
Aprovechando que es muy sencillo acceder al puerto paralelo del ordenador y que las señales son de 5 voltios (más que suficiente para activar los optoacopladores) es posible mandar un byte al puerto de datos del paralelo (0x378) para que llegue a los bornes del circuito y posteriormente active los relés. ¿Como funciona la lógica de encender y apagar relés? pues cuando se manda un byte a través del puerto paralelo, los bits que esten a 1 hacen que los correspondientes pines del puerto paralelo se activen a 5 voltios, lo que en el circuito provoca finalmente que se activen los relés asociados. Asi por ejemplo si enviamos un 3, en binario es 0011, activándose los dos primeros relés. Con este sistema se pueden encender lámparas, calefacciones, microondas, lavadoras, persianas eléctricas, sistemas de riego, etc.
En windows 95, 98 y Millenium se puede acceder directamente al puerto paralelo, sin embargo en windows nt, 2000 y xp se necesita crear un driver que se ejecute en el nivel (ring) privilegiado 0, porque en el nivel 3 no se permite hacer directamente. Como tampoco quise perder tiempo en crear mi propio driver, usé un programa que ya hace todo eso de una forma muy sencilla: Port Talk, el cual, una vez instalado, da permiso a una aplicación (proceso) para que acceda a un puerto determinado (o a todos) desde la linea de comandos. Finalmente solo basta usar el método _outp en C para enviar datos al puerto paralelo:
_outp(0x378,3);
Manejar aparatos eléctricos desde el PC: domótica (2/5)
El arte de programar