» »

API MojELektro

API MojELektro

STASI ::

Oj
se je kdo ukvarjal z APIjem za MojElektro? Rabim neko rešitev za službo. In sicer avtomatski izvoz podatkov.
LPG
"WAR IS PEACE, FREEDOM IS SLAVERY, IGNORANCE IS STRENGTH"

abcčdefghijklmnoprsštuvzž

muffliato ::

Kaj konkretno te zanima?

STASI ::

Potrebujem izvoz podatkov preko APIja. Imam namreč cca 70 merilnih mest.
Predvsem potrebujem mesečno porabo.
"WAR IS PEACE, FREEDOM IS SLAVERY, IGNORANCE IS STRENGTH"

abcčdefghijklmnoprsštuvzž

Zgodovina sprememb…

  • spremenilo: STASI ()

muffliato ::

Poglej demo na informatika

70 merilnih mest naenkrat v enem requestu ne bo šlo, ker potrebujes ločen token in meter_id (vsaj za ta API). Lahko pa naredis 70 requestov v nekem razumnem obdobju.

Na demotu dodaj meter_id, obdobje ki ga želiš in readingType, ki je ubistvu id meritve.

STASI ::

Kaj pa je razumno obdobje?
"WAR IS PEACE, FREEDOM IS SLAVERY, IGNORANCE IS STRENGTH"

abcčdefghijklmnoprsštuvzž

muffliato ::

Razumno obdobje pomeni koliko klicev lahko narediš naprimer v 1 uri. Kolikšna je ta vrednost za mojelektro nisem štel. Nekje max 3je klici na 15min?

feryz ::

Eno malo drugačno vprašanje.
Home assistent najde števec in kategorije na njem.
A kdo ve, če obstaja kakršnakoli možnost, da se dejansko pride do podatkov?
Ker to bi pa bilo real time.
Na moj elektro moji zamujajo en dan.

muffliato ::

feryz je izjavil:

A kdo ve, če obstaja kakršnakoli možnost, da se dejansko pride do podatkov?
Na moj elektro moji zamujajo en dan.


Preko APIja sigurno ne.
Ena varianta je preko bus protokola direkt iz števca, ampak kolikor vem je le ta kriptiran. Tako da dokler ne objavijo ključev ali javno podprejo idejo, je zadeva praktično neuporabna.

feryz ::

Najde jih samodejno, torej ne rabiš niti preko api, nit preko bus protokola.
Le razumeti ali podatke slišati bi moral.

muffliato ::

O čem ti to? MojElektro api ni realtime. Kaj dejansko ti kažeš in kaj je samodejno?

feryz ::

Kažem senzorje od elektro števca, ki jih najde HA.
Seveda ne govorimo o api, sem že napisal.

muffliato ::

Super. Katerga števca pa? Dvomim da od elektro ljubljana.

steev ::

Kako pa to najde?
:|

feryz ::

Bi ga vprašal, pa mi ne rata.
Preprosto so tam, kakor jih vidiš na slikci.

Drugega števca ni v bajti.
Tudi oznake so specifične za elektro.
Razen če poznate še kaj drugega na to vižo, 1.8.0, 2.8.0, 1.8.1, ...
Iskra tako označuje?

steev ::

Po oznakah gre za tole reč.
https://cms.shrdzm.com/wp-content/uploa...

Samo kako maš ti dostop do tega? A je v tvojo (wifi) mrežo priklopljen?
:|

feryz ::

Ne, nič ni priklopljeno. In nobenih gesel nisem dajal elektru.
Že kake pol leta ali več so senzorji vidni.
Po mojem jih najde wifi scan, ki ga izvaja HA. Druge razlage ne najdem.

muffliato ::

Tole definitivno ni standard inštalacija elektra. Vrjetno gre za modul, ki sem ga prej omenjal preko bus porta. Nekdo ti ga je pozabil izklopit iz omarice ?

feryz ::

