Navigation

    MagicMirror Forum

    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unsolved
    • Solved
    • MagicMirror² Repository
    • Documentation
    • Donate
    • Discord

    Help needed simple API based module

    Development
    4
    19
    6279
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • W
      washichi last edited by

      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.

      1 Reply Last reply Reply Quote 0
      • cowboysdude
        cowboysdude Project Sponsor Module Developer last edited by

        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);
        },

        W 1 Reply Last reply Reply Quote 0
        • W
          washichi @cowboysdude last edited by

          @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?)

          1 Reply Last reply Reply Quote 0
          • yawns
            yawns Moderator last edited by

            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.

            W 1 Reply Last reply Reply Quote 0
            • W
              washichi @yawns last edited by

              @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

              1 Reply Last reply Reply Quote 0
              • yawns
                yawns Moderator last edited by

                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();
                	}
                
                W 1 Reply Last reply Reply Quote 0
                • W
                  washichi @yawns last edited by washichi

                  @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.

                  yawns 1 Reply Last reply Reply Quote 0
                  • yawns
                    yawns Moderator @washichi last edited by

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

                    W 1 Reply Last reply Reply Quote 0
                    • W
                      washichi @yawns last edited by

                      @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.

                      1 Reply Last reply Reply Quote 0
                      • yawns
                        yawns Moderator last edited by

                        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.

                        1 Reply Last reply Reply Quote 0
                        • 1
                        • 2
                        • 1 / 2
                        • First post
                          Last post
                        Enjoying MagicMirror? Please consider a donation!
                        MagicMirror created by Michael Teeuw.
                        Forum managed by Paul-Vincent Roll and Rodrigo Ramírez Norambuena.
                        This forum is using NodeBB as its core | Contributors
                        Contact | Privacy Policy