feat(nicehash): add more acount balance sensors
- add total and pending sensors for BTC - add total and pending sensors for currency - default currency to USD - only support EUR or USD currency - in addition to BTC - ignore non-BTC exchange rates
This commit is contained in:
parent
2ef6ad9ac1
commit
8456fa4c34
@ -36,6 +36,7 @@ Platform | Description
|
|||||||
organization_id: <org_id>
|
organization_id: <org_id>
|
||||||
api_key: <api_key_code>
|
api_key: <api_key_code>
|
||||||
api_secret: <api_secret_key_code>
|
api_secret: <api_secret_key_code>
|
||||||
|
currency: "EUR" (default = "USD")
|
||||||
```
|
```
|
||||||
1. Restart Home Assistant
|
1. Restart Home Assistant
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ from .const import (
|
|||||||
CONF_CURRENCY,
|
CONF_CURRENCY,
|
||||||
CONF_ORGANIZATION_ID,
|
CONF_ORGANIZATION_ID,
|
||||||
CURRENCY_BTC,
|
CURRENCY_BTC,
|
||||||
|
CURRENCY_USD,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
STARTUP_MESSAGE,
|
STARTUP_MESSAGE,
|
||||||
)
|
)
|
||||||
@ -39,7 +40,7 @@ CONFIG_SCHEMA = vol.Schema(
|
|||||||
vol.Required(CONF_ORGANIZATION_ID): cv.string,
|
vol.Required(CONF_ORGANIZATION_ID): cv.string,
|
||||||
vol.Required(CONF_API_KEY): cv.string,
|
vol.Required(CONF_API_KEY): cv.string,
|
||||||
vol.Required(CONF_API_SECRET): cv.string,
|
vol.Required(CONF_API_SECRET): cv.string,
|
||||||
vol.Required(CONF_CURRENCY, default=CURRENCY_BTC): cv.string,
|
vol.Required(CONF_CURRENCY, default=CURRENCY_USD): cv.string,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
@ -57,7 +58,7 @@ async def async_setup(hass: HomeAssistant, config: Config):
|
|||||||
organization_id = nicehash_config.get(CONF_ORGANIZATION_ID)
|
organization_id = nicehash_config.get(CONF_ORGANIZATION_ID)
|
||||||
api_key = nicehash_config.get(CONF_API_KEY)
|
api_key = nicehash_config.get(CONF_API_KEY)
|
||||||
api_secret = nicehash_config.get(CONF_API_SECRET)
|
api_secret = nicehash_config.get(CONF_API_SECRET)
|
||||||
currency = nicehash_config.get(CONF_CURRENCY)
|
currency = nicehash_config.get(CONF_CURRENCY).upper()
|
||||||
|
|
||||||
client = NiceHashPrivateClient(organization_id, api_key, api_secret)
|
client = NiceHashPrivateClient(organization_id, api_key, api_secret)
|
||||||
|
|
||||||
@ -76,6 +77,7 @@ async def async_setup(hass: HomeAssistant, config: Config):
|
|||||||
_LOGGER.error("Unable to get NiceHash mining rigs")
|
_LOGGER.error("Unable to get NiceHash mining rigs")
|
||||||
raise PlatformNotReady
|
raise PlatformNotReady
|
||||||
|
|
||||||
|
hass.data[DOMAIN]["organization_id"] = organization_id
|
||||||
hass.data[DOMAIN]["client"] = client
|
hass.data[DOMAIN]["client"] = client
|
||||||
hass.data[DOMAIN]["currency"] = currency
|
hass.data[DOMAIN]["currency"] = currency
|
||||||
hass.data[DOMAIN]["accounts_coordinator"] = accounts_coordinator
|
hass.data[DOMAIN]["accounts_coordinator"] = accounts_coordinator
|
||||||
@ -91,7 +93,7 @@ class NiceHashAccountsDataUpdateCoordinator(DataUpdateCoordinator):
|
|||||||
|
|
||||||
def __init__(self, hass: HomeAssistant, client: NiceHashPrivateClient):
|
def __init__(self, hass: HomeAssistant, client: NiceHashPrivateClient):
|
||||||
"""Initialize"""
|
"""Initialize"""
|
||||||
self.name = f"{DOMAIN}_Accounts_Coordinator"
|
self.name = f"{DOMAIN}_accounts_coordinator"
|
||||||
self._client = client
|
self._client = client
|
||||||
|
|
||||||
super().__init__(
|
super().__init__(
|
||||||
@ -106,9 +108,11 @@ class NiceHashAccountsDataUpdateCoordinator(DataUpdateCoordinator):
|
|||||||
rates_dict = dict()
|
rates_dict = dict()
|
||||||
for rate in exchange_rates:
|
for rate in exchange_rates:
|
||||||
fromCurrency = rate.get("fromCurrency")
|
fromCurrency = rate.get("fromCurrency")
|
||||||
toCurrency = rate.get("toCurrency")
|
# Only care about the Bitcoin exchange rates
|
||||||
exchange_rate = float(rate.get("exchangeRate"))
|
if fromCurrency == CURRENCY_BTC:
|
||||||
rates_dict[f"{fromCurrency}-{toCurrency}"] = exchange_rate
|
toCurrency = rate.get("toCurrency")
|
||||||
|
exchange_rate = float(rate.get("exchangeRate"))
|
||||||
|
rates_dict[f"{fromCurrency}-{toCurrency}"] = exchange_rate
|
||||||
return {
|
return {
|
||||||
"accounts": accounts,
|
"accounts": accounts,
|
||||||
"exchange_rates": rates_dict,
|
"exchange_rates": rates_dict,
|
||||||
@ -122,7 +126,7 @@ class NiceHashMiningRigsDataUpdateCoordinator(DataUpdateCoordinator):
|
|||||||
|
|
||||||
def __init__(self, hass: HomeAssistant, client: NiceHashPrivateClient):
|
def __init__(self, hass: HomeAssistant, client: NiceHashPrivateClient):
|
||||||
"""Initialize"""
|
"""Initialize"""
|
||||||
self.name = f"{DOMAIN}_Mining_Rigs_Coordinator"
|
self.name = f"{DOMAIN}_mining_rigs_coordinator"
|
||||||
self._client = client
|
self._client = client
|
||||||
|
|
||||||
super().__init__(
|
super().__init__(
|
||||||
|
@ -11,8 +11,9 @@ ISSUE_URL = "https://github.com/brianberg/ha-nicehash/issues"
|
|||||||
|
|
||||||
# Icons
|
# Icons
|
||||||
ICON = "mdi:pickaxe"
|
ICON = "mdi:pickaxe"
|
||||||
ICON_CURRENCY_USD = "mdi:currency-usd"
|
|
||||||
ICON_CURRENCY_BTC = "mdi:currency-btc"
|
ICON_CURRENCY_BTC = "mdi:currency-btc"
|
||||||
|
ICON_CURRENCY_EUR = "mdi:currency-eur"
|
||||||
|
ICON_CURRENCY_USD = "mdi:currency-usd"
|
||||||
ICON_TEMPERATURE = "mdi:thermometer"
|
ICON_TEMPERATURE = "mdi:thermometer"
|
||||||
|
|
||||||
# Platforms
|
# Platforms
|
||||||
@ -47,3 +48,6 @@ NICEHASH_API_URL = "https://api2.nicehash.com"
|
|||||||
CURRENCY_BTC = "BTC"
|
CURRENCY_BTC = "BTC"
|
||||||
CURRENCY_USD = "USD"
|
CURRENCY_USD = "USD"
|
||||||
CURRENCY_EUR = "EUR"
|
CURRENCY_EUR = "EUR"
|
||||||
|
BALANCE_TYPE_AVAILABLE = "available"
|
||||||
|
BALANCE_TYPE_PENDING = "pending"
|
||||||
|
BALANCE_TYPE_TOTAL = "total"
|
||||||
|
@ -12,12 +12,17 @@ from homeassistant.helpers.entity import Entity
|
|||||||
from homeassistant.util import Throttle
|
from homeassistant.util import Throttle
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
|
BALANCE_TYPE_AVAILABLE,
|
||||||
|
BALANCE_TYPE_PENDING,
|
||||||
|
BALANCE_TYPE_TOTAL,
|
||||||
CURRENCY_BTC,
|
CURRENCY_BTC,
|
||||||
CURRENCY_EUR,
|
CURRENCY_EUR,
|
||||||
CURRENCY_USD,
|
CURRENCY_USD,
|
||||||
DEFAULT_NAME,
|
DEFAULT_NAME,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
ICON_CURRENCY_BTC,
|
ICON_CURRENCY_BTC,
|
||||||
|
ICON_CURRENCY_EUR,
|
||||||
|
ICON_CURRENCY_USD,
|
||||||
ICON_TEMPERATURE,
|
ICON_TEMPERATURE,
|
||||||
)
|
)
|
||||||
from .nicehash import NiceHashPrivateClient, NiceHashPublicClient
|
from .nicehash import NiceHashPrivateClient, NiceHashPublicClient
|
||||||
@ -36,27 +41,62 @@ async def async_setup_platform(
|
|||||||
_LOGGER.debug("Creating new NiceHash sensor components")
|
_LOGGER.debug("Creating new NiceHash sensor components")
|
||||||
|
|
||||||
data = hass.data[DOMAIN]
|
data = hass.data[DOMAIN]
|
||||||
|
organization_id = data.get("organization_id")
|
||||||
client = data.get("client")
|
client = data.get("client")
|
||||||
currency = data.get("currency")
|
currency = data.get("currency")
|
||||||
accounts_coordinator = data.get("accounts_coordinator")
|
accounts_coordinator = data.get("accounts_coordinator")
|
||||||
rigs_coordinator = data.get("rigs_coordinator")
|
rigs_coordinator = data.get("rigs_coordinator")
|
||||||
|
|
||||||
# Add account balance sensor(s)
|
# Add account balance sensors
|
||||||
btc_balance_sensor = NiceHashBalanceSensor(
|
balance_sensors = [
|
||||||
accounts_coordinator, client.organization_id, CURRENCY_BTC
|
NiceHashBalanceSensor(
|
||||||
)
|
accounts_coordinator,
|
||||||
if currency == CURRENCY_BTC:
|
organization_id,
|
||||||
async_add_entities([btc_balance_sensor], True)
|
currency=CURRENCY_BTC,
|
||||||
else:
|
balance_type=BALANCE_TYPE_AVAILABLE,
|
||||||
async_add_entities(
|
),
|
||||||
[
|
NiceHashBalanceSensor(
|
||||||
btc_balance_sensor,
|
accounts_coordinator,
|
||||||
NiceHashBalanceSensor(
|
organization_id,
|
||||||
accounts_coordinator, client.organization_id, currency
|
currency=CURRENCY_BTC,
|
||||||
),
|
balance_type=BALANCE_TYPE_PENDING,
|
||||||
],
|
),
|
||||||
True,
|
NiceHashBalanceSensor(
|
||||||
|
accounts_coordinator,
|
||||||
|
organization_id,
|
||||||
|
currency=CURRENCY_BTC,
|
||||||
|
balance_type=BALANCE_TYPE_TOTAL,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
if currency == CURRENCY_USD or currency == CURRENCY_EUR:
|
||||||
|
balance_sensors.append(
|
||||||
|
NiceHashBalanceSensor(
|
||||||
|
accounts_coordinator,
|
||||||
|
organization_id,
|
||||||
|
currency=currency,
|
||||||
|
balance_type=BALANCE_TYPE_AVAILABLE,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
balance_sensors.append(
|
||||||
|
NiceHashBalanceSensor(
|
||||||
|
accounts_coordinator,
|
||||||
|
organization_id,
|
||||||
|
currency=currency,
|
||||||
|
balance_type=BALANCE_TYPE_PENDING,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
balance_sensors.append(
|
||||||
|
NiceHashBalanceSensor(
|
||||||
|
accounts_coordinator,
|
||||||
|
organization_id,
|
||||||
|
currency=currency,
|
||||||
|
balance_type=BALANCE_TYPE_TOTAL,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
_LOGGER.warn("Invalid currency: must be EUR or USD")
|
||||||
|
|
||||||
|
async_add_entities(balance_sensors, True)
|
||||||
|
|
||||||
# Add mining rig sensors
|
# Add mining rig sensors
|
||||||
rig_data = await client.get_mining_rigs()
|
rig_data = await client.get_mining_rigs()
|
||||||
@ -71,12 +111,19 @@ async def async_setup_platform(
|
|||||||
class NiceHashBalanceSensor(Entity):
|
class NiceHashBalanceSensor(Entity):
|
||||||
"""NiceHash Account Balance Sensor"""
|
"""NiceHash Account Balance Sensor"""
|
||||||
|
|
||||||
def __init__(self, coordinator, organization_id, currency):
|
def __init__(
|
||||||
|
self,
|
||||||
|
coordinator,
|
||||||
|
organization_id,
|
||||||
|
currency,
|
||||||
|
balance_type=BALANCE_TYPE_AVAILABLE,
|
||||||
|
):
|
||||||
"""Initialize the sensor"""
|
"""Initialize the sensor"""
|
||||||
_LOGGER.debug(f"Account Balance Sensor: {currency}")
|
_LOGGER.debug(f"Account Balance Sensor: {balance_type} {currency}")
|
||||||
self.coordinator = coordinator
|
self.coordinator = coordinator
|
||||||
self.currency = currency
|
self.currency = currency
|
||||||
self._organization_id = organization_id
|
self.organization_id = organization_id
|
||||||
|
self.balance_type = balance_type
|
||||||
self._available = 0.00
|
self._available = 0.00
|
||||||
self._pending = 0.00
|
self._pending = 0.00
|
||||||
self._total_balance = 0.00
|
self._total_balance = 0.00
|
||||||
@ -85,12 +132,13 @@ class NiceHashBalanceSensor(Entity):
|
|||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
"""Sensor name"""
|
"""Sensor name"""
|
||||||
return f"{DEFAULT_NAME} Account Balance {self.currency}"
|
balance_type = self.balance_type[0].upper() + self.balance_type[1:]
|
||||||
|
return f"{DEFAULT_NAME} {balance_type} Account Balance {self.currency}"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def unique_id(self):
|
def unique_id(self):
|
||||||
"""Unique entity id"""
|
"""Unique entity id"""
|
||||||
return f"{self._organization_id}:{self.currency}"
|
return f"{self.organization_id}:{self.currency}:{self.balance_type}"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def should_poll(self):
|
def should_poll(self):
|
||||||
@ -110,16 +158,28 @@ class NiceHashBalanceSensor(Entity):
|
|||||||
self._pending = float(total.get("pending"))
|
self._pending = float(total.get("pending"))
|
||||||
self._available = float(total.get("available"))
|
self._available = float(total.get("available"))
|
||||||
self._total_balance = float(total.get("totalBalance"))
|
self._total_balance = float(total.get("totalBalance"))
|
||||||
|
|
||||||
|
if self.balance_type == BALANCE_TYPE_TOTAL:
|
||||||
|
balance = self._total_balance
|
||||||
|
elif self.balance_type == BALANCE_TYPE_PENDING:
|
||||||
|
balance = self._pending
|
||||||
|
else:
|
||||||
|
balance = self._available
|
||||||
|
|
||||||
if self.currency == CURRENCY_BTC:
|
if self.currency == CURRENCY_BTC:
|
||||||
return self._available
|
return balance
|
||||||
else:
|
else:
|
||||||
exchange_rates = self.coordinator.data.get("exchange_rates")
|
exchange_rates = self.coordinator.data.get("exchange_rates")
|
||||||
self._exchange_rate = exchange_rates.get(f"{CURRENCY_BTC}-{self.currency}")
|
self._exchange_rate = exchange_rates.get(f"{CURRENCY_BTC}-{self.currency}")
|
||||||
return round(self._available * self._exchange_rate, 2)
|
return round(balance * self._exchange_rate, 2)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def icon(self):
|
def icon(self):
|
||||||
"""Sensor icon"""
|
"""Sensor icon"""
|
||||||
|
if self.currency == CURRENCY_EUR:
|
||||||
|
return ICON_CURRENCY_EUR
|
||||||
|
elif self.currency == CURRENCY_USD:
|
||||||
|
return ICON_CURRENCY_USD
|
||||||
return ICON_CURRENCY_BTC
|
return ICON_CURRENCY_BTC
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -202,7 +262,7 @@ class NiceHashRigTemperatureSensor(Entity):
|
|||||||
self._temps.append(temp)
|
self._temps.append(temp)
|
||||||
if temp > highest_temp:
|
if temp > highest_temp:
|
||||||
highest_temp = temp
|
highest_temp = temp
|
||||||
return highest_temp
|
return highest_temp
|
||||||
else:
|
else:
|
||||||
_LOGGER.debug(f"{self._name}: No devices found")
|
_LOGGER.debug(f"{self._name}: No devices found")
|
||||||
self._num_devices = 0
|
self._num_devices = 0
|
||||||
|
Loading…
Reference in New Issue
Block a user