jisotalo / shelly-porssisahko

Nordpool-pörssisähköohjaus Shelly-releisiin - Nordpool price control for Shelly relays
https://jisotalo.fi/shelly-porssisahko
GNU Affero General Public License v3.0
40 stars 13 forks source link

Ongelma kellojen siirron kanssa / automaattinen aikavyöhykkeen haku #7

Closed jisotalo closed 1 year ago

jisotalo commented 1 year ago

Valitettavasti kellojen siirto aiheutti ongelman skriptin kanssa, olin unohtanut sinne kiinteän aikavyöhykkeen +03:00 UTC. Onneksi varmuustuntiohjaus tuntuu toimivan kuten pitää (eli ainoastaan hintatiedot ei olleet käytössä).

Tämä on korjattu väliaikaisesti versiossa 2.6.1 muuttamalla aikavyöhyke kinteästi +02:00. Ei kuitenkaan ole hyvä ratkaisu.

https://github.com/jisotalo/shelly-porssisahko/releases/tag/v.2.6.1

Lisätään ominaisuus, että aikavyöhyke haetaan Shellyn kellon ja UTC ajan erotuksesta automaattisesti. Shelly ei valitettavasti tue suoraan Date.getTimezoneOffset() -metodia, joten haetaan se alla olevalla tavalla tms.

Piti laittaa jo versioon 2.6.1 mutta tuli jotain ongelmaa Shellyn pinomuistin tms. kanssa. Alla versio joka tuntuu toimivan mutta ajetaan ensin vähän testiä..

/**
 * Updates current timezone to state as hh:mm string format (url encoded)
 * For example if UTC time is 04:55 and local time is 06:55, tz is %2b02:00 
 * 
 * NOTE: Technically incorrect, only handles time zones with hour differences
 * 
 * @param {Date} now Current time
 * @returns 
 */
function updateTz(now) {
  //Get UTC time as string (e.g. Sun, 29 Oct 2023 04:55:00 GMT)
  let utc = now.toUTCString();

  //Extract time from UTC time string (e.g. "04:55:00 GMT")
  utc = utc.substring(utc.indexOf("" + now.getFullYear()) + 5);

  //Extract hours (e.g. "04")
  utc = Number(utc.substring(0, utc.indexOf(":")));

  //Calculate time difference
  let diff = now.getHours() - utc;

  let tz = padStart(Math.abs(diff), 2, "0") + ":00";

  if (diff < 0) {
    tz = "-" + tz;
  } else {
    tz = "%2b" + tz;
  }
  _.s.tz = tz;
}
jisotalo commented 1 year ago

Viimeinen versio tehty ja ratkaisu tuntuu toimivan. Ajan omassa käytössä jonkin aikaa ennen julkaisua.

/**
 * Updates current timezone to state as hh:mm string format (url encoded)
 * For example if UTC time is 04:55 and local time is 06:55, tz is %2b02:00 
 * 
 * NOTE: Technically incorrect, only handles timezones with full hour offsets
 * 
 * @param {Date} now Current time
 * @returns 
 */
function updateTz(now) {
  //Get UTC time as string (e.g. Sun, 29 Oct 2023 04:55:00 GMT)
  let utc = now.toUTCString();

  //Extract time from UTC time string (e.g. "04:55:00 GMT")
  utc = utc.substring(utc.indexOf("" + getFullYear(now)) + 5);

  //Extract hours (e.g. "04")
  utc = Number(utc.substring(0, utc.indexOf(":")));

  //Calculate time difference
  let diff = getHours(now) - utc;

  let tz = padStart(Math.abs(diff), 2, "0") + ":00";

  if (diff < 0) {
    tz = "-" + tz;
  } else if (diff > 0) {
    tz = "%2b" + tz;
  } else {
    tz = "Z";
  }

  if (tz !== _.s.tz) {
    //Timezone has changed -> we should get prices
    _.s.p.ts = 0;
  }

  _.s.tz = tz;
}
jisotalo commented 1 year ago

2.7.0 julkaistu