LICZNIK GAZU na podstawie czasu pracy pieca

Analizowałem ten wykres i wygada to tak ze z obliczeniami jest OK, ale w Riemann SUM nie narasta ponieważ nie ma danych z sensora poniżej, zobacz na koniec prostej linii zmiana wartości dodała odpowiednia wartość pewnie tego okresu. Riemann SUM nie będzie dodawał na bieżąco jeśli nie ma w danym czasie punktu pomiaru a z tego co widzę to jeśli sensor nie zmienia wartości i punktu nowy odczytów które maja te sama wartość jak poprzednia dopiero jak nastąpi zmiana wtedy Riemann SUM bierze ten czas do obliczeń.

Masz rację, z powodu skali wykresów przeoczyłem ten mały schodek :+1:
Skoro obliczenia są poprawne to pozostaje tylko uporać się z jednostkami.

Na początek - dla próby w SUM ustaw przedrostek kilo (kilolitr to przecież m3) . Symbole jednostek będą bzdurne ale zobaczymy czy przeskaluje wykres

Zrób drugą zmianę - zamiast m3 użyj W - w panelu Energia powinny się pojawić statystyki gazu z jednostką Wh.

Są oba, tylko ten drugi prawdopodobnie zastał przeskalowany /1000 i wygląda jak prosta kreska na poziomie 0.

Wzrucisz w końcy konfigurację wszystkich zdefiniowanych w tym temacie encji?!

Wrzucam encje:

SENSOR BAZOWY
sensor.gaz_total:

   state_class: total_increasing
   unit_of_measurement: m³
   device_class: gas
   friendly_name: Gaz_total

RIEMANN SUM
sensor.gaz_total_riemann_sum_hour

  state_class: total
  source: sensor.gaz_total
  unit_of_measurement: m³h
  icon: mdi:chart-histogram
  friendly_name: Gaz_total_riemann_sum_hour

UTILITY METER
sensor.gaz_total_hour_riemann_sum

  state_class: total_increasing
  source: sensor.gaz_total_riemann_sum_hour
  status: collecting
  last_period: "308.015"
  last_valid_state: "3.197" 
  meter_period: hourly
  cron pattern: 0 * * * *
  last_reset: "2024-01-27T10:00:00.012639+00:00"
  unit_of_measurement: m³h
  icon: mdi:counter
  friendly_name: Gaz_total_Hour_Riemann_sum

Od razu się zapytam gdzie są tworzone/zapisane encje za pomocą helper, wygląda ze poziomu edytora nie mam do nich dostępu.

Dodam ze testowałem sensory z pominięciem jednostek efekt ten sam, utility zawyża tak samo.

Jeśli to pomoże to znalazłem pełna informacje o sensorach:

{
        "entry_id": "f94e4c6826594acb896e781cb2fe3e7b",
        "version": 1,
        "minor_version": 1,
        "domain": "template",
        "title": "Gaz_total",
        "data": {},
        "options": {
          "template_type": "sensor",
          "name": "Gaz_total",
          "state": "{{ ((( states('sensor.status_flames') | float(0) | round(0)  * ( ( 0.26 + ((states('sensor.boiler_modulation') | float(0) ) / 100 ) * ( 2 - 0.26 ))) ))  | round(3) )}}",
          "state_class": "total_increasing",
          "unit_of_measurement": "m³",
          "device_class": "gas"
        },
        "pref_disable_new_entities": false,
        "pref_disable_polling": false,
        "source": "user",
        "unique_id": null,
        "disabled_by": null
      },
      {
        "entry_id": "a730c62a779c71b317d84bc7c379d379",
        "version": 1,
        "minor_version": 1,
        "domain": "integration",
        "title": "Gaz_total_riemann_sum_hour",
        "data": {},
        "options": {
          "name": "Gaz_total_riemann_sum_hour",
          "source": "sensor.gaz_total",
          "method": "left",
          "round": 3.0,
          "unit_time": "h"
        },
        "pref_disable_new_entities": false,
        "pref_disable_polling": false,
        "source": "user",
        "unique_id": null,
        "disabled_by": null
      },
      {
        "entry_id": "43bbb1f3b50e7a8f311cc4e191006020",
        "version": 2,
        "minor_version": 1,
        "domain": "utility_meter",
        "title": "Gaz_total_Hour_Riemann_sum",
        "data": {},
        "options": {
          "name": "Gaz_total_Hour_Riemann_sum",
          "source": "sensor.gaz_total_riemann_sum_hour",
          "cycle": "hourly",
          "offset": 0.0,
          "tariffs": [],
          "net_consumption": false,
          "delta_values": true,
          "periodically_resetting": true
        },
        "pref_disable_new_entities": false,
        "pref_disable_polling": false,
        "source": "user",
        "unique_id": null,
        "disabled_by": null
      }
    ]
  }

