Migra dal codice salvato in locale al codice condiviso

This commit is contained in:
Giuseppe Raffa
2026-01-06 17:36:58 +01:00
parent 8a88c31c75
commit ff1566d36b
30 changed files with 8985 additions and 0 deletions

View File

@@ -0,0 +1,32 @@
const apiToken = "08a9a9828f8186c661d0293741fd01971bc2d2f4"
function aisStream() {
const socket = new WebSocket('wss://stream.aisstream.io/v0/stream');
socket.onopen = function (_) {
let subscriptionMessage = {
Apikey: apiToken,
BoundingBox: [[15.0, 37.5], [16.5, 38.8]]
}
socket.send(JSON.stringify(subscriptionMessage));
console.log("✅ WebSocket Connected");
};
socket.onmessage = function (event) {
event.data.text().then(text => {
try {
const json = JSON.parse(text);
console.log(json);
} catch (e) {
console.error("Invalid JSON:", text);
}
});
};
socket.onerror = (error) => console.error('WebSocket Error:', error);
socket.onclose = () => console.log('WebSocket Connection Closed');
}
module.exports = { aisStream };

View File

@@ -0,0 +1,212 @@
const axios = require('axios');
const TIMEOUT = 10000;
const HEADERS = { Accept: "application/json, text/plain;q=0.9,*/*;q=0.8" };
// Parametri API
const FORECAST_PARAMS = {
current: [
'temperature_2m',
'wind_speed_10m',
'wind_direction_10m',
'wind_gusts_10m',
'precipitation',
'rain',
'relative_humidity_2m',
'pressure_msl'
],
hourly: [
'temperature_2m',
'precipitation_probability',
'precipitation',
'rain',
'wind_speed_10m',
'cloud_cover',
'wind_direction_10m',
'relative_humidity_2m',
'pressure_msl'
]
};
const MARINE_PARAMS = {
current: [
'wave_height',
'wave_direction',
'wave_period',
'wave_peak_period',
'ocean_current_velocity',
'ocean_current_direction'
],
hourly: [
'wave_height',
'wave_direction',
'wave_period',
'wave_peak_period',
'ocean_current_velocity',
'ocean_current_direction'
]
};
// Unità di misura globali (aggiornate da OpenMeteo)
let globalUnits = {
forecast: {
temperature: '°C',
humidity: '%',
pressure: 'hPa',
windSpeed: 'km/h',
windDirection: '°',
windGusts: 'km/h',
rain: 'mm',
precipitation: 'mm'
},
waves: {
waveHeight: 'm',
wavePeriod: 's',
waveDirection: '°',
wavePeakPeriod: 's'
}
};
/**
* Ottiene le unità di misura globali
*/
function getUnits() {
return globalUnits;
}
/**
* Formatta un valore con la sua unità
*/
function formatWithUnit(value, unitKey, category = 'forecast') {
if (value === null || value === undefined) return 'n/d';
const unit = globalUnits[category]?.[unitKey] || '';
return `${value}${unit}`;
}
async function getForecast(location) {
if (!location?.latitude || !location?.longitude) {
console.warn('[OpenMeteo] Coordinate non valide per forecast');
return null;
}
const currentParams = FORECAST_PARAMS.current.join(",");
const hourlyParams = FORECAST_PARAMS.hourly.join(",");
const api = `https://api.open-meteo.com/v1/forecast?latitude=${location.latitude}&longitude=${location.longitude}&hourly=${hourlyParams}&current=${currentParams}`;
try {
const response = await axios.get(api, {
headers: HEADERS,
timeout: TIMEOUT,
validateStatus: (status) => status === 200
});
const { data } = response;
if (!data?.current) {
console.warn('[OpenMeteo Forecast] Risposta senza dati current');
return null;
}
// Aggiorna unità globali da API response
if (data.current_units) {
globalUnits.forecast = {
temperature: data.current_units.temperature_2m || '°C',
humidity: data.current_units.relative_humidity_2m || '%',
pressure: data.current_units.pressure_msl || 'hPa',
windSpeed: data.current_units.wind_speed_10m || 'km/h',
windDirection: data.current_units.wind_direction_10m || '°',
windGusts: data.current_units.wind_gusts_10m || 'km/h',
rain: data.current_units.rain || 'mm',
precipitation: data.current_units.precipitation || 'mm'
};
}
return {
temperature: data.current.temperature_2m ?? null,
humidity: data.current.relative_humidity_2m ?? null,
pressure: data.current.pressure_msl ?? null,
windSpeed: data.current.wind_speed_10m ?? null,
windDirection: data.current.wind_direction_10m ?? null,
windGusts: data.current.wind_gusts_10m ?? null,
rain: data.current.rain ?? null,
precipitation: data.current.precipitation ?? null,
// Unità di misura
units: globalUnits.forecast,
// Dati orari per grafici
hourly: {
time: data.hourly?.time,
temperature: data.hourly?.temperature_2m,
humidity: data.hourly?.relative_humidity_2m,
windSpeed: data.hourly?.wind_speed_10m
},
hourlyUnits: data.hourly_units || null
};
} catch (error) {
console.error(`[OpenMeteo Forecast] Errore: ${error.message}`);
return null;
}
}
async function getSeaConditions(location) {
if (!location?.latitude || !location?.longitude) {
console.warn('[OpenMeteo] Coordinate non valide per onde');
return null;
}
const currentParams = MARINE_PARAMS.current.join(",");
const hourlyParams = MARINE_PARAMS.hourly.join(",");
const api = `https://marine-api.open-meteo.com/v1/marine?latitude=${location.latitude}&longitude=${location.longitude}&hourly=${hourlyParams}&current=${currentParams}&models=ecmwf_wam`;
try {
const response = await axios.get(api, {
headers: HEADERS,
timeout: TIMEOUT,
validateStatus: (status) => status === 200
});
const { data } = response;
if (!data?.current) {
console.warn('[OpenMeteo Marine] Risposta senza dati current');
return null;
}
// Aggiorna unità globali da API response
if (data.current_units) {
globalUnits.waves = {
waveHeight: data.current_units.wave_height || 'm',
wavePeriod: data.current_units.wave_period || 's',
waveDirection: data.current_units.wave_direction || '°',
wavePeakPeriod: data.current_units.wave_peak_period || 's',
currentVelocity: data.current_units.ocean_current_velocity || 'm/s',
currentDirection: data.current_units.ocean_current_direction || '°'
};
}
return {
waveHeight: data.current.wave_height ?? null,
wavePeriod: data.current.wave_period ?? null,
waveDirection: data.current.wave_direction ?? null,
wavePeakPeriod: data.current.wave_peak_period ?? null,
currentDirection: data.current.ocean_current_direction ?? null,
currentVelocity: data.current.ocean_current_velocity ?? null,
// Unità di misura
units: globalUnits.waves,
// Dati orari per grafici
hourly: {
time: data.hourly?.time,
waveHeight: data.hourly?.wave_height,
wavePeriod: data.hourly?.wave_period,
waveDirection: data.hourly?.wave_direction,
currentDirection: data.hourly?.ocean_current_direction,
currentVelocity: data.hourly?.ocean_current_velocity
},
hourlyUnits: data.hourly_units || null
};
} catch (error) {
console.error(`[OpenMeteo Marine] Errore: ${error.message}`);
return null;
}
}
module.exports = { getSeaConditions, getForecast, getUnits, formatWithUnit };