Pompa IBO AMG PWM

Witam

Ostatnio kupiłem pompę obiegową IBO AMG 25/60/180 PWM.
image

Jak już sama nazwa tej pompy wskazuje można nią sterować poprzez sygnał PWM.
Pompa służy mi w filtracji akwarium, gdzie wykorzystałem w pełni jej możliwości.

Pompę obsługuję poprzez esphome w HA. Publikuje swoje wypociny może komuś się przyda.
Do sterowania użyłem ESP32 oraz konwertera stanów logicznych ponieważ wg instrukcji potrzebny jest sygnał PWM o amplitudzie 4,0 - 5,5 V. Pompa posiada też wyjście PWM gdzie możemy odczytać pewne informacje o pracy w tym pobieraną energię.
W moim przypadku przewód sterujący ma 3 żyły czerwona, czarna, żółta.
Czerwona to wejście PWM (sterujemy pompą), czarna masa, żółta wyjście PWM (odczytujemy dane),
schemat wygląda następująco
image
Pompa sterowanie ma odseparowane transoptorami tak więc w 100% bezpiecznie jak dla ESP i pompy.
Producent w instrukcji opisał następujące tryby pracy:
sygnał wejściowy PWM
image
sygnał wyjściowy PWM
image

Na podstawie instrukcji jak i badania miernikiem oraz działania w praktyce, napisałem yamla do esphome. sterownik_pomp.zip (1,4 KB) .
Skrypt obsługuje 2 takie pompy (2 pompy pracują w filtracji akwarium). Nie ma tutaj obsługi wyłączenia pompy przez switch (taką mam realizowaną przez inne esp32, będzie to skonsolidowane w poźniejszym czasie).
Uwagę należy zwrócić, żeby odczyt z pompy (żółty przewód) był podłączony do pinów typu INPUT dla esp32 są to od 34 do 39 (nie wiedzieć dlaczego odczyt był przekłamywany dla pinów typu INPUT/OUTPUT).
Dodatkowo napotkałem na problem z obsługą fan w esphome, brakowało mi tutaj ewidentnie template dla tego typu urządzenia, w związku z czym użyłem pośrednika template typu float.
Generalnie nie mi nic skomplikowanego, pompa jest w pełni sterowalna.

Z poziomu HA prezentuje się następująco
image
Na dzień publikacji brak jest pompy 1 lecz w niedługim czasie zostanie zakupiona.
Jak widać mamy bieżący pobór energii z pompy, status zgodnie z tabelką producenta (dodatkowo prezentuje czy pompa pracuje w trybie Auto (PWM), Ręczny czyli nastawy na pompie).
Górny przełącznik to jest włączenie/wyłączenie pompy (na przekaźniku przez inne esp32, będzie to skonsolidowane), następnie możemy ustawić konkretne obroty pompy oraz włączyć/ wyłączyć tryb PWM.

W razie pytań w miarę wolnego czasu postaram się odpowiedzieć na pytania.
Pozdrawiam

4 Likes

Witaj chciałem dopisać twoje sterowanie pompami, ale mam problem z uzyskaniem pełnej prędkości i po podpięciu wyjścia pompa zatrzymuje się, możesz przejrzeć wpisy yamal, konwerter stanów YF08E
sterownik_pomp 2.yaml (7,3 KB)

Witaj
po stronie esphome wszystko działa super ale nie mogę sobie poradzić z HA a dokładnie jak zrobić płynną regulację obrotów/mocy pompy w home assistant

gemus2 skąd wiesz że po stronie esphome działa super?
Kombinuje już tydzień z ta pompą IBO 25/80/180, maksymalną moc jaką osiąga po sterowaniu PWM to ~18W ręcznym 3 biegu 60W.
Używam nodemcu 8266
konwerter stanów logicznych 5v zabrałem z pina vcc, 3.3v, odczyt z pompy przez GPIO3, sterowanie przez GPIO1.

output:
  - platform: esp8266_pwm
    pin: GPIO1
    frequency: 2500Hz # wpisywałem 1000, 1500, 2000, 2500Hz
    id: ledc_pump1

Podpowie ktoś co zmienić?

Po stronie HA mam taki kafelek
image

type: entities
entities:
  - entity: sensor.pompa_1_status
  - type: custom:slider-entity-row
    entity: fan.pompa_1_pwm
    full_row: true
  - entity: select.pompa_1_pwm_tryb
    card_mod:
      style: |
        ha-select {
          width: 170px !important;
        }
state_color: true
title: Pompa 1

Tak wygląda to dla 2 pomp, łącznie z poborem energii
image
Jak widac pompa na maxa bierze 46W czyli odpowiada to 3 bieg.

Za płynną regulację odpowiada ta sekcja

  - type: custom:slider-entity-row
    entity: fan.pompa_1_pwm
    full_row: true

Dodatkowo mam pewne atrybuty do konfiguracji pompy (ustawienie w procentach dzień, noc)
image

Po stronie ESPHome wygląda to tak
Ustawienie parametrów podczas startu esphome

esphome:
  name: ${device_name_lower}
  comment: ${comment}
  platform: ESP32
  board: esp32dev
  on_boot:
    - priority: -10
      then:
        if:
          condition:
            lambda: 'return id(day_pump1_value).state > 0;'
          then:
            - fan.turn_on: 
                id: fan_pump1
                speed: !lambda |-
                    return id(day_pump1_value).state;
          else:
            - fan.turn_off: fan_pump1

Zmienna globalna status pompy

globals:
# Pompa 1
  - id: on_boot_pump1
    type: bool
    initial_value: "true"
  - id: fan_pump1_state
    type: bool

Zmienne ustawiane z poziomu HA dla dla trybow pompy (dzień, noc)
wyglad w HA
image
kod w esphome

number:
# Pompa 1 dzień
  - platform: template
    name: "Pompa 1 dzień"
    id: day_pump1_value
    icon: mdi:rotate-right
    unit_of_measurement: "%"
    mode: "box"
    optimistic: true
    min_value: 10
    max_value: 100
    step: 1
    restore_value: true
    initial_value: 40
# Pompa 1 noc
  - platform: template
    name: "Pompa 1 noc"
    id: night_pump1_value
    icon: mdi:rotate-right
    unit_of_measurement: "%"
    mode: "box"
    optimistic: true
    min_value: 10
    max_value: 100
    step: 1
    restore_value: true
    initial_value: 20

Select po stronie HA do ustawienia trybów pracy (dzień, noc, off)
wygląd w HA
image
kod w esphome

select:
# Pompa 1
  - platform: template
    name: "Pompa 1 PWM tryb"
    id: pump1_mode
    icon: mdi:rotate-right
    optimistic: true
    options:
      - "Dzień"
      - "Noc"
      - "Off"    
    initial_option: "Dzień"
    restore_value: true
    on_value:
      then:
        - if:
            condition:
              lambda: 'return x == "Dzień";'
            then:
              - fan.turn_on: 
                  id: fan_pump1
                  speed: !lambda 'return id(day_pump1_value).state;'
        - if:
            condition:
              lambda: 'return x == "Noc";'
            then:
              - fan.turn_on: 
                  id: fan_pump1
                  speed: !lambda 'return id(night_pump1_value).state;'
        - if:
            condition:
              lambda: 'return x == "Off";'
            then:
              - fan.turn_off: fan_pump1
              - delay: 30min
              - select.set:
                  id: pump1_mode
                  option: "Dzień"

Uwaga: dla trybu off pompa działa przez 30 minut, następnie przechodzi w tryb dzień

Główna konfiguracja pompy