Hmmmm, ni mogoče, da ima števec vgrajeno?
Bom bipnil štromarja da pokukava noter.
Edina razlaga bi bila, da so števec štelali s tem pri nastavitvi za SE.

muffliato ::

Nope. Od elektra nič vgrajeno. Pa tudi ne smeš. Kolikor spremljam zadevo, trenutno poteka peticija za odprtje tega p1 bus protokola, da bi ljudlje imeli možnost spremljati real time porabo. Zaenkrat se tega ne izvaja in je protokol kodiran.

brbr21 ::

HA sam od sebe ne najde nič. Vedno preko neke integracije. Poglej preko katere dobivaš te podatke. Imaš preko SE modbusa?

feryz ::

Nimam SE preko modbusa.
Bom jutri penetriral v elektro omarico, da vidim če so mi tja kaj podtaknili. Pol leta ni bilo podatkov, potem so se kar naenkrat pojavili in od takrat funkcionira. Mogoče tukaj tiči zajec.

slawc ::

Ne potrebuješ nobene peticije, ker je I1 namenjen končnim uporabnikom ravno zato, da spremljajo porabo v skoraj realnem času. Enkripcijski ključ je zate, dobiš ga pri elektru. Ti tudi nastavijo telegram in periodo pošiljanja, po ceniku seveda. Škoda, ker še vedno marsikdo na elektru ne ve zakaj se gre potem pa "tega ni", ker ponavadi nimajo vmesnikov.

P1 je pravzaprav napačen izraz, ker ne gre za isti protokol kot ga imajo Nizozemci (čeprav se da marsikaj nastavit, tudi brez enkripcije).
LP, Slawc

SambaShare ::

feryz je izjavil:


Razen če poznate še kaj drugega na to vižo, 1.8.0, 2.8.0, 1.8.1, ...
Iskra tako označuje?


To so standardizirane OBIS kode.
1.8.0 skupna prejeta energija
1.8.1 prejeta energija v tarifi 1
...
2.8.0 skupna oddana energija
...

Tisti adapter pa ne vem. Močno dvomim, da bi ga montiral elektro. Oni prej zamenjajo z LTE števcem.

steev ::

Samo vsi ti števci podpirajo PLC pošiljanje podatkov. Bi rekel, da vsaj v blokih tako pridobijo podatke.

Je tudi PLC enkriptiran? Kako težko bi bilo pridobiti podatke tukaj?
:|

slawc ::

Za nas, uporabnike, je na voljo samo I1.
PLC je za elektro, prav tako LTE (oba sta vmesnika I3), optika (I0) in morebitni ostali števci na vmesniku I2 (npr. voda, plin,...).
Da, enkripcija je in relativno težko.
LP, Slawc

Zgodovina sprememb…

  • spremenil: slawc ()

Magic1 ::

Nekako bodo morali urediti RT spremljanje porabe. Ni mi jasno zakaj ne piše to konstantno nekje v vogalu displejčka. Placa je več, kot dovolj. Pa ta podatek bi tudi lahko bil nekodiran prek izhoda.
Magic

Zgodovina sprememb…

  • spremenil: Magic1 ()

BCSman ::

A če je račun od elektro na določeno osebo, si mora točno ta oseba ustvarit rekono račun? Razen davčne je še kaj posebnega za vpisat, obvezen uvoz digitalnega potrdila morda?
Kaj pa ko si enkrat v aplikaciji prijavljen z rekono računom, katere podatke je potrebno vnesti iz računa od elektro da se ti prikažejo podatki o porabi, torej kako "se sinhroniziraš" s svojim elektro dobaviteljem?

Mikrohard ::

Rekono, certifikat, nova osebna... to so vse alternative. Rabiš eno od tega, ne več. Ni treba, da se prijavi plačnik... lahko je tudi solastnik nepremičnine. Če v mojelektro še ne bo odjemnega mesta, boš poleg davčne rabil še neke številke iz računa in števca. Ko imaš za enega uporabnika urejen dostop, lahko ta pooblasti tudi koga drugega (ki ne rabi biti plačnik ali solastnik).

