Read the statement by Michael Teeuw here.
Config modules from external file (JSON)
-
Hi.
I want to define my modules [] in a separate JSON file and then have config.js read from that file and populate it.
Is it possible? something like this
var config = { address: "0.0.0.0", electronOptions: {}, ipWhitelist: [], language: "pt", modules: loadJSON("configuration.json"), paths: { modules: "modules", vendor: "vendor" }, useHttps: false, httpsPrivateKey: "", httpsCertificate: "" }; function loadJSON(filePath){ try { var fs = require('fs'); var path = require('path'); var filename = path.resolve(__dirname, filePath); var jsonFile = JSON.parse(fs.readFileSync(filename)); return jsonFile; } catch (e) { console.error(e); return []; } }Thank you
-
@telmini the browser side also reads config.js but cannot use file (fs.) operations due to browser security
if u can read files u can read ANY files
-
So, I tried this, as seen on another example in this thread
config.js:
var config = { address: "0.0.0.0", electronOptions: {}, ipWhitelist: [], language: "pt", logLevel: ["LOG", "WARN", "ERROR", "DEBUG"], modules: loadJSON("./modules.json"), paths: { modules: "modules", vendor: "vendor" }, useHttps: false, httpsPrivateKey: "", httpsCertificate: "" }; function loadJSON(filePath){ if (typeof module !== "undefined") { return require(filePath); } else { var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; var xhr = new XMLHttpRequest(); xhr.overrideMimeType("application/json"); xhr.open("GET", filePath, true); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { // needs error handler try/catch at least let fileinfo = null; try { fileinfo = JSON.parse(xhr.responseText); } catch (exception) { // nothing here, but don't die Log.error(" loading json file =" + file + " failed"); } return fileinfo; } }; xhr.send(null); } }modules.json
[{ "module": "currentweather", "position": "top_left", "config": { "location": "Lisboa", "locationID": "2267057", "appid": "314d9c29c18fd11e79034c56e1348f4c", "iconTable": { "01d": "wi-day-sunny", "02d": "wi-day-cloudy", "03d": "wi-cloudy", "04d": "wi-cloudy-windy", "09d": "wi-showers", "10d": "wi-rain", "11d": "wi-thunderstorm", "13d": "wi-snow", "50d": "wi-fog", "01n": "wi-night-clear", "02n": "wi-night-cloudy", "03n": "wi-night-cloudy", "04n": "wi-night-cloudy", "09n": "wi-night-showers", "10n": "wi-night-rain", "11n": "wi-night-thunderstorm", "13n": "wi-night-snow", "50n": "wi-night-alt-cloudy-windy" } } }]And this is the output:
 -
So, it can detect that the json file has the “currentweather” module, but then fails to load it properly.
Any help?
-
@telmini u have a bad path
/js/ /modulesnote modules is off the mm root just like js
/modules/modulename /js/mm_core_filename.js -
@telmini said in Config modules from external file (JSON):
loadJSON(“./modules.json”)
But that bug/crash is inside Magic Mirror code. Or is related to the path defined here “loadJSON(”./modules.json")"?
-
@telmini i do not know, screen is hard to read. got enoent file not found. path is wrong.
-
Sorry, this is the output.
> magicmirror@2.11.0 start /home/pi/MagicMirror > DISPLAY="${DISPLAY:=:0}" ./node_modules/.bin/electron js/electron.js [2021-01-27 16:55:09.858] [LOG] Starting MagicMirror: v2.11.0 [2021-01-27 16:55:09.878] [LOG] Loading config ... [2021-01-27 16:55:09.892] [LOG] Loading module helpers ... [2021-01-27 16:55:09.896] [LOG] Error: ENOENT: no such file or directory, access '/home/pi/MagicMirror/js/../modules/default/currentweather/node_helper.js' at Object.accessSync (fs.js:202:3) at Object.fs.accessSync (electron/js2c/asar.js:491:38) at Object.fs.accessSync (electron/js2c/asar.js:491:38) at loadModule (/home/pi/MagicMirror/js/app.js:124:7) at loadNextModule (/home/pi/MagicMirror/js/app.js:166:5) at loadModules (/home/pi/MagicMirror/js/app.js:177:3) at /home/pi/MagicMirror/js/app.js:223:4 at loadConfig (/home/pi/MagicMirror/js/app.js:72:4) at App.start (/home/pi/MagicMirror/js/app.js:211:3) at Object.<anonymous> (/home/pi/MagicMirror/js/electron.js:115:7) { errno: -2, syscall: 'access', code: 'ENOENT', path: '/home/pi/MagicMirror/js/../modules/default/currentweather/node_helper.js' } [2021-01-27 16:55:09.924] [LOG] No helper found for module: currentweather. [2021-01-27 16:55:09.926] [LOG] All module helpers loaded. [2021-01-27 16:55:10.246] [LOG] Starting server on port 8080 ... [2021-01-27 16:55:10.256] [INFO] You're using a full whitelist configuration to allow for all IPs [2021-01-27 16:55:10.268] [LOG] Server started ... [2021-01-27 16:55:10.268] [LOG] Sockets connected & modules started ... [2021-01-27 16:55:10.428] [LOG] Launching application. ^[$I don’t understand why it’s trying to go to this path
Error: ENOENT: no such file or directory, access’/home/pi/MagicMirror/js/…/modules/default/currentweather/node_helper.js’
-
@telmini because its looking for the (optional) node_helper.js of a module.
this one, currentweather doesnt use one -
@telmini so the returncode is right but its not fatal in mm view.
-
It could probably be that the XmlHttpRequest is async and the page is already loaded when the request has finished executing.
-
Hi, I’m trying something similar. Have you managed to solve your issue using this fuction loadJSON? If not, did you find any solution to update config.js “dinamicaly”?
-
@tatianobusatto others have written js/python code that takes their settings ( file, database, web service) and applied to a model config.js. (all their modules with fake strings for keys, etc)
and call that js/python just before launching mmin installers/mm.sh
-
@sdetweil thanks for the tip. Unfortunately, I couldn’t find a good js/python script example for that. For a while, I ended up creating a simple batch script to append multiple json config files for each module in between the config header and footer. In case you remember a place were I can find a thread for that discussion, please let me know.
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