---
title: "SpotLogic – battery optimisation over the spot market (HTTP API)"
description: "API SpotLogic u oblaku preko HTTPS-a: čita naredbu baterije za spot tržište, ciljno punjenje i starost plana; šalje telemetriju. Potrebne su prognoze."
url: "https://taphome.com/hr/compatibility/spotlogic-energy-optimizer-http/"
language: hr
lastmod: 2026-11-10
generator: hugo
ai:
  topics: ["http","cloud-api","data-service","energy-management","battery-storage","spot-prices","photovoltaic"]
  questions: ["Kako integrirati SpotLogic sa sustavom TapHome?","Što predložak SpotLogic za TapHome čita i šalje?","Kako povezati TapHome s API-jem usluge SpotLogic preko HTTPS-a?","Gdje mogu dobiti PLC ID i pristupni token za SpotLogic?","Zašto naredba SpotLogic ostaje na No plan?","Zašto SpotLogic odbija telemetriju s HTTP 422?","Koje serije prognoza i cijena SpotLogic treba od sustava TapHome?","Upravlja li predložak SpotLogic izravno izmjenjivačem?"]
---

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

Komunikacija: Packet Parser → HTTP

## Upute za integraciju

SpotLogic je usluga u oblaku koja izračunava plan punjenja i pražnjenja baterije fotonaponskog sustava prema spot tržištu električne energije. To je usluga izračuna, a ne izvor podataka: centralna jedinica šalje telemetriju baterije zajedno s predviđanjem proizvodnje solarne elektrane, predviđanjem potrošnje kuće te cijenama preuzimanja iz mreže i predaje u mrežu, a SpotLogic odgovara naredbom za trenutačni vremenski interval. Ovaj predložak povezuje TapHome s API-jem usluge SpotLogic preko HTTPS-a (`spotlogic.cz`, port 443) pomoću Packet Parser HTTP modula. Predložak naredbu **čita**, a telemetriju **šalje**; solarnim izmjenjivačem (inverterom) ne upravlja, nego se naredba s izmjenjivačem povezuje vlastitim smart rules instalatera.

Ništa se ne spaja kabelima. Puštanje usluge u rad znači aktivirati SpotLogic za lokaciju, prikupiti parametre baterije i mreže, centralnoj jedinici omogućiti odlazni pristup internetu i pripremiti serije prognoza i cijena.

