Skip to content

jisotalo/shelly-porssisahko

Repository files navigation

shelly-porssisahko - Pörssisähköohjaus Shelly-releisiin

License GitHub

Shelly-laitteisiin selaimella ohjattava ilmainen avoimen lähdekoodin pörssisähkösovellus. Skripti pyörittää käyttöliittymää omalla web-serverillä ja tallentaa asetukset Shellyn muistiin.

Skripti käyttää suoraan Viron kantaverkkoyhtiö Eleringin rajapintaa, eli välissä ei ole muita palveluita. Näin ollen rekisteröitymistä ei tarvita, vaan kaikki toimii "suoraan paketista".

Jos haluat ohjata Shelly Plug Plus -laitteen valon väriä sähkön hinnan mukaan, tsekkaa shelly-plug-nordpool-light.


IN ENGLISH

There is an English version of the script available at https://github.com/jisotalo/shelly-porssisahko-en.

It can be used to control Shelly devices by Nordpool electricity spot prices in Finland, Estonia, Latvia and Lithuania.


alt text

Ominaisuudet

  • Ilmainen + avoin lähdekoodi
  • Oma web-serveri Shellyn sisällä ja siinä pyörivä käyttöliittymä
  • Ei rekisteröitymistä
  • Valvonta ja konfigurointi nettiselaimen avulla kotiverkossa (PC, puhelin, tabletti)
  • Mahdollista luoda jopa kolme mahdollista yhtäaikaista ohjausta eri säännöillä
  • Nykyisen ja seuraavan päivän hinnat sekä toteutuva ohjaus näkyvillä
  • Kolme erilaista ohjaustapaa
  • Mahdollisuus ohjata osatunteja
  • Pakko-ohjaus väliaikaisesti tai aina tietyille tunneille (ohjaus päälle tai pois)
  • Vikasietoinen
    • Varmuustunnit (jos ei hintoja mutta tiedetään kellonaika)
    • Hätätilaohjaus (jos ei internet-yhteyttä eikä tiedetä kellonaikaa)
  • Konfiguroitavuus ja hienosäätö mahdollista omilla skripteillä

Sisällysluettelo

Muutoshistoria

Katso päivitysten sisältö CHANGELOG.md-tiedostosta.

Tarvittaessa vanhat skriptiversiot löytyvät Releases-sivulta. Lataa halutun version zip-tiedosto, ja kopioi dist/shelly-porssisahko.js-tiedoston sisältö.

Edellinen v.2-versio

Jos haluat käyttää edellistä (edelleen pomminvarmaa) v.2-versiota, se löytyy alta:

Tukeminen

Jos skriptistä on hyötyä, voit vaikka tarjota kahvit vastineena! Tämä on puhtaasti harrastuspohjalta tehty.

Buy Me A Coffee

Support

Asennus

Asennus kirjaston avulla (suositeltu tapa)

  1. Ota Shelly käyttöön, yhdistä se wifi-verkkoon ja päivitä sen firmware. Vanhempia firmware-versioita ei tueta.

  2. Avaa Shellyn hallinta nettiselaimella.

  3. Avaa Scripts-sivu Shellyn hallinnasta.

  4. Paina Library-painiketta

    alt text

  5. Aukeavassa ikkunassa paina Configure URL.

  6. Syötä osoitteeksi https://raw.githubusercontent.com/jisotalo/shelly-porssisahko/master/shelly-library.json ja paina Save.

    alt text

  7. Nyt kirjastoon ilmestyy pörssisähköohjaus-skriptit. Asenna pääskripti (ylin) painamalla Import code.

    alt text

  8. Kun koodi ilmestyy, paina Save.

    alt text

  9. Tallentamisen jälkeen laita skriptin alla konsolissa websocket debug päälle painamalla Enable. Tämä on tärkeää, jotta näet osoitteen ja tilatiedot käynnistyksen jälkeen. Tämä täytyy tehdä vain kerran.

    alt text

  10. Paina Start, jolloin skripti käynnistyy

    alt text

  11. Nyt näet skriptin alla konsolissa hallinnan osoitteen. Kopioi tämä osoite talteen ja avaa se selaimessa uudessa välilehdessä. Osoite on muotoa http://ip-osoite/script/1.

    alt text

  12. Siirry vielä takaisin Scripts-sivulle ja laita Run on startup -täppä päälle, jotta skripti käynnistyy aina Shellyn käynnistyessä.

    alt text

  13. Valmis! Avaa käyttöliittymä selaimessa (osoite kohdassa 11) ja säädä asetukset kohdilleen Asetukset-kappaleen ohjeilla.

