Oczyszczacz powietrza Webber ESPHome - prośba o pomoc

Cześć wam, mam oczyszczacz Webber AP8400 i chciałbym ( a raczej jestem w trakcie) go przerobić pod HA. Strona elektroniczna nie jest dla mnie problemem ale od strony programowania oj cieniutko cieniutko a żona zła. :face_holding_back_tears:
Dla osoby która się podejmie pomocy mam przygotowaną paczuszkę nowymi przydatnymi modułami,esp itp. :smiling_face_with_three_hearts:
Oryginalny kontroler poszedł się paść do skrzynki z komponentami elektronicznymi.
Została mi płytka z diodami i rezystorami, oryginalnie oczyszczacz obsługiwał sensory dotykowe pojemnościowe, dlatego zastosowałem 3x ttp223 (tryb chwilowy - stan wysoki). Jako kontroler - ESP WROOM 32.
Dotknięcie na panelu = chwilowy stan wysoki = stan wysoki/niski dla danych gpio
Potrzebuję taką samą funkcjonalność jak w oryginale.


8 x gpio dla kontrolek led
4 x gpio dla optoizolatorów
3x gpio dla ttp223

Logika sterowania jest w miarę prosta - każde naciśnięcie danego przycisku (on_press) powoduje wybranie kolejnego skryptu do wywołania.

1 polubienie

No właśnie skrypty…
Ja tego nie ogarniam :smiling_face_with_tear:
Na poziomie podstawowym coś pozmieniam, zlepię ale swojego niestety nic mi się nie udało pomimo wielu prób :sweat:

Czyli wszystko jest proste ale nikt się nie chce zaangażować w pomoc :sob:

Bo to nie jest proste.

Ha i to jeszcze mamy zapierdzielać szybko, bo się komuś pali, no sorry… (może nie trzeba było ruszać tej konstrukcji, wtedy działała i żona była raczej względnie zadowolona :upside_down_face:).

Jeśli rzucasz się na taki projekt DIY, to musisz z góry ocenić swoje możliwości czy dasz radę go ukończyć.

Nie jest nigdzie mile widziane robienie roboty cudzymi rękami i nie zmienia tego marchewka w postaci jakichś-tam płytek prototypowych, bo czas który ktokolwiek na to poświęci jest wart o wiele więcej niż sobie wyobrażasz (jeśli komuś sugeruję ogłoszenie typu [Zlecę] to sugeruję też od razu kwotę, tu by z pewnością przekroczyła wartość marcheweczki).

Więc zamiast się czepiać, że nie dajemy całej ręki, gdy prosiłeś o palec…
Pokaż co już masz, wrzuć schematy - mogą być rysowane odręcznie, byleby były czytelne itd.

To ma być w ESPHome? To dawaj YAMLa którego już zrobiłeś, nikt tu nie zrobi projektu w całości od zera.

Marcheweczki… Trzeba było zapytać co oferuję. Jak dla kogoś switche zigbee, czujniki, esp32 itp o łącznej wartości ok.350zł to marcheweczka to nic nie poradzę (płytki prototypowe dobry żart haha). Forum jest od pomocy, a nie od pyskówek. Jak ktoś wrzuci projekt gotowy to wszyscy jak hieny lecą na gotowe bo za darmo. Sam też korzystasz z darmowych rozwiązań nad którymi ktoś spędził wiele dni, tygodni i miesięcy, ale co tam hipokryzji tu oczywiście nie widzisz. Fajnie się z “darmowego” HA korzysta :sunglasses:. Po drugie to jest na forum a nie prywatnie więc każdy mógłby z tego korzystać “open source”. I jeszcze to JA oferuję coś w zamian dla kogoś aby również inni skorzystali jak ktoś tu trafi. Nikt tu nawet przykładem nie zarzucił lub linkiem. Zero pomocy tylko pretensje. Czy ja kazałem komuś i to szybko i już? Tylko poprosiłem o pomoc, której raczej tu nie uświadczę przy takiej mentalności.

Twój post ma wartość poniżej 0, więc uważam że był zbędny, a próba szczypania kogoś swoim wybujałym ego jako moderator pokazuje jak bardzo brakuje Ci empatii w stosunku do drugiego człowieka.

Uwierz, że nie brakuje empatii, a na realizację idei open-source oddałem ze swojego życia już tysiące godzin (jeśli nie dziesiątki tysięcy…).

Spójrz raczej w lustro, a może pokaż jakikolwiek dorobek w projektach z których korzystamy.

