Hi all,
I have a bit of programming experience (mostly C and python) but I have never worked with javascript. I am trying to create a module to communicate with the Uber and Lyft APIs. Initially I was trying to do something like this for Lyft , but I kept getting an 'Access-Control-Allow-Origin'
error.
After some research I found this post which said that a work-around is done in node_helper.js and referenced this module.
So, I have tried my hand at an Uber module done in that fashion, but no luck. I have put a bunch of Log.log() statements in my code but I am not seeing anything in the console to help me debug. The mirror shows the statement “Checking Uber status…”
Here’s the module code:
/* global Module */
/* Magic Mirror
* Module: Uber
*
* based on MagicMirror work by Michael Teeuw http://michaelteeuw.nl
* MIT Licensed.
*/
Module.register("MMM-uber",{
// Default module config.
defaults: {
lat: null,
lng: null,
product_id: null,
client_id: null,
uberServerToken: null,
updateInterval: 5 * 60 * 1000, // every 5 minutes
animationSpeed: 1000,
},
// Define required scripts.
getScripts: function() {
return ["moment.js", "https://code.jquery.com/jquery-2.2.3.min.js"];
},
// Define required styles.
getStyles: function() {
return ["MMM-uber.css"];
},
start: function() {
Log.info("Starting module: " + this.name);
// Set locale.
moment.locale(config.language);
// variables that will be loaded from service
this.uberTime = null;
this.uberSurge = null;
this.loaded = false;
this.sendSocketNotification('CONFIG', this.config);
},
// unload the results from uber services
processUber: function(FLAG, result) {
var self = this;
Log.log("ProcessUber");
// go through the time data to find the uberX product
if (FLAG === "TIME"){
Log.log("Time");
Log.log(result);
for (var i = 0, count = result.times.length; i < count ; i++) {
var rtime = result.times[i];
if(rtime.display_name === "uberX"){
// convert estimated seconds to minutes
this.uberTime = rtime.estimate / 60;
break;
}
}
}
// go through the price data to find the uberX product
else if (FLAG === "PRICE"){
Log.log("Price");
Log.log(result);
for( var i=0, count = result.prices.length; i< count; i++) {
var rprice = result.prices[i];
if(rprice.display_name === "uberX"){
// grab the surge pricing
this.uberSurge = rprice.surge_multiplier;
break;
}
}
}
},
// Override dom generator.
getDom: function() {
var wrapper = document.createElement("div");
var uber = document.createElement("div");
uber.className = "uberButton";
var uberIcon = document.createElement("img");
uberIcon.className = "badge";
uberIcon.src = "modules/MMM-uber/UBER_API_Badges_1x_22px.png";
var uberText = document.createElement("span");
if(this.loaded) {
var myText = "UberX in "+ this.uberTime +" min ";
Log.log("ubersurge: " + this.uberSurge);
// only show the surge pricing if it is above 1.0
if(typeof this.uberSurge !== "undefined" && this.uberSurge > 1.0){
myText += " - " + this.uberSurge + "X surge pricing";
}
uberText.innerHTML = myText;
} else {
// Loading message
uberText.innerHTML = "Checking Uber status ...";
}
uber.appendChild(uberIcon);
uber.appendChild(uberText);
wrapper.appendChild(uber);
return wrapper;
},
socketNotificationReceived: function(notification, payload) {
Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload);
if (notification === "TIME") {
this.processUber("TIME", payload);
this.updateDom(this.config.animationSpeed)
}
else if (notification === "PRICE") {
this.processUber("PRICE", payload);
this.loaded = true;
this.updateDom(this.config.animationSpeed);
}
}
});
And the code in node_helper.js
'use strict';
/* Magic Mirror
* Module: MMM-lyft
*
* By Kyle Kelly
* MIT Licensed.
*/
const NodeHelper = require('node_helper');
var request = require('request');
var moment = require('moment');
module.exports = NodeHelper.create({
start: function() {
var self = this;
console.log("Starting node helper for: " + this.name);
this.started = false;
this.config = null;
},
getData: function() {
var self = this;
request({
url: "https://api.uber.com/v1/estimates/time",
method: 'GET',
headers: {
"Authorization": "Token " + self.config.uberServerToken
},
data: {
start_latitude: self.config.lat,
start_longitude: self.config.lng,
product_id: self.product_id
},
}, function (error, response, body) {
if (!error && response.statusCode == 200) {
self.sendSocketNotification("TIME", body);
}
});
request({
url: "https://api.uber.com/v1/estimates/price",
method: 'GET',
headers: {
"Authorization": "Token " + self.config.uberServerToken
},
data: {
start_latitude: self.config.lat,
start_longitude: self.config.lng,
end_latitude: self.config.lat,
end_longitude: self.config.lng
},
}, function (error, response, body) {
if (!error && response.statusCode == 200) {
self.sendSocketNotification("PRICE", body);
}
});
setTimeout(function() { self.getData(); }, this.config.updateInterval);
},
socketNotificationReceived: function(notification, payload) {
var self = this;
if (notification === 'CONFIG' && self.started == false) {
self.config = payload;
self.getData();
self.started = true;
}
}
});
Any help would be appreciated. Thanks!