Automation and mining profiles

Mining profiles help you optimize your mining operation based on parameters like electricity price and other fixed costs. Setting up a mining profile is crucial for Hashman’s advanced optimization engine.

In the automation page, you can see a list of your mining profiles and their characteristics. You can also view preview charts of a mining profile. This preview charts the relevant parameters for mining operations: hash price, efficiency breakeven thresholds for a given mining profile, total electricity cost, transaction fees, and network hashrate/difficulty.

Automation main view
  • Create a profile: Set up new profiles for different mining scenarios, press the create mining profile button on the top right corner

  • Edit profile: Edit an existing mining profile

  • Preview profile: Select the profile to view the preview of relevant parameters for mining operations

Mining profiles

Creating a new mining profile

Mining profiles define how your ASICs operate based on electricity prices and market conditions. They are the core automation mechanism in Hashman.

Overview

A mining profile contains:

  • Pool configurations

  • Power usage limits

  • Pricing rules

When active, a profile continuously evaluates conditions and automatically adjusts your mining operations for optimal profitability.

Creating profiles

  1. Navigate to Automation → Create Profile

  2. Configure the following required settings:

Basic Settings

  • Name: Unique identifier for the profile

  • Alias: Optional short name for scripting

  • Power Limits: Set min/max power draw per device

  • Sleep Mode: Enable/disable device sleep states

  • Base Currency: Currency used in rule evaluation

  • Timezone: Time context for schedules and rules

Pool Configuration

pool:
  url: stratum+tcp://pool.example.com:3333
  user: worker.{alias}  # Supports variables: {alias}, {location}, {tag}
  pass: x

Electricity pricing

Hashman has a built-in powerful language called HPDL (Hashman Price Definition Language) designed to handle even the most complex electricity pricing scenarios. This language allows for the creation of dynamic pricing models that can use varying contract prices, different types of taxes, and changes in rates over time.

The scripting language supports conditional statements, date-based rules, and mathematical operations, providing flexibility in defining electricity prices. Below are some examples of how to use the Hashman scripting language for price definitions:

Simple market based contract

For a simpler market based contract, we can just use the spot price.

fees = 10 EUR/MWh # assume that all of the applicable marginal costs are included in this

ExcessPowerPrice = SpotMarketPrice("nordpool/FI") + fees

Simple fixed price contract

For a simple fixed price contract, we only need to specify "ExcessPowerPrice" which is otherwise the price which applies after "ContractedCapacity" is exceeded. In this case, the default ContractedCapacity is 0, so there is nothing else to specify.

ExcessPowerPrice = 50 EUR/MWh

Fixed price power contract

For a fixed price power contract, we need to specify four components:

1. ContractedCapacity - how much power is contracted (Watts, W; can be specified in kW or MW also)

2. UnusedPowerPrice- the price received for unused power per MWh

3. FixedCapacityPrice - the price paid for the contracted power per MWh

4.ExcessPowerPrice - the price paid for the excess power per MWh if ContractedCapacity is exceeded

fees = 6.6 EUR/MWh # assume that all of the applicable marginal costs are included in this
ContractedCapacity = 1 MW
UnusedPowerPrice = SpotMarketPrice("nordpool/FI") # we assume that no consumption fees are applied for sold, unused power
FixedCapacityPrice = 40 EUR/MWh + fees
ExcessPowerPrice = SpotMarketPrice("nordpool/FI") + fees

Complex power price contract

This complex power price contract has multiple separate contracts for various timeframes and supports area price differences.

# For this price definition example, we have three separate contracts:
# 1. October with 1 MW of contracted capacity
# 2. November with 1.5 MW of contracted capacity
# 3. No contract before and after those dates
#
# Furthermore, the contracts fixed for Nordpool system prices only (nordpool/SYS)
# The remainder, i.e. the difference between nordpool/FI and nordpool/SYS, is based on the market prices and applied on top of the fixed price.
#
# We compute a separate variable for the area price difference
# This can be used anywhere. If not used, we still see this visualized.
area_price_diff = SpotMarketPrice("nordpool/FI") - SpotMarketPrice("nordpool/SYS")

