TapHome

OKTE Prezzi spot

Packet Parser → HTTP
Inviato da
Ultimo aggiornamento: 03. 2026

OKTE (Organizátor krátkodobého trhu s elektrinou) è l’operatore del mercato elettrico slovacco. Pubblica i prezzi spot del mercato day-ahead (DAM) — il prezzo all’ingrosso orario dell’elettricità in EUR/MWh determinato dall’asta del giorno precedente.

Il template TapHome recupera questi prezzi dall’API pubblica OKTE (isot.okte.sk) tramite HTTP Packet Parser. Fornisce il prezzo dell’ora corrente, le classifiche dei prezzi, i calcoli min/max/media e l’analisi della finestra temporale — tutto aggiornato automaticamente ogni ora. Non è richiesta alcuna autenticazione.

Configurazione

Il template si connette a isot.okte.sk tramite HTTPS (porta 443). Non servono indirizzo IP o credenziali — l’endpoint è un’API pubblica.

Durante l’importazione del template, è possibile impostare due variabili personalizzate opzionali:

  • Da — ora di inizio di una finestra temporale personalizzata (0–23, predefinito: 9)
  • A — ora di fine di una finestra temporale personalizzata (0–23, predefinito: 17)

Queste variabili controllano le varianti dei dispositivi “nella finestra temporale”. I valori predefiniti (9–17) coprono l’orario lavorativo standard. Se non necessarie, lascia i valori predefiniti — i dispositivi per l’intera giornata funzionano indipendentemente.

Come funziona

Il modulo interroga l’API OKTE DAM una volta all’ora (intervallo di 3600 s). La richiesta API utilizza la data odierna:

1
GET /api/v1/dam/results?deliveryDayFrom={today}&deliveryDayTo={today}

La risposta contiene un array di oggetti prezzo, ciascuno con un numero period e un price in EUR/MWh. A seconda dell’ora del giorno e del programma di pubblicazione OKTE, la risposta può includere prezzi solo per oggi (24 periodi) o per un massimo di 3 giorni (72 periodi).

Ogni script dispositivo analizza questo array JSON usando PARSEJSON(output, "$..price") e applica funzioni di ordinamento, filtraggio o aggregazione per derivare il proprio valore.

Capacità dei dispositivi

Il template espone 13 dispositivi sensore. Tutti sono in sola lettura — derivano i valori dalla stessa risposta API.

Prezzo attuale e classifica
  • Prezzo attuale — il prezzo spot per il periodo orario corrente in EUR/MWh. Lo script determina l’indice del periodo corrente da NOW() e restituisce il prezzo corrispondente dall’array.
  • Classifica del periodo attuale — la posizione del prezzo dell’ora corrente tra tutti i periodi disponibili (1 = più economico). Utile per regole di automazione come “attiva la pompa di calore solo quando l’ora corrente è tra le 8 più economiche.”
  • Classifica del periodo attuale nella finestra temporale — come sopra, ma limitata alla finestra Da–A definita dall’utente. Restituisce NaN se l’ora corrente è fuori dalla finestra o se Da >= A.
Estremi di prezzo
  • Prezzo più alto del giorno — prezzo spot massimo su tutti i periodi disponibili
  • Prezzo più basso del giorno — prezzo spot minimo su tutti i periodi disponibili
  • Prezzo più alto nella finestra temporale — prezzo massimo all’interno della finestra Da–A
  • Prezzo più basso nella finestra temporale — prezzo minimo all’interno della finestra Da–A
Medie
  • Prezzo medio del giorno — media aritmetica di tutti i prezzi dei periodi disponibili
  • Prezzo medio nella finestra temporale — media aritmetica all’interno della finestra Da–A
Identificazione dei periodi
  • Periodo più economico del giorno — il numero di periodo basato su 1 dell’ora più economica (es. 3 significa 02:00–03:00)
  • Periodo rimanente più economico — l’ora più economica dall’ora corrente in poi. Si aggiorna dinamicamente durante la giornata.
Conteggi
  • Conteggio periodi — numero totale di periodi di prezzo nella risposta API (tipicamente 24 o 72)
  • Conteggio periodi nella finestra temporale — numero di periodi all’interno della finestra Da–A

