diff --git a/rootfs/standard/var/www/mynode/api.py b/rootfs/standard/var/www/mynode/api.py
index 32afdfd2..96b8bb8c 100644
--- a/rootfs/standard/var/www/mynode/api.py
+++ b/rootfs/standard/var/www/mynode/api.py
@@ -34,6 +34,7 @@ def api_get_bitcoin_info():
data["peer_count"] = get_bitcoin_peer_count()
#data["difficulty"] = get_bitcoin_difficulty() # Dont send difficulty, it causes errors in jsonify
data["mempool_size"] = get_bitcoin_mempool_size()
+ data["recommended_fees"] = get_bitcoin_recommended_fees()
# Add blocks
data["recent_blocks"] = None
@@ -120,6 +121,7 @@ def api_get_device_info():
data["cpu"] = get_cpu_usage()
data["ram"] = get_ram_usage()
data["temp"] = get_device_temp()
+ data["uptime"] = get_system_uptime()
data["is_installing_docker_images"] = is_installing_docker_images()
data["is_electrs_active"] = is_electrs_active()
diff --git a/rootfs/standard/var/www/mynode/bitcoin_info.py b/rootfs/standard/var/www/mynode/bitcoin_info.py
index 3defebcd..cbb3a9b3 100644
--- a/rootfs/standard/var/www/mynode/bitcoin_info.py
+++ b/rootfs/standard/var/www/mynode/bitcoin_info.py
@@ -1,6 +1,8 @@
from config import *
from utilities import *
+from systemctl_info import *
from threading import Timer
+import requests
from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
import urllib
import subprocess
@@ -18,6 +20,7 @@ bitcoin_peers = []
bitcoin_network_info = None
bitcoin_wallets = None
bitcoin_mempool = None
+bitcoin_recommended_fees = None
bitcoin_version = None
# Functions
@@ -73,6 +76,7 @@ def update_bitcoin_other_info():
global bitcoin_peers
global bitcoin_network_info
global bitcoin_mempool
+ global bitcoin_recommended_fees
global bitcoin_wallets
while bitcoin_blockchain_info == None:
@@ -118,6 +122,22 @@ def update_bitcoin_other_info():
wallet_info = wallet_rpc_connection.getwalletinfo()
wallet_data.append(wallet_info)
bitcoin_wallets = wallet_data
+
+ # Get recommended fee info (from mempool on port 4080)
+ if is_service_enabled("mempool"):
+ try:
+ r = requests.get("http://localhost:4080/api/v1/fees/recommended", timeout=1)
+ data = r.json()
+ bitcoin_recommended_fees = ""
+ bitcoin_recommended_fees += "Low priority: {} sat/vB".format(data["hourFee"])
+ bitcoin_recommended_fees += " "
+ bitcoin_recommended_fees += "Medium priority: {} sat/vB".format(data["halfHourFee"])
+ bitcoin_recommended_fees += " "
+ bitcoin_recommended_fees += "High priority: {} sat/vB".format(data["fastestFee"])
+ except Exception as e:
+ bitcoin_recommended_fees = "Fee error - " . str(e)
+ else:
+ bitcoin_recommended_fees = None
except Exception as e1:
log_message("ERROR: In update_bitcoin_other_info - {}".format( str(e1) ))
@@ -201,6 +221,10 @@ def get_bitcoin_mempool_size():
size = float(info["bytes"]) / 1000 / 1000
return "{:.3} MB".format(size)
+def get_bitcoin_recommended_fees():
+ global bitcoin_recommended_fees
+ return bitcoin_recommended_fees
+
def get_bitcoin_wallets():
global bitcoin_wallets
return copy.deepcopy(bitcoin_wallets)
diff --git a/rootfs/standard/var/www/mynode/static/css/mynode.css b/rootfs/standard/var/www/mynode/static/css/mynode.css
index a7e19c51..66591b07 100644
--- a/rootfs/standard/var/www/mynode/static/css/mynode.css
+++ b/rootfs/standard/var/www/mynode/static/css/mynode.css
@@ -249,7 +249,7 @@ td, th {
background: #f0f0f0;
}
/* width of four tiles (full width) */
-.app_tile_price_ticker {
+.app_tile_ticker {
display: inline-block;
position: relative;
border: none;
diff --git a/rootfs/standard/var/www/mynode/static/css/mynode_dark.css b/rootfs/standard/var/www/mynode/static/css/mynode_dark.css
index 0928bc58..9ed1b579 100644
--- a/rootfs/standard/var/www/mynode/static/css/mynode_dark.css
+++ b/rootfs/standard/var/www/mynode/static/css/mynode_dark.css
@@ -40,7 +40,7 @@ a:active {
.device_status_info,
.bitcoin_block,
.pair_wallet_text,
-.app_tile_price_ticker,
+.app_tile_ticker,
.app_tile_lightning_details,
.lightning_channel_container,
.settings_block_subheader,
@@ -55,7 +55,7 @@ table,
.app_tile,
.app_tile_short,
.app_tile_wide,
-.app_tile_price_ticker,
+.app_tile_ticker,
.app_tile_bitcoin_recent_blocks,
.app_tile_lightning_details,
.info_tile {
@@ -64,7 +64,7 @@ table,
.app_tile,
.app_tile_wide,
-.app_tile_price_ticker,
+.app_tile_ticker,
.app_tile_bitcoin_recent_blocks,
.app_tile_lightning_details,
.app_tile_short {
diff --git a/rootfs/standard/var/www/mynode/templates/includes/services.html b/rootfs/standard/var/www/mynode/templates/includes/services.html
index a839a928..0e5d4d9e 100644
--- a/rootfs/standard/var/www/mynode/templates/includes/services.html
+++ b/rootfs/standard/var/www/mynode/templates/includes/services.html
@@ -100,9 +100,9 @@
-
-
-
+
diff --git a/rootfs/standard/var/www/mynode/templates/main.html b/rootfs/standard/var/www/mynode/templates/main.html
index 790a2158..8cab20c5 100644
--- a/rootfs/standard/var/www/mynode/templates/main.html
+++ b/rootfs/standard/var/www/mynode/templates/main.html
@@ -19,6 +19,9 @@
var lnd_last_btc_tx = "";
var lnd_last_ln_tx = "";
var price_data = {};
+ var device_info = null;
+ var bitcoin_info = null;
+ var lnd_info = null;
// Toggle enable/disable functions
function get_custom_enable_message(short_name) {
@@ -97,34 +100,51 @@
}
}
- var price_display_rotate_count = 0;
- function update_price_display() {
- {% if ui_settings['price_ticker'] %}
+ var ticker_rotate_count = 0;
+ function update_ticker() {
+ display_options = [];
+ // Append price display options
if ("price" in price_data && "delta" in price_data && "direction" in price_data ) {
- $("#price_ticker").show();
- $("#price_ticker_text").slideUp('fast', function() {
- display_id = price_display_rotate_count % 3;
- if (display_id == 0) {
- p = price_data["price"].toLocaleString('en-US', {style: 'currency', currency: 'USD'});
- $("#price_ticker_text").html(p + " USD/BTC");
- } else if (display_id == 1) {
- sats = parseInt(100000000 / price_data["price"]);
- $("#price_ticker_text").html(sats + " SATS/USD");
- } else if (display_id == 2) {
- p = Math.abs(price_data["delta"]).toLocaleString('en-US', {style: 'currency', currency: 'USD'});
- if (price_data["direction"] == "flat") {
- $("#price_ticker_text").html("Price is flat");
- } else if (price_data["direction"] == "up") {
- $("#price_ticker_text").html("Price is up "+p);
- } else if (price_data["direction"] == "down") {
- $("#price_ticker_text").html("Price is down "+p);
- }
- }
- $("#price_ticker_text").slideDown();
- price_display_rotate_count = price_display_rotate_count + 1;
- });
+ p = price_data["price"].toLocaleString('en-US', {style: 'currency', currency: 'USD'});
+ display_options.push(p + " USD/BTC")
+
+ sats = parseInt(100000000 / price_data["price"]);
+ display_options.push(sats + " SATS/USD")
+
+ p = Math.abs(price_data["delta"]).toLocaleString('en-US', {style: 'currency', currency: 'USD'});
+ if (price_data["direction"] == "flat") {
+ direction_text = "Price is flat";
+ } else if (price_data["direction"] == "up") {
+ direction_text = "Price is up " + p;
+ } else if (price_data["direction"] == "down") {
+ direction_text = "Price is down " + p;
+ }
+ display_options.push(direction_text)
}
- {% endif %}
+ // Append uptime option
+ if (device_info && "uptime" in device_info) {
+ display_options.push("Online for " + device_info["uptime"])
+ }
+ // Append fees option
+ if (bitcoin_info && "recommended_fees" in bitcoin_info && bitcoin_info["recommended_fees"] != null) {
+ display_options.push(bitcoin_info["recommended_fees"])
+ }
+
+ if (display_options.length == 0) {
+ display_options.push("Loading...")
+ } else if (display_options.length == 1) {
+ display_options.push("Welcome to myNode!")
+ display_options.push("Enable Mempool or the Price Ticker to see more info here!")
+ }
+
+ // Display new ticker text
+ $("#ticker").show();
+ $("#ticker_text").slideUp('fast', function() {
+ display_id = ticker_rotate_count % display_options.length;
+ $("#ticker_text").html( display_options[display_id] );
+ $("#ticker_text").slideDown();
+ ticker_rotate_count = ticker_rotate_count + 1;
+ });
}
function update_sso_token(short_name, data) {
@@ -225,6 +245,7 @@
// Update Bitcoin Info
$.getJSON("/api/get_bitcoin_info", function( data ) {
//console.log("Bitcoin Data: " + JSON.stringify(data))
+ bitcoin_info = data;
if ("current_block" in data && data["current_block"] != null) {
$("#current_block").html(data["current_block"]);
}
@@ -257,6 +278,7 @@
// Update Lightning Info
$.getJSON("/api/get_lightning_info", function( data ) {
//console.log("Lightning Data: " + JSON.stringify(data))
+ lnd_info = data;
if ("channel_count" in data && data["channel_count"] != null) {
$("#lnd_channel_count").html(data["channel_count"]);
}
@@ -393,19 +415,19 @@
{% endfor %}
// Update price info
+ {% if ui_settings['price_ticker'] %}
$.getJSON("/api/get_price_info", function( data ) {
// console.log("Price Data: " + JSON.stringify(data))
if ("price" in data && data["price"] != null) {
price_data = data;
- if (price_display_rotate_count == 0) {
- update_price_display();
- }
}
});
+ {% endif %}
// Update device info
$.getJSON("/api/get_device_info", function( data ) {
//console.log("Device Data: " + JSON.stringify(data))
+ device_info = data
if ("data_drive_usage" in data && data["data_drive_usage"] != null) {
$("#data_drive_usage").html(data["data_drive_usage"]);
}
@@ -625,8 +647,10 @@
const update_interval = setInterval(update_page, 15000);
update_page();
- // Rotate Price Ticker every 10 seconds
- const rotate_ticker_interval = setInterval(update_price_display, 10000);
+ // Rotate Ticker every 6 seconds
+ const rotate_ticker_interval = setInterval(update_ticker, 8000);
+ setTimeout(update_ticker, 1500);
+ update_ticker();
// If pinned lightning, auto open lightning details
{% if lnd_wallet_exists and lnd_ready and ui_settings['pinned_lightning_details'] %}