Jeśli to jest sensor początkowy wyliczany przez helper (mod* Coś tam * coś tam)
to napewno nie jest state_class: total_increasing.
Ponieważ jego wartość zmienia się w czasie od 0 do 2 m3/h . Mówi jaki jest w danej chwili przepływ (NIE OBJĘTOŚĆ) gazu.

Moim zdaniem wystarczy taka definicja.

   state_class: measurement
   friendly_name: Gaz_moment

Oczywiście helpery musisz dostosować aby liczył Gaz_moment.
Z tego sensora liczysz całkę - czyli utworzysz licznik całkowitej objętości gazu - suma wszystkich pomiarów chwilowych - wartość będzie cały czas rosła.

Dla tak utworzonego nowego sensora zmienić jednostkę na m3 w customize.yaml
To jest największy problem, bo jeśli w tym miejscu nie będzie właściwej dopuszczonej dla gazu jednostki dalsza część nie będzie działać.
Być może trzeba będzie utworzyć pomocnika, który będzie zdefiniowany jako

    - name: "Gaz"
      unit_of_measurement: 'm³'
      state_class: 'total_increasing'
      device_class: 'gas'

przepisać do niego wartość z całki i wtedy używać go jako bazę do dalszych czynności.

I wtedy utworzyć Utility

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

Teraz można dodać do energy.
Mam taki problem, że zupełnie nie rozumiem tych bzdurnych obostrzeń i wymogów wprowadzonych w HA i dlatego obliczenia i automatyzacje robię gdzie indziej, a w panelu przedstawiam tylko wynik końcowy w postaci jednej encji.
W sumie nie potrafię już niż więcej dodać i musisz czekać na pomoc od kogoś bardziej biegłego w składni HA.

Moją poradę traktuj bardziej jako matematyczny opis procesu niż instrukcję “krok po kroku”

Dzięki za wszelkie wskazówki utworze nowe sensory od początku zgodnie z tym co napisałeś wyżej. okaże się jak to liczy. Na dane trochę trzeba będzie poczekać.

No to podprowadzę, że one wynikają z koncepcji, w której prawidłowo napisana integracja generuje swoje encje z właściwymi klasami urządzeń, dzięki czemu reszta dzieje się w pełni automatycznie i bez udziału użytkownika - jest to ułatwienie dla kogoś nietechnicznego, niestety to utrudnia życie, gdy się chce coś samodzielnie wydłubać…

1 polubienie

Wydłubałem nowy główny sensor bez żadnej jednostki i wykonałem następne kroki , na końcu mam utility jako m³, niech sobie trochę pochodzi i się okaże co z tego wyjdzie.

@RobinI30 zastanawiam się tylko czy metoda całkowania trapezowa to dobry wybór.

Dziękuje za wskazówki i życzę miłego weekendu.

Michał

Wybór zależy od charakteru zmian sygnału wejściowego, teoretycznie najlepiej go odwzorowuje.
I tak będziesz musiał to kalibrować, więc wybór jak każdy inny.

No cos nie tak jest z tym utility meter , nie liczył tak wcześniej.

kod sensorów:

 {
        "entry_id": "b16616fbf0545cd2a48b584511235dbc",
        "version": 1,
        "minor_version": 1,
        "domain": "template",
        "title": "Gaz_moment_measurement",
        "data": {},
        "options": {
          "template_type": "sensor",
          "name": "Gaz_moment_measurement",
          "state": "{{ ((( states('sensor.status_flames') | float(0) | round(0)  * ( ( 0.26 + ((states('sensor.boiler_modulation') | float(0) ) / 100 ) * ( 2 - 0.26 ))) ))  | round(3) )}}",
          "state_class": "measurement"
        },
        "pref_disable_new_entities": false,
        "pref_disable_polling": false,
        "source": "user",
        "unique_id": null,
        "disabled_by": null
      },
      {
        "entry_id": "16cfc5ef267853763b46f0d50fae07bc",
        "version": 1,
        "minor_version": 1,
        "domain": "integration",
        "title": "Gaz_moment_Riemann_sum",
        "data": {},
        "options": {
          "name": "Gaz_moment_Riemann_sum",
          "source": "sensor.gaz_moment_measurement",
          "method": "trapezoidal",
          "round": 3.0,
          "unit_time": "h"
        },
        "pref_disable_new_entities": false,
        "pref_disable_polling": false,
        "source": "user",
        "unique_id": null,
        "disabled_by": null
      },
      {
        "entry_id": "e7c0585cd3578011f2e2bd596808d547",
        "version": 1,
        "minor_version": 1,
        "domain": "template",
        "title": "Gaz",
        "data": {},
        "options": {
          "template_type": "sensor",
          "name": "Gaz",
          "state": "{{ ( states('sensor.gaz_moment_riemann_sum') | float(0) | round(3) )}}",
          "unit_of_measurement": "m³",
          "device_class": "gas",
          "state_class": "total_increasing"
        },
        "pref_disable_new_entities": false,
        "pref_disable_polling": false,
        "source": "user",
        "unique_id": null,
        "disabled_by": null
      },
      {
        "entry_id": "7a09ec5cce09d6e3c912b1622898c40f",
        "version": 2,
        "minor_version": 1,
        "domain": "utility_meter",
        "title": "Gaz_from_new_gaz_template_sensor_total_increasing",
        "data": {},
        "options": {
          "name": "Gaz_from_new_gaz_template_sensor_total_increasing",
          "source": "sensor.gaz",
          "cycle": "hourly",
          "offset": 0.0,
          "tariffs": [],
          "net_consumption": false,
          "delta_values": true,
          "periodically_resetting": true
        },
        "pref_disable_new_entities": false,
        "pref_disable_polling": false,
        "source": "user",
        "unique_id": null,
        "disabled_by": null
      }
    ]
  }