Attributi del servizio

Il modulo espone fino a 96 attributi del servizio (Periodo 1 fino a Periodo 96), ciascuno mostra il prezzo spot per quello specifico periodo orario come stringa con suffisso “EUR”. In pratica, 24 attributi sono compilati per un singolo giorno o 72 per tre giorni.

Questi attributi forniscono un programma completo dei prezzi visibile nella vista dettagliata del modulo TapHome.

Variabili personalizzate (Da / A)

Diversi dispositivi hanno varianti “nella finestra temporale” che filtrano i dati dei prezzi su un sottoinsieme di ore. La finestra è definita da due variabili personalizzate impostate durante l’importazione del template:

  • Da — l’ora di inizio (inclusa), valore 0–23
  • A — l’ora di fine (esclusa), valore 0–23

Ad esempio, impostando Da=8 e A=16 si analizzano i prezzi solo tra le 08:00 e le 16:00. Questo è utile quando vuoi ottimizzare il consumo energetico durante ore specifiche — come far funzionare gli elettrodomestici solo durante le ore più economiche della tua giornata lavorativa.

Se Da >= A, tutti i dispositivi con finestra restituiscono NaN.

Esempi di automazione

Eseguire dispositivi durante le ore più economiche

Usa il dispositivo Classifica del periodo attuale in una condizione smart rule. Ad esempio, per far funzionare una pompa per piscina solo durante le 6 ore più economiche del giorno:

  • Condizione: Classifica del periodo attuale <= 6
  • Azione: Accendi pompa piscina
Evitare i prezzi di punta

Usa il dispositivo Prezzo attuale con una soglia:

  • Condizione: Prezzo attuale > 150 (EUR/MWh)
  • Azione: Spegni carichi non essenziali
Ottimizzazione della finestra temporale

Imposta Da=22, A=6 per definire una finestra notturna, poi usa Prezzo più basso nella finestra temporale o Classifica del periodo attuale nella finestra temporale per programmare la ricarica della batteria o il funzionamento dello scaldacqua durante le ore notturne più economiche.

Risoluzione dei problemi

Tutti i dispositivi mostrano zero o nessun dato
  1. Controlla la connettività internet su TapHome Core — il template richiede accesso HTTPS in uscita verso isot.okte.sk
  2. Verifica che l’API risponda — apri https://isot.okte.sk/api/v1/dam/results?deliveryDayFrom=2026-03-28&deliveryDayTo=2026-03-28 nel browser
  3. I prezzi DAM per il giorno successivo vengono tipicamente pubblicati dopo le 12:45 CET. Prima della pubblicazione, le richieste per la data di domani restituiscono risultati vuoti.
I dispositivi con finestra restituiscono NaN
  1. Verifica che Da < A nei parametri di importazione del template
  2. Controlla che l’ora corrente rientri nell’intervallo Da–A (per la Classifica del periodo attuale nella finestra temporale)
  3. Ricorda che Da e A utilizzano il formato 24 ore (0–23)
I valori dei prezzi sembrano errati

OKTE pubblica i prezzi in EUR/MWh. Per convertire in EUR/kWh (scala domestica), dividi per 1000. Il template visualizza i valori grezzi dall’API senza conversione.

Dispositivi disponibili

OKTE Prezzi spot Modulo
Attributi di servizio
Period 1
Period 2
Period 3
Period 4
Period 5
Period 6
Period 7
Period 8
Period 9
Period 10
Period 11
Period 12
Period 13
Period 14
Period 15
Period 16
Period 17
Period 18
Period 19
Period 20
Period 21
Period 22
Period 23
Period 24
Period 25
Period 26
Period 27
Period 28
Period 29
Period 30
Period 31
Period 32
Period 33
Period 34
Period 35
Period 36
Period 37
Period 38
Period 39
Period 40
Period 41
Period 42
Period 43
Period 44
Period 45
Period 46
Period 47
Period 48
Period 49
Period 50
Period 51
Period 52
Period 53
Period 54
Period 55
Period 56
Period 57
Period 58
Period 59
Period 60
Period 61
Period 62
Period 63
Period 64
Period 65
Period 66
Period 67
Period 68
Period 69
Period 70
Period 71
Period 72
Period 73
Period 74
Period 75
Period 76
Period 77
Period 78
Period 79
Period 80
Period 81
Period 82
Period 83
Period 84
Period 85
Period 86
Period 87
Period 88
Period 89
Period 90
Period 91
Period 92
Period 93
Period 94
Period 95
Period 96
Variabili personalizzate
From (numeric) = 9Start hour (0–23) of the time window for windowed price ranking and statistics
To (numeric) = 17End hour (0–23) of the time window for windowed price ranking and statistics

