TapHome
Community Beta · non verificato Energia e misura

SpotLogic – battery optimisation over the spot market (HTTP API)

SpotLogic è un servizio cloud che pianifica quando una batteria fotovoltaica si carica, copre i consumi della casa o vende in rete in base ai prezzi spot. Il template legge via HTTPS il comando per l'intervallo corrente (0–7), lo stato di carica obiettivo, il comando successivo e l'età del piano, e invia la telemetria della batteria ogni 2 minuti. Le serie di produzione fotovoltaica, consumi e prezzi le fornisce l'installatore; l'inverter è comandato da smart rule proprie.

SpotLogicPacket Parser → HTTP6 dispositiviRevisione 1.1 Ultimo aggiornamento: 10 novembre 2026

Inviato da Adam Pelikán

Importa nell'app TapHomeHardware › Packet Parser › Aggiungi da modello

Scarica template
In questa pagina

Guida all'integrazione

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:

ValoreDa dove provieneUnità
Capacità della batteriascheda tecnica della batteria; deve essere maggiore di 0kWh
Potenza massima della batteriaun unico valore per carica e scaricakW
Potenza massima di prelievo dalla retetaglia dell’interruttore generale; 0 significa che l’impianto non preleva maikW
Potenza massima di immissione in retelimite di immissione della connessione alla rete; 0 significa che l’impianto non immette maikW
Soglia minima rigida della batteriastato di carica più basso consentito dal produttore dell’inverter, predefinito 10%
Riserva della batteriariserva 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.cz sulla 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:

ParametroSignificatoUnità
PLC ID, access tokendall’e-mail di attivazione—
Time zonenome IANA, predefinito Europe/Prague; da esso derivano i confini dei giorni del piano—
Battery capacitydeve essere maggiore di 0kWh
Battery max powerun unico valore per carica e scaricakW
Max grid import / export power0 significa che l’impianto non preleva mai / non immette maikW
Max state of chargesolo registrato da SpotLogic, il pianificatore attuale non lo applica%
Hard battery floorsoglia 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):
ValoreValore TapHomeNome SpotLogicSignificato
0No planno_planNessun piano utilizzabile: mantieni l’inverter nella sua modalità sicura
1Self-useself_useAutoconsumo: carica dal surplus fotovoltaico, scarica per coprire i consumi della casa
2Force chargeforce_chargeCarica la batteria alla massima potenza
3Force discharge to gridforce_dischargeScarica la batteria in rete alla massima potenza
4Self-use, no dischargingself_use_ChargeOnlyAutoconsumo, carica consentita, scarica vietata
5Self-use, no chargingself_use_DischargeOnlyAutoconsumo, scarica consentita, carica vietata
6Stop PV (reserved)stopPVRiservato: il pianificatore attuale non lo emette
7Grid charge without PV (reserved)ChargeMaxNoPVRiservato: 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_DischargeOnly la 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 moduloContenutoContratto
PvForecastTod, PvForecastTomproduzione fotovoltaica oggi / domani, kWh per oraoraria, senza buchi, dall’ora corrente alla fine di domani
LoadForecastTod, LoadForecastTomconsumi della casa oggi / domani, kWh per oracome sopra
PriceImp, PriceExpprezzo di prelievo / immissione, CZK/kWhcadenza 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

SintomoCausa e soluzione
Il comando resta su No planNon è 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 422La 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 401PLC 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 crescereLa 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 502Errore 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 sbagliateL’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.

Dispositivi disponibili 6

Questi dispositivi compaiono in TapHome dopo l'importazione.

SpotLogic Modulo
Attributi di servizio
Last telemetry upload
Plan recompute interval
Plan computed at
Plan run
API version
Variabili personalizzate
PlcId (string)
Token (string)
TimeZone (string)
BatCapacity (string)
BatPmax (string)
GridImportPmax (string)
GridExportPmax (string)
SocMax (string)
SocHardMin (string)
SocNow (numeric) = -1
SocMin (numeric) = 10
PvForecastTod (string) = []
PvForecastTom (string) = []
LoadForecastTod (string) = []
LoadForecastTom (string) = []
PriceImp (string) = []
PriceExp (string) = []
DispatchJson (string)
DispatchCode (numeric)
OptimizeJson (string)
OptimizeCode (numeric)
OptimizeAt (string)
LastOptimizeUnix (numeric)

SpotLogic

