• Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
MagicMirror Forum
  • Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.

Help needed simple API based module

Scheduled Pinned Locked Moved Development
19 Posts 4 Posters 9.5k Views 4 Watching
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 Offline
    washichi
    last edited by Feb 1, 2017, 12:31 PM

    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
    • C Offline
      cowboysdude Module Developer
      last edited by Feb 1, 2017, 1:06 PM

      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 Feb 1, 2017, 1:28 PM Reply Quote 0
      • W Offline
        washichi @cowboysdude
        last edited by Feb 1, 2017, 1:28 PM

        @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
        • Y Offline
          yawns Moderator
          last edited by Feb 1, 2017, 1:32 PM

          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 Feb 1, 2017, 1:37 PM Reply Quote 1
          • W Offline
            washichi @yawns
            last edited by Feb 1, 2017, 1:37 PM

            @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
            • Y Offline
              yawns Moderator
              last edited by Feb 1, 2017, 1:49 PM

              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 Feb 1, 2017, 3:04 PM Reply Quote 0
              • W Offline
                washichi @yawns
                last edited by washichi Feb 1, 2017, 3:11 PM Feb 1, 2017, 3:04 PM

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

                Y 1 Reply Last reply Feb 1, 2017, 3:14 PM Reply Quote 0
                • Y Offline
                  yawns Moderator @washichi
                  last edited by Feb 1, 2017, 3:14 PM

                  @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 Feb 1, 2017, 3:20 PM Reply Quote 0
                  • W Offline
                    washichi @yawns
                    last edited by Feb 1, 2017, 3:20 PM

                    @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
                    • Y Offline
                      yawns Moderator
                      last edited by Feb 1, 2017, 3:31 PM

                      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
                      1 / 2
                      • First post
                        9/19
                        Last post
                      Enjoying MagicMirror? Please consider a donation!
                      MagicMirror created by Michael Teeuw.
                      Forum managed by Sam, technical setup by Karsten.
                      This forum is using NodeBB as its core | Contributors
                      Contact | Privacy Policy