Skip to content

Commit 92b61ca

Browse files
committed
Add mempool.space fees sensors
1 parent fd67a1c commit 92b61ca

File tree

7 files changed

+102
-4
lines changed

7 files changed

+102
-4
lines changed

Version

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,5 @@ Version: 0.2.6 20230425 - Add mempool avg fee per TX child sensor
2929
Version: 0.3.0 20230426 - Rename to Cryptoinfo Advanced
3030
Version: 0.3.1 20230426 - Fixes for HACS/HASS requirements
3131
Version: 0.3.2 20230507 - Add total unknown hash control sensor to chain control, mempool total fee calculated.
32-
Version: 0.3.3 20230521 - Fix a few errors during updates.
32+
Version: 0.3.3 20230521 - Fix a few errors during updates.
33+
Version: 0.3.4 20240110 - Add mempool.space fees sensors.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.3.3"
1+
__version__ = "0.3.4"

custom_components/cryptoinfo_advanced/const/const.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@
7171
ATTR_MEMPOOL_TOTAL_FEE_CALC = "mempool_total_fee_calc"
7272
ATTR_MEMPOOL_SIZE_CALC = "mempool_size_calc"
7373
ATTR_MEMPOOL_AVERAGE_FEE_PER_TX = "mempool_average_fee_per_tx"
74+
ATTR_MEMPOOL_FEES_FASTEST = "mempool_fees_fastest"
75+
ATTR_MEMPOOL_FEES_30MIN = "mempool_fees_30min"
76+
ATTR_MEMPOOL_FEES_60MIN = "mempool_fees_60min"
77+
ATTR_MEMPOOL_FEES_ECO = "mempool_fees_eco"
78+
ATTR_MEMPOOL_FEES_MINIMUM = "mempool_fees_minimum"
7479

7580
PROPERTY_POOL_CONTROL_REMAINING = "remaining_percentage"
7681

@@ -93,6 +98,7 @@
9398
API_ENDPOINT_CHAIN_BLOCK_TIME = "{0}{1}/api.dws?q=getblocktime&height={2}"
9499
API_ENDPOINT_NOMP_POOL_STATS = "https://{0}/api/stats"
95100
API_ENDPOINT_MEMPOOL_STATS = "{0}mempool"
101+
API_ENDPOINT_MEMPOOL_FEES = "{0}v1/fees/recommended"
96102

97103
DAY_SECONDS = 60 * 60 * 24
98104

custom_components/cryptoinfo_advanced/crypto_sensor.py

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@
5454
ATTR_BLOCKS_CONFIRMED,
5555
ATTR_BLOCKS_ORPHANED,
5656
ATTR_BLOCK_TIME_IN_SECONDS,
57+
ATTR_MEMPOOL_FEES_FASTEST,
58+
ATTR_MEMPOOL_FEES_30MIN,
59+
ATTR_MEMPOOL_FEES_60MIN,
60+
ATTR_MEMPOOL_FEES_ECO,
61+
ATTR_MEMPOOL_FEES_MINIMUM,
5762
ATTR_MEMPOOL_TX_COUNT,
5863
ATTR_MEMPOOL_TOTAL_FEE,
5964
ATTR_MEMPOOL_TOTAL_FEE_CALC,
@@ -70,6 +75,7 @@
7075
API_ENDPOINT_CHAIN_ORPHANS,
7176
API_ENDPOINT_CHAIN_BLOCK_TIME,
7277
API_ENDPOINT_NOMP_POOL_STATS,
78+
API_ENDPOINT_MEMPOOL_FEES,
7379
API_ENDPOINT_MEMPOOL_STATS,
7480
CONF_DIFF_MULTIPLIER,
7581
CONF_BLOCK_TIME_MINUTES,
@@ -188,6 +194,11 @@ def __init__(
188194
self._blocks_orphaned = None
189195
self._mempool_tx_count = None
190196
self._mempool_total_fee = None
197+
self._mempool_fees_fastest = None
198+
self._mempool_fees_30min = None
199+
self._mempool_fees_60min = None
200+
self._mempool_fees_eco = None
201+
self._mempool_fees_minimum = None
191202

192203
@property
193204
def is_child_sensor(self):
@@ -428,6 +439,13 @@ def get_extra_state_attrs(self, full_attr_force=False):
428439
output_attrs[ATTR_MEMPOOL_TX_COUNT] = self._mempool_tx_count
429440
output_attrs[ATTR_MEMPOOL_TOTAL_FEE] = self._mempool_total_fee
430441

442+
if full_attr_force or self._fetch_type == CryptoInfoAdvDataFetchType.MEMPOOL_FEES:
443+
output_attrs[ATTR_MEMPOOL_FEES_FASTEST] = self._mempool_fees_fastest
444+
output_attrs[ATTR_MEMPOOL_FEES_30MIN] = self._mempool_fees_30min
445+
output_attrs[ATTR_MEMPOOL_FEES_60MIN] = self._mempool_fees_60min
446+
output_attrs[ATTR_MEMPOOL_FEES_ECO] = self._mempool_fees_eco
447+
output_attrs[ATTR_MEMPOOL_FEES_MINIMUM] = self._mempool_fees_minimum
448+
431449
return output_attrs
432450

433451
@property
@@ -595,7 +613,7 @@ def check_valid_config(self, raise_error=True):
595613

596614
return False
597615

598-
if self._fetch_type == CryptoInfoAdvDataFetchType.MEMPOOL_STATS:
616+
if self._fetch_type in CryptoInfoAdvEntityManager.instance().fetch_mempool_types:
599617

600618
if self.cryptocurrency_name.lower() not in ['btc', 'bitcoin']:
601619
_LOGGER.error(f"Sensor {self.name} is not BTC, mempool is only supported for BTC.")
@@ -733,6 +751,12 @@ def _extract_data_mempool_stats_full(self, json_data):
733751
def _extract_data_mempool_stats_primary(self, api_data):
734752
return int(api_data["vsize"])
735753

754+
def _extract_data_mempool_fees_full(self, json_data):
755+
return json_data
756+
757+
def _extract_data_mempool_fees_primary(self, api_data):
758+
return int(api_data["fastestFee"])
759+
736760
async def _fetch_price_data_main(self, api_data=None):
737761
if not self._fetch_type == CryptoInfoAdvDataFetchType.PRICE_MAIN:
738762
raise ValueError()
@@ -974,6 +998,31 @@ async def _fetch_mempool_stats(self, api_data=None):
974998

975999
return self.data
9761000

1001+
async def _fetch_mempool_fees(self, api_data=None):
1002+
self.check_valid_config()
1003+
1004+
mempool_data, api_data = await self._async_api_fetch(
1005+
api_data,
1006+
API_ENDPOINT_MEMPOOL_FEES.format(API_BASE_URL_MEMPOOLSPACE),
1007+
self._extract_data_mempool_fees_full,
1008+
self._extract_data_mempool_fees_primary
1009+
)
1010+
1011+
if mempool_data is not None:
1012+
self._update_all_properties(
1013+
state=int(mempool_data),
1014+
mempool_fees_fastest=int(api_data["fastestFee"]),
1015+
mempool_fees_30min=int(api_data["halfHourFee"]),
1016+
mempool_fees_60min=int(api_data["hourFee"]),
1017+
mempool_fees_eco=int(api_data["economyFee"]),
1018+
mempool_fees_minimum=int(api_data["minimumFee"]),
1019+
)
1020+
1021+
else:
1022+
raise ValueError()
1023+
1024+
return self.data
1025+
9771026
def _render_fetch_args(self):
9781027
if self._fetch_args is None:
9791028
return None
@@ -1052,6 +1101,11 @@ def _update_all_properties(
10521101
blocks_orphaned=None,
10531102
mempool_tx_count=None,
10541103
mempool_total_fee=None,
1104+
mempool_fees_fastest=None,
1105+
mempool_fees_30min=None,
1106+
mempool_fees_60min=None,
1107+
mempool_fees_eco=None,
1108+
mempool_fees_minimum=None,
10551109
available=True,
10561110
):
10571111
self._state = state
@@ -1080,6 +1134,11 @@ def _update_all_properties(
10801134
self._blocks_orphaned = blocks_orphaned
10811135
self._mempool_tx_count = mempool_tx_count
10821136
self._mempool_total_fee = mempool_total_fee
1137+
self._mempool_fees_fastest = mempool_fees_fastest
1138+
self._mempool_fees_30min = mempool_fees_30min
1139+
self._mempool_fees_60min = mempool_fees_60min
1140+
self._mempool_fees_eco = mempool_fees_eco
1141+
self._mempool_fees_minimum = mempool_fees_minimum
10831142
self._attr_available = available
10841143

10851144
self._update_child_sensors()
@@ -1158,6 +1217,9 @@ async def _async_update(self):
11581217
elif self._fetch_type == CryptoInfoAdvDataFetchType.MEMPOOL_STATS:
11591218
api_data = await self._fetch_mempool_stats(api_data)
11601219

1220+
elif self._fetch_type == CryptoInfoAdvDataFetchType.MEMPOOL_FEES:
1221+
api_data = await self._fetch_mempool_fees(api_data)
1222+
11611223
else:
11621224
api_data = await self._fetch_price_data_main(api_data)
11631225

custom_components/cryptoinfo_advanced/manager.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class CryptoInfoAdvDataFetchType:
7777
CHAIN_BLOCK_TIME = CryptoInfoAdvFetchProp("chain_block_time")
7878
NOMP_POOL_STATS = CryptoInfoAdvFetchProp("nomp_pool_stats")
7979
MEMPOOL_STATS = CryptoInfoAdvFetchProp("mempool_stats")
80+
MEMPOOL_FEES = CryptoInfoAdvFetchProp("mempool_fees")
8081

8182

8283
class CryptoInfoAdvEntityManager:
@@ -106,6 +107,7 @@ def fetch_types(self):
106107
CryptoInfoAdvDataFetchType.CHAIN_BLOCK_TIME,
107108
CryptoInfoAdvDataFetchType.NOMP_POOL_STATS,
108109
CryptoInfoAdvDataFetchType.MEMPOOL_STATS,
110+
CryptoInfoAdvDataFetchType.MEMPOOL_FEES,
109111
]
110112

111113
@property
@@ -158,6 +160,13 @@ def fetch_shared_types(self):
158160
CryptoInfoAdvDataFetchType.CHAIN_CONTROL,
159161
]
160162

163+
@property
164+
def fetch_mempool_types(self):
165+
return [
166+
CryptoInfoAdvDataFetchType.MEMPOOL_STATS,
167+
CryptoInfoAdvDataFetchType.MEMPOOL_FEES,
168+
]
169+
161170
def get_extra_sensor_fetch_type_from_str(self, parent_sensor, attribute_key):
162171
for t in self._extra_sensor_types:
163172
if t == attribute_key:

custom_components/cryptoinfo_advanced/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@
1010
"iot_class": "cloud_polling",
1111
"issue_tracker": "https://github.com/TheHolyRoger/hass-cryptoinfo/issues",
1212
"requirements": [],
13-
"version": "0.3.3"
13+
"version": "0.3.4"
1414
}

example/configuration.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,26 @@ sensor:
306306
id: "BTC Mempool Size MB"
307307
unit_of_measurement: "MB"
308308

309+
- platform: cryptoinfo_advanced
310+
id: "BTC Mempool Fees - Fastest"
311+
cryptocurrency_name: "btc"
312+
unit_of_measurement: "sats"
313+
update_frequency: 1
314+
api_mode: "mempool_fees"
315+
extra_sensors:
316+
- property: mempool_fees_30min
317+
id: "BTC Mempool Fees - 30min"
318+
unit_of_measurement: "sats"
319+
- property: mempool_fees_60min
320+
id: "BTC Mempool Fees - 60min"
321+
unit_of_measurement: "sats"
322+
- property: mempool_fees_eco
323+
id: "BTC Mempool Fees - Economy"
324+
unit_of_measurement: "sats"
325+
- property: mempool_fees_minimum
326+
id: "BTC Mempool Fees - Minimum"
327+
unit_of_measurement: "sats"
328+
309329

310330

311331
# ROGER NOMP Pool stats - API: NOMP (Any NOMP based pool)

0 commit comments

Comments
 (0)