Miten ohjata BOINC laskentaa sähkön pörssihinnan mukaan?

  • Keskustelun aloittaja Keskustelun aloittaja htwt
  • Aloitettu Aloitettu
  • Avainsanat Avainsanat
    boinc
Liittynyt
15.06.2017
Viestejä
34
Miten saan BOINC -ohjelman lopettamaan laskennan kun tietty sähkön pörssihinta ylitetään?

BOINC on siis tällainen tieteen hyväksi hajautettua laskentaa tekevä ohjelma:
 
Joku skripti? Lisään vielä, että en ole koskaan kirjottanut skriptiä. Kapea kokemus C ohjelmoinnista ja sekin sulaututeista. (ilman OS)
 
Vieläkö Boincissa on jotain laskemisen arvoista? Sehän meni vähän huonoksi koko homma, kun World Community Grid siirtyi IBM:ltä Krembilille.

Sinänsä ketjun aihe kiinnostaisi, jos jotain järkevää työtä vielä löytyisi.
 
Olet osin oikeassa, mutta kyllä sieltä löytyy monenlaista yleishyödyllistä tutkimusprojektia. Itse olen halunnut antaa laskentakapasiteettia biologian alalle. Esimerkiksi proteiinien laskostuminen on edelleen tärkeää, vaikka Googlen tekoäly "löysi ne kaikki". Myös RNA tutkimus on nyt aika kuuma aihe.


Kaikki projektit:

Sydän- ja verisuonitautien tutkimus:

Näytönohjaimella laskettavia projekteja, esim. syöpätutkimus:

RNA tutkimusta: (+projektin kuvaus)

Rosetta@home on saanut paljon osallistujia: (+projektin kuvaus)

Mainitsemasi World Community Grid löytyy myös:

Oma osallistuminen loppui joskus 2007, mutta nyt olisi taas tehokas kone...

United Devices - Cancer Research Project.jpg


Edit: Homma ei vaadi välttämättä tehokasta tietokonetta. Moni projekti tukee eri alustoja kuten ARM ja Android. Laskentatehoa voi lahjoittaa vaikka ylimääräiseksi jääneellä kännykällä tai Raspilla.
Tietokoneeseen asennettuna se käyttää vain prosessorin tyhjäkäyntiajan eikä vaikuta normaalii koneen käyttöön.
 
Viimeksi muokattu:
Rosettaan ja WCG:iin olen osallistunut, mutta World Community Gridiltä on projektit loppuneet omistajanvaihdoksen myötä, ja sieltä lähteneet laskijat ovat täyttäneet muut projektit, joten laskettavaa on aika vähän tarjolla. Avaruusprojektien tilasta en tiedä, mutta ne eivät ole järin lähellä sydäntä.
 
Tein pythonilla skriptin joka käynnistää ja sulkee halutun prosessin pörssisähkön hinnan mukaan.
Skripti hakee noin 24 tunnin välein pörssisähkön hinnat porssisahko.net palvelusta (ensimmäinen jonka löysin googlesta).
En testannut juuri boinc ohjelmaa mutta tämän luulisi saavan toimimaan sen kanssa.
  1. Varmista että python on ajettavissa komentoriviltä. Windowsilla se pitää asentaa. Skripti testattu versiolla 3.10
  2. Tallenna oheinen koodi tiedostoon, esim. porssisahko.py
  3. Muokkaa skriptissä prosessin käynnistys argumentit (process_start_args ja process_stop_args) ja hinnan raja-arvo (price_threshold) haluttuun arvoon
    • Jos asennettu palveluna linuxilla käytä esim.
      process_start_args = ["systemctl", "start", "boinc"]
      process_stop_args = ["systemctl", "stop", "boinc"]
  4. Avaa komentorivi samassa kansiossa
  5. Ennen ensimmäistä käyttökertaa aja python -m pip install requests skriptin tarvitseman requests kirjaston asentamiseksi
  6. Käynnistä skripti ajamalla python porssisahko.py
  7. Ctrl+C pysäyttää ohjelman
Python:
# 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()

Edit:
  • Parannettu REST api kutsun virheenhallintaa
  • Lisätty process_stop_args jota voi käyttää jos prosessin pysäytys vaatii erillisen komennon. Esim taustalla pyörivän palvelun pysäytys
 
Viimeksi muokattu:
Siitä on jo aikaa kun BOINCia ajelin, joskus koronaepidemian aikana varmaan viimeksi. Ainakin linuxilla boincin sai palveluksi jota pystyi käynnistelemään ja sammuttelemaan ihan jotenkin tyyliin
Koodi:
systemctl start boinc

systemctl stop boinc
Jos tuon BOINCin tappaa ihan kylmästi niin menossa oleva laskenta katoaa bittiavaruuteen joten tuo pitää saada sammumaan jotenkin niin että BOINC kerkiää pysäyttämään laskennan ja tallentamaan tilanteen, muuten saattaa mennä paljon laskentaa ihan harakoille. En tiedä kuinka tuo BOINC reagoi tuohon proc.terminateen, saattaa ajaa itsensä kiltisti alas tai sitten tappaa sen niin että laskenta menee vituiksi. Tuo on syytä kokeilla.

Itselläni tuo oli ohjattuna niin että yön ajaksi pistettiin laskenta sammuksiin ettei tuulettimet häirinneet yöunia, ajelin siis makkarin nurkassa olevalla pikku serverillä tuota aikanaan ja välillä tuulettimet intoutuivat oikein kunnolla puhkumaan niin häiritsivät vähän nukkumista.
 

Uusimmat viestit

Statistiikka

Viestiketjuista
281 504
Viestejä
4 834 653
Jäsenet
78 258
Uusin jäsen
halfer

Hinta.fi

Back
Ylös Bottom