Fizyczne klawisze do sterowania roletami (góra/dół)

Cześć,

w ESPHome mam skonfigurowane rolety (cover, time-based) wszystko działa z poziomu HA. Fizycznie rolety spięte są przez dwa przekaźniki (kierunek, zasilanie). Na ścianach mam przyciski klawiszowe (monostabilne), chciałby w ESPHome skonfigurować je następująco:

Przycisk Góra:

  • Naciskam raz roleta jedzie na maxa do góry
  • naciskam drugi raz to się zatrzymuje
  • naciskam i przytrzymuję to otwiera się do momentu puszczenia
    Przycisk dół: takie samo zachowanie z tym, że kierunek rolety jest w dół.

Jako, że raczkuję w temacie i nie znalazłem w sieci podobnej konfiguracji zwracam się do Was po wskazówki

Coś mi tu nie pasuje bo czy naciskam czy przytrzymuję dany przycisk efekt jest dokladnie ten sam - ruch rolety, nie widzę różnicy. Chyba, że masz na myśli dwie funkcjonalności do zrealizowania na przyciskach:

  • normalne opuszczanie i podnoszenie rolety
  • otwarcie lub zamknięcie rolety z dowolnego położenia rolety - klik i rolety jedzie do skrajnego położenia (góra lub dół).

Chodziło mi o to, że jak raz nacisnę to roleta opuszcza/podnosi się całkowicie z automatu
A przy tym jak trzymam to roleta wykonuje ruch i zatrzymuje się w momencie zwolnienia klawisza

W obu przypadkach położenie rolety nie ma znaczenia, bo nie mam w roletach czujników, a jedynie krańcówki mechaniczne

Czyli dwie różne funkcje w jednym klawiszu.

Spróbuj skorzystać z kombinacji akcji (automatyzacji) na binary_sensor w ESPHome - Binary Sensor Component — ESPHome. Przyciski dzwonkowe definiujesz jak GPIO Binary Sensor — ESPHome.

Już mam ogarnięte prawie tak jak bym chciał jeszcze to pewnie w przyszłości dopracuję. Korzystam z lambd i przy kompilacji mam ostrzeżenie, można coś z tym zrobić czy trzeba z tym żyć?
Treść ostrzeżenia i fragment kodu poniżej:

/config/esphome/io.yaml: In lambda function:
/config/esphome/io.yaml:352:37: warning: 'void esphome::cover::Cover::open()' is deprecated: open() is deprecated, use make_call().set_command_open() instead. [-Wdeprecated-declarations]
                  id(roleta_przedsionek).open();
                                     ^
In file included from src/esphome/core/application.h:37:0,
                 from src/esphome/components/api/api_connection.h:4,
                 from src/esphome.h:3,
                 from src/main.cpp:3:
src/esphome/components/cover/cover.h:134:8: note: declared here
   void open();
        ^
    on_press:
      then:
        # logic for cycling through movements: open->stop->close->stop->...
        - lambda: |
            if (id(roleta_przedsionek).current_operation == COVER_OPERATION_IDLE)  
              {
                 id(roleta_przedsionek).open();
              } 
            else 
              {
                 id(roleta_przedsionek).stop();   // Cover is opening/closing. Stop it
              }

Cześć,

A powiedz mi jak u ciebie wygląda zachowanie się sterownika do rolet po zaniku zasilania? U mnie wszystkie sterowniki po zaniku zasilania ustawiają się na 50% otwarcia niezależnie od tego w jakiej pozycji były przed zanikiem prądu. Czy jest możliwość zapamiętania pozycji w której były przez zanikiem prądu?

1 polubienie

@welpl
poprawiony kod:

    on_press:
      then:
        - lambda: |
            if (id(roleta_przedsionek).current_operation == COVER_OPERATION_IDLE) {
              id(roleta_przedsionek).make_call().set_command_open().perform();
            } else {
              id(roleta_przedsionek).make_call().set_command_stop().perform();    
            }    

Poniżej cały kod do płytki esp8266 nodemcu v3.
Zamiennie :wink: ESP32 na 8 rolet.
Przekaźniki w trybie interlock z opóźnieniem 200ms (zabezpiecza przed włączeniem jednocześnie góra - dół) - mogą być pomocne w razie popsucia się stanu otwarcia/zamknięcia rolety.
przekaz

Fiyzyczne i wirtualne przyciski działają za zasadzie góra/dół dowolny przycisk wyłącz.

substitutions:
  device_name_lower: "test"

esphome:
  name: ${device_name_lower}

esp8266:
  board: nodemcuv2

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: "afe78518ea3599494473a6xxxxxxxxxx"

wifi:
  ssid: moja_siec_wifi
  password: moje_haslo

# Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "${device_name_lower}_roleta"
    password: "moje_haslo_do_wifi_esp_roleta"

captive_portal:
    
web_server:
  port: 80
 
cover:
  - platform: time_based
    device_class: shutter
    name: "${device_name_lower}_roleta"
    id: my_cover
    
    open_action:
      - switch.turn_on: sw01
    open_duration: 65s

    close_action:
      - switch.turn_on: sw02
    close_duration: 60s

    stop_action:
      - switch.turn_off: sw01
      - switch.turn_off: sw02
      
# fizyczny przycisk D1 i D2
binary_sensor:

  - platform: gpio
    pin:
      number: D1
      inverted: true
      mode:
        input: true
        pullup: true
    name: "${device_name_lower}_przycisk_01"
    
    on_press:
      then:
        - lambda: |
            if (id(my_cover).current_operation == COVER_OPERATION_IDLE) {
              id(my_cover).make_call().set_command_open().perform();
            } else {
              id(my_cover).make_call().set_command_stop().perform();
            }   

  - platform: gpio
    pin:
      number: D2
      inverted: true
      mode:
        input: true
        pullup: true
    name: "${device_name_lower}_przycisk_02"

    on_press:
      then:
        - lambda: |
            if (id(my_cover).current_operation == COVER_OPERATION_IDLE) {
              id(my_cover).make_call().set_command_close().perform();
            } else {
              id(my_cover).make_call().set_command_stop().perform();
            }

# przekaznik D6 i D7
switch:

  - platform: gpio
    pin: D6
    name: "${device_name_lower}_przekaznik_01"
    id: sw01
    icon: "mdi:electric-switch"
    inverted: true
    interlock: [sw02]
    interlock_wait_time: 200ms

    
  - platform: gpio
    pin: D7
    name: "${device_name_lower}_przekaznik_02"
    id: sw02
    icon: "mdi:electric-switch"
    inverted: true
    interlock: [sw01]
    interlock_wait_time: 200ms

#wirtualny przycisk
button:

  - platform: template
    id: button_01
    name: "${device_name_lower}_przycisk_wirtual_01"
    icon: "mdi:gesture-tap-button"
    
    on_press:
      then:
        - lambda: |
            if (id(my_cover).current_operation == COVER_OPERATION_IDLE) {
              id(my_cover).make_call().set_command_open().perform();
            } else {
              id(my_cover).make_call().set_command_stop().perform();
            }    

  - platform: template
    id: button_02
    name: "${device_name_lower}_przycisk_wirtual_02"
    icon: "mdi:gesture-tap-button"
    
    on_press:
      then:
        - lambda: |
            if (id(my_cover).current_operation == COVER_OPERATION_IDLE) {
              id(my_cover).make_call().set_command_close().perform();
            } else {
              id(my_cover).make_call().set_command_stop().perform();
            }
            

roleta

Do sterowania wizualnego rolety z HACS (interfejs użytkownika) zainstalować Shutter Card.

type: custom:shutter-card
title: Roleta
entities:
  - entity: cover.test_roleta
    name: okno salon
    buttons_position: left
    title_position: bottom

shutter-card

1 polubienie

Hej odgrzebie trochę temat, bo też walczę z roletami, ale na przełączniku Sonoff Dual R3 i… działa w sumie. Natomiast zrobiłem tak dla fizycznych przecisków:

  - platform: gpio
    pin:
      number: GPIO32
      mode: INPUT_PULLUP
      inverted: True
    name: "${entity_name} - Open"
    on_press:
      - logger.log: "${entity_name} - Open"
      - cover.open: my_cover

Powiedzcie proszę jaka jest przewaga podanej wyzej w przykładzie lambdy:

    on_press:
      then:
        - lambda: |
            if (id(my_cover).current_operation == COVER_OPERATION_IDLE) {
              id(my_cover).make_call().set_command_open().perform();
            } else {
              id(my_cover).make_call().set_command_stop().perform();
            } 

nad zwykłym:

    on_press:
      - logger.log: "${entity_name} - Open"
      - cover.open: my_cover

Sprawdza czy roleta jest idle, i gdyby jechała wyzwolona gdzie indziej to ją zatrzyma zamiast otworzyć?

Przewaga jest taka ze mozesz zatrzymac rolete w dowolnej pozycji w trakcje opuszcznia lub podnoszenia.