okte.sk

Lettura (modulo)
VAR today := tostring(NOW(), "yyyy-MM-dd");;
VAR response := SENDHTTPREQUEST("/api/v1/dam/results?deliveryDayFrom=" + today + "&deliveryDayTo=" + today);
IF response.IsSuccess
    output := response.Content;
ELSE
    ADDERROR(response.StatusCode + " (" + response.ReasonPhrase + ")");
END
Attributi di servizio
Perióda 1
PARSEJSON(output, "$[?(@.period == 1)].price") + " EUR"
Perióda 2
PARSEJSON(output, "$[?(@.period == 2)].price") + " EUR"
Perióda 3
PARSEJSON(output, "$[?(@.period == 3)].price") + " EUR"
Perióda 4
PARSEJSON(output, "$[?(@.period == 4)].price") + " EUR"
Perióda 5
PARSEJSON(output, "$[?(@.period == 5)].price") + " EUR"
Perióda 6
PARSEJSON(output, "$[?(@.period == 6)].price") + " EUR"
Perióda 7
PARSEJSON(output, "$[?(@.period == 7)].price") + " EUR"
Perióda 8
PARSEJSON(output, "$[?(@.period == 8)].price") + " EUR"
Perióda 9
PARSEJSON(output, "$[?(@.period == 9)].price") + " EUR"
Perióda 10
PARSEJSON(output, "$[?(@.period == 10)].price") + " EUR"
Perióda 11
PARSEJSON(output, "$[?(@.period == 11)].price") + " EUR"
Perióda 12
PARSEJSON(output, "$[?(@.period == 12)].price") + " EUR"
Perióda 13
PARSEJSON(output, "$[?(@.period == 13)].price") + " EUR"
Perióda 14
PARSEJSON(output, "$[?(@.period == 14)].price") + " EUR"
Perióda 15
PARSEJSON(output, "$[?(@.period == 15)].price") + " EUR"
Perióda 16
PARSEJSON(output, "$[?(@.period == 16)].price") + " EUR"
Perióda 17
PARSEJSON(output, "$[?(@.period == 17)].price") + " EUR"
Perióda 18
PARSEJSON(output, "$[?(@.period == 18)].price") + " EUR"
Perióda 19
PARSEJSON(output, "$[?(@.period == 19)].price") + " EUR"
Perióda 20
PARSEJSON(output, "$[?(@.period == 20)].price") + " EUR"
Perióda 21
PARSEJSON(output, "$[?(@.period == 21)].price") + " EUR"
Perióda 22
PARSEJSON(output, "$[?(@.period == 22)].price") + " EUR"
Perióda 23
PARSEJSON(output, "$[?(@.period == 23)].price") + " EUR"
Perióda 24
PARSEJSON(output, "$[?(@.period == 24)].price") + " EUR"
Perióda 25
PARSEJSON(output, "$[?(@.period == 25)].price") + " EUR"
Perióda 26
PARSEJSON(output, "$[?(@.period == 26)].price") + " EUR"
Perióda 27
PARSEJSON(output, "$[?(@.period == 27)].price") + " EUR"
Perióda 28
PARSEJSON(output, "$[?(@.period == 28)].price") + " EUR"
Perióda 29
PARSEJSON(output, "$[?(@.period == 29)].price") + " EUR"
Perióda 30
PARSEJSON(output, "$[?(@.period == 30)].price") + " EUR"
Perióda 31
PARSEJSON(output, "$[?(@.period == 31)].price") + " EUR"
Perióda 32
PARSEJSON(output, "$[?(@.period == 32)].price") + " EUR"
Perióda 33
PARSEJSON(output, "$[?(@.period == 33)].price") + " EUR"
Perióda 34
PARSEJSON(output, "$[?(@.period == 34)].price") + " EUR"
Perióda 35
PARSEJSON(output, "$[?(@.period == 35)].price") + " EUR"
Perióda 36
PARSEJSON(output, "$[?(@.period == 36)].price") + " EUR"
Perióda 37
PARSEJSON(output, "$[?(@.period == 37)].price") + " EUR"
Perióda 38
PARSEJSON(output, "$[?(@.period == 38)].price") + " EUR"
Perióda 39
PARSEJSON(output, "$[?(@.period == 39)].price") + " EUR"
Perióda 40
PARSEJSON(output, "$[?(@.period == 40)].price") + " EUR"
Perióda 41
PARSEJSON(output, "$[?(@.period == 41)].price") + " EUR"
Perióda 42
PARSEJSON(output, "$[?(@.period == 42)].price") + " EUR"
Perióda 43
PARSEJSON(output, "$[?(@.period == 43)].price") + " EUR"
Perióda 44
PARSEJSON(output, "$[?(@.period == 44)].price") + " EUR"
Perióda 45
PARSEJSON(output, "$[?(@.period == 45)].price") + " EUR"
Perióda 46
PARSEJSON(output, "$[?(@.period == 46)].price") + " EUR"
Perióda 47
PARSEJSON(output, "$[?(@.period == 47)].price") + " EUR"
Perióda 48
PARSEJSON(output, "$[?(@.period == 48)].price") + " EUR"
Perióda 49
PARSEJSON(output, "$[?(@.period == 49)].price") + " EUR"
Perióda 50
PARSEJSON(output, "$[?(@.period == 50)].price") + " EUR"
Perióda 51
PARSEJSON(output, "$[?(@.period == 51)].price") + " EUR"
Perióda 52
PARSEJSON(output, "$[?(@.period == 52)].price") + " EUR"
Perióda 53
PARSEJSON(output, "$[?(@.period == 53)].price") + " EUR"
Perióda 54
PARSEJSON(output, "$[?(@.period == 54)].price") + " EUR"
Perióda 55
PARSEJSON(output, "$[?(@.period == 55)].price") + " EUR"
Perióda 56
PARSEJSON(output, "$[?(@.period == 56)].price") + " EUR"
Perióda 57
PARSEJSON(output, "$[?(@.period == 57)].price") + " EUR"
Perióda 58
PARSEJSON(output, "$[?(@.period == 58)].price") + " EUR"
Perióda 59
PARSEJSON(output, "$[?(@.period == 59)].price") + " EUR"
Perióda 60
PARSEJSON(output, "$[?(@.period == 60)].price") + " EUR"
Perióda 61
PARSEJSON(output, "$[?(@.period == 61)].price") + " EUR"
Perióda 62
PARSEJSON(output, "$[?(@.period == 62)].price") + " EUR"
Perióda 63
PARSEJSON(output, "$[?(@.period == 63)].price") + " EUR"
Perióda 64
PARSEJSON(output, "$[?(@.period == 64)].price") + " EUR"
Perióda 65
PARSEJSON(output, "$[?(@.period == 65)].price") + " EUR"
Perióda 66
PARSEJSON(output, "$[?(@.period == 66)].price") + " EUR"
Perióda 67
PARSEJSON(output, "$[?(@.period == 67)].price") + " EUR"
Perióda 68
PARSEJSON(output, "$[?(@.period == 68)].price") + " EUR"
Perióda 69
PARSEJSON(output, "$[?(@.period == 69)].price") + " EUR"
Perióda 70
PARSEJSON(output, "$[?(@.period == 70)].price") + " EUR"
Perióda 71
PARSEJSON(output, "$[?(@.period == 71)].price") + " EUR"
Perióda 72
PARSEJSON(output, "$[?(@.period == 72)].price") + " EUR"
Perióda 73
PARSEJSON(output, "$[?(@.period == 73)].price") + " EUR"
Perióda 74
PARSEJSON(output, "$[?(@.period == 74)].price") + " EUR"
Perióda 75
PARSEJSON(output, "$[?(@.period == 75)].price") + " EUR"
Perióda 76
PARSEJSON(output, "$[?(@.period == 76)].price") + " EUR"
Perióda 77
PARSEJSON(output, "$[?(@.period == 77)].price") + " EUR"
Perióda 78
PARSEJSON(output, "$[?(@.period == 78)].price") + " EUR"
Perióda 79
PARSEJSON(output, "$[?(@.period == 79)].price") + " EUR"
Perióda 80
PARSEJSON(output, "$[?(@.period == 80)].price") + " EUR"
Perióda 81
PARSEJSON(output, "$[?(@.period == 81)].price") + " EUR"
Perióda 82
PARSEJSON(output, "$[?(@.period == 82)].price") + " EUR"
Perióda 83
PARSEJSON(output, "$[?(@.period == 83)].price") + " EUR"
Perióda 84
PARSEJSON(output, "$[?(@.period == 84)].price") + " EUR"
Perióda 85
PARSEJSON(output, "$[?(@.period == 85)].price") + " EUR"
Perióda 86
PARSEJSON(output, "$[?(@.period == 86)].price") + " EUR"
Perióda 87
PARSEJSON(output, "$[?(@.period == 87)].price") + " EUR"
Perióda 88
PARSEJSON(output, "$[?(@.period == 88)].price") + " EUR"
Perióda 89
PARSEJSON(output, "$[?(@.period == 89)].price") + " EUR"
Perióda 90
PARSEJSON(output, "$[?(@.period == 90)].price") + " EUR"
Perióda 91
PARSEJSON(output, "$[?(@.period == 91)].price") + " EUR"
Perióda 92
PARSEJSON(output, "$[?(@.period == 92)].price") + " EUR"
Perióda 93
PARSEJSON(output, "$[?(@.period == 93)].price") + " EUR"
Perióda 94
PARSEJSON(output, "$[?(@.period == 94)].price") + " EUR"
Perióda 95
PARSEJSON(output, "$[?(@.period == 95)].price") + " EUR"
Perióda 96
PARSEJSON(output, "$[?(@.period == 96)].price") + " EUR"
Prezzo attuale Variabile Solo lettura

