A través de la programación, hacemos que las mÔquinas imiten un comportamiento complejo siguiendo secuencias de instrucciones simples.
por JesĆŗs DarĆo
A través de la programación, hacemos que las mÔquinas imiten un comportamiento complejo siguiendo secuencias de instrucciones simples. Utilizar lenguajes de programación textual como Asambly, C, Python y JavaScript, es una de las formas principales de hacerlo. Los diseñadores de estos lenguajes de programación han pasado horas y horas tratando de hacer que la experiencia de los programas de escritura sean lo mÔs fÔcil posible a través de una sintaxis expresiva, fuertes construcciones de programación y cadenas de herramientas poderosas. Sin embargo, todos estos lenguajes de programación comparten un rasgo común: el código fuente textual.
Escribir programas en texto funciona y en la mayorĆa de los casos funciona bien. Sin embargo, la capacidad de expresar programas visualmente es a menudo deseable. Ser capaz de diseƱar el flujo de información a travĆ©s de diversos componentes de un sistema mĆ”s grande es normalmente todo lo que se necesita. Las herramientas visuales de programación tambiĆ©n son indulgentes con cualquier persona que sea nueva en la programación y que les es difĆcil manejar diversos conceptos como las variables, indicadores, seƱales, alcances, y asĆ sucesivamente.

Node-RED es una herramienta de programación visual. Muestra visualmente las relaciones y funciones, y permite al usuario programar sin tener que escribir una lengua. Node-RED es un editor de flujo basado en el navegador donde se puede agregar o eliminar nodos y conectarlos entre sà con el fin de hacer que se comuniquen entre ellos.
En Node-RED, cada nodo es uno de los siguientes dos tipos: un nodo de inyección o un nodo de función . Los nodos de inyección producen un mensaje sin necesidad de entrada y lanzan el mensaje al siguiente nodo conectado a Ć©ste. Los nodos de función, por el contrario, tienen una entrada y realizan algĆŗn trabajo en Ć©l. Con una gran cantidad de estos nodos para elegir, Node-Red hace que el conectar los dispositivos de hardware, APIs y servicios en lĆnea sea mĆ”s fĆ”cil que nunca.
Primeros Pasos con el Node-Red
Node-Red se basa en Node.js. Para instalar el Node-Red, necesita tener tanto Node.js instalado como NPM. Con NPM, es muy fƔcil instalar Node-Red: npm install -g node-red
El editor de flujo de Node-Red es una aplicación basada en navegadores web. Para poder utilizarlo, ejecuta Node-Red:
npm install -g node-red
El editor de flujo de Node-RED es una aplicación para navegador web. Para usarlo, ejecute Node-RED:
node-red
& hellip y vaya a http: // localhost: 1880.
”Hola Mundo!
ĀæQuĆ© tutorial de programación para principiantes estĆ” completo sin aprender a decir āHola, mundoā? Vamos a empezar por probar exactamente eso:
- Arrastra y suelta un nudo de inyección en el editor de flujo. DespuĆ©s, haz doble clic y fija la carga Ćŗtil como cadena y escribe āHola mundoā.
- Arrastra y suelta un nudo de depuración, de la misma manera como lo hiciste con la inyección.
- ConƩctalos.
- Haz clic en el botón āDeployā en la esquina derecha.
- Haga clic en el botón azul justo a la izquierda del nodo de inyección.
IntƩntalo. VerƔs algo como esto:

Sólo JavaScript
Con Node-Red, no te limites con nodos simples y funcionalidades. Como Node-Red estĆ” construido sobre Node.js, todo estĆ” impulsado por JavaScript . Los nodos son, de hecho, módulos Node.js. Se pueden encontrar en http://flows.nodered.org/ , luego para agregarlos a tu panel de la izquierda se pueden simplemente āinstalar con NPMā. De hecho, puedes desarrollar tu propio flujo y subirlos al repositorio de flujo. Las aplicaciones pueden ser tan complejas como desees ya que puedes escribir JavaScript en los nodos de función dentro del editor de código que proporciona Node-Red.
Ya que la plataforma se basa en Node.js, ésta se aprovecha del mismo modelo orientado a eventos y sin bloqueos. Asà que una aplicación construida en Node-Red puede ejecutarse en hardware de bajo costo como el Raspberry Pi, asà como en la nube.
Ahora Nos Vamos a Metro en las Grandes Ligas: Es hora de Automatizar el Hogar
Para demostrar cómo Node-Red se ajusta en el Ômbito de Internet de las Cosas, vamos a construir una aplicación para cambiar el color de una bombilla inteligente. No todo el mundo puede tener el mismo sistema de iluminación inteligente a su disposición, pero no hay nada de qué preocuparse, ya que se puede encontrar el módulo Node-Red apropiado desde el repositorio oficial de flujo. Sin embargo, para hacer las cosas aún mÔs fÔciles vamos por algo mÔs inteligente.
DĆ©jmae presentarte a Netbeast. Es una plataforma de código abierto para el desarrollo de aplicaciones para los aparatos y dispositivos de Internet de las cosas sin tener que preocuparse por los detalles como los protocolos inalĆ”mbricos, compatibilidad de marca, o tener que saber cómo tratar con cada API especĆfica que existe. Ā”Nos permite utilizar los dispositivos virtuales que actĆŗan como los de verdad! AsĆ que incluso si no tienes una bombilla inteligente, tienes una virtual disponible.
Podemos instalar el paquete de NPM de Netbeast para Node-Red a nivel mundial asĆ:
npm install -g node-red-contrib-netbeast
El nodo netbeast-red representarÔ el panel de control Netbeast, lo que traducirÔ sus primitivas API para todos los dispositivos inteligentes que tienes en casa. ”Afortunadamente, también estÔ disponible como un módulo!
Iniciar Netbeast:
npm install -g netbeast-cli
netbeast start
Esto harÔ que el panel esté disponible en el puerto 8000 y SSL en 8443. A continuación, abra el navegador a http://localhost:8000 y navegue a Explore. Ahà podemos encontrar muchas aplicaciones y complementos. Busca las marcas de tus bombillas inteligentes (Philips Hue, LIFX, Wemo) o si no tienes una, intenta descargar el complemento de la bombilla. ”Comprueba que los plugins del panel contienen uno de estos!

La insignia amarilla indica que los complementos se estÔn ejecutando, pero no pueden encontrar ningún dispositivo. Haz clic en el complemento de la bombilla para crear una bombilla virtual. Cualquier otro dispositivo que se descubra debe aparecer en la red.
Con todo en su lugar, volvamos al trabajo. Haremos un flujo simple:
- Arrastra y suelta un nudo de inyección.
- Arrastra y suelta el nudo Netbeast.
- Arrastra y suelta un nudo de depuración.
- Conecta todo como se muestra a continuación:

Ahora vamos a enviar una petición HTTP al panel de control. Al usar la API Netbeast se tendrÔ que enviar a través del nodo de inyección un JSON que contiene los valores que queremos que se activen en nuestra bombilla.

Ā”Presiona el botón para inyectar el color y la energĆa a todas tus bombillas inteligentes!

Cada tema representa un tipo diferente de dispositivo. AsĆ que hay temas no solo para las luces, sino tambiĆ©n para la mĆŗsica, la calefacción y el vĆdeo; asĆ como sensores para la humedad, la presencia, la temperatura, y la lista continĆŗa. Puedes encontrar en tu documentación una lista de temas y su estructura recomendada para ser convertida a todo tipo de dispositivos. Este motor de la IO es novato, pero potente. Un código abierto que permite a los desarrolladores reutilizar la información para crear escenarios realmente conectados, siendo de este modo inteligente.
Ahora adentrƩmonos mƔs
A continuación, vamos a crear un segundo flujo usando otro complemento, un detector de ruido ambiental para utilizarlo como un iniciador para cambiar el color de la bombilla como un semĆ”foro de ruido. En este tutorial vamos a utilizar uno virtual, asĆ que no hay necesidad de comprar un nuevo hardware. Vamos a empezar a hacer clic en el botón āmĆ”sā en el editor de Node-Red.
Ve de nuevo al Panel http://localhost:8000/explore a la sección Explorar y busca Volume-Plugin. Se trata de una aplicación web muy rudimentaria que se aprovecha getUserMedia()dentro del navegador para capturar la información multimedia desde una simple aplicación HTML. Por lo tanto, es probable que sólo funcione en los navegadores modernos.
Haz clic en Ć©l para abrir, al igual que con la bombilla virtual. En Ć©l se solicita permiso para grabar desde el micrófono. A continuación, enviarĆ” los mensajes al intermediario MQTT de Netbeast, que serĆ”n compartidos a travĆ©s de todo el panel de control, y asĆ podremos suscribirnos. Para lograr esto sólo necesitaremos arrastrar y soltar un nodo de netbeast-trigger en el editor node red. A continuación, vamos a insertar una función entre el trigger y el nodo Netbeast, para decidir cuĆ”ndo estĆ” demasiado alto y cuando no. AdemĆ”s, deberĆamos utilizar algunos nodos de depuración para comprobar si todo estĆ” bien. El esquema ahora se verĆ” algo como esto:

Ahora, vamos a introducir algĆŗn código en el nodo de función tooLoud. SĆ, sĆ© que prometĆ que podrĆas programar sin necesidad de codificar, Ā”pero ya he demostrado que puedes! Y se puede tratar de combinar los diferentes elementos disponibles u otros nodos del registro para llevar a cabo lo siguiente.
var volume = msg.payload.volume
node.log(volume)
if (volume < 50) {
return { topic: 'lights', payload: { power: 1, color: '#00CC00'}}
} else if (volume < 75) {
return { topic: 'lights', payload: { power: 1, color: '#CCCC00'}}
} else {
return { topic: 'lights', payload: { power: 1, color: '#FF0000'}}
}
Este fragmento de código bastante simple estĆ” regresando una de las tres cargas Ćŗtiles para el siguiente nodo con un código de color especĆfico, dependiendo del nivel de volumen reportado por el nodo anterior.
Ā”Ahora estamos listos para continuar! Vamos a presionar el botón Deploy de nuevo y armemos un griterĆo. Ā”Veamos cómo cambia la bombilla de un color a otro de inmediato!
Ya que el micrófono y el navegador web que estĆ”s utilizando podrĆan ser diferentes, no dudes en ajustar los valores de la función y umbrales, y tambiĆ©n juega con los valores de color para ver cómo cambian tus bombillas.
Crea tus propios complementos

