Zasłony Zemismart ESPHome

Witam, mam zasłony sterowane wifi z Tuya, od jakiegoś czasu gubią sygnał wifi i non stop mi je rozłącza pomimo dobrego zasięgu. Można je podłączyć do zwykłego przełącznika i sterować open/stop/close, udało mi się znaleźć post w którym jeden użytkownik podpiął z wyjścia RJ45 karnisza sygnały do wemosa d1, zrobiłem tak samo i niestety u mnie nie działa tutaj link. Zwierając na krótko przewody odpowiadające OPEN/STOP/CLOSE do GND zasłona się steruje po podpięciu do wemosa nie działa tutaj kod:

cover:
  - platform: template
    name: "Curtains"
    id: curtains
    assumed_state: true
    open_action:
      - lambda: |-
          pinMode(14, OUTPUT);
          digitalWrite(14, LOW);
          delayMicroseconds(1000000);
          pinMode(14, INPUT);
    close_action:
      - lambda: |-
          pinMode(12, OUTPUT);
          digitalWrite(12, LOW);
          delayMicroseconds(1000000);
          pinMode(12, INPUT);
    stop_action:
      - lambda: |-
          pinMode(2, OUTPUT);
          digitalWrite(2, LOW);
          delayMicroseconds(1000000);
          pinMode(2, INPUT);

Czy mógłby ktoś rzucić okiem i podpowiedzieć jaki kod by tu najbardziej pasował? Poniżej schemat jak to u mnie wygląda:

Teoretycznie to powinno działać (rozwiązanie z przełączaniem trybu pracy GPIO bardzo sprytne).
Masz multimetr? Jeśli tak to sprawdź napięcia na wejściach sterujących (względem lokalnej masy) i czy spada ono na sekundę w okolice zera po wystawieniu niskiego sygnału z danego wyjścia ESP.

Tak mam, pomierzę i dam znać

Na tym schemacie brakuje trzech rezystorów i tranzystorów NPN , manualne sterowanie wymaga czystego zwarcia do masy, a nie niskiego stanu na GPIO.
Podłącz bazy tranzystorów np BC 547 przez 10K do GPIO, Emitery do GND tego sterownika, a wyjscia Kolektor tranzystorów do zacisków Open/Close

2 polubienia

W takim wypadku trzeba też odwrócić logikę sterowania.


Mimo wszystko zakładam, że to “bezczelne” rozwiązanie (umożliwiające wymuszenie pracy GPIO symulujące wyjście trójstanowe) ma szansę działać (w oryginalnym wątku autor pomysłu twierdzi, że działa) - w końcu “po drugiej stronie” też mamy jakiś niskonapięciowy MCU sterujący logiką.

Nie znam ESPHome, ale jeśli tak wynika z kodu, to masz 100% racji.

To możliwe, ale czy warto się boksować? Skoro kolega @xjaniux twierdzi, że na krótko mu dziala, a przez GPIO już nie, to chyba nawet bezpieczniej odseparować dwa MCU od siebie tranzystorami

Warto by było znać w ogóle napięcie względem masy na tych pinach sterujących rolety (bo jeśli przekraczają 4V, to można założyć że ESP prędzej czy później spłonie).

W końcu chińska metoda oznaczania tak samo modeli sprzętu różniących się elektroniką jest standardem, a to rozwiązanie można w sumie traktować jedynie w kategorii hacka, by nie stosować dodatkowych elementów (jak najbardziej popieram - rozwiązanie z tranzystorami z pewnością jest lepsze, a w kazdym razie bezpieczniejsze).

PS A tak poza konkurencją na tranzystorze złączowym w stanie nasycenia miedzy kolektorem a emiterem i tak odkłada się napięcie 0,6V (lub nieco wyższe), więc to zwarcie jest raczej umowne (czy jestem w błędzie?).

Pomierzyłem, open i close względem masy wskazuje 0.5V po wystawieniu niskiego spada do 0 na sekundę, natomiast inaczej jest na pinie stop - tutaj wskazuje 3.3V względem masy w normalnym stanie po wystawieniu niskiego spada do 0 i jednocześnie zapala się na chwilę dioda na d1mini, na open/close tego nie ma.