O ile do momentu wyliczenia Gaz wygląda poprawnie bo w ciągu godziny pobrano ok 0.5 m3.

To przeliczenie statystyk godzinowych jest x100 zupełnie nie rozumiem skąd :exploding_head:
Może dlatego, że nie rozumiem co to jest ten fragment

 {
        "entry_id": "7a09ec5cce09d6e3c912b1622898c40f",
        "version": 2,
        "minor_version": 1,
        "domain": "utility_meter",
        "title": "Gaz_from_new_gaz_template_sensor_total_increasing",
        "data": {},
        "options": {
          "name": "Gaz_from_new_gaz_template_sensor_total_increasing",
          "source": "sensor.gaz",
          "cycle": "hourly",
          "offset": 0.0,
          "tariffs": [],
          "net_consumption": false,
          "delta_values": true,
          "periodically_resetting": true
        },
        "pref_disable_new_entities": false,
        "pref_disable_polling": false,
        "source": "user",
        "unique_id": null,
        "disabled_by": null
      }



Jest to zupełnie coś innego co znam

utility_meter:
    gas_hourly:
        name: Gaz Godz
        source: sensor.Gaz
        cycle: hourly

Te sensory utility tworzone manualnie nie za pomocą helper wyglądają na razie OK, ale działają ok 30min

Witam ponownie, po zebraniu danych są nadal pewne problemy, mam wrażenie ze całkowanie zawyża wynik gdy kocioł jest wyłączony. Tak można wywnioskować z wykresu gdzie rano kocioł się włączył, potem dane są dość poprawne.
W energy jest dodany sensor GAZ.


cod sensora GAZ;

