Přeskočit na hlavní obsah

Audit integrace VictoriaLogs v Shelly skriptech

Tento dokument mapuje aktuální stav odesílání telemetrie, událostí a chybových stavů do centrálního logovacího a metrického systému VictoriaLogs (http://100.81.155.15:9428/insert/jsonline).


1. Souhrnná statistika​

  • Celkem skriptů v repozitáři: 33 souborů *.js
  • Integrace VictoriaLogs:
    • Aktivní integrace: 16 (48 %)
    • Bez integrace: 17 (52 %)
  • Ochrana proti pádu a zachytávání chyb:
    • 🟢 Vysoká (Robustní / Fail-Safe): 18 (55 %) – plné try/catch krytí, validace JSON.parse / parseInt, bezpečné watchdog/fail-safe stavy
    • 🟡 Střední (Základní ošetření): 10 (30 %) – ošetřené callbacky a null checks, ale chybí try/catch ochrana před nečekanými výjimkami
    • 🔴 Nízká (Kritické riziko pádu): 5 (15 %) – nechráněný JSON.parse() na síťové odpovědi; při chybě sítě/API skript spadne a ukončí se

2. Kompletní přehledová tabulka všech skriptů​

Rychlý rozcestník pro rozhodování (Kde co opravit):​


Podrobná srovnávací tabulka skriptů​

Zařízení / MístnostIP adresaSoubor skriptuLogs (VictoriaLogs)Try/Catch (Pád & Chyby)Co posílat do LogsProblém v Try/CatchRozhodnutí: Co opravit
Eliska_display192.168.100.641_ilumination.js❌ NE
(Nízká)
🟡 0× try
(Základní)
Intenzita osvětlení (luxy).Žádné akutní riziko (lokální RPC, null check přítomen).ℹ️ Nízká priorita (volitelně doplnit VL)
Eliska_display192.168.100.643_TRV_sync.js✅ ANO
(Hotovo)
🟢 5× try
(Robustní)
Teploty, cíl, poloha TRV, fáze boost, kotel.V pořádku (JSON.parse v try/catch, validace HTTP).🟢 Hotovo / Bez akce
El-celkove192.168.100.2511_blokace3m.js✅ ANO
(Hotovo)
🟢 8× try
(Robustní)
Proudy L1–L3, celkový kW, blokace 4 kW a 9 kW.V pořádku (ošetřené timery, timeouty 5 s, null checks).🟢 Hotovo / Bez akce
El-celkove192.168.100.2512_vystrahy.js✅ ANO
(Hotovo)
🟢 2× try
(Robustní)
ČHMÚ výstrahy, stupeň rizika (0–4), chyby sítě.V pořádku (bezpečný JSON.parse z ČHMÚ v try/catch).🟢 Hotovo / Bez akce
Solar_okruh_power192.168.100.401_EM-solarokruh.js✅ ANO
(Hotovo)
🟢 1× try
(Robustní)
Výkon okruhu, relé FVE/Grid, test přetížení >1500 W.V pořádku (try/catch u VL, validace EM komponent).🟢 Hotovo / Bez akce
Solar_okruh_power192.168.100.402_Predikce_FVE.js✅ ANO
(Hotovo)
🟢 2× try
(Robustní)
Denní osvit Wh/m², špičkový výkon W/m².V pořádku (Open-Meteo JSON.parse i pole v try/catch).🟢 Hotovo / Bez akce
Solar_okruh_power192.168.100.403_BMS_Baterie.js✅ ANO
(Hotovo)
🟢 3× try
(Robustní)
Napětí, min/max článek, delta U, 16 článků.V pořádku (BMS výpočty v try/catch, null/NaN ochrana).🟢 Hotovo / Bez akce
Xtra-rs485192.168.100.421_Epever-tracer.js✅ ANO
(Hotovo)
🟢 1× try + safe
(Robustní)
Výkon panelů W, proud, napětí, SOC baterie, kWh.V pořádku (bezpečný parseInt, try/catch u VL, telemetrie po 60 s).🟢 Hotovo / Bez akce
Eliska-podlaha192.168.100.2131_blokace4KW.js❌ NE
(Střední)
🟡 0× try
(Základní)
Stav relé podlahovky, blokace 4 kW patrony.Nízké (null-check event.info přítomen, chybí try/catch).⚠️ Volitelně doplnit Logs (stačí mít na centrále)
Loznice_podlaha192.168.100.761_BlokaceEL4KW.js❌ NE
(Střední)
🟡 0× try
(Základní)
Stav relé podlahovky, blokace 4 kW patrony.Nízké (null-check event.info přítomen).⚠️ Volitelně doplnit Logs (stačí mít na centrále)
ObyvakPodlaha192.168.100.2221_blokace4kw.js❌ NE
(Střední)
🟡 0× try
(Základní)
Stav relé podlahovky, blokace 4 kW patrony.Nízké (null-check event.info přítomen).⚠️ Volitelně doplnit Logs (stačí mít na centrále)
Koupelna_podlaha_input192.168.100.771_topeni_universal.js✅ ANO
(Hotovo)
🟢 20× try
(Referenční)
Teploty, cíle, relé, baterie čidla, Fail-Safe.Žádné (kompletní try/catch krytí, watchdog, fail-safe).🟢 Hotovo / Bez akce
Kuchyn0P-2PM192.168.100.1101_kuchyn_trv.js✅ ANO
(Hotovo)
🟢 20× try
(Referenční)
Teploty, cíle, relé, baterie, Fail-Safe události.Žádné (kompletní try/catch krytí, watchdog).🟢 Hotovo / Bez akce
Loznice1p192.168.100.2021_topeni.js❌ NE
(VYSOKÁ)
🔴 0× try
(Riziko pádu)
Ekvitermní křivka 1P, venkovní T, TRV požadavky.Nechráněný JSON.parse (ř. 63) z Open-Meteo.🚨 Opravit TryCatch (ř. 63) + Doplnit Logs
Loznice_1p_display192.168.100.662_luminace.js❌ NE
(Nízká)
🟡 0× try
(Základní)
Intenzita osvětlení (luxy).Nízké (lokální RPC, null check přítomen).ℹ️ Nízká priorita (volitelně doplnit VL)
Loznice_1p_display192.168.100.663_TRV_sync.js✅ ANO
(Hotovo)
🟢 5× try
(Robustní)
Regulace radiátoru ložnice, polohy ventilů, čerpadlo.V pořádku (JSON.parse v try/catch, HTTP validace).🟢 Hotovo / Bez akce
Roleta (Loznice)192.168.100.1201_loznice0_trv.js✅ ANO
(Hotovo)
🟢 20× try
(Referenční)
Regulace radiátoru 0P, baterie čidel, Fail-Safe.Žádné (kompletní try/catch krytí, watchdog).🟢 Hotovo / Bez akce
Kuchyne1p-roleta192.168.100.2231_WS90-push.js❌ NE
(Nízká)
🟡 0× try
(Základní)
Teplota WS90 (stačí logovat na centrále v kotelně).Nízké (má null-check sensor.value).ℹ️ Bez akce (logování stačí na centrále .31)
Obyvak_roleta192.168.100.2241_WS90-push.js❌ NE
(Nízká)
🟡 0× try
(Základní)
Teplota WS90 (stačí logovat na centrále).Nízké (má null-check).ℹ️ Bez akce (logování stačí na centrále .31)
Wall_display_kuchyne_1p192.168.100.341_IR09.js✅ ANO
(Hotovo)
🟢 1× try
(Robustní)
Stav z Python serveru, teploty AKU, soláry.V pořádku (JSON.parse v try/catch, validace kódu 200).🟢 Hotovo / Bez akce
Wall_display_kuchyne_1p192.168.100.342_TRV_sync.js✅ ANO
(Hotovo)
🟢 5× try
(Robustní)
Regulace radiátoru obýváku, boost fáze, ventil.V pořádku (JSON.parse v try/catch, KVS ochrana).🟢 Hotovo / Bez akce
Wall_display_kuchyne_1p192.168.100.343_chodba_sync.js❌ NE
(Nízká)
🔴 0× try
(Riziko pádu)
Podružná synchronizace pozice TRV1 → TRV2.2× nechráněný JSON.parse (ř. 33 a 60) z TRV.🚨 Opravit TryCatch (ř. 33, 60)
Wall_display_kuchyne_1p192.168.100.344_chodba_tmp_sync.js❌ NE
(Nízká)
🔴 0× try
(Riziko pádu)
Podružná synchronizace teploty TRV1 → TRV2.Nechráněný JSON.parse (ř. 31) z TRV.🚨 Opravit TryCatch (ř. 31)
Wall_display_kuchyne_1p192.168.100.345_XTRA.js❌ NE
(Nízká)
🔴 0× try
(Riziko pádu)
Přenáší FVE data z .72 (logovat přímo na .72).3× nechráněný JSON.parse (ř. 22, 38, 54).🚨 Opravit TryCatch (ř. 22, 38, 54)
Wall_display_kuchyne_1p192.168.100.346_TRV_sync_temp.js✅ ANO
(Hotovo)
🟡 0× try
(Základní)
Heartbeat prostorové teploty pro 2 TRV, chyby HTTP.Nízké (validace kódu 200, bez JSON.parse).🟢 V pořádku / Bez akce
Wall_display_kuchyne_1p192.168.100.347_iluminace.js✅ ANO
(Hotovo)
🟡 0× try
(Základní)
Intenzita luxů, okamžité změny ≥ 5 lux.Nízké (validace null/err přítomna).🟢 V pořádku / Bez akce
Sauna192.168.100.781_blokace_sauna.js✅ ANO
(Hotovo)
🟢 12× try
(Robustní)
3fázový odběr sauny W/A, časy nahřívání a blokace, telemetrie po 60 s, chyby sítě.V pořádku (kompletní try/catch krytí, bezpečné čtení stavů).🟢 Hotovo / Bez akce
Kotelna192.168.100.301_RS232.js❌ NE
(Nízká)
🟡 0× try
(Základní)
Surová data z RS232 adaptéru.Nízké (kontrola queryStr a data= přítomna).ℹ️ Nízká priorita (volitelně doplnit VL)
Kotel_cerpadlo192.168.100.741_kotel2pm.js❌ NE
(KRITICKÁ)
🟢 1× try
(Kriticky chráněno)
Kritické zařízení: Teplota kotle na tuhá paliva, spalinový výměník, čerpadlo kotle, var 88 °C.Výborné (JSON.parse v try/catch, havarijní ochrana varu kotle).🚨 Doplnit Logs (Srdce kotelny!)
Regulace-vetyl192.168.100.311_topeni.js❌ NE
(KRITICKÁ)
🔴 0× try
(Riziko pádu centrály!)
Centrála topení: Vypočtená ekvitherma, stav čerpadla ÚT, požadavky TRV.Nechráněný JSON.parse (ř. 203) z Open-Meteo.🚨 Kritická akce: Opravit TryCatch (ř. 203) + Doplnit Logs
Regulace-vetyl192.168.100.312_el_dotapeni.js❌ NE
(KRITICKÁ)
🟡 0× try
(Silný Fail-Safe)
Elektrický dohřev AKU: Teploty AKU (horní/střední), sepnutí 4 kW a 7.5 kW, blokace.Silná logika (watchdog 300 s, havárie 85 °C), chybí try/catch u RPC.🚨 Doplnit Logs (Řízení patron AKU!)
Regulace-vetyl192.168.100.313_smesovac.js❌ NE
(KRITICKÁ)
🟢 1× try
(Fail-Safe)
Směšovací servopohon: Poloha ventilu 0–100 %, náběh, zpátečka, havárie 50 %.V pořádku (JSON.parse v try/catch, havarijní poloha 50 %).🚨 Doplnit Logs (Směšovací ventil!)
Zasuvka_vjezd_8a192.168.100.2521_XTRA.js❌ NE
(Nízká)
🟢 1× try
(Robustní)
FVE data z Python serveru.V pořádku (JSON.parse v try/catch, null checks).ℹ️ Nízká priorita (volitelně doplnit VL)

3. Analýza chybějících dat (Slepá místa systému)​

A. Kritická slepá místa (Priorita: KRITICKÁ)​

Tato zařízení tvoří srdce celé energetiky a vytápění domu. Jejich absence ve VictoriaLogs znemožňuje dohled nad efektivitou, teplotami akumulační nádrže a chodem kotle:

  1. Regulace-vetyl (192.168.100.31):

    • 1_topeni.js: Ve VictoriaLogs chybí vypočtená žádaná teplota ÚT, venkovní teplota přijatá z WS90/Open-Meteo, stav čerpadla ÚT a seznam zón, které aktuálně žádají teplo.
    • 2_el_dotapeni.js: Ve VictoriaLogs chybí reálné teploty v AKU nádrži (horní Ttop, střední Tmid), stavy sepnutí patron 4 kW a 7.5 kW a především přehled aktivních blokací (který spotřebič právě blokuje dohřev).
    • 3_smesovac.js: Ve VictoriaLogs chybí skutečná náběhová teplota do domu, teplota zpátečky, aktuální poloha servopohonu (0–100 %) a detekce havarijního stavu (např. 50 % při výpadku čidla).
  2. Kotel_cerpadlo (192.168.100.74):

    • 1_kotel2pm.js: Ve VictoriaLogs zcela chybí teplota kotle na tuhá paliva, teplota spalinového výměníku, chod čerpadla kotle a záznamy o aktivaci havarijní ochrany proti varu (T ≥ 88 °C).

B. Významná slepá místa (Priorita: VYSOKÁ)​

  1. Loznice1p (192.168.100.202):
    • 1_topeni.js: Ekvitermní křivka 1. patra, WS90 vs. Open-Meteo teplota a TRV požadavky jsou pouze v konzoli.

C. Podružná místa (Priorita: STŘEDNÍ a NÍZKÁ)​

  • Podlahová topení v kotelně (.213, .76, .222): Tyto skripty fungují jako jednoduché vysílače blokace na centrálu. Pokud centrála zaloguje, kdo ji blokuje, není nutné, aby každý klient logoval samostatně do VictoriaLogs (lze doplnit pro úplnost).
  • Meteostanice přeposílače (.223, .224): Přenášejí data z WS90 do kotelny. Logování stačí mít na centrále v kotelně.
  • Měření osvětlení (Eliska_display/1_ilumination.js, Loznice_1p_display/2_luminace.js): Osvětlení na Wall Display v kuchyni již loguje, na ostatních displejích zatím logování chybí.

4. Analýza ochrany proti pádu a zachytávání chyb (Crash Protection Audit)​

JavaScriptový běhový engine v zařízeních Shelly (mJS / QuickJS) je jednovláknový a citlivý na neošetřené výjimky. Jakákoliv nezachycená chyba (např. syntax error v JSON.parse nebo dereference null.property) způsobí okamžitý pád a zastavení běhu celého skriptu. Skript se sám nerestartuje a zařízení přestane regulovat!

A. Kritická zjištění: 5 rizikových skriptů s nechráněným JSON.parse​

Těchto 5 skriptů volá JSON.parse(res.body) přímo bez obalení v bloku try { ... } catch (e) { ... }. Pokud cílové zařízení vrátí HTTP 500, HTML chybovou stránku (např. při výpadku Wi-Fi nebo internetu) nebo prázdné tělo, skript okamžitě havaruje:

  1. Regulace-vetyl/1_topeni.js (řádek 203) – NEJVYŠŠÍ RIZIKO!
    • Centrální regulátor topení domu stahuje záložní venkovní teplotu z api.open-meteo.com.
    • Volá let data = JSON.parse(res.body); bez try/catch. Při chvilkovém výpadku internetu nebo odpovědi gateway timeout spadne centrální regulátor a přestane spínat oběhové čerpadlo ÚT!
  2. Loznice1p/1_topeni.js (řádek 63)
    • Shodný kód zálohy počasí z Open-Meteo API bez try/catch.
  3. Wall_display_kuchyne_1p/3_chodba_sync.js (řádky 33 a 60)
    • Volá var data = JSON.parse(res.body); na odpovědi z TRV /status a /settings.
  4. Wall_display_kuchyne_1p/4_chodba_tmp_sync.js (řádek 31)
    • Volá var data = JSON.parse(res.body); na odpovědi z TRV /status.
  5. Wall_display_kuchyne_1p/5_XTRA.js (řádky 22, 38 a 54)
    • 3× nechráněný JSON.parse(res.body) při vyčítání solárních dat ze sousední Shelly .72.

B. Vzor bezpečné praxe (Referenční standard)​

Nejvyšší odolnost v repozitáři vykazují univerzální topné skripty (1_topeni_universal.js, 1_kuchyn_trv.js, 1_loznice0_trv.js), které obsahují:

  • 20× try/catch bloků pokrývajících každé síťové volání, timer a manipulaci s KVS.
  • Fail-Safe Watchdog: Při ztrátě signálu z teplotního čidla delší než 30 minut skript automaticky a bezpečně vypne relé topení, aby nedošlo k přetopení místnosti.
  • Havarijní limity: Ochrana kotle na tuhá paliva proti varu při 88 °C (1_kotel2pm.js) a elektrického dohřevu AKU při 85 °C (2_el_dotapeni.js).

5. Doporučený standard pro doplnění VictoriaLogs a ochranu proti pádu​

Pro skripty, kde VictoriaLogs chybí nebo kde hrozí pád, se doporučuje použít jednotnou funkci logToVictoria a bezpečný parsovací vzor safeJsonParse:

let CONFIG = {
// ... existující nastavení ...
victoriaLogs: {
enabled: true,
url: "http://100.81.155.15:9428/insert/jsonline?_stream_fields=app,room&_msg_field=_msg",
app: "shelly_<nazev_sluzby>",
room: "<nazev_mistnosti>",
telemetryIntervalSec: 60
}
};

// Bezpečné parsování JSON řetězců chráněné proti pádu skriptu
function safeJsonParse(str) {
if (!str || typeof str !== "string") return null;
try {
return JSON.parse(str);
} catch (e) {
print("[CHYBA] Selhalo parsování JSON: " + JSON.stringify(e));
return null;
}
}

// Bezpečné odesílání logů do VictoriaLogs
function logToVictoria(msg, level, extra) {
if (!CONFIG.victoriaLogs || !CONFIG.victoriaLogs.enabled) return;

let entry = {
_msg: msg,
level: level || "info",
app: CONFIG.victoriaLogs.app,
room: CONFIG.victoriaLogs.room
};

if (extra && typeof extra === "object") {
for (let k in extra) {
entry[k] = extra[k];
}
}

try {
Shelly.call(
"HTTP.Request",
{
url: CONFIG.victoriaLogs.url,
method: "POST",
headers: { "Content-Type": "application/stream+json" },
body: JSON.stringify(entry),
timeout: 5
},
function (res, err_code) { }
);
} catch (e) { }
}