/** * 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 = "meb") { 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, 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 }, }); } } } traverse(data, [prefix]); 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) { console.debug('[Publisher] Nessun valore da pubblicare'); return; } console.debug(`📤 Pubblicazione ${values.length} valori SignalK`); try { app.handleMessage("meb", { updates: [{ values }], }); } catch (error) { console.error('[Publisher] Errore pubblicazione:', error.message); } } module.exports = { publish: publishWeatherData };