The Module Description file is a XML file that all VSCP devices must have and which describe the device. It can either be stored on the device itself or more common linked by the device and stored on some external server storage. Software that wants to configure a device can fetch this file to get the knowledge to do so. Typically a user interface use this file to guide a user through device configuration. A good thing is that one software can handle and configure any device.
A sample MDF file is here an here.
Read a mdf file from a device, parse it and display the module name. A device can consist of several modules, there will always be one and result.vscp.module[0] will always refer to the first. Most devices contains only one module. You can get the number of modules with result.vscp.module.length
Below are some Javascript examples on how to get information from the MDF-file.
Display the module name
const axios = require('axios');
const xml2js = require('xml2js');
let parser = new xml2js.Parser();
axios.get('https://www.eurosource.se/ntc10KA_3.xml')
.then((response) => {
parser.parseString(response.data,
(err, result) => {
console.dir(result.vscp.module[0].name);
});
})
.catch((err) => {
console.log(err);
});
Similar to above sample get a link to the manual for a device
console.log(result.vscp.module[0].manual[0].$.path);
List all registers with
console.dir(result.vscp.module[0].registers[0].reg);
Iterate through all registers an display there names
axios.get('https://www.eurosource.se/ntc10KA_3.xml')
.then((response) => {
parser.parseString(response.data, (err, result) => {
for (let reg of result.vscp.module[0].registers[0].reg) {
console.log(reg.name[0]._);
}
});
})
.catch((err) => {
console.log(err);
});
List register descriptions with
console.log(reg.description[0]._);
You get the language code for a register name or a register description with
console.log(reg.name[0].$.lang);
List abstractions with
axios.get('https://www.eurosource.se/ntc10KA_3.xml')
.then((response) => {
parser.parseString(response.data, (err, result) => {
for (let reg of result.vscp.module[0].registers[0].reg) {
console.dir(result.vscp.module[0].abstractions[0].abstraction);
}
});
})
.catch((err) => {
console.log(err);
});
List number of events the module can generate and the events
console.dir('# events: ' + result.vscp.module[0].events[0].event.length);
console.dir(result.vscp.module[0].events[0].event);
If you want an url to a picture of the module
console.log(result.vscp.module[0].picture[0].$.path);
If you want the manual
console.log(result.vscp.module[0].manual[0].$.path);
or a firmware image
console.log(result.vscp.module[0].firmware[0].$.path);
The number of firmware images available
axios.get('http://www.eurosource.se/paris_010.xml')
.then((response) => {
parser.parseString(response.data, (err, result) => {
console.log(result.vscp.module[0].firmware.length);
});
})
.catch((err) => {
console.log(err);
});
The release date for a specific firmware
console.log(result.vscp.module[0].firmware[3].$.date);
The way this works should be obvious by now. Enjoy!