Przekaźnik bistabilny a'la F&F

Na początek, dzień dobry wszystkim.
Jako, że jestem na początku drogi z programowaniem automatyzacji w Node-RED z góry proszę o wyrozumiałość.

Sprawa wygląda następująco:

  1. Udało mi się skonfigurować w HA, oraz potrafię obsługiwać w (po MQTT lub nody z HA) moduł dwustanowych cyfrowych zintegrowany z wyjściami przekaźnikowymi (16in + 16out) (Diantian-tech.com z kraju ryżem płynącego). Potrafię wywołać poprzez fizyczny sygnał na wejściu, aby zadziałało fizyczne wyjście. Tak jak działa przekaźnik bistabliny (znalazłem i doinstalowałem node “Toggle”). I do tego momentu wszystko pięknie ładnie. :slight_smile:

  2. Ale zamarzyło mi się aby przy użyciu jednego input’u wysterować dwa lub więcej przekaźników (w oparciu ilość i czas impulsów ). I tu pojawiły się schody, gdyż albo zupełnie źle rozumuję jak działają nody, albo wyłazi moja zieloność w materii node-red. Chciałbym stworzyć wirtualnie przekaźnik marki F&F BIS-419.
    Działanie:
    krótkie impulsy na wejściu (poniżej 5 sec.)
    pierwszy impuls na wejście => włącza relay1
    drugi => włącza dodatkowo relay2
    trzeci => relay1 - OFF ale relay2 nadal ON
    czwarty => oba przekaźniki OFF.
    I tak dalej w pętli.
    długi impuls podczas pętli (> 5sec), niezależnie w którym z powyższych fragmentów pętli przerywa pętlę i oba przekaźniki do stanu OFF (.
    ponowny impuls (nawet krótki) przywróci stany przekaźników z przed długiego impulsu.

Wydaje mi się, że mając informacje:

  • msg.payload: (ON/OFF) z wejścia binarnego
  • msg.payload: (ON/OFF) z informacją o aktualnym stanie przekaźnika
    nie powinno być to trudne, ale ja poległem…

Czy znalazł by się dobry człowiek, który nakierowałby mnie w którym kierunku pójść? Jakich nodów użyć? Wolałbym nie używać nodów z HA tylko same MQTT, ale nie jest to jakiś wymóg.

W kierunku licznika modulo 3, na podstawie którego ustawiałbyś stan przekaźników.
Czy w ogóle programowałeś w jakimkolwiek języku, czy dopiero zaczynasz ?
Od tego zależy na jakim poziomie udzielać porad.

Nody są tylko narzędziem do realizacji jakieś metody, trudno więc nie znając algorytmu coś doradzić.
Gdybym to miał sobie napisać to do utworzenia logiki wystarczyłby funtion i mqtt_in mqtt_out.

… i nie jest, ale skoro poległeś to chyba potrzebujesz gotowca.

1 polubienie
  1. Poziom mojej wiedzy uznałbym za niski z aspiracjami :slight_smile: Takie programowanie dopiero zaczynam, może nie licząc php na potrzeby stron www.
  2. Też mi się wydaje, że funtion byłyby najlepsze (nawet coś próbowałem naskrobać w tym), ale za groma nie mogę pojąć jak zmusić to aby przyjmowało zmienne z dwóch różnych wejść.
  3. Co do gotowca, który w zasadzie byłby dla mnie wzorem to jak najbardziej. Jak widzę kod z którego coś wynika (składnia i sens) to o wiele szybciej jestem w stanie zagadnienie zrozumieć i przerabiać, Nawet jestem skłonny zapłacić za czyjś czas, jeśli oszczędzi mi to mój czas.

…mogę Ci zrobić prawie gotowy przykład ale w zamian wytłumaczysz jak on działa.
Idziesz na to ? :wink:

edit … na zachętę :slight_smile:

2 polubienia

:slight_smile: mogę spróbować wytłumaczyć, blokowo rozumiem… to się może udać,

Ok… trzymam za słowo :+1:
f&f.json (7,3 KB)

Niedokończony, bo tyle info podałeś. W “głowie” działa - dokończ :slight_smile:

1 polubienie

wieczorem spróbuję to wdrożyć i jak zadziała stworzę jakiś tego opis tutaj dla potomnych :slight_smile:

EDIT:
Słowo się rzekło :slight_smile:

dokończyłem, wstępnie działa :star_struck:

więc objaśniam na tyle ile rozumiem :wink:

Od lewej na flow:

  1. z nodu mqqt in nasłuchujemy na temacie o stanie wejścia binarnego. Gdy W idle ten temat publikuje co 30 sek. “OFF”. Wciśnięcie publikuje “ON”

  2. Dodałem node filter, aby wyeliminować te 30 sekundowe pingi, więc póki nie zmienimy stanu wiadomość nie popłynie dalej.

  3. Nodem Switch „rozbijamy” na dwa wyjścia, wiadomości o treści ON na wyjście 1, a OFF na wyjście 2.

  1. Wciskamy klawisz i wiadomość ON idzie na node Change, to wywołuje przypisanie dla zmiennej flow.pushT , aktualnej wartości timestamp , czyli dokładny czas push .

  2. Puszczamy klawisz i wiadomość OFF idzie na drugi node Change, to wywołuje przypisanie dla msg.payload, aktualnej wartości timestamp, czyli dokładny czas release.

  3. Node function oblicza różnicę czasu między wartościami timestamp push i release.

  4. Kolejny switch przesyła wiadomość na wyjście 1 jeśli czas był nie dłuższy niż 2000ms, a wszystko ponadto na wyjście 2.

8a) z wyjścia pierwszego, czyli krótkie impulsy idą na Node switch „modulo3+1” , za każdym ”impulsem” zwraca kolejno 4 stany: 1, 2, 3, 0

