ja na przykład robię sobie porównanie używając jak najbardziej rzeczywistych wartości, co daje większy profit: rozliczanie miesięczne czy godzinowe, bazując na mojej prawdziwej produkcji (net-biling), kilka dni na razie ale wygrywa godzinowe:
tak, tu niestety będzie rozjazd, bo publikują wyceny RCEm z opóźnieniem prawie 2 tygodnie.
Trzeba by eksportować dane do jakieś tabeli i wyliczać w offline, dużo zachodu.
Na razie różnica niewielka maj/kwiecień 255 vs 253 PLN/MWh
Na potrzeby szacunkowe wystarczy, i np taka obserwacja: w tygodniu wygrywa RCE ale w weekend już nie tak bardzo, wręcz w niedzielę wyższy profit jest z RCEm:
Nie dwa tygodnie, a szesc, poniewaz te ceny RCEm publikowane w czerwcu sa dla pradu w maju. Wiec dla pradu w czerwcu cene dostaniesz w polowie lipca. Tak wiec jedyne sensowne wyliczenia jakie mozna zrobic sa dla danych historycznych dla ktorych posiada sie cene RCEm.
CO do oplacalnosci z wlasnych obserwacji wychodzi mi ze RCMm dalej jest bardziej oplacalny dla domu (farmy mnie nie interesuja) poniewaz jesli przejdziesz na rozliczanie godzinowe to prad potem tez kupujesz po stawkach godzinowych, z moich wyliczen dla mojego przypadku wychodzi mi ze sie RCEm nie oplaca bez dorzucenia magazynu energii. Takze sensor ktory tu wspolnymi silami zrobilismy jest calkiem przydatny.
Projekt: Monitoring Rynkowych Cen Energii (RCE) z PSE
14 czerwca Państwowe Sieci Elektroenergetyczne (PSE) uruchomiły API, za pomocą którego publikują różne parametry, w tym Rynkowe Ceny Energii (RCE) w interwałach piętnastominutowych. Ceny te są pochodną Cen Rynku Dnia Następnego. Te ceny będą podstawą przy godzinowych rozliczeniach prosumentów.
Opis działania projektu
Projekt ma na celu automatyczne pobieranie i monitorowanie cen RCE na dzisiaj i jutro z API PSE, oraz wyświetlanie aktualnej ceny energii na dany moment.
Sensory do wklejenia do sensors.yaml
Sensor pobierający dzisiejsze ceny RCE
# Pobieranie dzisiejszych cen RCE z PSE
- platform: rest
name: RCE Prices Today
resource_template: "https://api.raporty.pse.pl/api/rce-pln?$filter=doba eq '{{ now().strftime('%Y-%m-%d') }}'"
method: GET
headers:
accept: "application/json"
value_template: "{{ value_json.value[0]['rce_pln'] }}"
json_attributes:
- value
scan_interval: 3600
Sensor pobierający jutrzejsze ceny RCE
# Pobieranie jutrzejszych cen RCE z PSE
- platform: rest
name: RCE Prices Tomorrow
resource_template: "https://api.raporty.pse.pl/api/rce-pln?$filter=doba eq '{{ (now() + timedelta(days=1)).strftime('%Y-%m-%d') }}'"
method: GET
headers:
accept: "application/json"
value_template: "{{ value_json.value[0]['rce_pln'] }}"
json_attributes:
- value
scan_interval: 3600
Template sensor z bieżącą ceną RCE
# Sensor z bieżącą ceną
- platform: template
sensors:
current_rce_price:
friendly_name: "Current RCE Price"
value_template: >
{% set current_time = now().strftime('%H:%M') %}
{% set prices = state_attr('sensor.rce_prices_today', 'value') %}
{% for price in prices %}
{% set start_time = price.udtczas_oreb.split(' - ')[0] %}
{% set end_time = price.udtczas_oreb.split(' - ')[1] %}
{% if start_time <= current_time < end_time %}
{{ price.rce_pln }}
{% endif %}
{% endfor %}
unit_of_measurement: "PLN/MWh"
Automatyzacja do wklejenia do automations.yaml
Automatyzacja aktualizująca bieżącą cenę co 15 minut:
Potrafi ktoś wyskrobać kod sensora który obliczy najtańsze okno 3 godzinne i zwróci godzinę startu tego okna? Siedzę nad tym 2 dzień i nie potrafię tego napisać.
Popracuję nad tym bo w sumie temu służy pobieranie tych cen żeby wykorzystać je do zarządzania oddaniem do sieci / ładowaniem magazynu.
Teraz pytanie praktyczne do czego chcemy tego używać.
Czy do uruchamiania urządzeń kiedy jest najtaniej (nie ma sensu dopóki nie wejdą w życie taryfy dynamiczne), czy np. do ładowania magazynu kiedy jest najtaniej, żeby w tym okresie zminimalizować oddawanie do sieci.
Ja tak bym kombinował. Jeśli więc do ładowania to okno czasowe trzeba określać w zakresie godzin kiedy jest słońce.
Ja PV jeszcze nie uruchomiłem i pewnie nie wszyscy mają. Z mojego punktu widzenia sensor który pozwoli mi uruchomić zmywarkę (program ma 2:45h) lub pralkę na programie eko 2:30h byłby idealny.
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
})
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.
Zerknij proszę w logi, bo u mnie wywala co jakiś czas błędy zbyt dużego rozmiaru ściąganych danych:
2024-06-24 22:13:34.257 WARNING (Recorder) [homeassistant.components.recorder.db_schema] State attributes for sensor.rce_prices_tomorrow exceed maximum size of 16384 bytes. This can cause database performance issues; Attributes will not be stored
Zarówno pomoże to nam, bo nie będziemy przechowywać pełnych wartości sensora dla każdego dnia, jak i sprawi że nie będziemy obciążać tak bardzo API PSE więc będzie sporo mniejsza szansa że je zlimitują za jakiś czas albo każą sobie płącić za dostęp.
Dzięki za sugestię, bardzo zasadna zmiana. Faktycznie teraz sensory przechowują mniej niepotrzebnych danych.
W kwestii zmniejszenia odpytywania API to obecnie scan_interval jest ustawiony 3600 czyli odczytuje stan co godzinę pomimo, że stan zmienia się raz na dobę.
Zmieniłem to na 86400 czy raz na 24h, ale do tego trzeba dołożyć automatyzację, która aktualizuje to po godzinie 00:00