// alkuperainen versio https://github.com/Spot-hinta-fi/Shelly/blob/main/Scripts/Extras/Shelly-PlusPlugS-StreetLight.js // tietoa https://spot-hinta.fi/liikennevalo/ // // Kiitos tuestasi: www.buymeacoffee.com/spothintafi // Tuetut Shelly Plus Plug S -firmwaret: 1.4.4 - 1.7.1 // Skriptiversio: 2025-11-12 // Tämä skripti näyttää sähkön hinnan tason älypistokkeen LED-valon värinä 15 minuutin välein. // ------------------------------- // ASETUKSET // ------------------------------- // Sähköalue let Alue = "FI"; // Tuetut alueet: DK1, DK2, EE, FI, LT, LV, NO1–NO5, SE1–SE4 // Käytetäänkö kiinteitä hintarajoja vai suhteellisia? const KaytaHintarajoja = true; // true = käytä kiinteitä hintoja, false = suhteellisia hintoja (kolmanneksia) // Hintarajat (vain jos yllä = true) // Hinnat euro-sentteinä (snt/kWh) const HalpaRaja = 5; // alle tämän = halpa const KeskihintaRaja = 8; // 5–8 = keskihintainen const KallisRaja = 12; // 8–12 = kallis // yli 12 = erittäin kallis // Värit RGB-muodossa (0–100) const VariHalpa = [0, 100, 0]; // vihreä const VariKeskihinta = [100, 60, 0]; // oranssi const VariKallis = [100, 0, 0]; // punainen const VariErittainKallis = [80, 0, 80]; // violetti const VariTuntematon = [0, 0, 100]; // sininen // Väri RGB-arvot // ---------------------------------------------------- // Vihreä [0, 100, 0] // Keltainen [100, 100, 0] // Oranssi [100, 60, 0] // Punainen [100, 0, 0] // Violetti [80, 0, 80] // Sininen [0, 0, 100] // Valkoinen [100, 100, 100] // Musta (pois) [0, 0, 0] // Laita tama true, jos valon kirkkautta saadetaan varin kanssa const SäädäKirkkautta = false; const KirkkausHalpa = 40; const KirkkausKeskihinta = 70; const KirkkausKallis = 90; const KirkkausErittainKallis = 100; const KirkkausTuntematon = 60; // ------------------------------- // SKRIPTIN ALKUSÄÄDÖT // ------------------------------- print("PlusPlugS-Sahkovalo: Skripti käynnistyy... (väri päivittyy 30 sekunnissa)"); let asetukset; let nykyinenTunti = -1; let nykyinenNeljannes = -1; let nykyinenVari = VariTuntematon; let HakuURL = ""; // Muodosta oikea rajapintaosoite if (KaytaHintarajoja === true) { HakuURL = "https://api.spot-hinta.fi/JustNow?region=" + Alue; } else { HakuURL = "https://api.spot-hinta.fi/JustNowRank?region=" + Alue; } // Haetaan nykyinen konfiguraatio (vain LED-osuus muutetaan) Shelly.call("PLUGS_UI.GetConfig", null, function (vastaus) { asetukset = vastaus; }); // Tarkistetaan 30 sekunnin välein, onko neljännestunti vaihtunut Timer.set(30000, true, function () { let nyt = new Date(); let uusiTunti = nyt.getHours(); let uusiMinuutti = nyt.getMinutes(); let uusiNeljannes = Math.floor(uusiMinuutti / 15); if (nykyinenTunti === uusiTunti && nykyinenNeljannes === uusiNeljannes) { return; } nykyinenTunti = uusiTunti; nykyinenNeljannes = uusiNeljannes; let aikaStr = uusiTunti + ":" + (uusiNeljannes * 15); print("PlusPlugS-Sahkovalo: Neljännestunti vaihtui (" + aikaStr + "), haetaan hintatason väri..."); Shelly.call("HTTP.Request", { method: "GET", url: HakuURL, timeout: 10, ssl_ca: "*" }, KasitteleVastaus); }); // ------------------------------- // DATAN KÄSITTELY // ------------------------------- function KasitteleVastaus(vastaus, virheKoodi) { if (virheKoodi === 0 && vastaus !== null && vastaus.code === 200) { let hinta = parseFloat(vastaus.body); if (KaytaHintarajoja === true) { // --- Kiinteät rajat --- if (isNaN(hinta)) { print("Virheellinen hinta-arvo: " + vastaus.body); nykyinenVari = VariTuntematon; nykyinenKirkkaus = KirkkausTuntematon; } else if (hinta < HalpaRaja) { print("Halpa jakso (" + hinta + " snt/kWh)"); nykyinenVari = VariHalpa; nykyinenKirkkaus = SäädäKirkkautta ? KirkkausHalpa : 100; } else if (hinta >= HalpaRaja && hinta < KeskihintaRaja) { print("Keskihintainen jakso (" + hinta + " snt/kWh)"); nykyinenVari = VariKeskihinta; nykyinenKirkkaus = SäädäKirkkautta ? KirkkausKeskihinta : 100; } else if (hinta >= KeskihintaRaja && hinta < KallisRaja) { print("Kallis jakso (" + hinta + " snt/kWh)"); nykyinenVari = VariKallis; nykyinenKirkkaus = SäädäKirkkautta ? KirkkausKallis : 100; } else if (hinta >= KallisRaja) { print("Erittäin kallis jakso (" + hinta + " snt/kWh)"); nykyinenVari = VariErittainKallis; nykyinenKirkkaus = SäädäKirkkautta ? KirkkausErittainKallis : 100; } else { print("Tuntematon hintataso (" + hinta + ")"); nykyinenVari = VariTuntematon; nykyinenKirkkaus = KirkkausTuntematon; } } else { // --- Suhteelliset rajat --- let arvo = hinta * 1; if (arvo >= 1 && arvo <= 24) { print("Halpa (" + arvo + "/96)"); nykyinenVari = VariHalpa; nykyinenKirkkaus = SäädäKirkkautta ? KirkkausHalpa : 100; } else if (arvo >= 25 && arvo <= 48) { print("Keskihintainen (" + arvo + "/96)"); nykyinenVari = VariKeskihinta; nykyinenKirkkaus = SäädäKirkkautta ? KirkkausKeskihinta : 100; } else if (arvo >= 49 && arvo <= 72) { print("Kallis (" + arvo + "/96)"); nykyinenVari = VariKallis; nykyinenKirkkaus = SäädäKirkkautta ? KirkkausKallis : 100; } else if (arvo >= 73 && arvo <= 100) { print("Erittäin kallis (" + arvo + "/96)"); nykyinenVari = VariErittainKallis; nykyinenKirkkaus = SäädäKirkkautta ? KirkkausErittainKallis : 100; } else { nykyinenVari = VariTuntematon; nykyinenKirkkaus = KirkkausTuntematon; } } VaihdaVariJaKirkkaus(nykyinenVari, nykyinenKirkkaus); } else { print("Virhe hintadatan haussa."); VaihdaVariJaKirkkaus(VariTuntematon, KirkkausTuntematon); nykyinenTunti = -1; nykyinenNeljannes = -1; } } // ------------------------------- // LED-VÄRIN VAIHTO // ------------------------------- function VaihdaVariJaKirkkaus(vari, kirkkaus) { if (asetukset === null || asetukset === undefined) { print("Asetuksia ei vielä ladattu, yritetään uudelleen 10 sekunnissa..."); Timer.set(10000, false, function () { VaihdaVariJaKirkkaus(vari, kirkkaus); }); return; } asetukset.leds.mode = "switch"; asetukset.leds.colors["switch:0"].on.rgb = vari; asetukset.leds.colors["switch:0"].on.brightness = kirkkaus; asetukset.leds.colors["switch:0"].off.rgb = vari; asetukset.leds.colors["switch:0"].off.brightness = Math.max(10, Math.floor(kirkkaus / 3)); // himmennetty pois-tila let PaivitysURL = "http://localhost/rpc/PLUGS_UI.SetConfig?config=" + JSON.stringify(asetukset); Shelly.call("HTTP.Request", { method: "GET", url: PaivitysURL, timeout: 15, ssl_ca: "*" }, VariPaivitetty); } function VariPaivitetty(vastaus, virheKoodi, virheViesti) { if (virheKoodi === 0 && vastaus !== null) { print("LED-väri ja kirkkaus päivitetty onnistuneesti."); return; } print("LED-päivitys epäonnistui. Koodi: " + virheKoodi + " Viesti: " + virheViesti); nykyinenTunti = -1; nykyinenNeljannes = -1; }