Asennus käsin

Jos haluat asentaa skriptin käsin, Shelly Smart Control -sovelluksella tai control.shelly.cloud -pilvipalvelun kautta, löydät skriptin osoitteesta:

https://raw.githubusercontent.com/jisotalo/shelly-porssisahko/master/dist/shelly-porssisahko.js.

Seuraa ylläolevia ohjeita pääpirteittäin, mutta kopioi skriptin sisältö Shellyyn sellaisenaan, Library-toiminnon sijaan.

Skriptin päivitys

Jos haluat päivittää skriptin uusimpaan versioon, poista nykyinen skripti ja tee asenna uusi Library-painikkeen kautta. Voit myös päivittää sen käsin asentamalla uusiksi.

Kaikki asetukset säilyvät päivittäessä, paitsi jos päivität v.2 -> v.3.

Tarkista asennuksen jälkeen, että Run on startup on yhä valittu.

Laitteisto ja sähköinen kytkentä

Itse olen ostanut laitteita Nurkan Takaa -kaupasta, jonka olen todennut luotettavaksi ja järkihintaiseksi.

Jos ohjaat kontaktoria, on suositeltavaa käyttää Shellyn sinisiä laitteita tai Pro-malleja. Nämä kestävät kontaktorin aiheuttamia kytkentäpiikkejä. Esimerkkejä:

Hyvää tietoa laitteista löytyy Shelly tuki (suomeksi) -ryhmästä.

Skripti toimii tunnetusti ainakin seuraavilla:

  • Shelly Plus 1PM
  • Shelly Plus 2PM
  • Shelly Plus 1
  • Shelly Pro 1
  • Shelly Pro 2
  • Shelly Pro 3
  • Shelly Pro 4PM
  • Shelly Pro3EM + Switch Add-on
  • Shelly Plus UNI
  • Shelly Plus 1 Mini
  • Shelly Plus Plug S

Asetukset

Versiosta 3.0.0 lähtien skriptissä on mahdollista konfiguroida useita eri ohjauksia rinnakkain (max 3 kpl). Tämä mahdollistaa esimerkiksi usean lähdön ohjauksen eri säännöillä käyttäen monikanavaisia Shelly Pro -malleja.

Käsiteltävä ohjaus valitaan alasvetovalikosta sivun ylälaidasta. Hallinta näyttää aina valitus ohjauksen tilan, historian ja asetukset.

alt text

Yleiset asetukset

Nämä asetukset ovat samat kaikille ohjauksille. alt text

Asetus Selite Esim. (kuva yllä)
Maa Maa, jonka sähkön hinnat haetaan (Suomi, Viro, Latvia, Liettua). Suomi
Sähkön ALV Käytettävä ALV-% sähkön hinnalle. [%] 25.5
Siirtomaksut Jos haluat että siirtomaksut otetaan huomioon, voit syöttää ne päivä- ja yöajalle. Nämä lisätään tuntihintoihin. [c/kWh]

Esim. jos haluat ottaa erisuuruiset siirtomaksut huomioon tuntien valinnassa.
päivä: 4
yö: 3

Ohjauskohtaiset asetukset

Nämä asetukset ovat ohjauskohtaisia.

alt text

Yleiset

Asetus Selite Esim. (kuva yllä)
Käytössä Onko valittu ohjaus käytössä. ON
Ohjaustapa Millä ohjaustavalla lähtöä ohjataan.

Selitykset taulukon alapuolella.
jakson halvimmat tunnit
Ohjattavat lähdöt Shellyn ohjattavien lähtöjen ID-numerot.

Jos useampi lähtö, erota pilkulla (max. 4 kpl).