Prezzo spot per il periodo orario corrente in EUR/MWh — determinato dinamicamente dall'array dei prezzi in base all'ora corrente

numeric Unità: EUR json_path

Prezzo attuale

Lettura
var prices := PARSEJSON(output, "$..price");
VAR date := NOW();
var periodHour := LENGTH(prices) / 24;	
var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);

GETAT(prices, actualperiod)
Classifica del periodo attuale Variabile Solo lettura

Posizione del prezzo dell'ora corrente tra tutti i periodi (1 = ora più economica del giorno)

numeric json_path

Classifica del periodo attuale

Lettura
var prices := PARSEJSON(output, "$..price");
var byPrice := ORDERINDEX(prices);
VAR date := NOW();
var periodHour := LENGTH(prices) / 24;	
var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);

INDEXOF(byPrice, actualperiod) + 1
Classifica del periodo attuale nella finestra temporale Variabile Solo lettura

Posizione del prezzo dell'ora corrente all'interno di una finestra temporale Da–A definita dall'utente — restituisce NaN fuori dalla finestra

numeric json_path

Classifica del periodo attuale nella finestra temporale

Lettura
VAR date := NOW();
IF date.hour < From or date.hour > To or From >= To
	RETURN(NaN);
ELSE
	var prices := PARSEJSON(output, "$..price");
	var periodHour := LENGTH(prices) / 24;
	var windowPrices := COPY(prices, From * periodHour, (To - From) * periodHour);
	var byPrice := ORDERINDEX(windowPrices);
	
	var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);

	RETURN(INDEXOF(byPrice, actualperiod - From * periodHour) +1);
END
Prezzo più alto del giorno Variabile Solo lettura

Prezzo spot massimo su tutti i periodi disponibili (EUR/MWh)

numeric Unità: EUR json_path

Prezzo più alto del giorno

Lettura
var prices := PARSEJSON(output, "$..price");
GETAT(ORDERDESC(prices), 0)
Prezzo più alto nella finestra temporale Variabile Solo lettura

Prezzo spot massimo all'interno della finestra temporale Da–A definita dall'utente (EUR/MWh)

numeric Unità: EUR json_path

Prezzo più alto nella finestra temporale

Lettura
VAR date := NOW();
IF From >= To
	RETURN(NaN);
ELSE
	var prices := PARSEJSON(output, "$..price");
	var periodHour := LENGTH(prices) / 24;	
	var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);
	var windowPrices := COPY(prices, From * periodHour, (To - From) * periodHour);
	var byPrice := ORDERDESC(windowPrices);

	RETURN(GETAT(byPrice, 0));
END
Prezzo più basso del giorno Variabile Solo lettura

Prezzo spot minimo su tutti i periodi disponibili (EUR/MWh)

numeric Unità: EUR json_path

Prezzo più basso del giorno

Lettura
var prices := PARSEJSON(output, "$..price");
GETAT(ORDER(prices), 0)
Prezzo più basso nella finestra temporale Variabile Solo lettura