Jesteś gdzieś na tej liście?

bo ja tak… i na wielu innych też, bo wrzuciłem swoje cegiełki w postaci pracy nad wieloma projektami, korzystasz z nich za darmo.
To samo dotyczy wielu innych stałych bywalców tego forum.

Nie jestem z kategorii “dziadków z elektrody”, więc nie wyskoczę tu z pomysłami bana czy “odpoczynku od forum”, wróćmy więc do tematu - pokaż co już masz.

1 polubienie

Odczytałem to podobnie jak @szopen i pomyślałem nawet, że jeśli dla kogoś będzie to proste to sam fakt zrobienia tego za “paczuszkę” raczej zniechęca niż motywuje. Takie osoby należy zachęcić do tego aby poświęciły swój cenny czas prywatny, zapaliły się pomysłem. Na zabawki to one mają kasy pod dostatkiem.

Nawet jak byś to napisał od razu, to nie zamienia to mojego odczucia. Myślę, że gdybym był programistą, to może bym się nawet rozbawił taką zachętą. Może nie znasz stawek godzinowych ludzi z taką wiedzą i czym kierują się przy wyborze projektów. Moim zdaniem, cenniejsze byłoby zaoferowanie np. swojej pomocy przy przerabianiu, podobnego sprzętu, komuś kto nie jest mocny z elektroniki, skoro dla Ciebie to nie problem.
Na potwierdzenie tej tezy… pewnego czasu zespół AISpeaker na swoim forum ogłosił, że dołoży kasę do pomysłów zgłaszanych przez użytkowników, drugie tyle ile zadeklarują ludzie, aby wprowadzić daną integrację, funkcjonalność. Było to w październiku 2020r i ogłoszenie chyba nawet jest nadal aktualne. Od tego czasu powstało takich projektów równo 0 (słownie zero). To uświadomiło użytkownikom z jakimi oczekiwaniami wychodzą do twórców.

Mam wrażenie, że masz mylne wyobrażenie o tym co motywuje ludzi do tworzenia i dzielenia się swoją wiedzą. Open sorce rozumiesz jako coś darmowego, a to nie o to chodzi w tej idei. Open source, tłumaczy się lepiej na polski, jako wolne (wolnościowe) oprogramowanie. Masz do tej wiedzy dostęp i możesz dokładać swoje pomysły. Masz wiedzę z elektroniki, to pokaż co zrobiłeś, może ktoś jest programistą ale nie ogarnia elektroniki. Chciałby spróbować czegoś nowego na tym polu z podobnym sprzętem. Razem możecie się edukować, rozwinie się burza mózgów jak w niejednym temacie i pojawi się nie jedno a kilka rozwiązań.

@Szym_Avo pomagam na forum nie za “paczuszki”, pomagam bo w życiu osobistym też dużo dostaję pomocy, pomagam tyle ile mam czasu. Jak chcesz wiedzieć dlaczego nie pociagnąłem tematu dalej bo mnie po postu nie było - byłem w dłuższej delegacji, muszę pracować aby utrzymać rodzinę :slight_smile:.

1 polubienie

Bez licytacji. Ja nie napisałem że jakiś dorobek do HA jest moją zasługą. Bardzo się cieszę że masz takie osiągnięcia na swojej liście w tej dziedzinie.

Ja swój dorobek mam na forach elektronicznych, elektrycznych i audio oraz w kilku tłumaczeniach programów (gdzie robiłem to za free z czystej chęci pomocy i niejednokrotnie nie zostałem “wpisany”) oraz w międzyludzkiej pomocy prawie każdego dnia. Gdy ktoś za pomoc i wsparcie oczekuje wynagrodzenia w jakiejś formie to czy możemy to nazwać pomocą czy raczej usługą? Każdy pomaga tyle ile jest w stanie. Ja nic nie wymagam, rzadko proszę. Tylko w momencie gdy jestem pod ścianą i nie wiem w którym kierunku iść. Nie każdy zna się na wszystkim i nie każdy wszystko ogarnie.
Każda pomoc w formie linku, części kodu, podpowiedzi mile widziana.