Lettura (modulo)
# =============================================================================
#  STATUS: WORKING, BUT THE DATA MUST BE BROUGHT IN BY HAND
# =============================================================================
#  The integration itself works - dispatch reading, action_id -> inverter mode
#  mapping, next command, plan diagnostics and error reporting are finished.
#  What it needs is the data: six series (PV forecast, load forecast, import and
#  export spot price; ~500 values, hourly or 15-minute, horizon now -> end of
#  tomorrow) as JSON text [[unix_ts, value], ...] in the module variables
#  PvForecastTod ... PriceExp (see below).
#  Until TapHome ships a shared variable between scripts, those series must be
#  collected from other scripts and handed over through hundreds of helper
#  devices - that is why the integration is only really practical once that
#  feature lands.
#  Tracking: https://taphome.com/cs/ideas/script-data-http/  (TapHome idea FR-003)
#  In the meantime: fill the six variables below and the template works as is.
# =============================================================================

# 1) GET /api/v1/dispatch - the command for the slot in progress (module poll ~20 s).
#    plc_id and token travel ONLY in the query string (SpotLogic contract).
VAR r := SENDHTTPREQUEST("/api/v1/dispatch?plc_id=" + PlcId + "&token=" + Token);
DispatchCode := r.StatusCode;
DispatchJson := r.Content;
IF r.StatusCode = 401
    ADDERROR(1, "SpotLogic rejected the PLC ID or the token (HTTP 401) - check the module variables PlcId and Token; the subscription may have expired. Not retried by SpotLogic rules, fix the credentials.");
ELSEIF r.StatusCode != 200 AND r.StatusCode != 404
    VAR dmsg := PARSEJSON(r.Content, "$.message", true);
    ADDERROR(2, "SpotLogic dispatch failed: HTTP " + r.StatusCode + IF(ISNULL(dmsg), "", " " + dmsg));
END

# 2) POST /api/v1/optimize - telemetry, at most every ~2 min (SpotLogic asks for no more often).
datetime now := NOW();
VAR nowUnix := now.UNIXTIME;
IF nowUnix - LastOptimizeUnix >= 115
    LastOptimizeUnix := nowUnix;
    VAR cap := TODOUBLE(REPLACE(BatCapacity, ",", "."));
    VAR bp := TODOUBLE(REPLACE(BatPmax, ",", "."));
    VAR gi := TODOUBLE(REPLACE(GridImportPmax, ",", "."));
    VAR ge := TODOUBLE(REPLACE(GridExportPmax, ",", "."));
    VAR smax := TODOUBLE(SocMax);
    VAR shard := TODOUBLE(SocHardMin);
    IF SocNow < 0 OR SocNow > 100
        OptimizeCode := -1;
    ELSEIF ISNAN(cap) OR ISNAN(bp) OR ISNAN(gi) OR ISNAN(ge) OR ISNAN(smax) OR ISNAN(shard) OR LENGTH(PlcId) = 0 OR LENGTH(Token) = 0
        OptimizeCode := -2;
    ELSE
        # Forecast and price series: module variables PvForecastTod, PvForecastTom,
        # LoadForecastTod, LoadForecastTom, PriceImp, PriceExp hold JSON text
        # [[unix_ts, value], ...]. The template does NOT fill them - see the banner
        # at the top of this script. Until they are filled, SpotLogic answers 422.
        VAR body := "{\"PLCtype\":\"taphome\"";
        body := body + ",\"TimeZone\":\"" + TimeZone + "\"";
        body := body + ",\"TimeStampUnix\":" + TOSTRING(nowUnix, "F0");
        body := body + ",\"BatCapacity\":" + TOSTRING(cap, "F2");
        body := body + ",\"BatPmax\":" + TOSTRING(bp, "F2");
        body := body + ",\"GridImportPmax\":" + TOSTRING(gi, "F2");
        body := body + ",\"GridExportPmax\":" + TOSTRING(ge, "F2");
        body := body + ",\"SOCnow\":" + TOSTRING(SocNow, "F0");
        body := body + ",\"SOCmin\":" + TOSTRING(SocMin, "F0");
        body := body + ",\"SOCmax\":" + TOSTRING(smax, "F0");
        body := body + ",\"SOChardmin\":" + TOSTRING(shard, "F0");
        body := body + ",\"PvForecastTod\":" + PvForecastTod;
        body := body + ",\"PvForecastTom\":" + PvForecastTom;
        body := body + ",\"LoadForecastTod\":" + LoadForecastTod;
        body := body + ",\"LoadForecastTom\":" + LoadForecastTom;
        body := body + ",\"PriceImp\":" + PriceImp;
        body := body + ",\"PriceExp\":" + PriceExp + "}";
        VAR o := SENDHTTPREQUEST("/api/v1/optimize?plc_id=" + PlcId + "&token=" + Token, "POST", body, "Content-Type: application/json");
        OptimizeCode := o.StatusCode;
        OptimizeJson := o.Content;
        OptimizeAt := TOSTRING(now, "yyyy-MM-dd HH:mm:ss");
    END
