File: http://svn.grimore.org/cool-iot/trunk/main.js -
#!/usr/bin/env nodejs /////////////////////////////////////////////////////////////////////////// // Copyright (C) Wizardry and Steamworks 2018 - License: GNU GPLv3 // // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // // rights of fair usage, the disclaimer and warranty conditions. // /////////////////////////////////////////////////////////////////////////// const Gpio = require('onoff').Gpio const mqtt = require('mqtt') const YAML = require('yamljs'); const winston = require('winston') // Load configuration file. const config = YAML.load('config.yml'); // Generate GPIO pins for configuration. var COOL = {}; for(var i in config.GPIO) { if(!config.GPIO.hasOwnProperty(i)) continue; if(config.GPIO[i] === -1) continue; COOL[i] = new Gpio(config.GPIO[i], 'out') } // Set up logger. winston.add(winston.transports.File, {filename: config.log}) // Initiate connection to MQTT. const client = mqtt.connect(config.mqtt.url, {queueQoSZero: false}) client.on('connect', function () { winston.info('Connected to MQTT server') client.subscribe(config.mqtt.topic) }) client.on('message', function (topic, message) { if(message.length === 0) return; // Remove any retained message. client.publish(topic, "", {retain: true}) message. message = message.toString() winston.info('Received message: ' + message) if(!(message in config.GPIO)) { winston.warn('Request to toggle unknown GPIO: ' + message) return; } var pin = config.GPIO[message] if(pin === -1) { winston.warn('GPIO pin for "' + message + '" is not configured') return; } winston.info('Toggling pin ' + pin + ' for ' + message) COOL[message].write(1, (err) => { if(err) { winston.err('Unable to toggle pin ' + pin + ' error message received is: ' + err.message) return; } setTimeout(function() { winston.info('Toggled pin ' + pin + ' for ' + message) COOL[message].write(0) }, 1000) }) })