top of page

Stacja pogodowa albo prosty pomiar temperatury zewnętrznej za darmo – dane do analiz energetycznych


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:



Grafana dashboard with energy and weather data
Grafana dashboard with energy and weather data


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:



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


bottom of page