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
- Ser un
EventEmitter
(o heredar deEventEmitter
) - Tener una propiedad
name
(simplemente descriptivo) - Tener una propiedad
events
indicando los nombres de los eventos que emite (sin contar el eventoready
) - 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 eventoready
.
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 }
Vamos a reimplementar el sensor de temperatura del ejercicio 2 como un dispositivo que el hub pueda manejar.
Implemetar los 4 requisitos que tiene que tener un dispositivo:
- Ser un EventEmitter
let device = new EventEmitter();
- Tener una propiedad
name
device.name = 'Thermometer';
- Tener una propiedad
events
con los eventos que emite
device.events = ['temperature'];
- Tener un método
init
y emitir el eventoready
una vez que esté inicializado
device.init = () => {
...
device.emit('ready');
...
}
- 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];
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)