Read the statement by Michael Teeuw here.
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?)
-
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 -
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.
-
@washichi
hm. Did you try to output latitude and longitude as well ingetDom
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.
-
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.