No OK, a zmierzyłeś też bez podpiętego ESP?
Bo pozostaje pytanie czy to napięcie jest skutkiem upływu w ESP czy faktycznie takie jest.
Druga kwestia jest taka - na jaki czas trzeba wcisnąć przycisk aby była reakcja (może czas 1sek. nie jest dobrany poprawnie?).

W kwestii diody najlepiej posłużyć się schematem modułu (możliwe, że ten pin się nie nadaje ze względu na wewnętrzne połączenia z innymi elementami na PCB - właśnie z LED i rezystorem)

Generalnie biorąc się za grzebanie z danym modułem warto np. wydrukować sobie schemat elektryczny (jeśli jest dostępny) i mieć go stale na widoku, to nie ma potem niespodzianek

Więc zamiast D4=GPIO2 użyj jakiegoś innego “normalnego” dostępnego pinu, jakie są “normalne” i “nienormalne” sprawdzisz np. tam:

akurat jest info o LED i aliasach, ale nie jest to regułą pasującą bezwzględnie do każdego modelu płytki prototypowej… (są takie płytki na ESP8266, które mają aliasy niezgodne z D1 czy NodeMCU a LED mają podpięty do innego GPIO).

Mierzylem na esp nie podpiętym do silnika zasłony, zmierzylem również oddzielnie jakie są napięcia na wyjściach z gniazda rj45 silnika i pomiędzy pinami open/stop/close a gnd jest ok 6.5v trochu za dużo mi się wydaję jak dla esp…

Tak, zdecydowanie za dużo, opierając się na tym co podaje producent nie powinno się przekraczać 3,6V (doświadczalnie ustaliłem, że wytrzymują więcej, ale bez przesady - to może dramatycznie skrócić czas życia układu).
Więc tak jak wyżej - zmień nieco kod (nie będzie potrzeba kombinacji z ustawianiem trybu wejścia - potraktuj jako zwyczajne wyjścia, odwróć logikę i po postu 3 szt. tranzystorów npn + 3x rezystor - robisz wyjścia w układzie OC).

Doświadczalnie możesz użyć zwykłej krzemowej diody szeregowo z przyciskiem by zaemulować tranzystor w stanie nasycenia.

1 polubienie

Ok, chyba tak bedzie najbezpieczniej, pokombinuję i zdam relację, moze komuś się jeszcze przyda.

Edit:

Ok, udało mi się polutować płytkę wg wskazówek, mam tylko problem z kodem - nie jestem biegły w tej materii, nie udało mi się znaleźć prawidłowego kodu i nie bardzo wiem co pozmieniać w tym istniejącym, czy mógłbyś mi pomóc w tym i wrzucić poprawiony kod?

zamiast tego

cover:
  - platform: template
    name: "Curtains"
    id: curtains
    assumed_state: true
    open_action:
      - lambda: |-
          pinMode(14, OUTPUT);
          digitalWrite(14, LOW);
          delayMicroseconds(1000000);
          pinMode(14, INPUT);
    close_action:
      - lambda: |-
          pinMode(12, OUTPUT);
          digitalWrite(12, LOW);
          delayMicroseconds(1000000);
          pinMode(12, INPUT);
    stop_action:
      - lambda: |-
          pinMode(2, OUTPUT);
          digitalWrite(2, LOW);
          delayMicroseconds(1000000);
          pinMode(2, INPUT);

najzwyklejszy YAML

switch:
  - platform: gpio
    pin: GPIO14
    name: "Open Switch"
    id: open_switch
    internal: true
  - platform: gpio
    pin: GPIO12
    name: "Close Switch"
    id: close_switch
    internal: true
  - platform: gpio
    pin: GPIO2
    name: "Stop Switch"
    id: stop_switch
    internal: true
cover:
  - platform: template
    name: "Curtains"
    open_action:
      - switch.turn_on: open_switch
      - delay: 1s
      - switch.turn_off: open_switch
    close_action:
      - switch.turn_on: close_switch
      - delay: 1s
      - switch.turn_off: close_switch
    stop_action:
      - switch.turn_on: stop_switch
      - delay: 1s
      - switch.turn_off: stop_switch
    optimistic: true
    assumed_state: true

PS Nie sprawdzałem, czy wybrane w tym projekcie GPIO są właściwe, wziąłem te same, które miałeś poprzednio.