MAX34216 ::

Prosim za pomoč glede uporabe API-ja... test direktno na strani:
https://docs.informatika.si/mojelektro/...

Nikakor ne vidim kake podatke za moje merilno mesto - imam token, id merilnega mesta.
Ko poskušam prvo opcijo za 15-minutne podatke, ne dobim ničesar, le tole napako:

Error:
Response headers
cache-control: no-cache="set-cookie,set-cookie2"
content-language: en-US
content-length: 0
expires: Thu,01 Dec 1994 16:00:00 GMT

V čem je trik tukaj?
Na primer uspelo mi je normalno uporabiti API v Home Asistantu...

Hvala za pomoč.

misek ::

Daj primer npr. tvojega curl ukaza. Bo lažje pomagati.

MAX34216 ::

Saj mogoče si popolnoma narobe razlagam :-)
Ampak naj bi nekaj lahko videl za test?

ukaz ki ga zgenerira page. Prva opcija Meter-Readings. Vnesem usagePoint, Start in End date. Prej sem vnesel token na zeleni gumb Authorize:
Curl
curl -X 'GET' \
'https://api.informatika.si/mojelektro/v... \
-H 'accept: application/json' \
-H 'X-API-TOKEN: moj_token_id'

mrpiagg ::

Da izkoristim gužvo, ker je že ravno odprta tema :)

Kje pa dobim token id ? Rabiš kam pisat ali je v app od mojelektro ?

Eh, že našel ... v moj elektro api storitve :D

Zgodovina sprememb…

  • spremenil: mrpiagg ()

Ales110 ::

MAX34216 je izjavil:

Saj mogoče si popolnoma narobe razlagam :-)

Prva opcija Meter-Readings. Vnesem usagePoint, Start in End date. Prej sem vnesel token na zeleni gumb Authorize:


Dodati mores se 'option'.
Seznam registrov po katerih se povprašuje. Posamezni register se vnese v obliki: ReadingType=32.0.2.4.1.2.12.0.0.0.0.0.0.0.0.3.72.0

Stisnes 'Add string item' in vneses 'ReadingType=32.0.2.4.1.2.12.0.0.0.0.0.0.0.0.3.72.0'

Kateri reading type pa zelis pa dobis iz endpointa GET reading-type

133780 ::

Eksternalizirane poštarske zbirke s spremenljivkami verjetno ne dodajo, da ne bi bi bilo preveč prometa, upam, da se ne bojijo za ozaveščenost :D

misek ::

A je potrebno pri 15 minutnih podatkih upoštevati letni/zimski čas? Sedaj v zimskem času vidim, da so rezultati narobe za 1h.

David Mayer ::

Ja, izgleda se timezone spremeni, ja - iz 02:00 na 01:00

{
	"readingQualities": [],
	"timestamp": "2025-10-26T00:00:00+02:00",
	"value": "x"
},
{
	"readingQualities": [],
	"timestamp": "2025-10-27T00:00:00+01:00",
	"value": "y"
}

Zgodovina sprememb…

misek ::

Zdaj vidim, da so podatki narobe tudi v web portalu mojelektro za 1h.

David Mayer ::

Verjetno imajo kakšno prijavno okence in jim pošlji, bodo popravili, mogoče kar kmalu, dodaj te primere.

Zgodovina sprememb…

misek ::

Poslan mail na tehnično podporo.

misek ::

So mi iz mojelektro podpore odgovorili s prijaznim mailom. Zapis je v ISO-8601 in je (itak) ok.

