Help needed simple API based module



  • Hi,
    I just started creating modules, and don’t have any javascript experience.
    I am trying my luck on a really simple API based ISS tracker module.
    but I am doing something wrong.

    here is my code: https://github.com/washichi/MMM-ISS-current-location

    the logs mm-out-0.log &mm-error-0.log don’t give me weird errors.
    and I compiled it with http://liveweave.com/ (can’t find the right plugin for sublime3 ) so I’m doing something wrong in the code.

    I hope someone can help me to see what I did wrong.



  • I’m no programmer [yet] LOL But I will tell you that you also need something like this in there:

    notificationReceived(notification, payload, sender)

    That MagicMirror core has the ability to send notifications to modules. Or even better: the modules have the possibility to send notifications to other modules. When this module is called, it has 3 arguments:

    notification - String - The notification identifier.
    payload - AnyType - The payload of a notification.
    sender - Module - The sender of the notification. If this argument is undefined, the sender of the notififiction is the core system.
    Example:

    notificationReceived: function(notification, payload, sender) {
    if (sender) {
    Log.log(this.name + " received a module notification: " + notification + " from sender: " + sender.name);
    } else {
    Log.log(this.name + " received a system notification: " + notification);
    }
    }
    Note: the system sends two notifications when starting up. These notifications could come in handy!

    ALL_MODULES_STARTED - All modules are started. You can now send notifications to other modules.
    DOM_OBJECTS_CREATED - All dom objects are created. The system is now ready to perform visual changes.
    socketNotificationReceived: function(notification, payload)

    When using a node_helper, the node helper can send your module notifications. When this module is called, it has 2 arguments:

    notification - String - The notification identifier.
    payload - AnyType - The payload of a notification.
    Note 1: When a node helper sends a notification, all modules of that module type receive the same notifications.
    Note 2: The socket connection is established as soon as the module sends its first message using sendSocketNotification.

    Example:

    socketNotificationReceived: function(notification, payload) {
    Log.log(this.name + " received a socket notification: " + notification + " - Payload: " + payload);
    },



  • @cowboysdude
    mhh okay, thank you! I’ll try to implement it, looking to the default weatherforecast module as example.

    from the modules readme I don’t totally understand why I need this, it sounds like optional . and I don’t have notifications. (or are updating modules seen as notification?)


  • Moderator

    Hi, first spotted error:

    Module.register("ISS-current-location",{
    

    This should be

    Module.register("MMM-ISS-current-location",{
    

    Otherwise your module won’t be called.



  • @yawns yeah that solved it, my module is now at least showing :).
    sorry, stupid mistake haha, I though I checked it .
    Thanks for your help


  • Moderator

    okay, next thing is your updateISS function. I modified it for you to get you started:

    	updateISS: function() {
    		var self = this;
    		var url = self.config.apiBase;
    		var opennotifyRequest = new XMLHttpRequest();
    		opennotifyRequest.open("GET", url, true);
    		opennotifyRequest.onreadystatechange = function() {
    		if (this.readyState === 4) {
    			if (this.status === 200) {
    				var resp = JSON.parse(this.response);
    				this.latitude = resp.iss_position.latitude;
    				this.longitude = resp.iss_position.longitude;
    				this.timestamp = resp.timestamp;
    				this.message = resp.message;
    			}
    		}
    			
    			self.updateDom();
    		};
    	opennotifyRequest.send();
    	}
    


  • @yawns thank you!
    the module shows now this.message and refreshes it with the schedule.
    however I am still doing something wrong in my request:

    	updateISS: function() {
    		var url = this.config.apiBase;
    		var self = this;
    		var opennotifyRequest = new XMLHttpRequest();
    		opennotifyRequest.open("GET", url, true);
    		this.message = "in updateISS";
    		opennotifyRequest.onreadystatechange = function() {
    		self.message = "request status: "+ to.String(this.status); // not displayed
    		if (this.readyState === 4) {
    			if (this.status === 200) {
    				var resp = JSON.parse(this.response);
    				self.latitude = resp.iss_position.latitude;
    				self.longitude = resp.iss_position.longitude;
    				self.timestamp = resp.timestamp;
    				self.message = resp.message;
    				self.message = "dit gebeurt niet";
    			}
    		}
    		};
    	opennotifyRequest.send();
    	self.updateDom();
    	}
    

    I can’t set message in that function, for example line 86. I use self/this wrong, or the function isn’t executing. but the code continous because when I set the message before or after that function it gets displayed.


  • Moderator

    @washichi
    hm. Did you try to output latitude and longitude as well in getDom to see if this is working?



  • @yawns No I didn’t, but that should be exactly the same thing.
    If I hardcode the (any) variable in "issRequest.onreadystatechange = function() {"
    then it just doesn’t display, so it looks like it isn’t going in that function.
    but if I hardcode the (any) variable after that function It displays.

    So I can display the variable (message), but the variable doesn’t get filled with the request.


  • Moderator

    Simple way to test if it entering the function:

    Log.error("function entered");

    Press F12 in browser, check for console output and refresh the website. If the function is entered you will see “function entered” in the console.


Log in to reply
 

Looks like your connection to MagicMirror Forum was lost, please wait while we try to reconnect.