• Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
MagicMirror Forum
  • Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.

MMM-awesome-alexa

Scheduled Pinned Locked Moved Utilities
241 Posts 43 Posters 323.1k Views 47 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G Offline
    Ghost2000 @sdetweil
    last edited by Ghost2000 Oct 9, 2020, 9:43 PM Oct 9, 2020, 9:42 PM

    const chalk = require("chalk");
    const clear = require("clear");
    const figlet = require("figlet");
    const inquirer = require("inquirer");
    const request = require("request-promise");
    const CLI = require("clui");
    
    const spinner = new CLI.Spinner("Getting response from Amazon...");
    
    const questions = [
        {
            name: "clientId",
            type: "input",
            message: "Enter your Client ID from Alexa Voice Service (AVS):",
            validate: value => {
                if (value.length) {
                    return true;
                } else {
                    return "Please enter your Client ID.";
                }
            },
        },
        {
            name: "clientSecret",
            type: "input",
            message: "Enter your Client Secret from Alexa Voice Service (AVS):",
            validate: function(value) {
                if (value.length) {
                    return true;
                } else {
                    return "Please enter your Client Secret.";
                }
            },
        },
        {
            name: "productId",
            type: "input",
            message: "Enter your Product ID from Alexa Voice Service (AVS):",
            validate: function(value) {
                if (value.length) {
                    return true;
                } else {
                    return "Please enter your Product ID.";
                }
            },
        },
        {
            name: "redirectUri",
            type: "input",
            message: "Enter your Redirect URI (allowed return URL) from Alexa Voice Service (AVS):",
            validate: function(value) {
                const pattern = new RegExp(
                    "^(https?:\\/\\/)?" + // protocol
                    "((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|" + // domain name
                    "((\\d{1,3}\\.){3}\\d{1,3}))" + // OR ip (v4) address
                    "(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*" + // port and path
                    "(\\?[;&a-z\\d%_.~+=-]*)?" + // query string
                        "(\\#[-a-z\\d_]*)?$",
                    "i", // fragment locator
                );
    
                if (!!pattern.test(value)) {
                    return true;
                } else {
                    return true;
                }
            },
        },
    ];
    
    const authCodeQuestion = [
        {
            name: "authCode",
            type: "input",
            message: "Enter your Authorization code (from previous step):",
            validate: value => {
                if (value.length) {
                    return true;
                } else {
                    return "Please enter your Authorization Code.";
                }
            },
        },
    ];
    
    const continueQuestion = [
        {
            name: "continue",
            type: "confirm",
            message: "Do you wish to continue to generate the MagicMirror config?",
            default: true,
        },
    ];
    
    const configQuestions = [
        {
            name: "wakeWord",
            type: "list",
            message: "What do you want your Wake Word to be? (The phrase used to activate this module)",
            choices: ["Alexa", "Smart Mirror", "Snowboy"],
        },
        {
            name: "liteMode",
            type: "confirm",
            message: "Do you want to use lite mode?",
            default: false,
        },
        {
            name: "useVisualization",
            type: "confirm",
            message: "Do you want to use visulization?",
            default: true,
        },
    ];
    
    const generateQuery = params =>
        Object.keys(params)
            .map(key => key + "=" + params[key])
            .join("&");
    
    clear();
    
    console.log(chalk.yellow(figlet.textSync("Awesome Alexa", { horizontalLayout: "full" })));
    
    console.log(chalk.underline("Welcome to the Config Helper tool!"));
    console.log("This tool will help you get the Refresh Token needed to run MMM-awesome-alexa.");
    console.log(
        "It will optionally generate your config for you, if you wish. If not, you can still create it manually after.",
    );
    console.log("Go to https://developer.amazon.com/alexa/console/avs/products to get the details.\n");
    
    const run = async () => {
        const output = await inquirer.prompt(questions);
    
        const scopeData = {
            "alexa:all": {
                productID: output.productId,
                productInstanceAttributes: {
                    deviceSerialNumber: 123, // Can be anything
                },
            },
        };
    
        const queryParams = generateQuery({
            client_id: output.clientId,
            scope: "alexa:all",
            scope_data: JSON.stringify(scopeData),
            response_type: "code",
            redirect_uri: output.redirectUri,
        });
    
        console.log(
            chalk.blue("Hooray! Link is generated. Part 1 is done. Please go on the link below.\n"),
        );
        console.log(
            chalk.yellow("Please be aware that at the end,"),
            chalk.bgRed("THERE WILL BE AN ERROR!"),
            chalk.green("This is normal.\n"),
        );
    
        console.log(`https://www.amazon.com/ap/oa?${queryParams}`);
    
        console.log("\n^^^ Copy and paste the above in your Browser ^^^, follow the instructions.");
        console.log(
            "The authorization code you want is in the address bar in the final screen: https://imgur.com/a/6DbYlKA",
        );
    
        const authOutput = await inquirer.prompt(authCodeQuestion);
    
        spinner.start();
    
        const amazonTokenReponse = await request.post("https://api.amazon.com/auth/o2/token", {
            form: {
                grant_type: "authorization_code",
                code: authOutput.authCode,
                client_id: output.clientId,
                client_secret: output.clientSecret,
                redirect_uri: output.redirectUri,
            },
            json: true,
        });
    
        spinner.stop();
        console.log(
            chalk.bgGreen(
                "\nComplete! Your refresh token should be in the Amazon response below. If not raise an issue:\n",
            ),
        );
        console.dir(amazonTokenReponse, { colors: true });
    
        const continueOutput = await inquirer.prompt(continueQuestion);
    
        if (!continueOutput.continue) {
            process.exit();
        }
    
        const configOutput = await inquirer.prompt(configQuestions);
    
        console.log(chalk.green("\nCongrats! Here is the full config:\n"));
        console.dir(
            {
                module: "MMM-awesome-alexa",
                position: "bottom_bar",
                config: {
                    wakeWord: configOutput.wakeWord,
                    clientId: output.clientId,
                    clientSecret: output.clientSecret,
                    deviceId: output.productId,
                    refreshToken: amazonTokenReponse.refresh_token,
                    lite: configOutput.liteMode,
                    isSpeechVisualizationEnabled: configOutput.useVisualization,
                },
            },
            { colors: true },
        );
    };
    
    run();
    
    
    S 1 Reply Last reply Oct 9, 2020, 9:43 PM Reply Quote 0
    • S Offline
      sdetweil @Ghost2000
      last edited by sdetweil Oct 9, 2020, 10:06 PM Oct 9, 2020, 9:43 PM

      @Ghost2000 yes, now execute the

      node config-helper.js  
      

      again

      1 Reply Last reply Reply Quote 0
      • S Offline
        sdetweil
        last edited by Oct 9, 2020, 9:45 PM

        Sie haben einen Fehler bei der Suche nach einer gültigen URL-Zeichenfolge. Wir werden den Test überspringen

        1 Reply Last reply Reply Quote 0
        • G Offline
          Ghost2000
          last edited by Ghost2000 Oct 9, 2020, 9:45 PM Oct 9, 2020, 9:45 PM

          pi@MagicMirror:~/MagicMirror/modules/MMM-awesome-alexa $ node config_helper.js
          internal/modules/cjs/loader.js:638
              throw err;
              ^
          
          Error: Cannot find module '/home/pi/MagicMirror/modules/MMM-awesome-alexa/config_helper.js'
              at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
              at Function.Module._load (internal/modules/cjs/loader.js:562:25)
              at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
              at startup (internal/bootstrap/node.js:283:19)
              at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
          pi@MagicMirror:~/MagicMirror/modules/MMM-awesome-alexa $
          
          
          S 1 Reply Last reply Oct 9, 2020, 9:46 PM Reply Quote 0
          • S Offline
            sdetweil @Ghost2000
            last edited by sdetweil Oct 9, 2020, 9:47 PM Oct 9, 2020, 9:46 PM

            @Ghost2000 sorry, config-helper.js

            dash not underscore

            you executed the command many times before, you should have known to fix my typo

            1 Reply Last reply Reply Quote 0
            • G Offline
              Ghost2000
              last edited by Oct 9, 2020, 9:48 PM

              http: // localhost: 3000 / oder http: // localhost: 3000 / authresponse

              which one is correct?

              S 1 Reply Last reply Oct 9, 2020, 9:48 PM Reply Quote 0
              • S Offline
                sdetweil @Ghost2000
                last edited by Oct 9, 2020, 9:48 PM

                @Ghost2000 said in MMM-awesome-alexa:

                http: // localhost: 3000 /

                1 Reply Last reply Reply Quote 0
                • G Offline
                  Ghost2000
                  last edited by Oct 9, 2020, 9:51 PM

                  This post is deleted!
                  1 Reply Last reply Reply Quote 0
                  • G Offline
                    Ghost2000
                    last edited by Oct 9, 2020, 9:53 PM

                    This post is deleted!
                    1 Reply Last reply Reply Quote 0
                    • S Offline
                      sdetweil
                      last edited by sdetweil Oct 9, 2020, 10:02 PM Oct 9, 2020, 9:56 PM

                      This post is deleted!
                      1 Reply Last reply Reply Quote 0
                      • 1
                      • 2
                      • 16
                      • 17
                      • 18
                      • 19
                      • 20
                      • 24
                      • 25
                      • 18 / 25
                      18 / 25
                      • First post
                        174/241
                        Last post
                      Enjoying MagicMirror? Please consider a donation!
                      MagicMirror created by Michael Teeuw.
                      Forum managed by Sam, technical setup by Karsten.
                      This forum is using NodeBB as its core | Contributors
                      Contact | Privacy Policy