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 352.3k 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

      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 Reply Quote 0
      • S Offline
        sdetweil @Ghost2000
        last edited by sdetweil

        @Ghost2000 yes, now execute the

        node config-helper.js  
        

        again

        1 Reply Last reply Reply Quote 0
        • S Offline
          sdetweil
          last edited by

          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

            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 Reply Quote 0
            • S Offline
              sdetweil @Ghost2000
              last edited by sdetweil

              @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

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

                which one is correct?

                S 1 Reply Last reply Reply Quote 0
                • S Offline
                  sdetweil @Ghost2000
                  last edited by

                  @Ghost2000 said in MMM-awesome-alexa:

                  http: // localhost: 3000 /

                  1 Reply Last reply Reply Quote 0
                  • G Offline
                    Ghost2000
                    last edited by

                    This post is deleted!
                    1 Reply Last reply Reply Quote 0
                    • G Offline
                      Ghost2000
                      last edited by

                      This post is deleted!
                      1 Reply Last reply Reply Quote 0
                      • S Offline
                        sdetweil
                        last edited by sdetweil

                        This post is deleted!
                        1 Reply Last reply Reply Quote 0
                        • 1
                        • 2
                        • 14
                        • 15
                        • 16
                        • 17
                        • 18
                        • 24
                        • 25
                        • 16 / 25
                        • First post
                          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