fees = 4.2018 EUR/MWh

# We have a contract for October with 1 MW of contracted capacity,
# and then we have a contract for November with 1.5 MW of contracted capacity.
# Before and after those dates, we have no contract, and ContractedCapacity is 0.

ContractedCapacity = WHEN {
  DATE IN [2024-10-01..2024-10-31]: 1 MW
  DATE IN [2024-11-01..2024-11-30]: 1.5 MW
  DEFAULT: 0 W
}

FixedCapacityPrice = WHEN {
  DATE IN [2024-10-01..2024-10-31]: 37.51 EUR/MWh + area_price_diff + fees
  DATE IN [2024-11-01..2024-11-30]: 45.20 EUR/MWh + area_price_diff + fees
  DEFAULT: 0 EUR/MWh
}

UnusedPowerPrice = SpotMarketPrice("nordpool/FI")
ExcessPowerPrice = SpotMarketPrice("nordpool/FI") + fees

@title Area Price Difference
@description Difference between area price and system price
area_price_diff = SpotMarketPrice("nordpool/FI") - SpotMarketPrice("nordpool/SYS")

@title Effective Contract Price
@description The effective price paid per MWh. 40 EUR/MWh base + area price difference

effective_contract_price = WHEN {
  DATE IN [2024-10-01..2024-10-31]: 32.65 + area_price_diff
  DATE IN [2024-11-01..2024-11-30]: 40 + area_price_diff
  DEFAULT: SpotMarketPrice("nordpool/FI") # spot price assumed by default
}

margin = WHEN {
  DATE IN [2024-10-01..2024-10-31]: 6 EUR/MWh
  DATE IN [2024-11-01..2024-11-30]: 6 EUR/MWh
  DEFAULT: 0 EUR/MWh
}

ContractedCapacity = WHEN {
  DATE IN [2024-10-01..2024-10-31]: 1 MW
  DATE IN [2024-11-01..2024-11-30]: 1 MW
  DEFAULT: 0 MW
}

@title Tax Class 1: 2.827515 c/kWh, incl. VAT 25.5% and security of supply fee
electricity_tax1_cents_per_kWh = 2.827515 # c/kWh

@title Tax Class 2: 0.079065 c/kWh, incl. VAT 25.5% and security of supply fee
electricity_tax2_cents_per_kWh = 0.079065 # c/kWh
electricity_tax = electricity_tax2_cents_per_kWh * 1000 / 100 / 1.255 # c/kWh -> c/MWh -> EUR/MWh without VAT (approx.)

@title Transmission Fee

transmission_fee = WHEN {
  @title Winter Weekdays (Dec-Feb, Mon-Fri, 7am-9pm)
  MONTH IN [DEC..FEB]
  AND DAYOFWEEK IN [MON..FRI]
  # I.e. 7:00:00 to 20:59:59
  AND HOUR IN [7..20]: 14.18

  @title Other Times
  DEFAULT: 6.55
}

UnusedPowerPrice = SpotMarketPrice("nordpool/FI") # the price at which the power is sold to the grid
ContractedPowerPrice = effective_contract_price + transmission_fee + electricity_tax + margin
ExcessPowerPrice = SpotMarketPrice("nordpool/FI") + transmission_fee + electricity_tax

Some things to take into account when using the scripting language:

  • Functions available in SpotMarketPrice are min, and max. Otherwise, only +, -, *, / and WHEN statements can be used. The WHEN statement must always include a DEFAULT clause.

  • Numbers can optionally have units. If capacity units are present, they should be used, for example, 1 MW -equals one million W, etc.

  • For other quantities, use the profile price units, such as EUR/MWh or USD/MWh.

  • @titlecan be used for titles and # for comments

If you have any questions or need help, please send an email to contact@hashman.app

Last updated