Co mam?
Oczyszczacz w częściach.
A tak na poważnie.
Ma to być na ESPHome.
YAMLa nie mam nic a nic jeszcze.
Przeglądam różne fora, jak coś zlepię po godzinach nauki z YT to tu wrzucę i osoby chętne popatrzą i podpowiedzą co ok a co źle.
Od strony elektronicznej jest prawie wszystko gotowe.
3x TTP223
8x led (20mA każda + rezystory)
4x optoizolator (UV/Ion + 3 prędkości wentylatora, spokojnie datasheet ogarnięte nie trzeba konwertera można wysterować bezpośrednio z gpio esp32 - testowane).
Esp32 się nie upali (według różnych źródeł bezpieczny prąd dla gpio esp32 to 20mA, maksymalnie 40mA)
Będzie wykorzystane łącznie 15 pinów esp.

Dobrze szanujmy swój czas, pisanie kodu to moja największa bolączka, ale skoro porwałem się na HA, ESP-Home itp. to powinienem mieć jakąś wiedzę niż kopiuj wklej i rozumiem wasze poirytowanie.

Co do pomocy z mojej strony, z chęcią podzielę się moją wiedzą elektroniczną, pomocą przy projektowaniu pcb, projektami elektronicznymi które mogą być przydatne i są związane z tematyką forum, projektami do druku 3D ( a nawet wydrukuję jak ktoś będzie potrzebował) jak tylko przegrzebię się przez to forum. Sam osobiście jestem świeżo po przeprowadzce + praca na codzień + smart home który jest co tydzień “zapychany” nowym urządzeniem. Wymyśliłem sobie coś to teraz muszę pocierpieć :laughing:

2 polubienia

Fajnie szanuję, opierdziel na wstępie nie był dobrym startem, ale to co napisałeś zabrzmiało jak typowe roszczeniowe podejście najmłodszego pokolenia.

Do rzeczy
Jak ogarniasz prędkości wentylatora (silnik z odczepami czy jakaś elektronika)?

Czy przestudiowałeś dogłębnie datasheeta ESP32?
Trzeba rozsądnie zaplanować wykorzystanie GPIO

Będziesz to odpalał na bazie płytek prototypowych czy planujesz hardkorowo projektować PCB pod poszczególne komponenty?