Sem pa imel jaz napako. Gledal sem gretje električnega bojlerja, ki je največji porabnik in naredi lepo špico. Spregledal pa sem, da ima časovna ura, ki ga vklopi, napačen čas. Seveda je bila razlika ravno 1h :(

deepsick ::

Resurrection. Je kakšna rešitev za pridobitev 15 minutnih podatkov, starejših od dveh let in za nekaj dni - ne dela preko web gui in direktno api tudi ne. Podpora pošlje na prošnjo?

"errors": [
	{
		"koda": "E_4_000",
		"opis": "Napaka v vhodnih podatkih: Vrednost 'Neveljavni datumski interval, začetek in konec sta lahko največ 35 dni narazen in največ 2 leti v preteklosti' je nepricakovana za 'date interval'"
	}
]

Grimnir3 ::

deepsick je izjavil:

Resurrection. Je kakšna rešitev za pridobitev 15 minutnih podatkov, starejših od dveh let in za nekaj dni - ne dela preko web gui in direktno api tudi ne. Podpora pošlje na prošnjo?

"errors": [
{
"koda": "E_4_000",
"opis": "Napaka v vhodnih podatkih: Vrednost 'Neveljavni datumski interval, začetek in konec sta lahko največ 35 dni narazen in največ 2 leti v preteklosti' je nepricakovana za 'date interval'"
}
]


Pa misliš da sploh držijo podatke?
Če je rečeno da so na voljo za dve leti nazaj.

deepsick ::

Ne vem, sprašujem prav zato - eno je omejitev v GUI, drugo je dejansko stanje. Mislim, da en kratek čas po nadgradnji se je dalo dobiti vse.

delavec44 ::

Hvala za tole temo, sploh nisem vedel, da imajo API. Mi je grok v par minutah sprogramiral, da ne rabim več ročno snemati podatkov za analizo. Samo en del sem moral dati na cloudflare, ker drugače (brez svojega serverja) baje ne gre.

karafeka ::

A delil pa ne bi kode?

delavec44 ::

Cloudflare worker:
export default {
async fetch(request) {
// CORS preflight
if (request.method === "OPTIONS") {
return new Response(null, {
status: 204,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "X-API-TOKEN, Content-Type, Accept",
"Access-Control-Max-Age": "86400",
},
});
}

const url = new URL(request.url);

// Novi uradni API
const targetUrl = "https://api.informatika.si/mojelektro/v... + url.pathname + url.search;

const newHeaders = new Headers();

// Novi API uporablja X-API-TOKEN
const token = request.headers.get("X-API-TOKEN") || request.headers.get("x-api-token");
if (token) {
newHeaders.set("X-API-TOKEN", token);
}

newHeaders.set("Accept", "application/json");

const contentType = request.headers.get("Content-Type");
if (contentType) {
newHeaders.set("Content-Type", contentType);
}

try {
const response = await fetch(targetUrl, {
method: request.method,
headers: newHeaders,
body: request.method !== "GET" && request.method !== "HEAD" ? request.body : null,
});

const responseHeaders = new Headers(response.headers);
responseHeaders.set("Access-Control-Allow-Origin", "*");
responseHeaders.set("Access-Control-Allow-Headers", "X-API-TOKEN, Content-Type, Accept");

return new Response(response.body, {
status: response.status,
statusText: response.statusText,
headers: responseHeaders,
});
} catch (err) {
return new Response(JSON.stringify({ error: err.message }), {
status: 500,
headers: {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
},
});
}
},
};



Lokalni klic:
// 1. Nastavitev parametrov za klic
const TOKEN = "XXXXX"; // Vstavi svoj API token za Moj Elektro
const usagePoint = "XXXXX"; // Vstavi svoje merilno mesto (npr. 3-123456)
const startTime = "2026-08-01"; // Format: YYYY-MM-DD
const endTime = "2026-08-29"; // Format: YYYY-MM-DD

