Cheapest and the most expensive hours by average
This commit is contained in:
		
							parent
							
								
									aeb17d6969
								
							
						
					
					
						commit
						11399bf21b
					
				
					 3 changed files with 34 additions and 5 deletions
				
			
		| 
						 | 
					@ -33,12 +33,17 @@
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
            
 | 
					            
 | 
				
			||||||
          for (let i = 0; i < 24; i++) {
 | 
					          for (let i = 0; i < 24; i++) {
 | 
				
			||||||
            if(data.cheapest_hours.hours.includes(i)) {
 | 
					            let extra_class = "";
 | 
				
			||||||
                document.getElementById(prefix + i).className = "px-1 bg-green-500";
 | 
					            if(today && i == new Date().getHours()) {
 | 
				
			||||||
            } else if (data.most_expensive_hours.hours.includes(i)) {
 | 
					              extra_class = " border-solid border-4 border-gray-900 font-bold";
 | 
				
			||||||
                document.getElementById(prefix + i).className = "px-1 bg-rose-400";
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(data.cheapest_hours_by_average.hours.includes(i)) {
 | 
				
			||||||
 | 
					                document.getElementById(prefix + i).className = "px-1 bg-green-500" + extra_class;
 | 
				
			||||||
 | 
					            } else if (data.most_expensive_hours_by_average.hours.includes(i)) {
 | 
				
			||||||
 | 
					                document.getElementById(prefix + i).className = "px-1 bg-rose-400" + extra_class;
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                document.getElementById(prefix + i).className = "px-1 bg-amber-100";
 | 
					                document.getElementById(prefix + i).className = "px-1 bg-amber-100" + extra_class;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            document.getElementById(prefix + i).innerText = Math.round(data.total.hours[i]*100)/100;
 | 
					            document.getElementById(prefix + i).innerText = Math.round(data.total.hours[i]*100)/100;
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,11 +41,17 @@ Return spot prices for the whole day with all fees included.<br>
 | 
				
			||||||
**num_cheapest_hours** - number of cheapest hours to return, default is 8, use this to plan your consumption<br>
 | 
					**num_cheapest_hours** - number of cheapest hours to return, default is 8, use this to plan your consumption<br>
 | 
				
			||||||
**num_most_expensive_hours** - number of the most expensive hours to return, default is 8, use this to plan your consumption<br>
 | 
					**num_most_expensive_hours** - number of the most expensive hours to return, default is 8, use this to plan your consumption<br>
 | 
				
			||||||
**low_tariff_hours** - list of low tariff hours, default is 0,1,2,3,4,5,6,7,9,10,11,13,14,16,17,18,20,21,22,23 (D57d, ČEZ)<br>
 | 
					**low_tariff_hours** - list of low tariff hours, default is 0,1,2,3,4,5,6,7,9,10,11,13,14,16,17,18,20,21,22,23 (D57d, ČEZ)<br>
 | 
				
			||||||
 | 
					**average_hours** - used for calculation of cheapest hours based on average price of first few hours, this sets number of cheapest hours used to calculate number that is a base number for the calculation<br>
 | 
				
			||||||
 | 
					**average_hours_threshold** - used for calculation of average price, cheapest hours will be all hours with price lower than `average_price * threshold`<br>
 | 
				
			||||||
<br>
 | 
					<br>
 | 
				
			||||||
Output:<br>
 | 
					Output:<br>
 | 
				
			||||||
**spot** - current spot prices on our market<br>
 | 
					**spot** - current spot prices on our market<br>
 | 
				
			||||||
**total** - total price for the day including all fees and VAT<br>
 | 
					**total** - total price for the day including all fees and VAT<br>
 | 
				
			||||||
**sell** - current spot prices minus sell_fees<br>
 | 
					**sell** - current spot prices minus sell_fees<br>
 | 
				
			||||||
 | 
					**cheapest_hours** - 8 (or configured) cheapest hours in the day<br>
 | 
				
			||||||
 | 
					**most_expensive_hours** - 8 (or configured) the most expensive hours in the day<br>
 | 
				
			||||||
 | 
					**cheapest_hours_by_average** - cheapest hours based on average_hours and average_hours_threshold<br>
 | 
				
			||||||
 | 
					**most_expensive_hours_by_average** - the most expensive hours based on average_hours and average_hours_threshold<br>
 | 
				
			||||||
<br>
 | 
					<br>
 | 
				
			||||||
The final price on the invoice is calculated as:<br>
 | 
					The final price on the invoice is calculated as:<br>
 | 
				
			||||||
    monthly_fees + kWh consumption in low tariff * kwh_fees_low + kWh consumption in high tariff * kwh_fees_high<br>
 | 
					    monthly_fees + kWh consumption in low tariff * kwh_fees_low + kWh consumption in high tariff * kwh_fees_high<br>
 | 
				
			||||||
| 
						 | 
					@ -72,6 +78,12 @@ rest:
 | 
				
			||||||
  binary_sensor:
 | 
					  binary_sensor:
 | 
				
			||||||
  - name: "energy_cheap_hour"
 | 
					  - name: "energy_cheap_hour"
 | 
				
			||||||
    value_template: "{{ value_json.cheapest_hours.is_cheapest }}"
 | 
					    value_template: "{{ value_json.cheapest_hours.is_cheapest }}"
 | 
				
			||||||
 | 
					  - name: "energy_expensive_hour"
 | 
				
			||||||
 | 
					    value_template: "{{ value_json.most_expensive_hours.is_the_most_expensive }}"
 | 
				
			||||||
 | 
					  - name: "energy_expensive_hour_by_average"
 | 
				
			||||||
 | 
					    value_template: "{{ value_json.most_expensive_hours_by_average.is_the_most_expensive }}"
 | 
				
			||||||
 | 
					  - name: "energy_cheap_hour_by_average"
 | 
				
			||||||
 | 
					    value_template: "{{ value_json.cheapest_hours_by_average.is_cheapest }}""
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
"""
 | 
					"""
 | 
				
			||||||
| 
						 | 
					@ -90,6 +102,8 @@ def read_item(
 | 
				
			||||||
    no_cache:bool = False, 
 | 
					    no_cache:bool = False, 
 | 
				
			||||||
    num_cheapest_hours:int = 8,
 | 
					    num_cheapest_hours:int = 8,
 | 
				
			||||||
    num_most_expensive_hours:int = 8,
 | 
					    num_most_expensive_hours:int = 8,
 | 
				
			||||||
 | 
					    average_hours:int=4,
 | 
				
			||||||
 | 
					    average_hours_threshold:float=1.25,
 | 
				
			||||||
    ) -> DayPrice:
 | 
					    ) -> DayPrice:
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if not date:
 | 
					    if not date:
 | 
				
			||||||
| 
						 | 
					@ -127,6 +141,12 @@ def read_item(
 | 
				
			||||||
    cheapest_hours = [int(k) for k, v in list(spot_hours_total_sorted.items())[0:num_cheapest_hours]]
 | 
					    cheapest_hours = [int(k) for k, v in list(spot_hours_total_sorted.items())[0:num_cheapest_hours]]
 | 
				
			||||||
    most_expensive_hours = [int(k) for k, v in list(reversed(spot_hours_total_sorted.items()))[0:num_most_expensive_hours]]
 | 
					    most_expensive_hours = [int(k) for k, v in list(reversed(spot_hours_total_sorted.items()))[0:num_most_expensive_hours]]
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    # Average over four cheapest hours and calculation of all hours that are in this average +20 %
 | 
				
			||||||
 | 
					    four_cheapest_hours = [v for k, v in list(spot_hours_total_sorted.items())[0:average_hours]]
 | 
				
			||||||
 | 
					    four_cheapest_hours_average = sum(four_cheapest_hours) / average_hours
 | 
				
			||||||
 | 
					    cheapest_hours_by_average = [int(k) for k, v in list(spot_hours_total_sorted.items()) if v < four_cheapest_hours_average * average_hours_threshold]
 | 
				
			||||||
 | 
					    most_expensive_hours_by_average = set(range(24)) - set(cheapest_hours_by_average)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    data = DayPrice(
 | 
					    data = DayPrice(
 | 
				
			||||||
        monthly_fees=monthly_fees * VAT,
 | 
					        monthly_fees=monthly_fees * VAT,
 | 
				
			||||||
        monthly_fees_hour=monthly_fees_hour * VAT,
 | 
					        monthly_fees_hour=monthly_fees_hour * VAT,
 | 
				
			||||||
| 
						 | 
					@ -141,6 +161,8 @@ def read_item(
 | 
				
			||||||
        sell=spot_for_sell,
 | 
					        sell=spot_for_sell,
 | 
				
			||||||
        cheapest_hours=CheapestHours(hours=cheapest_hours, is_cheapest=hour in cheapest_hours if is_today else None),
 | 
					        cheapest_hours=CheapestHours(hours=cheapest_hours, is_cheapest=hour in cheapest_hours if is_today else None),
 | 
				
			||||||
        most_expensive_hours=MostExpensiveHours(hours=most_expensive_hours, is_the_most_expensive=hour in most_expensive_hours if is_today else None),
 | 
					        most_expensive_hours=MostExpensiveHours(hours=most_expensive_hours, is_the_most_expensive=hour in most_expensive_hours if is_today else None),
 | 
				
			||||||
 | 
					        cheapest_hours_by_average=CheapestHours(hours=cheapest_hours_by_average, is_cheapest=hour in cheapest_hours_by_average if is_today else None),
 | 
				
			||||||
 | 
					        most_expensive_hours_by_average=MostExpensiveHours(hours=most_expensive_hours_by_average, is_the_most_expensive=hour in most_expensive_hours_by_average if is_today else None),
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
    return data
 | 
					    return data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,8 @@ class DayPrice:
 | 
				
			||||||
    sell: Price
 | 
					    sell: Price
 | 
				
			||||||
    cheapest_hours: CheapestHours
 | 
					    cheapest_hours: CheapestHours
 | 
				
			||||||
    most_expensive_hours: MostExpensiveHours
 | 
					    most_expensive_hours: MostExpensiveHours
 | 
				
			||||||
 | 
					    cheapest_hours_by_average: CheapestHours
 | 
				
			||||||
 | 
					    most_expensive_hours_by_average: MostExpensiveHours
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue