Skip to content

Latest commit

 

History

History

07_hub

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 

Hub de dispositivos

Vamos a implementar un hub muy simple que pueda agrupar distintos dispositivos. Para eso vamos a crear una abtracción que nos permita tratarlos de la misma forma.

Un dispositivo tiene que cumplir los siguientes requisitos

  1. Ser un EventEmitter (o heredar de EventEmitter)
  2. Tener una propiedad name (simplemente descriptivo)
  3. Tener una propiedad events indicando los nombres de los eventos que emite (sin contar el evento ready)
  4. Tener un método init para ser llamado durante la inicialización del hub. Una vez que el dispositivo se inicializó correctamente debe emitir el evento ready.

Podemos ver un ejemplo (ya incluído en la lista de dispositivos que maneja el hub) en mock-device.js.

Vemos también que el hub no hace mucho más que inicializar los dispositivos y escuchar los eventos que emiten (por ahora sólo los loguea en la consola, en el próximo ejercicio los enviará a una interfaz web).

Si corremos el hub (podemos hacerlo en nuestra computadora en este momento) deberíamos ver lo siguiente:

$ node hub.js
Device [MockDevice] ready
Hub ready
Device [MockDevice] emitted event [random] { value: 0.8801509307231754 }
Device [MockDevice] emitted event [random] { value: 0.18459032149985433 }
Device [MockDevice] emitted event [random] { value: 0.3199941231869161 }

Sensor de temperatura

Vamos a reimplementar el sensor de temperatura del ejercicio 2 como un dispositivo que el hub pueda manejar.

Diagrama

Sendor de temperatura con HC-06

Código

Implemetar los 4 requisitos que tiene que tener un dispositivo:

  1. Ser un EventEmitter
let device = new EventEmitter();
  1. Tener una propiedad name
device.name = 'Thermometer';
  1. Tener una propiedad events con los eventos que emite
device.events = ['temperature'];
  1. Tener un método init y emitir el evento ready una vez que esté inicializado
device.init = () => {
  ...
  device.emit('ready');
  ...
}
  1. Emitir un evento temperature con la medición de la temperatura (si bien este no es un requisito, el dispositivo no tendría mucho sentido sin esto)
thermometer.on('data', () => {
  let data = { temperature: thermometer.celsius };
  device.emit('temperature', data);
});

Luego agregamos este dispositivo al hub

const thermometer = require('./thermometer.js');

const devices = [mockDevice, thermometer];

Ejecutar

Si ahora corremos el hub (ahora sí tiene que ser en el Raspberry Pi), deberíamos ver los siguiente

$ node hub.js
Device [MockDevice] connected
1453733197916 Connected /dev/rfcomm0  
Hub ready
Device [MockDevice] emitted event [random] { value: 0.747076835250482 }
Device [Thermometer] connected
Device [Thermometer] emitted event [temperature] { temperature: 27.34375 }
Device [MockDevice] emitted event [random] { value: 0.25436389120295644 }
Device [Thermometer] emitted event [temperature] { temperature: 27.34375 }
Device [Thermometer] emitted event [temperature] { temperature: 27.34375 }

Nota: para copiar de forma rápida nuestros cambios al Raspberry Pi podemos hacer scp -r ./ejercicios [email protected]:/home/pi/workshop-domotica (estando ubicados en el raiz del repositorio)