Jeśli płytki prototypowe, to jakiś konkret, bo liczba GPIO może być i zwykle jest ograniczona.
Ważna jest też obciążalność regulatora LDO, jeśli chcesz to zasilać z gotowej płytki z MCU (najlepsze konstrukcje można obciążyć do około 0.6A z braku chłodzenia, najsłabsze nie uciągną peryferiów, które planujesz (20mA na kontrolkę LED to tak swoją drogą dość sporo), LED UVC/ION jest jednokolorowa?

Zdecydowałeś ostatecznie o modelu MCU?

Czy TTP223 będą potrzebne nie wiem - może da się wykorzystać wbudowane funkcje w MCU oraz fabryczne pady, które chyba pozostały - to wymaga eksperymentu (ESP32, ESP32-S2 i ESP32-S3 mają po kilka-kilkanaście GPIO zdatnych do pracy jako wejścia czujników dotykowych), wykorzystanie zewnętrznych przetworników pola dotykowego jest konieczne dla prostszych lub innych MCU (ESP8266, ESP32-C3 czy RPi Pico W) lub jeśli się nie uda uzyskać zadowalającego efektu na gołym MCU

LEDy to najmniejszy problem - wyjścia definiujesz jako otwarty dren i sterujesz je stanem niskim, to samo z transoptorami

Co do linków, to niestety dokumentacja ESPHome jest dość rekurencyjna i będzie tego sporo, ale zacznijmy od podstaw - czy już przygotowałeś choćby “puste” firmware?

W ogóle to czy już się bawiłeś w ESPHome jakkolwiek?

Obecnie WLED + sensor gestów na APDS9960.

Akurat przyciski dotykowe są pod 3mm panelem frontowym (oryginalnie sprężyna + metalizowany kapturek i tak już jest przygotowane) więc funkcja touch w esp32 może się okazać i raczej okaże fiaskiem.

Jeszcze jest rezystor więc spokojna głowa.

Nie i nie. TTP223 są na pcb dopasowane idealnie na “starym pcb”, 8 diód led wraz z rezystorami również jest na tym oryginalnym pcb, więc wszystko kabelkami prosto do do ESP32-Wroom (gotowa płytka), jedynie zostaje podciągnięcie złączem jst sterowania optoizolatorów do drugiego pcb.

Silnik z odczepami, 3 prędkości. optoizolator>triak.

:woozy_face:

Na spokojnie tak jak wyżej napisałem. Będę mieć coś zlepione, wypocone to wrzucę o wskażecie mi palcem drzwi najwyżej :sweat_smile:

Ale WLED to całkowicie inny projekt od ESPHome.

Oczywiście jeśli ogarniasz Arduino to jesteś mocno do przodu

Tak racja, mój błąd.
Kilka lat temu arduino to była zabawa, ciemną masą nie jestem ale no słabo.

Z pomocą przyszedł chatgpt jednak mam zdublowane wyjścia “output”


captive_portal:

esp32_touch:
  setup_mode: False

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO_NUM_4
      mode: INPUT_PULLUP
      inverted: True
    id: touch_button_1
    name: "Touch Button 1"
    on_press:
      then:
        - if:
            condition:
              switch.is_off: purifier_power
            then:
              - switch.turn_on: purifier_power
              - switch.turn_on: fan_mid
            else:
              - if:
                  switch.is_off: uv_lamp
                then:
                  - switch.turn_on: uv_lamp
                else:
                  - switch.turn_off: uv_lamp

  - platform: gpio
    pin:
      number: GPIO_NUM_5
      mode: INPUT_PULLUP
      inverted: True
    id: touch_button_2
    name: "Touch Button 2"
    on_press:
      then:
        - if:
            switch.is_off: purifier_power
            then:
              - switch.turn_on: purifier_power
            else:
              - switch.turn_off: purifier_power

output:
  - platform: gpio
    pin: GPIO_NUM_14
    id: fan_low
  - platform: gpio
    pin: GPIO_NUM_12
    id: fan_mid
  - platform: gpio
    pin: GPIO_NUM_13
    id: fan_high
  - platform: gpio
    pin: GPIO_NUM_15
    id: uv_lamp
  - platform: gpio
    pin: GPIO_NUM_16
    id: led_low
  - platform: gpio
    pin: GPIO_NUM_17
    id: led_mid
  - platform: gpio
    pin: GPIO_NUM_18
    id: led_high
  - platform: gpio
    pin: GPIO_NUM_19
    id: led_uv_c
  - platform: gpio
    pin: GPIO_NUM_20
    id: led_device

switch:
  - platform: template
    name: "Purifier Power"
    id: purifier_power
    turn_on_action:
      - output.turn_on: fan_mid
      - output.turn_on: led_device
    turn_off_action:
      - output.turn_off: fan_low
      - output.turn_off: fan_mid
      - output.turn_off: fan_high
      - output.turn_off: led_low
      - output.turn_off: led_mid
      - output.turn_off: led_high
      - output.turn_off: uv_lamp
      - output.turn_off: led_uv_c
      - output.turn_off: led_device

  - platform: template
    name: "Fan Speed Button"
    id: fan_speed_button
    turn_on_action:
      - switch.turn_off: fan_low
      - switch.toggle: fan_mid
    turn_off_action:
      - switch.turn_on: fan_low

fan:
  - platform: speed
    output: fan_speed
    name: "Purifier Fan Speed"
    speed_count: 4

output:
  - platform: template
    id: fan_speed
    type: float
    write_action:
      - if:
          condition:
            lambda: return ((state == 0));
          then:
            - switch.turn_off: fan_low
            - switch.turn_off: fan_mid
            - switch.turn_off: fan_high
            - switch.turn_off: led_low
            - switch.turn_off: led_mid
            - switch.turn_off: led_high
      - if:
          condition:
            lambda: return ((state == 0.25));
          then:
            - switch.turn_on: fan_low
            - switch.turn_off: fan_mid
            - switch.turn_off: fan_high
            - switch.turn_on: led_low
            - switch.turn_off: led_mid
            - switch.turn_off: led_high
      - if:
          condition:
            lambda: return ((state == 0.5));
          then:
            - switch.turn_off: fan_low
            - switch.turn_on: fan_mid
            - switch.turn_off: fan_high
            - switch.turn_off: led_low
            - switch.turn_on: led_mid
            - switch.turn_off: led_high
      - if:
          condition:
            lambda: return ((state == 0.75));
          then:
            - switch.turn_off: fan_low
            - switch.turn_off: fan_mid
            - switch.turn_on: fan_high
            - switch.turn_off: led_low
            - switch.turn_off: led_mid
            - switch.turn_on: led_high

Znalazłem coś takiego na githubie:


substitutions:
  # https://esphome.io/guides/configuration-types.html#substitutions
  device_name: hepa-filter # hostname & entity_id
  friendly_name: HEPA Filter # Displayed in HA frontend

esphome:
  name: ${device_name}
  on_boot:
  - light.turn_on:
      id: status_light
      transition_length: 0s
      red: 0
      green: .1
      blue: 0
      white: 0
  - light.addressable_set:
      id: status_light
      red: 0
      green: 0
      blue: 0

esp32:
  board: nodemcu-32s

logger:

# Enable Home Assistant API
api:
  encryption:
    key: !secret api_key
# enable ota updates
ota: {password: !secret api_password}

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

light:
  - platform: esp32_rmt_led_strip
    rgb_order: GRB
    pin: GPIO2
    num_leds: 10
    rmt_channel: 1
    chipset: SK6812
    is_rgbw: true
    id: status_light
    internal: true

esp32_touch:
  setup_mode: false
  voltage_attenuation: 1.5V
  iir_filter: 100ms

binary_sensor:
  - platform: esp32_touch
    threshold: 2050
    pin: GPIO12
    id: timer
  - platform: esp32_touch
    threshold: 2550
    pin: GPIO13
    id: dimmer
  - platform: esp32_touch
    threshold: 2480
    pin: GPIO14
    id: prefilter
  - platform: esp32_touch
    threshold: 2210
    pin: GPIO32
    id: filter
  - platform: esp32_touch
    threshold: 3117
    pin: GPIO33
    id: turbo
    on_press:
      then:
        - fan.turn_on:
            id: my_fan
            speed: 4
  - platform: esp32_touch
    threshold: 2207
    pin: GPIO27
    id: power
    on_press:
      then:
      - fan.cycle_speed:
          id: my_fan
          off_speed_cycle: true


switch:
  - platform: gpio
    pin: GPIO21
    id: fan_low
    interlock_wait_time: 250ms
    interlock: &interlock_group [fan_low, fan_mid, fan_high, fan_turbo]
  - platform: gpio
    pin: GPIO25
    id: fan_mid
    interlock_wait_time: 250ms
    interlock: *interlock_group
  - platform: gpio
    pin: GPIO22
    id: fan_high
    interlock_wait_time: 250ms
    interlock: *interlock_group
  - platform: gpio
    pin: GPIO17
    id: fan_turbo
    interlock_wait_time: 250ms
    interlock: *interlock_group
output:
  - platform: template
    id: fan_speed_output
    type: float
    write_action:
      - lambda: |-
          id(fan_low).turn_off();
          id(fan_mid).turn_off();
          id(fan_high).turn_off();
          id(fan_turbo).turn_off();
          auto light = ((AddressableLight*)id(status_light).get_output());
          for (int i = 6; i <= 9; i++) {
            light->get(i).set(Color::BLACK);
          }

          if (state < 0.24) {
          } else if (state < 0.26) {
            id(fan_low).turn_on();
            light->get(6).set(Color(255,0,0,0));
          } else if (state < 0.51) {
            id(fan_mid).turn_on();
            light->get(7).set(Color(255,0,0,0));
          } else if (state < 0.76) {
            id(fan_high).turn_on();
            light->get(8).set(Color(255,0,0,0));
          } else {
            id(fan_turbo).turn_on();
            light->get(9).set(Color(255,0,0,0));
          }
          light->schedule_show();

fan:
  - platform: speed
    name: "Filter Speed"
    output: fan_speed_output
    speed_count: 4
    id: my_fan

oraz

  esp32_touch:
      setup_mode: False
    
    binary_sensor:
      - platform: esp32_touch
        name: "Fan Speed Button"
        id: fan_speed_button
        pin: GPIO32
        threshold: 870
        on_press:
          then:
            - fan.cycle_speed: purifier_fan_speed
    
    # LED config
    light:
      - platform: neopixelbus
        type: GRB
        variant: 800KBPS
        pin: GPIO23
        num_leds: 1
        name: "NeoPixel Light"

    # FAN SPEED OUTPUTS    
    switch:
      - platform: gpio
        pin: GPIO33
        name: "Fan TURBO"
        id: turbo_fan_speed
        interlock: [turbo_fan_speed, high_fan_speed, medium_fan_speed, low_fan_speed]
        interlock_wait_time: 250ms
        restore_mode: RESTORE_DEFAULT_OFF
    
      - platform: gpio
        pin: GPIO26
        name: "Fan High"
        id: high_fan_speed
        interlock: [turbo_fan_speed, high_fan_speed, medium_fan_speed, low_fan_speed]
        interlock_wait_time: 250ms
        restore_mode: RESTORE_DEFAULT_OFF
    
      - platform: gpio
        pin: GPIO27
        name: "Fan Medium"
        id: medium_fan_speed
        interlock: [turbo_fan_speed, high_fan_speed, medium_fan_speed, low_fan_speed]
        interlock_wait_time: 250ms
        restore_mode: RESTORE_DEFAULT_OFF
    
      - platform: gpio
        pin: GPIO25
        name: "Fan Low"
        id: low_fan_speed
        interlock: [turbo_fan_speed, high_fan_speed, medium_fan_speed, low_fan_speed]
        interlock_wait_time: 250ms
        restore_mode: RESTORE_DEFAULT_OFF

    #TEMPLATE FOR FAN ENTITY TO USE TO CONTROL SPEED
    output:
      - platform: template
        id: fan_speed
        type: float 
        write_action:
          - if:
              condition:
                lambda: return ((state == 0));
              then:
                # action for off
                - switch.turn_off: turbo_fan_speed
                - switch.turn_off: high_fan_speed
                - switch.turn_off: medium_fan_speed
                - switch.turn_off: low_fan_speed 
              
          - if:
              condition:
                lambda: return ((state == 0.25));
              then:
                - switch.turn_on: low_fan_speed
                
          - if:
              condition:
                lambda: return ((state == 0.50));
              then:
                - switch.turn_on: medium_fan_speed
                
          - if:
              condition:
                lambda: return ((state == 0.75));
              then:
                - switch.turn_on: high_fan_speed
    
          - if:
              condition:
                lambda: return ((state == 1));
              then:
                - switch.turn_on: turbo_fan_speed
    # FAN ENTITY
    # allows use of fan.cycle_speed on the button
    # presents a fan entity to home assistant    
    fan:
      - platform: speed
        id: purifier_fan_speed
        output: fan_speed
        name: "Purifier Fan Speed"
        speed_count: 4

Co sądzicie?
Na razie na funkci czasomierza mi nie zależy. Tylko podstawowe sterowanie.

Na pierwszy rzut oka wygląda dobrze, w kwestii silnika z odczepami miałem proponować interlock

ale konstrukcja z użyciem gotowca fan speed też wygląda nieźle

Co do wykorzystania wbudowanej obsługi dotyku to warto zajrzeć do dokumentacji,
bo skoro masz jakąś gotową konstrukcję, to najlepiej po prostu skalibrować te wejścia do warunków rzeczywistych

Poprosiłem o interlock chat GPT i dostałem, tylko nadal jest błąd przez zdublowane “output”

esphome:
  name: diningroom-air-purifier
  platform: ESP32
  board: esp32dev

wifi:
  ssid: "nazwa_twojej_sieci_wifi"
  password: "haslo_do_twojej_sieci_wifi"

# Enable Home Assistant API
api:
  password: "HASLO"

ota:
  password: "HASLO"

captive_portal:

esp32_touch:
  setup_mode: False

binary_sensor:
  - platform: gpio
    pin:
      number: GPIO_NUM_4
      mode: INPUT_PULLUP
      inverted: True
    id: touch_button_1
    name: "Touch Button 1"
    on_press:
      then:
        - if:
            condition:
              switch.is_off: purifier_power
            then:
              - switch.turn_on: purifier_power
              - switch.turn_on: fan_mid
            else:
              - if:
                  switch.is_off: uv_lamp
                then:
                  - switch.turn_on: uv_lamp
                else:
                  - switch.turn_off: uv_lamp

  - platform: gpio
    pin:
      number: GPIO_NUM_5
      mode: INPUT_PULLUP
      inverted: True
    id: touch_button_2
    name: "Touch Button 2"
    on_press:
      then:
        - if:
            switch.is_off: purifier_power
            then:
              - switch.turn_on: purifier_power
            else:
              - switch.turn_off: purifier_power

output:
  - platform: gpio
    pin: GPIO_NUM_14
    id: fan_low
    interlock: [fan_low, fan_mid, fan_high]
  - platform: gpio
    pin: GPIO_NUM_12
    id: fan_mid
    interlock: [fan_low, fan_mid, fan_high]
  - platform: gpio
    pin: GPIO_NUM_13
    id: fan_high
    interlock: [fan_low, fan_mid, fan_high]
  - platform: gpio
    pin: GPIO_NUM_15
    id: uv_lamp
  - platform: gpio
    pin: GPIO_NUM_16
    id: led_low
  - platform: gpio
    pin: GPIO_NUM_17
    id: led_mid
  - platform: gpio
    pin: GPIO_NUM_18
    id: led_high
  - platform: gpio
    pin: GPIO_NUM_19
    id: led_uv_c
  - platform: gpio
    pin: GPIO_NUM_20
    id: led_device

switch:
  - platform: template
    name: "Purifier Power"
    id: purifier_power
    turn_on_action:
      - output.turn_on: fan_mid
      - output.turn_on: led_device
    turn_off_action:
      - output.turn_off: fan_low
      - output.turn_off: fan_mid
      - output.turn_off: fan_high
      - output.turn_off: led_low
      - output.turn_off: led_mid
      - output.turn_off: led_high
      - output.turn_off: uv_lamp
      - output.turn_off: led_uv_c
      - output.turn_off: led_device

  - platform: template
    name: "Fan Speed Button"
    id: fan_speed_button
    turn_on_action:
      - switch.turn_off: fan_low
      - switch.toggle: fan_mid
    turn_off_action:
      - switch.turn_on: fan_low

fan:
  - platform: speed
    output: fan_speed
    name: "Purifier Fan Speed"
    speed_count: 4

output:
  - platform: template
    id: fan_speed
    type: float
    write_action:
      - if:
          condition:
            lambda: return ((state == 0));
          then:
            - switch.turn_off: fan_low
            - switch.turn_off: fan_mid
            - switch.turn_off: fan_high
            - switch.turn_off: led_low
            - switch.turn_off: led_mid
            - switch.turn_off: led_high
      - if:
          condition:
            lambda: return ((state == 0.25));
          then:
            - switch.turn_on: fan_low
            - switch.turn_off: fan_mid
            - switch.turn_off: fan_high
            - switch.turn_on: led_low
            - switch.turn_off: led_mid
            - switch.turn_off: led_high
      - if:
          condition:
            lambda: return ((state == 0.5));
          then:
            - switch.turn_off: fan_low
            - switch.turn_on: fan_mid
            - switch.turn_off: fan_high
            - switch.turn_off: led_low
            - switch.turn_on: led_mid
            - switch.turn_off: led_high
      - if:
          condition:
            lambda: return ((state == 0.75));
          then:
            - switch.turn_off: fan_low
            - switch.turn_off: fan_mid
            - switch.turn_on: fan_high
            - switch.turn_off: led_low
            - switch.turn_off: led_mid
            - switch.turn_on: led_high

To przenieść wpisy z pierwszego output do tego na końcu, potem usuń linie z tym pierwszym output.

P.S. Wg mnie to nie działa tak jak opisałeś to w pierwszym poście ale oczywiście mogę się mylić.

1 polubienie

Jest to okrojona wersja z 1 postu.
Dzięki za pomoc.

Po zmaganiach z chatem GPT ( który generował więcej problemów i błędów w kodzie ) zrobiłem " własną lepiankę " z przykładów dostępnych w internecie.
Może komuś się przyda.
1 - Przycisk na ttp223 odpowiada za lampę uv ( i tu jeszcze nie jest ogarnięte włączanie się sygnalizacyjnej diody led podczas używania z poziomu HA ale z poziomu fizycznego przycisku dotykowego działa)
2- Przycisk na ttp223 odpowiada za włączenie, zmianę prędkości i wyłączenie. Zmiana trybu pracy jest zrealizowana przez multi_click. Dłuższe przytrzymanie pozwala wyłączyć urządzenie wraz z lampą uv.

Niestety fabryczne 5v zasilanie z oczyszczacza dla esp32 nie było wydajne i mogło być bardzo zaszumione ( nie podpinałem już oscyloskopu :woozy_face: ) dodałem osobny zasilacz który na szczęście ładnie i bezpiecznie się zmieścił w wolnej przestrzeni obudowy.

Zrzut ekranu 2024-03-28 133248

Może się komuś przyda więc wklejam kod.

substitutions:
  device_name: hepa-filter
  friendly_name: HEPA Filter

esp32:
  board: esp32dev
  framework:
    type: arduino

logger:

api:
  encryption:
    key: "secret"

ota:

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  ap:
    ssid: "secret"
    password: "secret"
esphome:
  name: ${device_name}

binary_sensor:
   
  - platform: gpio
    pin: 
      number: GPIO27
    name: "UV Button"
    id: uv_button
    on_click:
     then:
       - switch.toggle: uv_lamp
       - switch.toggle: leduv

  - platform: gpio # For push button onboard
    id: push_button
    pin:
      number: GPIO26
    
    on_multi_click:
      - timing:
        - ON for 1s to 3s
        - OFF for at least 0.2s
        then:
          - logger.log: "Long Press"
          - fan.turn_off:
              id: hepafilter

      - timing:
        - ON for at most 1s
        - OFF for at least 0.2s
        then:
          - logger.log: "Single Press"
          - fan.turn_on:
              id: hepafilter
              speed: 1

      - timing:
        - ON for at most 1s
        - OFF for at most 1s
        - ON for at most 1s
        - OFF for at least 0.2s
        then:
          - logger.log: "Double Press"
          - fan.turn_on:
              id: hepafilter
              speed: 2

      - timing:
        - ON for at most 1s
        - OFF for at most 1s
        - ON for at most 1s
        - OFF for at most 1s
        - ON for at most 1s
        - OFF for at least 0.2s
        then:
          - logger.log: "Triple Press"
          - fan.turn_on:
              id: hepafilter
              speed: 3

switch:
  
  - platform: gpio
    internal: true
    pin: 
      number: GPIO16
    inverted: false
    id: leduv
    
  - platform: gpio
    internal: false
    pin: 
      number: GPIO5
    inverted: false
    id: led3
    interlock: [led1, led2]
    interlock_wait_time: 300ms

  - platform: gpio
    internal: false
    pin: 
      number: GPIO18
    inverted: false
    id: led2
    interlock: [led1, led3]
    interlock_wait_time: 300ms
 
  - platform: gpio
    internal: false
    pin: 
      number: GPIO17
    inverted: false
    id: led1
    interlock: [led2, led3]
    interlock_wait_time: 300ms

  - platform: gpio
    internal: true
    name: "${name} High Relay"
    pin: 
      number: GPIO32
    inverted: false
    icon: mdi:fan-speed-3
    id: relay3
    interlock: [relay1, relay2]
    interlock_wait_time: 300ms

  - platform: gpio
    name: "${name} Medium Relay"
    internal: true
    pin: 
      number: GPIO33
    inverted: false
    icon: mdi:fan-speed-2
    id: relay2
    interlock: [relay1, relay3]
    interlock_wait_time: 300ms
            
  - platform: gpio
    name: "${name} Low Relay"
    internal: true
    pin: 
      number: GPIO25
    inverted: false
    icon: mdi:fan-speed-1
    id: relay1 
    interlock: [relay2, relay3]
    interlock_wait_time: 300ms
    
  - platform: restart
    name: "$name Restart"

  - platform: gpio
    internal: false
    name: "UV Lamp"
    pin: 
      number: GPIO4
    inverted: false
    icon: mdi:bacteria
    id: uv_lamp


output:
  - platform: template
    id: fan_1
    type: float 
    write_action:
      - if:
          condition:
            lambda: return ((state == 0));
          then:
            # action for off
            - switch.turn_off: relay1
            - switch.turn_off: relay2
            - switch.turn_off: relay3
            - switch.turn_off: led1
            - switch.turn_off: led2
            - switch.turn_off: led3
            - switch.turn_off: leduv
            - switch.turn_off: uv_lamp
      - if:
          condition:
            lambda: return ((state > 0) && (state < 0.4));
          then:
            # action for speed 1
            - switch.turn_off: relay2
            - switch.turn_off: relay3
            - switch.turn_on: relay1
            - switch.turn_on: led1
      - if:
          condition:
            lambda: return ((state > 0.4) && (state < 0.7));
          then:
            # action for speed 2
            - switch.turn_off: relay1
            - switch.turn_off: relay3
            - switch.turn_on: relay2
            - switch.turn_on: led2
      - if:
          condition:
            lambda: return ((state > 0.7));
          then:
            # action for speed 3
            - switch.turn_off: relay1
            - switch.turn_off: relay2
            - switch.turn_on: relay3
            - switch.turn_on: led3


            
fan:
  - platform: speed
    id: hepafilter
    output: fan_1
    name: "Hepa Filter"
    speed_count: 3

text_sensor: #Human Readable Uptime
  - platform: template
    name: $name Uptime
    id: uptime_human
    icon: mdi:clock-start

sensor:
  - platform: wifi_signal
    name: "$name WiFi Signal"
    update_interval: 60s
    
  - platform: uptime #Uptime in Seconds
    name: Uptime Sensor
    id: uptime_sensor
    update_interval: 60s
    internal: True
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human
            state: !lambda |-
              int seconds = round(id(uptime_sensor).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? String(days) + "d " : "") +
                (hours ? String(hours) + "h " : "") +
                (minutes ? String(minutes) + "m " : "") +
                (String(seconds) + "s")
              ).c_str();

2 polubienia