Ten z bateriami, to właśnie mój przypadek
Aktualnie jadę na G12 i gdy solarcast przewiduje, że nie będzie słońca wystarczająco by naładować mój magazyn z PV to doładowuję z sieci (w tańszej taryfie).
Nie integrowałem nic jeszcze z kalendarzem w HA i zastanawiam się jak tego użyć.
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.