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.
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 ![]()
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ę ![]()
Jako przykład - możesz ![]()
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.
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).
- 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. - Równoległe przetwarzanie: Oznacza to, że wiele kopii obiektu
msgmoże znajdować się w tym samym flow w tym samym czasie, przetwarzając się równolegle.
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.
Konsekwencje dla zmiennych
To zachowanie ma kluczowe znaczenie dla sposobu zarządzania danymi wewnątrz flow:
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.
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 wflow.status, może dojść do wyścigów (race conditions) i nieprzewidywalnych błędów. - Dlatego kontekst
flowiglobaljest 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.
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


