Read the statement by Michael Teeuw here.
config.js in JSON format
-
@Serge
But when it is pure JSON, it will lose some benefit of using JS programmatic extensible features (e.g: callback function as values, conditional dynamic values on bootup, or any customized routines by user.)
By example, I 'm using conditionaldisabled:to test and debug the modules. It could be done with pure JSON but could be somewhat annoying thing. -
Anyway, you can access other module’s config values with
{module}.configon runtime. And if you need config values before bootup, you can just includeconfig.jsto your individual pre-processer program for reading config values. (Then you can write it also) -
@Sean
I am going to make external app to change all module parameters.
What does I mean based on the “clock” module example:- Сurrent config.js has the following settings for clock module:
modules: [ { module: "clock", position: "top_left" }, ]- I am adding all other clock’s parameters (taken from /modules/default/clock/clock.js) into config.js:
modules: [ { module: "clock", position: "top_left" config: { displayType: "digital", displaySeconds: true, showPeriod: true, showPeriodUpper: false, clockBold: false, showDate: true, showWeek: false, dateFormat: "dddd, LL", analogSize: "200px", analogFace: "simple", analogPlacement: "bottom", analogShowDate: "top", secondsColor: "#888888", timezone: null, }, }, ]- Parameters in config.js overwrites the parameters in clock.js, so it works fine in such way.
- I am going to make some external app (web-interface) to allow user to make changes in config.js (in file) and reload MM in order effect take place.
This should be a similar to “MMM Remote control” module but different in functionality and in its logic - my app should change the file config.js).
I need to consult with community how to make this in correct and simple way? At the moment I have a template based on SB Admin 2 (html bootstrap)
-
I think I understand (and like!) what you are trying to do, but the downside is that you’re going to create one hell of a file. The module configs are in a lot of cases much bigger than what the module creator suggests users to change. The clock you’ve shown is a very good example.
However, it might lead to a very promising function, so I’d be happy to support.
I would very much like to see the web interface to be limited to layers with a drop-down function
First layer: all installed modules.
Click on a module -> open dropdown with all config parameters for this module.
(Somehow) limit the possibilities to change config options to prevent semantic errors. E.g. for boolean parameters, the user should only be able to switch between true and false. String parameters should be converted to strings automatically. Numbers be parsed to number and so on…If you create a web interface that gives the user the possibility to easily change config options AND that prevents semantic errors (e.g. by checking the new input instantly).
…then you’re the hero!!
The more I write about it the more I like it…
Is there somethin on github that I can have a look at already?
-
another mirror runtime uses jsonform, and a schema file provided by
each module (exposing what the module wants configurable, and how), and then generates a web UI for all the info, provides a save function, which updates its config file and then restarts the app.I have created modules using this capability and also extended it on the base to allow module location placement (like mm position ) via dropdown selection.
-
@lavolp3 said in config.js in JSON format:
I think I understand (and like!) what you are trying to do, but the downside is that you’re going to create one hell of a file. The module configs are in a lot of cases much bigger than what the module creator suggests users to change. The clock you’ve shown is a very good example.
All other modules have + - the same number of parameters. config.js looks good and readable.
Changes of module parameters do not affect functionality. They change appearence so if all parameters are inputed correctly (e.g. numbers to numbers, strings to strings) - everything will work fine.I would very much like to see the web interface to be limited to layers with a drop-down function
First layer: all installed modules.
Click on a module -> open dropdown with all config parameters for this module.I have some draft of the interface and it looks similar to those you have described. However, I drop off the idea of dropdowns - due to the huge amount of settings for each module. I have made a left side menu with buttons for each module: e.g. clock, calendar, weather, etc. Some current screenshot is attached.

Screenshot from mobile phone:

Is there somethin on github that I can have a look at already?
Not yet. Its a local development at this stage.
@sdetweil said in config.js in JSON format:
I have created modules using this capability.
do you have your development available somewhere to look over?
-
This post is deleted! -
@Serge remember, this is not MagicMirror…
here is the mirror code
https://github.com/evancohen/smart-mirrorhere is a module (plugin) for smart-mirror
https://github.com/sdetweil/backgroundImagehere is a sample plugin
https://github.com/sdetweil/samplePluginin the base mirror code, YOU have to edit the index.html to add
the appropriate lines to enable your plugin -
@sdetweil said in config.js in JSON format:
@Serge remember, this is not MagicMirror…
I have looked throught all the code. For simplicity I will call “SmartMirror” as SM and MagicMirror as MM further.
- config.schema.json files in SM contain plugins’ parameters and these files have JSON format. Example is a calendar config file smart-mirror/plugins/calendar/config.schema.json
{ "schema": { "calendar": { "type": "object", "title": "Calendar Settings", "properties": { "icals": { "type": "array", "title": "iCal URLs", "items": { "type": "string" } }, "maxResults": { "type": "integer", "title": "Max Number of Events for all iCals", "default": 9- config.js in MagicMirror is not made in JSON format so it is not easy to make changes there as compared to SM’s config.schema.json
var config = { address: "localhost", port: 8080, ipWhitelist: [], language: "en", timeFormat: 24, units: "metric", modules: [ { module: "newsfeed", position: "bottom_bar", config: { feeds: [ { title: "New York Times", url: "http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml" } ], showSourceTitle: true, showPublishDate: true, broadcastNewsFeeds: true, broadcastNewsUpdates: true }, }, ], };Maybe I think wrong, please correct me if so.
-
@Serge maybe javascript-stringify npm module would help.
Load config.js
Json stringify
Apply schemas
Capture json on save
Convert to jsthis little script seems to work
var jjs=require('javascript-stringify') var cfg=require('../MagicMirror/config/config.js') var js=require('json-stringify') var js_config = JSON.stringify(cfg.config) console.log(cfg) jjs_config=jjs.stringify(cfg,null,'\t') console.log("var config="+jjs_config) -
JSON converting may lose some js specific features like callback function, dynamic values by condition, etc. I doubt the benefit of strict json format.
And the user would still make mistakes to write strict JSON format.
I can’t agree JSON is the only or better way to make user-friendly configurable web UI. -
@Sean do you have some examples of these kinds of data elements? I’d be interested to pass them thru this simple converter to see the fidelity
-
- callback function as value;
Many of my modules use the callback functions to make user command or user-customizable dynamic features instead to modify the source itself. (eg. filter, sort, transform, …)
Here is the the sameple of MMM-NotificationTrigger;
{ module: "MMM-NotificationTrigger", config: { triggers:[ { trigger: "SOME_NOTIFICATION", fires: [ { fire:"SHOW_ALERT", payload: (payload) => { return { type:"notification", title:"Notification comming", message: payload.someOption } }, } ] }, ] } },- dynamic values;
I manage several different configurations in oneconfig.jsfor my convenience. like this;
(simplified concept)
const mode = "testA" const someValue = { "testA" : "testA", "testB" : "testB", "debug" : "debug", "release" : "release", ... } ... { module: "MMM-SOMEMODULE", config: { someField: ((mode == "testA") ? true : false), someField2: someValue[mode], ... } },The real usage is more complex but you can catch my approach.
- callback function as value;
-
@Sean thanks… the 1st, with callbacks was preserved… the 2nd, with the algorithmic values, produced the results of the algorithm… the node runtime does the algorithmic replacement on load of the file… the converter would not know. (unless it processed the text)
{ module: 'MMM-SOMEMODULE', config: { someField: true, someField2: 'testA' } } -
@lavolp3
@sdetweil
@Sean
here is a short video of what is done at the moment.
https://youtu.be/6w6Uovy9hbESo what I have:
-
Webserver which is based on the asws webserver. Updated version for MagicMirror is here. Changes made to cmd/asws.go file only.
Download git -
build docker container from it (go to asws directory and run "
docker build -t asws_new ." -
Clone to
home/pi/wwwsample web-interface for MagicMirror clock module settings. It is bases on free SB Admin 2 bootstrap template.
Git includesjs/settings.jswhich is necessary for make everything works. Git is here: https://github.com/sergge1/www -
Run with a folloing command a docker container build in point 2 above:
sudo docker run -d --restart unless-stopped -e DEBUG=true -p 80:80 -v $(pwd)/www:/www asws_new
Sample config.js from video is located at www/config.js
-
-
I found this the other day, maybe it will help your UI
https://github.com/Toreke/MMM-Dynamic-Modules
allows live dynamically positioning module content
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