END

# The outcome of the last telemetry upload is reported on every run, not only on the upload run.
VAR omsg := "";
IF LENGTH(OptimizeJson) > 0
    omsg := PARSEJSON(OptimizeJson, "$.message", true);
    IF ISNULL(omsg)
        omsg := "";
    END
END
IF OptimizeCode = -1
    ADDWARNING(3, "Telemetry not sent: the device Battery state of charge (input) has no value 0-100 yet - write it from the inverter with a smart rule.");
ELSEIF OptimizeCode = -2
    ADDWARNING(7, "Telemetry not sent: fill the module variables PlcId, Token, BatCapacity, BatPmax, GridImportPmax, GridExportPmax, SocMax and SocHardMin (numbers with a decimal point).");
ELSEIF OptimizeCode = 401
    ADDERROR(4, "SpotLogic rejected the telemetry: PLC ID or token invalid (HTTP 401).");
ELSEIF OptimizeCode = 422
    ADDERROR(5, "SpotLogic rejected the telemetry (HTTP 422): " + omsg + " - the forecast and price series (module variables PvForecastTod ... PriceExp) must be filled, see the template description.");
ELSEIF OptimizeCode != 0 AND OptimizeCode != 202
    ADDERROR(6, "SpotLogic telemetry upload failed: HTTP " + OptimizeCode + " " + omsg);
END
Attributi di servizio
Last telemetry upload
IF(OptimizeCode = 0, "not sent yet", IF(OptimizeCode < 0, "waiting for inputs", "HTTP " + OptimizeCode + " at " + OptimizeAt))
Plan recompute interval
VAR v := PARSEJSON(OptimizeJson, "$.data.recompute_interval_sec", true);
IF ISNULL(v)
    RETURN("-");
END
RETURN(TOSTRING(v, "F0") + " s");
Plan computed at
VAR s := PARSEJSON(DispatchJson, "$.meta.plan_created_at", true);
IF ISNULL(s)
    RETURN("-");
END
datetime t := DATETIME(s);
VAR l := t.LOCALDATETIME;
RETURN(TOSTRING(l, "yyyy-MM-dd HH:mm"));
Plan run
VAR v := PARSEJSON(DispatchJson, "$.meta.run_id", true);
RETURN(IF(ISNULL(v), "-", v));
API version
VAR v := PARSEJSON(DispatchJson, "$.meta.version.api", true);
RETURN(IF(ISNULL(v), "-", v));
SpotLogic command Interruttore multivalore
Valori / Stati: No plan · Self-use · Force charge · Force discharge to grid · Self-use, no discharging · Self-use, no charging · Stop PV (reserved) · Grid charge without PV (reserved)

SpotLogic command

Lettura stato interruttore
IF DispatchCode = 0
    RETURN(NaN);
END
IF DispatchCode = 401
    ADDERROR(1, "SpotLogic rejected the PLC ID or the token (HTTP 401) - check the module variables PlcId and Token.");
    RETURN(NaN);
END
IF DispatchCode = 404
    ADDINFO(2, "No usable plan yet (no_plan) - keep the inverter in its own safe mode.");
    RETURN(0);
END
IF DispatchCode != 200
    ADDERROR(3, "Command not available: HTTP " + DispatchCode);
    RETURN(NaN);
END
VAR id := PARSEJSON(DispatchJson, "$.data.command.action_id", true);
IF ISNULL(id)
    ADDERROR(4, "Unexpected SpotLogic answer: data.command.action_id is missing.");
    RETURN(NaN);
END
RETURN(id);
Attributi di servizio
Command name
VAR v := PARSEJSON(DispatchJson, "$.data.command.action_name", true);
IF ISNULL(v)
    v := PARSEJSON(DispatchJson, "$.data.action_name", true);
