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