Entity do zliczania zużycia pelletu

Szanowni Panowie i Panie.

Chodzi mi po głowie ustalenie średniego zużycia dziennego pelletu przez mój piec. Mogę dostać się do niego przez API producenta i wyciągnąłem sobie entities niezbędne ( moim skromnym zdaniem ) do wyliczenia średniego zużycia dobowego pelletu. Na początek przedstawię co mam, później jaki mam tok rozumowania w wyliczeniu zużycia . Natomiast na końcu moje prośby do Was.

  1. Co mam ?
    Mam czas pracy podajnika paliwa w sekundach. Niestety podaje on czas nie dobowy ale od początku zasypania zbiornika ( aktualnie 19 885 sekund ).
    Mam encję w której trzymam zużycie pelletu na 1s.

  2. Jak to mi się widzi do wyliczenia.
    Zmierzyć czas pracy podajnika w ciągu 24 godzin. Załóżmy , że od północy do północy. Dane zapisać ( zdaję sobie sprawę, że pierwszy pomiar będę musiał odczekać :slight_smile: )

Wtedy już z górki czas_pracy x ilość_paliwa_na_1s i wychodzi zużycie w ciągu poprzedniej doby.
Mając kilka zapisów czasu pracy podajnika, np. w ciągy miesiąca można policzyć średnie dobowe zużycie. Wtedy można już w miarę dokładnie prognozować.
Później puszczając już wodze fantazji mając stare dane pogodowe i prognozowane można wynik prognozy bardziej zbliżyć do rzeczywistości. Na razie ten temat jako fantazja.

  1. Co bym potrzebował ?
    Nie wiem jak zabrać się za pomiar czasu w ciągu doby. Wymyśliłem sobie tak, że tworzę automatyzację w której o 24.00 odczytam wartość pracy podajnika a o 24.00 odczytam ponownie. Odejmę od siebie i mam czas w sekundach pracy podajnika. Niestety nie wiem jak to zrobić. Resztę automatyzacji robię w node red ale teraz to tak jak by armata na komara. Nie dotykałem automatyzacji w HA.

Ma podobnej zasadzi liczę zużycie gazu przez kocioł.
Z czasu pracy palnika, mocy chwilowej i znamionowego zapotrzebowania gazu w l/min. Obliczam przyrostowo całkowite użycie gazu “sensor.gas”.
Statystyki automatycznie tworzy panel “Energia” wymagane jest tylko utworzenie utility_meter.

utility_meter:
  
        
    gas_hourly:
        name: Gaz Godz
        source: sensor.Gaz
        cycle: hourly
    gas_daily:
        name: Gaz Dzień
        source: sensor.Gaz
        cycle: daily
    gaz_weekly:
        name: Gaz Tydz
        source: sensor.Gaz
        cycle: weekly
    gaz_monthly:
        name: Gaz Mies
        source: sensor.Gaz
        cycle: monthly
    gaz_yearly:
        name: Gaz Rok
        source: sensor.Gaz
        cycle: yearly        
        
    


gas1

U Ciebie byłoby to jeszcze prostsze.
plellet = czas pracy * ilość/sek
To wszystko…

1 polubienie

Potraktuj to jako “stan licznika” i tak ja proponuje @RobinI30 zastosuj na końcu utility_meter, który sam wszystko zsumuje w określonych przedziałach czasu, nie trzeba do tego żadnych automatyzacji, żadnego odejmowania.

Chyba mi się komplikuje sprawa. Otóż gdy dosypuję peletu i wciskam na sterowniku “dosypanie” licznik się zeruje. W drugiej zmiennej mam poprzedni czas przed zerowaniem oraz mam datę i godzinę dosypanie pelletu.

Jest jakiś rzeczywisty problem czy przewidujesz?
Powinno działać, utility_meter chyba sumuje tylko przyrosty. Po dosypaniu będzie ujemny przyrost dla pierwszego odczytu, a kolejne będą już prawidłowe.

przewiduję :slight_smile: sprawdzmy HA. Dam znak jak poszło

Pokaż jak masz skonfigurowany sensor.gaz

Nic Ci to nie powie bo obliczenia robę w NR

  - platform: mqtt
    name: "Gaz"
    state_topic: "VITOWIFI/Gass"
    unit_of_measurement: 'm³'
    state_class: 'total_increasing'
    device_class: 'gas'

W zakładce Energy ciągle nie widzi mi encji

poprawka. już widzi. Wystarczyło zmienić name na gas. Niżej wersją już działająca z zakładką energy.

  - sensor:
      - name: "gas"
        device_class: 'gas'
        unit_of_measurement: "kg"
        state_class: 'total_increasing'
        state: >
          {% set zuzycie = states('sensor.zuzycie_na_sekunde') | float %}
          {% set czas = states('sensor.czas_pracy_podajnika') | float %}
          {{ (zuzycie*czas)/1000 | float | round (2) }}
utility_meter:

    gas_hourly:
        name: Pellet Godz
        source: sensor.gas
        cycle: hourly
    gas_daily:
        name: Pellet Dzień
        source: sensor.gas
        cycle: daily
    gas_weekly:
        name: Pellet Tydz
        source: sensor.gas
        cycle: weekly
    gas_monthly:
        name: Pellet Mies
        source: senssensor.gas
        cycle: monthly
    gas_yearly:
        name: Pellet Rok
        source: sensor.gas
        cycle: yearly 

Popraw name: “zuzycie_total”

1 polubienie

Ja mam tak zrobione

Mam sterownik Iryd620 Pellet inni można też palić ekogroszkiem, palnik tylko przełożyłem

Niestety aby dane wyciągnąć ze sterownika pokusiłem się o moduł Internetowy MI-95 i ze strony www.aikacja.prond.pl po zalogowaniu się do mojego modułu powyviagalem z niego dane jakie się tylko dało i na ich podstawie zrobiłem sobie dashboard Kocioł a w nim, mam poziom w % podajnika, wszelkie temperatury , a dzięki temu mogłem z AI dorobić resztę , czyli właśnie spalanie na dobę, przewidywanie końca opału w podajniku, dorobiłem sobie też kafelek z magazynem i na podstawie spalania dobowego również mi wylicza na ile wystarczy opału z magazynu :slight_smile:

Np kod do mojego spalania w podajniku

Do tego są jeszcze stworzone sensory które to zliczaja i wyświetlają info w odpowiedniej formie

zurzycie_dobowe_pellet_groszek.yaml (3,8 KB)

square: false
type: grid
columns: 3
cards:
  - type: custom:button-card
    template: prond_small_style
    entity: sensor.prond_stan_opalu
    triggers_update:
      - sensor.aktualny_tryb_kotla
    name: Opał podajnika
    icon: mdi:barrel
    state_display: |
      [[[
        if (entity.state == 'unavailable' || entity.state == 'unknown') return '--';
        var tryb = states['sensor.aktualny_tryb_kotla'] ? states['sensor.aktualny_tryb_kotla'].state : 'Ekogroszek';
        var procent = parseFloat(entity.state) || 0;
        var max_kg = (tryb == 'Pellet') ? 90 : 140;
        var waga = Math.round((procent / 100) * max_kg);
        return procent + '% / ' + waga + 'kg';
      ]]]
    styles:
      card:
        - position: relative
        - background-image: |
            [[[
              if (entity.state == 'unavailable' || entity.state == 'unknown') return 'none';
              const v = parseFloat(entity.state) || 0;
              // Zwiększone nasycenie (0.3) dla lepszej widoczności
              let color = v > 50 ? 'rgba(76, 175, 80, 0.3)' : (v > 25 ? 'rgba(255, 152, 0, 0.3)' : 'rgba(244, 67, 54, 0.3)');
              
              // Dodajemy "kreskę" na górze (linear-gradient z twardym przejściem 2px), żeby widzieć poziom
              return `linear-gradient(to top, ${color} ${v}%, rgba(255,255,255,0.05) ${v}%, rgba(255,255,255,0.05) ${v + 1}%, transparent ${v + 1}%)`;
            ]]]
      icon:
        - color: |
            [[[
              if (entity.state == 'unavailable' || entity.state == 'unknown') return 'grey';
              const v = parseFloat(entity.state) || 0;
              if (v > 50) return '#4caf50';
              if (v > 25) return '#ff9800'; // Wyrazisty pomarańczowy
              return '#f44336'; // Wyrazisty czerwony
            ]]]
      state:
        - font-size: 13px
        - font-weight: bold
  - type: custom:button-card
    template: prond_small_style
    entity: sensor.prond_spalanie_cache
    name: Spalanie / 24h
    icon: mdi:fire-circle
    state_display: |
      [[[
        if (entity.state == 'unavailable' || entity.state == 'unknown') return '--';
        
        var tryb = states['sensor.aktualny_tryb_kotla'] 
          ? states['sensor.aktualny_tryb_kotla'].state 
          : 'Ekogroszek';
          
        var val = parseFloat(entity.state) || 0;
        var max_kg = (tryb == 'Pellet') ? 90 : 140;
        
        var waga = Math.round((Math.abs(val) / 100) * max_kg);
        
        return waga + ' kg';
      ]]]
    styles:
      card:
        - box-shadow: 0 0 10px rgba(255, 152, 0, 0.15)
      icon:
        - color: |
            [[[
              if (entity.state == 'unavailable' || entity.state == 'unknown') return 'grey';
              return '#ff9800';
            ]]]
      state:
        - font-size: 13px
        - white-space: nowrap
  - type: custom:button-card
    template: prond_small_style
    entity: sensor.przewidywany_koniec_opalu
    name: "Braknie dnia:"
    icon: mdi:timer-sand
    state_display: |
      [[[
        if (!entity.state || entity.state == 'unavailable' || entity.state == 'unknown') return '...';
        return entity.state.replace(/\\n/g, '<br>').replace(/\n/g, '<br>');
      ]]]
    styles:
      card:
        - box-shadow: 0 0 10px rgba(171, 71, 188, 0.15)
      icon:
        - color: |
            [[[ 
              if (!states['sensor.prond_zuzycie_ostatnie_24h']) return 'grey';
              var statState = states['sensor.prond_zuzycie_ostatnie_24h'].state;
              var val = parseFloat(statState) || 0;
              if (val > 0) return '#4caf50'; 
              return '#ab47bc'; 
            ]]]
      state:
        - font-size: 10px
        - line-height: 1.2
title: Spalanie w podajniku
1 polubienie

na telefonie dodawałem a tam nie ma opcji żeby jakoś ten kod umieścić, teraz na kompie też nie widzę jak więc dodałem w formie załącznika z rozszerzeniem yaml

O ile mogę się zgodzić, że wybór telefonu do pisania na forum jest całkiem do bani, to się nie da powiedzieć, że istotnie nie ma potrzebnych opcji.

Jak to nie ma opcji, wystarczy, że jest klawiatura ekranowa.

1 polubienie