// URL do vašega Cloudflare Workerja
const workerUrl = `https://XXXXX.workers.dev/meter-reading...

async function pridobiPodatke() {
try {
const response = await fetch(workerUrl, {
headers: {
"X-API-TOKEN": TOKEN,
"Accept": "application/json"
}
});

if (!response.ok) {
throw new Error(`Napaka API: ${response.status}`);
}

const data = await response.json();

// Pretvorba JSON odziva v čist seznam meritev: [{ time: "...", value: 0.123 }, ...]
const meritve = extractReadingsFromJson(data);

console.log("Prejete meritve:", meritve);
return meritve;

} catch (err) {
console.error("Napaka pri pridobivanju podatkov:", err);
}
}

// Pomožna rekurzivna funkcija, ki iz spremenljive JSON strukture potegne par (čas, vrednost)
function extractReadingsFromJson(data) {
let results = [];

function traverse(node) {
if (!node || typeof node !== 'object') return;

if (Array.isArray(node)) {
node.forEach(item => traverse(item));
return;
}

let timeVal = node.timestamp || node.time || node.start || (node.timePeriod ? node.timePeriod.start : null);
let energyVal = node.value !== undefined ? node.value : (node.reading !== undefined ? node.reading : node.val);

if (timeVal !== null && timeVal !== undefined && energyVal !== undefined && energyVal !== null) {
if (typeof energyVal !== 'object') {
results.push({ time: timeVal, value: parseFloat(energyVal) });
}
}

for (let key in node) {
if (node.hasOwnProperty(key) && typeof node[key] === 'object') {
traverse(node[key]);
}
}
}

traverse(data);
return results;
}

DamijanD ::

delavec44 je izjavil:

Hvala za tole temo, sploh nisem vedel, da imajo API. Mi je grok v par minutah sprogramiral, da ne rabim več ročno snemati podatkov za analizo. Samo en del sem moral dati na cloudflare, ker drugače (brez svojega serverja) baje ne gre.

Ne razumem zakaj APIja ne moreš klicati direktno iz klienta?

delavec44 ::

Gemini je sicer probal večkrat brez uspeha, dokler nisem vprašal groka. Mogoče odvisno od klienta, jaz sem rabil html za browser.



Direktni klic API-ja s strani zunanje spletne strani v brskalniku ne gre zaradi **CORS** (Cross-Origin Resource Sharing) varnostne politike.

Razlogi zanj v dveh točkah:

* **Bariera med domenama:** Tvoja lokalna datoteka ali stran teče na eni domeni (npr. `file://` ali `localhost`), strežnik Informatika pa na drugi (`api.informatika.si`). Brskalnik iz varnostnih razlogov blokira pošiljanje zahtevkov med različnimi domenami, razen če ciljni strežnik to izrecno dovoli.
* **Manjkajoče dovoljenje na cilju:** Strežnik `api.informatika.si` v odzivnih glavah (headers) nima nastavljenega `Access-Control-Allow-Origin: *`. Ker brskalnik ne prejme tega dovoljenja, zavrne izvedbo `fetch()` klica na frontendu.

Zato Cloudflare Worker deluje kot vmesnik: tvoj brskalnik pošlje zahtevo Workerju (ki ima nastavljene CORS glave in dovoli klic), Worker v ozadju pobere podatke z API-ja Informatika (za strežnike brskalniške CORS omejitve ne veljajo) in ti vrne rezultat.

Mikrohard ::

Ja... ce delas v browserju so omejitve. Sicer bi lahko v naprednih nastavitvah brskalnika to tudi izklopil (vsaj za dolocene domene).

delavec44 ::

V Chromu sem probaval pa mi je napisal da flagi niso podprti, o nastavitvah pa AI ni govoril. Mah, saj je bolje tako pa mi dela povsod, tudi na telefonu.

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Prenos vsebine z novega arhiva RTVSLO (strani: 1 2 3 4 5 6 7 8 9 )

Oddelek: Omrežja in internet
414136104 (9272) ribanisir
»

Davčne blagajne (strani: 1 2 3 424 25 26 27 )

Oddelek: Programiranje
1344382451 (122454) Macketina
»

Davčna blahajna - PHP - certifikati

Oddelek: Programiranje
51507 (1273) app5771283
»

[C#] Simobilov Glasnik

Oddelek: Programiranje
134798 (1878) Mrch
»

[C#] Prosim pomagajte! Potrebujem program, ki bi pobiral podatke iz ene strani

Oddelek: Programiranje
213160 (2770) David1994

Več podobnih tem