roomba-iot – Rev 1

Subversion Repositories:
Rev:
#!/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)
}