- Yksi lähtö (mm. Shelly Plus 1) --> 0.
- Useampi (esim 0, 1 ja 100) --> 0,1,100
0
Lähdön ohjaus Ohjataanko relelähtö aina haluttuun tilaan vai ainoastaan jos tila muuttuu.

- Aina tarkistaessa: Lähtö ohjataan joka tarkistuksen jälkeen (eli yleensä kerran tunnissa) haluttuun tilaan ja Shellyn sovelluksen tai hallintapaneelin kautta tehty muutos ylikirjoitetaan.
- Vain muuttuessa: Lähtö ohjataan ensimmäisellä kerralla haluttuun tilaan ja sen jälkeen ainoastaan sen muuttuessa.
aina tarkistaessa
Ohjausminuutit Määrittää kuinka monta minuuttia tunnista ohjaus on päällä. Jos tunti on turhan pitkä aika pitää lähtöä päällä, voidaan aika muuttaa lyhyemmäksi. Asetus vaikuttaa kaikkiin ohjauksiin, pois lukien pakko-ohjaus käsin. [min]

Esim. 30 minuuttia riittää aina varaajan lämmittämiseen, joten pidetään vain tunnin ensimmäiset 30 minuuttia ohjausta päällä.
60
Käänteinen ohjaus Jos ruksittu, ohjaus toimii käänteisesti normaaliin nähden. Tällöin lähtökohta on, että lähtö on päällä.

- Varmuustunnit: Lähtö ohjataan varmuustunneilla pois päältä
- Hätätilaohjaus: Lähtö on päinvastainen asetukseen nähden
- Pakko-ohjaukset: Lähtö voidaan pakko-ohjata pois päältä
- Käsiohjaus: Lähtö on päinvastainen asetukseen nähden
- Hintaraja: Jos hinta on alle rajan, lähtö asetetaan pois päältä
- Jakson halvimmat tunnit: Jos nykyinen tunti on halvimpia tunteja, lähtö asetetaan pois päältä
ei
Varmuustunnit Jos sähkön hintaa ei jostain syystä tiedetä, ohjataan lähtö näillä tunneilla päälle.

Esim. ongelma hintojen haussa tai nettiyhteys katkeaa.
01:00-07:00
Hätätilaohjaus Jos Shelly ei jostain syystä tiedä kellonaikaa, ohjataan lähtö tähän tilaan varmuuden vuoksi.

Esim. jos sähkökatkon jälkeen nettiyhteys ei palaudu (ei hintoja eikä kellonaikaa).
ON
Pakko-ohjaukset Voidaan määrittää tunnit, jolloin ohjaus asetetaan joko päälle tai pois riippumatta sähkön hinnasta ja muista ohjauksista (pl. pakko-ohjaus käsin).

Esim. jos haluat lämmittää varajaa joka aamu tai estää ohjauksen tiettynä osana vuorokaudesta.
05:00-07:00 ja 19:00-21:00 päällä

01:00-02:00 pois

Käsiohjaus

Voimassa, jos valittu ohjaustapa on käsiohjaus.

Käsiohjauksella lähtö ohjataan käyttöliittymältä asetettuun tilaan.

image

Asetus Selite Esim. (kuva yllä)
Ohjaus Asetetaanko lähtö päälle vai pois ON

Hintaraja

Voimassa, jos valittu ohjaustapa on hintaraja.

Hintarajaohjauksella lähtö asetetaan päälle jos sähkön hinta on alle määritellyn rajan (tai juuri sen verran).

image

Asetus Selite Esim. (kuva yllä)
Hintaraja Hinta, jossa ja jonka alla lähtö asetetaan päälle. [c/kWh]

Voit syöttää tähän myös arvon avg, jolloin käytetään päivän hinnan keskiarvoa.
4.25

Jakson halvimmat tunnit

Voimassa, jos valittu ohjaustapa on jakson halvimmat tunnit.

Jakson halvimmat tunnit -ohjauksella vuorokausi jaetaan osiin. Lähtö ohjataan päälle jokaisen osan halvimmmilla tunneilla. Lisäksi voidaan määrittää raja jonka alla ohjaus on aina päällä.

Vuorokausi voidaan jakaa tasaisiin osiin (esim. 8h välein) tai syöttää omat käytettävät aikavälit (esim. aamu ja ilta).