Prezzo spot minimo all'interno della finestra temporale Da–A definita dall'utente (EUR/MWh)

numeric Unità: EUR json_path

Prezzo più basso nella finestra temporale

Lettura
VAR date := NOW();
IF From >= To
	RETURN(NaN);
ELSE
	var prices := PARSEJSON(output, "$..price");
	var periodHour := LENGTH(prices) / 24;	
	#var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);
	var windowPrices := COPY(prices, From * periodHour, (To - From) * periodHour);
	var byPrice := ORDER(windowPrices);

	RETURN(GETAT(byPrice, 0));
END
Periodo più economico del giorno Variabile Solo lettura

Numero di periodo basato su 1 dell'ora più economica del giorno (es. 3 = 02:00–03:00)

numeric json_path

Periodo più economico del giorno

Lettura
var prices := PARSEJSON(output, "$..price");
GETAT(ORDERINDEX(prices), 0) +1
Periodo rimanente più economico Variabile Solo lettura

Numero di periodo basato su 1 dell'ora più economica dall'ora corrente in poi

numeric json_path

Periodo rimanente più economico

Lettura
var prices := PARSEJSON(output, "$..price");
VAR date := NOW();
var periodHour := LENGTH(prices) / 24;	
var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);
var remainingPrices := COPY(prices, actualperiod, LENGTH(prices) - actualperiod);
var byPrice := ORDERINDEX(remainingPrices);

GETAT(byPrice, 0) + actualperiod +1
Conteggio periodi Variabile Solo lettura

Numero totale di periodi di prezzo orari disponibili nella risposta API (tipicamente 24 o 72)

numeric json_path

Conteggio periodi

Lettura
var prices := PARSEJSON(output, "$..price");
LENGTH(prices);
Conteggio periodi nella finestra temporale Variabile Solo lettura

Numero di periodi di prezzo orari all'interno della finestra temporale Da–A definita dall'utente

numeric json_path

Conteggio periodi nella finestra temporale

Lettura
VAR date := NOW();
IF From >= To
	RETURN(NaN);
ELSE
	var prices := PARSEJSON(output, "$..price");
	var periodHour := LENGTH(prices) / 24;
	var windowPrices := COPY(prices, From * periodHour, (To - From) * periodHour);

	RETURN(LENGTH(windowPrices));
END
Prezzo medio del giorno Variabile Solo lettura

Media aritmetica di tutti i prezzi dei periodi disponibili (EUR/MWh)

numeric Unità: EUR json_path

Prezzo medio del giorno

Lettura
var prices := PARSEJSON(output, "$..price");
AVG(prices)
Prezzo medio nella finestra temporale Variabile Solo lettura

Media aritmetica dei prezzi spot all'interno della finestra temporale Da–A definita dall'utente (EUR/MWh)

numeric Unità: EUR json_path

Prezzo medio nella finestra temporale

Lettura
VAR date := NOW();
IF From >= To
	RETURN(NaN);
ELSE
	var prices := PARSEJSON(output, "$..price");
	var periodHour := LENGTH(prices) / 24;	
	#var actualperiod := FLOOR(((date.hour * 60) + date.minute) * periodHour / 60);
	var windowPrices := COPY(prices, From * periodHour, (To - From) * periodHour);

	RETURN(AVG(windowPrices));
END
Connessione: Packet Parser → HTTP