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.
Thefetch
API can be executed directly in the browser, not just in a Node.js environment. You can call thefetch
API directly inMMM-MyModule.js
without needingnode_helper.js
.Additionally, since the
fetch
API 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.
-