This works for me:
In mos.yml
:
config_schema:
- ["debug.level", 2]
- ["app", "o", {}]
- ["app.user", "o", {}]
- ["app.user.data1", "s", "user.data1", {}]
- ["app.user.data2", "s", "user.data2", {}]
- ["app.data1", "s", "data1", {}]
- ["app.data2", "s", "data2", {}]
fs/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<title>Config schema test</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<div style="margin:auto">
<h1 style="text-align:center;" id="room">Config schema test</h1>
<div class="row form">
<div class="col c4">
<div class="form-control">
<label for="ssid">WiFi Network:</label>
<input type="text" id="ssid" placeholder="Type WiFi network...">
</div>
<div class="form-control">
<label for="pass">WiFi Password:</label>
<input type="text" id="pass" placeholder="Type WiFi password...">
</div>
<div>
<label for="appuserdata1">app.user.data1:</label>
<input type="text" id="appuserdata1" placeholder="Type app.user.data1">
</div>
<div>
<label for="appuserdata2">app.user.data2:</label>
<input type="text" id="appuserdata2" placeholder="Type app.user.data2">
</div>
<div>
<label for="appdata1">app.data1:</label>
<input type="text" id="appdata1" placeholder="Type app.data1">
</div>
<div>
<label for="appdata2">app.data2:</label>
<input type="text" id="appdata2" placeholder="Type app.data2">
</div>
<div class="form-control"><button href="#" class="btn btn-sm btn-c" id="save">Save settings</button></div>
</div>
<div class="col c8">
<!-- <h3>Result:</h3> -->
<div id="result"></div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
</body>
<script type="text/javascript">
$(window).on("load", function () {
console.log('Window loaded. Calling /rpc/Config.Get ...');
$.ajax({url: '/rpc/Config.Get', success: function (data) {
console.log('Result after Config.Get in window onload: ' + JSON.stringify(data.app));
$('#ssid').val(data.wifi.sta.ssid);
$('#pass').val(data.wifi.sta.pass);
$('#appuserdata1').val(data.app.user.data1);
$('#appuserdata2').val(data.app.user.data2);
$('#appdata1').val(data.app.data1);
$('#appdata2').val(data.app.data2);
}});
});
$('#save').on('click', function () {
console.log('Calling /rpc/Config.Set ...');
$.ajax({
url: '/rpc/Config.Set',
type: 'POST',
data: JSON.stringify({
config: {
wifi: {sta: {ssid: $('#ssid').val(), pass: $('#pass').val()}},
app: {
user: {
data1: $('#appuserdata1').val(),
data2: $('#appuserdata2').val()
},
data1: $('#appdata1').val(),
data2: $('#appdata2').val()
}
}
}),
success: function (data) {
$.ajax({url: '/rpc/Config.Get', success: function (data) {
console.log('Config.Get result after Config.Set: ' + JSON.stringify(data.app));
}});
console.log('Success. Rebooting ...');
$.ajax({
url: '/rpc/Config.Save',
type: 'POST',
data: JSON.stringify({"reboot": true})
});
}
});
}
);
</script>
</html>
First run after mos wifi…
mos --port ws://IP/rpc config-get app
{
"data1": "data1",
"data2": "data2",
"user": {
"data1": "user.data1",
"data2": "user.data2"
}
}
Log in the browser
Result after Config.Get in window onload: {"user":{"data1":"user.data1","data2":"user.data2"},"data1":"data1","data2":"data2"}
Set the parameters in the browser:
app.user.data1:user.data1-1
app.user.data2:user.data2-1
app.data1:data1-1
app.data2:data2-1
Click Save settings
(the device will reboot).
Log in the browser after Config.Get
:
Config.Get result after Config.Set: {"user":{"data1":"user.data1-1","data2":"user.data2-1"},"data1":"data1-1","data2":"data2-1"}
mos --port ws://IP/rpc config-get app
{
"data1": "data1-1",
"data2": "data2-1",
"user": {
"data1": "user.data1-1",
"data2": "user.data2-1"
}
}
Hope it helps.