alexatts – Rev 2
?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')
const picoSpeaker = require('pico-speaker')
// Load configuration file.
const config = YAML.load('config.yml')
// Define configuration for pico TTS.
var picoConfig = {
AUDIO_DEVICE: config.card,
LANGUAGE: config.language
};
// Initialize with config
picoSpeaker.init(picoConfig)
// Generate GPIO pins for configuration.
var ATTS = {};
for(var i in config.GPIO) {
if(!config.GPIO.hasOwnProperty(i))
continue;
if(config.GPIO[i] === -1)
continue;
ATTS[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.toString()
winston.info('Received message: ' + message)
ATTS["ptt"].write(1, (err) => {
if(err) {
winston.err('Unable to press push-to-talk button: ' + err.message)
return;
}
// Send the message.
picoSpeaker.speak(config.alexa + ", Simon says, " + message).then(function() {
winston.info('Message ' + message + ' sent to Alexa.')
ATTS["ptt"].write(0)
}.bind(this));
})
})