Trigger zatrzymanie odliczania

na dwóch triggerach uruchamiam odliczanie czasu - przerwa 40 sek , licznik 10 sek . zatrzymuję proces poprzez msg reset . pierwszy trigger 40sek zatrzymuje się od razu zaś drugi “licznik” zatrzymuje się dopiero po upływie 10 sek. czy można zatrzymać go równocześnie z pierwszym ?
flows (9).json (2,7 KB)

Zamieś flow po ludzku aby był możliwy do poprawnego skopiowania.

Reset wysyłasz do obu trigger ? Naucz się robić exporty flow

mam nadzieję , że dobrze wkleiłem flow

reset wysyłam do obu triggerów , jednak ten drugi zawsze ma opóźnienie .jak uruchomię “start” i za chwilę dam “stop czyli reset” to pierwszy od razu się zatrzymuje a drugi czeka .i dopiero po chwili (ustawionej do odliczania) zatrzymuje się . próbowałem dać dwa niezależne resety za pomocą dwóch injection , ale bez skutku .

Zrób import i sprawdź
flows.json (1,5 KB)

bardzo dziękuję isom1266 , działa idealnie . przeanalizuję to sobie na przyszłość . wielkie dzięki .

Nie wiem jaki był cel? …ale jeśli miał to być “generator” impulsów to zapętlanie przepływy nigdy nie jest dobrą praktyką.

próbuję zrobić automatyczne uruchomienie generatora prądu .najpierw rozruch , jesli nie załapie to przerwa , potem ponowny rozruch i tak kilka razy . jesli załapie to triggery sie zatrzymują , jesli nie załapie po np. czwartym razie to też triggery się zatrzymują . próbowałem to z timerami ale offset ich obsługi był bardzo skomplikowany .

Potrzebujesz licznik uruchomień -najprościej to zrobić za pomocą węzła Change.
Interwał uruchamiania zrobić na inject… a czas utrzymania rozrusznika na jednym trigger…
… plus kilka warunków na uruchomienie i zatrzymanie procesu i gotowe :slight_smile:

Spróbuj coś sam narysować to się poprawi.

dzięki , jest to pomysł warty uwagi , popracuję nad nim . dzięki . faktycznie zapętlenie to nie zbył ładny pomysł .

@RobinI30 ty nigdzie mi nie pozwolisz przemycić tego multiwibratora astabilnego ? A tak serio to masz rację :+1:

Jako przykład - możesz :crazy_face:

Wyobraź sobie, że ten proces krąży w pętli i przychodzi kolejny start - uruchamiasz kolejną instancję tej samej pętelki, Powolny wyciek pamięci i nieprzewidywalne działanie. Najlepiej gdy proces zaczyna się raz i kończy przed ponownym wywołaniem, nie tworząc sterty.

Aby to dobrze wytłumaczyć (AI):

Tak, ponowne wywołanie flow (przepływu) w Node-RED przed zakończeniem poprzedniego wywołania zazwyczaj tworzy nową instancję procesu.


:twisted_rightwards_arrows: Działanie Node-RED jest nieliniowe (Asynchroniczne)

Node-RED, podobnie jak jego bazowe środowisko (Node.js/JavaScript), jest z natury asynchroniczny i oparty na zdarzeniach (event-driven).

  1. Nowa wiadomość = Nowa Instancja: Kiedy nod wejściowy (np. Inject, MQTT in, HTTP in) odbiera nową wiadomość (msg), traktuje to jako nowe, niezależne zdarzenie. W rezultacie, nowa, niezależna kopia obiektu wiadomości (msg) jest przekazywana przez flow.
  2. Równoległe przetwarzanie: Oznacza to, że wiele kopii obiektu msg może znajdować się w tym samym flow w tym samym czasie, przetwarzając się równolegle.

:bulb: Przykład: Jeśli Twoje flow trwa 5 sekund, a otrzymasz drugą wiadomość po 1 sekundzie, będą aktywne dwie niezależne instancje tego samego flow. Pierwsza instancja będzie kontynuować przetwarzanie wiadomości nr 1, a druga rozpocznie przetwarzanie wiadomości nr 2.


:warning: Konsekwencje dla zmiennych

To zachowanie ma kluczowe znaczenie dla sposobu zarządzania danymi wewnątrz flow:

:green_circle: msg (Message Context)

Zmienne przechowywane w samym obiekcie msg (np. msg.payload, msg.topic) są całkowicie niezależne dla każdej instancji flow. Jeśli wiadomość nr 1 zmieni msg.payload, nie ma to żadnego wpływu na msg.payload w wiadomości nr 2. Jest to bezpieczne.

:red_circle: flow i global (Kontekst)

Zmienne przechowywane w kontekście przepływu (flow) i globalnym (global) są współdzielone przez wszystkie aktywne instancje flow.

  • Jeśli instancja 1 zacznie zapisywać dane do flow.status, a instancja 2 w tym samym czasie próbuje odczytać lub zapisać własne dane w flow.status, może dojść do wyścigów (race conditions) i nieprzewidywalnych błędów.
  • Dlatego kontekst flow i global jest idealny dla licznika lub stałej konfiguracji, ale należy go używać ostrożnie w złożonych, szybko wywoływanych procesach.

Podsumowując: Tak, każda nowa wiadomość generuje nową instancję. Używaj msg do zmiennych specyficznych dla danego wywołania i flow tylko do danych, które mogą być bezpiecznie nadpisane lub odczytane przez wiele procesów.

1 Like

dziękuję , za wyjaśnienia . Na nowo muszę przemyśleć ułożenie węzłów , choć nie ukrywam , że mam zagwozdkę . uruchomić chciałbym ten proces za pomocą button switch - oczywiście najlepiej było by uruchomić interwał w injection i potem trigger lub jakiś licznik countdown , ale injection tylko z poziomu flow da się uruchomić a nie z panelu .wcześniej zrobiłem coś takiego , ale tak jak opisywałeś za dużo msg przelatywało przez węzły i gdzieś po jakimś czasie może się wywalić . podrzucam link dla innych jako pomysł choć nie do naśladowania gdyż pomimo że działa to jest kiepskim rozwiązaniem . opiszę tylko co to robi . uruchamiamy agregat tak jak stacyjka samochodu “włącz” potem uruchamiamy sekwencję kręcenia rozrusznikiem 10sek z przerwami co 40sek . jeśli silnik się uruchomi to dostaje sygnał z wejścia GPIO i rozrusznik przestaje kręcić - agregat pracuje . jednak kiedy agregat przestanie pracować (silnik gaśnie) , wtedy program dostaje info też z wejścia GPIO i wszystko się wyłacza i czeka na naszą reakcję . możemy też sami wyłączyć agregat wyłaczając go switchem wyłącz tak jak byśmy przekręcili stacyjkę samochodu na OFF .
flows (11).json (47,4 KB)

Zawsze za inject możesz uzależnić dalsze działanie procesu od stanu tego button