Created mining dashboard
This commit is contained in:
parent
f1df9fe243
commit
9f3b4c48ea
3 changed files with 87 additions and 98 deletions
|
|
@ -58,23 +58,54 @@ async def get_mempool_recommended_fees(gerty):
|
||||||
r = await client.get(gerty.mempool_endpoint + "/api/v1/fees/recommended")
|
r = await client.get(gerty.mempool_endpoint + "/api/v1/fees/recommended")
|
||||||
return r.json()
|
return r.json()
|
||||||
|
|
||||||
async def api_get_mining_stat(stat_slug: str, gerty):
|
async def get_mining_dashboard(gerty):
|
||||||
stat = "";
|
areas = []
|
||||||
if isinstance(gerty.mempool_endpoint, str):
|
if isinstance(gerty.mempool_endpoint, str):
|
||||||
async with httpx.AsyncClient() as client:
|
async with httpx.AsyncClient() as client:
|
||||||
if stat_slug == "mining_current_hash_rate":
|
# current hashrate
|
||||||
r = await client.get(gerty.mempool_endpoint + "/api/v1/mining/hashrate/1m")
|
r = await client.get(gerty.mempool_endpoint + "/api/v1/mining/hashrate/1w")
|
||||||
data = r.json()
|
data = r.json()
|
||||||
stat = {}
|
hashrateNow = data['currentHashrate']
|
||||||
stat['current'] = data['currentHashrate']
|
hashrateOneWeekAgo = data['hashrates'][6]['avgHashrate']
|
||||||
stat['1w'] = data['hashrates'][len(data['hashrates']) - 7]['avgHashrate']
|
|
||||||
elif stat_slug == "mining_current_difficulty":
|
text = []
|
||||||
|
text.append(get_text_item_dict("Current mining hashrate", 12))
|
||||||
|
text.append(get_text_item_dict("{0}hash".format(si_format(hashrateNow, 6, True, " ")), 20))
|
||||||
|
text.append(get_text_item_dict("{0} vs 7 days ago".format(get_percent_difference(hashrateNow, hashrateOneWeekAgo, 3)), 12))
|
||||||
|
areas.append(text)
|
||||||
|
|
||||||
|
r = await client.get(gerty.mempool_endpoint + "/api/v1/difficulty-adjustment")
|
||||||
|
|
||||||
|
# timeAvg
|
||||||
|
text = []
|
||||||
|
time_avg = r.json()['timeAvg'] / 1000
|
||||||
|
hours, remainder = divmod(time_avg, 3600)
|
||||||
|
minutes, seconds = divmod(remainder, 60)
|
||||||
|
time_avg = '{:02} minutes {:02} seconds'.format(int(minutes), int(seconds))
|
||||||
|
text.append(get_text_item_dict("Current block time", 12))
|
||||||
|
text.append(get_text_item_dict(str(time_avg), 20))
|
||||||
|
areas.append(text)
|
||||||
|
|
||||||
|
# difficulty adjustment
|
||||||
|
text = []
|
||||||
|
stat = r.json()['remainingTime']
|
||||||
|
text.append(get_text_item_dict("Time to next difficulty adjustment", 12))
|
||||||
|
text.append(get_text_item_dict(get_time_remaining(stat / 1000, 3), 20))
|
||||||
|
areas.append(text)
|
||||||
|
|
||||||
|
# difficultyChange
|
||||||
|
text = []
|
||||||
|
difficultyChange = round(r.json()['difficultyChange'], 2)
|
||||||
|
text.append(get_text_item_dict("Estimated difficulty change", 12))
|
||||||
|
text.append(get_text_item_dict("{0}{1}%".format("+" if difficultyChange > 0 else "", round(difficultyChange, 2)), 20))
|
||||||
|
areas.append(text)
|
||||||
|
|
||||||
r = await client.get(gerty.mempool_endpoint + "/api/v1/mining/hashrate/1m")
|
r = await client.get(gerty.mempool_endpoint + "/api/v1/mining/hashrate/1m")
|
||||||
data = r.json()
|
data = r.json()
|
||||||
stat = {}
|
stat = {}
|
||||||
stat['current'] = data['currentDifficulty']
|
stat['current'] = data['currentDifficulty']
|
||||||
stat['previous'] = data['difficulty'][len(data['difficulty']) - 2]['difficulty']
|
stat['previous'] = data['difficulty'][len(data['difficulty']) - 2]['difficulty']
|
||||||
return stat
|
return areas
|
||||||
|
|
||||||
async def api_get_lightning_stats(gerty):
|
async def api_get_lightning_stats(gerty):
|
||||||
stat = {}
|
stat = {}
|
||||||
|
|
@ -88,8 +119,6 @@ async def get_lightning_stats(gerty):
|
||||||
data = await api_get_lightning_stats(gerty)
|
data = await api_get_lightning_stats(gerty)
|
||||||
areas = []
|
areas = []
|
||||||
|
|
||||||
logger.debug(data['latest']['channel_count'])
|
|
||||||
|
|
||||||
text = []
|
text = []
|
||||||
text.append(get_text_item_dict("Channel Count", 12))
|
text.append(get_text_item_dict("Channel Count", 12))
|
||||||
text.append(get_text_item_dict(format_number(data['latest']['channel_count']), 20))
|
text.append(get_text_item_dict(format_number(data['latest']['channel_count']), 20))
|
||||||
|
|
@ -122,26 +151,6 @@ async def get_lightning_stats(gerty):
|
||||||
|
|
||||||
return areas
|
return areas
|
||||||
|
|
||||||
async def get_mining_stat(stat_slug: str, gerty):
|
|
||||||
text = []
|
|
||||||
if stat_slug == "mining_current_hash_rate":
|
|
||||||
stat = await api_get_mining_stat(stat_slug, gerty)
|
|
||||||
logger.debug(stat)
|
|
||||||
current = "{0}hash".format(si_format(stat['current'], 6, True, " "))
|
|
||||||
text.append(get_text_item_dict("Current Mining Hashrate", 20))
|
|
||||||
text.append(get_text_item_dict(current, 40))
|
|
||||||
# compare vs previous time period
|
|
||||||
difference = get_percent_difference(current=stat['current'], previous=stat['1w'])
|
|
||||||
text.append(get_text_item_dict("{0} in last 7 days".format(difference), 12))
|
|
||||||
elif stat_slug == "mining_current_difficulty":
|
|
||||||
stat = await api_get_mining_stat(stat_slug, gerty)
|
|
||||||
text.append(get_text_item_dict("Current Mining Difficulty", 20))
|
|
||||||
text.append(get_text_item_dict(format_number(stat['current']), 40))
|
|
||||||
difference = get_percent_difference(current=stat['current'], previous=stat['previous'])
|
|
||||||
text.append(get_text_item_dict("{0} since last adjustment".format(difference), 12))
|
|
||||||
# text.append(get_text_item_dict("Required threshold for mining proof-of-work", 12))
|
|
||||||
return text
|
|
||||||
|
|
||||||
def get_next_update_time(sleep_time_seconds: int = 0, timezone: str = "Europe/London"):
|
def get_next_update_time(sleep_time_seconds: int = 0, timezone: str = "Europe/London"):
|
||||||
utc_now = pytz.utc.localize(datetime.utcnow())
|
utc_now = pytz.utc.localize(datetime.utcnow())
|
||||||
next_refresh_time = utc_now + timedelta(0, sleep_time_seconds)
|
next_refresh_time = utc_now + timedelta(0, sleep_time_seconds)
|
||||||
|
|
@ -159,3 +168,32 @@ def gerty_should_sleep(timezone: str = "Europe/London"):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_date_suffix(dayNumber):
|
||||||
|
if 4 <= dayNumber <= 20 or 24 <= dayNumber <= 30:
|
||||||
|
return "th"
|
||||||
|
else:
|
||||||
|
return ["st", "nd", "rd"][dayNumber % 10 - 1]
|
||||||
|
|
||||||
|
|
||||||
|
def get_time_remaining(seconds, granularity=2):
|
||||||
|
intervals = (
|
||||||
|
# ('weeks', 604800), # 60 * 60 * 24 * 7
|
||||||
|
('days', 86400), # 60 * 60 * 24
|
||||||
|
('hours', 3600), # 60 * 60
|
||||||
|
('minutes', 60),
|
||||||
|
('seconds', 1),
|
||||||
|
)
|
||||||
|
|
||||||
|
result = []
|
||||||
|
|
||||||
|
for name, count in intervals:
|
||||||
|
value = seconds // count
|
||||||
|
if value:
|
||||||
|
seconds -= value * count
|
||||||
|
if value == 1:
|
||||||
|
name = name.rstrip('s')
|
||||||
|
result.append("{} {}".format(round(value), name))
|
||||||
|
return ', '.join(result[:granularity])
|
||||||
|
|
|
||||||
|
|
@ -201,31 +201,11 @@
|
||||||
label="mempool.space recommended fees"
|
label="mempool.space recommended fees"
|
||||||
></q-toggle>
|
></q-toggle>
|
||||||
|
|
||||||
|
|
||||||
<q-expansion-item
|
|
||||||
expand-separator
|
|
||||||
icon="money"
|
|
||||||
label="Mining Data"
|
|
||||||
>
|
|
||||||
<q-toggle
|
<q-toggle
|
||||||
v-model="toggleStates.mining"
|
v-model="formDialog.data.display_preferences.mining_dashboard"
|
||||||
label="Toggle all"
|
label="Mining Dashboard"
|
||||||
>
|
|
||||||
<q-tooltip>Toggle all</q-tooltip>
|
|
||||||
</q-toggle>
|
|
||||||
<br>
|
|
||||||
<q-toggle
|
|
||||||
v-model="formDialog.data.display_preferences.mining_current_hash_rate"
|
|
||||||
label="Current mining hashrate"
|
|
||||||
></q-toggle>
|
></q-toggle>
|
||||||
|
|
||||||
<q-toggle
|
|
||||||
v-model="formDialog.data.display_preferences.mining_current_difficulty"
|
|
||||||
label="Current mining difficulty"
|
|
||||||
></q-toggle>
|
|
||||||
</q-expansion-item>
|
|
||||||
|
|
||||||
|
|
||||||
<q-toggle
|
<q-toggle
|
||||||
v-model="formDialog.data.display_preferences.lightning_dashboard"
|
v-model="formDialog.data.display_preferences.lightning_dashboard"
|
||||||
label="Lightning Network Dashboard"
|
label="Lightning Network Dashboard"
|
||||||
|
|
@ -497,8 +477,7 @@
|
||||||
onchain_dashboard: true,
|
onchain_dashboard: true,
|
||||||
mempool_recommended_fees: true,
|
mempool_recommended_fees: true,
|
||||||
mempool_tx_count: true,
|
mempool_tx_count: true,
|
||||||
mining_current_hash_rate: true,
|
mining_dashboard: true,
|
||||||
mining_current_difficulty: true,
|
|
||||||
lightning_dashboard: true
|
lightning_dashboard: true
|
||||||
},
|
},
|
||||||
lnbits_wallets: [],
|
lnbits_wallets: [],
|
||||||
|
|
|
||||||
|
|
@ -176,13 +176,13 @@ async def get_screen_data(screen_num: int, screens_list: dict, gerty):
|
||||||
elif screen_slug == "fun_exchange_market_rate":
|
elif screen_slug == "fun_exchange_market_rate":
|
||||||
areas.append(await get_exchange_rate(gerty))
|
areas.append(await get_exchange_rate(gerty))
|
||||||
elif screen_slug == "onchain_dashboard":
|
elif screen_slug == "onchain_dashboard":
|
||||||
areas.append(await get_onchain_dashboard(gerty))
|
title = "Onchain Data"
|
||||||
|
areas = await get_onchain_dashboard(gerty)
|
||||||
elif screen_slug == "mempool_recommended_fees":
|
elif screen_slug == "mempool_recommended_fees":
|
||||||
areas.append(await get_mempool_stat(screen_slug, gerty))
|
areas.append(await get_mempool_stat(screen_slug, gerty))
|
||||||
elif screen_slug == "mining_current_hash_rate":
|
elif screen_slug == "mining_dashboard":
|
||||||
areas.append(await get_mining_stat(screen_slug, gerty))
|
title = "Mining Data"
|
||||||
elif screen_slug == "mining_current_difficulty":
|
areas = await get_mining_dashboard(gerty)
|
||||||
areas.append(await get_mining_stat(screen_slug, gerty))
|
|
||||||
elif screen_slug == "lightning_dashboard":
|
elif screen_slug == "lightning_dashboard":
|
||||||
title = "Lightning Network"
|
title = "Lightning Network"
|
||||||
areas = await get_lightning_stats(gerty)
|
areas = await get_lightning_stats(gerty)
|
||||||
|
|
@ -381,31 +381,3 @@ async def get_mempool_stat(stat_slug: str, gerty):
|
||||||
font_size,
|
font_size,
|
||||||
750, pos_y))
|
750, pos_y))
|
||||||
return text
|
return text
|
||||||
|
|
||||||
|
|
||||||
def get_date_suffix(dayNumber):
|
|
||||||
if 4 <= dayNumber <= 20 or 24 <= dayNumber <= 30:
|
|
||||||
return "th"
|
|
||||||
else:
|
|
||||||
return ["st", "nd", "rd"][dayNumber % 10 - 1]
|
|
||||||
|
|
||||||
|
|
||||||
def get_time_remaining(seconds, granularity=2):
|
|
||||||
intervals = (
|
|
||||||
# ('weeks', 604800), # 60 * 60 * 24 * 7
|
|
||||||
('days', 86400), # 60 * 60 * 24
|
|
||||||
('hours', 3600), # 60 * 60
|
|
||||||
('minutes', 60),
|
|
||||||
('seconds', 1),
|
|
||||||
)
|
|
||||||
|
|
||||||
result = []
|
|
||||||
|
|
||||||
for name, count in intervals:
|
|
||||||
value = seconds // count
|
|
||||||
if value:
|
|
||||||
seconds -= value * count
|
|
||||||
if value == 1:
|
|
||||||
name = name.rstrip('s')
|
|
||||||
result.append("{} {}".format(round(value), name))
|
|
||||||
return ', '.join(result[:granularity])
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue