ESP32 i podwójne zliczanie impulsów

Początki są trudne. Postanowiłem podłączyć licznik SMD72Bi do homeassistanta. Licznik jest dwukierunkowy, ale zaznaczam na początku jest wykorzystywany jako podlicznik do PC i liczy tylko pobór. Ma wyjście impulsowe 1000im/kWh zamykające obwód w momencie mignięcia diody. Podłączyłem to wyjście bezpośrednio do GND i D4 (GPIO4) na płytce ESP32.
Kompletnie się na tym nie znam i działa na tym co znajdę w internecie część rozumiejąc, a część robiąc kopiuj/wklej. ESP32 jest już widoczne w homeassitant i z tym nie ma problemu, encje odczytuje itp.
Problem1.
Zliczam impulsy w ten sposób:

sensor:
  - platform: pulse_counter
    pin: GPIO4
    unit_of_measurement: "kWh"
    name: "Licznik energii"
    id: licznik_energii
    filters:
      - multiply: 0.001

i w logach urządzenia widzę to tak:

13:03:14	[D]	[pulse_counter:186]	
'Licznik energii': Retrieved counter: 88.00 pulses/min

Dokładnie 2 razy za dużo impulsów, przypuszczam że bezpośrednie podłączenie zlicza mi załączenie i wyłączenie impulsu, ale prawdziwym probleme (to chyba da się obejść zmieniając multiply na 0,0005) że w homeassistacie w ogóle pokazuje dziwne rzeczy:

Tak ze 100x mniej podliczył energii niż by wynikało ze zliczanych impulsów.

Problem 2.
Jak pobrać bieżącą moc z licznika. Wymyśliłem sobie żeby zliczyać czas pomiędzy impulsami (1Wh) i liczyć P=W/t, ale jak pobrać ten czas z ESP32, a może w ogóle nie tędy droga i trzeba to zrobić inaczej, choć taki sposób by mi pasował bo byłby najaktualniejszy - minimalny pobór na PC to 7W czyli ~500s pomiędzy impulsami, a maksymalny to może być około 4kW czyli ~0,9s.

Ile takie ESP32 zniesie wgrań konfiguracji?

Na początek naucz się jak zamieszczać kod na forum:

Z tego co można wyczytać w dokumentacji ESPHome, to lepiej jest użyć komponentu

Zamiast pulse_counter. Zobacz jaki mam kod dla zliczania impulsów na wodomierzu.

U mnie działa to dobrze z ustawieniami dla internal_filter: 100ms oraz opcjonalnym timeout: 1min (wskazówka wodomierza może zatrzymać się pod czujnikiem i impuls może trwać godzinami).

sensor:
  - platform: pulse_meter
    name: "Przepływ wody"
    pin:
      number: GPIO5
#      inverted: true 
      mode:
        input: true
        pullup: true
    internal_filter_mode: PULSE
    unit_of_measurement: "l/min."
    accuracy_decimals: 0
    icon: "mdi:gauge"
    internal_filter: 100ms
    timeout: 1min
    total:
      id: water_usage_total
      name: "Woda zużycie total"
      icon: "mdi:water"
      unit_of_measurement: "m³"
      accuracy_decimals: 3
      device_class: water
      state_class: total_increasing
      filters:
        - multiply: 0.001

Jeśli bezpośrednio, to musisz wiedzieć czy tak możesz. Na dodatek nie użyłeś dla GPIO wewnętrznego pullup: true i input: true.

A podstawa to ustalenie jak prawidłowo można się podłączyć pod te wyjście impulsowe tego licznika, co jest elementem wykonawczym na tym wyjściu.

Tym bardziej powinieneś korzystać z oficjalnej dokumentacji, a nie przypadkowych zlepkach informacji, z przypadkowych źródeł wklejając kod bez zrozumienia. Zamiast tracić bliżej nieokreślony czas na próby, mając nadzieję, że się uda, lepiej poświęcić go na zrozumienie jak to działa.

2 polubienia