Tak na szybko, skrypt przeszukuje ceny zawarte w sensorze sensor.rce_prices_today (opisywany wcześniej w tym wątku) na zasadzie okna przesuwnego. Sprawdza sumę 12 cen (3 godziny po 15 min) i wybiera ten zakres gdzie ceny są jest najniższe.
Na razie dla prostoty brane są pod uwagę ceny w zakresie godzinowym 6:00 - 18:00, bo wtedy jest ładowanie.
Wynikiem działania skryptu sensor.lowest_price_window_daytime przyjmuje wartość np. 2024-06-24 09:15/2024-06-24 12:00 będącą zakresem trzech godzin najniższych cen.
Dodatkowo atrybut sensora min_avg przyjmuje wartość średniej z 12 cen dla danego okna 3 godzin.
Skrypt python find_lowest_price_window_daytime.py do dodania do folderu python_scripts:
# Pobierz ceny energii z sensora
prices = hass.states.get('sensor.rce_prices_today').attributes['value']
# Filtruj ceny, aby uwzględnić tylko przedział od 06:00 do 18:00
filtered_prices = [entry for entry in prices if '06:00' <= entry['udtczas_oreb'].split(' - ')[0] <= '18:00']
# Lista cen energii (rce_pln) w przefiltrowanym przedziale
price_list = [entry['rce_pln'] for entry in filtered_prices]
# Liczba interwałów w 3 godzinach (12 * 15 minut)
window_size = 12
# Inicjalizacja zmiennych do przechowywania minimalnej średniej i jej indeksu
min_avg = float('inf')
min_index = 0
# Przesuwanie okna po liście cen
for i in range(len(price_list) - window_size + 1):
# Obliczenie średniej cen w bieżącym oknie
current_avg = sum(price_list[i:i + window_size]) / window_size
# Sprawdzenie, czy bieżąca średnia jest najmniejsza
if current_avg < min_avg:
min_avg = current_avg
min_index = i
# Zwrócenie indeksu początkowego okna o najniższej średniej oraz tę średnią
start_time = filtered_prices[min_index]['udtczas']
end_time = filtered_prices[min_index + window_size - 1]['udtczas']
hass.states.set('sensor.lowest_price_window_daytime', f'{start_time}/{end_time}', {
'min_avg': min_avg
})
Sensor template do dodania w sensors.yaml:
# Okno czasowe najniższej ceny RCE w dzień
- platform: template
sensors:
lowest_price_window_daytime:
value_template: "{{ states('sensor.lowest_price_window_daytime').split('/')[0] }} - {{ states('sensor.lowest_price_window_daytime').split('/')[1] }}"
friendly_name: "Lowest Price Window Daytime"
attribute_templates:
min_avg: "{{ state_attr('sensor.lowest_price_window_daytime', 'min_avg') }}"
start_time: "{{ states('sensor.lowest_price_window_daytime').split('/')[0] }}"
end_time: "{{ states('sensor.lowest_price_window_daytime').split('/')[1] }}"
Temat pozostaje rozwojowy.
Można pobierać godziny wschodu i zachodu słońca z sensora sun, można wiele innych rzeczy ale ja najpierw muszę spiąć swój falownik z HA w sposób umożliwiający sterowanie nim, a wtedy to wszystko dopiero nabierze sensu.