END
RETURN(IF(ISNULL(v), "-", v));
Command valid until
VAR s := PARSEJSON(DispatchJson, "$.data.command.valid_until", true);
IF ISNULL(s)
    RETURN("-");
END
datetime t := DATETIME(s);
VAR l := t.LOCALDATETIME;
RETURN(TOSTRING(l, "yyyy-MM-dd HH:mm"));
SpotLogic target state of charge Variabile

SpotLogic target state of charge

Lettura
IF DispatchCode = 0
    RETURN(NaN);
END
IF DispatchCode = 401
    ADDERROR(1, "SpotLogic rejected the PLC ID or the token (HTTP 401) - check the module variables PlcId and Token.");
    RETURN(NaN);
END
IF DispatchCode != 200
    RETURN(NaN);
END
VAR v := PARSEJSON(DispatchJson, "$.data.command.target_soc_percent", true);
IF ISNULL(v)
    RETURN(NaN);
END
RETURN(v);
SpotLogic next command Interruttore multivalore
Valori / Stati: No plan · Self-use · Force charge · Force discharge to grid · Self-use, no discharging · Self-use, no charging · Stop PV (reserved) · Grid charge without PV (reserved)

SpotLogic next command

Lettura stato interruttore
IF DispatchCode = 0
    RETURN(NaN);
END
IF DispatchCode = 401
    ADDERROR(1, "SpotLogic rejected the PLC ID or the token (HTTP 401) - check the module variables PlcId and Token.");
    RETURN(NaN);
END
IF DispatchCode = 404
    RETURN(0);
END
IF DispatchCode != 200
    ADDERROR(3, "Next command not available: HTTP " + DispatchCode);
    RETURN(NaN);
END
VAR id := PARSEJSON(DispatchJson, "$.data.context.next_action_id", true);
IF ISNULL(id)
    RETURN(NaN);
END
RETURN(id);
Attributi di servizio
Next command name
VAR v := PARSEJSON(DispatchJson, "$.data.context.next_action_name", true);
RETURN(IF(ISNULL(v), "-", v));
Next command starts
VAR s := PARSEJSON(DispatchJson, "$.data.context.next_action_time", true);
IF ISNULL(s)
    RETURN("-");
END
datetime t := DATETIME(s);
VAR l := t.LOCALDATETIME;
RETURN(TOSTRING(l, "yyyy-MM-dd HH:mm"));
SpotLogic plan age Variabile

SpotLogic plan age

Lettura
IF DispatchCode = 0
    RETURN(NaN);
END
IF DispatchCode = 401
    ADDERROR(1, "SpotLogic rejected the PLC ID or the token (HTTP 401) - check the module variables PlcId and Token.");
    RETURN(NaN);
END
IF DispatchCode != 200
    RETURN(NaN);
END
VAR v := PARSEJSON(DispatchJson, "$.meta.plan_age_sec", true);
IF ISNULL(v)
    RETURN(NaN);
END
RETURN(v);
Battery state of charge (input) Variabile

Battery state of charge (input)

Lettura
IF(SocNow < 0, NaN, SocNow)
Scrittura
SocNow := Va;
Battery reserve for SpotLogic Variabile

Battery reserve for SpotLogic

Lettura
RETURN(SocMin);
Scrittura
SocMin := Va;
Connessione: Packet Parser → HTTP

Parametri di importazione

Inserisci questi valori quando importi l'XML.

Richiesto nell'appPredefinito
SpotLogic PLC ID (from the activation e-mail)Da inserire all'importazione
SpotLogic access token (from the activation e-mail, secret)Da inserire all'importazione
Time zone (IANA name)Europe/Prague
Battery capacity [kWh]Da inserire all'importazione
Battery max charge and discharge power [kW]Da inserire all'importazione
Max grid import power [kW] (0 = never import)Da inserire all'importazione
Max grid export power [kW] (0 = never export)Da inserire all'importazione
Max state of charge [%] (recorded only)100
Hard battery floor from the inverter manufacturer [%]10

Hai trovato un problema con questo template?

Dicci cosa non funziona, cosa manca o come dovrebbe comportarsi il template. Il tuo feedback ci aiuta a mantenere il catalogo accurato.

Modello · portale TapHome SpotLogic – battery optimisation over the spot market (HTTP API) Apri questo template nel Customer Portal per applicarlo a una delle tue case, o crea una proposta di modifica e inviala al catalogo. Packet Parser → HTTP Vedi nel portale TapHome