SpotLogic è un servizio cloud che calcola un piano di carica e scarica per una batteria fotovoltaica in base al mercato elettrico spot. È un servizio di calcolo, non una fonte di dati: l’unità di controllo invia la telemetria della batteria insieme alla previsione della produzione fotovoltaica, alla previsione dei consumi della casa e ai prezzi di prelievo e di immissione, e SpotLogic risponde con il comando per l’intervallo di tempo corrente. Questo template collega TapHome all’API SpotLogic tramite HTTPS (spotlogic.cz, porta 443) con un modulo HTTP Packet Parser. Il template legge il comando e invia la telemetria; non comanda l’inverter: il comando viene collegato all’inverter con le smart rule dell’installatore.
Non c’è nulla da cablare. Mettere in funzione il servizio significa attivare SpotLogic per l’impianto, raccogliere i parametri della batteria e della rete, dare all’unità di controllo l’accesso a Internet in uscita e preparare le serie di previsioni e prezzi.
SpotLogic richiede le serie di previsioni e prezzi in ogni invio della telemetria (produzione fotovoltaica e consumi della casa per oggi e domani, prezzi di prelievo e di immissione). Questo template non può compilarle da solo: vedi Serie di previsioni e prezzi. Finché non sono compilate, SpotLogic rifiuta la telemetria con HTTP 422, non calcola alcun piano e il comando resta su No plan.
Configurazione
1. Attiva SpotLogic e conserva le credenziali
SpotLogic invia il PLC ID e il token di accesso via e-mail all’attivazione del dispositivo. Il token è segreto, legato a un solo PLC ID e valido per il periodo dell’abbonamento. Entrambi viaggiano solo nella query string di ogni richiesta (?plc_id=…&token=…), come richiede il contratto SpotLogic, e mai nel corpo della richiesta.
Tieni il token fuori da documenti condivisi e repository pubblici. Una coppia PLC ID e token errata, un token non valido o un abbonamento scaduto terminano tutti con HTTP 401, e SpotLogic di proposito non dice quale dei tre casi si è verificato.
2. Raccogli i parametri della batteria e della rete
SpotLogic pianifica solo con i numeri che riceve nella telemetria. Prima dell’importazione cercali nella documentazione dell’inverter e della batteria e nel contratto di connessione alla rete:
| Valore | Da dove proviene | Unità |
|---|---|---|
| Capacità della batteria | scheda tecnica della batteria; deve essere maggiore di 0 | kWh |
| Potenza massima della batteria | un unico valore per carica e scarica | kW |
| Potenza massima di prelievo dalla rete | taglia dell’interruttore generale; 0 significa che l’impianto non preleva mai | kW |
| Potenza massima di immissione in rete | limite di immissione della connessione alla rete; 0 significa che l’impianto non immette mai | kW |
| Soglia minima rigida della batteria | stato di carica più basso consentito dal produttore dell’inverter, predefinito 10 | % |
| Riserva della batteria | riserva da cui il piano non vende mai in rete (ad esempio per consumi imprevedibili), predefinito 10 | % |
Anche lo stato di carica attuale della batteria deve essere disponibile in TapHome, di solito dall’integrazione dell’inverter stesso, così che una smart rule possa scriverlo in questo template (vedi Invio della telemetria più sotto).
3. Rete e orologio dell’unità di controllo
- L’unità di controllo ha bisogno di accesso a Internet in uscita tramite HTTPS verso
spotlogic.czsulla porta 443. SpotLogic non si collega all’unità di controllo: le serie di previsioni e prezzi viaggiano nel corpo dell’invio della telemetria, quindi non serve aprire alcuna porta in ingresso. - La telemetria riporta l’ora di invio presa dall’orologio dell’unità di controllo, e SpotLogic costruisce da essa la finestra del piano. Qualche minuto di scarto non crea problemi; ore di scarto spostano l’intero piano sugli intervalli sbagliati. Mantieni corretto l’orologio dell’unità di controllo.
- Il fuso orario (nome IANA, ad esempio
Europe/Prague) decide dove finisce “oggi” e dove inizia “domani”. Inserisci il fuso orario dell’impianto.
4. Parametri di importazione
Il template si importa nell’interfaccia Packet Parser dell’app TapHome e durante l’importazione si compilano i seguenti parametri:
| Parametro | Significato | Unità |
|---|---|---|
| PLC ID, access token | dall’e-mail di attivazione | — |
| Time zone | nome IANA, predefinito Europe/Prague; da esso derivano i confini dei giorni del piano | — |
| Battery capacity | deve essere maggiore di 0 | kWh |
| Battery max power | un unico valore per carica e scarica | kW |
| Max grid import / export power | 0 significa che l’impianto non preleva mai / non immette mai | kW |
| Max state of charge | solo registrato da SpotLogic, il pianificatore attuale non lo applica | % |
| Hard battery floor | soglia minima del produttore dell’inverter, predefinito 10 | % |
I numeri si scrivono con il punto decimale (la virgola viene convertita). Il PLC ID e il token vengono salvati nelle variabili del modulo PlcId e Token. Tutti i valori restano modificabili anche in seguito come variabili del modulo.
5. Verifica delle credenziali
La documentazione interattiva dell’API SpotLogic (su spotlogic.cz sotto /docs) ha una finestra Authorize per il PLC ID e il token, e il suo esempio di telemetria TapHome è completo: con credenziali valide SpotLogic lo accetta con HTTP 202. Prima aggiorna l’ora di invio (TimeStampUnix) all’ora attuale. I dati di esempio accettati vengono conservati per un piano come la telemetria reale, quindi questa verifica va fatta prima di collegare il comando all’inverter.
Anche una risposta HTTP 422 su un orizzonte di previsione incompleto dimostra che il PLC ID e il token sono corretti: un token errato dà HTTP 401.
Funzionalità del dispositivo
Lettura del comando (ogni 20 s)
Il modulo interroga GET /api/v1/dispatch ogni 20 secondi e i dispositivi analizzano la risposta:
- SpotLogic command — comando per l’intervallo in corso (
action_id):
| Valore | Valore TapHome | Nome SpotLogic | Significato |
|---|---|---|---|
| 0 | No plan | no_plan | Nessun piano utilizzabile: mantieni l’inverter nella sua modalità sicura |
| 1 | Self-use | self_use | Autoconsumo: carica dal surplus fotovoltaico, scarica per coprire i consumi della casa |
| 2 | Force charge | force_charge | Carica la batteria alla massima potenza |
| 3 | Force discharge to grid | force_discharge | Scarica la batteria in rete alla massima potenza |
| 4 | Self-use, no discharging | self_use_ChargeOnly | Autoconsumo, carica consentita, scarica vietata |
| 5 | Self-use, no charging | self_use_DischargeOnly | Autoconsumo, scarica consentita, carica vietata |
| 6 | Stop PV (reserved) | stopPV | Riservato: il pianificatore attuale non lo emette |
| 7 | Grid charge without PV (reserved) | ChargeMaxNoPV | Riservato: il pianificatore attuale non lo emette |
Gli attributi di servizio mostrano il nome del comando e quando il comando termina (ora locale).
- SpotLogic target state of charge — stato di carica (%) che il piano prevede alla fine dell’intervallo. Interrompi la carica o la scarica forzata quando la batteria lo raggiunge; in autoconsumo non caricare oltre questo valore. SpotLogic aggiunge che con
self_use_DischargeOnlyla batteria non dovrebbe scaricarsi al di sotto di esso. Il valore è un risultato del piano, non un setpoint da imporre, e può essere temporaneamente inferiore alla riserva della batteria dopo che la casa ha consumato la riserva. - SpotLogic next command — il comando dell’intervallo successivo, con l’ora di inizio come attributo di servizio.
- SpotLogic plan age — età del piano servito in secondi. Può comandare una smart rule di riserva: quando supera di molto l’intervallo di ricalcolo, il piano non viene più ricalcolato.
La risposta HTTP 404 no_plan non è un errore: il comando è 0 e il dispositivo mostra un messaggio informativo. In questo stato SpotLogic chiede di passare alla modalità sicura dell’inverter e di non ripetere mai a memoria l’ultimo comando noto. HTTP 401 (PLC ID o token errati, abbonamento scaduto) imposta un errore sui dispositivi e sul modulo; SpotLogic chiede di non ripetere tali chiamate, quindi correggi le credenziali.
Invio della telemetria (circa ogni 2 minuti)
Il modulo invia POST /api/v1/optimize con PLCtype: "taphome" al massimo ogni 2 minuti. Invia l’ora di invio, il fuso orario, i parametri della batteria e della rete e due valori dai dispositivi:
- Battery state of charge (input) — scrivi con una smart rule lo stato di carica attuale 0–100 % dall’inverter (se il template dell’inverter fornisce 0–1, moltiplica per 100). Il valore viene arrotondato a un percento intero, perché SpotLogic rifiuta i valori frazionari. Finché il dispositivo non ha un valore, non viene inviato nulla e il modulo mostra un avviso.
- Battery reserve for SpotLogic — la riserva
SOCmin, predefinita 10 %: il livello da cui il piano non vende mai in rete.
Gli attributi di servizio del modulo mostrano il risultato dell’ultimo invio, l’intervallo di ricalcolo indicato da SpotLogic (predefinito 900 s), quando è stato calcolato il piano, l’esecuzione del piano e la versione dell’API. Un invio rifiutato (HTTP 422) è un errore del modulo con il messaggio restituito da SpotLogic. La risposta all’invio non contiene mai il piano: SpotLogic lo calcola in background e il modulo lo recupera alla successiva lettura del comando.
Serie di previsioni e prezzi
SpotLogic si aspetta sei serie nel corpo, ciascuna come coppie [unix_ts, value]:
| Variabile del modulo | Contenuto | Contratto |
|---|---|---|
PvForecastTod, PvForecastTom | produzione fotovoltaica oggi / domani, kWh per ora | oraria, senza buchi, dall’ora corrente alla fine di domani |
LoadForecastTod, LoadForecastTom | consumi della casa oggi / domani, kWh per ora | come sopra |
PriceImp, PriceExp | prezzo di prelievo / immissione, CZK/kWh | cadenza costante (oraria o 15 minuti), basta oggi, prezzi negativi ammessi |
Le variabili contengono le serie come testo JSON, ad esempio [[1788645600,0.0],[1788649200,0.42]], e vengono inserite nel corpo senza modifiche; il valore predefinito [] è una serie vuota. L’integrazione in sé funziona: ciò che le serve sono i dati. TapHome non può ancora condividere un unico testo JSON tra gli script, e uno script di smart rule non può inviare richieste HTTP. Le sei serie, circa 500 valori in tutto, devono quindi essere raccolte da altri script (ad esempio un template di previsione o di prezzi spot) e passate a questo modulo tramite centinaia di dispositivi ausiliari, oppure costruite nello script di lettura del modulo stesso. L’integrazione diventerà davvero pratica quando TapHome aggiungerà una variabile di testo condivisa tra gli script — vedi l’idea Variabile di testo e HTTP dagli script delle smart rule. Fino ad allora, compila le sei variabili e il template funziona così com’è. Lo script lo spiega in un commento all’inizio e nel punto in cui le serie vengono inserite.
La provenienza dei dati spetta all’installatore; SpotLogic indica queste fonti tipiche:
- Produzione fotovoltaica — un servizio di previsione fotovoltaica alimentato con posizione, orientamento e inclinazione dei pannelli e potenza installata, oppure il cloud del produttore dell’inverter.
- Consumi della casa — lo storico dell’impianto stesso: per iniziare basta il consumo orario mediato per ora del giorno e tipo di giorno (feriale, fine settimana, festivo).
- Prezzi — il prezzo spot ricalcolato secondo il contratto di fornitura (prelievo, ad esempio spot più un margine) e secondo il contratto di vendita dell’energia in eccesso (immissione).
Un giorno con cambio dell’ora legale ha 23 o 25 ore, quindi una serie completa di produzione o consumi ha 47, 48 o 49 valori. I campioni più vecchi di un’ora prima dell’ora corrente vengono tagliati, così come quelli oltre la fine di domani; una serie che termina prima della fine di domani viene rifiutata.
Risoluzione dei problemi
| Sintomo | Causa e soluzione |
|---|---|
| Il comando resta su No plan | Non è ancora stato calcolato alcun piano, oppure la telemetria viene rifiutata. Controlla l’errore del modulo e l’attributo di servizio Last telemetry upload. Anche un piano più vecchio di 60 minuti non viene servito. Dopo il primo invio accettato il piano può richiedere un po’ di tempo, almeno un intervallo di ricalcolo. |
| Errore del modulo HTTP 422 | La telemetria viola il contratto dati SpotLogic; il messaggio indica quale parte. Il più delle volte mancano le serie di previsioni o prezzi, oppure non coprono il periodo fino alla fine di domani. |
| Errore HTTP 401 | PLC ID e token non corrispondono oppure l’abbonamento è scaduto. Correggi le variabili del modulo PlcId e Token. |
| Avviso “Telemetry not sent” | Lo stato di carica non è ancora stato scritto, oppure un parametro della batteria o della rete è vuoto. |
| L’età del piano continua a crescere | La nuova telemetria non raggiunge SpotLogic oppure le sue fonti di dati non funzionano; l’ultimo piano valido resta in vigore finché non ha 60 minuti. |
| Errore HTTP 500 o 502 | Errore del server o fonte di dati guasta lato SpotLogic; l’ultimo piano valido resta in vigore. SpotLogic consiglia di ripetere entrambe le richieste con ritardi crescenti; il modulo ripete semplicemente entrambe le richieste all’interrogazione successiva. |
| Il piano comanda le ore sbagliate | L’orologio dell’unità di controllo o il fuso orario è errato: la finestra del piano viene costruita dall’ora di invio e dal fuso orario dichiarato. |