Files
mph_switch/mph_switch.py
2017-07-26 18:44:22 -07:00

124 lines
4.6 KiB
Python

#!/usr/bin/env python2.7
import pprint
import json
import urllib2
import sys
import datetime
import time
import subprocess
import os
# load config
cfg=json.loads(open(sys.argv[1]).read())
card_type=cfg["card_type"]
miners=cfg["miners"]
user_name=cfg["user_name"]
miner_name=cfg["miner_name"]
os.environ["DISPLAY"]=":0"
# grab something from a website
def fetch(url):
r=urllib2.Request(url)
r.add_header("User-Agent", "Lynx/2.8.8dev.3 libwww-FM/2.14 SSL-MM/1.4.1")
r.add_header("Pragma", "no-cache")
return urllib2.build_opener().open(r).read()
# main
data=json.loads(fetch("http://miningpoolhub.com/?page=api&action=getminingandprofitsstatistics"))["return"]
coins={}
for i in reversed(data): # weed out unconfigured algos, do string substitutions
try:
miner=miners[i["algo"]]
coins[i["coin_name"]]=miner["bin"].format(HOST=i["host"], PORT=str(i["port"]), NAME=user_name, MINER=miner_name)
except:
data.remove(i)
sort={}
for i in data:
sort[i["coin_name"]+" ("+i["algo"]+")"]=i["normalized_profit_"+card_type]
sort=sorted(sort.items(), key=lambda x:x[1], reverse=True)
log=open("current-profit", "w")
for i in sort:
log.write(i[0]+": "+str(i[1])+"\n")
log.close()
max_profit_val=0 # find the most profitable coin
for i in data:
if i["normalized_profit_"+card_type]>max_profit_val:
max_profit=i
max_profit_val=i["normalized_profit_"+card_type]
miner=miners[max_profit["algo"]]
coin=coins[max_profit["coin_name"]]
# see if miner's already running
try:
subprocess.check_output(["pgrep", "-f", "^"+coin.replace("+", "\\+")])
current=1
except:
current=0
if (current==0):
other=0
for algo in coins:
try:
subprocess.check_output(["pgrep", "-f", "^"+coins[algo].replace("+", "\\+")])
other=1
except:
pass
if (current==0):
# log a change
algo_log=open("algo-log", "a")
algo_log.write(str(datetime.datetime.now())+": "+max_profit["coin_name"]+" ("+max_profit["algo"]+")\n")
algo_log.close()
if (other==1):
# kill existing miners
for algo in coins:
subprocess.call(["pkill", "-f", "^"+coins[algo].replace("+", "\\+")])
time.sleep(3)
if card_type=="nvidia": # update card settings
cards=int(subprocess.check_output("nvidia-smi --query-gpu=count --format=csv,noheader,nounits".split(" ")).split("\n")[-2])
for i in range(0, cards):
# power limit
if type(miner["power_limit"]) is int:
subprocess.call(("sudo nvidia-smi -i "+str(i)+" -pl "+str(miner["power_limit"])).split(" "))
else:
subprocess.call(("sudo nvidia-smi -i "+str(i)+" -pl "+str(miner["power_limit"][i])).split(" "))
# core overclock
if type(miner["gpu_oc"]) is int:
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUGraphicsClockOffset[2]="+str(miner["gpu_oc"])).split(" "))
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUGraphicsClockOffset[3]="+str(miner["gpu_oc"])).split(" "))
else:
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUGraphicsClockOffset[2]="+str(miner["gpu_oc"][i])).split(" "))
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUGraphicsClockOffset[3]="+str(miner["gpu_oc"][i])).split(" "))
# memory overclock
if type(miner["mem_oc"]) is int:
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUMemoryTransferRateOffset[2]="+str(miner["mem_oc"])).split(" "))
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUMemoryTransferRateOffset[3]="+str(miner["mem_oc"])).split(" "))
else:
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUMemoryTransferRateOffset[2]="+str(miner["mem_oc"][i])).split(" "))
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUMemoryTransferRateOffset[3]="+str(miner["mem_oc"][i])).split(" "))
# fan speed
if type(miner["fan"]) is int:
if (miner["fan"]==0):
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUFanControlState=0").split(" "))
else:
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUFanControlState=1").split(" "))
subprocess.call(("nvidia-settings -a [fan:"+str(i)+"]/GPUTargetFanSpeed="+str(miner["fan"])).split(" "))
else:
if (miner["fan"][i]==0):
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUFanControlState=0").split(" "))
else:
subprocess.call(("nvidia-settings -a [gpu:"+str(i)+"]/GPUFanControlState=1").split(" "))
subprocess.call(("nvidia-settings -a [fan:"+str(i)+"]/GPUTargetFanSpeed="+str(miner["fan"][i])).split(" "))
# launch new miner
subprocess.call(("screen -dmS miner "+coin).split(" "))