Read the statement by Michael Teeuw here.
Multiple URL Querys to fill JSON
-
I hope I describe it correct and you understand what I mean.
I’m writing a new module which has to display the information from 2 different URL’s.
When I query them seperate than everythink works OK.
But I want to do query from URL-1 to JSON (MHW-P1) and URL-2 to JSON (MHW-WM).Is this possible and how?
This is what I’ve came up with, but it doesn’t work.node_helper.js
// P1 Meter section // getMHW_P1: function(urlP1) { // Make a GET request using the Fetch API for the P1 Meter fetch(urlP1) .then(response_P1 => { if (!response_P1.ok) { console.error('MMM-MyHomeWizard: Network response was not ok'); } return response_P1.json(); }) .then(result_P1 => { // Process the retrieved user data console.log(result_P1); // Remove trailing slashes to display data in Console for testing this.sendSocketNotification('MHWP1_RESULT', result_P1); }) .catch(error => { console.error('Error:', error); }); }, socketNotificationReceived: function(notification, payload_P1) { if (notification === 'GET_MHWP1') { this.getMHW_P1(payload_P1); } }, // Water Meter Section // getMHW_WM: function(urlWM) { // Make a GET request using the Fetch API for the Water Meter fetch(urlWM) .then(response_WM => { if (!response_WM.ok) { console.error('MMM-MyHomeWizard: Network response was not ok'); } return response_WM.json(); }) .then(result_WM => { // Process the retrieved user data console.log(result_WM); // Remove trailing slashes to display data in Console for testing this.sendSocketNotification('MHWWM_RESULT', result_WM); }) .catch(error => { console.error('Error:', error); }); }, socketNotificationReceived: function(notification, payload_WM) { if (notification === 'GET_MHWWM') { this.getMHW_WM(payload_WM); } },MMM-MyModules.js
// <-- P1 Meter Section --> // This processes your data P1 Meter processMHW_P1: function(data_P1) { this.MHW_P1 = data_P1; console.log(JSON.stringify(this.MHW_P1)); // uncomment to see if you're getting data (in dev console) this.loaded = true; }, // this tells module when to update scheduleUpdate: function() { setInterval(() => { this.getMHW_P1(); this.getMHW_WM(); }, this.config.updateInterval); this.getMHW_P1(); this.getMHW_WM(); var self = this; }, // this asks node_helper for data getMHW_P1: function() { this.sendSocketNotification('GET_MHWP1', this.urlP1); }, // this gets data from node_helper socketNotificationReceived: function(notification_P1, payload_P1) { if (notification_P1 === "MHWP1_RESULT") { // this notification doesn't come back on error.. this.processMHW_P1(payload_P1); this.updateDom(this.config.initialLoadDelay); } }, //<-- Water Meter Section --> // This processes your data Water Meter processMHW_WM: function(data_WM) { this.MHW_WM = data_WM; console.log(JSON.stringify(this.MHW_WM)); // uncomment to see if you're getting data (in dev console) this.loaded = true; }, /* // this tells module when to update scheduleUpdate: function() { setInterval(() => { this.getMHW_WM(); }, this.config.updateInterval); this.getMHW_WM(); var self = this; }, */ // this asks node_helper for data getMHW_WM: function() { this.sendSocketNotification('GET_MHWWM', this.urlWM); }, // this gets data from node_helper socketNotificationReceived: function(notification_WM, payload_WM) { if (notification_WM === "MHWWM_RESULT") { // this notification doesn't come back on error.. this.processMHW_WM(payload_WM); this.updateDom(this.config.initialLoadDelay); } }, I hope somebody can help me with this. I'm not a programmer, but I try to do my best ;-) -
@sdetweil Wow, it works!
Just checking, it has to be done in node_helper and the MMM-Module? -
@htilburgs you cant have two socketNotificationReceived() functions
only 1, but it gets both notifications
if notification=== "type1" call this function else if notification=== "type2" call that function -
@sdetweil I’ve changed it into this, but still only result from the WaterMeter and not the P1 meter
socketNotificationReceived: function(notification, payload) { if (notification === "MHWP1_RESULT") { // this notification doesn't come back on error.. this.processMHW_P1(payload); this.updateDom(this.config.initialLoadDelay); } else if (notification === "MHWWM_RESULT") { // this notification doesn't come back on error.. this.processMHW_WM(payload); this.updateDom(this.config.initialLoadDelay); } }, -
@htilburgs I meant in the node_helper… you have 2 there as well
-
@sdetweil Wow, it works!
Just checking, it has to be done in node_helper and the MMM-Module? -
@htilburgs the sendSocketNotification(xyz,foo) ------->socketNotificationReceived(notification, payload)
in both directions…only one received on each side… if there are multiple, then the last one seen is used.
-
@sdetweil Thnx, you helped me a lot!!
-
This is not a direct answer to the question, but just for your reference.
ThefetchAPI can be executed directly in the browser, not just in a Node.js environment. You can call thefetchAPI directly inMMM-MyModule.jswithout needingnode_helper.js.Additionally, since the
fetchAPI works asynchronously, you can manage the responses of two fetch calls as follows:- If you need to use the response that arrives first, use
Promise.race()orPromise.any(). - If you need to wait for both responses to arrive before proceeding, use
Promise.all().
Using these methods can help you manage data synchronization more efficiently.
- If you need to use the response that arrives first, use
-
@MMRIZE quite true, since fetch is now part of electron.
-
@MMRIZE Thanks for your reaction.
-
S sdetweil has marked this topic as solved on
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login