MagicMirror² v2.8.0 is available! For more information about this release, check out this topic.

How to load config data from file?



  • Is it possible to load a config value from a file (yml, json or other)?

    modules: [
    	{
    		module: "clock",
    		position: "top_left",	// This can be any of the regions.
    		config: {
                               displayType: #LOAD_VALUE_FROM_FILE#
    		}
    	}
    ]
    


  • @acimail01 sure. U have to write the code, but the fs module (already loaded) provides read functions


  • Module Developer

    @sdetweil Attention, the fs module is (obviously) not available in the server only mode.



  • Here’s my attempt that does not work:
    this line causes the error: var myfs = require(‘fs’)
    what am I doing wrong ?

    pi@raspberrypi:~/MagicMirror $ cat my.json
    {
       "clockmodule": {
                    "showDate": true,
                    "displayType": "both"
            }
    }
    
    
    

    and config.js

    var myfs = require('fs')
    //var myconfig = JSON.parse(myfs.readFileSync('./my.json', 'utf8'))
    
    var config = {
       ....
    
    	modules: [
    		{
    			module: "clock",
    			position: "top_left",
    			//showDate: myconfig.module_clock["showDate"],
    			//displayType: myconfig.module_clock["displayType"],
    		},
    

    0_1563735026845_error.png


  • Module Developer

    @acimail01 This is because the require function is not available in the browser. Are you using the server only mode?



  • no, it is the kiosk mode. but I also tried the serveronly mode.


  • Module Developer

    @acimail01 Start MagicMirror in debug mode with npm start dev, it will open the developer tools. Then look for any red lines in the console.

    If you can’t find the developer tools you can open it with CTRL-SHIFT-I



  • Error message is:
    Uncaught ReferenceError: require is not defined at config.js:15


  • Module Developer

    @acimail01 Ok, I just got an idea.

    Place your json somewhere in the config folder and place the following function in your config.js.

    function loadJSON(filePath) {
        if (typeof module !== "undefined") {
            return require(filePath);
        } else {
            try {
                return JSON.parse($.ajax({
                    type: "GET",
                    url: filePath,
                    async: false
                }).responseText);
            } catch (e) {
                console.error(e);
                return {};
            }
        }
    }
    

    And call it like:

    modules: [
    	loadJSON("config/clock.json")
    ]
    

    This function will synchronisly load the given JSON, serializes it and returns it. This code is completly untestet, but it should work anyway:)

    Edit: I just updated my answer to also work with node.js



  • thank you but wont work also.
    Error:
    ReferenceError: $ is not defined at loadJSON

    I want to have all API keys and passwords from a common location and not scattered in the config.js, Hence the thought with a (yml) file.
    maybe this can be solved via an array variable in the config.js or similar.