image

Asetus Selite Esim. (kuva yllä)
Ajanjakso Minkä mittaisiin jaksoihin vuorokausi jaetaan. Jokaiselta jaksolta haetaan sitten halvimmat tunnit. [h]

Vaihtoehtona on myös oma valinta. Tällöin kellonajat voidaan syöttää itse. Katso lisätietoa kappaleesta Jakson halvimmat tunnit - omavalintaiset jaksot
6
Tuntimäärä Kuinka monta halvinta tuntia lähtö ohjataan päälle ajanjakson aikana.

Eli jos ajanjakso on 6h ja tuntimäärä 2, kello 00:00-06:00 lähtö ohjataan päälle kahtena halvimpana tuntina. Kuten myös kello 06:00-12:00 ja niin edelleen.
2
Peräkkäiset Jos käytössä, valitaan jakson tunnit siten että ne ovat peräkkäin.

Näin yksittäisiä halvimpia tunteja ei välttämättä hyödynnetä, mutta halvin mahdollinen yhtenäinen jakso otetaan käyttöön. Katso esimerkki alta.
ei
Aina päällä -raja Jos sähkö on tätä halvempaa (tai juuri tämän hintaista) niin lähtö on aina päällä. [c/kWh]

Voit syöttää tähän myös arvon avg, jolloin käytetään päivän hinnan keskiarvoa.
-0.5
Maksimihinta Jos sähkön hinta on tätä korkeampi, lähtöä ei aseteta päälle vaikka tunti olisikin halvimpia tunteja. [c/kWh]

Voit syöttää tähän myös arvon avg, jolloin käytetään päivän hinnan keskiarvoa.

Tämän kanssa pitää olla tarkkana, jos tulee kalliita päiviä.
30

Alla esimerkki miten ohjaukset toteutuivat 12.10.2023 hinnoilla ja yllä olevilla asetuksilla (6h, 2 halvinta tuntia, aina päällä -raja -0.5 c/kWh). Huomaa jaksojen korostus taustavärillä.

image

Alla on havainnollistettu peräkkäiset-asetuksen vaikutusta. Esimerkkikuvissa asetuksena on 4h ajanjakso ja tuntimäärä 3.

Ei käytössä (oletusarvo):

Valitaan kolme halvinta tuntia.

image

Käytössä:

Valitaan kolme perättäistä tuntia. Valitaan kello 17-19 koska niiden hinnan keskiarvo on pienempi kuin kello 16-18.

image

Jakson halvimmat tunnit - omavalintaiset jaksot

Asetuksiin voidaan syöttää vaihtoehtoisesti yksi tai kaksi omavalintaista jaksoa tuntimäärineen. Tämän avulla saadaan helposti tehtyä esimerkiksi "kolme halvinta tuntia yöllä kello 00-06 väliltä ja yksi halvin tunti illalla kello 18-21 väliltä" -tyylinen ohjaus.

Valittaessa ajanjaksoksi oma valinta, voidaan syöttää halutut kellonajat ja tuntimäärät alla olevan kuvan mukaisesti.

image

Tällöin ohjaus voisi mennä esimerkiksi seuraavasti:

image

Toiminnot

alt text

  • Pakko-ohjaus
    • Painamalla tätä voit asettaa kyseisen ohjauksen lähdöt päälle tai pois määritellyksi ajaksi
    • Syötä kysyttäessä kuinka monta tuntia pakko-ohjaus on käytössä sekä haluttu lähdön tila (voit syöttää myös osatunteja, esim. 0.5 on puoli tuntia)
  • Shellyn hallinta
    • Avaa uudessa välilehdessä Shellyn oman hallintasivun

Lisätoiminnot ja käyttäjäskriptit

Skriptiä voi jatkojalostaa omalla koodilla. Alla olevat esimerkit löytyvät valmiina.

