Esphome oświetlenie czasowe (1 przycisk i jeden przekaźnik)

Cześć,
Może ktoś mógłby pomóc w rozwiązaniu następującego problemu. Mam włącznik, tylko wyjście GPIO z przekaźnikiem, sterowane czujnikiem binarnym (również GPIO z przyciskiem).
Chciałbym uzyskać następującą funkcjonalność w esphome:
Naciśnięcie włącza światło na jakiś określony czas np. 2 minuty, a po tym czasie wyłącza je.
Jeżeli w tym czasie ktoś naciśnie przycisk, czas wydłuża się o kolejne 2 minuty.
Moja obecna konfiguracja esp8266 niestety nie działa poprawnie, po naciśnięciu przycisku odlicza poprawnie 2 minuty i wyłączą światło, niestety wcześniejsze wciśnięcie przycisku w czasie do 2 minut wyłącza światło.
Całość chciałbym uruchomić tylko na esphome, bez dodatkowych scen w home assistant.
Moja konfiguracja:

switch:
  - platform: gpio
    pin: D7
    name: "test_przekaznik_1"
    id: sw01
    icon: "mdi:light-switch"
    inverted: true
	
binary_sensor:
  - platform: gpio
    pin:
      number: D1
      mode:
        input: true
        pullup: true
    name: "test_przycisk_1"
    on_press:
      then:
        - switch.toggle: sw01
        - delay: 120s
        - switch.toggle: sw01
    device_class: opening

W tym fragmencie

      then:
        - switch.toggle: sw01
        - delay: 120s
        - switch.toggle: sw01

na początek spróbowałbym najprościej (nie wiem czy to wystarczy, ale nie mam czasu na zabawę) czas się z pewnością nie wydłuży o 2 min. tylko co najwyżej do 2 min. (jeśli chcesz dodawać to trzeba wprowadzić jakąś zmienną)

      then:
        - switch.turn_on: sw01
        - delay: 120s
        - switch.turn_off: sw01
      then:
        - switch.turn_on: sw01
        - delay: 120s
        - switch.turn_off: sw0

@szopen
Dzięki, działa przez 5 minut, w tym czasie naciśnięcie przycisku nie zmienia stanu. Jest jakaś reguła by naciśnięcie przycisku w czasie tych 5 minut przedłużyło działanie tej funkcji o następne x minut?

Jeśli chcesz dodawać czas do zmiennej to musisz pokombinować mniej więcej tak:

PS 120s to moim zdaniem jakieś 2 minuty.

script:
  - id: hallway_light_script
    mode: restart     # Light will be kept on during 1 minute since
                      # the latest time the script is executed
    then:
      - light.turn_on: hallway_light
      - delay: 1 min
      - light.turn_off: hallway_light

...
  on_...:           # can be called from different wall switches
    - script.execute: hallway_light_script
script:
  id: my_timer
  then:
  - # on_start
  - delay: 30min  # timer length
  - # on_end

# start/reset timer
- script.stop: my_timer
- script.execute: my_timer

# stop timer
- script.stop: my_timer

W Tasmota prosta reguła:

podziękowania dla @szopen @angler - jesteście wielcy!

Użyłem NodeMCU v3 i przekaźnik z optoizolacją zasilany 5V.
Przekaźnik wejście IN1 podpięte pod ESP8266 PIN D7 (GPIO13)
Przycisk dzwonkowy podpiety pod ESP8266 PIN D1 (GPIO5).
Kod działa wyśmienicie, po zwarciu pinu D1 do masy włącza przekaźnik na 2 minuty.
Każde naciśnięcie przycisku D1 przedłuża do 2 minut działanie przekaźnika.

esphome:
  name: test

esp8266:
  board: nodemcuv2

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: "afe78518ea3599494473a627db474666"

wifi:
  ssid: moja_siec
  password: moje_haslo

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "wifi_plytki_test"
    password: "moje_haslo"

captive_portal:
    
web_server:
  port: 80
  
# przekaznik on_off pin D7
switch:
  - platform: gpio
    pin: D7
    name: "test_przekaznik_1"
    id: sw01
    icon: "mdi:light-switch"
    inverted: true
    
#skrypt czasowka przekaznik    
script:
  - id: przekaznik_script
    mode: restart     # Przekaznik bedzie wlaczony przez 2 minuty
                      # od ostatniego nacisniecia przycisku
    then:
      - switch.turn_on: sw01
      - delay: 2 min
      - switch.turn_off: sw01
    
# przycisk na pinie D1
binary_sensor:

  - platform: gpio
    pin:
      number: D1
      mode:
        input: true
        pullup: true
    name: "test_przycisk_1"

    on_press:
      then:
        - switch.turn_on: sw01
        - script.execute: przekaznik_script
        
    device_class: opening
1 polubienie

No raczej, skoro napisał go sam twórca ESPHome Otto Winter (ja tylko go znalazłem).

1 polubienie

Wg powyższego kody ESPHome tak to nie działa, naciśnięcie przycisku wydłuża jednorazowo (tylko raz) czas do 2 minut, jeżeli naciśniesz 4 razy pokolei, czas nie wydłuży się o kolejne 4x 2 minuty (w sumie 8 minut), tylko ustawi czas na 2 minuty.

1 polubienie

Cześć

Próbuję zrobić oświetlenie automatyczne jak w przykładzie wyżej, ale zamiast przekaźnika 0n/off chciałbym wykorzystać PWM i w momencie wykrycia ruchu Led miałby się rozjaśnić i po danym czasie bez ruchu ściemnić płynnie do zera.

Próbowałem przerobić kod pod ESP32 LEDC Output
Naruszenie wejścia uruchamia skrypt, ale nie wysterowuje output
Próbowałem na różne sposoby, możecie podpowiedzieć jak to zrobić?

# Example configuration entry
output:
  - platform: ledc
    pin: GPIO19
    id: gpio_19

# Example usage in a light
light:
  - platform: monochromatic
    output: gpio_19
    name: "Led kuchnia"

    
#skrypt czasowka przekaznik    
script:
  - id: timer_script
    mode: restart     # Przekaznik bedzie wlaczony przez 2 minuty
                      # od ostatniego nacisniecia przycisku
    then:
      - output.turn_on: gpio_19
      - delay: 1 min
      - output.turn_off: gpio_19
    
# przycisk na pinie D1
binary_sensor:

  - platform: gpio
    pin:
      number: 18
      mode:
        input: true
        pullup: true
    name: "Motion sensor"

    on_press:
      then:
        - output.turn_on: gpio_19
        - script.execute: timer_script
        
    device_class: opening

To z pewnością nie możesz “na bezczelnego” próbować wysterować pinów wyjściowych (no nie tak działa PWM i to w ogóle nie jest metoda na uruchomienie jakiegoś zaawansowanego trybu wyjścia).
Pobaw się definiując wyjście jako światło light - wtedy będziesz miał dostępne takie funkcje jak ściemnianie i czas przejścia tego światła (a nie steruj GPIO)