Port 8080 — HTTP/HTML webserver
Platí pro verzi NPA R04: 2.13.beta20 · Vytvořeno: 2026-06-02
Zdroj:
server.cpp/server.h(třídaServer, singletonServer::GetServer()),nhttpsocket.{h,cpp}(parsování požadavku),nhtml.{h,cpp}(skládání odpovědí),nsession.{h,cpp}(relace/oprávnění).
Konfigurační a monitorovací webové rozhraní jednotky. Surový QTcpServer (ne QHttpServer) s ručním parsováním HTTP.
Parametry spojení
| Parametr | Hodnota | Zdroj |
|---|---|---|
| Naslouchá na | 0.0.0.0 |
pevně |
| TCP port | 8080 | pevně (Server::Init) |
| Socket | NHttpSocket (potomek QTcpSocket) |
Příchozí spojení (incomingConnection) připojí slot readClient() na readyRead.
Zpracování požadavku (NHttpSocket::MsgReady)
- Požadavek se akumuluje do
mMsg, zpracuje se po ≥ 3 řádcích. mUrl= první řádek (percent-decoded), tj.GET /a/b/<command>?<param> HTTP/1.1.- Příkaz = 4. segment cesty:
commands = path.split("/"),command = commands[3]. Parametry za?jsou vpagess[1], vícenásobné odděleny&. mSession= hodnota cookieNsessionId(jinak se vygeneruje nové UUID).mEAUser= hodnotaea_rolez cookie (externí autentizace).mPost= tělo požadavku (dleContent-Length, percent-decoded,+→ mezera).
Relace a autentizace (NSession)
- Stav drží
NSession(mUserName,mAuthLevel,mEditLocationUuid,mEditDeviceUuid,mIoLocationUuid…); web jej vyzvedne přesmNHtml.SetSession(mSession, mEAUser). - Cookie
NsessionIdse nastavuje v každé HTML hlavičce (HtmlHead):Set-Cookie: NsessionId=<id>; Path=/. - Přihlášení:
POST login.html→NSession::Login(post); odhlášení:logout.html; změna hesla:POST password. - Typy odpovědí:
HtmlHead(text/html),JsonHead(application/json),JsHead,CssHead.
Oprávnění podle úrovně přihlášení (od 2.15.beta12)
Každý příkaz (GET i POST) se před zpracováním kontroluje proti minimální úrovni (server.cpp → AuthRank / CommandMinRank). Dříve se stránky jen skrývaly v menu (menu<úroveň>.html) a přímým zadáním URL byly dostupné všem. Úrovně: "" (nepřihlášen) < user < admin < guru < sasa (cookie ea_role z cloudu: admin → guru, za_firmu/technik → admin, user → user).
Cookie ea_role se přijme jen z VPN tunelu (IsFromVpn, util/nutils.cpp: adresa klienta v síti rozhraní tun_npa_r04, nebo přímo VPN server x.y.0.1); z LAN se ignoruje a zapíše do logu (cookie ea_role=… od <ip> mimo VPN - ignorovana), takže lokálně ji nelze podstrčit. Relace přihlášená takto vzdáleně (NSession::mRemote) nemá v hlavičce tlačítko odhlásit (odhlášení řídí cloud); lokálně přihlášený uživatel ho má.
| Minimální úroveň | Příkazy |
|---|---|
| bez přihlášení | index.html, index2.html, login.html, logout.html, lang, public.html, update_gaude, ping, getid, statické soubory (style.css, npa.css, fonts.css, main.js, main1.js, gauge.min.js) |
user |
basic_settings.html, POST save, POST password, get_index_data, get_bin, get_da, get_device_detail, device_detail.html, getstate, get_history, tok_energie.html, get_tok_energie |
guru |
info.html, config.html, data.html, state.html, log.html, debug.html, instr, clear_fram, settestbatt |
admin |
vše ostatní (nastavení, zařízení, rozpadová místa, povely regulace, restart/reboot, IEC 104, Modbus registry, zkoušky dle RfG, přesun VPN, get_diag); neznámý příkaz = admin (bezpečný default – nová stránka pro uživatele se musí přidat do seznamu) |
Odpověď při nedostatečné úrovni: stránka (*.html) → html/v2/forbidden.html s menu (nepřihlášený dostane přihlašovací stránku), akce / JSON → {"res":"error","msg":"bez opravneni"}; pokus se zapíše do logu (HTTP GET/POST <prikaz>: bez opravneni).
GET endpointy
Události zásahů (NEvents)
Ruční zásahy z webu se od 2.15.beta12 evidují jako události (zdroj web, kdo = uživatel@IP): všechny povely regulace (set*), rfg_start/stop, testy výstupů (dd_test_out, dd_xch_out, outtogle, releclick, tranzistorclick, rs485click), instr, clear_fram, vpn_switch_start/cancel, iec104_toggle/profil, setda a uložení nastavení (save, lo_save, dd_save, dd_ramps_save, iec104_save, rfg_save, restart_save; u POST jen název příkazu, ne obsah). Zapisují se do /log/npa_events.log (jen změny, opakování se počítá), jdou v poli events paketu /measuring a Modbus část je vidět na stránce Modbus registry. Celý soubor: GET events_log (text/plain, admin+). Vzor pro další zdroj (IEC 104 povely): NEvents::GetNEvents()->Add("<src>", kdo, co, hodnota).
Stránky (HTML)
index.html, index2.html, info.html, net_settings.html, basic_settings.html, factory_settings.html, settings.html, regulation.html, locations_dis.html, devices_detection.html, io_settings.html, param.html, config.html, data.html, state.html, log.html, debug.html, public.html, modbus_registers.html, rfg_tests.html (zkoušky dle RfG, admin+), tok_energie.html (tok energie a průchod regulací, user+), reboot.html, restart.html, login.html, logout.html
JSON data (AJAX)
| Endpoint | Obsah |
|---|---|
get_index_data |
hlavní přehled (NState::GetInxeDataJson) |
get_device_detail?<uuid> |
detail zařízení (NHtml::DeviceDetailJson): info = HTML text ovladače (Device::GetInfo), state, rows = všechny klíče NState::M(uuid) jako {k, d (popis), u (jednotka), v (hodnota formátovaná serverem), g (meas / diag = debug-* a pomocné klíče energií), min, min_t, max, max_t (z klíče , jen když existuje), reg (registr z Device::Meta – u Save* automaticky FC/adresa/typ/násobitel), n (vysvětlivka)}, inv = tabulka měničů DataHubu {cols, colreg, rows: [{id: port-adresa, v: [...]}]}; stejný JSON je při načtení stránky vložen do <script type="application/json" id="dd_init"> |
get_bin?<uuid> |
binární I/O lokace (GetInOutJson) |
get_tok_energie |
záložka Tok energie (NHtml::TokEnergieJson, obnova po 2 s, úroveň user): sit (P TML + fáze, elektroměry TML, povolený přetok, SoP), objekt (vlastní spotřeba = P TML + Σ P zařízení DS), mista (P, povel, souhrn řídicích funkcí ctrl jako get_location_ctrl číselně, zařízení místa: P, akt_proc, cil_proc před rampou, potvrzeny_proc, p_deficit, SOC, graf = existuje historie), bez_mista, regulace = snímek řetězce regulace z posledního ticku (NRegulation2::TokJson: distribuce, kandidáti povoleného přetoku s vítězem, požadavky pomalé/rychlé větve, výstup PI, výrobní strop, strop distribuce + kompenzace, skupiny a místa, BESS, cos φ, omezuje = co právě omezuje; pi jen admin+). Hodnoty ve W / %, texty skládá web |
get_location_ctrl?<uuid> |
editace rozpadového místa (admin): blok Obchodní flexibilita a tabulka Řídicí funkce činného výkonu místa (NHtml::LocationCtrlJson) – lo_extplc_val, extplc_prc, extplc_prc_state, extplc_kw, extplc_kw_state, sum_reg, sum_px, sum_px_label, sum_extplc, sum_maxout, sum_result a *_cls (sum-win = vítězná, nejnižší hodnota); klíče odpovídají tokenům šablony, stránka je obnovuje po 2 s |
get_da |
stav D/A výstupů (GetDaJson) |
get_history?uuid=<uuid|TML|VYR>&range=<900|3600|43200|86400> nebo &from=<ms>&to=<ms> |
historie P/Q/energií a povelu zařízení, rozpadového místa, souhrnu TML nebo souhrnu výroby VYR (kladná P zařízení DS, energie míst typu výroby) pro graf ve webu (NHistory::ToJson). Okno v čase: range = posledních N s do teď, nebo from/to v UTC ms (posun a zoom grafu; server ořízne na to ≤ teď, from ≥ teď − 24 h, délka 60 s … 24 h a vrátí from, to, range = délka [s]): step raw (jen okno ≤ 1 h pokryté surovým kruhem, p = [[t_ms, P_W, Q_VAr|null, povel_%|null, povel_BESS_%|null, P_set_W|null, P_vyr_W|null]], každé měření, max 2000 bodů) nebo 1min (p = [[t_ms, P_avg, Q_avg|null, P_min, P_max, povel_avg_%|null, povel_BESS_avg_%|null, P_set_avg|null, P_vyr_avg|null]]), q15 = čtvrthodiny zarovnané na UTC [[t0_ms, t1_ms, P_z_energií|null, P_průměr|null, P_vyr_z_energií|null, P_vyr_průměr|null]], nom_w = jmenovitý výkon (dd_Power, u místa součet) pro přepočet povelu na W, odber_kladny = TML (+ = odběr, P z energií = (ΔE_con − ΔE_del)/Δt), has_proc / has_procb = povel měniče (akt_proc) / BESS (akt_proc_bess, + vybíjení) v rozsahu existuje; jen u TML has_pset / P_set = nastavený výkon TML [W, + = odběr] = −povolený přetok z regulace (regulace/pretok_povoleny, při regulaci po fázích limit na fázi; null = přetoky se neregulují) a has_vyr / P_vyr* = souhrn výroby přibalený z klíče VYR (stejné časy, vlastní spotřeba = P TML + výroba se počítá v grafu); bez dat res error |
getstate |
stav (pole p_inv/q_inv) |
getid |
sériové číslo + příznak -unregistered |
update_gaude |
data pro měřidla (gauge) |
info.html (JSON větev) |
info + test HTML bloky |
Diagnostika
get_diag (admin+, text/plain Markdown): verze, info, config bez hesel, aktuální data, uložený stav, historie výkonu a energií (NHistory: per zařízení / místo / TML CSV bloky čtvrthodiny, minutové agregáty 24 h a celý surový kruh 8192 vzorků – řádově MB) a posledních 30 kB obou logů. get_diag?file = stažení jako soubor npa_diag_<SN>_<UTC>.md, get_diag?hist=0 = bez historie (používá tlačítko kopírování do schránky na stránce Info).
Statické soubory
style.css, npa.css, fonts.css, main.js, main1.js, gauge.min.js (servírováno z adresáře html/).
Konfigurace lokací a zařízení
| Endpoint | Akce |
|---|---|
lo_add / lo_edit?<uuid> / lo_delete?<uuid> |
přidat / editovat / smazat lokaci |
lo_delete_device?<uuid> |
odebrat zařízení z lokace |
dd_add / dd_add_tcp / dd_add_485 |
přidat zařízení (manuálně / TCP / RS-485) |
dd_edit?<uuid> / dd_delete |
editace / smazání zařízení |
setting_next |
přidat prázdné zařízení do seznamu |
io_select_location |
výběr lokace pro I/O |
re_add_accu |
přidat akumulátor |
Ruční ovládání a testy
| Endpoint | Akce |
|---|---|
releclick?<true/false> |
sepnout/rozepnout relé (NIOPins::SetRele) |
tranzistorclick?<true/false> |
tranzistorový výstup (NIOPins::SetTranzistor) |
rs485click?<true/false> |
připojit RS-485 linku (NRs485::SetConnect) |
setda?<n>&<value> |
nastavit D/A výstup n (test, 30 cyklů) |
settestbatt?<%> |
testovací SOC baterie |
outtogle?<key>&<bit> |
přepnout binární výstup |
dd_test_out?<uuid> / dd_xch_out |
test výstupů zařízení |
instr?<uuid>&<fn>&<var>&<addr>&<param> |
vložit Modbus instrukci do fronty driveru |
clear_fram |
smazat perzistentní stav (mSavedM) |
rfg_status / rfg_start?seq=<1..3> / rfg_stop |
zkoušky dle RfG – stav / start sekvence (jen režim SW) / stop; admin+, odpověď JSON; POST rfg_save = uložení nastavení (viz zkousky-rfg.md) |
Povely regulace (ruční, z webu)
| Endpoint | Funkce NState |
Úroveň |
|---|---|---|
setglobalpower?<W> |
SetGlobalRegPower |
globální |
setgloballevelp?<n> |
SetGlobalRegLevel (stupeň P) |
globální |
setgloballevelq?<n> |
SetGlobalQRegLevel |
globální |
setgloballevelfi?<n> |
SetGlobalFiRegLevel (cosφ) |
globální |
setglobalbesspower?<W> |
SetGlobalRegPowerBess |
globální BESS |
setglobalbesslevelch?<n> |
SetGlobalRegBessLevelCharge |
globální BESS nabíjení |
setglobalbessleveldisch?<n> |
SetGlobalRegBessLevelDischarge |
globální BESS vybíjení |
setlocationpower?<W> / setlocationlevelp?<n> |
SetLocationRegPower/Level |
lokace |
setlocbesspower / setlocbesslevelch / setlocbessleveldisch |
SetLocUuidReg(…) |
lokace BESS |
setdevpower?<W> / setdevlevelp?<n> |
SetDevRegPower/Level |
zařízení |
setdevbesspower / setdevbesslevelch / setdevbessleveldisch |
(zakomentováno) | zařízení BESS |
Globální/lokační povely volají
NState::Save()(perzistence dostate.cnf). Lokační/zařízenové povely míří namEditLocationUuid/mEditDeviceUuidz aktuální relace.
Systém
lang?<id> (přepnutí jazyka), password, save, restart_save, ping, reboot.html, restart.html.
POST endpointy
Tělo (mPost) se předává příslušné funkci; konfigurační POST zapisují do NConfig a volají NConfig::Save() → /data/NPA_R04.cnf.
| Endpoint | Akce |
|---|---|
login.html |
NSession::Login(post) → html/back.html |
save |
Save(post) (uložení formuláře konfigurace) |
password |
změna hesla (NHtml::BasicSettings(post)) |
restart_save |
Save + NConfig::SaveNetConfig → restart |
lo_save |
NConfig::SaveLocation(uuid, …) |
lo_add_device |
NConfig::LocationAddDeviceTo(uuid, …) |
dd_add / dd_add_tcp / dd_add_485 |
Save + Devices::AddDevice[/Tcp/485] |
dd_save |
Devices::SaveDevice(uuid, …) |
Šablony
Odpovědi skládá NHtml ze souborů v html/<lang>/ (cz/, en/, plus v2/). Jazyk dle NConfig::mLanguage.GetLangText(). Statika a sdílené šablony jsou přímo v html/.
Pozn. k nasazení
systemctl/install.sh kopíruje html/ vedle binárky do /usr/local/bin/npa/, takže relativní cesty html/... fungují z pracovního adresáře služby.