Skripti Selitys
shelly-porssisahko-open-meteo-api.js Hakee vuorokauden kylmimmän lämpötilan ja muuttaa sen perusteella halvimpien tuntien lukumäärää.
shelly-porssisahko-addon-temp-hours.js Muuttaa halvimpien tuntien lukumäärää Shelly Plus Addonin mittaaman lämpötilan perusteella
shelly-porssisahko-addon-temp.js Ylikirjoittaa ohjauksen tarvittaessa Shelly Plus Addonin mittaaman lämpötilan perusteella
shelly-porssisahko-ht-sensor-temp.js Muuttaa halvimpien tuntien lukumäärää Shelly H&T:n mittaaman lämpötilan perusteella
shelly-porssisahko-config.js Rinnalle asennettava skripti, jonka avulla voi muuttaa pörssisähköohjauksen asetuksia ilman web-käyttöliittymää (esim. etänä puhelimella). Tsekkaa Asetusten muokkaaminen skriptin kautta (etänä)

Ominaisuudet

Skripti kutsuu seuraavia funktiota eri tilanteissa, mikäli ne ovat määritelty. Katso esimerkkejä niiden käytöstä yllä olevista skripteistä.

Funktio Määrittely Parametrit Selitys
USER_CONFIG USER_CONFIG(inst: number, initialized: boolean) => void inst = ohjauksen numero (0, 1, 2)
initialized = asetukset ovat muuttuneet
Kutsutaan kun asetukset ovat muuttuneet tai juuri ennen logiikan suoritusta. Funktion sisällä voidaan ylikirjoittaa asetuksia.
USER_OVERRIDE USER_OVERRIDE(inst: number, cmd: boolean, callback: function(boolean)) => void inst = ohjauksen numero (0, 1, 2)
cmd = logiikan määrittämä komento
callback = takaisinkutsu
Kutsutaan kun ohjauslogiikka on suoritettu. Tässä voi vielä ylikirjoittaa skriptin ohjauksen. callback()-funktiota pitää kutsua halutulla komennon arvolla.
USER_LOOP USER_LOOP() => void Kutsutaan ohjelman ajastinsilmukassa mikäli ei ole muuta tehtävää (10s välein). Funktion pitää kirjoittaa loopRunning = false kun valmis.

Asetusten muokkaaminen skriptin kautta (etänä)