output:
# Ppompa 1
  - platform: ledc
    pin: 26
    frequency: 1000Hz
    id: ledc_pump1
  - platform: template
    id: custom_fan_pump1
    type: float
    write_action:
      - lambda: |-
          if (id(on_boot_pump1)) {
            id(on_boot_pump1) = false;
            return;
          }
          float in_min = 0.01;
          float in_max = 1.0;
          float out_min = 0.84;
          float out_max = 0.42;
          id(fan_pump1_state) = state > 0;
          float value = state == 0 ? 0 : (state - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
          id(ledc_pump1).set_level(value);
		  
fan:
# Ppompa 1
  - platform: speed
    id: fan_pump1
    output: custom_fan_pump1
    name: "Pompa 1 PWM"

Sensor zliczania impulsów (pobór energii) oraz ustawienie statusu

sensor:
# Ppompa 1
  - platform: duty_cycle
    pin:
      number: 33
      mode: INPUT_PULLUP
    id: pump1_power
    name: Pompa 1 pobór
    update_interval: 5s
    accuracy_decimals: 0
    device_class: "power"
    unit_of_measurement: 'W'
    filters:
      - lambda: |-
          return x == 100.0 ? 0.0 : x;
    on_value:
      - lambda: |-
          ESP_LOGD("pompa1", "state=%f", id(pump1_power).state);
          if (id(pump1_power).state == 0) {
            id(pump1_status).publish_state("Wyłączona");
          }
          else if (id(pump1_power).state > 74 && id(pump1_power).state < 76) {
            id(pump1_status).publish_state("Ostrzeżenie");
          }
          else if (id(pump1_power).state > 84 && id(pump1_power).state < 86) {
            id(pump1_status).publish_state("Zatrzymanie alarmowe, awaria elektryczna");
          }
          else if (id(pump1_power).state > 89 && id(pump1_power).state < 91) {
            id(pump1_status).publish_state("Zatrzymanie alarmowe, blokada");
          }
          else if (id(pump1_power).state > 94 && id(pump1_power).state < 96) {
            id(pump1_status).publish_state("Tryb gotowości przez sygnał PWM (STOP)");
          }
          else if (id(pump1_power).state >= 100) {
            id(pump1_status).publish_state("Wyłączona");
            id(pump1_power).publish_state(0);
          }
          else {
            if (id(fan_pump1_state)) { id(pump1_status).publish_state("PWM"); }
            else { id(pump1_status).publish_state("Ręczny"); }
          }

Sensor tekstowy do wyświetlenia stanu
wygląd w HA
image
kod w esphome (jest to ustawiane wyżej w zliczaniau impulsów)

text_sensor:
# Ppompa 1
  - platform: template
    id: pump1_status
    name: "Pompa 1 status"
    update_interval: 600s
    icon: mdi:thermostat

Oczywiście wszystko nie jest potrzebne, kiedyś tak sobie to wymyśliłem i tak już to u mnie funkcjonuje.

2 Likes

Mi też pompa nie osiągała pełnej mocy.
Zmieniłem w konfiguracji output na “float out_max = 0.29;”
i jest ok.

1 Like

W sumie to został mi jeden problem gdy pompa jest wyłączona to pokazuje moc 100W. jak pracuje to pokazuje ok lub przynajmniej tak mi się zdaje. Nie potrafię tego pokonać

Dokładnie u mnie to samo i mam na to radę. Wycinek kodu, zwróć uwagę na filters: dokładnie na return x== 100.0 ? 0.0 : x, czyli jeżeli wartość jest 100 zwróć 0 w przeciwnym przypadku x czyli wartość.
Nie pamiętam już, możliwe że głupoty pisze ale chyba właśnie ta pompa tak ma że jak 100 to jest wyłączona.

# Ppompa 1
  - platform: duty_cycle
    pin:
      number: 33
      mode: INPUT_PULLUP
    id: pump1_power
    name: Pompa 1 pobór
    update_interval: 5s
    accuracy_decimals: 0
    device_class: "power"
    unit_of_measurement: 'W'
    filters:
      - lambda: |-
          return x == 100.0 ? 0.0 : x;
    on_value:
      - lambda: |-
          ESP_LOGD("pompa1", "state=%f", id(pump1_power).state);
          if (id(pump1_power).state == 0) {
            id(pump1_status).publish_state("Wyłączona");
          }
          else if (id(pump1_power).state > 74 && id(pump1_power).state < 76) {
            id(pump1_status).publish_state("Ostrzeżenie");
          }
          else if (id(pump1_power).state > 84 && id(pump1_power).state < 86) {
            id(pump1_status).publish_state("Zatrzymanie alarmowe, awaria elektryczna");
          }
          else if (id(pump1_power).state > 89 && id(pump1_power).state < 91) {
            id(pump1_status).publish_state("Zatrzymanie alarmowe, blokada");
          }
          else if (id(pump1_power).state > 94 && id(pump1_power).state < 96) {
            id(pump1_status).publish_state("Tryb gotowości przez sygnał PWM (STOP)");
          }
          else if (id(pump1_power).state >= 100) {
            id(pump1_status).publish_state("Wyłączona");
            id(pump1_power).publish_state(0);
          }
          else {
            if (id(fan_pump1_state)) { id(pump1_status).publish_state("PWM"); }
            else { id(pump1_status).publish_state("Ręczny"); }
          }

Co do pokazywania zużycia, to pamiętam że mierzyłem pobór i generalnie zgadzał się.

1 Like

Dobra robota :ok_hand: :ok_hand: przyda się bo posiadam taka w Pompie ciepła i chce sterowac jej wydajnoscią

witam serdecznie

po dlugich walkach dziala sterowanie PWM ale niestety przy 100% PWM pompa dziala duzo wolniej niz na 3 biegu :frowning: zmienilem “float out_max = 0.29;” ale nie wnioslo to nic.
mozecie powiedziec jakie wartosci napiecia macie na przewodzie sterujacym przy pompie ?
ja przy 100% mam 1,35V przy 50% 2,60V a przy 0% 3,87V

Możesz zjechać do float out_max = 0.10;

A od czego to zalezy ??
A jakie wartosci V masz u siebie??

Zobacz zakres regulacji pompy w 1 poście - od 10% do 84 %. Stąd pełny zakres regulacji to:
float in_min = 0.0;
float in_max = 1.0;
float out_min = 0.84;
float out_max = 0.10;

To w jakim celu autor uzyl 0,42 a Ty 0,29 i obaj macie max predkosci?? :slight_smile:

To zależy od oporów pompy. Jak ustawię poniżej to już nie zwiększa prędkości (mocy pobieranej).

A widzisz i moze tu jest pies pogrzebany :slight_smile: bo ja testuje sobie na pompie na stole… nke jest wpieta w instalacje…

na sucho testujesz ???

Poprostu mam pompe w misce z woda :wink:

:rofl: Pompa ma silnik EC i sama ogranicza moc do nominalnej

A to nie wiedzialem :confused:
Wazne ze dziala regulacja jak je zamontuje to wtedy sobie ustawie ten parametr tak aby bylo dobrze:)
Chociaz mimo to na 3 biegu dziala szybciej niz 100% pwm

Podaj prosze jak z napieciami u Ciebie
Dziekuje