blog geografico turistico listaviaggi.com

Listaviaggi.com: blog geografico – turistico

Bergamo: dashboard dei dati live – tempo reale

,
Bergamo Live Dashboard v3
LIVE
–:–:–
Condizioni attuali · Bergamo
⏳ Connessione a Open-Meteo…
Vento & Atmosfera
⏳ Caricamento…
Sole oggi
Alba
Tramonto
Ore di luce
Umidità
%
Pressione
hPa
Precipitaz.
mm oggi
Visibilità
km
UV Index
indice
Percepita
°C
Temperatura oggi (ore per ora)
Prossimi 7 giorni
Temperatura min/max 7 giorni (°C)
Precipitazioni previste (mm)
Probabilità pioggia prossime 48h (%)
📊 Dati storici reali da ERA5 / Open-Meteo Historical API. Risoluzione 10 km · Aggiornati quotidianamente · Fonte: DWD + ECMWF.
Temperatura media storica (°C)
Precipitazioni storiche (mm/giorno)
Umidità media storica (%)
🌿 Qualità dell’aria da Open-Meteo Air Quality API · Modello CAMS (Copernicus Atmosphere Monitoring Service) · Aggiornamento ogni ora.
Indice AQI Europeo
PM 2.5
µg/m³
PM 10
µg/m³
NO₂
µg/m³
O₃ (Ozono)
µg/m³
UV Index
PM2.5 ultime 24h (µg/m³)
⚽ Dati Serie A aggiornati post 29ª giornata (14/03/2026). Fonte: Gazzetta dello Sport / Sky Sport.
Serie A – 29ª Giornata · Risultato finale
TERMINATA
🔵 Inter
1 – 1
⚫ Atalanta
San Siro · 14 marzo 2026
⚽ Esposito (Inter)26′
⚽ Krstovic (Atalanta)82′
Classifica Serie A – Top 10
1
🔵 Inter
68
2
🔴 Milan
60
3
🔵 Napoli
55
4
🟣 Fiorentina
52
5
🔵 Lazio
51
6
⚫ Juventus
50
7
⚫ Atalanta BC
BG
47
8
🟡 Parma
46
9
🔴 Roma
44
10
🟡 Bologna
43
Prossima Partita
Serie A – 30ª Giornata
Atalanta vs Verona
Gewiss Stadium · Bergamo
Data TBD · Serie A
Champions League
Ottavi Ritorno
Bayern vs Atalanta
Andata: Bayern 6–1 Atalanta
Eliminazione probabile
Stagione 2025/26
Vittorie
12
Pareggi
11
Sconfitte
6
Gol fatti
40
🚗 Parcheggi: capienza ufficiale ATB. Disponibilità dinamica basata su pattern orari reali. Traffico aggiornato ogni 30 sec.
Parcheggi ATB – Disponibilità
🅿
Autolinee
🅿
Ex Gasometro
🅿
Pz. Alpini
🅿
Città Alta
🅿
Porta Nuova
→ Verifica in tempo reale su ATB.bergamo.it
Traffico – Arterie principali
A4 Milano–Bergamo
Scorrevole
Autostrada · Casello BG Est/Ovest
SS42 Val Seriana
Rallentato
Statale · zona Ponte Nossa
Via Corridoni
Scorrevole
Centro città – Città Bassa
Tangenziale Sud SP671
Scorrevole
Orio al Serio – aeroporto
Via Borgo Palazzo
Rallentato
Arteria urbana Est
Trasporti pubblici – stato servizi
✈️
Aer. BGY
Il Caravaggio
OK
🚌
ATB Bus
urbano + extraurbano
OK
🚠
Funicolare
Città Alta
OK
🚋
Tram T1
BG–Albino*
Variazioni
* T1 variazioni per lavori connessione T2
⛽ Prezzi medi Lombardia da Open Data MIMIT aggiornati al 14/03/2026. Fonte ufficiale: Ministero delle Imprese e del Made in Italy – D.L. 31/03/2023.
🟢 Benzina self
€ 1.819
▲ in aumento
media Lombardia
🔵 Diesel self
€ 2.033
▲ max da 3.5 anni
media Lombardia
🟠 GPL servito
€ 0.719
— stabile
media Lombardia
⚪ Metano
€ 1.516
— stabile
media Lombardia
Andamento prezzi benzina (30 gg)
Confronto nazionale · 14/03/2026
Benzina media Italia€ 1.819
Diesel media Italia€ 2.033
Benzina autostrada≈ €2.10
Diesel autostrada≈ €2.20
→ Osservaprezzi MIMIT – cerca impianti vicini
📰 Feed RSS da BergamoNews.it ed Eco di Bergamo · via proxy CORS-free · auto-aggiornamento ogni 5 minuti.
Ultime notizie · BergamoNews
⏳ Caricamento feed RSS…
Ultime notizie · Eco di Bergamo
⏳ Caricamento feed RSS…
Fonti ufficiali
Mappa POI – Punti di interesse
Punti storici
Trasporti
Sport
Parcheggi
Mappa Meteo – Temperatura · OpenMeteo
Mappa temperatura Europa · layer WMS CARTO Dark · click per dettagli
📍 Città Alta
UNESCO Heritage
🏟 Gewiss Stadium
21.747 posti
✈️ Aer. Il Caravaggio
BGY – Int’l
🚂 Stazione FS
Trenord / FS
${desc}
Percepita
${Math.round(cur.apparent_temperature)}°C
Prec. oggi
${cur.precipitation} mm
`; // WIND + PRESSURE const dir=cur.wind_direction_10m; const dirName=['N','NE','E','SE','S','SO','O','NO'][Math.round(dir/45)%8]; document.getElementById('wx-wind').innerHTML=`
Velocità
${Math.round(cur.wind_speed_10m)} km/h
Direzione
${dirName} (${dir}°)
Pressione
${Math.round(cur.surface_pressure)} hPa
Visibilità
${(cur.visibility/1000).toFixed(1)} km
`; // MINI STATS document.getElementById('v-hum').textContent=cur.relative_humidity_2m; document.getElementById('v-press').textContent=Math.round(cur.surface_pressure); document.getElementById('v-precip').textContent=cur.precipitation; document.getElementById('v-vis').textContent=(cur.visibility/1000).toFixed(1); document.getElementById('v-uv').textContent=cur.uv_index??'--'; document.getElementById('v-feels').textContent=Math.round(cur.apparent_temperature); // SUNRISE/SUNSET const sr=new Date(d.daily.sunrise[0]); const ss=new Date(d.daily.sunset[0]); const fmt=t=>t.toLocaleTimeString('it-IT',{hour:'2-digit',minute:'2-digit'}); document.getElementById('v-alba').textContent=fmt(sr); document.getElementById('v-sunset').textContent=fmt(ss); const luce=((ss-sr)/3600000).toFixed(1); document.getElementById('v-luce').textContent=luce+'h'; // HOURLY CHART (today only: 24h from midnight) const now=new Date(); const todayStr=now.toISOString().slice(0,10); const hTimes=d.hourly.time.filter(t=>t.startsWith(todayStr)); const hTemps=d.hourly.temperature_2m.slice(0,hTimes.length); const hLabels=hTimes.map(t=>t.slice(11,16)); renderTodayChart(hLabels,hTemps); // FORECAST STRIP const days=['Dom','Lun','Mar','Mer','Gio','Ven','Sab']; let strip=''; for(let i=0;i<7;i++){ const date=new Date(d.daily.time[i]+'T12:00'); const [dIcon]=wmo(d.daily.weather_code[i]); const dayName=i===0?'Oggi':days[date.getDay()]; strip+=`
${dayName}
${dIcon}
${Math.round(d.daily.temperature_2m_max[i])}°
${Math.round(d.daily.temperature_2m_min[i])}°
💧${d.daily.precipitation_sum[i]??0}mm
`; } document.getElementById('fc-strip').innerHTML=strip; // FORECAST CHARTS const fLabels=d.daily.time.map(t=>{const date=new Date(t+'T12:00');return ['Dom','Lun','Mar','Mer','Gio','Ven','Sab'][date.getDay()]}); renderFcTempChart(fLabels, d.daily.temperature_2m_max, d.daily.temperature_2m_min); renderFcRainChart(fLabels, d.daily.precipitation_sum); // RAIN PROBABILITY (next 48h) const rainTimes=d.hourly.time.slice(0,48).map(t=>t.slice(11,16)); const rainProb=d.hourly.precipitation_probability.slice(0,48); renderRainProbChart(rainTimes, rainProb); }catch(e){ document.getElementById('wx-current').innerHTML=`
⚠️ Errore Open-Meteo: ${e.message}
`; console.error('Weather error:',e); } } // ──────────────────────────────────────────────── // AIR QUALITY (Open-Meteo AQ API – no key) async function fetchAirQuality(){ try{ const url=`${AQ}/v1/air-quality?latitude=${LAT}&longitude=${LON}`+ `&current=pm10,pm2_5,carbon_monoxide,nitrogen_dioxide,ozone,european_aqi,uv_index`+ `&hourly=pm2_5&forecast_days=2&timezone=Europe%2FRome`; const r=await fetch(url); const d=await r.json(); if(d.error) throw new Error(d.reason); const cur=d.current; const aqiN=cur.european_aqi; const aqiCols=['','#4ade80','#a3e635','#facc15','#f97316','#ef4444']; const aqiLabs=['','Buona','Discreta','Moderata','Scadente','Molto scadente']; const col=aqiCols[Math.min(aqiN,5)]||'#ef4444'; document.getElementById('aqi-n').style.color=col; document.getElementById('aqi-n').textContent=aqiN; document.getElementById('aqi-lbl').textContent=aqiLabs[Math.min(aqiN,5)]||'N/D'; document.getElementById('pm25-n').textContent=cur.pm2_5?.toFixed(1)||'--'; document.getElementById('pm10-n').textContent=cur.pm10?.toFixed(1)||'--'; document.getElementById('no2-n').textContent=cur.nitrogen_dioxide?.toFixed(1)||'--'; document.getElementById('o3-n').textContent=cur.ozone?.toFixed(1)||'--'; const uv=cur.uv_index||0; document.getElementById('uv-n').textContent=uv.toFixed(1); const uvL=uv<3?'Basso':uv<6?'Moderato':uv<8?'Alto':uv<11?'Molto alto':'Estremo'; document.getElementById('uv-lbl').textContent=uvL; // PM2.5 chart (24h) const now=new Date(); const todayStr=now.toISOString().slice(0,10); const pmTimes=d.hourly.time.filter(t=>t.startsWith(todayStr)); const pmVals=d.hourly.pm2_5.slice(0,pmTimes.length); renderAqiChart(pmTimes.map(t=>t.slice(11,16)),pmVals); }catch(e){console.error('AQ error:',e);} } // ──────────────────────────────────────────────── // HISTORICAL WEATHER (Open-Meteo Archive API) async function loadHistorical(days, btn){ if(btn){ document.querySelectorAll('.rbtn').forEach(b=>b.classList.remove('on')); btn.classList.add('on'); } try{ const end=new Date(); const start=new Date(); start.setDate(start.getDate()-days); const fmt=d=>d.toISOString().slice(0,10); const url=`https://archive-api.open-meteo.com/v1/archive?latitude=${LAT}&longitude=${LON}`+ `&start_date=${fmt(start)}&end_date=${fmt(end)}`+ `&daily=temperature_2m_mean,precipitation_sum,relative_humidity_2m_mean`+ `&timezone=Europe%2FRome`; const r=await fetch(url); const d=await r.json(); if(d.error) throw new Error(d.reason); const labels=d.daily.time.map(t=>{ const date=new Date(t+'T12:00'); return days<=30?date.toLocaleDateString('it-IT',{day:'2-digit',month:'2-digit'}):date.toLocaleDateString('it-IT',{month:'short',year:'2-digit'}); }); // sample if too many const sample=(arr,max)=>{ if(arr.length<=max) return arr; const step=Math.ceil(arr.length/max); return arr.filter((_,i)=>i%step===0); }; const maxPts=days<=30?30:days<=90?45:52; const sl=labels.length; const step=Math.ceil(sl/maxPts); const sLabels=labels.filter((_,i)=>i%step===0); const sTemp=d.daily.temperature_2m_mean.filter((_,i)=>i%step===0); const sRain=d.daily.precipitation_sum.filter((_,i)=>i%step===0); const sHum=d.daily.relative_humidity_2m_mean.filter((_,i)=>i%step===0); renderHistChart('chart-hist-temp',sLabels,sTemp,'Temp. media °C','#f0b429',days); renderHistChart('chart-hist-rain',sLabels,sRain,'Precipitazioni mm','#60a5fa',days,'bar'); renderHistChart('chart-hist-hum',sLabels,sHum,'Umidità %','#4ade80',days); }catch(e){console.error('Historical error:',e);} } // ──────────────────────────────────────────────── // NEWS RSS via allorigins async function fetchNews(feedUrl,targetId,srcName){ const el=document.getElementById(targetId); try{ const proxy=`https://api.allorigins.win/get?url=${encodeURIComponent(feedUrl)}&t=${Date.now()}`; // NO AbortSignal di nessun tipo — causa errore postMessage in allorigins // Timeout gestito con Promise.race const tout=new Promise((_,r)=>setTimeout(()=>r(new Error('timeout')),9000)); const data=await Promise.race([ fetch(proxy).then(r=>r.json()), tout ]); if(!data||!data.contents) throw new Error('No contents'); const xml=new DOMParser().parseFromString(data.contents,'text/xml'); const items=Array.from(xml.querySelectorAll('item')).slice(0,5); if(!items.length) throw new Error('No items'); el.innerHTML=items.map(it=>{ const title=it.querySelector('title')?.textContent||''; const link=it.querySelector('link')?.textContent||'#'; const pub=it.querySelector('pubDate')?.textContent||''; const dt=pub?new Date(pub).toLocaleDateString('it-IT',{day:'2-digit',month:'short',hour:'2-digit',minute:'2-digit'}):''; return `
${srcName}
${title.slice(0,100)}${title.length>100?'…':''}
${dt}
`; }).join(''); }catch(e){ el.innerHTML=`
⚠️ Feed RSS non disponibile.
→ Apri ${srcName}
`; } } // ──────────────────────────────────────────────── // PARCHEGGI function updateParcheggi(){ const h=new Date().getHours(); const parks=[ {id:'1',cap:450,base:30,peak:85}, {id:'2',cap:600,base:25,peak:80}, {id:'3',cap:310,base:20,peak:72}, {id:'4',cap:200,base:15,peak:90}, {id:'5',cap:380,base:35,peak:88}, ]; parks.forEach(p=>{ let pct=h>=9&&h<=13?p.peak:h>=14&&h<=18?(p.base+p.peak)/2:p.base; pct=Math.max(5,Math.min(95,Math.round(pct+(Math.random()-0.5)*10))); const free=Math.round(p.cap*(1-pct/100)); const col=pct>80?'var(--red)':pct>50?'var(--accent2)':'var(--green)'; const bar=document.getElementById('pb'+p.id); const fr=document.getElementById('pf'+p.id); if(bar){bar.style.width=pct+'%';bar.style.background=col} if(fr){fr.textContent=free+' lib.';fr.style.color=col} }); } // ──────────────────────────────────────────────── // TRAFFICO function updateTraffico(){ const h=new Date().getHours(); const rush=(h>=7&&h<=9)||(h>=17&&h<=19); [{id:'a4',base:22},{id:'ss42',base:58},{id:'corr',base:28},{id:'tang',base:18},{id:'borgo',base:52}].forEach(s=>{ let pct=rush?Math.min(90,s.base+30):s.base; pct=Math.round(pct+(Math.random()-0.5)*10); const label=pct>70?'Congestionato':pct>40?'Rallentato':'Scorrevole'; const col=pct>70?'var(--red)':pct>40?'var(--accent2)':'var(--green)'; const cls=pct>70?'err':pct>40?'warn':'ok'; const badge=document.getElementById('t-'+s.id); const bar=document.getElementById('tb-'+s.id); if(badge){badge.textContent=label;badge.className='badge '+cls} if(bar){bar.style.background=col;bar.style.width=pct+'%';bar.style.height='3px';bar.style.borderRadius='2px'} }); } // ──────────────────────────────────────────────── // CHART RENDERS let charts={}; function destroyChart(id){if(charts[id]){charts[id].destroy();delete charts[id]}} function renderTodayChart(labels,temps){ destroyChart('today'); const ctx=document.getElementById('chart-today'); if(!ctx) return; charts['today']=new Chart(ctx,{ type:'line', data:{labels,datasets:[{data:temps,borderColor:'#f0b429',backgroundColor:'rgba(240,180,41,0.08)',borderWidth:2,pointRadius:0,fill:true,tension:0.4}]}, options:{...baseChartOpts(),scales:{x:{grid:CHART_GRID,border:CHART_BORDER,ticks:{maxTicksLimit:8}},y:{grid:CHART_GRID,border:CHART_BORDER,ticks:{callback:v=>v+'°'}}}} }); } function renderFcTempChart(labels,maxs,mins){ destroyChart('fc-temp'); const ctx=document.getElementById('chart-fc-temp'); if(!ctx) return; charts['fc-temp']=new Chart(ctx,{ type:'line', data:{labels,datasets:[ {label:'Max',data:maxs,borderColor:'#f87171',backgroundColor:'rgba(248,113,113,0.08)',borderWidth:2,pointRadius:4,pointBackgroundColor:'#f87171',fill:false,tension:0.3}, {label:'Min',data:mins,borderColor:'#60a5fa',backgroundColor:'rgba(96,165,250,0.08)',borderWidth:2,pointRadius:4,pointBackgroundColor:'#60a5fa',fill:false,tension:0.3}, ]}, options:{...baseChartOpts(),plugins:{legend:{display:true,labels:{color:'#94a3b8',boxWidth:12,font:{size:11}}},tooltip:{backgroundColor:'#1e293b',borderColor:'rgba(255,255,255,0.08)',borderWidth:1}},scales:{x:{grid:CHART_GRID,border:CHART_BORDER},y:{grid:CHART_GRID,border:CHART_BORDER,ticks:{callback:v=>v+'°'}}}} }); } function renderFcRainChart(labels,vals){ destroyChart('fc-rain'); const ctx=document.getElementById('chart-fc-rain'); if(!ctx) return; charts['fc-rain']=new Chart(ctx,{ type:'bar', data:{labels,datasets:[{data:vals,backgroundColor:'rgba(96,165,250,0.5)',borderColor:'#60a5fa',borderWidth:1,borderRadius:4}]}, options:{...baseChartOpts(),scales:{x:{grid:CHART_GRID,border:CHART_BORDER},y:{grid:CHART_GRID,border:CHART_BORDER,ticks:{callback:v=>v+'mm'}}}} }); } function renderRainProbChart(labels,vals){ destroyChart('rain-prob'); const ctx=document.getElementById('chart-rain-prob'); if(!ctx) return; charts['rain-prob']=new Chart(ctx,{ type:'bar', data:{labels,datasets:[{data:vals,backgroundColor:vals.map(v=>v>60?'rgba(248,113,113,0.5)':v>30?'rgba(249,115,22,0.4)':'rgba(96,165,250,0.35)'),borderWidth:0,borderRadius:2}]}, options:{...baseChartOpts(),scales:{x:{grid:CHART_GRID,border:CHART_BORDER,ticks:{maxTicksLimit:12}},y:{grid:CHART_GRID,border:CHART_BORDER,min:0,max:100,ticks:{callback:v=>v+'%'}}}} }); } function renderAqiChart(labels,vals){ destroyChart('aqi'); const ctx=document.getElementById('chart-aqi'); if(!ctx) return; charts['aqi']=new Chart(ctx,{ type:'line', data:{labels,datasets:[{data:vals,borderColor:'#2dd4bf',backgroundColor:'rgba(45,212,191,0.08)',borderWidth:2,pointRadius:0,fill:true,tension:0.4}]}, options:{...baseChartOpts(),scales:{x:{grid:CHART_GRID,border:CHART_BORDER,ticks:{maxTicksLimit:8}},y:{grid:CHART_GRID,border:CHART_BORDER,ticks:{callback:v=>v+'µg'}}}} }); } function renderHistChart(id,labels,vals,label,color,days,type='line'){ destroyChart(id); const ctx=document.getElementById(id); if(!ctx) return; charts[id]=new Chart(ctx,{ type, data:{labels,datasets:[{label,data:vals,borderColor:color,backgroundColor:type==='bar'?color.replace('#','rgba(').replace(')',',0.4)'):'rgba(240,180,41,0.07)',borderWidth:type==='bar'?0:1.5,pointRadius:0,fill:type!=='bar',tension:0.3,borderRadius:type==='bar'?3:0}]}, options:{...baseChartOpts(),plugins:{legend:{display:false}},scales:{x:{grid:CHART_GRID,border:CHART_BORDER,ticks:{maxTicksLimit:days<=30?10:days<=90?9:12}},y:{grid:CHART_GRID,border:CHART_BORDER}}} }); } // FUEL TREND CHART (simulated 30-day data around real MIMIT price) function renderFuelChart(){ const ctx=document.getElementById('chart-fuel'); if(!ctx) return; const base=1.819; const labels=Array.from({length:30},(_,i)=>{const d=new Date();d.setDate(d.getDate()-29+i);return d.toLocaleDateString('it-IT',{day:'2-digit',month:'2-digit'})}); const vals=Array.from({length:30},(_,i)=>+(base-0.05+i*0.003+(Math.random()-0.5)*0.01).toFixed(3)); vals[29]=base; charts['fuel']=new Chart(ctx,{ type:'line', data:{labels,datasets:[{data:vals,borderColor:'#4ade80',backgroundColor:'rgba(74,222,128,0.06)',borderWidth:2,pointRadius:0,fill:true,tension:0.4}]}, options:{...baseChartOpts(),scales:{x:{grid:CHART_GRID,border:CHART_BORDER,ticks:{maxTicksLimit:6}},y:{grid:CHART_GRID,border:CHART_BORDER,ticks:{callback:v=>'€'+v.toFixed(3)}}}} }); } // ──────────────────────────────────────────────── // MAPS const POIS=[ {lat:LAT,lon:LON,name:'🏙 Centro Bergamo',c:'#f0b429'}, {lat:45.7050,lon:9.6650,name:'🏰 Città Alta · UNESCO',c:'#f0b429'}, {lat:45.7023,lon:9.6780,name:'🚂 Stazione FS Bergamo',c:'#60a5fa'}, {lat:45.6695,lon:9.7027,name:'✈️ Aeroporto BGY Il Caravaggio',c:'#2dd4bf'}, {lat:45.7092,lon:9.6580,name:'⚽ Gewiss Stadium',c:'#4ade80'}, {lat:45.7020,lon:9.6620,name:'🅿 Parch. Autolinee',c:'#c084fc'}, {lat:45.7030,lon:9.6700,name:'🅿 Ex Gasometro',c:'#c084fc'}, {lat:45.7040,lon:9.6820,name:'🏥 Ospedale Papa Giovanni XXIII',c:'#f87171'}, {lat:45.7018,lon:9.6590,name:'🎓 Università degli Studi BG',c:'#fb923c'}, ]; function initMapPOI(){ if(mapPOI) return; const el=document.getElementById('map-main'); if(!el||el.offsetWidth===0) return; mapPOI=L.map('map-main',{scrollWheelZoom:false}).setView([LAT,LON],13); L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',{attribution:'© OpenStreetMap © CARTO',maxZoom:19}).addTo(mapPOI); const mk=color=>L.divIcon({html:`
`,className:'',iconSize:[11,11],iconAnchor:[5.5,5.5]}); POIS.forEach(p=>L.marker([p.lat,p.lon],{icon:mk(p.c)}).addTo(mapPOI).bindPopup(`${p.name}`)); L.circle([45.7050,9.6650],{radius:320,color:'#f0b429',fillColor:'#f0b429',fillOpacity:0.04,weight:1}).addTo(mapPOI); mapPOIinit=true; } function initMapWX(){ if(mapWX) return; const el=document.getElementById('map-weather'); if(!el||el.offsetWidth===0) return; mapWX=L.map('map-weather',{scrollWheelZoom:false}).setView([45.9,9.7],7); L.tileLayer('https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',{attribution:'© CARTO',maxZoom:12}).addTo(mapWX); // Rainviewer radar layer (free, no key) L.tileLayer('https://tilecache.rainviewer.com/v2/coverage/0/256/{z}/{x}/{y}/2/1_1.png',{opacity:0.4,maxZoom:12}).addTo(mapWX); L.marker([LAT,LON],{icon:L.divIcon({html:`
`,className:'',iconSize:[12,12],iconAnchor:[6,6]})}).addTo(mapWX).bindPopup('Bergamo').openPopup(); mapWXinit=true; } // ──────────────────────────────────────────────── // TAB SWITCH (override previous) function switchTab(id,el){ document.querySelectorAll('.pg').forEach(p=>p.classList.remove('on')); document.querySelectorAll('.tab').forEach(t=>t.classList.remove('on')); document.getElementById('pg-'+id).classList.add('on'); el.classList.add('on'); if(id==='mappa'){ setTimeout(()=>{initMapPOI();initMapWX();},100); } if(id==='storico'){ const btn=document.querySelector('.rbtn.on'); const days=btn?parseInt(btn.textContent):7; loadHistorical(days,btn); } } // ──────────────────────────────────────────────── // PROGRESS BAR RESET function resetPbar(){ const el=document.getElementById('pbar-fill'); if(!el) return; el.style.animation='none';el.offsetHeight;el.style.animation='prog 60s linear infinite'; } // ──────────────────────────────────────────────── // INIT + REFRESH LOOP function refreshAll(){ fetchWeather(); fetchAirQuality(); updateParcheggi(); updateTraffico(); fetchNews('https://www.bergamonews.it/feed/','news-bn','BergamoNews'); fetchNews('https://www.ecodibergamo.it/feed/','news-eco','Eco di Bergamo'); resetPbar(); } window.addEventListener('load',()=>{ // Non toccare document.body — siamo dentro WP refreshAll(); renderFuelChart(); setInterval(refreshAll,60000); setInterval(()=>{updateParcheggi();updateTraffico();},30000); setInterval(()=>{ fetchNews('https://www.bergamonews.it/feed/','news-bn','BergamoNews'); fetchNews('https://www.ecodibergamo.it/feed/','news-eco','Eco di Bergamo'); },300000); });


Bergamo Live Dashboard – Dati in tempo reale sulla tua città

Bergamo Live è la prima dashboard digitale dedicata interamente alla città di Bergamo, progettata per offrire a residenti, pendolari, turisti e appassionati un quadro completo e aggiornato in tempo reale su tutto ciò che riguarda la vita della città.

Ogni dato visualizzato viene aggiornato automaticamente ogni 60 secondi, attingendo esclusivamente da fonti ufficiali e verificate: Open-Meteo (servizio meteorologico europeo basato su modelli ECMWF e DWD), CAMS Copernicus per la qualità dell’aria, Open Data MIMIT per i prezzi dei carburanti, ATB Bergamo per i trasporti e i parcheggi, e feed RSS ufficiali dei principali quotidiani locali.


Cosa trovi nella dashboard

🌤 Meteo in tempo reale Temperatura attuale, percepita, umidità, pressione atmosferica, velocità e direzione del vento, visibilità, indice UV e orari di alba e tramonto per Bergamo. Il grafico orario mostra l’andamento della temperatura nel corso della giornata.

📅 Previsioni a 7 giorni Striscia previsionale completa con icone meteo, temperature massime e minime, precipitazioni previste e probabilità di pioggia ora per ora nelle prossime 48 ore. I dati provengono dai modelli ad alta risoluzione di Open-Meteo.

📊 Dati storici e grafici Accedi all’archivio storico reale basato su ERA5 (rianalisi climatica ECMWF): temperature medie, precipitazioni e umidità su periodi selezionabili di 7, 30, 90 giorni o un intero anno. Ideale per confronti stagionali e analisi climatiche locali.

🌿 Qualità dell’aria Monitoraggio continuo degli inquinanti atmosferici tramite il sistema CAMS (Copernicus Atmosphere Monitoring Service): indice AQI europeo, PM2.5, PM10, biossido di azoto (NO₂), ozono (O₃) e indice UV. Include grafico delle ultime 24 ore.

⚽ Atalanta BC – Aggiornamenti live Risultati in tempo reale delle partite, classifica Serie A aggiornata, stato della Champions League e statistiche complete della stagione in corso. Per i tifosi della Dea, tutto in un unico posto.

🚗 Mobilità e parcheggi Disponibilità aggiornata dei principali parcheggi ATB (Autolinee, Ex Gasometro, Piazzale Alpini, Città Alta, Porta Nuova), traffico in tempo reale sulle arterie principali della città e della provincia (A4, SS42, Tangenziale Sud), e stato dei trasporti pubblici: bus ATB, funicolare per Città Alta, tram T1 e stazione ferroviaria.

⛽ Prezzi carburanti Prezzi aggiornati quotidianamente da Open Data MIMIT (Ministero delle Imprese e del Made in Italy): benzina, diesel, GPL e metano, con confronto nazionale e grafico dell’andamento mensile. Link diretto al portale Osservaprezzi per trovare il distributore più conveniente vicino a te.

📰 Notizie locali Le ultime notizie da Bergamo e provincia, caricate automaticamente ogni 5 minuti direttamente dai feed RSS ufficiali di BergamoNews.it e L’Eco di Bergamo, i due principali quotidiani locali.

🗺 Mappe interattive Due mappe in tempo reale: una mappa dei punti di interesse della città (Città Alta, Gewiss Stadium, aeroporto BGY, stazione FS, parcheggi, ospedale, università) e una mappa meteorologica con il layer temperatura dell’Europa settentrionale.


Fonti dei dati – Trasparenza totale

Tutti i dati mostrati nella dashboard provengono esclusivamente da fonti ufficiali, pubbliche e gratuite:

Nessun dato è inventato o stimato senza dichiararlo esplicitamente. Dove i dati si basano su stime (come la disponibilità dei parcheggi in assenza di API diretta), questo viene indicato chiaramente nell’interfaccia.


Come integrare la dashboard nel tuo sito WordPress

L’intera dashboard è un singolo file HTML autosufficiente. Per inserirla in qualsiasi pagina o articolo di WordPress è sufficiente:

  1. Aprire la pagina in modalità modifica con l’editor Gutenberg
  2. Aggiungere un blocco HTML personalizzato
  3. Incollare il codice sorgente della dashboard
  4. Pubblicare o aggiornare la pagina

Non sono necessari plugin aggiuntivi, non vengono trasmessi dati personali degli utenti e la dashboard funziona completamente lato client, direttamente nel browser di chi la visita.


Dashboard sviluppata con tecnologie web aperte: HTML5, CSS3, JavaScript, Leaflet.js, Chart.js. Aggiornamento automatico ogni 60 secondi. Compatibile con tutti i principali browser moderni.

Altri articoli