roomba-iot – Rev 1
?pathlinks?
#!/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')
var serialport = require("serialport")
var SerialPort = serialport.SerialPort
var SerialPort = require('serialport');
var port = new SerialPort('/dev/serial0', {
baudRate: 115200
});
// Load configuration file.
const config = YAML.load('config.yml')
// Set up logger.
winston.add(winston.transports.File, {filename: config.log})
// Initiate connection to MQTT.
const client = mqtt.connect(config.mqtt.url, {queueQoSZero: false})
// Set up GPIO wake pin.
const wakeGPIO = new Gpio(config.wake, 'out')
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.toString()
winston.debug('Received message: ' + message)
if(!(message in config.ROOMBA)) {
winston.warn('Unknown Roomba command: ' + message)
return;
}
winston.info('Executing Roomba command: ' + message)
// Wake up Roomba.
RoombaWake(wakeGPIO)
// Execute Roomba command.
RoombaExecute(message)
})
/*
* Sequence:
* 1. Set DD to HIGH
* 2. Wait 100ms
* 3. Set DD to LOW
* 4. Wait 500ms
* 5. Set DD to HIGH
*/
function RoombaWake(gpio) {
gpio.write(1, err => {
if(err) {
winston.error('Could not wake Roomba!')
return;
}
setTimeout(function() {
gpio.write(0, function(err) {
if(err) {
winston.error('Could not wake Roomba!')
return;
}
setTimeout(function() {
gpio.write(1, function(err) {
if(err) {
winston.error('Could not wake Roomba!')
return;
}
})
}, 500)
})
}, 100)
})
}
function RoombaExecute(message) {
setTimeout(function () {
port.write(new Buffer(config.ROOMBA['start']));
setTimeout(function () {
port.write(new Buffer(config.ROOMBA['safe']));
setTimeout(function () {
port.write(new Buffer(config.ROOMBA[message]));
}, 500)
}, 30)
}, 30)
}