Witam.
Czy w ESPHOME istnieje "gotowiec" zwykłego licznika inkrementalnego? Szukałem na wszelkie mi znane sposoby, niestety nic nie znajduję. Niestety również pisanie wszelkich "dodatków" do czujników sprawia mi problemy - najzwyczajniej nie ogarniam tego. Uczę się ale mój poziom można określić jako zielony - może ciemno zielony 🙂 .
Popełniłem sobie czujnik na bazie komparatora z czujnikiem Halla (i to jako switch działa poprawnie), do tego obręcz z ośmioma magnesami. Zamontowane na wale który się obraca ok 1,1 obr/min. Chcę kontrolować ilość wykonanych obrotów w ciągu doby.
Czy mógłby mnie ktoś chociaż naprowadzić na poprawne rozwiązanie? (pulse counter - jak bym nie ustawił pokazuje wariactwa - chyba że na jego podstawie coś drążyć?)
Marcin.
Wrzuć kod jaki masz. Może coś nie tak z hardwarem jest, że wyniki głupieją.
Podpowiedź od Groka:
binary_sensor:
- platform: gpio
pin:
number: 4 # Pin GPIO dla sygnału z Halla
mode: INPUT_PULLUP # Wewnętrzny pull-up, by uniknąć szumów
inverted: true # Zależnie od czujnika – przetestuj, czy impulsy są na LOW czy HIGH
name: "Czujnik Halla"
on_press: # Opcjonalnie: loguj impulsy
then:
- logger.log: "Impuls wykryty!"
# Główny licznik impulsów
sensor:
- platform: pulse_counter
pin: 4 # Ten sam pin co wyżej
name: "Impulsy surowe"
unit_of_measurement: "impulsy"
accuracy_decimals: 0
filters:
- multiply: 60.0 / 8.0 # Przeliczenie: (imp/min) / magnesy * 60 = RPM
update_interval: 1s # Aktualizacja co 1 sekundę
internal_filter_mode: PASS
internal_filter: 200ms # Filtr na szumy (dostosuj, jeśli impulsy są krótkie)
Na chwilę obecną znalazłem w sieci kodzik który odnosi się do pomiaru wody z licznika wody na podstawie zwarć kontaktronu. Po drobnych modyfikacjach działa u mnie prawidłowo. Ale za nic nie pojmuję jak licznik impulsy/czas przekształcane są na inkrementację tych impulsów w zasadzie z pominięciem jednostki czasu.
A że platforma HA jest w wersji eksperymentalnej :). Dużo się tam zmienia i nie ma kluczowych zadań (głównie podgląd z dużej ilości czujników, a układów wykonawczych - kluczowych niewiele), no może poza sterowaniem bramą i oświetleniem zewnętrznym, to mogę i będę eksperymentował tylko nie wszystko rozumiem (czasem się podpieram metodą kopiuj/wklej).
Co chcę przez to powiedzieć, że pewnie niejednokrotnie wyląduję na forum z durnym pytaniem i proszę o cierpliwość.
I na pewno powyższy kod wykorzystam również, a przynajmniej będę próbował - w celach edukacyjnych.
sensor:
- platform: pulse_counter
pin: D7
name: "Masa"
update_interval : 60s
filters:
- lambda: |-
static float total_value = 0.0;
total_value += x * 0.023;
return total_value;
unit_of_measurement: "kg"
accuracy_decimals: 3
Na chwilę obecną znalazłem w sieci kodzik
Nie musisz szukać ... skoro używasz ESPHome to czytaj dokumentację.
https://esphome.io/components/sensor/pulse_counter/
https://esphome.io/components/
Czytam dokumentację, i nawet staram się to robić ze zrozumieniem. A ideę "pulse_counter" zrozumiałem jako licznik impulsów w czasie (jak sobie stworzyłem "platformę" testową to wyniki wskazywały że tak jest, chyba że się mylę to mnie popraw). Idealny jest do wskazywania np obrotów na minutę (często również wykorzystywany do zliczania kW-h). A mnie nie interesuje prędkość obrotowa (ją znam i na razie nigdzie nie wykorzystam), mnie interesuje ile obrotów wykonał mój "czujnik", i czy to będzie w minutę, godzinę czy tydzień nie ma znaczenia. Interesuje mnie prosty licznik kroków (czy incr, czy decr nie ma znaczenia, i w jakim czasie to osiągnął tez jest zbędną informacją), a takowego nie znalazłem w dokumentacji.
Co prawda na podstawie tego licznika wskazania jakie widzę są właściwe ale nie mogę sobie przekalkulować jak to jest ogarnięte...
Tak dla wyjaśnienia : przeliczam obroty na wagę w kotle na ekogroszek. Wiem że jeden obrót ślimaka to ok 0,181 kg wysuniętego opału. Sumuję całość i przeliczam dobowe, tygodniowe, miesięczne zużycie.
masz "total counter" do dyspozycji.
# licznik obrotów
sensor:
- platform: pulse_counter
pin: GPIO1
unit_of_measurement: 'kg'
name: 'waga ekogroszku'
filters:
- multiply: 60 # (obrotów na min.)
total:
unit_of_measurement: 'kg'
name: 'całkowita waga'
filters:
- multiply: 1
nie jestem pewien co do przelicznika, trzeba sprawdzić
Taki mam kod gazomierza:
api:
reboot_timeout: 60min
encryption:
key: "g/="
services:
- service: gazu_licznik
variables:
new_pulse_total: float
then:
- pulse_meter.set_total_pulses:
id: gas
value: !lambda 'return (new_pulse_total * 100);'
#web_server:
# port: 80
# version: 1
ota:
- platform: esphome
password: ""
wifi:
ssid: !secret ssid
password: !secret password
# Enable fallback hotspot (captive portal) in case wifi connection fails
reboot_timeout: 60min
ap:
ssid: "Gazomierz Fallback Hotspot"
password: ""
substitutions:
devicename: "gazomierz"
device_description: "Measure your natural gas consumption with the magnetic pulse of gas meter."
status_led: GPIO02
pulse_pin: GPIO12
pulse_rate: '100' # imp/m3
captive_portal:
light:
- platform: status_led
id: status
name: "State"
pin: ${status_led}
sensor:
- platform: homeassistant
id: wspolczynnik
name: "Współczynnik konwersji"
entity_id: input_number.gaz_kwh_wspolczynnik
internal: True
# Gas meter
- platform: pulse_meter
pin:
number: GPIO12
mode: INPUT_PULLUP
internal_filter: 500ms
internal_filter_mode: PULSE
timeout: 901s
name: "Gaz przepływ"
filters:
- multiply: 0.36
unit_of_measurement: "m³/h"
id: gas
accuracy_decimals: 5
on_value:
then:
- lambda:
id(kw_godzine).publish_state( x * id(wspolczynnik).state);
icon: 'mdi:fire'
total:
name: 'Gaz licznik'
state_class: total_increasing
device_class: gas
unit_of_measurement: "m³"
accuracy_decimals: 2
filters:
- lambda:
id(kwh_godzine).publish_state( x * id(wspolczynnik).state / ${pulse_rate});
return x * (1.0 / ${pulse_rate});
- platform: template
device_class: power
name: "Gaz przepływ kW"
id: kw_godzine
unit_of_measurement: "kW"
- platform: template
device_class: energy
name: "Gaz przepływ kWh"
id: kwh_godzine
unit_of_measurement: "kWh"
- platform: wifi_signal
name: "${devicename} - Wifi Signal"
update_interval: 120s
icon: mdi:wifi

