MagicMirror² v2.5.0 is available! For more information about this release, check out this topic.

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.