Esta bombilla en CSS puro se inspiró en éste cssdeck .
Como habrÔs notado, la bombilla virtual anterior es muy rudimentaria, por lo que es posible que desees modificarla. O mejor aún, puedes crear tus propios controladores para un hogar inteligente. Asà que vamos a pasar por el proceso de crear un plugin virtual para Netbeast, lo que te permitirÔ crear tus propios controles para dispositivos inteligentes.
Puedes utilizar el paquete netbeast-clipara generar como por arte de magia algunos códigos. Realizando la ejecución de netbeast create myplugin --plugintendrĆamos un proyecto bĆ”sico como el siguiente:
myplugin
āāā README.md
āāā index.js
āāā package.json
āāā test.js
Interfaz
Ahora, vamos a empezar a mimetizar la bombilla con un frontend. Los controladores de dispositivos por lo general no van a tener uno, asĆ que el comando de andamio no incluye una carpeta pĆŗblica todavĆa. Vamos a crear un directorio publicdentro del proyecto y colocamos allĆ los siguientes archivos HTML, CSS y JS.
Ćndice.html
<head>
<title>Netbeast Bulb Plugin</title>
<link rel="stylesheet" href="bulb.css" media="screen" charset="utf-8">
</head>
<body>
<div class="top-decoration"></div>
<div id="plugin front-end">
</div>
<div class="bulb-container small">
<div class="bulb light">
<div id="bulb">
<div class="bulb top"></div>
<div class="bulb middle-1"></div>
<div class="bulb middle-2"></div>
<div class="bulb middle-3"></div>
<div class="bulb bottom"></div>
</div>
<div id="base">
<div class="screw-top"></div>
<div class="screw a"></div>
<div class="screw b"></div>
<div class="screw a"></div>
<div class="screw b"></div>
<div class="screw a"></div>
<div class="screw b"></div>
<div class="screw c"></div>
<div class="screw d"></div>
</div>
</div>
</div>
<div class="code-container">
<pre><i class="txt-red">beast</i>(<i class="txt-green">'lights'</i>).<i class="txt-blue">set</i>({
<i class="txt-green">color</i>: <i class="txt-green">"<input id="color" type="text" class="color" name="color" value="00fea5">"</i>,
<i class="txt-green">power</i>: <i class="txt-green">"<input id="power" type="text" class="power" name="power" value="on">"</i>
})</pre>
<button id="run-btn">
RUN
</button>
</div><!-- wrapper -->
<!-- declares bulb features and methods -->
<script type="text/javascript" src="bulb.js"></script>
<!-- real time comms library -->
<script type="text/javascript" src="socketio.js"></script>
<!-- simulates hardware communication -->
<script type="text/javascript" src="hw-api.js"></script>
</body>
bombilla.css
section {
float: left;
padding: 20px 50px 20px 50px;
}
.bulb-light {
border: 0;
background: transparent;
margin: 0 auto !important;
padding: 0 !important;
display: block;
z-index: 1;
}
#bulb { opacity: 1; z-index: 3; display: block;}
.bulb.top {
border: 0;
width: 300px;
height: 300px;
margin: 0 auto;
padding: 0;
border-radius: 999px;
background: #E7E7E7;
}
.bulb.middle-1 {
margin: -75px auto 0 auto;
width: 190px;
border-left: 35px solid transparent;
border-right: 35px solid transparent;
border-top: 55px solid #E7E7E7;
}
.bulb.middle-2 {
margin: -22px auto 0 auto;
width: 178px;
border-left: 19px solid transparent;
border-right: 19px solid transparent;
border-top: 50px solid #E7E7E7;
}
.bulb.middle-3 {
margin: -20px auto 0 auto;
width: 182px;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
border-top: 30px solid #E7E7E7;
}
.bulb.bottom {
width: 184px;
height: 65px;
margin: -8px auto 0 auto;
padding: 0;
border-radius: 0 0 999px 999px;
background: #E7E7E7;
}
#base { position:relative; z-index: 2; }
.screw {
transform: rotate(-3deg);
-ms-transform: rotate(-3deg);
-webkit-transform: rotate(-3deg);
padding: 0;
}
.screw-top {
margin: -18px auto -4px auto;
padding: 0;
width: 132px;
height: 0;
border-left: 15px solid transparent;
border-right: 15px solid transparent;
border-top: 21px solid #D3D3D3;
border-radius: 999px;
}
.screw.a {
background: #DDD;
width: 150px;
height: 15px;
border-radius: 999px;
margin: -1px auto 0px;
}
.screw.b {
background: #D9D9D9;
width: 135px;
height: 15px;
margin: -1px auto 0px;
}
.screw.c {
margin: -1px auto 0px;
width: 78px;
height: 0;
border-left: 30px solid transparent;
border-right: 30px solid transparent;
border-top: 20px solid #DDD;
border-radius: 8px;
}
.screw.d {
margin: 0 auto;
width: 15px;
height: 0;
border-left: 30px solid transparent;
border-right: 30px solid transparent;
border-top: 15px solid #444;
}
.on #light {
-moz-opacity: 1;
-khtml-opacity: 1;
opacity: 1;
}
.bulb.top, .bulb.bottom {
transition: all 0.5s ease-in-out;
}
.bulb.middle-1, .bulb.middle-2, .bulb.middle-3 {
transition: all 0.5s ease-in-out;
}
Con estos archivos HTML y CSS, ya deberĆa poder ver una forma de bombilla en tu navegador. Ā”Abre el archivo HTML para ver en vivo! ĀæEstĆ” funcionando? Bien, ahora vamos a darle algunas funciones.
bulb.js
Este archivo imitarƔ el comportamiento de una bombilla con un simple clic de encendido. Al hacer clic para apagarla, establecerƔs un par de funciones que serƔn utilizadas un poco despuƩs para cambiar su color a travƩs de Netbeast.
var color = document.getElementById('color')
var power = document.getElementById('power')
var bulb = document.getElementById('bulb')
var button = document.getElementById('run-btn')
var light = document.getElementById('light')
button.onclick = function toggleBulbState () {
changeBulbParams({ color: color.value, power: power.value })
}
function setBulbParams (params) {
if (params.power === 'off') {
params = { color: 'E7E7E7' }
}
console.log('set params', params)
var bulb_parts = ['.bulb.middle-1', '.bulb.middle-2', '.bulb.middle-3']
document.querySelector('.bulb.top').style.boxShadow = '0px 0px 98px #' + params.color
document.querySelector('.bulb.top').style.backgroundColor = params.color
document.querySelector('.bulb.bottom').style.backgroundColor = params.color
bulb_parts.forEach(function (className) {
document.querySelector(className).style.borderTopColor = params.color
})
}
function changeBulbParams (params) {
console.log('change params', params)
/* Overwrite html fields if necessary */
color.value = params.color || color.value
power.value = params.power || power.value
setBulbParams({color: color.value, power: power.value})
}
Luego, todo comenzar a tener sentido: los campos y el botón de ejecución, ”ahora podrÔs comenzar a probar los diferentes colores de tu nueva bombilla virtual! Sin embargo, la razón por la que vinimos hasta aquà es para hacer otro dispositivo de nuestro ecosistema de Internet de las Cosas.
hw-api.js
El Ćŗltimo de front-end JS realizado por nosotros mismos, simula una conexión inalĆ”mbrica con el servidor, como lo harĆa un WiFi o una bombilla Bluetooth con su mando a distancia, tales como un telĆ©fono, un servidor o un hub. Ā”Es la interfaz que el complemento de código utilizarĆ” para controlarlo!
var socket = io.connect()
socket.on('connect', function () { console.log('ws:// bulb is online') })
socket.on('disconnect', function () { console.log('ws:// connection with bulb lost') })
socket.on('set', function (params) {
changeBulbParams(params) // uses functions from bulb.js!
})
socket.on('get', function () {
const params = { power: power.value, color: color.value }
socket.emit('params', params)
})
Por último, necesitamos que la biblioteca WebSocket esté incluida en nuestro HTML para que la interfaz esté lista. Puedes copiar el código fuente de https://raw.githubusercontent.com/netbeast/bulb-plugin/master/public/socketio.js y pegarlo en un archivo llamado socketio.js . Desde un terminal con curlo wget, lo puedes hacer asà de simple:
curl https://raw.githubusercontent.com/netbeast/bulb-plugin/master/public/socketio.js > public/socketio.js
TendrĆamos ahora una estructura de archivos que se ve asĆ:
myplugin
āāā README.md
āāā index.js
āāā package.json
āāā public
ā āāā bulb.css
ā āāā bulb.js
ā āāā hw-api.js
ā āāā index.html
ā āāā socketio.js
āāā test.js
Backend
Ahora vamos a implementar la interfaz con el dispositivo y registrarlo en el motor Netbeast. Primero escucharƔ los websockets para detectar si alguna bombilla se ha instalado en la red, y luego harƔ una POSTa la API del panel de control para que los nuevos recursos estƩn disponibles.
Por eso, vamos a echar un vistazo a los archivos que generamos antes:
paquete.json
Este archivo contiene todas las dependencias y la información necesaria para ejecutar su aplicación. Netbeast utiliza el habitual package.json también para recuperar cierta información, como el nombre o el tipo. ”Es importante especificar que este paquete es un complemento!
{
"name": "myplugin",
"version": "0.0.0",
"description": "Netbeast plugin for... <your description>",
"main": "index.js",
"netbeast": {
"bootOnLoad": true,
"type": "plugin"
},
"dependencies": {
"bluebird": "^3.3.5",
"body-parser": "^1.15.0",
"express": "^4.13.4",
"minimist": "^1.2.0",
"mocha": "^2.3.2",
"morgan": "^1.6.1",
"netbeast": "^1.0.6",
"socket.io": "^1.4.5",
"superagent": "^1.8.3"
},
"devDependencies": {},
"scripts": {
"test": "node test.js",
"start": "node index.js"
},
"repository": {
"type": "git",
"url": "GITHUB_REPOSITORY"
},
"keywords": [
"iot",
"netbeast",
"plugin"
],
"author": "YOUR_EMAIL",
"license": "GPL 3",
"bugs": {
"url": "ISSUES_CHANNEL"
},
"homepage": "HOMEPAGE"
}
index.js
Ā”Ćste es el código que se trae desde el panel de control de Netbeast para lanzar el plugin! Este tendrĆ” que aceptar el puerto a travĆ©s de argumentos de lĆnea de comando para saber dónde aceptar solicitudes entrantes. Se lanzarĆ” como si escribiĆ©ramos node myplugin.js --port <a free port number>. Ā”Recuerda tomar en cuenta el hashbang al principio! #!/usr/bin/env node.
#!/usr/bin/env node
var io = require('socket.io')()
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
// Netbeast apps need to accept the port to be launched by parameters
var argv = require('minimist')(process.argv.slice(2))
app.use(express.static('public')) // will serve our app in an HTTP server
app.use(bodyParser.json()) // will parse JSON API calls
app.use('/api', require('./plugin')(io))
var server = app.listen(argv.port || 31416, function () {
console.log('Bulb plugin listening at http://%s:%s', server.address().address,
server.address().port)
})
// we need websockets to push updates to browser view
io.listen(server)
Como se puede ver que nos faltaba un archivo por iniciar, el que realmente implementa los controladores socket.io . ”Nada cómoda!
plugin.js
var express = require('express')
var netbeast = require('netbeast')
var router = express.Router()
var bulbParams // auxiliar variable, nasty way to transmit changes, but works
module.exports = function (io) {
io = io
// Create resource that works on lights topic and listens on /api route
netbeast('lights').create({ app: 'myplugin', hook: '/api' })
io.on('connection', function () {
console.log('ws:// bulb has connected to plugin')
})
io.on('disconnection', function () {
console.log('ws:// bulb has disconnected from plugin')
})
io.on('connect_failure', function (err) { console.trace(err) })
router.post('/', function (req, res) {
io.emit('set', {
power: req.body.power,
color: req.body.color,
})
res.status(200).json(req.body)
})
router.get('/', function (req, res) {
io.emit('get')
var timerReference = setTimeout(function () {
if (bulbParams) {
res.json(bulbParams)
} else {
res.status(200).json({ error: 'No bulb available' })
}
}, 3000)
})
return router
}
Inicia tu Aplicación
Ahora es el momento de probar la aplicación. Puedes empaquetarlo todo en un formato tar.gzy luego subir la aplicación a tu panel de control en la sección de arrastrar y soltar http://localhost:8000/install.
beast package # Compresses your app when ran in myplugin dir
Ā”VoilĆ”! Ahora puedes ir a tus complementos y probarlo. Ve a la sección de red (http://localhost:8000/devices) para ver su funcionamiento y cambiar su color a partir de ahĆ.

Si algo sale mal o piensas que podrĆas haber olvidado un detalle, trata de ejecutar localmente con el nodo node index.js, y tal vez serĆ” mĆ”s fĆ”cil de depurar que dentro del registro netbeast start.
Publicar su trabajo
Si deseas que la aplicación aparezca en el panel de control de la sección Explore de Netbeast, debes crear un repositorio en GitHub con la aplicación o plug-in de Netbeast, ambos incluidos en la descripción y README.md .
Para encontrar las aplicaciones que hacemos, utiliza la API de bĆŗsqueda de GitHub. Vemos los mismos resultados que aparecen cuando se realiza una solicitud GET a: https://api.github.com/search/repositories?q=netbeast+language:javascript
”SabrÔs que se mostrarÔ tu aplicación, si parece haber!
¿Qué sigue?
Ambos proyectos son de código abierto y realmente han involucrado a las comunidades. Si deseas comenzar a crear tus propios flujos o nodos al Node-Red, echa un vistazo a su documentación oficial . Sigue los pasos descritos allà y podrÔs publicar tu propio nodo o flujo en poco tiempo.
Por otro lado, si quieres entrar en el interior de Netbeast, puedes seguir su documentación tambiĆ©n o echar un vistazo al repositorio del panel. Al usar la API Netbeast, no tienes que centrarte en los dispositivos individuales, marcas o tecnologĆas, asĆ que dale una oportunidad. Puedes aprender mĆ”s sobre esto en NetBeast.co y unirte a su canal Slack para discutir Node-RED, IoT o Node.js.
Si deseas instalar esto en una Raspberry Pi, Beagle Bone o servidor antiguo, lo convertirĆas en un Smart Hub fĆ”cil de hackear, Ā”sin código! Hay instaladores ya hechos para ellos en ambos sitios.
Feliz hackeo.