diff --git a/Scripts/Shelly-Minimal-Heating.js b/Scripts/Shelly-Minimal-Heating.js index 29130a3..c76dcd9 100644 --- a/Scripts/Shelly-Minimal-Heating.js +++ b/Scripts/Shelly-Minimal-Heating.js @@ -1,5 +1,5 @@ // Thank you for your support: https://www.buymeacoffee.com/spothintafi -// Supported Shelly firmwares: 1.0.3 - 1.4.2. Script version: 2024-10-09 +// Supported Shelly firmwares: 1.0.3 - 1.4.4. Script version: 2024-11-02 // Change these settings as you like let Region = "FI"; // Supported regions: DK1, DK2, EE, FI, LT, LV, NO1, NO2, NO3, NO4, NO5, SE1, SE2, SE3, SE4 diff --git a/Scripts/Shelly-Pikakoodi.js b/Scripts/Shelly-Pikakoodi.js index 0654e30..77c8f5f 100644 --- a/Scripts/Shelly-Pikakoodi.js +++ b/Scripts/Shelly-Pikakoodi.js @@ -1,5 +1,5 @@ // Kiitos tuestasi: https://www.buymeacoffee.com/spothintafi -// Tuetut Shelly ohjelmistot: 1.0.3 - 1.4.2. Skriptin versio: 2024-10-09 +// Tuetut Shelly ohjelmistot: 1.0.3 - 1.4.4. Skriptin versio: 2024-11-02 // OHJE: Anna "pikakoodi" kullekin ohjattavalle releelle. Koodilla 999 voit ohittaa releen. // Esimerkki 1: Ohjaa releitä 2 ja 3. Aseta pikakoodit näin: [999, 103, 125] diff --git a/Scripts/Shelly-Rank-and-Price.js b/Scripts/Shelly-Rank-and-Price.js index 86d59b4..8146a7d 100644 --- a/Scripts/Shelly-Rank-and-Price.js +++ b/Scripts/Shelly-Rank-and-Price.js @@ -1,5 +1,5 @@ // Thank you for your support: https://www.buymeacoffee.com/spothintafi -// Supported Shelly firmwares: 1.0.3 - 1.4.2. Script version: 2024-10-09 +// Supported Shelly firmwares: 1.0.3 - 1.4.4. Script version: 2024-11-02 // Region to use let Region = "FI"; // Supported regions: DK1, DK2, EE, FI, LT, LV, NO1, NO2, NO3, NO4, NO5, SE1, SE2, SE3, SE4 diff --git a/Scripts/Shelly-SmartHeating.js b/Scripts/Shelly-SmartHeating.js index 3f880a3..74ba642 100644 --- a/Scripts/Shelly-SmartHeating.js +++ b/Scripts/Shelly-SmartHeating.js @@ -1,5 +1,5 @@ // Thank you for your support: https://www.buymeacoffee.com/spothintafi -// Supported Shelly firmwares: 1.0.3 - 1.4.2. Script version: 2024-10-09 +// Supported Shelly firmwares: 1.0.3 - 1.4.4. Script version: 2024-11-02 // SmartHeating: outdoor temperature controlled heating with a possibility to control multiple relays with the same rules. // Note! At the worst case temperature is off by 10-15c degrees as the measuring station is not at your home, so make your own measurements if precision is required. diff --git a/Scripts/Shelly-SmartMonitoring.js b/Scripts/Shelly-SmartMonitoring.js index e6cbbe0..06ceed3 100644 --- a/Scripts/Shelly-SmartMonitoring.js +++ b/Scripts/Shelly-SmartMonitoring.js @@ -1,5 +1,5 @@ // Thank you for your support: https://www.buymeacoffee.com/spothintafi -// Supported Shelly firmwares: 1.0.3 - 1.4.2. Script version: 2024-10-09 +// Supported Shelly firmwares: 1.0.3 - 1.4.4. Script version: 2024-11-02 // Common settings const Region = "FI"; // Supported regions: DK1, DK2, EE, FI, LT, LV, NO1, NO2, NO3, NO4, NO5, SE1, SE2, SE3, SE4 diff --git a/Scripts/Shelly-Vesivaraaja-yosiirto.js b/Scripts/Shelly-Vesivaraaja-yosiirto.js index 36e6c61..0991508 100644 --- a/Scripts/Shelly-Vesivaraaja-yosiirto.js +++ b/Scripts/Shelly-Vesivaraaja-yosiirto.js @@ -1,37 +1,68 @@ // Kiitos tuestasi: https://www.buymeacoffee.com/spothintafi -// Tuetut Shelly ohjelmistot: 1.0.3 - 1.4.2. Skriptin versio: 2024-10-09 +// Tuetut Shelly ohjelmistot: 1.0.3 - 1.4.4. Skriptin versio: 2024-11-02 // ASETUKSET -let Rankit = [1, 2, 3]; // Listaa 'rankit' (eli tunnin järjestysnumero hinnan mukaan), jolloin rele kytketään -let Rele = 0; // Ohjattavan releen numero +let Rankit = [1, 2, 3]; // Listaa 'rankit' (eli tunnin järjestysnumero hinnan mukaan), jolloin releet kytketään +let Releet = [0]; // Ohjattavien releiden numerot. Esimerkiksi [0,1,2] ohjataksesi kolmea relettä let Yotunnit = [22, 23, 0, 1, 2, 3, 4, 5, 6]; // Yösiirron tunnit. Näihin ei tarvitse normaalisti koskea (edes kellonsiirron aikaan). let Hintaero = -1.43; // Paljonko sähkön siirtohinta on halvempi yösiirron aikaan? -let Varatunnit = [3, 4, 5]; // Tunnit jolloin rele kytketään, mikäli Internet yhteys ei toimi tai palvelu on alhaalla +let SallittuHinta = 0; // Hinta kokonaisina sentteinä, jonka alapuolella lämmitys aina sallitaan +let Varatunnit = [3, 4, 5]; // Tunnit jolloin rele kytketään, mikäli ohjaustietoja ei saada haettua. // KOODI -let url = "https://api.spot-hinta.fi/JustNowRanksAndPrice?priorityHours=" + Yotunnit.join() + "&priceModifier=" + Hintaero + "&ranksAllowed=" + Rankit.join(); -let hour = -1; let previousAction = ""; print("WaterBoiler: Ohjaus käynnistyy 30 sekunnissa."); -Timer.set(30000, true, function () { - if (hour == new Date().getHours()) { print("WaterBoiler: Odotetaan tunnin vaihtumista."); return; } +let url = "https://api.spot-hinta.fi/PlanAhead?priorityHours=" + Yotunnit.join() + "&priceModifier=" + Hintaero + "&ranksAllowed=" + Rankit.join() + "&priceAlwaysAllowed=" + SallittuHinta; +let hour = -1; let minute = new Date().getMinutes(); let previousAction = ""; print("WaterBoiler: Ohjaus käynnistyy 15 sekunnissa."); +let instructions = null; let loadInstructions = true; let instructionsTimeOut = new Date(); let previousStatus = ""; + +Timer.set(15000, true, function () { + if (loadInstructions == true || instructionsTimeOut < new Date()) { LoadInstructionsFromServer(); } + else { ChangeRelayStatusIfNeeded(); } + + if (minute !== new Date().getMinutes()) { + minute = new Date().getMinutes(); + print("WaterBoiler: Ohjaus on toiminnassa. Releiden tila: " + previousStatus); + } +}); + +function ChangeRelayStatusIfNeeded() { + let relayStatus = GetCurrentlyExpectedRelayStatus(); + if (loadInstructions == true) { print("WaterBoiler: uudet ohjaustiedot täytyy ladata."); return; } + if (previousStatus !== relayStatus.result) { SetRelayStatus(relayStatus); return; } +} + +function SetRelayStatus(newStatus) { + previousStatus = newStatus.result; + for (let i = 0; i < Releet.length; i++) { Shelly.call("Switch.Set", "{ id:" + Releet[i] + ", on:" + newStatus.result + "}", null, null); } + print("WaterBoiler: Releiden tila vaihdettiin. Uusi tila: " + newStatus.result); +} + +function LoadInstructionsFromServer() { Shelly.call("HTTP.GET", { url: url, timeout: 15, ssl_ca: "*" }, function (res, err) { - hour = (err != 0 || res == null || (res.code !== 200 && res.code !== 400)) ? -1 : new Date().getHours(); - let on = false; - if (hour === -1) { - previousAction = ""; - if (Varatunnit.indexOf(new Date().getHours()) > -1) { - on = true; hour = new Date().getHours(); - print("WaterBoiler: Virhetilanne. Kuluva tunti on varatunti: rele kytketään päälle tämän tunnin ajaksi."); - } else { - print("WaterBoiler: Virhetilanne. Kuluva tunti ei ole varatunti: relettä ei kytketä. Yhteyttä yritetään uudestaan."); - } - } else { if (res.code === 200) { on = true; } } - - if (previousAction !== on) { - Shelly.call("Switch.Set", "{ id:" + Rele + ", on:" + on + "}", null, null); - print("WaterBoiler: Kytketty " + (on ? "päälle" : "pois päältä")); - previousAction = on; + if (err != 0 || res == null || res.code !== 200 || res.body == null) { + print("WaterBoiler: Virhe ohjaustietoja haettaessa. Yritetään uudelleen."); } else { - print("WaterBoiler: Releen tilaa ei muutettu, koska se olisi sama kuin edellisellä tunnilla."); + instructions = JSON.parse(res.body); loadInstructions = false; + instructionsTimeOut = new Date(instructions[0].epochMs - 10800 * 1000); + print("WaterBoiler: Ohjaustiedot haettiin onnistuneesti. Uudet ohjaustiedot haetaan viimeistään: " + instructionsTimeOut.toString()); } }); -}); \ No newline at end of file +} + +function GetCurrentlyExpectedRelayStatus() { + if (instructions == null || instructions.length == 0) { ActivateBackupHours(); return; } + const epochMs = Date.now(); if (instructions[0].epochMs < epochMs) { ActivateBackupHours(); return; } + + for (let i = 0; i < instructions.length; i++) { + if (instructions.length > i && instructions[i + 1].epochMs > epochMs) { continue; } + if (instructions.length > i && instructions[i + 1].epochMs <= epochMs) { return instructions[i + 1]; } + if (instructions[i].epochMs <= epochMs) { return instructions[i]; } + } + + print("WaterBoiler: Virhetilanne... Ei löytynyt sopivaa ohjaustietoa listalta."); ActivateBackupHours(); +} + +function ActivateBackupHours() { + loadInstructions = true; print("WaterBoiler: Siirrytään varatuntien käyttöön."); + if (Varatunnit.indexOf(new Date().getHours()) > -1) { SetRelayStatus(true); return; } + else { SetRelayStatus(false); return; } +} \ No newline at end of file diff --git a/Scripts/Shelly-Vesivaraaja.js b/Scripts/Shelly-Vesivaraaja.js index 7cad4d2..fdd3254 100644 --- a/Scripts/Shelly-Vesivaraaja.js +++ b/Scripts/Shelly-Vesivaraaja.js @@ -1,5 +1,5 @@ // Kiitos tuestasi: https://www.buymeacoffee.com/spothintafi -// Tuetut Shelly ohjelmistot: 1.0.3 - 1.4.2. Skriptin versio: 2024-10-09 +// Tuetut Shelly ohjelmistot: 1.0.3 - 1.4.4. Skriptin versio: 2024-11-02 // ASETUKSET let Tunnit_yo = 3; // Yötuntien lukumäärä 22:00 - 07:00