8b) z wyjścia pierwszego, długie impulsy idą na Node switch „modulo3-1” , za każdym ”impulsem” zwraca kolejno 4 stany: 3, 2, 1, 0

/// te modulo to muszę jeszcze bardziej zrozumieć jak są skonstruowane funkcje, ale to muszę javy trochę liznąć :slight_smile: ////

  1. z modulo 3+1 idziemy na switch, który w zależności od wiadomości wejścia przesyła wiadomość na odpowiednie z 4 wyjść

  2. po drodze jeszcze zmieniamy przesyłaną wartość liczbową na ON lub OFF, taki komunikat rozumie node mqtt wyjścia na przekaźniki.

  3. równocześnie wyzwolenie z modulo 3-1 wyśle komunikat OFF na oba przekaźniki
    (tutaj chyba nie do końca działa, przywracanie do stanu z przed długiego przyciśnięcia, ale to muszę bardziej potestować) - już działa, błąd wynikał z faktu, że z krótkiego impulsu wysyłany był tylko komunikat do przekaźnika, którego stan miał się zmienić, co przy liczeniu wstecz modulo 3-1 powodowało błędy. Aktualnie ze wyjść switcha (faza 0…3) odpowiednie komunikaty idą zawsze na dwa przekaźniki nawet jeśli przekaźnik jest w tym stanie.

mam nadzieję, że wystarczająco przejrzyście i najważniejsze że dobrze (?) opisałem :slight_smile:

Potestuję to trochę, ale już wiem, że muszę inaczej rozwiązać impuls. Bardziej intuicyjna jest reakcja na stan wysoki wejścia niż dopiero na ponowny niski. W przypadku długiego naciśnięcia ma zadziałać nawet jak nie puścimy przycisku. Ale to spróbuję sam coś pomyśleć i będę robił edity.

Oczywiście jeśli ktoś widzi błędy w tym wynalazku, lub jakieś optymalizacje (bo momentami wydaje mi się, że można by było to uprościć, ale to jeszcze nie mój poziom).

Tak czy inaczej, na tą chwilę bardzo dziękuję RobinI30

1 polubienie

:+1: :saluting_face:

Podpowiedź… stanem ON uruchom delay, który po ustalonym czasie długiego impulsu sam uruchomi
gałązkę OFF - nawet gdy trzymasz przycisk.
Jeśli wcześniej puścisz przycisk wyślij do delay msg.reset aby przerwać odliczanie.

…dałoby się, ale trudniej byłoby go zrozumieć.