Tämä voi olla kätevä, jos skriptin asetuksia täytyy muuttaa ilman pääsyä skriptin omaan hallintaan. Esimerkiksi Shellyn sovelluksen kautta etänä.

  1. Asenna käsin tai library-painikkeen avulla shelly-porssisahko-config.js pääskriptin rinnalle (pidä pääskripti päällä kuten ennenkin)
  2. Ota kommentit (//) pois koodista niiden asetusten kohdalta, joita haluat muokata. Muut pysyvät ennallaan.
  3. Paina save ja käynnistä skripti. Se sammuu automaattisesti.

Esim. alla muutetaan etänä halpojen tuntien lukumäärä arvoon 8h yhdestä ohjauksesta.

alt text

Kysymyksiä ja vastauksia

Miksi hintatietoja ei saada?

Joskus Eleringillä voi olla ongelmia. Tämän takia on tärkeää aina asettaa varmuustunnit.

Tarkista Shellyn Diagnostics-loki virheilmoitusten varalta. Voit koittaa avata lokissa näkyvän Elering-osoitteen omassa selaimessa ja katsoa näkyykö ladatattavassa csv-tiedostossa kaikki hinnat. Jos ei näy, ei skriptikään saa niitä luettua.

alt text

Osoite on muotoa: https://dashboard.elering.ee/api/nps/price/csv?fields=fi&start=2024-12-05T00:00:00%2b02:00&end=2024-12-05T23:59:59%2b02:00

Tarkista myös, että näkyykö hinnat Eleringin sivuilla: https://dashboard.elering.ee/et/nps/price. Jos ei näy, ei skriptikään saa niitä luettua.

Onko skripti kuinka toimintavarma?

Tavoite on, että skripti on mahdollisimman toimintavarma ja sen voi unohtaa ajoon. Versio 2 on pyörinyt itsellä yhtäjaksoisesti yli 100 päivää ilman ongelmia.

alt text

Miksi välillä tulee HTTP error 503?

Kun skripti hakee hintoja tai suorittaa ohjauslogiikkaa, vastataan kaikkiin HTTP-pyyntöihin 503 (Service Unavailable) muistin säästämiseksi. Käyttöliittymä osaa hallita tämän.

Tämä virhe voi joskus tulla ja se on ominaisuus. Kokeile avata sivu uudelleen.

Miten ohjaan ainoastaan yön halvimmilla tunneilla?

Valitse ajanjaksoksi oma valinta (1 jakso) ja aseta asetukset. Katso Jakson halvimmat tunnit - omavalintaiset jaksot.

Miten saan lähdön päälle aina jos sähkön hinta on keskiarvon alapuolella?

Valitse ohjaustavaksi hintaraja ja aseta hintarajaksi arvon avg.

Miksi laitteen nimen kohdalla lukee "Ei asetettu"?

Et ole asettanut laitteelle nimeä Shellyn hallinnasta. Nimen voit asettaa Settings -> Device name alta.

Huomaa, että tehdasasetuksena nimen kohdalla lukee lukee laitteen malli. Tämä näkyy silti pörssisähköskriptille tyhjänä.

Kuinka saa skriptin toimimaan Switch Add-Onin kanssa?

Testattu Shelly Pro3EM + Switch Add-on.

Kun olet asentanut add-onin, näet lähdön numeron Shellyn hallinnassa. Alla olevassa esimerkissä lähdön numero on 100.

image

Muuta skriptin asetuksista ohjattavat lähdöt kyseiseen arvoon, jolloin ohjaus toimii.

Milloin seuraavan päivän hinnat haetaan? Miksi hintoja ei näy vaikka kello on 14?

Seuraavan päivän hinnat haetaan kello 15. Elering tarjoaa uudet hinnat n. 14:30 alkaen.

Mihin asetukset tallentuvat?

Asetukset tallentuvat Shellyn KVS-muistiin (Advanced -> KVS). Asetukset ovat JSON-muodossa ja voit muokata niitä vapaasti myös Shellyn hallinnan kautta. Skripti täytyy käynnistää uudestaan, jotta asetukset tulevat voimaan.

alt text

Miksi historia on niin lyhyt?

Kokonaishistoriaa tallennetaan ainoastaan 24 ohjauksen verran muistin säästämiseksi.

  • Jos vain yksi ohjaus on käytössä, sen historiassa näkyy 24 viime ohjausta.
  • Jos kaksi ohjausta on käytössä, niiden historiassa näkyy 12 viime ohjausta.
  • Jos kolme ohjausta on käytössä, niiden historiassa näkyy 8 viime ohjausta.

Teknistä tietoa

Yleistä

  • Shellyn vähäisen muistin takia monia asioita on tehty aika rumasti
  • Outoja temppuja on myös tehty minimointia helpottamaan
  • Jotain muuttujia on ollut pakko laittaa globaaliksi, koska Shellyn js-moottorin pino tulee nopeasti täyteen
    • esim. silmukan i saattaa saada ihan yhtäkkiä oudon arvon
  • Lopullinen asennettava skripti on "kääntöprosessin" tulos
  • Staattiset serverin tiedostot pakataan ja base64-enkoodataan
  • Pääskripti minimoidaan
  • Käyttää Eleringin CSV-apia muistin säästämiseksi (JSON vie liikaa)
  • Muistin käyttö 3.0.0 versiolla huipussaan noin 18kt (Shellyn maksimi 25kt)
    • Muille skripteille jää vielä hyvin tilaa
script:1: {
  id: 1,
  running: true,
  mem_used: 11900,
  mem_peak: 18116,
  mem_free: 13286
},

Skriptin kääntäminen

  1. Asenna Node.js
  2. Kloonaa repository ja avaa terminaali shelly-porssisahko-kansiossa
  3. Aja komento npm i asentaaksesi kirjastot
  4. Aja komento npm run build kääntääksesi projektin
  5. Valmiit skriptit löytyvät dist/-kansiosta

License

GNU Affero General Public License v3.0 - LICENSE.txt

Huomaathan, että projekti on täysin harrasteena tehty, eikä siinä ole lisenssin mukaisesti mitään takuuta. Näin ollen tekijä ei ole vastuussa jos sen käytön kanssa on ongelmia.

Käytetty välilehtiratkaisu pohjautuu esimerkkiin täältä.