Wykres zmagazynowanej energii gotowej do odbioru

Zainspirowany dyskusją w wątku, zrobiłem to u siebie w następujacy sposób:

utility_meter:
  channel_a_energy_hourly:
    source: sensor.shellyem3_channel_a_energy
    cycle: hourly
  channel_a_energy_returned_hourly:
    source: sensor.shellyem3_channel_a_energy_returned
    cycle: hourly
  channel_b_energy_hourly:
    source: sensor.shellyem3_channel_b_energy
    cycle: hourly
  channel_b_energy_returned_hourly:
    source: sensor.shellyem3_channel_b_energy_returned
    cycle: hourly
  channel_c_energy_hourly:
    source: sensor.shellyem3_channel_c_energy
    cycle: hourly
  channel_c_energy_returned_hourly:
    source: sensor.shellyem3_channel_c_energy_returned
    cycle: hourly

template:    
  - trigger:
      - platform: time_pattern
        minutes: 1
    sensor:
      - name: "Energy Storage"
        unit_of_measurement: 'kWh'
        icon: mdi:solar-power
        state: >-
          {% set storage = states('sensor.energy_storage') | float %}
          {% set ac = state_attr('sensor.channel_a_energy_hourly', 'last_period') | float %}
          {% set ar = state_attr('sensor.channel_a_energy_returned_hourly', 'last_period') | float %}
          {% set bc = state_attr('sensor.channel_b_energy_hourly', 'last_period') | float %}
          {% set br = state_attr('sensor.channel_b_energy_returned_hourly', 'last_period') | float %}
          {% set cc = state_attr('sensor.channel_c_energy_hourly', 'last_period') | float %}
          {% set cr = state_attr('sensor.channel_c_energy_returned_hourly', 'last_period') | float %}
          {% set consumed = ac + bc + cc %}
          {% set returned = ar + br + cr %}
          {% set delta = consumed - returned %}
          
          {% if delta  >= 0 %}
            {% if (storage - delta)  > 0 %}
              {{ (storage - delta) | round(2) }}
            {% else %} 
              {{ 0 }}
            {% endif %}
          {% else %}
            {{ (storage - 0.8*delta) | round(2) }}
          {% endif %}

Na razie działa, ale na temat jakiejkolwiek precyzji pewnie będzie można się wypowiedzieć dopiero w sezonie letnim.
Nie wiem też co się stanie, gdy z jakiegoś powodu zgubi któreś z obliczeń (HA nie będzie działało w tym czasie) - pewnie trzeba by dodać warunek sprawdzający i jakiś atrybut z timestampem ostatniego wykonania.

1 polubienie

W przypisaniu cc i cr masz kanał a, ale może to już zauważyłeś.

Tak jest, dzięki za zwrócenie uwagi, właśnie poprawiłem.

A jak rozwiązać taki problem. Mam np miesięczne kasowanie licznika załóżmy zużycia prądu… Po zakończeniu miesiąca idzie nowy od zera… jak wyciągnąć wartość i gdzieś zapisać w celu np sporządzenia wykresu lub historii? Ciężko mi to ogarnąć z której strony i jak to zaczac

Nie wiem czy dobrze rozumiem problem, ale wydaje mi się, że powinieneś zapisywać wartości do utility_meter, które później można wyrysować w Statistics Graph Card.

Ja u siebie zbieram tak dane z licznika wody:

utility_meter:
  hourly_water:
    source: sensor.apator_00311026
    cycle: hourly
  daily_water:
    source: sensor.apator_00311026
    cycle: daily
  weekly_water:
    source: sensor.apator_00311026
    cycle: weekly
  monthly_water:
    source: sensor.apator_00311026
    cycle: monthly
  yearly_water:
    source: sensor.apator_00311026
    cycle: yearly

Co można później użyć w tej karcie:

1 polubienie

wrzuciłem twoj konfig i mam pytanie co liczy ta encja: “Energia pobrana czy oddana z magazynu sieci”
z kad masz te encje?
sensor.energia_oddana_do_pge_2
sensor.energia_pobrana_z_pge_2
bo nie wyswietlam ich

Jak wywołuje: Energia pobrana z PGE 1.8.0 i Energia oddana do PGE 2.8.0 mam stan unavailable

      - name: "Energia pobrana z PGE 1.8.0"
        state_class: total_increasing
        unit_of_measurement: kWh
        icon: mdi:transmission-tower      
        device_class: energy
        state: >
          {{ states('sensor.energia_pobrana_z_pge_2')|float + 10056.0 }}

      - name: "Energia oddana do PGE 2.8.0"
        state_class: total_increasing
        unit_of_measurement: kWh
        icon: mdi:transmission-tower     
        device_class: energy
        state: >
          {{ states('sensor.energia_oddana_do_pge_2')|float + 8993.3 }}


te encje otrzymuję z NodeReda, integracja Node-RED Companion.
Ostatnio zrezygnowałem z wcześniejszej konfiguracji, używam pomysłu @kulczas i robię to w template. Wcześniej też próbowałem ale nie wiedziałem jak wyzwalać co godzinę. Wrzucam kod który używam od miesiąca i działa prawidłowo.
magazyn_energii.yaml (3,6 KB)

Jakiego licznika używasz do pomiaru wysłanej i pobranej, niestety już kombinowałem z state_attr i wali mi błędy że wartość jest None :frowning: bo wartość nie jest jako atrybut tylko stan encji.

Z vcx_dts_1946+esp8266 otrzymuję wartości jako stan encji.

Wrócę do domu to wrzucę błędy jakie mam po skorzystaniu z kodu @kulczas
Ok tak to wyglada wciaz dostaje bład template:

ValueError: Template error: float got invalid input 'unavailable' when rendering template 'template:
    trigger:
      - platform: time_pattern
        minutes: 1
    sensor:
      - name: "Energy Storage"
        unit_of_measurement: 'kWh'
        icon: mdi:solar-power
        state: >-
          {% set storage = states('sensor.energy_storage') | float %}
          {% set ac = state_attr('sensor.energia_pobrana_przez_godzine', 'last_period') | float %}
          {% set ar = state_attr('sensor.energia_oddana_przez_godzine', 'last_period') | float %}
          {% set consumed = ac %}
          {% set returned = ar %}
          {% set delta = consumed - returned %}
          
          {% if delta  >= 0 %}
              {{ (storage - delta) | round(2) }}
          {% else %}
            {{ (storage - 0.8*delta) | round(2) }}
          {% endif %}        
      - name: "Energy Import from PGE hourly"
        unit_of_measurement: 'kWh'
        icon: mdi:solar-power
        state: >-
          {% set import = states('sensor.energy_import_from_pge_hourly') | float %}
          {% set ac = state_attr('sensor.energia_pobrana_przez_godzine', 'last_period') | float %}
          {% set ar = state_attr('sensor.energia_oddana_przez_godzine', 'last_period') | float %}
          {% set consumed = ac %}
          {% set returned = ar %}
          {% set delta = consumed - returned %}
          
          {% if delta  >= 0 %}
              {{ (import + delta) | round(2) }}
          {% else %}
            {{ (import + 0) | round(2) }}
          {% endif %}   
      - name: "Energy Export to PGE hourly"
        unit_of_measurement: 'kWh'
        icon: mdi:solar-power
        state: >-
          {% set export = states('sensor.energy_export_to_pge_hourly') | float %}
          {% set ac = state_attr('sensor.energia_pobrana_przez_godzine', 'last_period') | float %}
          {% set ar = state_attr('sensor.energia_oddana_przez_godzine', 'last_period') | float %}
          {% set consumed = ac %}
          {% set returned = ar %}
          {% set delta = consumed - returned %}
          
          {% if delta  <= 0 %}
              {{ (export - delta) | round(2) }}
          {% else %}
            {{ (export + 0) | round(2) }}
          {% endif %}' but no default was specified
utility meter:
 y_energia_oddana_godzinowa:
    source: sensor.0_electricity_meter_total_reverse_active_energy
    name: Energia oddana przez godzinę
    cycle: hourly
    
 x_energia_pobrana_godzinowa:
    source: sensor.0_electricity_meter_total_forward_active_energy
    name: Energia pobrana przez godzinę
    cycle: hourly

 miesieczna_energia_oddana_do_pge:
    source: sensor.energy_export_to_pge_hourly
    name: Miesieczna energia oddana do PGE
    cycle: monthly

 miesieczna_energia_pobrana_z_pge:
    source: sensor.energy_import_from_pge_hourly
    name: Miesieczna energia pobrana z PGE
    cycle: monthly
    
 dzienne_zuzycie_energii_przez_dom:
    source: sensor.zuzycie_energii_przez_dom
    name: Dzienne zużycie energii przez dom
    cycle: daily 

template:
    trigger:
      - platform: time_pattern
        minutes: 1
  -  sensor:
      - name: "Energy Storage"
        unit_of_measurement: 'kWh'
        icon: mdi:solar-power
        state: >-
          {% set storage = states('sensor.energy_storage') | float %}
          {% set ac = state_attr('sensor.energia_pobrana_przez_godzine', 'last_period') | float %}
          {% set ar = state_attr('sensor.energia_oddana_przez_godzine', 'last_period') | float %}
          {% set consumed = ac %}
          {% set returned = ar %}
          {% set delta = consumed - returned %}
          
          {% if delta  >= 0 %}
              {{ (storage - delta) | round(2) }}
          {% else %}
            {{ (storage - 0.8*delta) | round(2) }}
          {% endif %}        
      - name: "Energy Import from PGE hourly"
        unit_of_measurement: 'kWh'
        icon: mdi:solar-power
        state: >-
          {% set import = states('sensor.energy_import_from_pge_hourly') | float %}
          {% set ac = state_attr('sensor.energia_pobrana_przez_godzine', 'last_period') | float %}
          {% set ar = state_attr('sensor.energia_oddana_przez_godzine', 'last_period') | float %}
          {% set consumed = ac %}
          {% set returned = ar %}
          {% set delta = consumed - returned %}
          
          {% if delta  >= 0 %}
              {{ (import + delta) | round(2) }}
          {% else %}
            {{ (import + 0) | round(2) }}
          {% endif %}   
      - name: "Energy Export to PGE hourly"
        unit_of_measurement: 'kWh'
        icon: mdi:solar-power
        state: >-
          {% set export = states('sensor.energy_export_to_pge_hourly') | float %}
          {% set ac = state_attr('sensor.energia_pobrana_przez_godzine', 'last_period') | float %}
          {% set ar = state_attr('sensor.energia_oddana_przez_godzine', 'last_period') | float %}
          {% set consumed = ac %}
          {% set returned = ar %}
          {% set delta = consumed - returned %}
          
          {% if delta  <= 0 %}
              {{ (export - delta) | round(2) }}
          {% else %}
            {{ (export + 0) | round(2) }}
          {% endif %}         
          

Edit:

dobra jakos ogarniete, jak bardzo starych wersji HA uzywacie ze wam to działa :rofl: wystarczylo zmienic linijki w ten sposob:
tak było

          {% set storage = states('sensor.energy_storage') | float %}
          {% set ac = state_attr('sensor.energia_pobrana_przez_godzine', 'last_period') | float %}
          {% set ar = state_attr('sensor.energia_oddana_przez_godzine', 'last_period') | float %}

Od wersji HA 2021.12.0 trzeba określac wartość domyślną sensora bo jeżeli sensor jest unknown to filtr float nie może przekonwertować wartości „nieznany” na liczbę i ma być tak:

          {% set storage = states('sensor.energy_storage') | float(0) %}
          {% set ac = state_attr('sensor.energia_pobrana_przez_godzine', 'last_period') | float(0) %}
          {% set ar = state_attr('sensor.energia_oddana_przez_godzine', 'last_period') | float(0) %}

teraz ostania zagwozdka co oznaczają cyfry 587.8 w poniższym kodzie:

      - name: "Zużycie energii przez dom"
        state_class: total_increasing
        unit_of_measurement: 'kWh'
        state: > 
          {% if ((states('sensor.total_yield') | float(0)) -
               states('sensor.energia_czynna_oddana') | float(0) + 
               states('sensor.energia_czynna_pobrana') | float(0) 
               - 587.8 ) | round(2) < 300 %}
              {{ states('sensor.zuzycie_energii_przez_dom') }}       
          {% else %}
          {{ ((states('sensor.total_yield') | float(0)) -
               states('sensor.energia_czynna_oddana') | float(0) + 
               states('sensor.energia_czynna_pobrana') | float(0) 
               - 587.8 ) | round(2) }}
          {% endif %}

To wartość która ustalała wartość początkową sensora. W “magazynie” już coś było.

czyli potrzebuje stan magazynu na dzień dzisiejszy…

Tak patrzę na te pomiary o oczom nie wierze :thinking: sprawdzaliscie czy te pomiary są realne? bo cos tu nie gra. Wg licznika mew01 w siec poszło od rana 3.62kWh nie zbilansowanego a zobaczcie co pokazują te wyliczenia :thinking:
Wg encji energia oddana przez godzinę zgadza sie z licznikiem mew01 ale pozniej same wyliczenia cos mieszają.

Nikt nie wie jakie dane podstawiasz i co otrzymujesz. Musisz sam popatrzeć jak wartości zmieniają się co godzinę.

Za każdym restartem HA mam całkowicie inne dane więc pewnie sam template jest lipny. No nic szukam dalej jakiegoś sprawdzonego sposobu.

Musisz sprawdzić czy energia pobrana i oddana godzinowa liczą się dobrze (utility_meter).
W drugim kroku trigger wyzwala co godzinę (1 minuta po pełnej godzinie) template i dzięki temu wartości zmieniają się o last_period tylko o godzinie xx:01, a nie po każdym restarcie HA.

A jak byscie to widzieli jak juz mam dwie encje ktore są zbilansowane miedzy fazowo tzn

  • jedną encje mam energia zbilansowana - oddana
  • drugą encje mam energia zbilansowana - pobrana.
    Jak w takim przykladzie wygladalo bilansowanie miedzyfazowe?

Nie mogę zrozumieć co chcesz osiągnąć?
“mam dwie encje ktore są zbilansowane miedzy fazowo”, a potem “Jak w takim przykladzie wygladalo bilansowanie miedzyfazowe?”
Skoro masz encje zbilansowane to co chcesz bilansować?

@dar3k rzeczywiście trochę namieszałem.

Dokładnie chodzi o to że trzeba z tych encji zaczytać wartość co godzinę odejmując wartość zaczytaną z poprzedniej godziny. Wtedy mamy wartość jaka jest dla jednej godziny i na koniec robimy prosty rachunek
wartość zaczytaną co godzinę energii oddanej do sieci x 0,8 - wartość zaczytaną co godzinę energii pobranej = ilość energii (wartość z minusem mówi nam o większej konsumpcji od produkcji a z plusem o większej produkcji od konsumpcji)
Na sam koniec musiało by się ten wynik sumować.

Sprawdź to:

Bo przykłady z tego wątku dla mnie albo nie działały albo w ogóle pokazywały głupoty :sweat_smile:

1 polubienie

Próbuję wdrożyć u siebie kod, który wrzuciłeś powyżej - ale coś mi chyba umknęło albo przeziębienie ogranicza racjonalne myślenie.

Utworzyłem plik " bilansowanie_godzinowe.yaml" w folderze z sensorami.
Zawartość folderu, zaczytuje w pliku “configuration.yaml”.

Oczywiście Twoje sensory energii pobranej/wysłanej przez Shelly 3em zaadaptowałem zgodnie z moimi nazwami.
I tutaj utknąłem …

Nie badzo wiem, co powienienem wykonać w następnej kolejności.
Czy mam teraz utworzyć w “pomocnikach” odpowiednio poniższe dwa sensory ?

  • sensor.licznik_energii_pobranej
  • sensor.licznik_energii_oddanej

Byłbyś w stanie łopatologicznie napisać w kilku punktach jak powinny wyglądać poszczególne kroki ? (wybacz, ale to moje pierwsze tygodnie z HA)

Pozdrawiam,
Michał