Licznik kontrakton ESP-01S

Słuchaj. Wrzuciłem na próbę coś takiego:

sensor:
  - platform: pulse_counter
    pin: GPIO0
    name: "Water Usage"
    update_interval: 10s
    unit_of_measurement: 'gal'
    filters:
      # reports in pulses/min, so divide by 6 and by 64 pulses per gallon
      multiply: 0.0026041667

Sensor rejestrował przy otwartym obwodzie (zakładam przez pullup programowy), przy połączeniu do masy lub Vcc nie rejestrował. Więc cosik robi. Teraz muszę jeszcze coś pokombinować żeby działało odwrotnie :sweat_smile:

Jutro będę się jeszcze bawił, coś takiego znalazłem:


sensor:

platform: pulse_counter
id: water_pulse
pin:
number: GPIO3
mode: INPUT
internal: true
name: “Pulse Counter”
update_interval: 1s
filters:

lambda: |-
static float total_pulses = 0.0;
total_pulses += x * 1 / 60.0;
id(lifetime_counter).publish_state(total_pulses / 17);
return x ;
platform: template
id: lifetime_counter
name: “Water Total”
unit_of_measurement: “L”

platform: template
name: “Water Flow Rate”
id: water_flow_rate
accuracy_decimals: 1
unit_of_measurement: “L/min”
icon: “mdi:water”
lambda: return (id(water_pulse).state /17);
update_interval: 3s

Myślę że powinno działać po podłączeniu kontraktonu do GPIO3 i VCC

Pewnie zadziała, ale wcięcia całkiem wywiało z tego YAMLa, więc będziesz miał nieco rzeźby by go poprawić.

Po pełnej dokumentacji nie chciało mi się rzeźbić, ale masz to
https://tttapa.github.io/ESP8266/Chap04%20-%20Microcontroller.html
więc jednak można włączyć wewnętrzny pullup, a zatem prościej będzie wpiąć kontaktron między GPIO a masę.
PS sugeruję wpiąć rezystor 330R (lub nieco więcej) szeregowo z kontaktronem (tzn. musu nie ma, ale ja bym tak zrobił by mieć święty spokój i się nie zastanawiać czy w stanach nieustalonych się coś spieprzy, czy nie i to bez kopania po tej dokumentacji producenta, do której chyba nikt nie zagląda).

I wyjaśnienie czemu akurat taka wartość - obciążalność wyjścia (tak - rozpatruję to GPIO jako wyjście, mimo, że użytkowo będzie wejściem) to 12mA, mamy 3,3V, więc by nie popłynął prąd większy od 12mA wystarczyłoby 275omów, a 330omów to najbliższa wyższa od obliczonej wartość w szeregu E12 (można by jeszcze zrobić jakąś prostą symulację “worst case”, ale nie przesadzajmy, przy 3,6V też tyle wystarczy)

To nie problem… Jutro się pobawię dam znać:

działa :slight_smile: ale teraz walczę z sensorem i czegoś mi brakuje

pomożesz jakoś ta składnie ogarnąć? . mój wodomierz to Bmeters GSD8 T50

1 puls/1 litr

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO3
      inverted: true
      mode:
        input: true
        pullup: true
    name: pulse_meter
    id: pulse_meter
  
sensor:
  - platform: template
    name: "pulse_sensor"
    id: "pulse_sensor"
    accuracy_decimals: 0
    lambda: |-
          if (id(pulse_meter).state == true) {
            return 1 ; 
          } else {
            return 0;
          }
    update_interval: 50ms
  - platform: template
    name: "Zużucie wody"
    id: "zuzycie_wody"
    state_class: "total_increasing"
    accuracy_decimals: 0
    icon: "mdi:water"
    unit_of_measurement: "L"
    lambda: |-
          if (id(pulse_sensor).state == 1) {
            return {id(zuzycie_wody).state ++} ; 
          } else {
            return {};
          }
          
    update_interval: 1s

Wrzuć kompletny kod (nawet jeśli się teraz nie kompiluje), to może linter podpowie coś w sprawie błędów (tak te podpowiedzi niekoniecznie wskazują faktyczne błędy, ale zawsze jednak trochę coś tam podpowiedzą), a takie wrzucanie kodu (czy jak wolisz skecza, bo to w sumie konfig, a nie realny kod) po kawałku to trochę takie rzucanie ewentualnemu próbującemu pomóc kłód pod nogi…
Zanim się zabrałem za

to zawartość posta się zmieniła, a ciekaw byłem jaka jest kwestia z tymi wartościami, bo pożydziłeś informacji - była za dużo za mało, jakaś reguła, czy może całkiem od czapy, kiedyś (nie wiem czy nie przez chwilę) w tym wątku był kod do licznika w wersji amerykańskiej - liczącego w galonach

Ogarnięcie składni polega na… skorzystaniu z dokumentacji.

Nie nie. Wszystkie sensory typu pulsem counter
liczą imp/min. A mnie chodzi bo sumę impulsów, bo 1 imp 1 litr. Nie potrzebuję niczego więcej. Bo w Home Asistant sobie w utility meter zobie.

Ten kod co jest zwraca mi tylko 0 lub 1 ale nie potrafię zliczyć impulsów, chodzi mi o sume, wiex generalnie tylko coś muszę grzejnąć w ostatniej części

Guzik prawda… nie definiujesz update_interval więc defaultowo wynosi 60s więc tylko Ci sią wydaje.
jesli go zmienisz będziesz miał np 1imp/sek.
Używasz kontaktronu więc brakuje deboucing tzn … internal_filter na poziomie 100ms , defaultowe 13us to stanowczo za mało.

ale ja nie chce mieć 1 imp /sek, tylko sumę impulsów

już doszedłem i działa :slight_smile:

sensor:
  - platform: pulse_counter
    pin: 
      number: GPIO2
      inverted: false
      mode:
        input: true
        pullup: true
    state_class: "measurement"
    accuracy_decimals: 3
    unit_of_measurement: 'm³/h'
    icon: "mdi:water"
    name: 'Water Meter House'
    internal_filter: 100ms
    update_interval: 60s
    filters:
      - multiply: 0.006
    total:
      unit_of_measurement: 'm³'
      name: 'Total Water House'
      accuracy_decimals: 3
      filters:
      - multiply: 0.001
      

@szopen @RobinI30 dzięki za pomoc