> [!WARNING]
> SpotLogic u svakom slanju telemetrije traži serije prognoza i cijena (proizvodnja solarne elektrane i potrošnja kuće za danas i sutra, cijene preuzimanja i predaje). Ovaj predložak ih ne može sam popuniti, vidi [Serije prognoza i cijena](https://taphome.com/hr/compatibility/spotlogic-energy-optimizer-http/#serije-prognoza-i-cijena). Dok nisu popunjene, SpotLogic odbija telemetriju s HTTP 422, ne izračunava plan, a naredba ostaje na **No plan**.

## Konfiguracija

### 1. Aktivirajte SpotLogic i sačuvajte pristupne podatke

SpotLogic pri aktivaciji uređaja e-poštom šalje **PLC ID** i **pristupni token**. Token je tajan, vezan uz točno jedan PLC ID i vrijedi tijekom razdoblja pretplate. Oba se prenose samo u nizu upita (query string) svakog zahtjeva (`?plc_id=…&token=…`), kako propisuje ugovor sučelja SpotLogic, a nikad u tijelu zahtjeva.

> [!WARNING]
> Token ne stavljajte u zajedničke dokumente ni u javne repozitorije. Pogrešan par PLC ID i token, nevažeći token i istekla pretplata završavaju s HTTP 401, a SpotLogic namjerno ne kaže o kojem se od tri slučaja radi.

### 2. Prikupite parametre baterije i mreže

SpotLogic planira samo s brojevima koje primi u telemetriji. Prije uvoza potražite ih u dokumentaciji izmjenjivača i baterije te u ugovoru o priključenju na mrežu:

| Vrijednost | Odakle dolazi | Jedinica |
|---|---|---|
| Kapacitet baterije | tehnički list baterije; mora biti veći od 0 | kWh |
| Najveća snaga baterije | jedna vrijednost za punjenje i pražnjenje | kW |
| Najveća snaga preuzimanja iz mreže | veličina glavnog prekidača; `0` znači da lokacija nikad ne preuzima iz mreže | kW |
| Najveća snaga predaje u mrežu | ograničenje predaje priključka na mrežu; `0` znači da lokacija nikad ne predaje u mrežu | kW |
| Tvrda donja granica baterije | najniže stanje napunjenosti koje dopušta proizvođač izmjenjivača, zadano 10 | % |
| Rezerva baterije | rezerva iz koje plan nikad ne prodaje u mrežu (na primjer za nepredvidivu potrošnju), zadano 10 | % |

U sustavu TapHome mora biti dostupno i **trenutačno stanje napunjenosti** baterije, obično iz vlastite integracije izmjenjivača, kako bi ga smart rule mogao upisati u ovaj predložak (vidi Slanje telemetrije niže).

### 3. Mreža i sat centralne jedinice

- Centralnoj jedinici potreban je odlazni pristup internetu preko HTTPS-a prema `spotlogic.cz` na portu 443. SpotLogic se ne spaja natrag na centralnu jedinicu: serije prognoza i cijena putuju u tijelu slanja telemetrije, pa nije potrebno otvarati nijedan dolazni port.
- Telemetrija nosi vrijeme slanja prema satu centralne jedinice, a SpotLogic iz njega gradi vremenski prozor plana. Odstupanje od nekoliko minuta ne smeta; odstupanje od nekoliko sati pomiče cijeli plan u pogrešne intervale. Održavajte točan sat centralne jedinice.
- Vremenska zona (IANA naziv, na primjer `Europe/Prague`) određuje gdje završava „danas” i počinje „sutra”. Unesite zonu lokacije.

### 4. Parametri uvoza

Predložak se uvozi u sučelje Packet Parser u aplikaciji TapHome, a pri uvozu se popunjavaju sljedeći parametri:

| Parametar | Značenje | Jedinica |
|---|---|---|
| PLC ID, access token | iz e-pošte o aktivaciji | — |
| Time zone | IANA naziv, zadano `Europe/Prague`; iz nje proizlaze granice dana u planu | — |
| Battery capacity | mora biti veći od 0 | kWh |
| Battery max power | jedna vrijednost za punjenje i pražnjenje | kW |
| Max grid import / export power | `0` znači da lokacija nikad ne preuzima iz mreže / nikad ne predaje u mrežu | kW |
| Max state of charge | SpotLogic ga samo bilježi, trenutačni planer ga ne provodi | % |
| Hard battery floor | donja granica od proizvođača izmjenjivača, zadano 10 | % |

Brojevi se upisuju s decimalnom točkom (zarez se pretvara). PLC ID i token spremaju se u varijable modula `PlcId` i `Token`. Sve vrijednosti i nakon uvoza ostaju promjenjive kao varijable modula.

### 5. Provjera pristupnih podataka

Interaktivna API dokumentacija usluge SpotLogic (na `spotlogic.cz` pod `/docs`) ima dijalog **Authorize** za PLC ID i token, a njezin primjer telemetrije za TapHome je potpun: s važećim pristupnim podacima SpotLogic ga prihvaća s HTTP 202. Prije toga vrijeme slanja (`TimeStampUnix`) postavite na trenutačno vrijeme. Prihvaćeni primjeri podataka spremaju se za plan jednako kao stvarna telemetrija, pa ova provjera dolazi prije nego što se naredba poveže s izmjenjivačem.

> [!TIP]
> Odgovor HTTP 422 o nepotpunom horizontu prognoze također dokazuje da su PLC ID i token ispravni; pogrešan token daje HTTP 401.

## Mogućnosti uređaja

### Čitanje naredbe (svakih 20 s)

Modul svakih 20 sekundi šalje upit `GET /api/v1/dispatch`, a uređaji raščlanjuju odgovor:

- **SpotLogic command** — naredba za interval koji je u tijeku (`action_id`):

| Vrijednost | Vrijednost u TapHome | Naziv u SpotLogic | Značenje |
|---|---|---|---|
| 0 | No plan | `no_plan` | Nema upotrebljivog plana: izmjenjivač držite u njegovom vlastitom sigurnom načinu rada |
| 1 | Self-use | `self_use` | Vlastita potrošnja: punjenje iz viška proizvodnje solarne elektrane, pražnjenje za pokrivanje potrošnje kuće |
| 2 | Force charge | `force_charge` | Punjenje baterije najvećom snagom |
| 3 | Force discharge to grid | `force_discharge` | Pražnjenje baterije u mrežu najvećom snagom |
| 4 | Self-use, no discharging | `self_use_ChargeOnly` | Vlastita potrošnja, punjenje dopušteno, pražnjenje zabranjeno |
| 5 | Self-use, no charging | `self_use_DischargeOnly` | Vlastita potrošnja, pražnjenje dopušteno, punjenje zabranjeno |
| 6 | Stop PV (reserved) | `stopPV` | Rezervirano: trenutačni planer ovu naredbu ne izdaje |
| 7 | Grid charge without PV (reserved) | `ChargeMaxNoPV` | Rezervirano: trenutačni planer ovu naredbu ne izdaje |

  Servisni atributi prikazuju naziv naredbe i kada naredba završava (lokalno vrijeme).
- **SpotLogic target state of charge** — stanje napunjenosti (%) koje plan očekuje na kraju intervala. Prisilno punjenje ili pražnjenje zaustavite kad ga baterija dosegne; u načinu vlastite potrošnje ne punite iznad njega. SpotLogic dodaje da se kod `self_use_DischargeOnly` baterija ne bi smjela prazniti ispod njega. Vrijednost je rezultat plana, a ne zadana vrijednost koju treba prisilno postići, i nakon što je kuća potrošila rezervu privremeno može biti niža od rezerve baterije.
- **SpotLogic next command** — naredba sljedećeg intervala, s vremenom početka kao servisnim atributom.
- **SpotLogic plan age** — starost posluženog plana u sekundama. Može pokretati rezervni smart rule: kad znatno nadmaši interval ponovnog izračuna, plan se više ne izračunava ponovno.

Odgovor HTTP 404 `no_plan` **nije pogreška**: naredba je 0, a uređaj prikazuje informativnu poruku. SpotLogic traži da se u tom stanju prijeđe na vlastiti sigurni način rada izmjenjivača i da se posljednja poznata naredba nikad ne ponavlja iz memorije. HTTP 401 (pogrešan PLC ID ili token, istekla pretplata) postavlja pogrešku na uređajima i na modulu; SpotLogic traži da se takvi pozivi ne ponavljaju, pa ispravite pristupne podatke.

### Slanje telemetrije (otprilike svake 2 minute)

Modul šalje `POST /api/v1/optimize` s `PLCtype: "taphome"` najviše svake 2 minute. Šalje vrijeme slanja, vremensku zonu, parametre baterije i mreže te dvije vrijednosti iz uređaja:

- **Battery state of charge (input)** — pomoću smart rule upišite trenutačno stanje napunjenosti 0–100 % iz izmjenjivača (kad predložak izmjenjivača daje 0–1, pomnožite sa 100). Vrijednost se zaokružuje na cijeli postotak jer SpotLogic odbija decimalne vrijednosti. Dok uređaj nema vrijednost, ništa se ne šalje, a modul prikazuje upozorenje.
- **Battery reserve for SpotLogic** — rezerva `SOCmin`, zadano 10 %: razina iz koje plan nikad ne prodaje u mrežu.

Servisni atributi modula prikazuju rezultat posljednjeg slanja, interval ponovnog izračuna koji javlja SpotLogic (zadano 900 s), kada je plan izračunat, izvođenje plana i verziju API-ja. Odbijeno slanje (HTTP 422) je pogreška modula s porukom koju je vratio SpotLogic. Odgovor na slanje nikad ne sadrži plan: SpotLogic ga izračunava u pozadini, a modul ga preuzima pri sljedećem čitanju naredbe.

### Serije prognoza i cijena

SpotLogic u tijelu očekuje šest serija, svaku kao parove `[unix_ts, value]`:

| Varijabla modula | Sadržaj | Ugovor sučelja |
|---|---|---|
| `PvForecastTod`, `PvForecastTom` | proizvodnja solarne elektrane danas / sutra, kWh po satu | po satu, bez praznina, od trenutačnog sata do kraja sutrašnjeg dana |
| `LoadForecastTod`, `LoadForecastTom` | potrošnja kuće danas / sutra, kWh po satu | isto |
| `PriceImp`, `PriceExp` | cijena preuzimanja / predaje, CZK/kWh | stalan korak (po satu ili 15 minuta), dovoljan je današnji dan, negativne cijene su dopuštene |

Varijable drže serije kao JSON tekst, na primjer `[[1788645600,0.0],[1788649200,0.42]]`, i umeću se u tijelo nepromijenjene; zadana vrijednost `[]` je prazna serija. Integracija sama po sebi radi; ono što joj treba su podaci. TapHome zasad ne može dijeliti jedan JSON tekst između skripti, a skripta u smart rule ne može slati HTTP zahtjeve. Šest serija, zajedno oko 500 vrijednosti, zato se mora prikupiti iz drugih skripti (na primjer iz predloška prognoze ili spot cijena) i predati ovom modulu preko stotina pomoćnih uređaja ili izraditi u samoj skripti za čitanje modula. Integracija postaje stvarno praktična tek kad TapHome doda tekstualnu varijablu zajedničku svim skriptama (pogledajte ideju [Tekstualna varijabla i HTTP iz skripti smart rules](https://taphome.com/hr/ideas/script-data-http/)). Do tada popunite šest varijabli i predložak radi bez izmjena. Skripta to objašnjava u komentaru na svom početku i na mjestu gdje se serije umeću.

Odakle dolaze podaci, odlučuje instalater; SpotLogic navodi ove tipične izvore:

- **Proizvodnja solarne elektrane** — usluga predviđanja proizvodnje solarne elektrane kojoj se zadaju lokacija, orijentacija i nagib panela te instalirana snaga, ili oblak proizvođača izmjenjivača.
- **Potrošnja kuće** — vlastita povijest lokacije: za početak je dovoljna satna potrošnja uprosječena po satu u danu i vrsti dana (radni dan, vikend, praznik).
- **Cijene** — spot cijena preračunata prema ugovoru o opskrbi (preuzimanje, na primjer spot plus marža) i prema ugovoru o otkupu viška energije (predaja).

Dan s promjenom ljetnog računanja vremena ima 23 ili 25 sati, pa potpuna serija proizvodnje ili potrošnje ima 47, 48 ili 49 vrijednosti. Uzorci stariji od jednog sata prije trenutačnog sata odrezuju se, kao i uzorci nakon kraja sutrašnjeg dana; serija koja završava prije kraja sutrašnjeg dana se odbija.

## Rješavanje problema

| Simptom | Uzrok i rješenje |
|---|---|
| Naredba ostaje na **No plan** | Plan još nije izračunat ili se telemetrija odbija. Provjerite pogrešku modula i servisni atribut Last telemetry upload. Ni plan stariji od 60 minuta se ne poslužuje. Nakon prvog prihvaćenog slanja plan može potrajati, najmanje jedan interval ponovnog izračuna. |
| Pogreška modula HTTP 422 | Telemetrija krši podatkovni ugovor usluge SpotLogic; poruka kaže koji dio. Najčešće nedostaju serije prognoza ili cijena ili ne pokrivaju razdoblje do kraja sutrašnjeg dana. |
| Pogreška HTTP 401 | PLC ID i token se ne podudaraju ili je pretplata istekla. Ispravite varijable modula `PlcId` i `Token`. |
| Upozorenje „Telemetry not sent” | Stanje napunjenosti još nije upisano ili je neki parametar baterije ili mreže prazan. |
| Starost plana stalno raste | Nova telemetrija ne stiže do usluge SpotLogic ili njezini izvori podataka ne rade; posljednji važeći plan ostaje na snazi dok ne bude star 60 minuta. |
| Pogreška HTTP 500 ili 502 | Pogreška poslužitelja ili izvora podataka na strani usluge SpotLogic; posljednji važeći plan ostaje na snazi. SpotLogic preporučuje ponavljanje obaju zahtjeva sa sve duljim razmacima; modul jednostavno ponavlja oba zahtjeva pri sljedećem upitu. |
| Plan upravlja u pogrešnim satima | Sat centralne jedinice ili vremenska zona nisu ispravni: prozor plana gradi se iz vremena slanja i deklarirane zone. |

## Dostupni uređaji 6

Ovi se uređaji pojavljuju u TapHomeu nakon uvoza.

SpotLogic Modul

Servisni atributi

|                         |
|-------------------------|
| Last telemetry upload   |
| Plan recompute interval |
| Plan computed at        |
| Plan run                |
| API version             |

Prilagođene varijable

|                                  |
|----------------------------------|
| `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)     |

Čitanje (modul)

```taphome
# =============================================================================
#  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
```

Servisni atributi

Last telemetry upload

```taphome
IF(OptimizeCode = 0, "not sent yet", IF(OptimizeCode < 0, "waiting for inputs", "HTTP " + OptimizeCode + " at " + OptimizeAt))
```

Plan recompute interval

```taphome
VAR v := PARSEJSON(OptimizeJson, "$.data.recompute_interval_sec", true);
IF ISNULL(v)
    RETURN("-");
END
RETURN(TOSTRING(v, "F0") + " s");
```

Plan computed at

```taphome
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

```taphome
VAR v := PARSEJSON(DispatchJson, "$.meta.run_id", true);
RETURN(IF(ISNULL(v), "-", v));
```

API version

```taphome
VAR v := PARSEJSON(DispatchJson, "$.meta.version.api", true);
RETURN(IF(ISNULL(v), "-", v));
```

SpotLogic command Prekidač s više vrijednosti

Vrijednosti / stanja: 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)

Čitanje stanja sklopke

```taphome
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);
```

Servisni atributi

Command name

```taphome
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

```taphome
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 Varijabla

Čitanje

```taphome
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 Prekidač s više vrijednosti

Vrijednosti / stanja: 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)

Čitanje stanja sklopke

```taphome
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);
```

Servisni atributi

Next command name

```taphome
VAR v := PARSEJSON(DispatchJson, "$.data.context.next_action_name", true);
RETURN(IF(ISNULL(v), "-", v));
```

Next command starts

```taphome
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 Varijabla

Čitanje

```taphome
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) Varijabla

Čitanje

```taphome
IF(SocNow < 0, NaN, SocNow)
```

Zapis

```taphome
SocNow := Va;
```

Battery reserve for SpotLogic Varijabla

Čitanje

```taphome
RETURN(SocMin);
```

Zapis

```taphome
SocMin := Va;
```

**Povezivanje:** Packet Parser → HTTP

## Parametri uvoza

Ove vrijednosti unosite pri uvozu XML-a.

| Pitanje u aplikaciji                                        | Zadano             |
|-------------------------------------------------------------|--------------------|
| SpotLogic PLC ID (from the activation e-mail)               | Unosi se pri uvozu |
| SpotLogic access token (from the activation e-mail, secret) | Unosi se pri uvozu |
| Time zone (IANA name)                                       | `Europe/Prague`    |
| Battery capacity \[kWh]                                     | Unosi se pri uvozu |
| Battery max charge and discharge power \[kW]                | Unosi se pri uvozu |
| Max grid import power \[kW] (0 = never import)              | Unosi se pri uvozu |
| Max grid export power \[kW] (0 = never export)              | Unosi se pri uvozu |
| Max state of charge \[%] (recorded only)                    | `100`              |
| Hard battery floor from the inverter manufacturer \[%]      | `10`               |

## Povezana dokumentacija

- [Packet Parser Integration](https://taphome.com/hr/compatibility/packet-parser-guide/)
- [Packet Parser (HTTP, TCP, UDP, FTP, MQTT)](https://taphome.com/hr/docs/integration/packet-parser/)
- [Funkcije Packet parsera](https://taphome.com/hr/docs/script/packet-parser/)
- [Funkcije za raščlambu](https://taphome.com/hr/docs/script/parsing-functions/)

