Follow along with the video below to see how to install our site as a web app on your home screen.
Huomio: This feature may not be available in some browsers.
python
on ajettavissa komentoriviltä. Windowsilla se pitää asentaa. Skripti testattu versiolla 3.10porssisahko.py
process_start_args
ja process_stop_args
) ja hinnan raja-arvo (price_threshold
) haluttuun arvoonprocess_start_args = ["systemctl", "start", "boinc"]
process_stop_args = ["systemctl", "stop", "boinc"]
python -m pip install requests
skriptin tarvitseman requests kirjaston asentamiseksipython porssisahko.py
# Mikä prosessi käynnistetään. Muokkaa tähän haluamasi
process_start_args = ["boinc"]
# Jos prosessi pyörii taustalla (esim palvelu) ja vaatii erillisen pysäytyskomennon, muokkaa se tähän
process_stop_args = []
# Prosessi pysäytetään jos pörssisähkön hinta ylittää raja-arvon
price_threshold = 5 # snt/kWh
import subprocess
import time
from datetime import datetime, timedelta, timezone
import requests
def get_latest_prices():
try:
response = requests.get("https://api.porssisahko.net/v1/latest-prices.json", timeout=60)
response.raise_for_status()
prices = response.json()["prices"]
for p in prices:
p["startDate"] = datetime.fromisoformat(p["startDate"].replace("Z", "+00:00"))
p["endDate"] = datetime.fromisoformat(p["endDate"].replace("Z", "+00:00"))
return prices
except requests.RequestException as e:
print(f"{e}: {e.response.text if e.response else None}")
return None
def get_price(prices: list, at: datetime):
if not prices:
return None
return next((p["price"] for p in prices if p["startDate"] <= at < p["endDate"]), None)
def main():
print(f"Ajetaan {process_start_args} kun pörssisähkön hinta alittaa {price_threshold} snt/kWh")
prices = []
proc: subprocess.Popen = None
while True:
utcnow = datetime.now(timezone.utc)
# Nord Pool julkaisee seuraavan päivän tiedot klo 14 eli 10 tuntia ennen edellisten tietojen loppua.
if not prices or (prices[0]["endDate"] - utcnow) < timedelta(hours=9):
print(f"{datetime.now()} Haetaan pörssisähkön hinnat")
prices = get_latest_prices()
if prices:
print(f"{datetime.now()} Hinnat haettu {prices[0]['endDate'].astimezone()} asti")
price_now = get_price(prices, utcnow)
if price_now and price_now <= price_threshold:
if not proc:
print(f"{datetime.now()} Ajetaan {process_start_args} koska pörssisähkö on {price_now} snt/kWh")
proc = subprocess.Popen(process_start_args)
else:
if proc:
if proc.poll() is None:
print(f"{datetime.now()} Pysäytetään {proc.args} koska pörssisähkö on {price_now} snt/kWh")
proc.terminate()
try:
exitcode = proc.wait(60)
except TimeoutError:
proc.kill()
exitcode = proc.wait(10)
print(f"Exited with {exitcode}")
if process_stop_args:
print(f"{datetime.now()} Ajetaan {process_stop_args} koska pörssisähkö on {price_now} snt/kWh")
subprocess.run(process_stop_args, check=True, timeout=60)
proc = None
time.sleep(60)
if __name__ == "__main__":
main()
process_stop_args
jota voi käyttää jos prosessin pysäytys vaatii erillisen komennon. Esim taustalla pyörivän palvelun pysäytyssystemctl start boinc
systemctl stop boinc
Käytämme välttämättömiä evästeitä, jotta tämä sivusto toimisi, ja valinnaisia evästeitä käyttökokemuksesi parantamiseksi.