Skip to content

Commit

Permalink
Merge pull request #76 from Spot-hinta-fi/plan-ahead-vesivaraaja-yosi…
Browse files Browse the repository at this point in the history
…irto

Plan ahead vesivaraaja-yosiirto
  • Loading branch information
Spot-hinta-fi authored Nov 2, 2024
2 parents dc9ff46 + 863d9e3 commit f68a0c2
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 32 deletions.
2 changes: 1 addition & 1 deletion Scripts/Shelly-Minimal-Heating.js
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion Scripts/Shelly-Pikakoodi.js
Original file line number Diff line number Diff line change
@@ -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]
Expand Down
2 changes: 1 addition & 1 deletion Scripts/Shelly-Rank-and-Price.js
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion Scripts/Shelly-SmartHeating.js
Original file line number Diff line number Diff line change
@@ -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.
Expand Down
2 changes: 1 addition & 1 deletion Scripts/Shelly-SmartMonitoring.js
Original file line number Diff line number Diff line change
@@ -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
Expand Down
83 changes: 57 additions & 26 deletions Scripts/Shelly-Vesivaraaja-yosiirto.js
Original file line number Diff line number Diff line change
@@ -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());
}
});
});
}

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; }
}
2 changes: 1 addition & 1 deletion Scripts/Shelly-Vesivaraaja.js
Original file line number Diff line number Diff line change
@@ -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
Expand Down

0 comments on commit f68a0c2

Please sign in to comment.