Stacja pogodowa albo prosty pomiar temperatury zewnętrznej za darmo – dane do analiz energetycznych
- Andrzej Jarosz
- 4 godziny temu
- 3 minut(y) czytania
Przy wdrożeniach systemów monitorowania zużycia mediów energetycznych często pojawiała mi się myśl:
a gdyby dodać korelację z warunkami atmosferycznymi?
Takie dane otwierają ogromne możliwości — od analizy strat energetycznych zależnych od pogody, przez ocenę skuteczności dociepleń, aż po sterowanie instalacjami w oparciu o aktualne warunki zewnętrzne.
🔍 Poszukiwania prostego sposobu na dane pogodowe
Przeglądając różne stacje meteorologiczne i czujniki przemysłowe, szybko zauważyłem, że większość z nich nie udostępnia danych do zewnętrznych systemów lub wymaga pośrednictwa chmurowego serwera.Tymczasem w wielu analizach wystarczy profesjonalny, referencyjny pomiar z najbliższej stacji meteo – nawet jeśli nie jest on dokładnie przy naszym obiekcie.
I tu pojawiło się idealne rozwiązanie:bezkosztowe dane meteorologiczne z serwisu IMGW, obejmujące setki stacji w Polsce, odświeżane co godzinę.Dla analiz zużycia energii to w zupełności wystarczy.
Nawet własna stacja meteo mierzy inaczej – inaczej na dachu, inaczej przy ziemi, inaczej na południowej ścianie.Dane IMGW można potraktować jako wiarygodny punkt odniesienia dla całego obszaru.
⚙️ Darmowa automatyzacja z InDriverem
Dzięki platformie InDriver – systemowemu narzędziu do automatyzacji i przetwarzania danych – pobieranie danych z API IMGW jest proste, szybkie i darmowe (w zastosowaniach niekomercyjnych).
Wystarczy kilka linijek kodu JS w InDriverze, aby:
co 20 minut pobierać dane z API IMGW,
zapisywać je do bazy PostgreSQL,
i udostępniać do dalszej analizy.
Przykładowy skrypt:
onStartup
InDriver.import("RestApi");
InDriver.sqlExecute('azureserver', "select tsapicreatetable('public','imgw')");
InDriver.installHook(1200000) // call onHook every 20 minutes
onHook
let ts= InDriver.hookTs();
RestApi.sendRequest('weather','{"url":"https://danepubliczne.imgw.pl/api/data/synop","timeout":5000, "type":"get","headers":{"ContentTypeHeader":"application/json"}}');
// <= read REST API DANE
if (RestApi.isSucceeded()) {
// We have data!
const restData = RestApi.getData('weather');
const weatherData = JSON.parse(restData);
const stations = weatherData.map(item => {
const dateStr = item.data_pomiaru; // np. "2025-10-20"
const hourStr = item.godzina_pomiaru.padStart(2, '0'); // eg. "07"
// local time Europe/Warsaw
const local = new Date(`${dateStr}T${hourStr}:00:00`);
const offsetMinutes = local.getTimezoneOffset(); // eg. -120 for CEST, -60 dla CET
const ts = new Date(local.getTime() - offsetMinutes * 60000).toISOString();
// helper function empty or null → null
const toNum = v => v === null || v === "" ? null : Number(v)
return {
station: item.stacja,
ts: ts,
data: {
cisnienie: toNum(item.cisnienie),
kierunek_wiatru: toNum(item.kierunek_wiatru),
predkosc_wiatru: toNum(item.predkosc_wiatru),
suma_opadu: toNum(item.suma_opadu),
temperatura: toNum(item.temperatura),
wilgotnosc_wzgledna: toNum(item.wilgotnosc_wzgledna)
}
};
});
InDriver.debug(stations,"Debug",false);
// Log JSONs to SQL Database
for (const s of stations) {
const stationWeather = JSON.stringify(s.data);
const safe = text => text.replace(/'/g, "''");
const query = `select tsapiinsert('public','imgw','${safe(s.station)}','${s.ts}','${safe(stationWeather)}')`;
InDriver.sqlExecute('azureserver', query);
}
}
⏱️ Agregacja i przetwarzanie danych pogodowych
Każde źródło danych – także REST API – ma swoją specyfikę i wymaga odpowiedniego przetworzenia.
W przypadku danych IMGW sytuacja wygląda następująco: możemy pobierać dane w dowolnym momencie, ale aktualizacja pomiarów następuje raz na godzinę, zwykle ok. 15 minut po pełnej godzinie.Nie jest to oficjalnie udokumentowane, jednak z praktyki wynika, że właśnie wtedy pojawiają się nowe wartości.
Dlatego zadanie w InDriverze odpytuje API co 20 minut. W efekcie część danych się powtarza – co nie stanowi problemu, ponieważ surowa tabela imgw zawiera dane w postaci: timestamp, source, jsondata.
Dane te są następnie automatycznie agregowane do tabel przetworzonych: imgw_1hour, imgw_1day
Zawierają one uśrednione, zinterpolowane wartości godzinowe i dobowe, które idealnie nadają się do analiz i wizualizacji w Grafanie czy Power BI.
🧩 Automatyczna agregacja w InDriverze
Agregacja odbywa się w osobnym zadaniu (np. OnHook), przy użyciu wbudowanego API TsApi.Definicja agregatora jest bardzo prosta:
onStartup
InDriver.import("TsApi");
TsApi.defineAggregator("weather", "azureserver", "imgw", "Europe/Warsaw", '[]', '[ "1h", "1d"]', 10000);
TsApi.setAggregatorDebugMode("weather", false);
onHook:
aggregate('weather');
function aggregate(agg) {
const startTime = Date.now();
TsApi.aggregate(agg);
const endTime = Date.now();
const durationMs = endTime - startTime;
InDriver.debug(`TsApi.aggregate(${agg}) duration: ${durationMs} ms`);
}
W ten sposób InDriver automatycznie tworzy i aktualizuje tabele z danymi zagregowanymi w interwałach 1h i 1d.
Dzięki temu w analizach BI nie musimy operować na danych surowych – korzystamy od razu z gotowych, przetworzonych danych czasowych.
📊 Efekt
Z poziomu Grafany, Power BI czy dowolnego narzędzia analitycznego możemy teraz wygodnie korzystać z danych IMGW już po agregacji, np.:
imgw_1hour – do korelacji chwilowych trendów z zużyciem energii,
imgw_1day – do raportów dobowych i analiz sezonowych.
To kolejny przykład, jak InDriver automatyzuje całą ścieżkę danych – od pobrania po przetwarzanie i wizualizację.
📊 Wizualizacja danych w Grafanie
Dane pogodowe możemy łatwo połączyć z danymi energetycznymi w Grafanie, tworząc czytelne wykresy korelacji.Poniżej przykład, w którym temperatura z IMGW została naniesiona na zużycie energii w obiekcie:

Przykładowa kwerenda SQL do trendu temperatury w Grafanie:
select ts as time,(data->>'temperatura')::double precision as "temperatura" from public.imgw_1hour where source = 'Kraków' and ts between now() - interval '1 day' and now() order by ts asc;
☁️ Zanim kupisz stację meteo...
Zanim wydasz pieniądze na urządzenie, sprawdź dostępne darmowe API pogodowe – oprócz IMGW można też skorzystać z:
Open-Meteo: https://open-meteo.com/
OpenWeatherMap: https://openweathermap.org/api
WeatherAPI: https://www.weatherapi.com/
Połącz je z InDriverem i Grafaną, a stworzysz pełny system analizy i wizualizacji
– 10× szybciej, 10× taniej i 100× efektywniej.
To właśnie jest Game Changer automatyzacji i analizy danych.
Komentarze