init 0%
lkusinski.pl LOAD 000%

_ projekt 06 · bazy danych i telemetria EV

Biling EV —
retencja SQLite

Precyzyjne rozliczanie ładowania BMW w taryfach Energa G12W
statystyki długoterminowe LTS, całka Riemanna i zero utraty danych po 10 dniach

01 · ARCHITEKTURA BAZY

Pułapka 10-dniowej
retencji SQLite

Home Assistant w instalacji produkcyjnej generuje potężny strumień zdarzeń. Konfiguracja configuration.yaml z parametrem purge_keep_days: 10 oraz interwałem zapisu 15 sekund utrzymuje plik bazy SQLite w ryzach (ok. 1.1 GB).

Cena za stabilność jest wysoka: wszystkie surowe stany sensorów starsze niż 10 dni są bezpowrotnie kasowane. Jeśli moc ładowania (w watach lub kilowatach) zostanie zarejestrowana jako standardowy sensor, po dwóch tygodniach jakakolwiek retrospektywna analiza kosztów przestaje istnieć.

Rozwiązaniem jest wymuszenie zapisu do tabel Long-Term Statistics (LTS). Mechanizm ten agreguje dane w interwałach godzinowych i nigdy nie podlega procedurze purge. Warunek? Sensor musi posiadać parametr state_class: total_increasing oraz klasę device_class: energy.

  • Całka RiemannaPlatforma integration z metodą trapezów przelicza moc chwilową 3 faz (W) na narastający licznik energii (kWh)
  • Utility MeterWirtualne liczniki rozbijają energię na cykle dobowe, miesięczne i roczne, zachowując stan nawet po twardym resecie serwera
  • Jedna prawdaWyjściowa encja sensor.i4_breaker_koszt_realny_pln podaje rzeczywisty koszt sesji w złotych z dokładnością do grosza

02 · LOGIKA ROZLICZENIOWA

Wielotaryfowy podział
kosztów sesji

POTOK ROZLICZENIOWY BREAKERA BMW I4 (ANALIZALICZNIKAI4.YAML) ODPORNOŚĆ NA 2 ŹRÓDŁA POMIARU
1. Pomiar mocy 3-fazowej (Tuya Cloud ↔ Tuya Local) Moc chwilowa [W]
Zunifikowana encja i4_breaker_moc_chwilowa z dynamicznym fallbackiem źródła
  • • Priorytet 1: Tuya Cloud breaker_phase_a/b/c_power (konwersja kW → W)
  • • Priorytet 2: Telemetria pojazdu CarData (sensor.bmw_i4_moc_z_sieci)
  • • Priorytet 3: Tuya Local na dedykowanym podliczniku garażowym (IP .171)
2. Rozdział energii na 3 koszyki taryfowe Dynamiczny algorytm
Klasyfikacja każdego wata w locie w oparciu o stan sieci i falownika PV
AUTOKONSUMPCJA PV
  • • Stawka: 0.00 PLN/kWh (darmowa)
  • • Warunek: moc PV pokrywa pobór breakera
  • • Opcja kosztu alternatywnego RCEm w helperze
TARYFA NOCNA G12W (T2)
  • • Stawka: 0.65 PLN/kWh brutto
  • • Okna: 22:00–06:00, 13:00–15:00
  • • Całe weekendy i święta w taniej strefie
TARYFA DZIENNA G12W (T1)
  • • Stawka: 1.30 PLN/kWh brutto
  • • Godziny szczytowe w dni robocze
  • • Blokada ładowania automatyzacją Homelab
3. Agregacja Long-Term Statistics & Powiadomienia Trwały zapis w bazie (brak kasowania po 10 dniach)
Natywna karta podsumowania sesji na ekranie blokady iOS z dokładnym kosztem i sprawnością
  • • Rejestracja w bazodanowych statystykach wieloletnich bez utraty danych
  • • Wyliczanie sprawności sesji (energia przyjęta przez baterię vs energia pobrana z gniazda)
  • • Automatyczny push na iPhone po odpięciu wtyczki typu 2 (Mennekes)

03 · IMPLEMENTACJA

Wyciąg z pakietu
YAML

Stawki taryfowe zostały wyniesione do encji input_number, co pozwala korygować ceny prądu bez konieczności edytowania plików i restartowania serwera:

input_number:
  i4_cena_dzien:
    name: "i4 cena dzień G12W [PLN/kWh]"
    min: 0
    max: 5
    step: 0.01
    mode: box
  i4_cena_noc:
    name: "i4 cena noc/weekend G12W [PLN/kWh]"
    min: 0
    max: 5
    step: 0.01
    mode: box
  i4_cena_pv:
    name: "i4 cena PV [PLN/kWh]"
    min: 0
    max: 5
    step: 0.01
    mode: box

sensor:
  - platform: integration
    source: sensor.i4_moc_chwilowa_dzien
    name: "i4 energia koszt dzien total"
    unit_prefix: k
    round: 2
    method: left
  • Sprawność ładowaniaDzięki zrównolegleniu danych z licznika i telemetrii BMW wyliczamy realną stratę na przetwornicy pokładowej (średnia sprawność: 89.2%)
  • Zero wyciekówŻadne prywatne numery VIN ani dane lokalizacji nie są wiązane z encjami rozliczeniowymi

04 · DZIENNIK DZIAŁAŃ

Kalendarium
bilingu i bazy danych

Ewolucja architektury bilingowej i pokonywanie ograniczeń bazy SQLite w Home Assistant:

  • 14.06.2026 · Diagnoza utraty danych po 10 dniach Wykrycie zjawiska czyszczenia historii przez standardowy proces recorder purge w SQLite. Zwykłe sensory mocy po 10 dniach traciły historię, uniemożliwiając rozliczenia miesięczne.
  • 18.06.2026 · Wdrożenie całki Riemanna i tabel LTS Przejście na platform: integration z narastającym licznikiem energii oraz przypisaniem state_class: total_increasing. Trwały zapis w bazie bez limitu czasowego retencji.
  • 24.08.2026 · Zestrojenie taryf wielostrefowych Energa G12W Wprowadzenie podziału na 3 koszyki: autokonsumpcja PV (0.00 PLN), tania strefa nocna/weekendowa (0.65 PLN/kWh) oraz szczytowa dzienna (1.30 PLN/kWh).
  • 01.09.2026 · Zabezpieczenie sprzętowe Veto 1.0 kW / 0.5 kW Eliminacja wyścigu zdarzeń pomiędzy opóźnionym statusem BMW CarData API a rzeczywistym ładowaniem. Sprzętowy licznik prądu stał się źródłem prawdy z prawem weta wobec fałszywych sygnałów zakończenia.
  • 24.09.2026 · Wyliczanie kosztu sesji dla iOS Live Activity Dodanie markerów całek na starcie i końcu ładowania (bmw_i4_koszty.yaml). Wyliczanie rzeczywistego kosztu sesji co do grosza i przesyłanie na zablokowany ekran iPhone'a.