{
        "entry_id": "e7c0585cd3578011f2e2bd596808d547",
        "version": 1,
        "minor_version": 1,
        "domain": "template",
        "title": "Gaz",
        "data": {},
        "options": {
          "template_type": "sensor",
          "name": "Gaz",
          "state": "{{ ( states('sensor.gaz_moment_riemann_sum') | float(0) | round(3) )}}",
          "unit_of_measurement": "m³",
          "device_class": "gas",
          "state_class": "total_increasing"
        },

cod sensora całkującego główny sensor obliczeniowy chwilowego zużycia;

{
        "entry_id": "16cfc5ef267853763b46f0d50fae07bc",
        "version": 1,
        "minor_version": 1,
        "domain": "integration",
        "title": "Gaz_moment_Riemann_sum",
        "data": {},
        "options": {
          "name": "Gaz_moment_Riemann_sum",
          "source": "sensor.gaz_moment_measurement",
          "method": "trapezoidal",
          "round": 3.0,
          "unit_time": "h"
        },
  1. utility meter nadal mnoży wartość źródłowa o 1000

Tak wyglądają wykresy:

Statystyki za pomocą utility met,e które zaproponował kolega @RobinI30 tez liczą za wysoko i to znacznie a źródłem jest dla godzinowych sensor.GAZ a dla reszty Gaz_total

{
        "entry_id": "f94e4c6826594acb896e781cb2fe3e7b",
        "version": 1,
        "minor_version": 1,
        "domain": "template",
        "title": "Gaz_total",
        "data": {},
        "options": {
          "template_type": "sensor",
          "name": "Gaz_total",
          "state": "{{ ((( states('sensor.status_flames') | float(0) | round(0)  * ( ( 0.26 + ((states('sensor.boiler_modulation') | float(0) ) / 100 ) * ( 2 - 0.26 ))) ))  | round(6) )}}",
          "state_class": "total",
          "unit_of_measurement": "m³",
          "device_class": "gas"
        },

Tu wykres wyliczeń sensorów utility i ich źródeł danych.

Wiem tylko jedno ze poprawnie liczy tylko główny sensor reszta ma jakieś problemy z obliczeniami. Główne sensory tworzone są za pomocą helper może to jest jakiś błąd chociaż nie widzę aby to miało mieć jakaś różnicę.

problem 1 / czyli wartości utility meter nie dają się ogarnąć a wiem ze kilka dni temu działało to porwanie nie było rakach przekłamań.
Zastanawiam się czy aby nie jest problemem to ze zmieniłem dokładność 3 miejsc i meter trajluje to jako 1000, hmmm to było by dziwne ale to zrobiłem kilka dni temu.
Zmiennie ponownie na 2 , ciekawe co się zmieni.

Ten cod co widzisz to tworzy się z automatu poprzez helper tworząc sensor utility meter.

:wink: Zmyłkę wprowadza sam wykres, bo jest przedstawiony w sposób ciągły a rzeczywiste pomiary to tylko punkty.
Pierwszy poranny odczyt dolicza pole żółtego trójkąta. Zmień na lewe lub prawe (nie wiem które powinno być).


Co do dziwnych przeliczeń skali to nie mam pojęcia i jest to o czym pisałem wcześnie - pozorna idiotoodporność :slight_smile:

Też tak sądzę że tak to liczy bo to było widać na poprzednich wykresach, zastanawiam się jak wymusić aby mimo ze nie było zmiany wartości na sensorze aby zapisał punk pomiaru bo to by może rozwiązało problem.

Utworzyłem dzisiaj sensor całkujący te same źródło danych, ale to się okaże jutro, ale sądzę że jak nie będzie punku pomiaru to to nic nie da, zmiana na lewy oznacza tylko że będzie brał wartość pierwszą z okresu trapez chyba uśrednia lewy i prawy, wiec to nie będzie miało znaczenia.

Będzie…

Ponieważ pomiędzy ostatni zerem a pierwszym odczytem będzie liczone dla zera.
Być może pojawić się problem dla ostatnich odczytów ?

Wygląda że może być poprawia, się okaże :

The HA integration Riemann Sum provides three methods of calculating the areas, and the default method is ‘trapezoidal’. The other methods build a rectangle, the height of which is either the start of the sample, or the end of the sample (left, right). In trapezoidal approach the area is not a rectangle but an area taken from the sample height at the start and end of the sample period.

For HA to do its work, the integration will only update when the source entity updates.
HA has no way of repeatedly sampling the power entity, it just waits for the power entity to change. For this reason, the accuracy of the integration approximation is much improved the faster the source entity updates.

No i się powoli rozjaśnia dlaczego, okaże się za chwile symuluje wyłączenie kotła na 10min

P. S.

Czy jest możliwość aby zmusić HA do zapisania wartości sensora co określony czas np. 5min może 1 min mimo że nie zmieniła się jego wartość?

Nie jestem na bieżąco, ale kiedyś komponent niestandardowy dla HA powercalc umożliwiał wymuszanie generowania danych co określony interwał, przeczytaj dokumentację, bo się znacznie bardziej rozrosła i nie mam motywacji.
https://homeassistant-powercalc.readthedocs.io/en/latest/

@szopen - dzięki za info, sprawdziłem i nawet zainstalowałem, ale ten sensor jest typowy do wyliczeń mocy W lub kW ewentualnie można skalować.
Ale faktycznie ma opcje wymuszenia zapisu mimo że nie ma zmiany stanu.

Brakuje takiej opcji dla sensora w HA.

W normalnym zastosowaniu tak, ale w issues na repozytorium widziałem już dziwne jego zastosowania, więc może i do gazu się nada (przeczytaj dokumentację, a nie tylko przejrzyj), może faktycznie obecnie nie ma takich opcji ręcznej konfiguracji, ale raczej możliwości tego komponentu rosną, a nie maleją), w dodatku autor jest otwarty na nowe pomysły, więc jeśli ładnie opiszesz po angielsku swoje potrzeby, może będzie w stanie uwzględnić je w przyszłych wydaniach. ALE najpierw sprawdź czy aktualna wersja w ogóle jest w stanie nadal generować wymuszone raportowanie stanu (możliwe że zmiany w HA to usunęły, ze względu na optymalizację - oszczędność miejsca w bazie danych).