Um dos objetivos da tecnologia é prover Automatização.

Criado em 1995 por Brendan Eich, na NetScape.
Originalmente foi criado para dar vida as páginas web.
Em 2009 nasceu o NodeJS, uma forma de executar JavaScript fora do browser.
Criado por Ryan Dahl, é uma ambiente de execução multi-plataforma, de código aberto para aplicativos JavaScript no lado do servidor.
$ sudo apt-get install nodejs
Instala o node (ambiente de execução) e o npm (instalador de módulos)
Cylon.js é uma framework javascript para robôs, física computacional, e Internet das Coisas.
Plataformas suportadas:
Antes de começar, é necessário instalar a firmata padrão:
Arquivo → Examples → Firmata → Standard FirmataUpload$ mkdir project $ cd project $ npm init $ npm install cylon cylon-firmata --save $ node index.js

var Cylon = require("cylon");
Cylon.robot({
connections: {
arduino: { adaptor: 'firmata', port: '/dev/ttyUSB0' }
},
devices: {
led: { driver: 'led', pin: 13 }
},
work: function(my) {
every((1).second(), function() {
my.led.toggle();
});
}
}).start();
Johnny-Five é uma framework javascript para robôs, Internet das Coisas desenvolvido na Bocoup.
Plataformas suportadas:
Antes de começar, é necessário instalar a firmata padrão:
Arquivo → Examples → Firmata → Standard FirmataUploadhttps://github.com/rwaldron/johnny-five
$ mkdir project $ cd project $ npm init $ npm install johnny-five --save $ node index.js

var five = require("johnny-five"),
board, led;
board = new five.Board();
board.on("ready", function() {
// Create a standard `led` hardware instance
led = new five.Led(13);
// "strobe" the led in 100ms on-off phases
led.strobe(100);
});

Cylon.js e Johnny-Five ainda não dão suporte ao receptor infravermelho!
O que fazer para contornar isso?
(Por enquanto...)
Para nosso exemplo vamos usar um Controle Remote Infravermelho para controlar o Popcorntime, uma aplicativo que permite assistir Filmes, Séries e Animes através de stream de torrent.
Precisamos primeiro capturar os dados enviados pelo controle e decodificá-los.
Após decodificação, é necessário enviar para a porta serial qual o comando para aquele botão.

'use strict';
var api = require('./popcorn/api')
, com = require('serialport');
var serialPort = new com.SerialPort('/dev/ttyUSB0', {
baudrate: 9600,
parser: com.parsers.readline('\r\n')
});
serialPort.on('open',function() {
console.log('Port open');
});
serialPort.on('data', function(data) {
function callback(error, response, body) {
if (!error && response.statusCode === 200) {
api.parseAndSend(data);
} else {
console.log(error);
}
}
api.send('ping', [], callback);
});
if (/^rc4pt:(.*)$/.test(value)) {
/* ... */
this.send('getviewstack', [], function(error, response, data) {
if (!error && response.statusCode === 200) {
/* ... */
switch (currentView) {
case 'main-browser':
self.handleMainBrowser(cmd);
break;
case 'player':
self.handlePlayer(cmd);
break;
/* ... */
}
}
});
}
Api.prototype.handlePlayer = function(cmd) {
switch (cmd) {
case 'play-pause':
this.send('toggleplaying');
break;
case 'func-stop':
this.send('togglefullscreen');
break;
case 'down':
this.send('back');
break;
}
};

Qualquer dúvida entre em contato.