72 lines
1.9 KiB
JavaScript
72 lines
1.9 KiB
JavaScript
/**
|
|
* publisher.js - Pubblica dati su SignalK
|
|
*/
|
|
|
|
/**
|
|
* Genera valori SignalK da un oggetto dati
|
|
* @param {Object} data - Dati da convertire
|
|
* @param {string} prefix - Prefisso per i path SignalK
|
|
* @returns {Array} Array di valori SignalK
|
|
*/
|
|
function generateValues(data, prefix = "") {
|
|
if (!data || typeof data !== 'object') {
|
|
return [];
|
|
}
|
|
|
|
const values = [];
|
|
|
|
function traverse(obj, pathParts) {
|
|
for (const key in obj) {
|
|
if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;
|
|
|
|
const val = obj[key];
|
|
if (val === undefined || val === null) continue;
|
|
|
|
const newPath = pathParts.length > 0 ? [...pathParts, key] : [key];
|
|
|
|
if (typeof val === "object" && !Array.isArray(val)) {
|
|
traverse(val, newPath);
|
|
} else if (!Array.isArray(val)) {
|
|
// Ignora array, pubblica solo valori primitivi
|
|
values.push({
|
|
path: newPath.join("."),
|
|
value: val,
|
|
meta: { displayName: key },
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
const initialPath = prefix ? [prefix] : [];
|
|
traverse(data, initialPath);
|
|
return values;
|
|
}
|
|
|
|
/**
|
|
* Pubblica dati meteo su SignalK
|
|
* @param {Object} app - Istanza app SignalK
|
|
* @param {Object} weatherData - Dati meteo da pubblicare
|
|
* @param {Object} settings - Impostazioni plugin
|
|
*/
|
|
function publishWeatherData(app, weatherData, settings) {
|
|
if (!app || !weatherData) {
|
|
console.warn('[Publisher] App o dati non disponibili');
|
|
return;
|
|
}
|
|
|
|
const values = generateValues(weatherData);
|
|
|
|
if (values.length === 0) {
|
|
return;
|
|
}
|
|
|
|
try {
|
|
app.handleMessage("meb", {
|
|
updates: [{ values }],
|
|
});
|
|
} catch (error) {
|
|
console.error('[Publisher] Errore pubblicazione:', error.message);
|
|
}
|
|
}
|
|
|
|
module.exports = { publish: publishWeatherData }; |