How to query third party JSON API from AWS Lambda function
Asked Answered
G

1

10

I am working on a "Skill" for the new Amazon ECHO. The skill will allow a user to ask Alexa for information on the status and performance of an Enphase solar system. Alexa will respond with results extracted from the JSON based Enphase API. For example, the user could ask,

 "Alexa.  Ask Enphase how much solar energy I have produced in the last week."
 ALEXA <"Your array has produced 152kWh in the last week.">

Problem is it has been years since I've programmed in JavaScript and this is my first time using AWS Lambda. I have not been very successful finding any information on how to embed a JSON query to a third party server within AWS Lambda function. Here is a relevant section of code in my Lambda function:

 /**
  * Gets power from Enphase API and prepares speach
  */
 function GetPowerFromEnphase(intent, session, callback) {
      var Power = 0;
      var repromptText = null;
      var sessionAttributes = {};
      var shouldEndSession = false;
      var speechOutput = "";

      //////////////////////////////////////////////////////////////////////
      // Need code here for sending JSON query to Enphase server to get power
      // Request:
      // https://api.enphaseenergy.com/api/v2/systems/67/summary
      // key=5e01e16f7134519e70e02c80ef61b692&user_id=4d7a45774e6a41320a
      // Response:
      // HTTP/1.1 200 OK
      // Content-Type: application/json; charset=utf-8
      // Status: 200
      // {"system_id":67,"modules":35,"size_w":6270,"current_power":271,
      // "energy_today":30030,"energy_lifetime":59847036,
      // "summary_date":"2015-03 04","source":"microinverters",
      // "status":"normal","operational_at":1201362300,
      // "last_report_at":1425517225}
      //////////////////////////////////////////////////////////////////////

      speechOutput = "Your array is producing " + Power + " kW, goodbye";
      shouldEndSession = true;

      // Setting repromptText to null signifies that we do not want to reprompt the user.
      // If the user does not respond or says something that is not understood, the session
      // will end.
      callback(sessionAttributes,
         buildSpeechletResponse(intent.name, speechOutput, repromptText,
         shouldEndSession));
 }

Some guidance would be much appreciated. Even if someone could point me in the right direction. Thanks!

Gomel answered 1/12, 2015 at 23:2 Comment(0)
C
8

Request is a very popular library for handling http requests in node.js. Here is an example of a POST using your data:

var request = require('request');

request({
  url: 'https://api.enphaseenergy.com/api/v2/systems/67/summary',
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    key: '5e01e16f7134519e70e02c80ef61b692',
    user_id: '4d7a45774e6a41320a'
  })
}, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log('BODY: ', body);
    var jsonResponse = JSON.parse(body); // turn response into JSON

    // do stuff with the response and pass it to the callback...

    callback(sessionAttributes, 
        buildSpeechletResponse(intent.name, speechOutput, repromptText,
        shouldEndSession));
  }
});

I don't have an example of ECHO/Alexa but here is an example of Lambda calling out to get weather data to send it to Slack

Coulometer answered 2/12, 2015 at 5:20 Comment(2)
How do I install Request for use within the node.js Lambda code?Gomel
You have to include it(node_modules) along with your index.js in the zip file that you upload. You can't do it if you are just editing the code in the aws console. This post kind of talks about it: aws.amazon.com/blogs/compute/nodejs-packages-in-lambda or you can use this starter which has some built in commands that will zip it up for you: github.com/ryanray/aws-lambda-starterCoulometer

© 2022 - 2024 — McMap. All rights reserved.